Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- readonly SUPPORTED_MODES="pv hvm"
- ERROREXIT () {
- cat <<EOD
- ERROR! $2
- Aborting.
- EOD
- exit $1
- }
- PV_mode () {
- printf "\n * Disabling HVM Boot Policy"
- xe vm-param-clear uuid=$vmuuid param-name=HVM-boot-policy
- printf "\n * Activating pygrub PV bootloader"
- xe vm-param-set uuid=$vmuuid PV-bootloader=pygrub
- printf "\n * Configuring pygrub PV bootloader: $kernel $ramdisk"
- xe vm-param-set uuid=$vmuuid PV-bootloader-args="$kernel $ramdisk"
- printf "\n * Configuring kernel args: $kernelparam $mainconsole $xenconsole"
- xe vm-param-set uuid=$vmuuid PV-args="$kernelparam $mainconsole $xenconsole"
- printf "\n * Setting VBD bootable"
- xe vbd-param-set uuid=$vbduuid bootable=true
- }
- HVM_mode () {
- printf "\n * Enabling HVM Boot Policy"
- xe vm-param-set uuid=$vmuuid HVM-boot-policy="BIOS order"
- printf "\n * Deactivating PV bootloader"
- xe vm-param-clear uuid=$vmuuid param-name=PV-bootloader
- printf "\n * Erasing PV bootloader settings"
- xe vm-param-clear uuid=$vmuuid param-name=PV-bootloader-args
- xe vm-param-clear uuid=$vmuuid param-name=PV-args
- }
- Nothing_To_Do () {
- printf "\n * Nothing to do."
- }
- if [[ -z "$2" ]]; then
- cat <<EOD
- Syntax: xe-vm-mode MODE FILE
- MODE
- pv : change into PV mode
- hvm : change into
- FILE
- Contains the VM description. The fields in this file are:
- vmname (R) Partial name of the VM
- kernelpath (R) Full path to the kernel
- initrdpath (R) Full path to the initrd
- kernelparam (O) Options to be passed to the kernel. No default.
- consolename (O) The console output to be captured. Defaults to "hvc0"
- (R) = Required, (O) = Optional
- EOD
- fi
- mode="$1"
- found=0
- for m in $SUPPORTED_MODES; do
- [[ $m == "$mode" ]] && found=1
- done
- [[ $found == "0" ]] && ERROREXIT 1 "Unknown mode: $mode"
- if ! [[ -f "$2" ]]; then
- ERROREXIT 2 "File not found: $2"
- fi
- while read field value; do
- [[ -z $field ]] && continue
- [[ ${field:0:1} == "#" ]] && continue
- case $field in
- vmname)
- vmname="$value"
- ;;
- kernelpath)
- kernel="--kernel=$value"
- ;;
- initrdpath)
- ramdisk="--ramdisk=$value"
- ;;
- kernelparam)
- kernelparam="$value"
- ;;
- consolename)
- consolename="$value"
- ;;
- esac
- done < $2
- [[ -z "$vmname" ]] && ERROREXIT 3 "File $2 does not contain the 'vmname' field."
- [[ -z "$kernel" ]] && ERROREXIT 3 "File $2 does not contain the 'kernelpath' field."
- [[ -z "$ramdisk" ]] && ERROREXIT 3 "File $2 does not contain the 'initrcpath' field."
- [[ -z "$consolename" ]] && consolename="hvc0"
- mainconsole="console=$consolename"
- xenconsole="xencons=$consolename"
- ## All checking done. Now for some heavylifting.
- printf "\n"
- vmlist="$(xe vm-list | awk -v vm="$vmname" '$0 ~ vm {for (i=4; i<=NF; i++) {printf "%s ",$i} print ""}')"
- (( $(echo $vmlist | wc -l) > 1 )) && ERROREXIT 5 "Found more than 1 VM matching $partialname:
- $vmlist"
- printf "\n * Found VM: $vmlist"
- vmuuid="$(xe vm-list | awk -v vm="$vmname" '/uuid/ {uuid=$5} $0 ~ vm && !/Control domain/ {printf "%s",uuid}')"
- printf "\n * Found VM-UUID: $vmuuid"
- vbduuid="$(xe vm-disk-list uuid=$vmuuid | awk '/VBD/ {vbd=1} vbd && $1=="uuid" {print $NF; vbd=0}')"
- printf "\n * Found VBD-UUID: $vbduuid"
- case $mode in
- pv) PV_mode ;;
- hvm) HVM_mode ;;
- esac
- printf "\n * DONE"
- printf "\n\n"
- exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement