mirror of https://github.com/lukechilds/umbrel.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
32 lines
1.0 KiB
32 lines
1.0 KiB
#!/usr/bin/env -S python3 -u
|
|
from pathlib import Path
|
|
import subprocess
|
|
|
|
from util.server import Server
|
|
from util.csrf import get_csrf_token, verify_csrf_token
|
|
import util.status_file as status_file
|
|
|
|
STATUS_FILE_PATH='/umbrel-status'
|
|
|
|
def csrf(request):
|
|
if not verify_csrf_token(request['post_data']['token']):
|
|
raise Exception("Invalid CSRF token")
|
|
|
|
def get_relative_path(path):
|
|
script_dir = Path(__file__).resolve().parent
|
|
return str(script_dir.joinpath(path))
|
|
|
|
def run(command):
|
|
if not status_file.contains_errors(STATUS_FILE_PATH):
|
|
raise Exception("Running commands is disabled if there are no status errors")
|
|
subprocess.run(command, check=True)
|
|
|
|
def main():
|
|
server = Server(directory=get_relative_path('static'))
|
|
server.get('/status', lambda _: status_file.parse(STATUS_FILE_PATH))
|
|
server.get('/token', lambda _: get_csrf_token())
|
|
server.post('/shutdown', csrf, lambda _: run(['poweroff']))
|
|
server.post('/restart', csrf, lambda _: run(['reboot']))
|
|
server.listen(8000)
|
|
|
|
main()
|
|
|