Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- # Author: Djordje Ilic
- # Date: 09-October-2015
- # Parameter
- FIREHOL=/etc/firehol/firehol.conf
- CONFD=/etc/xen/conf.d/
- VMNAME= # VM Name (e.g. DB1, Blog, web1, ...)
- HOSTNAME= # Full Hostname (e.g. web1.rhazdon.com)
- IP= # IP address (e.g. 1.2.3.4)
- IPv6= # IPv6 address
- SIZE= # Volume Size of root partition (e.g. 30GB)
- MEMORY= # Size of Memory (DDR)
- VCPUS= # Number of virtual CPUs
- VIFNAME_IN= # Virtual Network Interface Name (private address)
- VIFNAME_EX= # Virtual Network Interface Name (public address)
- SWAP= # Size of SWAP (if empty == noswap)
- VIF_IN_POST="_IN"
- VIF_EX_POST="_EX"
- ISNUMERIC='^[0-9]+$'
- DOMAINNAME=".rhazdon.com"
- # IPv4
- IP_PRE="10.0.0."
- IP_MIN=2
- IP_MAX=254
- #IPv6
- IPv6_PRE="2a01:4f8:200:318a::"
- echo "#####################################"
- echo "#####################################"
- echo "Creating a new virtual machine."
- echo "Please input the necessary parameteres."
- echo ""
- #################################################
- ########## R E A D P A R A M E T E R S ########
- #################################################
- # Read and check NAME
- VMNAME_IS_VALID=0
- while [ $VMNAME_IS_VALID -lt 1 ]
- do
- echo -e "Input VM Name: \c"
- read VMNAME
- if [ -z "$VMNAME" ]; then
- echo "Name is empty."
- elif grep -Frq "name = '$VMNAME'" $CONFD; then
- echo "Name is already in use. Please take another name."
- else
- ((VMNAME_IS_VALID++))
- # Create VifName
- VIFNAME_IN="vif$VMNAME$VIF_IN_POST"
- VIFNAME_EX="vif$VMNAME$VIF_EX_POST"
- # Add Domainname to Hostname
- HOSTNAME="$VMNAME$DOMAINNAME"
- fi
- done
- # Read and check IP Address
- IP_IS_VALID=0
- while [ $IP_IS_VALID -lt 1 ]
- do
- echo -e "Input IP address: $IP_PRE\c"
- read IP
- if [ -z "$IP" ]; then
- echo "Error: IP is empty."
- elif ! [[ $IP =~ $ISNUMERIC ]]; then
- echo "Error: IP is not a number" >&2;
- elif [ $IP -lt $IP_MIN ]; then
- echo "Error: IP has to be greater then 33."
- elif [ $IP -gt $IP_MAX ]; then
- echo "Error: IP must not be greater then 64."
- elif grep -Frq "$IP_PRE$IP" $CONFD; then
- echo "IP is already in use. Please take another IP."
- else
- ((IP_IS_VALID++))
- printf -v IPv6 "%x" "$IP"
- IP="$IP_PRE$IP"
- IPv6="$IPv6_PRE$IPv6"
- fi
- done
- # Read and check SIZE
- SIZE_IS_VALID=0
- while [ $SIZE_IS_VALID -lt 1 ]
- do
- echo -e "Input vm size in GB: \c"
- read SIZE
- if [ -z "$SIZE" ]; then
- echo "Error: Size is empty."
- elif ! [[ $SIZE =~ $ISNUMERIC ]]; then
- echo "Error: Size is not a number" >&2;
- elif [ $SIZE -lt 10 ]; then
- echo "Error: Size should be greater then 10GB."
- elif [ $SIZE -gt 500 ]; then
- echo "Error: Size should be less then 500GB."
- else
- ((SIZE_IS_VALID++))
- SIZE+="G"
- fi
- done
- # Read and check MEMORY
- MEMORY_IS_VALID=0
- while [ $MEMORY_IS_VALID -lt 1 ]
- do
- echo -e "Input vm memory in MB: \c"
- read MEMORY
- if [ -z "$MEMORY" ]; then
- echo "Error: Memory is empty."
- elif ! [[ $MEMORY =~ $ISNUMERIC ]]; then
- echo "Error: Memory is not a number" >&2;
- elif [ $MEMORY -lt 512 ]; then
- echo "Error: Memory should be greater then 512MB."
- elif [ $MEMORY -gt 32000 ]; then
- echo "Error: Memory should be less then 32000MB."
- else
- ((MEMORY_IS_VALID++))
- MEMORY+="M"
- fi
- done
- # Read and check VCPUS
- VCPUS_IS_VALID=0
- while [ $VCPUS_IS_VALID -lt 1 ]
- do
- echo -e "Input vcpus: \c"
- read VCPUS
- if [ -z "$VCPUS" ]; then
- echo "Error: VCPUS is empty."
- elif ! [[ $VCPUS =~ $ISNUMERIC ]]; then
- echo "Error: VCPUS is not a number" >&2;
- elif [ $VCPUS -lt 1 ]; then
- echo "Error: VCPUS should be greater then 1."
- elif [ $VCPUS -gt 8 ]; then
- echo "Error: VCPUS should be equal or less then 9."
- else
- ((VCPUS_IS_VALID++))
- fi
- done
- # Read and check SWAP
- SWAP_IS_VALID=0
- while [ $SWAP_IS_VALID -lt 1 ]
- do
- echo -e "Input SWAP Size in MB. Type '0' for noswap: \c"
- read SWAP
- if [ -z "$SWAP" ]; then
- echo "Error: SWAP is empty."
- elif ! [[ $SWAP =~ $ISNUMERIC ]]; then
- echo "Error: SWAP is not a number" >&2;
- elif [ $SWAP -gt 32000 ]; then
- echo "Error: SWAP should be less then 32000MB."
- else
- ((SWAP_IS_VALID++))
- SWAP+="M"
- fi
- done
- # Check Inputs
- INPUTS_VALID=0
- while [ $INPUTS_VALID -lt 1 ]
- do
- echo "----------------------------------------------------"
- echo "----------------------------------------------------"
- echo "| Hostname: | $HOSTNAME"
- echo "| VIF Private: | $VIFNAME_IN"
- echo "| VIF Public: | $VIFNAME_EX"
- echo "| IP: | $IP"
- echo "| IPv6: | $IPv6"
- echo "| vCPUs: | $VCPUS"
- echo "| Disk size: | $SIZE"
- echo "| Memory: | $MEMORY"
- echo "| Swap: | $SWAP"
- echo "----------------------------------------------------"
- echo "Parameters correct (Y/n)?"
- read VALID
- if [ -z "$VALID" ] || [ "$VALID" == "y" ] || [ "$VALID" == "Y" ]; then
- ((INPUTS_VALID++))
- elif [ "$VALID" == "n" ] || [ "$VALID" == "N" ]; then
- echo "Exit."
- exit 1
- fi
- done
- #################################################
- ######### X E N C R E A T E I M A G E #######
- #################################################
- echo ""
- echo ""
- echo "Creating machine with xen-create-image."
- if [ "$SWAP" == "0M" ]; then
- xen-create-image --hostname=$HOSTNAME --ip=$IP --vcpus=$VCPUS --size=$SIZE --memory=$MEMORY --maxmem=$MEMORY --vifname=$VIFNAME_IN --lvm=vg0 --noswap
- else
- xen-create-image --hostname=$HOSTNAME --ip=$IP --vcpus=$VCPUS --size=$SIZE --memory=$MEMORY --maxmem=$MEMORY --vifname=$VIFNAME_IN --lvm=vg0 --swap=$SWAP
- fi
- if [ $? -eq 0 ]; then
- echo "OK"
- else
- echo "FAIL"
- exit 1
- fi
- #################################################
- ######### C R E A T E I P v 6 V I F #########
- #################################################
- # This part will create a second MAC address. One is for the public and one
- # for the private interface. We will take the generated MAC from Xen and
- # just increase the last character (or decrease, if the last
- # character is 'F'.
- # Find host config file
- CFG_FILE=/etc/xen/conf.d/$HOSTNAME.cfg
- # We will use this tmp file for output from sed
- TMP_FILE=/tmp/tmp.cfg
- # Get the line number from config file, where the vif is configured
- LINE_NR=$(awk '/vif/{ print NR; exit }' $CFG_FILE)
- LINE_NR2=$((LINE_NR+1))
- # Get the whole content of the line, where the vif is configured
- LINE=$(sed -n "${LINE_NR}p" "$CFG_FILE")
- # Get the first position of the mac tag
- MAC_POS=`expr index "$LINE" m`
- # Get the substring with the mac address
- MAC_SUB=${LINE:$MAC_POS-1:21}
- MAC_SUB_LENGTH=${#MAC_SUB}
- MAC_SUB_LAST_CHAR=${MAC_SUB:MAC_SUB_LENGTH-1:1}
- #
- if [[ $MAC_SUB_LAST_CHAR == '0' ]] ; then
- MAC_SUB_LAST_CHAR='1'
- elif [[ $MAC_SUB_LAST_CHAR == '1' ]] ; then
- MAC_SUB_LAST_CHAR='2'
- elif [[ $MAC_SUB_LAST_CHAR == '2' ]] ; then
- MAC_SUB_LAST_CHAR='3'
- elif [[ $MAC_SUB_LAST_CHAR == '3' ]] ; then
- MAC_SUB_LAST_CHAR='4'
- elif [[ $MAC_SUB_LAST_CHAR == '4' ]] ; then
- MAC_SUB_LAST_CHAR='5'
- elif [[ $MAC_SUB_LAST_CHAR == '5' ]] ; then
- MAC_SUB_LAST_CHAR='6'
- elif [[ $MAC_SUB_LAST_CHAR == '6' ]] ; then
- MAC_SUB_LAST_CHAR='7'
- elif [[ $MAC_SUB_LAST_CHAR == '7' ]] ; then
- MAC_SUB_LAST_CHAR='8'
- elif [[ $MAC_SUB_LAST_CHAR == '8' ]] ; then
- MAC_SUB_LAST_CHAR='9'
- elif [[ $MAC_SUB_LAST_CHAR == '9' ]] ; then
- MAC_SUB_LAST_CHAR='A'
- elif [[ $MAC_SUB_LAST_CHAR == 'A' ]] ; then
- MAC_SUB_LAST_CHAR='B'
- elif [[ $MAC_SUB_LAST_CHAR == 'B' ]] ; then
- MAC_SUB_LAST_CHAR='C'
- elif [[ $MAC_SUB_LAST_CHAR == 'C' ]] ; then
- MAC_SUB_LAST_CHAR='D'
- elif [[ $MAC_SUB_LAST_CHAR == 'D' ]] ; then
- MAC_SUB_LAST_CHAR='E'
- elif [[ $MAC_SUB_LAST_CHAR == 'E' ]] ; then
- MAC_SUB_LAST_CHAR='F'
- elif [[ $MAC_SUB_LAST_CHAR == 'F' ]] ; then
- MAC_SUB_LAST_CHAR='E'
- fi
- # Create MAC addresses
- MAC_IN=$MAC_SUB
- MAC_EX=${MAC_SUB:0:MAC_SUB_LENGTH-1}$MAC_SUB_LAST_CHAR
- # Remove the old vif configuration from xen config file
- sed -e "${LINE_NR}d" "$CFG_FILE" > $TMP_FILE && mv $TMP_FILE $CFG_FILE
- # Write the new vif config into the config file
- sed -i "${LINE_NR}i\\vif = [ \'ip=$IPv6,$MAC_EX,vifname=$VIFNAME_EX,script=vif-route\'," $CFG_FILE
- sed -i "${LINE_NR2}i\\ \'ip=$IP,$MAC_IN,vifname=$VIFNAME_IN,bridge=xenbr0,script=vif-bridge\' ]" $CFG_FILE
- #################################################
- ########## F I R E H O L C O N F I G ##########
- #################################################
- # Create a default Firehol Config
- echo "Creating Firehol Rules"
- FIREHOL_VIF_POST_IN="_IF_IN" # Virtual Interface Name post
- FIREHOL_VIF_POST_EX="_IF_EX" # Virtual Interface Name post
- FIREHOL_VIF_IN=$VMNAME$FIREHOL_VIF_POST_IN # Virtual Interface Name for Firehol
- FIREHOL_VIF_EX=$VMNAME$FIREHOL_VIF_POST_EX # Virtual Interface Name for Firehol
- FIREHOL_INTERFACE_POST_IN="In" # Firehol Interface Name post
- FIREHOL_INTERFACE_POST_EX="Ex" # Firehol Interface Name post
- FIREHOL_INTERFACE_IN=$VMNAME$FIREHOL_INTERFACE_POST_IN
- FIREHOL_INTERFACE_EX=$VMNAME$FIREHOL_INTERFACE_POST_EX
- echo "" >> $FIREHOL
- echo "" >> $FIREHOL
- echo "##############################" >> $FIREHOL
- echo "# Xen $VMNAME" >> $FIREHOL
- echo "##############################" >> $FIREHOL
- echo "$FIREHOL_VIF_IN=\"$VIFNAME_IN\"" >> $FIREHOL
- echo "interface \"\${$FIREHOL_VIF_IN}\" $FIREHOL_INTERFACE_IN" >> $FIREHOL
- echo " server \"\${Helper_LAN} \${Helper_IPv6}\" accept" >> $FIREHOL
- echo " client \"\${Helper_LAN} \${Helper_IPv6}\" accept" >> $FIREHOL
- echo "" >> $FIREHOL
- echo "$FIREHOL_VIF_EX=\"$VIFNAME_EX\"" >> $FIREHOL
- echo "interface \"\${$FIREHOL_VIF_EX}\" $FIREHOL_INTERFACE_EX" >> $FIREHOL
- echo " server \"\${Helper_WAN} \${Helper_IPv6}\" accept" >> $FIREHOL
- echo " client \"\${Helper_WAN} \${Helper_IPv6}\" accept" >> $FIREHOL
- firehol restart
- echo ""
- echo "#####################################"
- echo "Virtual Machine is ready! Your new VM will boot automaticaly."
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement