10
10
11
11
METLO_DEFAULT_DIR = "/opt/metlo"
12
12
13
- METLO_DIR = os .environ .get (' METLO_DIR' , METLO_DEFAULT_DIR )
14
- ENV_PATH = os .path .join (METLO_DIR , ' .env' )
15
- LICENSE_PATH = os .path .join (METLO_DIR , ' LICENSE_KEY' )
16
- FILES_TO_PULL = [' docker-compose.yaml' , ' init.sql' , ' metlo-config.yaml' ]
17
- UPDATE_FILES_TO_PULL = [' docker-compose.yaml' , ' init.sql' ]
18
- IMAGES = [' backend' , ' frontend' , ' jobrunner' , ' suricata-daemon' ]
13
+ METLO_DIR = os .environ .get (" METLO_DIR" , METLO_DEFAULT_DIR )
14
+ ENV_PATH = os .path .join (METLO_DIR , " .env" )
15
+ LICENSE_PATH = os .path .join (METLO_DIR , " LICENSE_KEY" )
16
+ FILES_TO_PULL = [" docker-compose.yaml" , " init.sql" , " metlo-config.yaml" ]
17
+ UPDATE_FILES_TO_PULL = [" docker-compose.yaml" , " init.sql" ]
18
+ IMAGES = [" backend" , " frontend" , " jobrunner" , " suricata-daemon" ]
19
19
20
20
21
21
def get_file (file_name ):
22
- src = f' https://raw.githubusercontent.com/metlo-labs/metlo/master/{ file_name } '
22
+ src = f" https://raw.githubusercontent.com/metlo-labs/metlo/master/{ file_name } "
23
23
request = urllib .request .Request (src )
24
24
with urllib .request .urlopen (request ) as response :
25
- data = response .read ().decode (' utf-8' )
26
- with open (os .path .join (METLO_DIR , file_name ), 'w' ) as f :
25
+ data = response .read ().decode (" utf-8" )
26
+ with open (os .path .join (METLO_DIR , file_name ), "w" ) as f :
27
27
f .write (data )
28
28
29
29
30
30
def get_current_ip ():
31
- request = urllib .request .Request (' http://checkip.amazonaws.com' )
31
+ request = urllib .request .Request (" http://checkip.amazonaws.com" )
32
32
with urllib .request .urlopen (request ) as response :
33
- data = response .read ().decode (' utf-8' )
34
- return data .strip (' \n ' )
33
+ data = response .read ().decode (" utf-8" )
34
+ return data .strip (" \n " )
35
35
36
36
37
37
def gen_secret (l ):
38
- return '' .join (
38
+ return "" .join (
39
39
secrets .choice (string .ascii_uppercase + string .ascii_lowercase )
40
40
for _ in range (l )
41
41
)
42
42
43
43
44
- def write_env ():
45
- encryption_key = b64encode (secrets .token_bytes (32 )).decode ('UTF-8' )
44
+ def get_license_key (quiet ):
45
+ license = os .environ .get ("LICENSE_KEY" )
46
+ if license is None :
47
+ if quiet :
48
+ license = ""
49
+ else :
50
+ license = input ("[Optional] Please enter your license key: " )
51
+ return license
52
+
53
+
54
+ def write_env (quiet ):
55
+ encryption_key = b64encode (secrets .token_bytes (32 )).decode ("UTF-8" )
46
56
express_secret = gen_secret (32 )
47
57
clickhouse_user = gen_secret (16 )
48
58
clickhouse_password = gen_secret (16 )
49
59
instance_ip = get_current_ip ()
50
- init_env_file = f'''
60
+ license_key = get_license_key (quiet )
61
+ init_env_file = f"""
51
62
ENCRYPTION_KEY="{ encryption_key } "
52
63
BACKEND_URL="http://{ instance_ip } :8081"
53
64
EXPRESS_SECRET="{ express_secret } "
@@ -56,58 +67,59 @@ def write_env():
56
67
NUM_WORKERS=1
57
68
SANDBOX_MODE="false"
58
69
DISABLE_LOGGING_STATS="false"
59
- ''' .strip ()
60
- with open (ENV_PATH , 'w' ) as f :
70
+ LICENSE_KEY="{ license_key } "
71
+ """ .strip ()
72
+ with open (ENV_PATH , "w" ) as f :
61
73
f .write (init_env_file )
62
74
63
75
64
- def init_env ():
76
+ def init_env (quiet = False ):
65
77
if os .path .exists (ENV_PATH ):
66
78
return
67
- print (' Initializing Environment...' )
68
- write_env ()
79
+ print (" Initializing Environment..." )
80
+ write_env (quiet )
69
81
70
82
71
83
def pull_files ():
72
- print (' Pulling Files...' )
84
+ print (" Pulling Files..." )
73
85
for f in FILES_TO_PULL :
74
86
get_file (f )
75
87
76
88
77
89
def update_files ():
78
- print (' Pulling Updated Files...' )
90
+ print (" Pulling Updated Files..." )
79
91
for f in UPDATE_FILES_TO_PULL :
80
92
get_file (f )
81
93
82
94
83
95
def pull_dockers ():
84
- print (' Pulling Docker Images...' )
96
+ print (" Pulling Docker Images..." )
85
97
for e in IMAGES :
86
- subprocess .run ([' docker' , ' pull' , f' metlo/{ e } ' ])
98
+ subprocess .run ([" docker" , " pull" , f" metlo/{ e } " ])
87
99
88
100
89
- def init ():
101
+ def init (quiet = False ):
90
102
if not os .path .exists (METLO_DIR ):
91
103
os .mkdir (METLO_DIR )
92
- init_env ()
104
+ init_env (quiet )
93
105
pull_files ()
94
106
pull_dockers ()
95
107
96
108
97
109
def start ():
98
- subprocess .run ([' docker-compose' , 'up' , '-d' ], cwd = METLO_DIR )
110
+ subprocess .run ([" docker-compose" , "up" , "-d" ], cwd = METLO_DIR )
99
111
100
112
101
113
def stop ():
102
- subprocess .run ([' docker-compose' , ' down' ], cwd = METLO_DIR )
114
+ subprocess .run ([" docker-compose" , " down" ], cwd = METLO_DIR )
103
115
104
116
105
117
def restart ():
106
- subprocess .run ([' docker-compose' , ' restart' ], cwd = METLO_DIR )
118
+ subprocess .run ([" docker-compose" , " restart" ], cwd = METLO_DIR )
107
119
108
120
109
121
def status ():
110
- subprocess .run ([' docker-compose' , 'ps' ], cwd = METLO_DIR )
122
+ subprocess .run ([" docker-compose" , "ps" ], cwd = METLO_DIR )
111
123
112
124
113
125
def update ():
@@ -119,34 +131,40 @@ def update():
119
131
120
132
def main ():
121
133
parser = argparse .ArgumentParser ()
122
- subparsers = parser .add_subparsers (dest = ' command' )
134
+ subparsers = parser .add_subparsers (dest = " command" )
123
135
124
- init_cmd = subparsers .add_parser ('init' )
125
- init_env_cmd = subparsers .add_parser ('init-env' )
126
- start_cmd = subparsers .add_parser ('start' )
127
- stop_cmd = subparsers .add_parser ('stop' )
128
- status_cmd = subparsers .add_parser ('status' )
129
- restart_cmd = subparsers .add_parser ('restart' )
130
- update_cmd = subparsers .add_parser ('update' )
136
+ init_cmd = subparsers .add_parser ("init" )
137
+ init_cmd .add_argument (
138
+ "-q" , "--quiet" , help = "Do not prompt for license key" , action = "store_true"
139
+ )
140
+ init_env_cmd = subparsers .add_parser ("init-env" )
141
+ init_env_cmd .add_argument (
142
+ "-q" , "--quiet" , help = "Do not prompt for license key" , action = "store_true"
143
+ )
144
+ start_cmd = subparsers .add_parser ("start" )
145
+ stop_cmd = subparsers .add_parser ("stop" )
146
+ status_cmd = subparsers .add_parser ("status" )
147
+ restart_cmd = subparsers .add_parser ("restart" )
148
+ update_cmd = subparsers .add_parser ("update" )
131
149
132
150
args = parser .parse_args ()
133
151
134
152
command = args .command
135
- if command == ' init' :
136
- init ()
137
- elif command == ' init-env' :
138
- init_env ()
139
- elif command == ' start' :
153
+ if command == " init" :
154
+ init (args . quiet )
155
+ elif command == " init-env" :
156
+ init_env (args . quiet )
157
+ elif command == " start" :
140
158
start ()
141
- elif command == ' stop' :
159
+ elif command == " stop" :
142
160
stop ()
143
- elif command == ' restart' :
161
+ elif command == " restart" :
144
162
restart ()
145
- elif command == ' update' :
163
+ elif command == " update" :
146
164
update ()
147
- elif command == ' status' :
165
+ elif command == " status" :
148
166
status ()
149
167
150
168
151
- if __name__ == ' __main__' :
169
+ if __name__ == " __main__" :
152
170
main ()
0 commit comments