You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by pa...@apache.org on 2017/07/28 15:30:53 UTC

[cloudstack] branch cloudearlyinit created (now a2aabb8)

This is an automated email from the ASF dual-hosted git repository.

paul_a pushed a change to branch cloudearlyinit
in repository https://gitbox.apache.org/repos/asf/cloudstack.git.


      at a2aabb8  first stab a adding a smaller 'start up helper' to VR patching

This branch includes the following new commits:

     new a2aabb8  first stab a adding a smaller 'start up helper' to VR patching

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


-- 
To stop receiving notification emails like this one, please contact
['"commits@cloudstack.apache.org" <co...@cloudstack.apache.org>'].

[cloudstack] 01/01: first stab a adding a smaller 'start up helper' to VR patching

Posted by pa...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

paul_a pushed a commit to branch cloudearlyinit
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit a2aabb8f126bb952ed78eb821e94d4b678ccbb22
Author: Paul Angus <pa...@shapeblue.com>
AuthorDate: Fri Jul 28 16:30:22 2017 +0100

    first stab a adding a smaller 'start up helper' to VR patching
---
 systemvm/patches/debian/buildsystemvm.sh           |   4 +-
 .../debian/config/etc/init.d/cloud-early-config    |   4 +-
 .../debian/config/etc/init.d/cloud-early-init      | 423 +++++++++++++++++++++
 .../configure_systemvm_services.sh                 |   4 +-
 4 files changed, 431 insertions(+), 4 deletions(-)

diff --git a/systemvm/patches/debian/buildsystemvm.sh b/systemvm/patches/debian/buildsystemvm.sh
index a34b1dd..f872643 100755
--- a/systemvm/patches/debian/buildsystemvm.sh
+++ b/systemvm/patches/debian/buildsystemvm.sh
@@ -228,7 +228,7 @@ cat > etc/init.d/iptables-persistent << EOF
 #!/bin/sh
 ### BEGIN INIT INFO
 # Provides:          iptables
-# Required-Start:    mountkernfs $local_fs
+# Required-Start:    mountkernfs $local_fs cloud-early-init
 # Required-Stop:     $local_fs
 # Should-Start:      cloud-early-config
 # Default-Start:     S
