Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

...speichert Umsatz-Daten in einem Array zur Weiterverarbeitung

 
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

 · 
Gepostet: 16.07.2015 - 18:28 Uhr  ·  #1
Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Linux Bash Script nutzen

Hier ein kleines Script als Tutorial, wie sich die Jameica/Hibiscus REST Services, die über das Webinterface zur Verfügung gestellt werden, in einem Linux Bash Shell Script nutzen lassen.

Das Script kann natürlich auch gerne als Ausgangsbasis für eigene Experimente und Entwicklungen genutzt werden, denn letztendlich stellt es die über das REST Interface abgerufenen Umsatz-Datensätze in einem Array bereit.

Hierbei ist unerheblich, ob Jameica/Hibiscus selbst auf Linux oder Windows läuft, da das Script auf irgendeinem Rechner ausgeführt werden kann, Hauptsache der hat eine Verbindung zum Webinterface von Jameica/Hibiscus. Kommen wir nun zu den Voraussetzungen:

Jameica muss mit mindestens folgendem Setup, d.h. folgenden Plugins: Hibiscus, jameica.webadmin, jameica.xmlrpc, hibiscus.xmlrpc installiert sein. Eine Anleitung und Details gibt es direkt hier: http://www.willuhn.de/wiki/doku.php?id=develop:xmlrpc

Das war es auch schon fast. Jetzt gilt es eigentlich nur noch das Script mit der IP/URL des Jameica/Hibiscus Webinterface zu bestücken, das entsprechde Masterpasswort einzupflegen und los geht's.

Das Script kann dann mit z.B.:

./hibiscusrest.sh 2015070701111

aufrufen (wobei 2015070701111 eine fiktive Rechnungsnummer ist, die wohl keine Ergebnisse bringt und hier nur der Veranschaulichung dienen soll)

Würden wir mal annehmen, diese nur-einmal-vorkommende Rechnungsnummer existiert tatsächlich, so würde genau der zugehörige Umsatz-Datensatz in dem Array des Scriptes auftauchen, und könnte dan weiter verarbeitet werden. Das Script gibt diesen aktuell aber einfach nur wieder aus, aber ich denke es wird klar, dass man mit weiteren Schleifen nun jede Menge Möglichkeiten bekommt, die so gewonnenen Daten zu verarbeiten.

Der Aufruf

./hibiscusrest.sh aldi

würde z.B. dafür sorgen, dass man alle Umsatz-Datensätze im Array wiederfindet, bei denen man mit EC Karte bei Aldi bezahlt hat. Weil die Abfrage aber über alle Konten läuft, würden auch die Umsätze auftauchen, die z.B. in einem Bar-Geld (Kasse) Offline-Konto gespeichert sind und z.B. im Verwendungszweck "Beleg1: Aldi 16.07.2015" stehen haben.

Ruft man

./hibiscusrest.sh %

auf, so werden alle Umsätze ins Array geladen. Dies dauert mitunter eine Weile, warum steht in den Kommentaren im Script.

Dann hoffe ich mal, dass mein Beitrag dem ein Freude und neue Erkenntnisse bereitet. Also: Viel Spaß!

Vielleicht nimmt Olaf dieses Tutorial ja sogar mit in sein Wiki auf, denn dort habe ich bis jetzt nur Beispiele für Java und PHP gefunden.

Ich selbst habe es nicht getestet, aber ich mutmaße mal, dass sich das Script auch unter Windows mit Hilfe von Cygwin (https://www.cygwin.com/) nutzen lässt. Wichtig ist hierbei, dass man über das Cygwin Setup auch das Paket cURL installiert und man sich jq (http://stedolan.github.io/jq/download/) besorgt. Bei jq
weiß ich aber nicht, ober das extra für die Cygwin-Umgebung kompiliert werden muss, ober aber, ob man aus einem Bash Script, welches unter Cygwin ausgeführt wird, die Windows EXE von jq aufrufen kann ....

Jetzt aber genug geredet. Hier kommt das Script (ebenfalls auch als fertiger Download im Anhang). Wer den Code kopiert und selbst in eine Datei speichert: chmod +x hibiscusrest.sh nicht vergessen ;)

