Advertisement
Guest User

Untitled

a guest
Oct 10th, 2015
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.58 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. # Author: Djordje Ilic
  4. # Date: 09-October-2015
  5.  
  6. # Parameter
  7. FIREHOL=/etc/firehol/firehol.conf
  8. CONFD=/etc/xen/conf.d/
  9. VMNAME= # VM Name (e.g. DB1, Blog, web1, ...)
  10. HOSTNAME= # Full Hostname (e.g. web1.rhazdon.com)
  11. IP= # IP address (e.g. 1.2.3.4)
  12. IPv6= # IPv6 address
  13. SIZE= # Volume Size of root partition (e.g. 30GB)
  14. MEMORY= # Size of Memory (DDR)
  15. VCPUS= # Number of virtual CPUs
  16. VIFNAME_IN= # Virtual Network Interface Name (private address)
  17. VIFNAME_EX= # Virtual Network Interface Name (public address)
  18. SWAP= # Size of SWAP (if empty == noswap)
  19.  
  20. VIF_IN_POST="_IN"
  21. VIF_EX_POST="_EX"
  22. ISNUMERIC='^[0-9]+$'
  23. DOMAINNAME=".rhazdon.com"
  24. # IPv4
  25. IP_PRE="10.0.0."
  26. IP_MIN=2
  27. IP_MAX=254
  28. #IPv6
  29. IPv6_PRE="2a01:4f8:200:318a::"
  30.  
  31.  
  32. echo "#####################################"
  33. echo "#####################################"
  34. echo "Creating a new virtual machine."
  35. echo "Please input the necessary parameteres."
  36. echo ""
  37.  
  38. #################################################
  39. ########## R E A D P A R A M E T E R S ########
  40. #################################################
  41. # Read and check NAME
  42. VMNAME_IS_VALID=0
  43. while [ $VMNAME_IS_VALID -lt 1 ]
  44. do
  45. echo -e "Input VM Name: \c"
  46. read VMNAME
  47. if [ -z "$VMNAME" ]; then
  48. echo "Name is empty."
  49. elif grep -Frq "name = '$VMNAME'" $CONFD; then
  50. echo "Name is already in use. Please take another name."
  51. else
  52. ((VMNAME_IS_VALID++))
  53. # Create VifName
  54. VIFNAME_IN="vif$VMNAME$VIF_IN_POST"
  55. VIFNAME_EX="vif$VMNAME$VIF_EX_POST"
  56. # Add Domainname to Hostname
  57. HOSTNAME="$VMNAME$DOMAINNAME"
  58. fi
  59. done
  60.  
  61.  
  62. # Read and check IP Address
  63. IP_IS_VALID=0
  64. while [ $IP_IS_VALID -lt 1 ]
  65. do
  66. echo -e "Input IP address: $IP_PRE\c"
  67. read IP
  68. if [ -z "$IP" ]; then
  69. echo "Error: IP is empty."
  70. elif ! [[ $IP =~ $ISNUMERIC ]]; then
  71. echo "Error: IP is not a number" >&2;
  72. elif [ $IP -lt $IP_MIN ]; then
  73. echo "Error: IP has to be greater then 33."
  74. elif [ $IP -gt $IP_MAX ]; then
  75. echo "Error: IP must not be greater then 64."
  76. elif grep -Frq "$IP_PRE$IP" $CONFD; then
  77. echo "IP is already in use. Please take another IP."
  78. else
  79. ((IP_IS_VALID++))
  80. printf -v IPv6 "%x" "$IP"
  81. IP="$IP_PRE$IP"
  82. IPv6="$IPv6_PRE$IPv6"
  83. fi
  84. done
  85.  
  86.  
  87. # Read and check SIZE
  88. SIZE_IS_VALID=0
  89. while [ $SIZE_IS_VALID -lt 1 ]
  90. do
  91. echo -e "Input vm size in GB: \c"
  92. read SIZE
  93. if [ -z "$SIZE" ]; then
  94. echo "Error: Size is empty."
  95. elif ! [[ $SIZE =~ $ISNUMERIC ]]; then
  96. echo "Error: Size is not a number" >&2;
  97. elif [ $SIZE -lt 10 ]; then
  98. echo "Error: Size should be greater then 10GB."
  99. elif [ $SIZE -gt 500 ]; then
  100. echo "Error: Size should be less then 500GB."
  101. else
  102. ((SIZE_IS_VALID++))
  103. SIZE+="G"
  104. fi
  105. done
  106.  
  107.  
  108. # Read and check MEMORY
  109. MEMORY_IS_VALID=0
  110. while [ $MEMORY_IS_VALID -lt 1 ]
  111. do
  112. echo -e "Input vm memory in MB: \c"
  113. read MEMORY
  114. if [ -z "$MEMORY" ]; then
  115. echo "Error: Memory is empty."
  116. elif ! [[ $MEMORY =~ $ISNUMERIC ]]; then
  117. echo "Error: Memory is not a number" >&2;
  118. elif [ $MEMORY -lt 512 ]; then
  119. echo "Error: Memory should be greater then 512MB."
  120. elif [ $MEMORY -gt 32000 ]; then
  121. echo "Error: Memory should be less then 32000MB."
  122. else
  123. ((MEMORY_IS_VALID++))
  124. MEMORY+="M"
  125. fi
  126. done
  127.  
  128.  
  129. # Read and check VCPUS
  130. VCPUS_IS_VALID=0
  131. while [ $VCPUS_IS_VALID -lt 1 ]
  132. do
  133. echo -e "Input vcpus: \c"
  134. read VCPUS
  135. if [ -z "$VCPUS" ]; then
  136. echo "Error: VCPUS is empty."
  137. elif ! [[ $VCPUS =~ $ISNUMERIC ]]; then
  138. echo "Error: VCPUS is not a number" >&2;
  139. elif [ $VCPUS -lt 1 ]; then
  140. echo "Error: VCPUS should be greater then 1."
  141. elif [ $VCPUS -gt 8 ]; then
  142. echo "Error: VCPUS should be equal or less then 9."
  143. else
  144. ((VCPUS_IS_VALID++))
  145. fi
  146. done
  147.  
  148.  
  149. # Read and check SWAP
  150. SWAP_IS_VALID=0
  151. while [ $SWAP_IS_VALID -lt 1 ]
  152. do
  153. echo -e "Input SWAP Size in MB. Type '0' for noswap: \c"
  154. read SWAP
  155. if [ -z "$SWAP" ]; then
  156. echo "Error: SWAP is empty."
  157. elif ! [[ $SWAP =~ $ISNUMERIC ]]; then
  158. echo "Error: SWAP is not a number" >&2;
  159. elif [ $SWAP -gt 32000 ]; then
  160. echo "Error: SWAP should be less then 32000MB."
  161. else
  162. ((SWAP_IS_VALID++))
  163. SWAP+="M"
  164. fi
  165. done
  166.  
  167.  
  168. # Check Inputs
  169. INPUTS_VALID=0
  170. while [ $INPUTS_VALID -lt 1 ]
  171. do
  172. echo "----------------------------------------------------"
  173. echo "----------------------------------------------------"
  174. echo "| Hostname: | $HOSTNAME"
  175. echo "| VIF Private: | $VIFNAME_IN"
  176. echo "| VIF Public: | $VIFNAME_EX"
  177. echo "| IP: | $IP"
  178. echo "| IPv6: | $IPv6"
  179. echo "| vCPUs: | $VCPUS"
  180. echo "| Disk size: | $SIZE"
  181. echo "| Memory: | $MEMORY"
  182. echo "| Swap: | $SWAP"
  183. echo "----------------------------------------------------"
  184. echo "Parameters correct (Y/n)?"
  185.  
  186. read VALID
  187.  
  188. if [ -z "$VALID" ] || [ "$VALID" == "y" ] || [ "$VALID" == "Y" ]; then
  189. ((INPUTS_VALID++))
  190. elif [ "$VALID" == "n" ] || [ "$VALID" == "N" ]; then
  191. echo "Exit."
  192. exit 1
  193. fi
  194. done
  195.  
  196.  
  197. #################################################
  198. ######### X E N C R E A T E I M A G E #######
  199. #################################################
  200. echo ""
  201. echo ""
  202. echo "Creating machine with xen-create-image."
  203. if [ "$SWAP" == "0M" ]; then
  204. xen-create-image --hostname=$HOSTNAME --ip=$IP --vcpus=$VCPUS --size=$SIZE --memory=$MEMORY --maxmem=$MEMORY --vifname=$VIFNAME_IN --lvm=vg0 --noswap
  205. else
  206. xen-create-image --hostname=$HOSTNAME --ip=$IP --vcpus=$VCPUS --size=$SIZE --memory=$MEMORY --maxmem=$MEMORY --vifname=$VIFNAME_IN --lvm=vg0 --swap=$SWAP
  207. fi
  208.  
  209. if [ $? -eq 0 ]; then
  210. echo "OK"
  211. else
  212. echo "FAIL"
  213. exit 1
  214. fi
  215.  
  216.  
  217. #################################################
  218. ######### C R E A T E I P v 6 V I F #########
  219. #################################################
  220. # This part will create a second MAC address. One is for the public and one
  221. # for the private interface. We will take the generated MAC from Xen and
  222. # just increase the last character (or decrease, if the last
  223. # character is 'F'.
  224.  
  225. # Find host config file
  226. CFG_FILE=/etc/xen/conf.d/$HOSTNAME.cfg
  227.  
  228. # We will use this tmp file for output from sed
  229. TMP_FILE=/tmp/tmp.cfg
  230.  
  231. # Get the line number from config file, where the vif is configured
  232. LINE_NR=$(awk '/vif/{ print NR; exit }' $CFG_FILE)
  233. LINE_NR2=$((LINE_NR+1))
  234.  
  235. # Get the whole content of the line, where the vif is configured
  236. LINE=$(sed -n "${LINE_NR}p" "$CFG_FILE")
  237.  
  238. # Get the first position of the mac tag
  239. MAC_POS=`expr index "$LINE" m`
  240.  
  241. # Get the substring with the mac address
  242. MAC_SUB=${LINE:$MAC_POS-1:21}
  243. MAC_SUB_LENGTH=${#MAC_SUB}
  244. MAC_SUB_LAST_CHAR=${MAC_SUB:MAC_SUB_LENGTH-1:1}
  245.  
  246.  
  247. #
  248. if [[ $MAC_SUB_LAST_CHAR == '0' ]] ; then
  249. MAC_SUB_LAST_CHAR='1'
  250. elif [[ $MAC_SUB_LAST_CHAR == '1' ]] ; then
  251. MAC_SUB_LAST_CHAR='2'
  252. elif [[ $MAC_SUB_LAST_CHAR == '2' ]] ; then
  253. MAC_SUB_LAST_CHAR='3'
  254. elif [[ $MAC_SUB_LAST_CHAR == '3' ]] ; then
  255. MAC_SUB_LAST_CHAR='4'
  256. elif [[ $MAC_SUB_LAST_CHAR == '4' ]] ; then
  257. MAC_SUB_LAST_CHAR='5'
  258. elif [[ $MAC_SUB_LAST_CHAR == '5' ]] ; then
  259. MAC_SUB_LAST_CHAR='6'
  260. elif [[ $MAC_SUB_LAST_CHAR == '6' ]] ; then
  261. MAC_SUB_LAST_CHAR='7'
  262. elif [[ $MAC_SUB_LAST_CHAR == '7' ]] ; then
  263. MAC_SUB_LAST_CHAR='8'
  264. elif [[ $MAC_SUB_LAST_CHAR == '8' ]] ; then
  265. MAC_SUB_LAST_CHAR='9'
  266. elif [[ $MAC_SUB_LAST_CHAR == '9' ]] ; then
  267. MAC_SUB_LAST_CHAR='A'
  268. elif [[ $MAC_SUB_LAST_CHAR == 'A' ]] ; then
  269. MAC_SUB_LAST_CHAR='B'
  270. elif [[ $MAC_SUB_LAST_CHAR == 'B' ]] ; then
  271. MAC_SUB_LAST_CHAR='C'
  272. elif [[ $MAC_SUB_LAST_CHAR == 'C' ]] ; then
  273. MAC_SUB_LAST_CHAR='D'
  274. elif [[ $MAC_SUB_LAST_CHAR == 'D' ]] ; then
  275. MAC_SUB_LAST_CHAR='E'
  276. elif [[ $MAC_SUB_LAST_CHAR == 'E' ]] ; then
  277. MAC_SUB_LAST_CHAR='F'
  278. elif [[ $MAC_SUB_LAST_CHAR == 'F' ]] ; then
  279. MAC_SUB_LAST_CHAR='E'
  280. fi
  281.  
  282.  
  283. # Create MAC addresses
  284. MAC_IN=$MAC_SUB
  285. MAC_EX=${MAC_SUB:0:MAC_SUB_LENGTH-1}$MAC_SUB_LAST_CHAR
  286.  
  287. # Remove the old vif configuration from xen config file
  288. sed -e "${LINE_NR}d" "$CFG_FILE" > $TMP_FILE && mv $TMP_FILE $CFG_FILE
  289.  
  290. # Write the new vif config into the config file
  291. sed -i "${LINE_NR}i\\vif = [ \'ip=$IPv6,$MAC_EX,vifname=$VIFNAME_EX,script=vif-route\'," $CFG_FILE
  292. sed -i "${LINE_NR2}i\\ \'ip=$IP,$MAC_IN,vifname=$VIFNAME_IN,bridge=xenbr0,script=vif-bridge\' ]" $CFG_FILE
  293.  
  294.  
  295. #################################################
  296. ########## F I R E H O L C O N F I G ##########
  297. #################################################
  298. # Create a default Firehol Config
  299. echo "Creating Firehol Rules"
  300.  
  301. FIREHOL_VIF_POST_IN="_IF_IN" # Virtual Interface Name post
  302. FIREHOL_VIF_POST_EX="_IF_EX" # Virtual Interface Name post
  303. FIREHOL_VIF_IN=$VMNAME$FIREHOL_VIF_POST_IN # Virtual Interface Name for Firehol
  304. FIREHOL_VIF_EX=$VMNAME$FIREHOL_VIF_POST_EX # Virtual Interface Name for Firehol
  305.  
  306. FIREHOL_INTERFACE_POST_IN="In" # Firehol Interface Name post
  307. FIREHOL_INTERFACE_POST_EX="Ex" # Firehol Interface Name post
  308. FIREHOL_INTERFACE_IN=$VMNAME$FIREHOL_INTERFACE_POST_IN
  309. FIREHOL_INTERFACE_EX=$VMNAME$FIREHOL_INTERFACE_POST_EX
  310.  
  311. echo "" >> $FIREHOL
  312. echo "" >> $FIREHOL
  313. echo "##############################" >> $FIREHOL
  314. echo "# Xen $VMNAME" >> $FIREHOL
  315. echo "##############################" >> $FIREHOL
  316. echo "$FIREHOL_VIF_IN=\"$VIFNAME_IN\"" >> $FIREHOL
  317. echo "interface \"\${$FIREHOL_VIF_IN}\" $FIREHOL_INTERFACE_IN" >> $FIREHOL
  318. echo " server \"\${Helper_LAN} \${Helper_IPv6}\" accept" >> $FIREHOL
  319. echo " client \"\${Helper_LAN} \${Helper_IPv6}\" accept" >> $FIREHOL
  320. echo "" >> $FIREHOL
  321. echo "$FIREHOL_VIF_EX=\"$VIFNAME_EX\"" >> $FIREHOL
  322. echo "interface \"\${$FIREHOL_VIF_EX}\" $FIREHOL_INTERFACE_EX" >> $FIREHOL
  323. echo " server \"\${Helper_WAN} \${Helper_IPv6}\" accept" >> $FIREHOL
  324. echo " client \"\${Helper_WAN} \${Helper_IPv6}\" accept" >> $FIREHOL
  325.  
  326. firehol restart
  327.  
  328. echo ""
  329. echo "#####################################"
  330. echo "Virtual Machine is ready! Your new VM will boot automaticaly."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement