Veröffentlicht am | Aktualisiert am

Skripte & oneLiner

Wenn man in Linux auf der Kommandozeile unterwegs ist, hat man oftmals immer wieder mal „Spezialaufgaben“ umzusetzen. Zum Glück geht das mit den Möglichkeiten einer Shell in Linux auf vielfältiger Weise. Ich bevorzuge da eindeutig die Bash, auch wenn der Benutzer der SAP-Anwendung in der Regel eine csh als Standardshell bekommt.

Hier möchte ich ein paar „oneliner“ vorstellen, die man für die ein oder andere Aufgabe einsetzen kann. Der Begriff „oneliner“ bedeutet, dass ich prinzipiell nur ein Kommando absetzen muss. Das nehme ich im folgenden aber nicht so genau, und vor allem für die Lesbarkeit werden stellenweise mehr als eine Zeile verwendet.

SAP Hostagent mit HTTPS konfigurieren

Mit den folgenden Kommandos kann der SAP Hostagent mit HTTPS konfiguriert werden. Mittlerweile hat der SAP Hostagent eine SSL Autokonfiguration, daher muss man prüfen ob man diese ggf. vorher löschen sollte.

sudo if test ! -d /usr/sap/hostctrl/exe/sec/; then sudo mkdir /usr/sap/hostctrl/exe/sec/; else echo "Achtung das Zielverzeichnis existiert bereits!" && pause; fi
export SECUDIR=/usr/sap/hostctrl/exe/sec/
export PATH=$PATH:/usr/sap/hostctrl/exe
sudo env PATH=$PATH SECUDIR=$SECUDIR rm -rf $SECUDIR/SAPSSLS.pse
# History ausschalten, damit das Kennwort nicht darin auftaucht
set +o history

# Kennwort austauschen beim Parameter -x!
sudo env PATH=$PATH SECUDIR=$SECUDIR sapgenpse gen_pse -p SAPSSLS \
-r /usr/sap/hostctrl/$(hostname).req -x “Sicheres Kennwort” \
-k GN-dNSName:$(hostname -f) -k GN-dNSName:$HOSTNAME \
"DNS=$(hostname), CN=$(hostname), O=SAP Basis, C=DE"
sudo env PATH=$PATH SECUDIR=$SECUDIR sapgenpse seclogin -p SAPSSLS -O sapadm
sudo env SECUDIR=$SECUDIR chown -R sapadm:sapsys $SECUDIR
sudo env SECUDIR=$SECUDIR chmod 640 $SECUDIR/cred_v2
sudo cat /usr/sap/hostctrl/$(hostname).req

# Manuelle Erstellung des Zertifikats und Bereitstellung des Zertifikats in /tmp 
sudo env PATH=$PATH SECUDIR=$SECUDIR sapgenpse import_own_cert -c /tmp/certnew.p7b -p SAPSSLS
sudo /usr/sap/hostctrl/exe/saphostexec -restart
sudo rm -f /tmp/certnew.p7b
set -o history

HANA Datenbank installieren

Die Besonderheit ist hier, dass die Installation unter einem logischen Hostnamen erfolgt. Dabei ist die Voraussetzung, dass der physische Hostname z. B. hostname01 ist und der logische Hostname hostname02.

Die SID der Datenbank besteht aus D (= Database) und einer Nummer. In diesem Beispiel D00. Diese Nummer wird dann auch als Instanznummer verwendet.

Im Downloads Verzeichnis muss die SAPCAR und das Installationsfile für den HANA Datenbank Server liegen.

