Files
kvm-cloudimage/vm_manage.sh

171 lines
4.5 KiB
Bash
Executable File

#!/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 <victor@burufalla.ovh>
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