diff --git a/docs/RPC-INTERFACE.rst b/docs/RPC-INTERFACE.rst index bb0aed9..b5dc960 100644 --- a/docs/RPC-INTERFACE.rst +++ b/docs/RPC-INTERFACE.rst @@ -156,6 +156,17 @@ The following commands are available: Currently peer data is obtained via a peer discovery protocol; it used to be taken from IRC. +* **add_peer** + + Add a peer to the peers list. ElectrumX will schdule an immediate + connection attempt. This command takes a single argument: the + peer's "real name" as it would advertise itself on IRC. + + .. code:: + + $ ./electrumx_rpc.py add_peer "ecdsa.net v1.0 s110 t" + "peer 'ecdsa.net v1.0 s110 t' added" + * **daemon_url** This command takes an optional argument that is interpreted diff --git a/server/controller.py b/server/controller.py index c0cbf6b..18b33fd 100644 --- a/server/controller.py +++ b/server/controller.py @@ -21,6 +21,7 @@ import pylru from lib.jsonrpc import JSONRPC, JSONSessionBase, RPCError from lib.hash import double_sha256, hash_to_str, hex_str_to_hash +from lib.peer import Peer import lib.util as util from server.block_processor import BlockProcessor from server.daemon import Daemon, DaemonError @@ -73,7 +74,7 @@ class Controller(util.LoggedClass): env.max_send = max(350000, env.max_send) self.setup_bands() # Set up the RPC request handlers - cmds = ('daemon_url disconnect getinfo groups log peers reorg ' + cmds = ('add_peer daemon_url disconnect getinfo groups log peers reorg ' 'sessions stop'.split()) self.rpc_handlers = {cmd: getattr(self, 'rpc_' + cmd) for cmd in cmds} # Set up the ElectrumX request handlers @@ -579,6 +580,15 @@ class Controller(util.LoggedClass): # Local RPC command handlers + def rpc_add_peer(self, real_name): + '''Add a peer. + + real_name: a real name, as would appear on IRC + ''' + peer = Peer.from_real_name(real_name, 'RPC') + self.peer_mgr.add_peers([peer]) + return "peer '{}' added".format(real_name) + def rpc_disconnect(self, session_ids): '''Disconnect sesssions.