Code


#!/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" ...
#


# 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"


# Dies ist das Jameica Master-Password, welches zum Verbinden zum Webinterface zwingend notwendig ist

master_pass="passwort"


# 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"


# 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

# 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"; rm -f $hibiscus_json; 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; }


# Nun mit Hilfe einer Schleife die Datensätze einem Array zuordnen. Der erste Datensatz hat den Index 0!
#
# Die folgende Schleife ist bei Abfragen, die mehrere Datensätze verarbeiten, aber sehr langsam. Das
# Script soll hier nur auf eine einfache Art und Weise demonstrieren, wie sich die Daten handhaben lassen.
#
# Die schlechte Performance kommt vor allem deswegen zustande, weil jeder Wert immer direkt aus der geamten
# Datei ausgelesen wird, also für die jeden Datensatz 17 mal ein Lesezugriff erfolgt. Bei 200 Datensätzen
# sind dies also insgesamt 3400 Lesezugriffe. Für eine produktive Anwendung würde man die Datei / den
# Inhalt der Datei wohl eher in einer Variable oder in einem eigenen Array speichern. Für Abfragen die nur
# sehr wenige Datensätze zurückgeben, oder vielleicht sogar nur einen, wenn z.B. nach einer konkreten
# Rechnungsnummer gesucht wird, ist das aber so wie es ist völlig ausreichend.

index=0

until [[ $index = $records_count ]]
    

    do

      #$jq_bin "[$index]" $hibiscus_json

      umsatz_art[$index]=$($jq_bin .[$index].art $hibiscus_json)
      umsatz_betrag[$index]=$($jq_bin .[$index].betrag $hibiscus_json)
      umsatz_checksum[$index]=$($jq_bin .[$index].checksum $hibiscus_json)
      umsatz_customerref[$index]=$($jq_bin .[$index].customerref $hibiscus_json)
      umsatz_datum[$index]=$($jq_bin .[$index].datum $hibiscus_json)
      umsatz_empfaenger_blz[$index]=$($jq_bin .[$index].empfaenger_blz $hibiscus_json)
      umsatz_empfaenger_konto[$index]=$($jq_bin .[$index].empfaenger_konto $hibiscus_json)
      umsatz_empfaenger_name[$index]=$($jq_bin .[$index].empfaenger_name $hibiscus_json)
      umsatz_gvcode[$index]=$($jq_bin .[$index].gvcode $hibiscus_json)
      umsatz_id[$index]=$($jq_bin .[$index].id $hibiscus_json)
      umsatz_konto_id[$index]=$($jq_bin .[$index].konto_id $hibiscus_json)
      umsatz_primanota[$index]=$($jq_bin .[$index].primanota $hibiscus_json)
      umsatz_saldo[$index]=$($jq_bin .[$index].saldo $hibiscus_json)
      umsatz_valuta[$index]=$($jq_bin .[$index].valuta $hibiscus_json)
      umsatz_zweck[$index]=$($jq_bin .[$index].zweck $hibiscus_json)
      umsatz_zweck2[$index]=$($jq_bin .[$index].zweck2 $hibiscus_json)
      umsatz_zweck3[$index]=$($jq_bin .[$index].zweck3 $hibiscus_json)


      let index=$index+1


        done
 


# 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.

index=0

