From 1c7e56d2c4523660f15bb2bac1ebfc92d0a9261b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3hannes=20Nordal?= <johannesnordal88@gmail.com> Date: Tue, 25 Jun 2024 05:59:23 +0000 Subject: [PATCH] add: command-line tool --- data.php | 8 +++ lamec-cli.py | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+) create mode 100644 data.php create mode 100755 lamec-cli.py diff --git a/data.php b/data.php new file mode 100644 index 0000000..7d19997 --- /dev/null +++ b/data.php @@ -0,0 +1,8 @@ +<?php +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + $raw_data = file_get_contents('php://input'); + $Phrase = "./lamec.py '$raw_data'"; + $output = shell_exec($Phrase); + echo $output; +} +?> diff --git a/lamec-cli.py b/lamec-cli.py new file mode 100755 index 0000000..6fc0c8f --- /dev/null +++ b/lamec-cli.py @@ -0,0 +1,155 @@ +#!/usr/bin/env python3 + +import http.client +import json +import argparse +import sys + +url = 'localhost:5000' + +def get_form_schema(): + endpoint = '/data/form-schema.json' + conn = http.client.HTTPConnection(url) + headers = { + 'Content-type': 'application/json' + } + conn.request('GET', endpoint, headers=headers) + response = conn.getresponse() + data = json.loads(response.read()) + conn.close() + return data + +def get_system_desc(data): + for field in data['fields']: + if field['name'] == 'system': + return field['desc'] + +def get_systems(data): + for field in data['fields']: + if field['name'] == 'system': + return field['restriction']['value'] + +def add_system_parsers(parser, data): + subparsers = parser.add_subparsers( + dest='system', + title='list of available systems', + metavar='SYSTEM', + help=get_system_desc(data), + ) + system_parsers = {} + for name in get_systems(data): + system_parsers[name] = subparsers.add_parser( + name, + help='', + ) + return system_parsers + +def get_software_desc(data): + for field in data['fields']: + if field['name'] == 'software': + return field['desc'] + +def add_software_parser(): + pass + +class CustomArgumentDefaultsHelpFormatter(argparse.ArgumentDefaultsHelpFormatter): + def _get_help_string(self, action): + help_str = action.help + if '%(default)' not in action.help: + if action.default is not None and action.default != argparse.SUPPRESS: + help_str += ' (default: %(default)s)' + return help_str + +def add_software_parsers(parser, system, data): + subparsers = parser.add_subparsers( + dest=f'software', + title='list of available software', + metavar='SOFTWARE', + description=get_software_desc(data), + help='' + ) + res = None + for field in data['fields']: + if field['name'] == 'software': + res = field['restriction']['value']['depends_on']['resolution'] + software = [] + for entry in res: + if system in entry['key']: + software = entry['value'] + for name in software: + subparser = subparsers.add_parser( + name, + help='', + formatter_class=CustomArgumentDefaultsHelpFormatter, + ) + ''' + subparser.add_argument( + '--output', + metavar='', + help='Write to FILE instead of stdout' + ) + ''' + group = subparser.add_argument_group(title='configuration') + for field in data['fields']: + if field['name'] != 'system' and field['name'] != 'software': + include = True + if 'scope' in field: + found = False + for value in field['scope'][0]['values']: + if system in value and name in value: + found = True + break + if not found: + include = False + if include: + arg = { + 'metavar': '\b', + 'help': field['desc'] + } + if 'default' not in field: + arg['required'] = True + else: + arg['default'] = field['default'] + group.add_argument( + f'--{field["name"]}', + **arg, + ) + +def post_request(data): + server = 'localhost:5000' + endpoint = '/data.php' + + json_data = json.dumps(data) + + conn = http.client.HTTPConnection(server) + + headers = { + 'Content-type': 'application/json', + 'Content-length': str(len(json_data)), + } + + conn.request('POST', endpoint, body=json_data, headers=headers) + response = conn.getresponse() + response_data = response.read() + conn.close() + return response_data + +def main(): + parser = argparse.ArgumentParser(prog=sys.argv[0]) + data = get_form_schema() + system_parsers = add_system_parsers(parser, data) + for name in system_parsers: + add_software_parsers(system_parsers[name], name, data) + args = parser.parse_args() + if not args.system: + parser.print_help() + sys.exit(1) + else: + if not vars(args)[f'software']: + system_parsers[args.system].print_help() + sys.exit(1) + + print(post_request(vars(args)).decode('ascii'), end='') + +if __name__ == '__main__': + main() -- GitLab