diff --git a/.gitignore b/.gitignore index a454c06..b9aa2fd 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,4 @@ iso +settings.ini +# ignore all possible snapshots in this dir +*.json diff --git a/Makefile b/Makefile index 0718097..8c0d811 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ install_dependencies: boot_iso: sudo qemu-system-x86_64 \ -enable-kvm -m 2G -vga qxl -netdev user,id=wan -device virtio-net,netdev=wan,id=nic1 \ - -drive format=raw,file=iso/workbench.iso,cache=none,if=virtio + -drive format=raw,file=iso/workbench_production.iso,cache=none,if=virtio # src https://www.ubuntubuzz.com/2021/04/how-to-boot-uefi-on-qemu.html # needs `sudo apt-get install ovmf` diff --git a/deploy-workbench.sh b/deploy-workbench.sh index 882e676..ffa4cdc 100755 --- a/deploy-workbench.sh +++ b/deploy-workbench.sh @@ -98,7 +98,7 @@ LABEL linux END )" # TIMEOUT 60 means 6 seconds :) - sudo tee "${ISO_PATH}/staging/isolinux/isolinux.cfg" < "${tmp_rw_mount}/settings/settings.ini" < /etc/hosts < "${ISO_PATH}/chroot/root/.profile" < /etc/hostname +echo workbench > /etc/hostname # check what linux images are available on the system # Figure out which Linux Kernel you want in the live environment. @@ -389,6 +382,11 @@ prepare_chroot_env() { if [ -z "${VERSION_CODENAME:-}" ]; then . /etc/os-release echo "TAKING OS-RELEASE FILE" + if [ ! "${ID}" = "debian" ]; then + echo "ERROR: ubuntu detected, then you are enforced to specify debian variant" + echo " use for example \`VERSION_CODENAME='bookworm'\` or similar" + exit 1 + fi fi chroot_path="${ISO_PATH}/chroot" diff --git a/settings.ini.example b/settings.ini.example new file mode 100644 index 0000000..35fb89b --- /dev/null +++ b/settings.ini.example @@ -0,0 +1,6 @@ +[settings] +url = http://127.0.0.1:8000/api/snapshot/ +token = '1234' +# path = /path/to/save +# device = your_device_name +# # erase = basic diff --git a/workbench-script.py b/workbench-script.py index 02c1703..df5c744 100644 --- a/workbench-script.py +++ b/workbench-script.py @@ -5,6 +5,7 @@ import json import uuid import hashlib import argparse +import configparser import ntplib import requests @@ -228,9 +229,9 @@ def smartctl(all_disks, disk=None): def get_data(all_disks): - lshw = 'lshw -json' - hwinfo = 'hwinfo --reallyall' - dmidecode = 'dmidecode' + lshw = 'sudo lshw -json' + hwinfo = 'sudo hwinfo --reallyall' + dmidecode = 'sudo dmidecode' data = { 'lshw': exec_cmd(lshw), 'disks': smartctl(all_disks), @@ -253,17 +254,23 @@ def save_snapshot_in_disk(snapshot, path): datetime.now().strftime("%Y%m%d-%H_%M_%S"), snapshot['uuid'] ) + print(f"workbench: INFO: Snapshot written in path '{filename}'") with open(filename, "w") as f: f.write(json.dumps(snapshot)) +# TODO sanitize url, if url is like this, it fails +# url = 'http://127.0.0.1:8000/api/snapshot/' def send_snapshot_to_devicehub(snapshot, token, url): headers = { f"Authorization": "Basic {token}", "Content-Type": "application/json" } - return requests.post(url, data=snapshot, header=headers) - + try: + requests.post(url, data=json.dumps(snapshot), headers=headers) + print(f"workbench: INFO: Snapshot sent to '{url}'") + except: + print(f"workbench: ERROR: Snapshot not remotely sent. URL '{url}' is unreachable. Do you have internet? Is your server up & running?") @logs def sync_time(): @@ -271,48 +278,75 @@ def sync_time(): ntplib.NTPClient() response = client.request('pool.ntp.org') +def load_config(config_file="settings.ini"): + """ + Tries to load configuration from a config file. + """ + config = configparser.ConfigParser() + + if os.path.exists(config_file): + # If config file exists, read from it + + print(f"workbench: INFO: Found config file in path: '{config_file}'.") + config.read(config_file) + path = config.get('settings', 'path', fallback=os.getcwd()) + # TODO validate that has http:// start + url = config.get('settings', 'url', fallback=None) + token = config.get('settings', 'token', fallback=None) + # TODO validate that the device exists? + device = config.get('settings', 'device', fallback=None) + erase = config.get('settings', 'erase', fallback=None) + else: + print(f"workbench: ERROR: Config file '{config_file}' not found. Using default values.") + path = os.path.join(os.getcwd()) + url, token, device, erase = None, None, None, None + + return { + 'path': path, + 'url': url, + 'token': token, + 'device': device, + 'erase': erase + } + +def parse_args(): + """ + Parse config argument, if available + """ + parser = argparse.ArgumentParser(description="Optional config loader for workbench.") + parser.add_argument( + '--config', + help="Path to the config file. Defaults to 'settings.ini' in the current directory.", + default="settings.ini" # Fallback to 'settings.ini' by default + ) + return parser.parse_args() def main(): - print("START") - parser=argparse.ArgumentParser() - parser.add_argument("-p", "--path", required=True) - parser.add_argument("-u", "--url", required=False) - parser.add_argument("-t", "--token", required=False) - parser.add_argument("-d", "--device", required=False) - parser.add_argument( - "-e", - "--erase", - choices=["basic", "baseline", "enhanced"], - required=False - ) - args=parser.parse_args() + vline='\n___________\n\n' + print(f"{vline}workbench: START\n") - if args.device and not args.erase: - print("error: argument --erase: expected one argument") - return - - if args.token and not args.url: - print("error: argument --url: expected one argument") - return - - if args.url and not args.token: - print("error: argument --token: expected one argument") - return + # Parse the command-line arguments + args = parse_args() + + # Load the config file, either specified via --config or the default 'settings.ini' + config_file = args.config + + config = load_config(config_file) all_disks = get_disks() snapshot = gen_snapshot(all_disks) - if args.erase and args.device: - snapshot['erase'] = gen_erase(all_disks, args.erase, user_disk=args.device) - elif args.erase: - snapshot['erase'] = gen_erase(all_disks, args.erase) + if config['erase'] and config['device']: + snapshot['erase'] = gen_erase(all_disks, config['erase'], user_disk=config['device']) + elif config['erase']: + snapshot['erase'] = gen_erase(all_disks, config['erase']) - save_snapshot_in_disk(snapshot, args.path) - - if args.url: - send_snapshot_to_devicehub(snapshot, args.token, args.url) + save_snapshot_in_disk(snapshot, config['path']) - print("END") + if config['url']: + send_snapshot_to_devicehub(snapshot, config['token'], config['url']) + + print(f"\nworkbench: END{vline}") if __name__ == '__main__':