until [[ $index = $records_count ]]

  do

    echo "Datensatz Nr :" $index
    echo

    echo "Id (#)       :" ${umsatz_id[$index]}
    echo "Art          :" ${umsatz_art[$index]}

    echo "Datum        :" ${umsatz_datum[$index]}
    echo "Valuta       :" ${umsatz_valuta[$index]}

    echo "Empf. BLZ    :" ${umsatz_empfaenger_blz[$index]} 
    echo "Empf. Konto  :" ${umsatz_empfaenger_konto[$index]}
    echo "Empf. Name   :" ${umsatz_empfaenger_name[$index]}

    echo "Betrag       :" ${umsatz_betrag[$index]}
    
    echo "Kundenrefe.  :" ${umsatz_customerref[$index]}

    echo "Verw. Zweck1 :" ${umsatz_zweck[$index]}
    echo "Verw. Zweck2 :" ${umsatz_zweck2[$index]}
    echo "Verw. Zweck3 :" ${umsatz_zweck3[$index]}
  
    echo "Saldo        :" ${umsatz_saldo[$index]}

    echo "Ges. Vorfall :" ${umsatz_gvcode[$index]}
    
    echo "Primanota    :" ${umsatz_primanota[$index]}
    
    echo "Checksumme   :" ${umsatz_checksum[$index]}
    
    echo
    echo

    let index=$index+1


      done

# 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

Der an diesem Beitrag angefügte Anhang ist entweder nur im eingeloggten Zustand sichtbar oder die Berechtigung Deiner Benutzergruppe ist nicht ausreichend.
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

 · 
Gepostet: 17.07.2015 - 12:53 Uhr  ·  #2
Es sind natürlich auch noch weitere tolle Sachen möglich. Hier habe ich einige Beispiel in die Tat umgesetzt, die Olaf im Webinterface unter /webadmin/rest.html schon beschreibt. Die nachfolgenden Beispiele lassen sich allesamt auf der Linux Kommandozeile oder in einem Shell Script nutzen:


1. Die Version auf der Shell im JSON Format ausgeben

Code

curl -k -get "https://admin:masterpass@192.168.1.1:8080/webadmin/rest/system/version"


{
"builddate": "",
"buildnumber": "",
"version": "2.7.0-nightly"
}



2. Die Version auf der Shell ausgeben, wobei mit pipen durch "jq" nur die Versionsnummer selbst extrahiert wird

Code

curl -k -get "https://admin:masterpass@192.168.1.1:8080/webadmin/rest/system/version" | ./jq -r  .version


2.7.0-nightly



3. Die Version direkt in einer Variable speichern und dann mit dem echo Befehl ausgeben

Code

jameica_version=$(curl -k -get "https://admin:masterpass@192.168.1.1:8080/webadmin/rest/system/version" | ./jq -r  .version)

echo $jameica_version


2.7.0-nightly



4. Den (letzten) System-Status abfragen, der dann im JSON Format ausgegeben wird

Code

curl -k -get "https://admin:masterpass@192.168.1.1:8080/webadmin/rest/system/status"


{
"text": "Synchronisierung beendet",
"title": "OK",
"type": 0
}



5. Die Konfiguration abfragen, die dann ebenfalls im JSON Format ausgegeben wird

Code

curl -k -get "https://admin:masterpass@192.168.1.1:8080/webadmin/rest/system/config"


{
"backup": {
"count": 10,
"dir": "/home/hibiscus/.jameica",
"enabled": true
},
"dir": {
"config": "/home/hibiscus/.jameica/cfg",
"plugins": {
"config": [],
"system": "/srv/hibiscus-server/plugins",
"user": "/home/hibiscus/.jameica/plugins"
},
"work": "/home/hibiscus/.jameica"
},
"locale": "de_DE",
"log": {
"file": "/home/hibiscus/.jameica/jameica.log",
"level": "ERROR"
},
"proxy": {
"host": null,
"port": ""
},
"rmi": {
"clientauth": true,
"port": 4840,
"ssl": true
},
"service": {
"multicastlookup": true,
"shareservices": false
}
}
Benutzer
Avatar
Geschlecht:
Beiträge: 348
Dabei seit: 11 / 2003
Betreff:

Re: Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

 · 
