Advertisement
pepoluan

xe-vm-mode.sh

Mar 24th, 2011
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 3.40 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. readonly SUPPORTED_MODES="pv hvm"
  4.  
  5. ERROREXIT () {
  6.   cat <<EOD
  7.  
  8.   ERROR! $2
  9.   Aborting.
  10.  
  11. EOD
  12.   exit $1
  13. }
  14.  
  15. PV_mode () {
  16.   printf "\n * Disabling HVM Boot Policy"
  17.   xe vm-param-clear uuid=$vmuuid  param-name=HVM-boot-policy
  18.  
  19.   printf "\n * Activating pygrub PV bootloader"
  20.   xe vm-param-set   uuid=$vmuuid  PV-bootloader=pygrub
  21.  
  22.   printf "\n * Configuring pygrub PV bootloader: $kernel $ramdisk"
  23.   xe vm-param-set   uuid=$vmuuid  PV-bootloader-args="$kernel $ramdisk"
  24.  
  25.   printf "\n * Configuring kernel args: $kernelparam $mainconsole $xenconsole"
  26.   xe vm-param-set   uuid=$vmuuid  PV-args="$kernelparam $mainconsole $xenconsole"
  27.  
  28.   printf "\n * Setting VBD bootable"
  29.   xe vbd-param-set  uuid=$vbduuid bootable=true
  30. }
  31.  
  32. HVM_mode () {
  33.   printf "\n * Enabling HVM Boot Policy"
  34.   xe vm-param-set   uuid=$vmuuid  HVM-boot-policy="BIOS order"
  35.  
  36.   printf "\n * Deactivating PV bootloader"
  37.   xe vm-param-clear uuid=$vmuuid  param-name=PV-bootloader
  38.  
  39.   printf "\n * Erasing PV bootloader settings"
  40.   xe vm-param-clear uuid=$vmuuid  param-name=PV-bootloader-args
  41.   xe vm-param-clear uuid=$vmuuid  param-name=PV-args
  42. }
  43.  
  44. Nothing_To_Do () {
  45.   printf "\n * Nothing to do."
  46. }
  47.  
  48. if [[ -z "$2" ]]; then
  49.   cat <<EOD
  50.  
  51. Syntax: xe-vm-mode MODE FILE
  52.  
  53. MODE
  54.   pv  : change into PV mode
  55.   hvm : change into
  56.  
  57. FILE
  58.   Contains the VM description. The fields in this file are:
  59.  
  60.   vmname      (R) Partial name of the VM
  61.   kernelpath  (R) Full path to the kernel
  62.   initrdpath  (R) Full path to the initrd
  63.   kernelparam (O) Options to be passed to the kernel. No default.
  64.   consolename (O) The console output to be captured. Defaults to "hvc0"
  65.  
  66.   (R) = Required, (O) = Optional
  67.  
  68. EOD
  69. fi
  70.  
  71. mode="$1"
  72. found=0
  73. for m in $SUPPORTED_MODES; do
  74.   [[ $m == "$mode" ]] && found=1
  75. done
  76. [[ $found == "0" ]] && ERROREXIT 1 "Unknown mode: $mode"
  77.  
  78.  
  79. if ! [[ -f "$2" ]]; then
  80.   ERROREXIT 2 "File not found: $2"
  81. fi
  82.  
  83. while read field value; do
  84.   [[ -z $field ]] && continue
  85.   [[ ${field:0:1} == "#" ]] && continue
  86.   case $field in
  87.     vmname)
  88.       vmname="$value"
  89.       ;;
  90.     kernelpath)
  91.       kernel="--kernel=$value"
  92.       ;;
  93.     initrdpath)
  94.       ramdisk="--ramdisk=$value"
  95.       ;;
  96.     kernelparam)
  97.       kernelparam="$value"
  98.       ;;
  99.     consolename)
  100.       consolename="$value"
  101.       ;;
  102.   esac
  103. done < $2
  104.  
  105. [[ -z "$vmname" ]]  && ERROREXIT 3 "File $2 does not contain the 'vmname' field."
  106. [[ -z "$kernel" ]]  && ERROREXIT 3 "File $2 does not contain the 'kernelpath' field."
  107. [[ -z "$ramdisk" ]] && ERROREXIT 3 "File $2 does not contain the 'initrcpath' field."
  108.  
  109. [[ -z "$consolename" ]] && consolename="hvc0"
  110. mainconsole="console=$consolename"
  111. xenconsole="xencons=$consolename"
  112.  
  113. ## All checking done. Now for some heavylifting.
  114.  
  115. printf "\n"
  116.  
  117. vmlist="$(xe vm-list | awk -v vm="$vmname" '$0 ~ vm {for (i=4; i<=NF; i++) {printf "%s ",$i} print ""}')"
  118. (( $(echo $vmlist | wc -l) > 1 )) && ERROREXIT 5 "Found more than 1 VM matching $partialname:
  119. $vmlist"
  120.  
  121. printf "\n * Found VM: $vmlist"
  122.  
  123. vmuuid="$(xe vm-list | awk -v vm="$vmname" '/uuid/ {uuid=$5} $0 ~ vm && !/Control domain/ {printf "%s",uuid}')"
  124. printf "\n * Found VM-UUID: $vmuuid"
  125.  
  126. vbduuid="$(xe vm-disk-list uuid=$vmuuid | awk '/VBD/ {vbd=1} vbd && $1=="uuid" {print $NF; vbd=0}')"
  127. printf "\n * Found VBD-UUID: $vbduuid"
  128.  
  129. case $mode in
  130.   pv)  PV_mode  ;;
  131.   hvm) HVM_mode ;;
  132. esac
  133.  
  134. printf "\n * DONE"
  135. printf "\n\n"
  136.  
  137. exit 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement