| #!/bin/bash | |
| # Licensed to the Apache Software Foundation (ASF) under one | |
| # or more contributor license agreements. See the NOTICE file | |
| # distributed with this work for additional information | |
| # regarding copyright ownership. The ASF licenses this file | |
| # to you under the Apache License, Version 2.0 (the | |
| # "License"); you may not use this file except in compliance | |
| # with the License. You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, | |
| # software distributed under the License is distributed on an | |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| # KIND, either express or implied. See the License for the | |
| # specific language governing permissions and limitations | |
| # under the License. | |
| set -x | |
| PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" | |
| . /lib/lsb/init-functions | |
| log_it() { | |
| echo "$(date) $@" >> /var/log/cloud.log | |
| log_action_msg "$@" | |
| } | |
| init_interfaces_orderby_macs() { | |
| macs=( $(echo $1 | sed "s/|/ /g") ) | |
| total_nics=${#macs[@]} | |
| interface_file=${2:-"/etc/network/interfaces"} | |
| rule_file=${3:-"/etc/udev/rules.d/70-persistent-net.rules"} | |
| echo -n "auto lo" > $interface_file | |
| for((i=0; i<total_nics; i++)) | |
| do | |
| if [[ $i < 3 ]] | |
| then | |
| echo -n " eth$i" >> $interface_file | |
| fi | |
| done | |
| cat >> $interface_file << EOF | |
| iface lo inet loopback | |
| EOF | |
| echo "" > $rule_file | |
| for((i=0; i < ${#macs[@]}; i++)) | |
| do | |
| echo "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", ATTR{address}==\"${macs[$i]}\", NAME=\"eth$i\"" >> $rule_file | |
| done | |
| } | |
| init_interfaces() { | |
| if [ "$NIC_MACS" == "" ] | |
| then | |
| cat > /etc/network/interfaces << EOF | |
| auto lo $1 $2 $3 | |
| iface lo inet loopback | |
| EOF | |
| else | |
| init_interfaces_orderby_macs "$NIC_MACS" | |
| fi | |
| } | |
| setup_interface() { | |
| local intfnum=$1 | |
| local ip=$2 | |
| local mask=$3 | |
| local gw=$4 | |
| local force=$5 | |
| local intf=eth${intfnum} | |
| local bootproto="static" | |
| log_it "Setting up interface: ${intf}" | |
| if [ "$BOOTPROTO" == "dhcp" ] | |
| then | |
| if [ "$intfnum" != "0" ] | |
| then | |
| bootproto="dhcp" | |
| fi | |
| fi | |
| if [ "$ip" != "0.0.0.0" -a "$ip" != "" -o "$force" == "force" ] | |
| then | |
| echo "iface $intf inet $bootproto" >> /etc/network/interfaces | |
| if [ "$bootproto" == "static" ] | |
| then | |
| echo " address $ip " >> /etc/network/interfaces | |
| echo " netmask $mask" >> /etc/network/interfaces | |
| fi | |
| if [ ! -z "$PRIVATEMTU" ] && [ $intf == "eth0" ]; then | |
| echo " mtu $PRIVATEMTU" >> /etc/network/interfaces | |
| fi | |
| if [ ! -z "$PUBLICMTU" ] && [ $intf == "eth2" ]; then | |
| echo " mtu $PUBLICMTU" >> /etc/network/interfaces | |
| fi | |
| fi | |
| if [ "$ip" == "0.0.0.0" -o "$ip" == "" ] | |
| then | |
| ifconfig $intf down | |
| fi | |
| if [ "$force" == "force" ] | |
| then | |
| ifdown $intf | |
| else | |
| ifdown $intf | |
| if [ "$RROUTER" != "1" -o "$1" != "2" ] | |
| then | |
| ifup $intf | |
| fi | |
| fi | |
| } | |
| enable_interface_ipv6() { | |
| local intf=eth${1} | |
| log_it "Enabling IPv6 on interface: ${intf}" | |
| sysctl net.ipv6.conf.all.disable_ipv6=0 | |
| sysctl net.ipv6.conf.all.forwarding=1 | |
| sysctl net.ipv6.conf.all.accept_ra=1 | |
| sed -i "s/net.ipv6.conf.all.disable_ipv6 =.*$/net.ipv6.conf.all.disable_ipv6 = 0/" /etc/sysctl.conf | |
| sed -i "s/net.ipv6.conf.all.forwarding =.*$/net.ipv6.conf.all.forwarding = 1/" /etc/sysctl.conf | |
| sed -i "s/net.ipv6.conf.all.accept_ra =.*$/net.ipv6.conf.all.accept_ra = 1/" /etc/sysctl.conf | |
| sysctl net.ipv6.conf.${intf}.accept_dad=0 | |
| sysctl net.ipv6.conf.${intf}.use_tempaddr=0 | |
| if [ "$2" = true ] ; then | |
| ifdown ${intf} | |
| ifup ${intf} | |
| fi | |
| } | |
| setup_interface_ipv6() { | |
| enable_interface_ipv6 $1 false | |
| local intfnum=$1 | |
| local ipv6="$2" | |
| local prelen="$3" | |
| local intf=eth${intfnum} | |
| echo "iface $intf inet6 static" >> /etc/network/interfaces | |
| echo " address $ipv6 " >> /etc/network/interfaces | |
| echo " netmask $prelen" >> /etc/network/interfaces | |
| echo " accept_ra 1" >> /etc/network/interfaces | |
| ifdown $intf | |
| ifup $intf | |
| } | |
| enable_fwding() { | |
| local enabled=$1 | |
| log_it "cloud: enable_fwding = $1" | |
| log_it "enable_fwding = $1" | |
| echo "$1" > /proc/sys/net/ipv4/ip_forward | |
| [ -f /etc/iptables/iptables.conf ] && sed -i "s/ENABLE_ROUTING=.*$/ENABLE_ROUTING=$enabled/" /etc/iptables/iptables.conf && return | |
| } | |
| enable_passive_ftp() { | |
| log_it "cloud: enabling passive FTP for guest VMs" | |
| echo "$1" > /proc/sys/net/netfilter/nf_conntrack_helper | |
| } | |
| disable_rpfilter() { | |
| log_it "cloud: disable rp_filter" | |
| log_it "disable rpfilter" | |
| sed -i "s/net.ipv4.conf.default.rp_filter.*$/net.ipv4.conf.default.rp_filter = 0/" /etc/sysctl.conf | |
| } | |
| get_public_vif_list() { | |
| local vif_list="" | |
| for i in /sys/class/net/eth*; do | |
| vif=$(basename $i); | |
| if [ "$vif" != "eth0" ] && [ "$vif" != "eth1" ] | |
| then | |
| vif_list="$vif_list $vif"; | |
| fi | |
| done | |
| echo $vif_list | |
| } | |
| disable_rpfilter_domR() { | |
| log_it "cloud: Tuning rp_filter on public interfaces" | |
| VIF_LIST=$(get_public_vif_list) | |
| log_it "rpfilter public interfaces : $VIF_LIST" | |
| if [ "$DISABLE_RP_FILTER" == "true" ] | |
| then | |
| log_it "cloud: disable rp_filter on public interfaces" | |
| sed -i "s/net.ipv4.conf.default.rp_filter.*$/net.ipv4.conf.default.rp_filter = 0/" /etc/sysctl.conf | |
| echo "0" > /proc/sys/net/ipv4/conf/default/rp_filter | |
| for vif in $VIF_LIST; do | |
| log_it "cloud: disable rp_filter on public interface: $vif" | |
| sed -i "s/net.ipv4.conf.$vif.rp_filter.*$/net.ipv4.conf.$vif.rp_filter = 0/" /etc/sysctl.conf | |
| echo "0" > /proc/sys/net/ipv4/conf/$vif/rp_filter | |
| done | |
| else | |
| log_it "cloud: enable rp_filter on public interfaces" | |
| sed -i "s/net.ipv4.conf.default.rp_filter.*$/net.ipv4.conf.default.rp_filter = 1/" /etc/sysctl.conf | |
| echo "1" > /proc/sys/net/ipv4/conf/default/rp_filter | |
| for vif in $VIF_LIST; do | |
| log_it "cloud: enable rp_filter on public interface: $vif" | |
| sed -i "s/net.ipv4.conf.$vif.rp_filter.*$/net.ipv4.conf.$vif.rp_filter = 1/" /etc/sysctl.conf | |
| echo "1" > /proc/sys/net/ipv4/conf/$vif/rp_filter | |
| done | |
| fi | |
| log_it "cloud: Enabling rp_filter on Non-public interfaces(eth0,eth1,lo)" | |
| echo "1" > /proc/sys/net/ipv4/conf/eth0/rp_filter | |
| echo "1" > /proc/sys/net/ipv4/conf/eth1/rp_filter | |
| echo "1" > /proc/sys/net/ipv4/conf/lo/rp_filter | |
| } | |
| enable_irqbalance() { | |
| local enabled=$1 | |
| local proc=0 | |
| proc=$(cat /proc/cpuinfo | grep "processor" | wc -l) | |
| if [ $proc -le 1 ] && [ $enabled -eq 1 ] | |
| then | |
| enabled=0 | |
| fi | |
| log_it "Processors = $proc Enable service ${svc} = $enabled" | |
| local cfg=/etc/default/irqbalance | |
| [ -f $cfg ] && sed -i "s/ENABLED=.*$/ENABLED=$enabled/" $cfg && return | |
| } | |
| enable_vpc_rpsrfs() { | |
| local enable=$1 | |
| if [ $enable -eq 0 ] | |
| then | |
| echo 0 > /etc/rpsrfsenable | |
| else | |
| echo 1 > /etc/rpsrfsenable | |
| fi | |
| return 0 | |
| } | |
| enable_rpsrfs() { | |
| local enable=$1 | |
| if [ $enable -eq 0 ] | |
| then | |
| echo 0 > /etc/rpsrfsenable | |
| return 0 | |
| fi | |
| if [ ! -f /sys/class/net/eth0/queues/rx-0/rps_cpus ] | |
| then | |
| echo "rps is not enabled in the kernel" | |
| echo 0 > /etc/rpsrfsenable | |
| return 0 | |
| fi | |
| proc=$(cat /proc/cpuinfo | grep "processor" | wc -l) | |
| if [ $proc -le 1 ] | |
| then | |
| echo 0 > /etc/rpsrfsenable | |
| return 0; | |
| fi | |
| echo 1 > /etc/rpsrfsenable | |
| num=1 | |
| num=$(($num<<$proc)) | |
| num=$(($num-1)); | |
| echo $num; | |
| hex=$(printf "%x\n" $num) | |
| echo $hex; | |
| #enable rps | |
| echo $hex > /sys/class/net/eth0/queues/rx-0/rps_cpus | |
| echo $hex > /sys/class/net/eth2/queues/rx-0/rps_cpus | |
| #enble rfs | |
| echo 256 > /proc/sys/net/core/rps_sock_flow_entries | |
| echo 256 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt | |
| echo 256 > /sys/class/net/eth2/queues/rx-0/rps_flow_cnt | |
| } | |
| setup_ipv6() { | |
| local enableradvd=false | |
| if [ -n "$ETH0_IP6" ] | |
| then | |
| enableradvd=true | |
| setup_interface_ipv6 "0" $ETH0_IP6 $ETH0_IP6_PRELEN | |
| rm -rf /etc/radvd.conf | |
| setup_radvd "0" $ETH0_IP6 $ETH0_IP6_PRELEN $enableradvd | |
| elif [ -n "$GUEST_GW6" -a -n "$GUEST_CIDR6_SIZE" ] | |
| then | |
| rm -rf /etc/radvd.conf | |
| setup_radvd "0" $GUEST_GW6 $GUEST_CIDR6_SIZE $enableradvd | |
| fi | |
| if [ -n "$ETH2_IP6" ] | |
| then | |
| setup_interface_ipv6 "2" $ETH2_IP6 $ETH2_IP6_PRELEN | |
| fi | |
| } | |
| restore_ipv6() { | |
| log_it "Restoring IPv6 configurations with ETH0_IP6=$ETH0_IP6 GUEST_GW6=$GUEST_GW6 GUEST_CIDR6_SIZE=$GUEST_CIDR6_SIZE ETH2_IP6=$ETH2_IP6" | |
| if [ -n "$ETH0_IP6" ] || [ -n "$GUEST_GW6" -a -n "$GUEST_CIDR6_SIZE" ] | |
| then | |
| enable_interface_ipv6 "0" true | |
| fi | |
| if [ -n "$ETH0_IP6" ] | |
| then | |
| enable_radvd | |
| fi | |
| if [ -n "$ETH2_IP6" ] | |
| then | |
| enable_interface_ipv6 "2" true | |
| fi | |
| } | |
| setup_common() { | |
| init_interfaces $1 $2 $3 | |
| if [ -n "$ETH0_IP" ] | |
| then | |
| setup_interface "0" $ETH0_IP $ETH0_MASK $GW | |
| fi | |
| if [ -n "$ETH1_IP" ] | |
| then | |
| setup_interface "1" $ETH1_IP $ETH1_MASK $GW | |
| fi | |
| if [ -n "$ETH2_IP" ] | |
| then | |
| setup_interface "2" $ETH2_IP $ETH2_MASK $GW | |
| fi | |
| setup_ipv6 | |
| echo $NAME > /etc/hostname | |
| echo 'AVAHI_DAEMON_DETECT_LOCAL=0' > /etc/default/avahi-daemon | |
| hostnamectl set-hostname $NAME | |
| #Nameserver | |
| sed -i -e "/^nameserver.*$/d" /etc/resolv.conf # remove previous entries | |
| sed -i -e "/^nameserver.*$/d" /etc/dnsmasq-resolv.conf # remove previous entries | |
| if [ -n "$internalNS1" ] | |
| then | |
| echo "nameserver $internalNS1" > /etc/dnsmasq-resolv.conf | |
| echo "nameserver $internalNS1" > /etc/resolv.conf | |
| fi | |
| if [ -n "$internalNS2" ] | |
| then | |
| echo "nameserver $internalNS2" >> /etc/dnsmasq-resolv.conf | |
| echo "nameserver $internalNS2" >> /etc/resolv.conf | |
| fi | |
| if [ -n "$NS1" ] | |
| then | |
| echo "nameserver $NS1" >> /etc/dnsmasq-resolv.conf | |
| echo "nameserver $NS1" >> /etc/resolv.conf | |
| fi | |
| if [ -n "$NS2" ] | |
| then | |
| echo "nameserver $NS2" >> /etc/dnsmasq-resolv.conf | |
| echo "nameserver $NS2" >> /etc/resolv.conf | |
| fi | |
| if [ -n "$IP6_NS1" ] | |
| then | |
| echo "nameserver $IP6_NS1" >> /etc/dnsmasq-resolv.conf | |
| echo "nameserver $IP6_NS1" >> /etc/resolv.conf | |
| fi | |
| if [ -n "$IP6_NS2" ] | |
| then | |
| echo "nameserver $IP6_NS2" >> /etc/dnsmasq-resolv.conf | |
| echo "nameserver $IP6_NS2" >> /etc/resolv.conf | |
| fi | |
| if [ -n "$MGMTNET" -a -n "$LOCAL_GW" ] | |
| then | |
| log_it "Received mgmt cidr : $MGMTNET" | |
| cidrs=(${MGMTNET//,/ }) | |
| for cidr in ${cidrs[@]} | |
| do | |
| ip route add $cidr via $LOCAL_GW dev eth1 | |
| done | |
| fi | |
| ip route delete default | |
| if [ "$RROUTER" != "1" ] | |
| then | |
| gwdev=$3 | |
| if [ -z "$gwdev" ] | |
| then | |
| gwdev="eth0" | |
| fi | |
| ip route add default via $GW dev $gwdev | |
| fi | |
| # Workaround to activate vSwitch under VMware | |
| timeout 3 ping -n -c 3 $GW & | |
| if [ -n "$MGMTNET" -a -n "$LOCAL_GW" ] | |
| then | |
| timeout 3 ping -n -c 3 $LOCAL_GW & | |
| #This code is added to address ARP issue by pinging MGMT_GW | |
| MGMT_GW=$(echo $MGMTNET | awk -F "." '{print $1"."$2"."$3".1"}') | |
| timeout 3 ping -n -c 3 $MGMT_GW & | |
| fi | |
| if [ "$HYPERVISOR" == "vmware" ]; then | |
| ntpq -p &> /dev/null || vmware-toolbox-cmd timesync enable | |
| fi | |
| } | |
| enable_radvd() { | |
| systemctl -q is-enabled radvd | |
| status=$? | |
| if [ $status -ne 0 ] | |
| then | |
| log_it "Enabling radvd" | |
| systemctl enable radvd | |
| fi | |
| grep -q "radvd" /var/cache/cloud/enabled_svcs || echo "radvd" >> /var/cache/cloud/enabled_svcs | |
| } | |
| setup_radvd() { | |
| log_it "Setting up radvd" | |
| local intfnum=$1 | |
| local ipv6="$2" | |
| local prelen="$3" | |
| local enable="$4" | |
| local intf=eth${intfnum} | |
| local ip6cidr="$ipv6/$prelen" | |
| cp /etc/radvd.conf.tmpl /etc/radvd.conf.$intf | |
| sed -i "s,{{ GUEST_INTERFACE }},$intf,g" /etc/radvd.conf.$intf | |
| sed -i "s,{{ IPV6_CIDR }},$ip6cidr,g" /etc/radvd.conf.$intf | |
| RDNSS_CFG= | |
| if [ -n "$IP6_NS1" ];then | |
| RDNSS_CFG=$RDNSS_CFG" RDNSS $IP6_NS1\n {\n AdvRDNSSLifetime 30;\n };\n" | |
| fi | |
| if [ -n "$IP6_NS2" ];then | |
| RDNSS_CFG=$RDNSS_CFG" RDNSS $IP6_NS2\n {\n AdvRDNSSLifetime 30;\n };\n" | |
| fi | |
| sed -i "s,{{ RDNSS_CONFIG }},$RDNSS_CFG,g" /etc/radvd.conf.$intf | |
| cat /etc/radvd.conf.$intf >> /etc/radvd.conf | |
| if [ "$enable" = true ] ; then | |
| enable_radvd | |
| fi | |
| } | |
| setup_dnsmasq() { | |
| log_it "Setting up dnsmasq" | |
| touch /etc/dhcpopts.txt | |
| [ -z $DHCP_RANGE ] && [ $ETH0_IP ] && DHCP_RANGE=$ETH0_IP | |
| [ $ETH0_IP6 ] && DHCP_RANGE_IP6=$ETH0_IP6 | |
| [ -z $DOMAIN ] && DOMAIN="cloudnine.internal" | |
| #removing the dnsmasq multiple ranges config file. | |
| rm /etc/dnsmasq.d/multiple_ranges.conf | |
| #get the template | |
| cp /etc/dnsmasq.conf.tmpl /etc/dnsmasq.conf | |
| if [ -n "$DOMAIN" ] | |
| then | |
| #send domain name to dhcp clients | |
| sed -i s/[#]*dhcp-option=15.*$/dhcp-option=15,\"$DOMAIN\"/ /etc/dnsmasq.conf | |
| #DNS server will append $DOMAIN to local queries | |
| sed -r -i s/^[#]?domain=.*$/domain=$DOMAIN/ /etc/dnsmasq.conf | |
| #answer all local domain queries | |
| sed -i -e "s/^[#]*local=.*$/local=\/$DOMAIN\//" /etc/dnsmasq.conf | |
| fi | |
| if [ -n "$DNS_SEARCH_ORDER" ] | |
| then | |
| sed -i -e "/^[#]*dhcp-option.*=119.*$/d" /etc/dnsmasq.conf | |
| echo "dhcp-option-force=119,$DNS_SEARCH_ORDER" >> /etc/dnsmasq.conf | |
| # set the domain search order as a space seprated list for option 15 | |
| DNS_SEARCH_ORDER=$(echo $DNS_SEARCH_ORDER | sed 's/,/ /g') | |
| #send domain name to dhcp clients | |
| sed -i s/[#]*dhcp-option=15.*$/dhcp-option=15,\""$DNS_SEARCH_ORDER"\"/ /etc/dnsmasq.conf | |
| fi | |
| if [ $DHCP_RANGE ] | |
| then | |
| sed -i -e "s/^dhcp-range_ip4=.*$/dhcp-range=$DHCP_RANGE,static/" /etc/dnsmasq.conf | |
| else | |
| sed -i -e "s/^dhcp-range_ip4=.*$//" /etc/dnsmasq.conf | |
| fi | |
| if [ $DHCP_RANGE_IP6 ] | |
| then | |
| sed -i -e "s/^dhcp-range_ip6=.*$/dhcp-range=$DHCP_RANGE_IP6,static/" /etc/dnsmasq.conf | |
| # For nondefault6 tagged host, don't send dns-server information | |
| sed -i /nondefault6/d /etc/dnsmasq.conf | |
| echo "dhcp-option=nondefault6,option6:dns-server" >> /etc/dnsmasq.conf | |
| else | |
| sed -i -e "s/^dhcp-range_ip6=.*$//" /etc/dnsmasq.conf | |
| fi | |
| if [ "$RROUTER" == "1" ] | |
| then | |
| DEFAULT_GW=$GUEST_GW | |
| INTERNAL_DNS=$GUEST_GW | |
| else | |
| if [ "$TYPE" == "dhcpsrvr" ] | |
| then | |
| DEFAULT_GW=$GW | |
| else | |
| DEFAULT_GW=$ETH0_IP | |
| fi | |
| INTERNAL_DNS=$ETH0_IP | |
| fi | |
| sed -i -e "/^[#]*dhcp-option=option:router.*$/d" /etc/dnsmasq.conf | |
| [ $DEFAULT_GW ] && echo "dhcp-option=option:router,$DEFAULT_GW" >> /etc/dnsmasq.conf | |
| [ $ETH0_IP ] && [ $NS1 ] && NS="$NS1," | |
| [ $ETH0_IP ] && [ $NS2 ] && NS="$NS$NS2," | |
| [ $ETH0_IP6 ] && [ $IP6_NS1 ] && NS6="[$IP6_NS1]," | |
| [ $ETH0_IP6 ] && [ $IP6_NS2 ] && NS6="$NS6[$IP6_NS2]," | |
| #for now set up ourself as the dns server as well | |
| sed -i -e "/^[#]*dhcp-option=6,.*$/d" /etc/dnsmasq.conf | |
| sed -i -e "/^[#]*dhcp-option=option6:dns-server,.*$/d" /etc/dnsmasq.conf | |
| if [ "$USE_EXTERNAL_DNS" != "true" ] | |
| then | |
| [ $ETH0_IP ] && NS="$INTERNAL_DNS,$NS" | |
| [ $ETH0_IP6 ] && NS6="[::],$NS6" | |
| # enable dns | |
| sed -i -e "/^[#]*port=.*$/d" /etc/dnsmasq.conf | |
| else | |
| # disable dns | |
| sed -i -e "/^[#]*port=.*$/d" /etc/dnsmasq.conf | |
| echo "port=0" >> /etc/dnsmasq.conf | |
| fi | |
| NS=${NS%?} | |
| NS6=${NS6%?} | |
| [ $ETH0_IP ] && echo "dhcp-option=6,$NS" >> /etc/dnsmasq.conf | |
| [ $ETH0_IP6 ] && echo "dhcp-option=option6:dns-server,$NS6" >> /etc/dnsmasq.conf | |
| #adding the name data-server to the /etc/hosts for allowing the access to user-data service and ssh-key reset in every subnet. | |
| #removing the existing entires to avoid duplicates on restarts. | |
| sed -i '/data-server/d' /etc/hosts | |
| if [ -n "$ETH0_IP" ] | |
| then | |
| echo "$ETH0_IP data-server" >> /etc/hosts | |
| fi | |
| if [ -n "$ETH0_IP6" ] | |
| then | |
| echo "$ETH0_IP6 data-server" >> /etc/hosts | |
| fi | |
| #add the dhcp-client-update only if dnsmasq version is 2.6 and above | |
| dnsmasqVersion=$(dnsmasq -v | grep version -m 1 | grep -o "[[:digit:]]\.[[:digit:]]") | |
| major=$(echo "$dnsmasqVersion" | cut -d '.' -f 1) | |
| minor=$(echo "$dnsmasqVersion" | cut -d '.' -f 2) | |
| if [ "$major" -eq '2' -a "$minor" -ge '6' ] || [ "$major" -gt '2' ] | |
| then | |
| sed -i -e "/^dhcp-client-update/d" /etc/dnsmasq.conf | |
| echo 'dhcp-client-update' >> /etc/dnsmasq.conf | |
| fi | |
| command -v dhcp_release > /dev/null 2>&1 | |
| no_dhcp_release=$? | |
| if [ $no_dhcp_release -eq 0 -a -z "$ETH0_IP6" ] | |
| then | |
| echo 1 > /var/cache/cloud/dnsmasq_managed_lease | |
| sed -i -e "/^leasefile-ro/d" /etc/dnsmasq.conf | |
| else | |
| echo 0 > /var/cache/cloud/dnsmasq_managed_lease | |
| fi | |
| } | |
| setup_sshd(){ | |
| local ip=$1 | |
| local eth=$2 | |
| [ -f /etc/ssh/sshd_config ] && sed -i -e "s/^[#]*ListenAddress.*$/ListenAddress $ip/" /etc/ssh/sshd_config | |
| sed -i "/3922/s/eth./$eth/" /etc/iptables/rules.v4 | |
| } | |
| setup_vpc_apache2() { | |
| log_it "Setting up apache web server for VPC" | |
| systemctl disable apache2 | |
| clean_ipalias_config | |
| setup_apache2_common | |
| } | |
| setup_vpc_mgmt_route() { | |
| log_it "Set up route for management network: $MGMTNET via local gateway: $LOCAL_GW for device eth$1 for hypervisor: $HYPERVISOR" | |
| if [ -n "$MGMTNET" -a -n "$LOCAL_GW" ] | |
| then | |
| mgmt_route_rule="$MGMTNET via $LOCAL_GW dev eth${1}" | |
| if [ "$HYPERVISOR" == "vmware" ] || [ "$HYPERVISOR" == "hyperv" ]; | |
| then | |
| exist=`sudo ip route show $mgmt_route_rule | wc -l` | |
| if [ $exist -eq 0 ] | |
| then | |
| log_it "Add route for management network via local gateway, hypervisor: $HYPERVISOR, rule: $mgmt_route_rule" | |
| sudo ip route add $mgmt_route_rule | |
| # workaround to activate vSwitch under VMware | |
| timeout 3 ping -n -c 3 $LOCAL_GW || true | |
| fi | |
| fi | |
| fi | |
| } | |
| clean_ipalias_config() { | |
| rm -f /etc/apache2/conf.d/ports.*.meta-data.conf | |
| rm -f /etc/apache2/sites-available/ipAlias* | |
| rm -f /etc/apache2/sites-enabled/ipAlias* | |
| rm -f /etc/apache2/conf.d/vhost*.conf | |
| rm -f /etc/apache2/ports.conf | |
| rm -f /etc/apache2/vhostexample.conf | |
| rm -f /etc/apache2/sites-available/* | |
| rm -f /etc/apache2/sites-enabled/* | |
| rm -rf /etc/failure_config | |
| } | |
| setup_apache2_common() { | |
| sed -i 's/^Include ports.conf.*/# CS: Done by Python CsApp config\n#Include ports.conf/g' /etc/apache2/apache2.conf | |
| # Disable listing of http://SSVM-IP/icons folder for security issue. see article http://www.i-lateral.com/tutorials/disabling-the-icons-folder-on-an-ubuntu-web-server/ | |
| [ -f /etc/apache2/mods-available/alias.conf ] && sed -i s/"Options Indexes MultiViews"/"Options -Indexes MultiViews"/ /etc/apache2/mods-available/alias.conf | |
| echo "Options -Indexes" > /var/www/html/.htaccess | |
| } | |
| setup_apache2() { | |
| log_it "Setting up apache web server" | |
| mkdir -p /var/www | |
| chown www-data:www-data -R /var/www | |
| clean_ipalias_config | |
| setup_apache2_common | |
| local ip=$1 | |
| } | |
| setup_aesni() { | |
| if [ `grep aes /proc/cpuinfo | wc -l` -gt 0 ] | |
| then | |
| modprobe aesni_intel | |
| fi | |
| } | |
| setup_storage_network() { | |
| if [ x"$STORAGE_IP" == "x" -o x"$STORAGE_NETMASK" == "x" ] | |
| then | |
| log_it "Incompleted parameters STORAGE_IP:$STORAGE_IP, STORAGE_NETMASK:$STORAGE_NETMASK, STORAGE_CIDR:$STORAGE_CIDR. Cannot setup storage network" | |
| return | |
| fi | |
| echo "" >> /etc/network/interfaces | |
| echo "auto eth3" >> /etc/network/interfaces | |
| setup_interface "3" "$STORAGE_IP" "$STORAGE_NETMASK" | |
| [ -n "$MTU" ] && ifconfig eth3 mtu $MTU && echo " mtu $MTU" >> /etc/network/interfaces | |
| #ip route add "$STORAGE_CIDR" via "$STORAGE_IP" | |
| log_it "Successfully setup storage network with STORAGE_IP:$STORAGE_IP, STORAGE_NETMASK:$STORAGE_NETMASK, STORAGE_CIDR:$STORAGE_CIDR" | |
| } | |
| setup_system_rfc1918_internal() { | |
| public_ip=`getPublicIp` | |
| echo "$public_ip" | grep -E "^((127\.)|(10\.)|(172\.1[6-9]\.)|(172\.2[0-9]\.)|(172\.3[0-1]\.)|(192\.168\.))" | |
| if [ "$?" == "0" ]; then | |
| log_it "Not setting up route of RFC1918 space to $LOCAL_GW because $public_ip is RFC1918." | |
| else | |
| log_it "Setting up route of RFC1918 space to $LOCAL_GW" | |
| # Setup general route for RFC 1918 space, as otherwise it will be sent to | |
| # the public gateway and not work | |
| # More specific routes that may be set have preference over this generic route. | |
| ip route add 10.0.0.0/8 via $LOCAL_GW | |
| ip route add 172.16.0.0/12 via $LOCAL_GW | |
| ip route add 192.168.0.0/16 via $LOCAL_GW | |
| fi | |
| } | |
| getPublicIp() { | |
| public_ip=$ETH2_IP | |
| [ "$ETH2_IP" == "0.0.0.0" ] && public_ip=$ETH1_IP | |
| echo $public_ip | |
| } | |
| setup_ntp() { | |
| log_it "Setting up NTP" | |
| NTP_CONF_FILE="/etc/ntpsec/ntp.conf" | |
| if [ -f $NTP_CONF_FILE ] | |
| then | |
| IFS=',' read -a server_list <<< "$NTP_SERVER_LIST" | |
| sed -i "/^server /d" $NTP_CONF_FILE | |
| for (( iterator=${#server_list[@]}-1 ; iterator>=0 ; iterator-- )) | |
| do | |
| server=$(echo ${server_list[iterator]} | tr -d '\r') | |
| PATTERN="server $server" | |
| sed -i "0,/^# server/s//$PATTERN\n# server/" $NTP_CONF_FILE | |
| done | |
| systemctl enable --now --no-block ntp | |
| else | |
| log_it "NTP configuration file not found" | |
| fi | |
| } | |
| routing_svcs() { | |
| echo "haproxy apache2 frr" > /var/cache/cloud/enabled_svcs | |
| echo "cloud nfs-common portmap" > /var/cache/cloud/disabled_svcs | |
| if [ "$RROUTER" -eq "1" ] | |
| then | |
| echo "keepalived" >> /var/cache/cloud/enabled_svcs | |
| echo "dnsmasq conntrackd" >> /var/cache/cloud/disabled_svcs | |
| else | |
| echo "dnsmasq" >> /var/cache/cloud/enabled_svcs | |
| echo "keepalived conntrackd" >> /var/cache/cloud/disabled_svcs | |
| fi | |
| } | |
| parse_cmd_line() { | |
| CMDLINE=$(cat /var/cache/cloud/cmdline) | |
| TYPE="unknown" | |
| BOOTPROTO="static" | |
| DISABLE_RP_FILTER="false" | |
| STORAGE_IP="" | |
| STORAGE_NETMASK="" | |
| STORAGE_CIDR="" | |
| VM_PASSWORD="" | |
| CHEF_TMP_FILE=/tmp/cmdline.json | |
| COMMA="\t" | |
| echo -e "{\n\"type\": \"cmdline\"," > ${CHEF_TMP_FILE} | |
| echo -e "\"cmd_line\": {" >> ${CHEF_TMP_FILE} | |
| for i in $CMDLINE | |
| do | |
| # search for foo=bar pattern and cut out foo | |
| KEY=$(echo $i | cut -d= -f1) | |
| VALUE=$(echo $i | cut -d= -f2) | |
| echo -en ${COMMA} >> ${CHEF_TMP_FILE} | |
| # Two lines so values do not accidentally interpretted as escapes!! | |
| echo -n \"${KEY}\"': '\"${VALUE}\" >> ${CHEF_TMP_FILE} | |
| COMMA=",\n\t" | |
| case $KEY in | |
| disable_rp_filter) | |
| export DISABLE_RP_FILTER=$VALUE | |
| ;; | |
| eth0ip) | |
| export ETH0_IP=$VALUE | |
| ;; | |
| eth1ip) | |
| export ETH1_IP=$VALUE | |
| ;; | |
| eth2ip) | |
| export ETH2_IP=$VALUE | |
| ;; | |
| host) | |
| export MGMT_HOST=$VALUE | |
| ;; | |
| gateway) | |
| export GW=$VALUE | |
| ;; | |
| ip6gateway) | |
| export IP6GW=$VALUE | |
| ;; | |
| eth0mask) | |
| export ETH0_MASK=$VALUE | |
| ;; | |
| eth1mask) | |
| export ETH1_MASK=$VALUE | |
| ;; | |
| eth2mask) | |
| export ETH2_MASK=$VALUE | |
| ;; | |
| eth0ip6) | |
| export ETH0_IP6=$VALUE | |
| ;; | |
| eth0ip6prelen) | |
| export ETH0_IP6_PRELEN=$VALUE | |
| ;; | |
| eth2ip6) | |
| export ETH2_IP6=$VALUE | |
| ;; | |
| eth2ip6prelen) | |
| export ETH2_IP6_PRELEN=$VALUE | |
| ;; | |
| internaldns1) | |
| export internalNS1=$VALUE | |
| ;; | |
| internaldns2) | |
| export internalNS2=$VALUE | |
| ;; | |
| dns1) | |
| export NS1=$VALUE | |
| ;; | |
| dns2) | |
| export NS2=$VALUE | |
| ;; | |
| ip6dns1) | |
| export IP6_NS1=$VALUE | |
| ;; | |
| ip6dns2) | |
| export IP6_NS2=$VALUE | |
| ;; | |
| ip6firewall) | |
| export IP6_FIREWALL=$VALUE | |
| ;; | |
| is_routed) | |
| export IS_ROUTED=$VALUE | |
| ;; | |
| domain) | |
| export DOMAIN=$VALUE | |
| ;; | |
| dnssearchorder) | |
| export DNS_SEARCH_ORDER=$VALUE | |
| ;; | |
| useextdns) | |
| export USE_EXTERNAL_DNS=$VALUE | |
| ;; | |
| mgmtcidr) | |
| export MGMTNET=$VALUE | |
| ;; | |
| localgw) | |
| export LOCAL_GW=$VALUE | |
| ;; | |
| template) | |
| export TEMPLATE=$VALUE | |
| ;; | |
| sshonguest) | |
| export SSHONGUEST=$VALUE | |
| ;; | |
| name) | |
| export NAME=$VALUE | |
| ;; | |
| dhcprange) | |
| export DHCP_RANGE=$(echo $VALUE | tr ':' ',') | |
| ;; | |
| bootproto) | |
| export BOOTPROTO=$VALUE | |
| ;; | |
| type) | |
| export TYPE=$VALUE | |
| ;; | |
| defaultroute) | |
| export DEFAULTROUTE=$VALUE | |
| ;; | |
| redundant_router) | |
| export RROUTER=$VALUE | |
| ;; | |
| redundant_state) | |
| export RROUTER_STATE=$VALUE | |
| ;; | |
| guestgw) | |
| export GUEST_GW=$VALUE | |
| ;; | |
| guestbrd) | |
| export GUEST_BRD=$VALUE | |
| ;; | |
| guestcidrsize) | |
| export GUEST_CIDR_SIZE=$VALUE | |
| ;; | |
| guestgw6) | |
| export GUEST_GW6=$VALUE | |
| ;; | |
| guestcidr6size) | |
| export GUEST_CIDR6_SIZE=$VALUE | |
| ;; | |
| router_pr) | |
| export ROUTER_PR=$VALUE | |
| ;; | |
| extra_pubnics) | |
| export EXTRA_PUBNICS=$VALUE | |
| ;; | |
| nic_macs) | |
| export NIC_MACS=$VALUE | |
| ;; | |
| mtu) | |
| export MTU=$VALUE | |
| ;; | |
| storageip) | |
| export STORAGE_IP=$VALUE | |
| ;; | |
| storagenetmask) | |
| export STORAGE_NETMASK=$VALUE | |
| ;; | |
| storagecidr) | |
| export STORAGE_CIDR=$VALUE | |
| ;; | |
| vmpassword) | |
| export VM_PASSWORD=$VALUE | |
| ;; | |
| vpccidr) | |
| export VPCCIDR=$VALUE | |
| ;; | |
| cidrsize) | |
| export CIDR_SIZE=$VALUE | |
| ;; | |
| advert_int) | |
| export ADVERT_INT=$VALUE | |
| ;; | |
| ntpserverlist) | |
| export NTP_SERVER_LIST=$VALUE | |
| ;; | |
| authorized_key) | |
| export AUTHORIZED_KEYS=$VALUE | |
| ;; | |
| keystore_password) | |
| export KEYSTORE_PSSWD=$VALUE | |
| ;; | |
| validity) | |
| export KS_VALIDITY=$VALUE | |
| ;; | |
| certificate) | |
| export CERTIFICATE=$VALUE | |
| ;; | |
| cacertificate) | |
| export CACERTIFICATE=$VALUE | |
| ;; | |
| privatekey) | |
| export PRIVATEKEY=$VALUE | |
| ;; | |
| logrotatefrequency) | |
| export LOGROTATE_FREQUENCY=$VALUE | |
| ;; | |
| publicMtu) | |
| export PUBLICMTU=$VALUE | |
| ;; | |
| privateMtu) | |
| export PRIVATEMTU=$VALUE | |
| ;; | |
| useHttpsToUpload) | |
| export USEHTTPS=$VALUE | |
| ;; | |
| vncport) | |
| export VNCPORT=$VALUE | |
| ;; | |
| esac | |
| done | |
| echo -e "\n\t}\n}" >> ${CHEF_TMP_FILE} | |
| if [ "$TYPE" != "unknown" ] | |
| then | |
| mv ${CHEF_TMP_FILE} /var/cache/cloud/cmd_line.json | |
| fi | |
| TMP_KEY_PATH=/tmp/.auth_key | |
| AUTHORIZED_KEYS_PATH=/root/.ssh/authorized_keys | |
| if [ ! -z "$AUTHORIZED_KEYS" ] | |
| then | |
| echo "$AUTHORIZED_KEYS" > $TMP_KEY_PATH | |
| base64Val=$(base64 -d $TMP_KEY_PATH) | |
| echo "$base64Val" > $AUTHORIZED_KEYS_PATH | |
| chmod go-rwx $AUTHORIZED_KEYS_PATH | |
| rm -rf $TMP_KEY_PATH | |
| fi | |
| [ $ETH0_IP ] && export LOCAL_ADDRS=$ETH0_IP | |
| [ $ETH0_IP6 ] && export LOCAL_ADDRS=$ETH0_IP6 | |
| [ $ETH0_IP ] && [ $ETH0_IP6 ] && export LOCAL_ADDRS="$ETH0_IP,$ETH0_IP6" | |
| # Randomize cloud password so only ssh login is allowed | |
| echo "cloud:`openssl rand -base64 32`" | chpasswd | |
| if [ x"$VM_PASSWORD" != x"" ] | |
| then | |
| echo "root:$VM_PASSWORD" | chpasswd | |
| fi | |
| } | |
| parse_cmd_line |