#!/bin/bash ############################################################################################################################## ######################## Bestimmen aller Verfügbaren ID´s #################################################################### ############################################################################################################################## # Damit werden alle Patch Policys gelesen. # Die ID´s können dann über die Schreife gelesen und in eine Excel übergeben. # ++++ curl -X GET "https://macenterprise.jamfcloud.com/JSSResource/patchsoftwaretitles" -H "accept: application/xml" # Nach ausführung des Befehls wird das folgende Ergebniss ausgegeben: # # # 14 <-- Gesamtanzahl aller Patch Policys # # 0BC # 1 # Google Chrome <-- Name der Patch Policy # 5 <-- ID für Google Chrome # # # 0A6 # 1 # Microsoft Word 365 # 8 # # # 09C # 1 # Microsoft Excel 365 # 9 # # # JamfProtect # 1 # Jamf Protect # 10 ############################################################################################################################## ######################## verarbeiten der ID´s ############################################################################### ############################################################################################################################## ############################################################################################################################## # Nachdem die ID´s bekannt sind, werde die dann für den Report verarbeitet.Hier das Beispiel der ersten Policy "Google Chrome" # die ID ist hier "5" # ++++ curl -X GET "https://macenterprise.jamfcloud.com/JSSResource/patchreports/patchsoftwaretitleid/5" -H "accept: application/xml" # Nach ausführung des Befehls wird das folgende Ergebniss ausgegeben: ########## Ergebnis, wo auch ein Gerät nicht die aktuelle Version hat # # # Google Chrome # 5 # 2 <-- Wieviele Geräte sind in der Überwachung # 270 # # # 95.0.4638.69 # # 1 <-- Geräte, auf denen die letzte Version instaliert ist # # 7 # MacBook Pro M1 Peter # # # # # 95.0.4638.54 # # 1 # # 20 # MacBook Pro von Andreas # Es müssen lediglich beiden Zahlen miteinander verglichen werden. # D.h. Die 2 # Abzüglich der Geräte die aktuell sind - # 95.0.4638.69 # 1 # -------------------------------- # Geräte noch zu patchen = 1 # Nach ausführung des Befehls wird das folgende Ergebniss ausgegeben: ########## Ergebnis, wo alle Geräte aktuell sind # # # Google Chrome # 5 # 2 <-- Wieviele Geräte sind in der Überwachung # 270 # # # 95.0.4638.69 # # 2 <-- Geräte, auf denen die letzte Version instaliert ist # # 7 # MacBook Pro M1 Peter # # # 20 # MacBook Pro von Andreas # # # # # 95.0.4638.54 # # 0 # Es müssen lediglich beiden Zahlen miteinander verglichen werden. # D.h. Die 2 # Abzüglich der Geräte die aktuell sind - # 95.0.4638.69 # 2 # -------------------------------- # Geräte noch zu patchen = 0 ############################################################################################################################## ######################## übergabe der Ergebnisse in eine Datei ############################################################### ############################################################################################################################## ############################################################################################################################## # Diese Zahlen müssen dann übergeben werden in eine Excel Tabelle. # z.B. # Titel Alle Geräte aktuell noch zu patchen # Google Chrome 2 2 differenz total zu size # Es kann auch eine übergabe erfolgen, dass alle ergebnisse, die nicht 0 sind aufgelistet werden. # würde jedoch kein einhaltliches Bild der Datei darstellen. Für ein einheitliches Bild der Datei muss kommt also nur die obere Darstellung. # Problem ist hier jedoch, dass nicht alle vom Kunden eingesetzten Titel über das Jamf Pro eingesetzte Patch Management abgebildet werden. # Hierzu ist es dann notwendig, dass ein eigenes repository aufgebaut werden muss. # Grundsätzlich ist es auch möglich, dass der Jamf Pro über den TitelEditor eine weitere Quelle bereitsstellen kann. # https://docs.jamf.com/de/title-editor/documentation/Release_History.html # Da auch hier die Möglichkeit besteht über die API zuzugreifen, kann Auto PKG warscheinlich die Pflege der Datei zu übernehmen. # Hierzu sollte es dann wi folgt aufgebaut sein: # 1. AutoPKG Prüft auf Updates # 2. Wenn Update verfügbar, dann download. # 3. Diese information, wenn verfügbar dann download, sollte nutzdar sein, dass daraus über API die Versionsnummer aktuallisiert wird. ############################################################################################################################## ######################## Test der Skripts #################################################################################### ############################################################################################################################## ############################################################################################################################## #****************************************************************************************************************************# ######################################################################################### # Shellscript : Skript zur Erstellung eines Patch Reports aller Apps # Autor : Andreas Vogel, nextenterprise gmbh ######################################################################################### #set -x ######################################################################################### ########################## Server Informations ########################################## JSSURL="https://macenterprise.jamfcloud.com" if [[ $JSSURL = "" ]]; then echo "ERROR URL variable is empty" exit 1 fi # Credentials base64 Credentials=$(echo "QVBJX1VzZXI6TmV4dGVudGVycHJpc2UjMTYxMgo=" | base64 --decode) if [[ $Credentials = "" ]]; then echo "ERROR no Credentials" exit 1 fi ########################## Varialen ##################################################### TIME=$(/bin/date +"%d.%m.%Y") Patch_Report="$HOME/Desktop/Patch_Report_List${TIME}.csv" ########################## Creating the report ######################################### IDs+=($(curl -u $Credentials --tlsv1.2 -H "Accept: application/xml" "$JSSURL/JSSResource/patchsoftwaretitles" | xmllint --format - | awk -F'>|<' '//{print $3}' | sort -n)) echo "Policy ID,Patch Policy Name,All Clients,latest version installed" >> "$Patch_Report" set -x for id in "${IDs[@]}"; do Titel=$(curl -u $Credentials --tlsv1.2 -H "Accept: application/xml" "$JSSURL/JSSResource/patchreports/patchsoftwaretitleid/$id" | xmllint --xpath '/patch_report/name/text()' - ) all_clients=$(curl -u $Credentials --tlsv1.2 -H "Accept: application/xml" "$JSSURL/JSSResource/patchreports/patchsoftwaretitleid/$id" | xmllint --xpath '/patch_report/total_computers/text()' - ) Version=$(curl -u $Credentials --tlsv1.2 -H "Accept: application/xml" "$JSSURL/JSSResource/patchreports/patchsoftwaretitleid/$id" | xmllint --xpath '/patch_report/versions/versions/software_version/text()' - ) aktuell=$(curl -u $Credentials --tlsv1.2 -H "Accept: application/xml" "$JSSURL/JSSResource/patchreports/patchsoftwaretitleid/$id" | xmllint --xpath '/patch_report/versions/version/computers/size/text()' - ) if [[ $aktuell != 0 ]] then aktuell_1=$aktuell else aktuell_1="" fi echo "$id,$Titel,$all_clients,$Version,$aktuell_1" >> "$Patch_Report" done echo " " >> "$Patch_Report" echo " " >> "$Patch_Report" echo " " >> "$Patch_Report" echo "Automatically generated patch report on ${TIME}." >> "$Patch_Report" echo "This report was created automatically." >> "$Patch_Report" exit 0