#!/usr/bin/env -S bash source env_scripts/common.sh source env_scripts/functions.sh # Default values for VM creation parameters VM_MEM_SIZE=1024 VM_VCPUS=1 VM_DISK_SIZE=10 # Function to display usage message usage() { less << EOF NAME $0 USAGE Usage: $0 create -n NAME [-b BRIDGE] [-r RAM] [-c VCPUS] [-s DISK] [-v] $0 delete NAME $0 info NAME $0 connect NAME $0 install NAME $0 list ACTIONS create Create a new virtual machine delete Delete a virtual machine list List all defined virtual machines info Show information about a virtual machine connect Connect to the console of a virtual machine install Install specific software into an existing VM OPTIONS -h Show this help message -n NAME Host name (required) -b BRIDGE Bridge interface name -H Host Only Network -r RAM RAM in MB (default: ${VM_MEM_SIZE}) -c VCPUS Number of VCPUs (default: ${VM_VCPUS}) -s DISK Disk size in GB (default: ${VM_DISK_SIZE}) -v Verbose mode AUTHOR Victor Gracia Enguita COPYRIGHT This is free software; see the source for copying conditions. EOF exit 1 } # Check if at least one argument is provided if [ $# -eq 0 ]; then usage fi ACTION="$1" shift case "${ACTION}" in create) # Parse options for create command VERBOSE=false NAME_SET=false source env_scripts/common.sh while getopts ":hn:b:Hr:c:s:v" opt; do case "${opt}" in h) usage ;; n) VM_HOSTNAME="${OPTARG}" NAME_SET=true ;; b) VM_BRIDGE_INT="${OPTARG}" VM_NETWORK_TYPE="bridge" ;; H) VM_NETWORK_TYPE="isolated" ;; r) VM_MEM_SIZE="${OPTARG}" ;; c) VM_VCPUS="${OPTARG}" ;; s) VM_DISK_SIZE="${OPTARG}" ;; v) VERBOSE=true ;; \?) echo "Invalid option: -${OPTARG}" >&2 usage ;; :) echo "Option -${OPTARG} requires an argument." >&2 usage ;; esac done # Check that required parameter (-n) was provided if ! ${NAME_SET}; then echo "Error: The -n option is required for create action." >&2 usage fi detect_distro #Check network type vm_net_set_network_type #Check host os for guest debian type check_host_os #Read os_options.json and generate guests menu #Select guest show_vm_menu #Set guest type based on check_host_os vm_set_guest_type #set image permissions chown_image_permissions if [[ "$VM_OS_TYPE" == "BSD" && "${VM_OS_VARIANT}" == *"openbsd"* ]]; then generate_openbsd_image else #Download cloud image vm_download_base_image #Compare hashes compare_checksum #Create guest image vm_create_guest_image fi #Generate ssh key vm_generate_ssh_hey #Generate meta-data file for VM vm_gen_meta_data #Generate user-data file for VM vm_gen_user_data #Install VM vm_guest_install ;; delete|info|connect) # These actions require a NAME directly as first argument after ACTION if [ $# -ne 1 ]; then echo "Error: ${ACTION} requires a VM name as argument." >&2 usage fi VM_HOSTNAME="$1" source env_scripts/common.sh if [[ "${ACTION}" == 'delete' ]]; then vm_delete ${VM_HOSTNAME} elif [[ "${ACTION}" == 'info' ]]; then vm_net_get_ip ${VM_HOSTNAME} elif [[ "${ACTION}" == 'connect' ]]; then vm_connect ${VM_HOSTNAME} fi ;; install) VM_HOSTNAME="$1" show_software_menu vm_install_utils $VM_HOSTNAME ;; list) vm_list ;; *) echo "Unknown action: ${ACTION}" >&2 usage ;; esac exit 0