Merge branch 'doc' into testing
This commit is contained in:
commit
8d04f28ecd
|
@ -55,6 +55,7 @@ class Manager(threading.Thread):
|
|||
|
||||
@staticmethod
|
||||
def clean_objects():
|
||||
"""Delete expired objects"""
|
||||
for vector in set(shared.objects):
|
||||
if not shared.objects[vector].is_valid():
|
||||
if shared.objects[vector].is_expired():
|
||||
|
@ -70,6 +71,7 @@ class Manager(threading.Thread):
|
|||
|
||||
@staticmethod
|
||||
def manage_connections():
|
||||
"""Keep number of open connections according to the app settings"""
|
||||
hosts = set()
|
||||
outgoing_connections = 0
|
||||
for c in shared.connections.copy():
|
||||
|
@ -201,6 +203,7 @@ class Manager(threading.Thread):
|
|||
|
||||
@staticmethod
|
||||
def pickle_objects():
|
||||
"""Save objects into a pickle file"""
|
||||
try:
|
||||
with open(
|
||||
os.path.join(shared.data_directory, 'objects.pickle'), 'bw'
|
||||
|
@ -213,6 +216,7 @@ class Manager(threading.Thread):
|
|||
|
||||
@staticmethod
|
||||
def pickle_nodes():
|
||||
"""Save nodes into pickle files"""
|
||||
if len(shared.node_pool) > 10000:
|
||||
shared.node_pool = set(random.sample(shared.node_pool, 10000))
|
||||
if len(shared.unchecked_node_pool) > 1000:
|
||||
|
@ -241,6 +245,7 @@ class Manager(threading.Thread):
|
|||
|
||||
@staticmethod
|
||||
def publish_i2p_destination():
|
||||
"""Send I2P destination object"""
|
||||
if shared.i2p_session_nick and not shared.i2p_transient:
|
||||
logging.info('Publishing our I2P destination')
|
||||
dest_pub_raw = base64.b64decode(
|
||||
|
|
|
@ -4,11 +4,28 @@ import base64
|
|||
import hashlib
|
||||
import struct
|
||||
import time
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from . import shared, structure
|
||||
|
||||
|
||||
class Header():
|
||||
class IMessage(ABC):
|
||||
"""A base for typical message"""
|
||||
@abstractmethod
|
||||
def __repr__(self):
|
||||
"""Make a printable form"""
|
||||
|
||||
@abstractmethod
|
||||
def to_bytes(self):
|
||||
"""Serialize to bytes the full message"""
|
||||
|
||||
@classmethod
|
||||
@abstractmethod
|
||||
def from_message(cls, m):
|
||||
"""Parse from message"""
|
||||
|
||||
|
||||
class Header(structure.IStructure):
|
||||
"""Message header structure"""
|
||||
def __init__(self, command, payload_length, payload_checksum):
|
||||
self.command = command
|
||||
|
@ -24,7 +41,6 @@ class Header():
|
|||
base64.b16encode(self.payload_checksum).decode())
|
||||
|
||||
def to_bytes(self):
|
||||
"""Serialize to bytes"""
|
||||
b = b''
|
||||
b += shared.magic_bytes
|
||||
b += self.command.ljust(12, b'\x00')
|
||||
|
@ -34,7 +50,6 @@ class Header():
|
|||
|
||||
@classmethod
|
||||
def from_bytes(cls, b):
|
||||
"""Parse from bytes"""
|
||||
magic_bytes, command, payload_length, payload_checksum = struct.unpack(
|
||||
'>4s12sL4s', b)
|
||||
|
||||
|
@ -46,7 +61,7 @@ class Header():
|
|||
return cls(command, payload_length, payload_checksum)
|
||||
|
||||
|
||||
class Message():
|
||||
class Message(structure.IStructure):
|
||||
"""Common message structure"""
|
||||
def __init__(self, command, payload):
|
||||
self.command = command
|
||||
|
@ -61,7 +76,6 @@ class Message():
|
|||
base64.b16encode(self.payload_checksum).decode())
|
||||
|
||||
def to_bytes(self):
|
||||
"""Serialize to bytes"""
|
||||
b = Header(
|
||||
self.command, self.payload_length, self.payload_checksum
|
||||
).to_bytes()
|
||||
|
@ -70,7 +84,6 @@ class Message():
|
|||
|
||||
@classmethod
|
||||
def from_bytes(cls, b):
|
||||
"""Parse from bytes"""
|
||||
h = Header.from_bytes(b[:24])
|
||||
|
||||
payload = b[24:]
|
||||
|
@ -98,7 +111,7 @@ def _payload_read_int(data):
|
|||
data[varint_length:])
|
||||
|
||||
|
||||
class Version():
|
||||
class Version(IMessage):
|
||||
"""The version message payload"""
|
||||
def __init__(
|
||||
self, host, port, protocol_version=shared.protocol_version,
|
||||
|
@ -124,6 +137,7 @@ class Version():
|
|||
base64.b16encode(self.nonce).decode(), self.user_agent)
|
||||
|
||||
def to_bytes(self):
|
||||
"""Serialize to bytes"""
|
||||
payload = b''
|
||||
payload += struct.pack('>I', self.protocol_version)
|
||||
payload += struct.pack('>Q', self.services)
|
||||
|
@ -176,7 +190,7 @@ class Version():
|
|||
host, port, protocol_version, services, nonce, user_agent, streams)
|
||||
|
||||
|
||||
class Inv():
|
||||
class Inv(IMessage):
|
||||
"""The inv message payload"""
|
||||
def __init__(self, vectors):
|
||||
self.vectors = set(vectors)
|
||||
|
@ -208,7 +222,7 @@ class Inv():
|
|||
return cls(vectors)
|
||||
|
||||
|
||||
class GetData():
|
||||
class GetData(IMessage):
|
||||
"""The getdata message payload"""
|
||||
def __init__(self, vectors):
|
||||
self.vectors = set(vectors)
|
||||
|
@ -240,7 +254,7 @@ class GetData():
|
|||
return cls(vectors)
|
||||
|
||||
|
||||
class Addr():
|
||||
class Addr(IMessage):
|
||||
"""The addr message payload"""
|
||||
def __init__(self, addresses):
|
||||
self.addresses = addresses
|
||||
|
@ -270,7 +284,7 @@ class Addr():
|
|||
return cls(addresses)
|
||||
|
||||
|
||||
class Error():
|
||||
class Error(IMessage):
|
||||
"""The error message payload"""
|
||||
def __init__(self, error_text=b'', fatal=0, ban_time=0, vector=b''):
|
||||
self.error_text = error_text
|
||||
|
|
|
@ -6,11 +6,24 @@ import logging
|
|||
import socket
|
||||
import struct
|
||||
import time
|
||||
from abc import ABC, abstractmethod
|
||||
|
||||
from . import shared
|
||||
|
||||
|
||||
class VarInt():
|
||||
class IStructure(ABC):
|
||||
"""A base for typical structure"""
|
||||
@abstractmethod
|
||||
def to_bytes(self):
|
||||
"""Serialize to bytes"""
|
||||
|
||||
@classmethod
|
||||
@abstractmethod
|
||||
def from_bytes(cls, b):
|
||||
"""Parse from bytes"""
|
||||
|
||||
|
||||
class VarInt(IStructure):
|
||||
"""varint object"""
|
||||
def __init__(self, n):
|
||||
self.n = n
|
||||
|
@ -29,6 +42,7 @@ class VarInt():
|
|||
|
||||
@staticmethod
|
||||
def length(b):
|
||||
"""Determine the length of varint in the given bytes"""
|
||||
if b == 0xfd:
|
||||
return 3
|
||||
if b == 0xfe:
|
||||
|
@ -87,7 +101,7 @@ class Object():
|
|||
nonce, expires_time, object_type, version, stream_number, payload)
|
||||
|
||||
def to_bytes(self):
|
||||
"""Serialize to bytes"""
|
||||
"""Serialize to bytes object payload"""
|
||||
payload = b''
|
||||
payload += self.nonce
|
||||
payload += struct.pack('>QL', self.expires_time, self.object_type)
|
||||
|
@ -151,7 +165,7 @@ class Object():
|
|||
return hashlib.sha512(self.to_bytes()[8:]).digest()
|
||||
|
||||
|
||||
class NetAddrNoPrefix():
|
||||
class NetAddrNoPrefix(IStructure):
|
||||
"""Network address"""
|
||||
def __init__(self, services, host, port):
|
||||
self.services = services
|
||||
|
@ -184,7 +198,7 @@ class NetAddrNoPrefix():
|
|||
return cls(services, host, port)
|
||||
|
||||
|
||||
class NetAddr():
|
||||
class NetAddr(IStructure):
|
||||
"""Network address with time and stream"""
|
||||
def __init__(self, services, host, port, stream=shared.stream):
|
||||
self.stream = stream
|
||||
|
|
Loading…
Reference in New Issue