4
4
"""
5
5
from ..node import Drogulus
6
6
from ..net .http import HttpConnector , HttpRequestHandler
7
- from .utils import data_dir , log_dir , get_keys , get_whoami , get_alias
7
+ from .utils import data_dir , log_dir , get_keys , get_whoami , APPNAME
8
8
from cliff .command import Command
9
9
from getpass import getpass
10
10
import logging
11
+ import logging .handlers
11
12
import asyncio
12
13
import json
13
- import sys
14
14
import os
15
+ import os .path
15
16
16
17
17
18
class Start (Command ):
@@ -23,21 +24,20 @@ def get_description(self):
23
24
return 'Starts a local drogulus node.'
24
25
25
26
def get_parser (self , prog_name ):
26
- # TODO: Non positional args
27
27
parser = super (Start , self ).get_parser (prog_name )
28
28
parser .add_argument ('--passphrase' , '-p' , nargs = '?' , default = '' ,
29
- type = str , help = 'The passphrase for the RSA keys.' )
30
- parser .add_argument ('--keyfile' , '-k' , nargs = '?' , default = '' , type = str ,
31
- help = 'The pem file of the RSA keys to use.' )
29
+ type = str , help = 'The passphrase for the private ' +
30
+ 'RSA key.' )
31
+ parser .add_argument ('--keys' , '-k' , nargs = '?' , default = '' , type = str ,
32
+ help = 'The directory containing the RSA public ' +
33
+ 'and private keys.' )
32
34
parser .add_argument ('--peers' , nargs = '?' , default = '' , type = str ,
33
35
help = 'The peer.json file used to seed the ' +
34
36
'local node\' s routing table.' )
35
37
parser .add_argument ('--port' , nargs = '?' , default = 1908 , type = int ,
36
38
help = 'The incoming port (defaults to 1908).' )
37
39
parser .add_argument ('--whoami' , nargs = '?' , default = '' , type = str ,
38
40
help = 'The whoami.json file to use.' )
39
- parser .add_argument ('--alias' , nargs = '?' , default = '' , type = str ,
40
- help = 'The alias.json file to use.' )
41
41
return parser
42
42
43
43
def take_action (self , parsed_args ):
@@ -47,24 +47,15 @@ def take_action(self, parsed_args):
47
47
"""
48
48
passphrase = parsed_args .passphrase
49
49
if not passphrase :
50
- print ('You must supply a passphrase' )
51
- passphrase = getpass ()
50
+ print ('You must supply a passphrase. ' )
51
+ passphrase = getpass (). strip ()
52
52
if not passphrase :
53
- sys . exit ( 1 )
53
+ raise ValueError ( 'You must supply a passphrase.' )
54
54
port = parsed_args .port
55
55
whoami = parsed_args .whoami
56
- alias = parsed_args .alias
57
- key_file = parsed_args .keyfile
56
+ key_dir = parsed_args .keys
58
57
peer_file = parsed_args .peers
59
58
60
- # RSA key config.
61
- try :
62
- private_key , public_key = get_keys (passphrase , key_file )
63
- except Exception as ex :
64
- print ('Unable to get keys from {}' .format (key_file ))
65
- print ('{}' .format (repr (ex )))
66
- sys .exit (1 )
67
-
68
59
# Setup logging
69
60
logfile = os .path .join (log_dir (), 'drogulus.log' )
70
61
handler = logging .handlers .TimedRotatingFileHandler (logfile ,
@@ -79,30 +70,38 @@ def take_action(self, parsed_args):
79
70
log = logging .getLogger (__name__ )
80
71
print ('Logging to {}' .format (logfile ))
81
72
82
- # Whoami and alias
73
+ # RSA key config.
74
+ priv_path = None
75
+ pub_path = None
76
+ if key_dir :
77
+ priv_path = os .path .join (key_dir , '{}.scrypt' .format (APPNAME ))
78
+ pub_path = os .path .join (key_dir , '{}.pub' .format (APPNAME ))
79
+ try :
80
+ private_key , public_key = get_keys (passphrase , priv_path ,
81
+ pub_path )
82
+ except Exception as ex :
83
+ log .error ('Unable to get keys from {}' .format (key_dir ))
84
+ log .error (ex )
85
+ raise ex
86
+
87
+ # Whoami
83
88
try :
84
89
whoami = get_whoami (whoami )
85
90
except :
86
91
log .error ('Unable to get whoami file.' )
87
92
whoami = None
88
- try :
89
- alias = get_alias (alias )
90
- except :
91
- log .error ('Unable to get alias file.' )
92
- alias = None
93
93
94
94
# Asyncio boilerplate.
95
95
event_loop = asyncio .get_event_loop ()
96
96
connector = HttpConnector (event_loop ) # NetstringConnector(event_loop)
97
- instance = Drogulus (public_key , private_key , event_loop , connector ,
98
- port , alias , whoami )
97
+ instance = Drogulus (private_key , public_key , event_loop , connector ,
98
+ port , whoami )
99
99
100
100
def protocol_factory (connector = connector , node = instance ._node ):
101
101
"""
102
102
Returns an appropriately configured Protocol object for
103
103
each connection.
104
104
"""
105
- # return NetstringProtocol(connector, node)
106
105
return HttpRequestHandler (connector , node )
107
106
108
107
setup_server = event_loop .create_server (protocol_factory , port = port )
@@ -120,16 +119,12 @@ def protocol_factory(connector=connector, node=instance._node):
120
119
except KeyboardInterrupt :
121
120
log .info ('Manual exit' )
122
121
finally :
123
- # dump alias
124
- with open (os .path .join (data_dir (), 'alias.json' ), 'w' ) as output :
125
- json .dump (instance .alias , output , indent = 2 )
126
- log .info ('Dumped alias' )
127
122
# dump peers
128
123
if not peer_file :
129
124
peer_file = os .path .join (data_dir (), 'peers.json' )
130
125
with open (peer_file , 'w' ) as output :
131
- json .dump (instance ._node .routing_table .all_contacts () ,
132
- output , indent = 2 )
126
+ json .dump (instance ._node .routing_table .dump (), output ,
127
+ indent = 2 )
133
128
log .info ('Dumped peers' )
134
129
log .info ('STOPPED' )
135
130
server .close ()
0 commit comments