Gepostet: 17.07.2015 - 13:59 Uhr  ·  #3
...ein weiteres kleines Schmankerl ;)

Habe das gleich mal versucht und bekomme folgendes angezeigt:
Code
./hibiscusrest.sh umbuchung
parse error: Invalid numeric literal at line 2, column 0
Fehler beim Abruf der Daten

Ich habe dann mal den curl Aufruf in der Konsole getestet, das liefert mir folgenden Fehler:
Code
# curl -s -k -get "https://admin:[[MEIN_PW]]@localhost:8080/webadmin/rest/hibiscus/umsaetze/query/umbuchung"
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"/>
<title>Error 500 no command found for REST url /hibiscus/umsaetze/query/baywa</title>
</head>
<body><h2>HTTP ERROR: 500</h2><pre>no command found for REST url /hibiscus/umsaetze/query/baywa</pre>
<p>RequestURI=/webadmin/rest/hibiscus/umsaetze/query/baywa</p><h3>Caused by:</h3><pre>java.io.IOException: no command found for REST url /hibiscus/umsaetze/query/baywa
        at de.willuhn.jameica.webadmin.server.RestServiceImpl.handleRequest(RestServiceImpl.java:160)
        at de.willuhn.jameica.webadmin.servlets.RestServlet.service(RestServlet.java:41)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
        at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:502)
        at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:363)
        at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
        at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
        at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:766)
        at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:417)
        at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
        at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
        at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
        at org.mortbay.jetty.Server.handle(Server.java:324)
        at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:534)
        at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:864)
        at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:533)
        at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:207)
        at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:403)
        at org.mortbay.jetty.bio.SocketConnector$Connection.run(SocketConnector.java:228)
        at org.mortbay.jetty.security.SslSocketConnector$SslConnection.run(SslSocketConnector.java:635)
        at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:522)
</pre>
<p><i><small><a href="http://jetty.mortbay.org/">Powered by Jetty://</a></small></i></p><br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                
<br/>                                                

</body>
</html>
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

 · 
Gepostet: 17.07.2015 - 14:15 Uhr  ·  #4
Benutzer
Avatar
Geschlecht:
Beiträge: 348
Dabei seit: 11 / 2003
Betreff:

Re: Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

 · 
Gepostet: 17.07.2015 - 14:27 Uhr  ·  #5
"UmsatzBean" taucht hier gar nicht auf... die Seite sieht hier so aus http://www.awesomescreenshot.c…da93edd87c

Ich hab NICHT den HibiscusServer installiert, sondern in der jameica GUI die Plugins nachinstalliert.
Geht das NUR mit dem HibiscusServer?

Ich habe mal anhand den Beispielen auf der rest.html Seite z.B. folgendes gestestet
Code
➜  curl -k --get "https://admin:[[MEIN_PW]@localhost:8080/webadmin/rest/plugins/hibiscus.xmlrpc/services/list"

