diff options
Diffstat (limited to '')
-rwxr-xr-x | cgi-bin/get.py | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/cgi-bin/get.py b/cgi-bin/get.py new file mode 100755 index 0000000..99c4569 --- /dev/null +++ b/cgi-bin/get.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 + +import cgi, cgitb +import json +import os +import socket +import subprocess +from subprocess import PIPE, STDOUT + + +def headers(): + print("Content-Type: text/html; charset=utf-8") + print() + + +def debugging(): + # TODO: figure out how to include this on the web page + #cgitb.enable() + pass + + +def setup(): + headers() + debugging() + + +def format_response(response): + return json.dumps(response, ensure_ascii=False) + + +def run(*args, **kwargs): + output = subprocess.run(args, stdout=PIPE, stderr=STDOUT, universal_newlines=True, **kwargs) + return output.stdout + + +def hostname(): + return socket.gethostname() + + +def top(): + return run('top', '-b', '-n', '1', '-w', '512') + + +systemd_env = os.environ.copy() +systemd_env['SYSTEMD_PAGER'] = '' +systemd_env['SYSTEMD_COLORS'] = 'no' + + +def run_systemd_command(*args): + return run(*args, env=systemd_env) + + +def run_systemctl(*args): + return run_systemd_command('systemctl', *args) + + +def system_status_overview(): + return run_systemctl('--system', 'status', '--full') + + +def system_status_failed(): + return run_systemctl('--system', 'list-units', '--failed', '--full') + + +def user_status_overview(): + return run_systemctl('--user', 'status', '--full') + + +def user_status_failed(): + return run_systemctl('--user', 'list-units', '--failed', '--full') + + +def system_timers(): + return run_systemctl('--system', 'list-timers', '--all', '--full') + + +def user_timers(): + return run_systemctl('--user', 'list-timers', '--all', '--full') + + +def status(): + status = { + 'hostname': hostname(), + 'top': top(), + 'system': { + 'overview': system_status_overview(), + 'failed': system_status_failed(), + 'timers': system_timers(), + }, + 'user': { + 'overview': user_status_overview(), + 'failed': user_status_failed(), + 'timers': user_timers(), + }, + } + return status + + +def timers(): + timers = { + 'system': { + 'timers': system_timers(), + }, + 'user': { + 'timers': user_timers(), + }, + } + return timers + + +def do(): + params = cgi.FieldStorage() + what = params['what'].value + if what == 'status': + response = status() + elif what == 'timers': + response = timers() + elif what == 'top': + response = top() + else: + raise RuntimeError(f'invalid parameter "what": {what}') + print(format_response(response)) + + +def main(): + setup() + do() + + +if __name__ == '__main__': + main() |