| #!/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. | 
 |  | 
 | PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin" | 
 | backupfolder=/var/cache/cloud/bkpup_live_patch | 
 | logfile="/var/log/livepatchsystemvm.log" | 
 | newpath="/var/cache/cloud/" | 
 | CMDLINE=/var/cache/cloud/cmdline | 
 | md5file=/var/cache/cloud/cloud-scripts-signature | 
 | svcfile=/var/cache/cloud/enabled_svcs | 
 | TYPE=$(grep -Po 'type=\K[a-zA-Z]*' $CMDLINE) | 
 | patchfailed=0 | 
 | backuprestored=0 | 
 |  | 
 | backup_old_package() { | 
 |   mkdir -p $backupfolder | 
 |   if [ -d /usr/local/cloud/systemvm/conf/ ]; then | 
 |     echo "Backing up keystore file and certificates" > $logfile 2>&1 | 
 |     mkdir -p $backupfolder/conf | 
 |     cp -r /usr/local/cloud/systemvm/conf/* $backupfolder/conf | 
 |   fi | 
 |   if [ -d /usr/local/cloud/systemvm/ ]; then | 
 |     echo "Backing up agent package" >> $logfile 2>&1 | 
 |     cd /usr/local/cloud/systemvm/ | 
 |     zip -r $backupfolder/agent.zip * >> $logfile 2>&1 2>&1 | 
 |     cd - | 
 |   fi | 
 |   cp $md5file $backupfolder | 
 |   echo "Backing up cloud-scripts file" >> $logfile 2>&1 | 
 |   tar -zcvf $backupfolder/cloud-scripts.tgz /etc/ /var/ /opt/ /root/  >> $logfile 2>&1 | 
 | } | 
 |  | 
 | restore_backup() { | 
 |   echo "Restoring cloud scripts" >> $logfile 2>&1 | 
 |   tar -xvf $backupfolder/cloud-scripts.tar -C / >> $logfile 2>&1 | 
 |   echo "Restoring agent package" >> $logfile 2>&1 | 
 |   if [ -f $backupfolder/agent.zip ]; then | 
 |     unzip $backupfolder/agent.zip -d /usr/local/cloud/systemvm/ >> $logfile 2>&1 | 
 |     echo "Restore keystore file and certificates" >> $logfile 2>&1 | 
 |     mkdir -p "/usr/local/cloud/systemvm/conf/" | 
 |     cp -r $backupfolder/conf/* /usr/local/cloud/systemvm/conf/ | 
 |   fi | 
 |   backuprestored=1 | 
 |   restart_services | 
 |   cp $backupfolder/cloud-scripts-signature $md5file | 
 | } | 
 |  | 
 | update_checksum() { | 
 |   newmd5=$(md5sum $1 | awk '{print $1}') | 
 |   echo "checksum: " ${newmd5} >> $logfile 2>&1 | 
 |   echo ${newmd5} > ${md5file} | 
 | } | 
 |  | 
 | restart_services() { | 
 |   systemctl daemon-reload | 
 |   while IFS= read -r line | 
 |     do | 
 |       for svc in ${line}; do | 
 |         systemctl is-active --quiet "$svc" | 
 |         if [ $? -eq 0 ]; then | 
 |           systemctl restart "$svc" | 
 |           systemctl is-active --quiet "$svc" | 
 |           if [ $? -gt 0 ]; then | 
 |             echo "Failed to start "$svc" service. Patch Failed. Retrying again" >> $logfile 2>&1 | 
 |             if [ $backuprestored == 0 ]; then | 
 |               restore_backup | 
 |             fi | 
 |             patchfailed=1 | 
 |             break | 
 |           fi | 
 |         fi | 
 |       done | 
 |       if [ $patchfailed == 1 ]; then | 
 |         return | 
 |       fi | 
 |     done < "$svcfile" | 
 |     if [ "$TYPE" == "consoleproxy" ]; then | 
 |       vncport=8080 | 
 |       if [ -f /root/vncport ] | 
 |       then | 
 |         vncport=`cat /root/vncport` | 
 |         log_it "vncport read: ${vncport}" | 
 |       fi | 
 |       iptables -A INPUT -i eth2 -p tcp -m state --state NEW -m tcp --dport $vncport -j ACCEPT | 
 |     fi | 
 | } | 
 |  | 
 | cleanup_systemVM() { | 
 |   rm -rf $backupfolder | 
 |   mv "$newpath"cloud-scripts.tgz /usr/share/cloud/cloud-scripts.tgz | 
 |   rm -rf "$newpath""agent.zip" "$newpath""patch-sysvms.sh" | 
 |   if [ "$TYPE" != "consoleproxy" ] && [ "$TYPE" != "secstorage" ]; then | 
 |     rm -rf /usr/local/cloud/systemvm/ | 
 |   fi | 
 | } | 
 |  | 
 | patch_systemvm() { | 
 |   rm -rf /usr/local/cloud/systemvm | 
 |  | 
 |   echo "All" | unzip $newpath/agent.zip -d /usr/local/cloud/systemvm >> $logfile 2>&1 | 
 |   mkdir -p /usr/local/cloud/systemvm | 
 |   find /usr/local/cloud/systemvm/ -name \*.sh | xargs chmod 555 | 
 |  | 
 |   echo "Extracting cloud scripts" >> $logfile 2>&1 | 
 |   tar -xvf $newpath/cloud-scripts.tgz -C / >> $logfile 2>&1 | 
 |  | 
 |   if [ -f $backupfolder/conf/cloud.jks ]; then | 
 |     cp -r $backupfolder/conf/* /usr/local/cloud/systemvm/conf/ | 
 |     echo "Restored keystore file and certs using backup" >> $logfile 2>&1 | 
 |   fi | 
 |  | 
 |   # Import global cacerts into 'cloud' service's keystore | 
 |   keytool -importkeystore -srckeystore /etc/ssl/certs/java/cacerts -destkeystore /usr/local/cloud/systemvm/certs/realhostip.keystore -srcstorepass changeit -deststorepass vmops.com -noprompt || true | 
 |  | 
 |   update_checksum $newpath/cloud-scripts.tgz | 
 |  | 
 |   if [ -f /opt/cloud/bin/setup/patch.sh ];then | 
 |     . /opt/cloud/bin/setup/patch.sh && patch_system_vm | 
 |   fi | 
 |  | 
 |   if [ "$TYPE" == "consoleproxy" ] || [ "$TYPE" == "secstorage" ] || [[ "$TYPE" == *router ]]; then | 
 |     restart_services | 
 |   fi | 
 | } | 
 |  | 
 |  | 
 | backup_old_package | 
 | patch_systemvm | 
 | cleanup_systemVM | 
 |  | 
 | if [ $patchfailed == 0 ]; then | 
 |   echo "version:$(cat ${md5file}) " | 
 | fi | 
 |  | 
 | exit $patchfailed |