1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
|
from os.path import *
from datetime import datetime
from rich.prompt import Confirm
from .path import *
from .nginx import *
from .config import *
from .helper import *
def get_template_name_list(console) -> list[str]:
console.print("First let's check all the templates...")
# get all filenames ending with .template
template_name_list = [basename(f)[:-len('.template')] for f in os.listdir(
template_dir) if f.endswith(".template")]
console.print(
f"I have found following template files in [magenta]{template_dir}[/]:", style="green")
for filename in template_name_list:
console.print(f"{filename}.template", style="magenta")
return template_name_list
def data_dir_check(domain, console):
if isdir(data_dir):
if not exists(join(data_dir, "certbot")):
print_create_cert_message(domain, console)
else:
to_check = Confirm.ask(
"I want to check your ssl certs, but I need to sudo. Do you want me check", console=console, default=False)
if to_check:
check_ssl_cert(domain, console)
def template_generate(console):
template_name_list = get_template_name_list(console)
template_list: list = []
config_var_name_set_in_template = set()
for template_name in template_name_list:
template = Template(join(template_dir, template_name+".template"))
template_list.append(template)
config_var_name_set_in_template.update(template.var_set)
console.print(
"I have found following variables needed in templates:", style="green")
for key in config_var_name_set_in_template:
console.print(key, style="magenta")
# check vars
check_success, more, less = check_config_var_set(
config_var_name_set_in_template)
if len(more) != 0:
console.print("There are more variables in templates than in config file:",
style="red")
for key in more:
console.print(key, style="magenta")
if len(less) != 0:
console.print("Following config vars are not used:",
style="yellow")
for key in less:
console.print(key, style="magenta")
if not check_success:
console.print(
"Please check you config vars and make sure the needed ones are defined!", style="red")
else:
console.print(
"Now let's check if they are already generated...")
conflict = False
# check if there exists any generated files
for filename in template_name_list:
if exists(join(project_dir, filename)):
console.print(f"Found [magenta]{filename}[/]")
conflict = True
to_gen = True
if conflict:
to_overwrite = Confirm.ask(
"It seems there are some files already generated. Do you want to overwrite them?", console=console, default=False)
if not to_overwrite:
to_gen = False
console.print(
"Great! Check the existing files and see you next time!", style="green")
else:
print("No conflict found. Let's go on!\n")
if to_gen:
console.print("Check for existing config file...")
# check if there exists a config file
if not config_file_exists():
config = {}
console.print(
"No existing config file found. Don't worry. Let's create one!", style="green")
for config_var in config_var_list:
config[config_var.name] = config_var.get_default_value()
config_content = config_to_str(config)
# create data dir if not exist
if not exists(data_dir):
os.mkdir(data_dir)
# write config file
with open(config_file_path, "w") as f:
f.write(config_content)
console.print(
f"Everything else is auto generated. The config file is written into [magenta]{config_file_path}[/]. You had better keep it safe. And here is the content:", style="green")
print_config(console, config)
is_ok = Confirm.ask(
"If you think it's not ok, you can stop here and edit it. Or let's go on?", console=console, default=True)
if not is_ok:
console.print(
"Great! Check the config file and see you next time!", style="green")
to_gen = False
else:
console.print(
"Looks like you have already had a config file. Let's check the content:", style="green")
with open(config_file_path, "r") as f:
content = f.read()
config = parse_config(content)
print_config(console, config)
missed_config_vars = []
for config_var in config_var_list:
if config_var.name not in config:
missed_config_vars.append(config_var)
if len(missed_config_vars) > 0:
console.print(
"Oops! It seems you have missed some keys in your config file. Let's add them!", style="green")
for config_var in missed_config_vars:
config[config_var.name] = config_var.get_default_value(
console)
content = config_to_str(config)
with open(config_file_path, "w") as f:
f.write(content)
console.print(
f"Here is the new config, it has been written out to [magenta]{config_file_path}[/]:")
print_config(console, config)
good_enough = Confirm.ask("Is it good enough?",
console=console, default=True)
if not good_enough:
console.print(
"Great! Check the config file and see you next time!", style="green")
to_gen = False
domain = get_domain()
if to_gen:
console.print(
"Finally, everything is ready. Let's generate the files:", style="green")
# generate files
for index, template in enumerate(template_list):
number = index + 1
total = len(template_list)
print_order(number, total, console)
console.print(
f"Generating [magenta]{template.template_name}[/]...")
content = template.generate(config)
with open(join(project_dir, template.template_name), "w") as f:
f.write(content)
# generate nginx config
if not exists(nginx_config_dir):
to_gen_nginx_conf = Confirm.ask("It seems you haven't generate nginx config. Do you want to generate it?",
default=True, console=console)
else:
# get the latest time of files in nginx template
template_time = 0
for path in os.listdir(nginx_template_dir):
template_time = max(template_time, os.stat(
join(nginx_template_dir, path)).st_mtime)
console.print(
f"Nginx template update time: {datetime.fromtimestamp(template_time)}")
nginx_config_time = 0
for path in os.listdir(nginx_config_dir):
nginx_config_time = max(nginx_config_time, os.stat(
join(nginx_config_dir, path)).st_mtime)
console.print(
f"Generated nginx template update time: {datetime.fromtimestamp(nginx_config_time)}")
if template_time > nginx_config_time:
to_gen_nginx_conf = Confirm.ask("It seems you have updated the nginx template and not regenerate config. Do you want to regenerate the nginx config?",
default=True, console=console)
else:
to_gen_nginx_conf = Confirm.ask("[yellow]It seems you have already generated nginx config. Do you want to overwrite it?[/]",
default=False, console=console)
if to_gen_nginx_conf:
nginx(domain, config, console)
data_dir_check(domain, console)
def clear(console, /, delete_data_dir=False):
template_name_list = get_template_name_list(console)
# check root if we have to delete data dir
if delete_data_dir and exists(data_dir) and os.geteuid() != 0:
console.print(
"You need to be root to delete data dir.", style="red")
exit(1)
to_delete = Confirm.ask(
"[yellow]Are you sure you want to delete everything? all your data will be lost![/]", default=False, console=console)
if to_delete:
files_to_delete = []
for template_name in template_name_list:
f = join(project_dir, template_name)
if exists(f):
files_to_delete.append(f)
delete_data_dir = delete_data_dir and exists(
data_dir)
if len(files_to_delete) == 0:
console.print(
"Nothing to delete. We are safe!", style="green")
else:
console.print("Here are the files to delete:")
for f in files_to_delete:
console.print(f, style="magenta")
if delete_data_dir:
console.print(data_dir + " (data dir)",
style="magenta")
to_delete = Confirm.ask(
"[red]Are you sure you want to delete them?[/]", default=False, console=console)
if to_delete:
for f in files_to_delete:
os.remove(f)
if delete_data_dir:
# recursively delete data dir
shutil.rmtree(data_dir)
console.print(
"Your workspace is clean now!", style="green")
|