Ich erhalte dann auch folgendes:
Code
[
  {
    "autostart": true,
    "class": "de.willuhn.jameica.hbci.xmlrpc.rmi.AddressService",
    "depends": [],
    "description": "[xml-rpc] address",
    "name": "address",
    "shared": true,
    "started": true
  },
  {
    "autostart": true,
    "class": "de.willuhn.jameica.hbci.xmlrpc.rmi.KontoService",
    "depends": [],
    "description": "[xml-rpc] konto",
    "name": "konto",
    "shared": true,
    "started": true
  },
  {
    "autostart": true,
    "class": "de.willuhn.jameica.hbci.xmlrpc.rmi.UmsatzService",
    "depends": [],
    "description": "[xml-rpc] umsatz",
    "name": "umsatz",
    "shared": true,
    "started": true
  },
  {
    "autostart": true,
    "class": "de.willuhn.jameica.hbci.xmlrpc.rmi.SepaUeberweisungService",
    "depends": [],
    "description": "[xml-rpc] sepa-ueberweisung",
    "name": "sepaueberweisung",
    "shared": true,
    "started": true
  },
  {
    "autostart": true,
    "class": "de.willuhn.jameica.hbci.xmlrpc.rmi.SepaLastschriftService",
    "depends": [],
    "description": "[xml-rpc] sepa-lastschrift",
    "name": "sepalastschrift",
    "shared": true,
    "started": true
  },
  {
    "autostart": true,
    "class": "de.willuhn.jameica.hbci.xmlrpc.rmi.SepaSammelLastschriftService",
    "depends": [],
    "description": "[xml-rpc] sammellastschrift",
    "name": "sepasammellastschrift",
    "shared": true,
    "started": true
  },
  {
    "autostart": true,
    "class": "de.willuhn.jameica.hbci.xmlrpc.rmi.SepaSammelUeberweisungService",
    "depends": [],
    "description": "[xml-rpc] sammelueberweisung",
    "name": "sepasammelueberweisung",
    "shared": true,
    "started": true
  }
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

 · 
Gepostet: 17.07.2015 - 15:48 Uhr  ·  #6
Ich bin eigentlich davon ausgegangen, dass das sowohl mit Jameica/Hibiscus + der erwähnten Plugins funktioniert, als auch mit dem Hibiscus-Server.

Hierbei muss ich gestehen, dass ich es nur mit dem Hibiscus-Server getestet haben. Wenn ich weiter darüber nachdenke, dann kann ich mir gut vorstellen, dass das tatsächlich nur mit dem Hibiscus-Server funktioniert. Eventuell kann Olaf ja ein wenig zur Aufklärung beitragen ....

Zumindest kann man anhand der Daten die Du gepostet hast feststellen, dass alle relevanten Plugins installiert und auch gestartet sind.

Sieht beinahe so aus, also ob ich den Titel des Tutorials in Hibiscus-Server abändern müsste. Sorry!

Aber warten wir erstmal, ob Olaf sich hierzu äußert.
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Leipzig
Homepage: willuhn.de/
Beiträge: 10514
Dabei seit: 03 / 2005
Betreff:

Re: Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

 · 
Gepostet: 17.07.2015 - 16:59 Uhr  ·  #7
Der downloadbare Hibiscus-Server ist ja auch nichts anderes als eine Jameica-Version mit bereits enthaltenen Plugins. Fuer die REST-Services von Hibiscus brauchst du das Plugin "hibiscus.server". Das gibts aber nicht einzeln als Download, weil es alle anderen Plugins (jameica.webadmin, jameica.xmlrpc, jameica.soap, hibiscus, hibiscus.xmlrpc, hibiscus.soap) als Abhaengigkeit benoetigt. Sprich: Wenn man das Plugin "hibiscus.server" nutzen will, kann man auch gleich den kompletten Hibiscus-Server runterladen. Da hat man bereits alle noetigen Plugins.

Du koenntest jetzt natuerlich den Hibiscus-Server runterladen und dort aus dem Ordner "plugins" nur das Plugin "hibiscus.server" nehmen. Aber wie gesagt - da du die o.g. Plugins alle ebenfalls brauchst, macht das eigentlich nicht viel Sinn.
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

 · 
Gepostet: 18.07.2015 - 14:41 Uhr  ·  #8
Na ja, den eigentlichen Beitrag kann ich nicht mehr editieren, aber ich denke jetzt dürfte kalr sein was zu tun ist ;-)
Benutzer
Avatar
Geschlecht:
Beiträge: 348
Dabei seit: 11 / 2003
Betreff:

Re: Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

 · 
Gepostet: 22.07.2015 - 11:31 Uhr  ·  #9
Ja, mit nachinstallierten Plugins wie Olaf geschrieben hat oder eben gleich direkt mit dem payment server hat es dann funktioniert.