# Parameter setzen
DOWNLOADS=/install/HANADB/
INSTHOST=${HOSTNAME:0:7}$(printf %02d $(echo $((10#${HOSTNAME: -3} + 10#01))))
SID=D00
set +o history
DB_KENNWORT=”Ein sicheres Kennwort“
set -o history

cd ${DOWNLOADS}
if test -d ${DOWNLOADS}/HANAEXT; then rm -rf ${DOWNLOADS}/HANAEXT; fi
# IMDB_SERVER*SAR entpacken
${DOWNLOADS}/SAPCAR -x -manifest SIGNATURE.SMF -f "HANADB/IMDB_*SAR" -R ${DOWNLOADS}/HANAEXT
# Ein Template erstellen und das Kennwort einfügen. Dieses Kennwort wird für alle Benutzer und als Masterkennwort verwendet
sudo ${DOWNLOADS}/HANAEXT/SAP_HANA_DATABASE/hdblcm --action=install --dump_configfile_template=${DOWNLOADS}/HDB_install.cfg
sudo cp ${DOWNLOADS}/HDB_install.cfg.xml ${DOWNLOADS}/HDB_install.pwd.xml
sudo sed  -i "s/\*\*\*/${DB_KENNWORT}/g" ${DOWNLOADS}/HDB_install.pwd.xml
sudo chmod 600 HDB_install.*
 
sudo cat ${DOWNLOADS}/HDB_install.pwd.xml | sudo ${DOWNLOADS}/HANAEXT/SAP_HANA_DATABASE/hdblcm \
--read_password_from_stdin=xml  \
--sid=${SID} --number=${SID: -2} --userid=33${SID: -2} \
--hostname=${HOSTNAME:0:7}$(printf %02d $(echo $((10#${HOSTNAME: -3} + 10#01)))) \
--autostart=off --system_usage=development --batch

HANA-DB deinstallieren

## Deinstall ##
SID=D00
sudo /hana/shared/${SID}/hdblcm/hdblcm --uninstall --batch

Stack.xml auf anderes System anpassen

Ja, für ein SAP Update wird der Maintenance Planner verwendet, alle Systeme werden über einen Track in eine Stack.xml Datei aufgenommen, die dann der SUM verwenden kann.

Soweit die Theorie. Manchmal hat man dann doch die Stack.xml für ein System konfiguriert und möchte (oder kann) keine neue Stack.xml für alle SAP-Systeme erstellen. Dann muss die Stack.xml von Hand angepasst werden.

# SAP System Identifier Old / New
OSID=
NSID=
# ASCS Instance Number
OASCSNR=
NASCSNR=
# Dialog Instance Number
ODINR=
NDINR=
# SAP Hostname
OSAPHOST=
NSAPHOST=
sed -e "/>${OSID}</>${NSID}</g" -e "/>${OASCSNR}</>${NASCSNR}</g" -e "/>${ODINR}</>${DINR}</g"  -e "/>${OSAPHOST}</>${NSAPHOST}</g" "MP_Stack*.xml" > MP_Stack_${NSID}.xml

Logfiles suchen und zippen

Dateien suchen, die nicht älter als 2h sind, suchen und zippen.

LOGDIR=./server?/log
find ${LOGDIR} -mmin -120 -print | zip /tmp/Serverlogs_$(date +'%F') -@ 

Größe von Logfiles zählen

Die Frage bei diesem Kommando ist, wie groß sind die Logfiles, die innerhalb einer bestimmten Zeit (hier 24h) erzeugt worden.

SAPDB=$(grep HDB /usr/sap/sapservices | awk -F/ '{print $4}')
ZEIT=1440
find /sysbackup/${SAPDB}/log/ -type f -mmin -${ZEIT}  -printf '%s\n' | awk '{ T += $1 } END { print T/1024/1024/1024,"GB"}'

sybase Logbereich überwachen

Das folgende Skript ist entstanden, da der Logbereich einer sybase Datenbank sporadisch auf 100 % Anstieg und die Datenbank und damit das SAP Java System stand.

Per E-Mail soll dieses Skript bei einem definierten Schwellenwert warnen. Man könnte hier auch einen automatisierten Flush einbauen.

Auszug:

...
# Aktuellen freien Speicher ermitteln
PERCFREE=$(tail -n 1 "${DATALOGPATH}/${DATALOGFILE}" | awk '{print $7}')

# Fehlerbehandlung wenn ein kritischer Wert überschritten wurde
# floating is a mess mit der Bash. Wir verwenden daher bc
if (( $(echo "${PERCFREE} >= ${PERCCRIT}" | bc) ));
then
  echo "Kritischer Bereich ${CPERCRIT} nicht erreicht. ${PERCFREE} pages free." >> /tmp/sybtest.txt

else

cat <(printf "ACHTUNG!\nDer Logbereich der sybase Datenbank auf ${HOSTNAME} läuft in einen kritischen Bereich. Es sind nur noch ${PERCFREE} % pages des ${DB} Logbereiches frei. \
		\n\n---------- Logdatei ${DATALOGPATH}/${DATALOGFILE} ----------\n")  \
	<(head -n 30 "${DATALOGPATH}/${DATALOGFILE}") <(printf "\n...\n\n") <(tail -n 24 "${DATALOGPATH}/${DATALOGFILE}") \
	<(printf "\n\n\n---------- Logdatei /sybase/${DB}/ASE-16_0/install/${DB}.log ----------\n...\n") <(tail -n 30 "/sybase/${DB}/ASE-16_0/install/${DB}.log") \
	<(printf "\n---------- Ende der Logdatei ----------\n\n\n-- \nMit freundlichen Grüßen\n\nDas SAP-Basis Team")   \
	| mailx -r ${EMAIL_SENDER} -s "Kritscher DB Zustand auf ${HOSTNAME}" ${EMAIL_EMPFAENGER}

fi

Alle SAP-Systeme eines Servers herunterfahren

Hier die reine Print Version

awk -F'/' '/^[^#].*\/[A-Z]{3,4}[0-9]{2}/ {print $4,$5, substr($5, length($5) -1) }' /usr/sap/sapservices | sort -u -k1,2 | awk -F' ' '{print "source /home/"tolower($1)"adm/.sapenv.sh;", "sapcontrol -nr", $3, "-function StopSystem ALL; sleep 60"}'

SAP Cloud Connector automatisch aktualisieren

Das folgende Skript aktualisiert den SAP Cloud Connector automatisch auf den Entwicklungs- und Testsystemen. Anschließend wird eine E-Mail an einen definierten Verteilerkreis versendet. Das Produktivsystem wird manuell aktualisiert.

Auszug:

...

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

...

Beitrag kommentieren

Bitte verfasse einen Kommentar.

Dein Kommentar wird vor der Freischaltung von einem Admin moderiert.