22import datetime
33import logging
44import logging .config
5- from .config import ReceptorConfig , DEFAULT_CONFIG
5+
6+ from .config import ReceptorConfig
67from .receptor import Receptor
7- from . import node
8- from . import controller
98
109logger = logging .getLogger (__name__ )
1110
1211
13- def map_args_to_config (args ):
14- to_return = {}
15- if getattr (args , 'listen_address' , None ):
16- to_return .setdefault ('server' , {})['address' ] = args .listen_address
17- if getattr (args , 'listen_port' , None ):
18- to_return .setdefault ('server' , {})['port' ] = args .listen_port
19- if getattr (args , 'server_enable' , None ):
20- to_return .setdefault ('server' , {})['server_enable' ] = args .server_enable
21- if getattr (args , 'debug' , None ):
22- to_return .setdefault ('server' , {})['debug' ] = args .debug
23- if getattr (args , 'ssl_certificate' , None ):
24- to_return .setdefault ('server' , {})['ssl_certificate' ] = args .ssl_certificate
25- if getattr (args , 'ssl_key' , None ):
26- to_return .setdefault ('server' , {})['ssl_key' ] = args .ssl_key
27- if getattr (args , 'data_dir' , None ):
28- to_return .setdefault ('server' , {})['data_dir' ] = args .data_dir
29- if getattr (args , 'peer' , None ):
30- to_return ['peers' ] = {peer : '' for peer in args .peer }
31- if getattr (args , 'node_id' , None ):
32- to_return .setdefault ('receptor' , {})['node_id' ] = args .node_id
33- return to_return
34-
35-
36- def run_as_controller (args ):
37- config = ReceptorConfig (args .config , map_args_to_config (args ))
38- receptor = Receptor (config )
39- logger .info (f'Starting up as node ID { receptor .node_id } ' )
40- controller .mainloop (receptor , args .socket_path )
41-
42-
43- def run_as_ping (args ):
44- logger .info (f'Sending ping to { args .recipient } .' )
45- now = datetime .datetime .utcnow ()
46- controller .send_directive ('receptor:ping' , args .recipient , now .isoformat (), args .socket_path )
47-
48-
49- def run_as_send (args ):
50- logger .info (f'Sending a { args .directive } directive to { args .recipient } .' )
51- controller .send_directive (args .directive , args .recipient , args .payload , args .socket_path )
52-
53-
54- def run_as_node (args ):
55- config = ReceptorConfig (args .config , map_args_to_config (args ))
56- receptor = Receptor (config )
57- logger .info ("Running as Receptor node with ID: {}" .format (receptor .node_id ))
58- node .mainloop (receptor , args .ping_interval )
59-
60-
6112def main (args = None ):
62- parser = argparse .ArgumentParser ("receptor" )
63- parser .add_argument (
64- "-c" , "--config" , default = "/etc/receptor/receptor.conf" ,
65- help = 'Path to configuration file' )
66- parser .add_argument (
67- "--debug" , action = "store_true" , default = False ,
68- help = 'Emit debugging output' )
69- parser .add_argument (
70- '--ssl_certificate' ,
71- help = "Certificate Chain File"
72- )
73- parser .add_argument (
74- "-d" , "--data_dir" , default = "/var/lib/receptor" ,
75- help = 'Path to the directory where Receptor stores its database and metadata' )
76- parser .add_argument (
77- '--ssl_key' ,
78- help = "Certificate Key File"
79- )
80- subparsers = parser .add_subparsers (
81- title = 'subcommands' )
8213
83- subparser_node = subparsers .add_parser (
84- 'node' ,
85- help = 'Run a Receptor node' )
86- subparser_node .add_argument (
87- "--listen-address" ,
88- help = f'Set/override IP address to listen on. If not set here or in a config file, the default is { DEFAULT_CONFIG ["server" ]["address" ]} ' )
89- subparser_node .add_argument (
90- "--listen-port" ,
91- help = f'Set/override TCP port to listen on. If not set here or in a config file, the default is { DEFAULT_CONFIG ["server" ]["port" ]} ' )
92- subparser_node .add_argument (
93- "-p" , "--peer" , action = 'append' ,
94- help = f'Set/override peer nodes/controllers to connect to. Use multiple times for multiple peers.' )
95- subparser_node .add_argument (
96- "--node-id" ,
97- help = 'Set/override node identifier. If unspecified here or in a config file, one will be automatically generated.' )
98- subparser_node .add_argument (
99- "--server-disable" , action = "store_true" , default = False ,
100- help = "Disable the server function and only connect to configured peers." )
101- subparser_node .add_argument (
102- '--ping-interval' , metavar = "N" , type = int ,
103- help = "If specified, the node will ping all other known nodes in the mesh every N seconds."
104- )
105- subparser_node .set_defaults (func = run_as_node )
14+ config = ReceptorConfig (args )
10615
107- subparser_controller = subparsers .add_parser (
108- 'controller' ,
109- help = 'Run a Receptor controller'
110- )
111- subparser_controller .add_argument (
112- '--socket-path' , default = '/var/run/receptor_controller.sock' ,
113- help = 'Path to control socket'
114- )
115- subparser_controller .add_argument (
116- "--listen-address" ,
117- help = f'Set/override IP address to listen on. If not set here or in a config file, the default is { DEFAULT_CONFIG ["server" ]["address" ]} ' )
118- subparser_controller .add_argument (
119- "--listen-port" ,
120- help = f'Set/override TCP port to listen on. If not set here or in a config file, the default is { DEFAULT_CONFIG ["server" ]["port" ]} ' )
121- subparser_controller .add_argument (
122- "--node-id" ,
123- help = 'Set/override node identifier. If unspecified here or in a config file, one will be automatically generated.' )
124- subparser_controller .set_defaults (func = run_as_controller )
125-
126- subparser_ping = subparsers .add_parser (
127- 'ping' ,
128- help = 'Tell the local controller to ping a node'
129- )
130- subparser_ping .add_argument (
131- '--socket-path' , default = '/var/run/receptor_controller.sock' ,
132- help = 'Path to control socket'
133- )
134- subparser_ping .add_argument (
135- 'recipient' ,
136- help = 'Node ID of the Receptor node or controller to ping'
137- )
138- subparser_ping .set_defaults (func = run_as_ping )
139-
140- subparser_send = subparsers .add_parser (
141- 'send' ,
142- help = 'Send a directive to a node'
143- )
144- subparser_send .add_argument (
145- '--socket-path' , default = '/var/run/receptor_controller.sock' ,
146- help = 'Path to control socket'
147- )
148- subparser_send .add_argument (
149- '--directive' ,
150- help = 'Directive to send'
151- )
152- subparser_send .add_argument (
153- '--recipient' ,
154- help = 'Node ID of the Receptor node or controller to direct'
155- )
156- subparser_send .add_argument (
157- 'payload' ,
158- help = 'Payload of the directive to send. Use - for stdin.'
159- )
160- subparser_send .set_defaults (func = run_as_send )
161-
162-
163- args = parser .parse_args (args )
164-
16516 logging .config .dictConfig (
16617 {
16718 'version' : 1 ,
@@ -181,12 +32,13 @@ def main(args=None):
18132 'loggers' : {
18233 'receptor' : {
18334 'handlers' : ['console' ],
184- 'level' : 'DEBUG' if args . debug else 'INFO' ,
35+ 'level' : 'DEBUG' if config . default_debug else 'INFO' ,
18536 },
18637 },
18738 }
18839 )
189- args .func (args )
40+
41+ config .go ()
19042
19143
19244if __name__ == '__main__' :
0 commit comments