Guest User

Untitled

a guest
Jul 24th, 2015
465
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 7.40 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. #
  4. # hibiscusrest.sh
  5. #
  6. # Autor: Christian B. Caldarone
  7. #
  8. # https://www.xing.com/profile/ChristianB_Caldarone
  9. #
  10. # (C) 2015, Freie Software, GPLv2 only
  11. #
  12. # Beispiel-Script um per Linux/Bash Umsätze anhand Suchbegriff über REST abzufragen und weiterzuverarbeiten.
  13. #
  14. # Benötigt:
  15. #
  16. # Jameica mit folgenden Plugins: Hibiscus, jameica.webadmin, jameica.xmlrpc, hibiscus.xmlrpc
  17. #
  18. # http://www.willuhn.de/wiki/doku.php?id=develop:xmlrpc
  19. #
  20. #
  21. # Außerdem den leichtgewichtigen JSON Kommandozeilen-Prozessor jq (http://stedolan.github.io/jq/),
  22. # siehe weiter unten im Script bei "jq_bin" ...
  23. #
  24.  
  25. res1=$(date +%s.%N)
  26.  
  27. # Hier wird die IP Adresse des Jameica Server angegeben, es kann auch eine URL verwendet werden. Gegebenenfalls muss
  28. # auch der Port mit angegeben werden, falls nicht der Standard-Port 443 für https:// genutzt wird.
  29.  
  30. # jameica_server="192.168.1.1:8080"
  31. jameica_server="localhost:8080"
  32.  
  33.  
  34. # Dies ist das Jameica Master-Password, welches zum Verbinden zum Webinterface zwingend notwendig ist
  35.  
  36. master_pass="*** DEIN PW ***"
  37.  
  38.  
  39. # Dieses Script benötigt den jq JSON Kommandozeilen-Prozessor, erhältlich auf http://stedolan.github.io/jq/
  40. # oder eventuell auf über das Distributionsspezifische Software-Repository wie bei Ubuntu. Wenn jq im gleichen
  41. # Verzeichnis wie dieses Script liegt, dann ist ./ voranzustellen, andernfalls reicht jq. Der Parameter -r
  42. # sorgt dafür, dass der Wert ohne "" ausgeben wird.
  43.  
  44. # jq_bin="./jq -r"
  45. jq_bin="/usr/bin/jq -r"
  46.  
  47.  
  48. # Suchbegriff, d.h. alle Umsätze, die diesen Suchbegriff in irgendeinem der Felder enthalten, werden ausgegeben,
  49. # mit % als Suchbegriff werden alle vorhandenen Datensätze ausgegeben.
  50. #
  51. # Beispiele
  52. #
  53. # Alle Umsätze der Telekom: search_query="telekom"
  54. #
  55. # Suche nach einer konkreten Rechnungsnummer: search_query="2015070701111"
  56. #
  57. # Suche Anhand einer direkten Übergabe an dieses Script: search_query=$1 für ./hibiscusrest.sh 2015070701111
  58.  
  59. if [[ ! "$1" = "" ]]then
  60.  
  61.   search_query=$1
  62.  
  63. else
  64.  
  65.   search_query="2015" # Nur falls keine Suchanfrage übergeben wurde ...
  66.  
  67. fi
  68.  
  69.  
  70. # Welche Spalten sollen ausgegeben werden?
  71. # Vorhandene Spalten:
  72. # art betrag checksum customerref datum empfaenger_blz empfaenger_name gvcode id konto_id primanota saldo valuta zweck zweck2 zweck3
  73. keys_to_output=( art betrag checksum customerref datum empfaenger_blz empfaenger_name gvcode id konto_id primanota saldo valuta zweck zweck2 zweck3 )
  74.  
  75.  
  76. # Temporäre Datei erzeugen, in der später das Resultat der Abfrage der Datensätze im JSON Format gespeichert wird
  77.  
  78. hibiscus_json=$(mktemp --tmpdir hibiscus.umsatz.json.XXXXXXXXXX) || { echo "Fehler beim anlegen der Temp-Datei."exit 1}
  79.  
  80.  
  81. # Variable für die Anzahl der zurückgegebenen Datensätze mit 0 initialisieren
  82.  
  83. records_count=0
  84.  
  85. # Mit Hilfe von cURL zum Jameica Webinterface verbinden und über die REST API die Suchanfrage absetzten
  86.  
  87. curl -s -k -get "https://admin:$master_pass@$jameica_server/webadmin/rest/hibiscus/umsaetze/query/$search_query" >$hibiscus_json 2>&1
  88.  
  89.  
  90. # Rückgabewert auswerten, Fehler wird zum Beispiel erzeugt, wenn Webinterface nicht erreichbar, oder Passwort falsch
  91.  
  92. retval=$?
  93.  
  94. [[ $retval > 0 ]] && { echo "Fehler beim Abruf vom Jameica Webinterface"exit 1}
  95.  
  96.  
  97. # Nach erfolgreich abgesetzter Suchanfrage nun speichern ob bzw. wie viel Datensätze zurückgegeben wurden
  98.  
  99. records_count=$($jq_bin length $hibiscus_json)
  100.  
  101. # Rückgabewert auswerten, Fehler wird zum Beispiel erzeugt, wenn das Suchkriterium nicht den richtigen Syntax hat
  102.  
  103. retval=$?
  104.  
  105. [[ "$records_count" = "" ]] && { echo "Fehler beim Abruf der Daten"rm -f $hibiscus_jsonexit 1}
  106.  
  107.  
  108. # Auswerten ob Datensätze zurückgegeben wurden, und wenn nicht, Script beenden
  109.  
  110. [[ $records_count = 0 ]] && { echo "Abfrage ergab keine Treffer"rm -f $hibiscus_jsonexit 0}
  111.  
  112.  
  113. # Die Spalte "zweck3" ist sehr oft mehrzeilig und enthält ein/mehrere newline Zeichen/Strings "\n"
  114. # Diese werden entfernt, damit das Skript korrekt funktioniert!
  115. # NUR zweck3 values bearbeiten -> sed -i 's/\(\"zweck3": \+"[^"]*\)\b\\n/\1 /g' $hibiscus_json
  116. # Komplett alle values nach \n-Vorkommen durchsuchen und ersetzen
  117. sed -i 's/\\n/ /g' $hibiscus_json   # to replace newline STRINGS in json values with a space
  118.  
  119. # (optional) Konvertiere zu UTF-8, damit in der Ausgabe im Terminal keine unschönen Zeichen ausgegeben werden
  120. iconv --from-code=ISO-8859-1 --to-code=UTF-8 -o "$hibiscus_json.new" "$hibiscus_json" &&
  121. mv -f "$hibiscus_json.new" "$hibiscus_json"
  122.  
  123.  
  124. # Nun mit Hilfe einer Funktion die Datensätze einem Multidimensionalen Array zuordnen.
  125. fillarray() {
  126.     # Welche Spalten sollen ausgegeben werden, siehe Zeile ~70
  127.     keys_to_output=$3
  128.     # Gesamtanzahl Spalten
  129.     keys_to_output_count=${#keys_to_output[*]}
  130.     # Spaltennamen für jq-Aufruf aufbereiten
  131.     keys_seperated_by_commas=$(IFS=, ; echo "${keys_to_output[*]}")
  132.  
  133.     # $2 is current length of the array
  134.     # i=$2
  135.     let i=$2+1
  136.     j=0
  137.     k=0
  138.  
  139.     while IFSread -r entry; do
  140.       read ${1}"[$j$k]" <<< "$entry"
  141.       ((k++))
  142.       if (( i % keys_to_output_count == 0 ))
  143.         then
  144.           ((j++))
  145.           k=0
  146.       fi
  147.       ((i++))
  148.     done < <(jq -r '.[] | { '"$keys_seperated_by_commas"' } | to_entries | map("\(.value)") | .[]' "$4")
  149. }
  150.  
  151. declare -A buckets
  152. fillarray buckets ${#buckets[@]} "$keys_to_output" "$hibiscus_json"
  153.  
  154.  
  155. # Nun zu Demonstrationszwecken die einzelnen Werte aller Datensätze ausgeben. Im Prinzip lassen sich alle Daten
  156. # mit diesem Script beliebig weiterverarbeiten, z.B. um sie in ein anderes Format umzuwandeln oder für die
  157. # Erstellung einer Schnittstelle zu einem Buchhaltungsprogramm.
  158.  
  159. line='...................'
  160. datensatznr_headline='Datensatz Nr.'
  161. for ((i=0; i < records_count; i++))do
  162.   let nr=$i+1
  163.   printf "%s %s %s\n" "${datensatznr_headline^^}" "${line:${#datensatznr_headline}}" "$nr"
  164.   for ((k=0; k < keys_to_output_count; k++))do
  165.     printf "%s %s %s\n" "${keys_to_output[$k]^^}" "${line:${#keys_to_output[$k]}}" "${buckets[${i}$k]}"
  166.   done
  167.   echo
  168. done
  169.  
  170. res2=$(date +%s.%N)
  171.  
  172. line='                         '
  173. anzahl_treffer_headline='Anzahl gefundener Umsätze:'
  174. scriptlaufzeit_headline='Script-Laufzeit:'
  175. printf "%s %s %s\n" "$anzahl_treffer_headline" "${line:${#anzahl_treffer_headline}}" "$records_count"
  176. printf "%s %s %s\n" "$scriptlaufzeit_headline" "${line:${#scriptlaufzeit_headline}}" $(LANG=C printf '%3.2f\n' $( echo "($res2 - $res1)" | bc )) Sekunden"
  177.  
  178.  
  179. # Zuvor angelegte temporäre Datei zur Zwichenspeicherung der JSON Daten wieder löschen
  180.  
  181. rm -f $hibiscus_json
  182.  
  183.  
  184. # Wir verabschieden uns, und wünschen noch einen schönen Tag
  185.  
  186. exit 0
Advertisement
Add Comment
Please, Sign In to add comment