Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/bin/bash
- #
- # hibiscusrest.sh
- #
- # Autor: Christian B. Caldarone
- #
- # https://www.xing.com/profile/ChristianB_Caldarone
- #
- # (C) 2015, Freie Software, GPLv2 only
- #
- # Beispiel-Script um per Linux/Bash Umsätze anhand Suchbegriff über REST abzufragen und weiterzuverarbeiten.
- #
- # Benötigt:
- #
- # Jameica mit folgenden Plugins: Hibiscus, jameica.webadmin, jameica.xmlrpc, hibiscus.xmlrpc
- #
- # http://www.willuhn.de/wiki/doku.php?id=develop:xmlrpc
- #
- #
- # Außerdem den leichtgewichtigen JSON Kommandozeilen-Prozessor jq (http://stedolan.github.io/jq/),
- # siehe weiter unten im Script bei "jq_bin" ...
- #
- res1=$(date +%s.%N)
- # Hier wird die IP Adresse des Jameica Server angegeben, es kann auch eine URL verwendet werden. Gegebenenfalls muss
- # auch der Port mit angegeben werden, falls nicht der Standard-Port 443 für https:// genutzt wird.
- # jameica_server="192.168.1.1:8080"
- jameica_server="localhost:8080"
- # Dies ist das Jameica Master-Password, welches zum Verbinden zum Webinterface zwingend notwendig ist
- master_pass="*** DEIN PW ***"
- # Dieses Script benötigt den jq JSON Kommandozeilen-Prozessor, erhältlich auf http://stedolan.github.io/jq/
- # oder eventuell auf über das Distributionsspezifische Software-Repository wie bei Ubuntu. Wenn jq im gleichen
- # Verzeichnis wie dieses Script liegt, dann ist ./ voranzustellen, andernfalls reicht jq. Der Parameter -r
- # sorgt dafür, dass der Wert ohne "" ausgeben wird.
- # jq_bin="./jq -r"
- jq_bin="/usr/bin/jq -r"
- # Suchbegriff, d.h. alle Umsätze, die diesen Suchbegriff in irgendeinem der Felder enthalten, werden ausgegeben,
- # mit % als Suchbegriff werden alle vorhandenen Datensätze ausgegeben.
- #
- # Beispiele
- #
- # Alle Umsätze der Telekom: search_query="telekom"
- #
- # Suche nach einer konkreten Rechnungsnummer: search_query="2015070701111"
- #
- # Suche Anhand einer direkten Übergabe an dieses Script: search_query=$1 für ./hibiscusrest.sh 2015070701111
- if [[ ! "$1" = "" ]]; then
- search_query=$1
- else
- search_query="2015" # Nur falls keine Suchanfrage übergeben wurde ...
- fi
- # Welche Spalten sollen ausgegeben werden?
- # Vorhandene Spalten:
- # art betrag checksum customerref datum empfaenger_blz empfaenger_name gvcode id konto_id primanota saldo valuta zweck zweck2 zweck3
- keys_to_output=( art betrag checksum customerref datum empfaenger_blz empfaenger_name gvcode id konto_id primanota saldo valuta zweck zweck2 zweck3 )
- # Temporäre Datei erzeugen, in der später das Resultat der Abfrage der Datensätze im JSON Format gespeichert wird
- hibiscus_json=$(mktemp --tmpdir hibiscus.umsatz.json.XXXXXXXXXX) || { echo "Fehler beim anlegen der Temp-Datei."; exit 1; }
- # Variable für die Anzahl der zurückgegebenen Datensätze mit 0 initialisieren
- records_count=0
- # Mit Hilfe von cURL zum Jameica Webinterface verbinden und über die REST API die Suchanfrage absetzten
- curl -s -k -get "https://admin:$master_pass@$jameica_server/webadmin/rest/hibiscus/umsaetze/query/$search_query" >$hibiscus_json 2>&1
- # Rückgabewert auswerten, Fehler wird zum Beispiel erzeugt, wenn Webinterface nicht erreichbar, oder Passwort falsch
- retval=$?
- [[ $retval > 0 ]] && { echo "Fehler beim Abruf vom Jameica Webinterface"; exit 1; }
- # Nach erfolgreich abgesetzter Suchanfrage nun speichern ob bzw. wie viel Datensätze zurückgegeben wurden
- records_count=$($jq_bin length $hibiscus_json)
- # Rückgabewert auswerten, Fehler wird zum Beispiel erzeugt, wenn das Suchkriterium nicht den richtigen Syntax hat
- retval=$?
- [[ "$records_count" = "" ]] && { echo "Fehler beim Abruf der Daten"; rm -f $hibiscus_json; exit 1; }
- # Auswerten ob Datensätze zurückgegeben wurden, und wenn nicht, Script beenden
- [[ $records_count = 0 ]] && { echo "Abfrage ergab keine Treffer"; rm -f $hibiscus_json; exit 0; }
- # Die Spalte "zweck3" ist sehr oft mehrzeilig und enthält ein/mehrere newline Zeichen/Strings "\n"
- # Diese werden entfernt, damit das Skript korrekt funktioniert!
- # NUR zweck3 values bearbeiten -> sed -i 's/\(\"zweck3": \+"[^"]*\)\b\\n/\1 /g' $hibiscus_json
- # Komplett alle values nach \n-Vorkommen durchsuchen und ersetzen
- sed -i 's/\\n/ /g' $hibiscus_json # to replace newline STRINGS in json values with a space
- # (optional) Konvertiere zu UTF-8, damit in der Ausgabe im Terminal keine unschönen Zeichen ausgegeben werden
- iconv --from-code=ISO-8859-1 --to-code=UTF-8 -o "$hibiscus_json.new" "$hibiscus_json" &&
- mv -f "$hibiscus_json.new" "$hibiscus_json"
- # Nun mit Hilfe einer Funktion die Datensätze einem Multidimensionalen Array zuordnen.
- fillarray() {
- # Welche Spalten sollen ausgegeben werden, siehe Zeile ~70
- keys_to_output=$3
- # Gesamtanzahl Spalten
- keys_to_output_count=${#keys_to_output[*]}
- # Spaltennamen für jq-Aufruf aufbereiten
- keys_seperated_by_commas=$(IFS=, ; echo "${keys_to_output[*]}")
- # $2 is current length of the array
- # i=$2
- let i=$2+1
- j=0
- k=0
- while IFS= read -r entry; do
- read ${1}"[$j, $k]" <<< "$entry"
- ((k++))
- if (( i % keys_to_output_count == 0 ))
- then
- ((j++))
- k=0
- fi
- ((i++))
- done < <(jq -r '.[] | { '"$keys_seperated_by_commas"' } | to_entries | map("\(.value)") | .[]' "$4")
- }
- declare -A buckets
- fillarray buckets ${#buckets[@]} "$keys_to_output" "$hibiscus_json"
- # Nun zu Demonstrationszwecken die einzelnen Werte aller Datensätze ausgeben. Im Prinzip lassen sich alle Daten
- # mit diesem Script beliebig weiterverarbeiten, z.B. um sie in ein anderes Format umzuwandeln oder für die
- # Erstellung einer Schnittstelle zu einem Buchhaltungsprogramm.
- line='...................'
- datensatznr_headline='Datensatz Nr.'
- for ((i=0; i < records_count; i++)); do
- let nr=$i+1
- printf "%s %s %s\n" "${datensatznr_headline^^}" "${line:${#datensatznr_headline}}" "$nr"
- for ((k=0; k < keys_to_output_count; k++)); do
- printf "%s %s %s\n" "${keys_to_output[$k]^^}" "${line:${#keys_to_output[$k]}}" "${buckets[${i}, $k]}"
- done
- echo
- done
- res2=$(date +%s.%N)
- line=' '
- anzahl_treffer_headline='Anzahl gefundener Umsätze:'
- scriptlaufzeit_headline='Script-Laufzeit:'
- printf "%s %s %s\n" "$anzahl_treffer_headline" "${line:${#anzahl_treffer_headline}}" "$records_count"
- printf "%s %s %s\n" "$scriptlaufzeit_headline" "${line:${#scriptlaufzeit_headline}}" " $(LANG=C printf '%3.2f\n' $( echo "($res2 - $res1)" | bc )) Sekunden"
- # Zuvor angelegte temporäre Datei zur Zwichenspeicherung der JSON Daten wieder löschen
- rm -f $hibiscus_json
- # Wir verabschieden uns, und wünschen noch einen schönen Tag
- exit 0
Advertisement
Add Comment
Please, Sign In to add comment