#!/bin/bash # -------------------------------------- # # Hinweis zum Testen des Skripts # # -------------------------------------- # # zum Testen des Skripts, folgendes anpassen: # 1) Konfiguration der E-Mail-Empfänger: EMAIL_VERTEILER -> nur Empfänger angeben, die die E-Mail zum Test bekommen sollen # 2) nach "# Installation durchführen" suchen und die folgenden 5 Zeilen auskommentieren # todo: Parameter zum Testen im Skript einführen, der diese Änderungen automatisch umsetzt # -------------------------------------- # # Hinweis zum Anpassen der Konfiguration # # -------------------------------------- # # alle Parameter, die ggf. konfiguriert werden müssen bzw. können: Suche nach "# Konfiguration" # -------------------------------------- # # Einplanung (DEV, TEST) / Aufruf (PROD) # # -------------------------------------- # # DEV, TEST: # Einplanung per Crontab # PROD: # Einplanung per Crontab, um Versionen herunterzuladen und zu speichern, aber ohne Update-Durchführung # manueller Aufruf, um Update durchzuführen: # --> ./scripts/scc_update.sh prod_update # ------------------------- # # grundlegende Definitionen # # ------------------------- # # Konfiguration Hostnamen: DEVSYS="" TESTSYS1="" TESTSYS2="" PRODSYS1="" PRODSYS2="" # Konfiguration Speicherort Logfiles: LOGPATH="/tmp" LOGFILE="SCC_Update_$(date +%F_%H%M)" # Konfiguration Speicherort Versions-Archiv (PROD): VERSIONPATH="/opt/scc_versions" EPOCHTIME=$(date '+%s') # Logging exec 3>&1 4>&2 trap 'exec 2>&4 1>&3' 0 1 2 3 exec 1>>"${LOGPATH}/${LOGFILE}.log" 2>&1 if [[ $HOSTNAME = "$DEVSYS" ]] then SYSTYPE="DEV" # Konfiguration Anzahl der Tage, um die die Installation in dem System verzoegert werden soll: DELAY=0 # Konfiguration Zusatz-E-Mail-Text: EMAIL_TEXT_ADD="Das Test-System des SAP Cloud Connectors wird automatisch in 14 Tagen aktualisiert." #zusätzliche E-Mail-Informationen für speziellen SYSTYPE elif [[ $HOSTNAME = "$TESTSYS1" ]] || [[ $HOSTNAME = "$TESTSYS2" ]] then SYSTYPE="TEST" PLANNED_VERSION=/tmp/.sapcc_planned_version CHECKFILE=/tmp/.sapcc_checkfile # Konfiguration Anzahl der Tage, um die die Installation in dem System verzoegert werden soll: DELAY=14 # Konfiguration Zusatz-E-Mail-Text: EMAIL_TEXT_ADD="Das produktive System des SAP Cloud Connectors wird manuell aktualisiert. Ein Termin dafuer wird per Auszeit kommuniziert." #zusätzliche E-Mail-Informationen für speziellen SYSTYPE elif [[ $HOSTNAME = "$PRODSYS1" ]] || [[ $HOSTNAME = "$PRODSYS2" ]] then SYSTYPE="PROD" # das produktive Update wird nur ausgeführt, wenn der Parameter "prod_update" und eine Version beim Skript-Aufruf übergegeben wurde # todo: prüfen, ob es sich syntaktisch um eine korrekte Version handelt if [[ $1 = 'prod_update' && $2 != '' ]] then EXECUTE_PROD_UPDATE=true PLANNED_VERSION=$2 else EXECUTE_PROD_UPDATE=false fi fi ####### # ------------------------- # # Definition der Funktionen # # ------------------------- # # fn_email_config() # # fn_cleanup() # # fn_check_new_version() # # fn_java_download() # # fn_update() # # fn_send_email() # # fn_end() # # ------------------------- # fn_email_config() { # Konfiguration E-Mail-Empfänger: # Beispiel empfaenger1@exampel.com,empfaenger2@exampel.com EMAIL_SENDER= EMAIL_VERTEILER= # Konfiguration E-Mail-Betreff: EMAIL_SUBJECT="SAP Cloud Connector auf ${HOSTNAME} (${SYSTYPE}) aktualisiert" # Konfiguration E-Mail-Text: EMAIL_TEXT="Guten Tag, \ \n\nauf dem Server ${HOSTNAME} (${SYSTYPE}) wurde der SAP Cloud Connector automatisiert von Version ${VERSION_NOW} auf die Version ${VERSION_DOWNLOAD} aktualisiert. \ \n\nDie Prozesse ... nutzen den SAP Cloud Connector und muessen auf Funktionsfaehigkeit getestet werden. \ \n\n${EMAIL_TEXT_ADD} \ \n\n-- \nMit freundlichen Gruessen\nDas SAP-Basis Team" } # End of function fn_cleanup() { if [[ ${SYSTYPE} == "PROD" ]] then # Installations- und Zip-files im Produktivsystem nur verschieben mv /tmp/tools.hana.ondemand.com/additional/*.rpm "${VERSIONPATH}" mv /tmp/tools.hana.ondemand.com/additional/*.zip "${VERSIONPATH}" else # sonst Installations- und Zip-files aufräumen rm /tmp/tools.hana.ondemand.com/additional/*.rpm rm /tmp/tools.hana.ondemand.com/additional/*.zip fi echo "Bereinige Log-Verzeichnis." find /tmp -name 'SCC_Update*' -mtime +20 -delete } # End of function fn_check_new_version() { # Download SCC echo -e "\033[1mDownload der aktuellsten SCC-Version.\033[0m" wget -q --header "Cookie: eula_3_1_agreed=tools.hana.ondemand.com/developer-license-3_1.txt" -r -l1 --no-parent -A 'sapcc-*linux-x64.zip' https://tools.hana.ondemand.com/ -P /tmp # installierte Version - zwei Ansaetze die Version zu finden # 1) größer als Version >=2.13 "scc.version=?.?.?" VERSION_NOW=$(grep '^scc.version=' /opt/sap/scc/version.properties | grep -oE '[0-9]{1,2}\..*') if [ $? -ne 0 ]; then # 2) vor Version <2.13 "version=?.?.?" VERSION_NOW=$(grep '^version=' /opt/sap/scc/version.properties | grep -oE '[0-9]{1,2}\..*') echo -e "Installierte Version: \033[1;32m${VERSION_NOW} \033[0m" else echo -e "Installierte Version: \033[1;32m${VERSION_NOW} \033[0m" fi # heruntergeladene Version VERSION_DOWNLOAD=$(echo /tmp/tools.hana.ondemand.com/additional/sapcc* | grep -oE '([0-9]{1,2}\.?){4}') echo -e "Heruntergeladene Version: \033[1;32m${VERSION_DOWNLOAD} \033[0m\n" # Prüfung, ob neue Version vorhanden oder aktuellste schon installiert -> wenn keine neue Version, dann grün angezeigt if [[ "${VERSION_DOWNLOAD}" = "${VERSION_NOW}" ]]; then echo -e "\033[36mKein Update notwendig! \033[0m" fn_end fi case ${SYSTYPE} in TEST) # Prüfung, ob die heruntergeladene mit der geplanten Version übereinstimmt und nicht zwischenzeitlich noch eine neuere Version zur Verfügung steht if [[ -f "${PLANNED_VERSION}" ]] then PLANVERSION=$(head -n 1 ${PLANNED_VERSION}) if [[ "${VERSION_DOWNLOAD}" > "${PLANVERSION}" ]] then # Im Test-System dann nochmal warten echo -e "\033[36mBisher geplante Version ${PLANVERSION}. Neue Version ${VERSION_DOWNLOAD} wurde gefunden, aber der Systemtyp ist ${SYSTYPE}. Die Installation wird um ${DELAY} Tage verzoegert. \033[0m" echo ${VERSION_DOWNLOAD} > ${PLANNED_VERSION} echo ${EPOCHTIME} > ${CHECKFILE} fn_end fi else echo ${VERSION_DOWNLOAD} > ${PLANNED_VERSION} fi ;; PROD) # Prüfung, ob die heruntergeladene mit der geplanten Version übereinstimmt und nicht zwischenzeitlich noch eine neuere Version zur Verfügung steht # und ob wirklich installiert werden soll if [[ ( "${VERSION_DOWNLOAD}" > "${PLANNED_VERSION}" ) && ${EXECUTE_PROD_UPDATE} == true ]] then # Im Produktivsystem dann auf das verschobene Installationsfile zurückgreifen # aktuell heruntergeladenes Installationsfile verschieben mv /tmp/tools.hana.ondemand.com/additional/*.zip "${VERSIONPATH}" # Installationsfile zur geplanten Version wiederherstellen if [[ -f "/tmp/tools.hana.ondemand.com/scc_versions/sapcc-${PLANNED_VERSION}-linux-x64.zip" ]] then cp ${VERSIONPATH}/sapcc-${PLANNED_VERSION}-linux-x64.zip /tmp/tools.hana.ondemand.com/additional/ else echo "Die geplante Version ist nicht verfuegbar und muss manuell unter '/tmp/tools.hana.ondemand.com/additional' zur Verfuegung gestellt werden." fn_end fi fi ;; esac } # End of function fn_java_download() { # SAP JVM zusätzlich herunterladen echo -e "\033[1mDownload der aktuellsten JVM-Version.\033[0m" wget -q --header "Cookie: eula_3_1_agreed=tools.hana.ondemand.com/developer-license-3_1.txt" -r -l1 --no-parent -A 'sapjvm-8.1.*linux-x64.rpm' https://tools.hana.ondemand.com/ -P /tmp } # End of function fn_update() { # Service vom Cloud Connector ausgeben echo "Status des Dienstes scc_daemon vor Update: " systemctl status scc_daemon | grep Active # SAP JVM zusätzlich herunterladen fn_java_download # Installationsfiles entpacken echo "Entpacke Archiv." unzip /tmp/tools.hana.ondemand.com/additional/*.zip -d /tmp/tools.hana.ondemand.com/additional # Sicherung der Konfiguration echo "Sichere Konfiguration nach /data/scc_save_$(date '+%F') ." cp -r /opt/sap/scc /data/scc_save_$(date '+%F') # Installation durchführen echo -e "\033[1mStarte Update.\033[0m" sudo systemctl stop scc_daemon sudo rpm -U /tmp/tools.hana.ondemand.com/additional/sapjvm-*-linux-x64.rpm sudo rpm -U /tmp/tools.hana.ondemand.com/additional/com.sap.scc-ui-*.x86_64.rpm sudo systemctl restart scc_daemon # Checkfiles im Testsystem zurücksetzen if [[ ${SYSTYPE} == "TEST" ]] then echo "Setze Checkfile und geplante Version zurueck" rm ${CHECKFILE} rm ${PLANNED_VERSION} fi # Status ausgeben echo "Status des Dienstes scc_daemon nach Update: " systemctl status scc_daemon | grep Active } # End of function fn_send_email() { fn_email_config echo -e "\033[1mVersende Info-Mail.\033[0m" echo -e ${EMAIL_TEXT} | mailx -r "${EMAIL_SENDER}" -s "${EMAIL_SUBJECT}" "${EMAIL_VERTEILER}" } # End of function fn_end() { # runtime: date at end echo "Endzeit: " & date ENDTIME=$(date +%s) # runtime RUNTIME=$((${ENDTIME} - ${EPOCHTIME})) echo "Laufzeit: $RUNTIME Sekunden" exit 0 } # End of function # --------------------------- # # Start der Skript-Ausführung # # --------------------------- # # runtime: date at start echo "Startzeit: " & date # alte Downloads und Log-Dateien aufräumen fn_cleanup # auf neue Version prüfen fn_check_new_version # Update ggf. durchführen if [[ "${VERSION_DOWNLOAD}" != "${VERSION_NOW}" ]]; then case ${SYSTYPE} in DEV) # Wenn Systemtyp DEV ist, sofort installieren echo -e "\033[36mNeue Version ${VERSION_DOWNLOAD} wurde gefunden und wird jetzt installiert. \033[0m" fn_update fn_send_email fn_end ;; TEST) # Wenn der Systemtyp TEST ist, soll die Installation verzögert werden. # z. B. TEST = (DEV + 14) # Prüfung, ob bereits vorher eine neue Version heruntergeladen und eingeplant wurde -> Checkfile müsste vorhanden sein if [[ -f ${CHECKFILE} ]] then CHECKTIME=$(head -n 1 ${CHECKFILE}) DIFFTIME=$(( ( ${EPOCHTIME} - ${CHECKTIME} ) / 86400 )) echo -e "CHECKTIME = ${CHECKTIME}\nEPOCHTIME = ${EPOCHTIME}\n DIFFTIME = $DIFFTIME" # Ist die gewünschte zeitliche Verzoegerung erreicht? if (( ${DIFFTIME} >= ${DELAY} )) then echo -e "\033[36mNeue Version ${VERSION_DOWNLOAD} wird jetzt installiert. \033[0m" fn_update fn_send_email fn_end else echo -e "\033[36mNeue Version ${VERSION_DOWNLOAD} wird in $(( ${DELAY} - ${DIFFTIME} )) Tage(n) installiert. \033[0m" fn_end fi else # Es kann eigentlich nur das Checkfile noch nicht existieren, da die neue Version das erste mal heruntergeladen wurde echo -e "\033[36mNeue Version ${VERSION_DOWNLOAD} wurde gefunden, aber der Systemtyp ist ${SYSTYPE}. Die Installation wird um ${DELAY} Tage verzoegert. \033[0m" echo ${EPOCHTIME} > ${CHECKFILE} fn_end fi ;; PROD) # Wenn der Systemtyp PROD ist, soll die Installation nur bei Übergabe des Parameters 'prod_update' gestartet werden, sonst keine Installation if [[ ${EXECUTE_PROD_UPDATE} == true ]] then echo -e "\033[36mNeue Version ${VERSION_DOWNLOAD} wird jetzt installiert. \033[0m" fn_update fn_send_email fn_end else fn_end fi ;; esac fi