-
Notifications
You must be signed in to change notification settings - Fork 4
/
main.py
120 lines (107 loc) · 4.71 KB
/
main.py
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
import mylogging
import logging
logger = logging.getLogger(__name__)
from typing import Any, Dict
import json
import tomlkit
import os
os.environ.setdefault("NICEGUI_STORAGE_PATH", "data")
if not os.path.exists("data"):
logger.warning("Could not find 'data' directory, verify bind mounts.")
if os.path.exists(".nicegui"):
logger.warning("Creating 'data' directory symlink.")
os.symlink(".nicegui", "data", target_is_directory=True)
else:
logger.warning("Creating 'data' directory, settings will not be persistent.")
os.makedirs("data")
else:
logger.warning("Found 'data' directory.")
from fastapi import Request
from fastapi.responses import PlainTextResponse
from nicegui import app, Client, ui # type: ignore
@ui.page("/", response_timeout=30)
# async def page(client: Client) -> None:
def page() -> None:
ui.card.default_style("max-width: none")
ui.card.default_props("flat bordered")
ui.input.default_props("outlined dense hide-bottom-space")
ui.button.default_props("outline dense")
ui.select.default_props("outlined dense dense-options")
ui.checkbox.default_props("dense")
ui.stepper.default_props("flat")
ui.stepper.default_classes("full-size-stepper")
import autopve.elements as el
from autopve.drawer import Drawer
from autopve.content import Content
app.add_static_files("/static", "static")
el.load_element_css()
ui.colors(
primary=el.orange,
secondary=el.orange,
accent=el.orange,
dark=el.dark,
positive="#21BA45",
negative="#C10015",
info="#5C8984",
warning="#F2C037",
)
column = ui.column()
content = Content()
drawer = Drawer(column, content.answer_selected, content.hide)
drawer.build()
@app.post("/answer")
async def post_answer(request: Request) -> PlainTextResponse:
import autopve.elements as el
from autopve import storage
from autopve.tabs import history
def response(answer: str, system_info: Dict[str, Any], data: Dict[str, Any]):
toml = tomlkit.dumps(data)
toml_fixed = ""
for line in toml.splitlines():
if len(line) > 0 and line[0] == '"':
line = line.replace('"', "", 2)
toml_fixed = toml_fixed + line + "\n"
r = history.Request(answer=answer, response=toml_fixed, system_info=system_info)
history.History.add_history(r)
for client in Client.instances.values():
if not client.has_socket_connection:
continue
with client:
el.Notification(f"New answer request from {r.name} served by {r.answer}!", type="positive", timeout=15)
return PlainTextResponse(toml_fixed)
system_info = await request.json()
system_info_raw = json.dumps(system_info)
default_data = storage.answer("Default", copy=True)
answers = list(storage.answers.keys())
if "Default" in answers:
answers.remove("Default")
for answer in answers:
answer_data = storage.answer(answer, copy=True)
match = False
if "must_contain" in answer_data:
for entry in answer_data["must_contain"]:
if len(entry) > 0 and entry in system_info_raw:
match = True
if "must_not_contain" in answer_data:
for entry in answer_data["must_not_contain"]:
if len(entry) > 0 and entry in system_info_raw:
match = False
if match is True:
if "global" in default_data and "global" in answer_data:
default_data["global"].update(answer_data["global"])
if "network" in default_data and "network" in answer_data:
default_data["network"].update(answer_data["network"])
if "disk-setup" in default_data and "disk-setup" in answer_data:
if any("filter" in k for k in answer_data["disk-setup"]) and "disk_list" in default_data["disk-setup"]:
del default_data["disk-setup"]["disk_list"]
if "disk_list" in answer_data["disk-setup"]:
for key in list(default_data["disk-setup"].keys()):
if "filter" in key:
del default_data["disk-setup"][key]
default_data["disk-setup"].update(answer_data["disk-setup"])
return response(answer, system_info, default_data)
return response("Default", system_info, default_data)
if __name__ in {"__main__", "__mp_main__"}:
from autopve import logo
app.on_startup(lambda: print(f"Starting autopve, bound to the following addresses {', '.join(app.urls)}.", flush=True))
ui.run(title="autopve", favicon=logo.logo, dark=True, reload=False, show=False, show_welcome_message=False)