@@ -418,6 +418,8 @@ services() {
   
   /bin/cp -r ${scriptdir}/config/* ./
   chroot . chkconfig xl2tpd off
+  chroot . chkconfig --add cloud-early-init
+  chroot . chkconfig cloud-early-init on
   chroot . chkconfig --add cloud-early-config
   chroot . chkconfig cloud-early-config on
   chroot . chkconfig --add iptables-persistent
diff --git a/systemvm/patches/debian/config/etc/init.d/cloud-early-config b/systemvm/patches/debian/config/etc/init.d/cloud-early-config
index ac54ebf..ba306c7 100755
--- a/systemvm/patches/debian/config/etc/init.d/cloud-early-config
+++ b/systemvm/patches/debian/config/etc/init.d/cloud-early-config
@@ -1,8 +1,8 @@
 #!/bin/bash
 ### BEGIN INIT INFO
 # Provides:          cloud-early-config
-# Required-Start:    mountkernfs $local_fs
-# Required-Stop:     $local_fs
+# Required-Start:    mountkernfs $local_fs cloud-early-init
+# Required-Stop:     $local_fs cloud-early-init
 # Should-Start:      
 # Should-Stop:       
 # Default-Start:     S
diff --git a/systemvm/patches/debian/config/etc/init.d/cloud-early-init b/systemvm/patches/debian/config/etc/init.d/cloud-early-init
new file mode 100644
index 0000000..77b8036
--- /dev/null
+++ b/systemvm/patches/debian/config/etc/init.d/cloud-early-init
@@ -0,0 +1,423 @@
+#!/bin/bash
+### BEGIN INIT INFO
+# Provides:          cloud-early-init
+# Required-Start:    mountkernfs $local_fs
+# Required-Stop:     $local_fs
+# Should-Start:      
+# Should-Stop:       
+# Default-Start:     S
+# Default-Stop:      0 6
+# Short-Description: configure according to cmdline
+### END INIT INFO
+# 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.
+
+PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin"
+
+[ -f /usr/sbin/hv_kvp_daemon ] && /usr/sbin/hv_kvp_daemon
+
+# Fix haproxy directory issue
+mkdir -p /var/lib/haproxy
+
+# Clear boot up flag, it would be created by rc.local after boot up done
+rm -f /var/cache/cloud/boot_up_done
+
+[ -x /sbin/ifup ] || exit 0
+
+. /lib/lsb/init-functions
+
+log_it() {
+  echo "$(date) $@" >> /var/log/cloud.log
+  log_action_msg "$@"
+}
+
+hypervisor() {
+  [ -d /proc/xen ] && mount -t xenfs none /proc/xen
+  [ -d /proc/xen ] && echo "xen-domU" && return 0
+
+  local try=$([ -x /usr/sbin/virt-what ] && virt-what | tail -1)
+  [ "$try" != "" ] && echo $try && return 0
+
+  vmware-checkvm &> /dev/null && echo "vmware" && return 0
+
+  grep -q QEMU /proc/cpuinfo  && echo "kvm" && return 0
+  grep -q QEMU /var/log/messages && echo "kvm" && return 0
+
+  echo "unknown" && return 1
+
+}
+
+get_boot_params() {
+  local EXTRA_MOUNT=/media/extra
+  local hyp=$(hypervisor)
+  [ $? -ne 0 ] && log_it "Failed to detect hypervisor type, bailing out of early init" && exit 10
+
+  case $hyp in
+     xen-domU|xen-hvm)
+          cat /proc/cmdline > /var/cache/cloud/cmdline
+          sed -i "s/%/ /g" /var/cache/cloud/cmdline
+          ;;
+     kvm)
+          VPORT=$(find /dev/virtio-ports -type l -name '*.vport' 2>/dev/null|head -1)
+
+          if [ -z "$VPORT" ]; then
+            log_it "No suitable VirtIO port was found in /dev/virtio-ports" && exit 2
+          fi
+
+          if [ ! -e "$VPORT" ]; then
+            log_it "${VPORT} not loaded, perhaps guest kernel is too old." && exit 2
+          fi
+
+	      local factor=2
+	      local progress=1
+		  for i in {1..5}
+		  do
+	        while read line; do
+	          if [[ $line == cmdline:* ]]; then
+	            cmd=${line//cmdline:/}
+                echo $cmd > /var/cache/cloud/cmdline
+	          elif [[ $line == pubkey:* ]]; then
+	            pubkey=${line//pubkey:/}
+	            echo $pubkey > /var/cache/cloud/authorized_keys
+	            echo $pubkey > /root/.ssh/authorized_keys
+              fi
+	        done < $VPORT
+	        # In case of reboot we do not send the boot args again.
+	        # So, no need to wait for them, as the boot args are already set at startup
+	        if [ -s /var/cache/cloud/cmdline  ]
+	        then
+              log_it "Found a non empty cmdline file. Will now exit the loop and proceed with configuration."
+              break;
+            fi
+            sleep ${progress}s
+            progress=$[ progress * factor ]
+		  done
+          chmod go-rwx /root/.ssh/authorized_keys
+          ;;
+     vmware)
+          vmtoolsd --cmd 'machine.id.get' > /var/cache/cloud/cmdline 
+          ;;
+     virtualpc|hyperv)
+          # Hyper-V is recognized as virtualpc hypervisor type. Boot args are passed using KVP Daemon
+          #waiting for the hv_kvp_daemon to start up
+          #sleep  need to fix the race condition of hv_kvp_daemon and cloud-early-config
+          sleep 5
+          cp -f /var/opt/hyperv/.kvp_pool_0 /var/cache/cloud/cmdline
+          cat /dev/null > /var/opt/hyperv/.kvp_pool_0
+          ;;
+     virtualbox)
+          # Virtualbox is used to test the virtual router
+          # get the commandline from a dmistring  (yes, hacky!)
+          dmidecode | grep cmdline | sed 's/^.*cmdline://' > /var/cache/cloud/cmdline
+          RV=$?
+          if [ $RV -ne 0 ] ; then
+            log_it "Failed to get cmdline from a virtualbox dmi property"
+          fi
+          ;;
+  esac
+
+}
+
+patch() {
+  local PATCH_MOUNT=/media/cdrom
+  local patchfile=$PATCH_MOUNT/cloud-scripts.tgz
+  local md5file=/var/cache/cloud/cloud-scripts-signature
+  local privkey=$PATCH_MOUNT/authorized_keys
+  local shouldpatch=false
+  local cdrom_dev=
+  mkdir -p $PATCH_MOUNT
+
+
+  if [ -e /dev/xvdd ]; then
+       cdrom_dev=/dev/xvdd
+  elif [ -e /dev/cdrom ]; then
+       cdrom_dev=/dev/cdrom
+  elif [ -e /dev/cdrom1 ]; then
+       cdrom_dev=/dev/cdrom1
+  elif [ -e /dev/cdrom2 ]; then
+       cdrom_dev=/dev/cdrom2
+  elif [ -e /dev/cdrom3 ]; then
+       cdrom_dev=/dev/cdrom3
+  fi
+  [ -f /var/cache/cloud/authorized_keys ] && privkey=/var/cache/cloud/authorized_keys
+
+  if [ -n "$cdrom_dev" ]; then
+    mount -o ro $cdrom_dev $PATCH_MOUNT
+    [ -f $privkey ] && cp -f $privkey /root/.ssh/ && chmod go-rwx /root/.ssh/authorized_keys
+    local oldmd5=
+    [ -f ${md5file} ] && oldmd5=$(cat ${md5file})
+    local newmd5=
+    [ -f ${patchfile} ] && newmd5=$(md5sum ${patchfile} | awk '{print $1}')
+ 
+   if [ "$oldmd5" != "$newmd5" ] && [ -f ${patchfile} ] && [ "$newmd5" != "" ]
+    then
+      shouldpatch=true
+      log_it "Patching  scripts oldmd5=$oldmd5 newmd5=$newmd5"
+      tar xzf $patchfile -C /
+      echo ${newmd5} > ${md5file}
+    fi
+    log_it "Patching  cloud service"
+    hyperVisor=$(hypervisor)
+    /opt/cloud/bin/patchsystemvm.sh $PATCH_MOUNT $hyperVisor
+    umount $PATCH_MOUNT
+
+# removing reboot for the moment    
+#    if [ "$shouldpatch" == "true" ] 
+#    then
+#      log_it "Rebooting system since we patched init scripts"
+#      sync
+#      sleep 2
+#      reboot
+#    fi
+  fi
+  if [ -f /mnt/cmdline ]; then
+    cat /mnt/cmdline > /var/cache/cloud/cmdline
+  fi
+  return 0
+}
+
+start() {
+  # Clear /tmp for file lock
+  rm -f /tmp/*.lock
+  rm -f /tmp/rrouter_bumped
+  local hyp=$(hypervisor)
+  [ $? -ne 0 ] && log_it "Failed to detect hypervisor type, bailing out of early init" && exit 10
+  log_it "Detected that we are running inside $hyp guest"
+  get_boot_params
+  patch
+    if [ "$hyp" == "hyperv" ]; then
+    # eject the systemvm.iso
+     eject
+  fi
+  return 0
+}
+
+disable_hvc
+
+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 "\n\"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 accidently interpretted as escapes!!
+    echo -n \"${KEY}\"': '\"${VALUE}\" >> ${CHEF_TMP_FILE}
+    COMMA=",\n\t"
+    case $KEY in 
+      disable_rp_filter)
+          DISABLE_RP_FILTER=$VALUE
+          ;;
+      eth0ip)
+          ETH0_IP=$VALUE
+          ;;
+      eth1ip)
+          ETH1_IP=$VALUE
+          ;;
+      eth2ip)
+          ETH2_IP=$VALUE
+          ;;
+      host)
+          MGMT_HOST=$VALUE
+          ;;
+      gateway)
+          GW=$VALUE
+          ;;
+      ip6gateway)
+          IP6GW=$VALUE
+          ;;
+      eth0mask)
+          ETH0_MASK=$VALUE
+          ;;
+      eth1mask)
+          ETH1_MASK=$VALUE
+          ;;
+      eth2mask)
+          ETH2_MASK=$VALUE
+          ;;
+      eth0ip6)
+          ETH0_IP6=$VALUE
+          ;;
+      eth0ip6prelen)
+          ETH0_IP6_PRELEN=$VALUE
+          ;;
+      internaldns1)
+          internalNS1=$VALUE
+          ;;
+      internaldns2)
+          internalNS2=$VALUE
+          ;;
+      dns1)
+          NS1=$VALUE
+          ;;
+      dns2)
+          NS2=$VALUE
+          ;;
+      ip6dns1)
+          IP6_NS1=$VALUE
+          ;;
+      ip6dns2)
+          IP6_NS2=$VALUE
+          ;;
+      domain)
+          DOMAIN=$VALUE
+          ;;
+      dnssearchorder)
+          DNS_SEARCH_ORDER=$VALUE
+          ;;
+      useextdns)
+        USE_EXTERNAL_DNS=$VALUE
+          ;;
+      mgmtcidr)
+          MGMTNET=$VALUE
+          ;;
+      localgw)
+          LOCAL_GW=$VALUE
+          ;;
+      template)
+        TEMPLATE=$VALUE
+      	;;
+      sshonguest)
+        SSHONGUEST=$VALUE
+        ;;
+      name)
+	    NAME=$VALUE
+	    ;;
+      dhcprange)
+        DHCP_RANGE=$(echo $VALUE | tr ':' ',')
+      	;;
+      bootproto)
+        BOOTPROTO=$VALUE 
+      	;;
+      type)
+        TYPE=$VALUE	
+	    ;;
+      defaultroute)
+        DEFAULTROUTE=$VALUE	
+	;;
+      redundant_router)
+        RROUTER=$VALUE
+        ;;
+      guestgw)
+        GUEST_GW=$VALUE
+        ;;
+      guestbrd)
+        GUEST_BRD=$VALUE
+        ;;
+      guestcidrsize)
+        GUEST_CIDR_SIZE=$VALUE
+        ;;
+      router_pr)
+        ROUTER_PR=$VALUE
+        ;;
+      extra_pubnics)
+        EXTRA_PUBNICS=$VALUE
+        ;;
+      nic_macs)
+        NIC_MACS=$VALUE
+        ;;
+      mtu)
+        MTU=$VALUE
+        ;;
+      storageip)
+        STORAGE_IP=$VALUE
+        ;;
+      storagenetmask)
+        STORAGE_NETMASK=$VALUE
+        ;;
+      storagecidr)
+        STORAGE_CIDR=$VALUE
+        ;;
+      vmpassword)
+        VM_PASSWORD=$VALUE
+        ;;
+      vpccidr)
+        VPCCIDR=$VALUE
+        ;;
+      cidrsize)
+        CIDR_SIZE=$VALUE
+        ;;
+      advert_int)
+        ADVERT_INT=$VALUE
+        ;;
+      ntpserverlist)
+        NTP_SERVER_LIST=$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
+
+[ $ETH0_IP ] && LOCAL_ADDRS=$ETH0_IP
+[ $ETH0_IP6 ] && LOCAL_ADDRS=$ETH0_IP6
+[ $ETH0_IP ] && [ $ETH0_IP6 ] && LOCAL_ADDRS="$ETH0_IP,$ETH0_IP6"
+}
+
+case "$1" in
+start)
+
+	log_action_begin_msg "Executing cloud-early-config"
+        log_it "Executing cloud-early-config"
+	if start; then
+	    log_action_end_msg $?
+	else
+	    log_action_end_msg $?
+	fi
+	;;
+
+stop)
+	log_action_begin_msg "Stopping cloud-early-config"
+        #Override old system's interface setting
+        setup_default;
+	log_action_end_msg 0
+	;;
+
+force-reload|restart)
+
+	log_warning_msg "Running $0  is deprecated because it may not enable again some interfaces"
+	log_action_begin_msg "Executing cloud-early-config"
+	if start; then
+	    log_action_end_msg $?
+	else
+	    log_action_end_msg $?
+	fi
+	;;
+
+*)
+	echo "Usage: /etc/init.d/cloud-early-config {start|stop}"
+	exit 1
+	;;
+esac
+
+exit 0
diff --git a/tools/appliance/definitions/systemvmtemplate/configure_systemvm_services.sh b/tools/appliance/definitions/systemvmtemplate/configure_systemvm_services.sh
index 60082e3..3171e4d 100644
--- a/tools/appliance/definitions/systemvmtemplate/configure_systemvm_services.sh
+++ b/tools/appliance/definitions/systemvmtemplate/configure_systemvm_services.sh
@@ -36,9 +36,11 @@ function install_cloud_scripts() {
   rsync -av ./cloud_scripts/ /
   chmod +x /opt/cloud/bin/* \
     /root/{clearUsageRules.sh,reconfigLB.sh,monitorServices.py} \
-    /etc/init.d/{cloud,cloud-early-config,cloud-passwd-srvr,postinit} \
+    /etc/init.d/{cloud,cloud-early-init,cloud-early-config,cloud-passwd-srvr,postinit} \
     /etc/profile.d/cloud.sh
 
+  chkconfig --add cloud-early-init
+  chkconfig cloud-early-init on
   chkconfig --add cloud-early-config
   chkconfig cloud-early-config on
   chkconfig --add cloud-passwd-srvr

-- 
To stop receiving notification emails like this one, please contact
"commits@cloudstack.apache.org" <co...@cloudstack.apache.org>.