From 536fbb45534d74adbde7b617b9d02a1026cac130 Mon Sep 17 00:00:00 2001 From: Wendell Jones Date: Tue, 1 Jul 2025 10:03:52 -0400 Subject: [PATCH] This vm_restart.py script is used to restart VMs or LXC containers on a Proxmox host. It takes two command line arguments: the type of client (vm or lxc) and a list of client IDs. example: ./cron_scripts/power/vm_restart.py "lxc" "['110', '113', '114', '120']" --- personal/vm_startup/vm_restart.py | 91 +++++++++++++++++++++++++++++++ personal/vm_startup/vm_startup.py | 70 ++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 personal/vm_startup/vm_restart.py create mode 100644 personal/vm_startup/vm_startup.py diff --git a/personal/vm_startup/vm_restart.py b/personal/vm_startup/vm_restart.py new file mode 100644 index 0000000..4813e30 --- /dev/null +++ b/personal/vm_startup/vm_restart.py @@ -0,0 +1,91 @@ +#!/usr/bin/python3 +import sys, ast +from subprocess import check_output, run +from time import sleep +from datetime import datetime + + +def get_time(): + ts1 = str(datetime.now()).split('.')[0] + return ts1 + + +def call_shutdown(client_type, clientid): + if client_type == 'vm': + run(['/usr/sbin/qm', 'shutdown', clientid]) + elif client_type == 'lxc': + run(['/usr/bin/lxc-stop', clientid]) + else: + print('Unable to stop {clientid}. Invalid client type or client id') + print(f'client_type: {client_type}') + print(f'client id: {clientid}') + + +def call_startup(client_type, clientid): + if client_type == 'vm': + run(['/usr/sbin/qm', 'start', clientid]) + elif client_type == 'lxc': + run(['/usr/bin/lxc-start', clientid]) + else: + print('invalid client type or client id') + + +def get_status(client_type, clientid, vmstatus, status_wanted): + checker = None + if client_type == 'lxc': + checker = check_output(['lxc-info', clientid]) + elif client_type == 'vm': + checker = check_output(['/usr/sbin/qm', 'status', clientid]) + while vmstatus != status_wanted: + sleep(5) + vmoutput = checker + if (str.encode(status_wanted)) in vmoutput.upper(): + vmstatus = status_wanted + return status_wanted + + +def print_state(vmtype, vmhost, vmstatus): + print(f'{vmtype} {vmhost} is {vmstatus}') + + +# This script is used to restart VMs or LXC containers on a Proxmox host. +# It takes two command line arguments: the type of client (vm or lxc) and a list of client IDs. +# example: ./cron_scripts/power/vm_restart.py "lxc" "['110', '113', '114', '120']" + + +def main(): + client_type = None + client_list = None + try: + client_type = sys.argv[1] + client_list = ast.literal_eval(sys.argv[2]) + except Exception as e: + print(f'Unable to process cli arguments. {e}') + else: + print(f'{client_type} {client_list}') + timestamp = get_time() + print(f'Start time: {timestamp}') + for clientid in client_list: + try: + print(f'Shutting down {clientid}') + call_shutdown(client_type, clientid) + vresult = get_status(client_type, clientid, 'RUNNING', 'STOPPED') + except Exception as e: + print(f'Unable to stop container {clientid}: {e}') + else: + print_state(client_type.upper(), clientid, vresult) + try: + print(f'Starting {clientid}') + call_startup(client_type, clientid) + vresult = get_status(client_type, clientid, 'STOPPED', 'RUNNING') + except Exception as e: + print(f'Unable to start container {clientid}: {e}') + else: + print_state(client_type.upper(), clientid, vresult) + timestamp = get_time() + print(f'End time: {timestamp}') + + +if __name__ == '__main__': + main() + diff --git a/personal/vm_startup/vm_startup.py b/personal/vm_startup/vm_startup.py new file mode 100644 index 0000000..90a2cb5 --- /dev/null +++ b/personal/vm_startup/vm_startup.py @@ -0,0 +1,70 @@ +#!/usr/bin/python3 +from subprocess import check_output, run +from time import sleep +from datetime import datetime + + +def get_time(): + ts1 = str(datetime.now()).split('.')[0] + return ts1 + + +def call_vm_startup(vmid): + run(['/usr/sbin/qm', 'start', vmid]) + + +def call_lxc_startup(lxc): + run(['/usr/bin/lxc-start', lxc]) + + +def monitor_status(vmid): + vmstatus = 'running' + while vmstatus == 'running': + sleep(5) + vmstatus = check_output(['/usr/sbin/qm', 'status', vmid]) + vmstatus = vmstatus.decode().split(': ')[1].rstrip() + return 'Done' + + +def lxc_status(lxc): + vmstatus = 'running' + while vmstatus.lower() == 'running': + sleep(5) + vmoutput = check_output(['lxc-info', lxc]) + if b'RUNNING' not in vmoutput: + vmstatus = 'stopped' + print(vmstatus) + return 'Done' + + +def main(): + timestamp = get_time() + print(f'Start time: {timestamp}') + vms = ['115', '109', '108', '107', '101'] + for vm in vms: + try: + print(f'Starting {vm}') + call_vm_startup(vm) + vresult = monitor_status(vm) + print(f'{vresult}') + except Exception: + print(f'{vm} currently not running') + lxcs = [ + '121', '116', '114', '113', '111', '106', + '103', '104', '105', '112', '100', '117', + '118', '119', '110' + ] + for lxc in lxcs: + try: + print(f'Starting {lxc}') + call_lxc_startup(lxc) + vresult = lxc_status(lxc) + print(f'{vresult}') + except Exception: + print(f'{lxc} currently not running') + timestamp = get_time() + print(f'End time: {timestamp}') + + +if __name__ == '__main__': + main()