Hab mir auch die PHP-Beispiele angesehen, diese funktionierten auf Anhieb (auch ohne hibiscus.server Plugin etc). Ich denke mal schwer, weil diese nicht den REST Service, sondern xmlrpc nutzen.
Benutzer
Avatar
Geschlecht: keine Angabe
Herkunft: Leipzig
Homepage: willuhn.de/
Beiträge: 10514
Dabei seit: 03 / 2005
Betreff:

Re: Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

 · 
Gepostet: 22.07.2015 - 12:05 Uhr  ·  #10
Zitat geschrieben von Heart

Hab mir auch die PHP-Beispiele angesehen, diese funktionierten auf Anhieb (auch ohne hibiscus.server Plugin etc). Ich denke mal schwer, weil diese nicht den REST Service, sondern xmlrpc nutzen.


Korrekt ;)
Benutzer
Avatar
Geschlecht:
Beiträge: 348
Dabei seit: 11 / 2003
Betreff:

Re: Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

 · 
Gepostet: 24.07.2015 - 15:38 Uhr  ·  #11
@CBC

Ich hab das ganze mal etwas umgeschrieben, so dass es auch für etliche tausend gefundene Umsätze noch problemlos funktioniert (mittels multidimensionalem Array). Am Ende lasse ich noch die Gesamtanzahl der gefundene Umsätze und die Skriptlaufzeit mit ausgeben.

Bei knapp 13.000 (!) Treffern benötigt das Skript um die 5 Sekunden für die Ausgabe im Terminal (solche Mengen konnte das Skript bisher nahezu überhaupt nicht verarbeiten).

Beispiel-Ausgabe:

Code
DATENSATZ NR. ...... 1282
ART ................ EURO-UEBERWEISUNG
BETRAG ............. 26.0
CHECKSUM ........... 2507813525
CUSTOMERREF ........ NONREF
DATUM .............. 2015-02-05
EMPFAENGER_BLZ ..... null
EMPFAENGER_NAME .... Max Mustermann
GVCODE ............. 051
ID ................. 11619
KONTO_ID ........... 9
PRIMANOTA .......... 5098
SALDO .............. 115.74
VALUTA ............. 2015-02-05
ZWECK .............. Umbuchung wg. KiGa IBAN: DE
ZWECK2 ............. 6573160000000******* BIC: G
ZWECK3 ............. ENODEF****

Anzahl gefundener Umsätze:  1282
Script-Laufzeit:            5.56 Sekunden


hibiscusrest.sh
Code
#!/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


Mit Syntaxhighlight bzw. zum Download siehe auch http://pastebin.com/9xY3AhpP
CBC
Benutzer
Avatar
Geschlecht:
Herkunft: Bonn
Homepage: viaembedded.com
Beiträge: 81
Dabei seit: 06 / 2015
Betreff:

Re: Tutorial: Jameica/Hibiscus REST Services des Webinterface in einem Shell Script nutzen

 · 
Gepostet: 27.07.2015 - 11:50 Uhr  ·  #12
Cool ;) Das wertet das Script noch einmal auf. Danke, Hermann!

Wenn ich jetzt mal darüber nachdenke, welches Feature noch nützlich wäre, kommt mir eine automatische Rechnungs-Kontrolle in den Sinn:

Die Datensätze im Array mit einem zweiten Array vergleichen, welches aus einer CSV Datei geladen wird, in der CSV steht min. eine Rechnungsnummer, das Fälligkeitsdatum und ein Betrag.

Jetzt könnte man durch Deine Erweiterung für jede Rechnung einen Status: bezahlt, bezahlt x nach Fälligkeit, oder noch nicht bezahlt generieren.

Vielleicht hat ja jemand Lust hier, sich daran zu versuchen. Also: mach mIT ;)

So langsam fängt es ja wirklich an, sich zu lohnen, über ein "Jameica CLI" Hauptscript nachzudenken, in der alle diese Funktionen vereint werden:

jameica_cli <plugin> <funktion> <parameter>

Viele Grüße

Christian
Gewählte Zitate für Mehrfachzitierung:   0