JonDa.Server: Unterschied zwischen den Versionen

Aus OrgaMon Wiki
Zur Navigation springen Zur Suche springen
Zeile 139: Zeile 139:
Ein XMLRPC Dienst der vom Webshop ins Anspruch genommen wird.
Ein XMLRPC Dienst der vom Webshop ins Anspruch genommen wird.


=== FotoServer ===
=== [[FotoServer]] ===


=== Aufgaben ===
=== Aufgaben ===

Version vom 30. April 2020, 17:39 Uhr

  • Der JonDaServer ist die "App"-Identität des cOrgaMon.exe
  • Er betreibt einen XMLRPC Server im Namespace "jonda"

  • Hier sieht man die beiden Server-Prozesse "App-Service" (im Vordergrund als win32 KOnsolenanwendung) und "Foto-Service" (im Hintergrund als Win32-GUI) bei der Arbeit.
  • Die beiden Server-Programme für Win32-Systeme sind die Kommunikations-Partner für die Android Anwendung OrgaMon-App.
  • Die Server arbeiten ohne Datenbank und Sychronisieren sich mit OrgaMon über einen gemeinsamen FTP-Ablage Bereich.
  • Beiden Anwendungen werden heutzutage als Win32-Konsolenanwendungen unter wine auf Linux ausgeführt.
  • Beide Server-Prozesse sind vollständig im Quelltext veröffentlicht im Rahmen des OrgaMon-Open-Source Projektes. Beide Dienste werden über cOrgaMon.exe geleistet, dieses Programm kann in der mit der Identität (Entwickler#OrgaMon-Server-Identitäten) "Foto" und der Idendität "App" gestartet werden.

Identitäten

AppServer

  • Der AppServer dienstleistet die Funktionalität "jonda.proceed" hinter dem "senden" für die OrgaMon-App auf den Smartphones
  • Der Server wird ohne GUI für Verwaltungs- und Rechercheaufgaben geliefert (Win32, cOrgaMon.exe)
  • Im Regelbetrieb wird die Konsolenanwendung auch unter Wine eingesetzt
  • Im OrgaMon lässt sich der Dienst unter "App" Verwalten

cOrgaMon.ini

;
; durch mehrere Sektionen (Name in der eckigen Klammer, im Moment System) 
; kann zwischen mehreren Mandanten unterschieden werden. So ist es 
; möglich mehrere Instanzen des Servers auf einer System zu betreiben.
; Und für jeden Id, für jede Sektion folgt dann andere Einstellungen.
;
; Bei Start wird dem OrgaMon-App-Server über den Kommandozeilenparameter
; --Id=Id dieser Sektionswert mitgegeben (default=System)
;
[System]

;
; Optionales Feld, es muss einfach nur mit einem Wert belegt sein,
;
; wenn nicht wird der Wert "System" angenommen. Alle weiteren
; Optionen werden dann unter der Sektion [System] gesucht.
ftpuser=System

; Für die Identität "App-Server"
;
; für das Script "up.php" des ./web Verzeichnisses des OrgaMon-App-Server 
;
; Für die Identität "Web-Server"
;
; wird auch aus im 2. Rang aus dem Kommandozeilenparameter "-Port=" ermittelt
host=
port=3049

;
; Für die Identität "App-Server".
;
; =JA
; Damit kann man 
; die Datum/Uhrzeit Prüfung beim "senden" Versuch der Handys
; ausschalten
;
NoTimeCheck=NEIN

;
; Für die Identität "App-Server" 
; 
; Für die Ausführung der XMLRPC-Funktion "senden" bei "einfacher Liste"
; Funktion @XMLRPCHost:XMLRPCPort:abu.Senden()
;
XMLRPCHost=raib23
XMLRPCPort=3042

;
; Für die Identitäten "App-Server" und "Foto-Server"
;
BackUpPath=..\bak\
WebPath=..\web\
FTPPath=..\ftp\
LogPath=..\log\

Optionen

  • Der JonDa-Server kann bestimmten Geräten bestimmte Programm-Optionen mitgeben. Dies wird mit OPTIONEN= in der Geräte-Einstellungsdatei gesteuert.

a

  • KEINE_DOPPELEINGABE_ZAEHLERSTAND_ALT

b

  • KEINE_DOPPELEINGABE_ZAEHLERNUMMER_NEU

c

  • KEINE_DOPPELEINGABE_ZAEHLERSTAND_NEU

Einstellungen

  • Pro Gerät kann eine .ini Datei angelegt werden, diese Datei steuert individuelle Einstellungen
  • Dateiname ist <3stellige GeräteNummer>.ini
#
# Ist das Datum/Uhr des Handys falsch einstellt unterbleibt die 
# weitere Datenverarbeitung. 
#
# JA | NEIN
#
ZEIT_PRÜFUNG=


# 
#
#
#
OPTIONEN=


#
# für die Lager-Funktionen muss diese Option auf "JA" gesetzt werden
#
# JA | NEIN
#
EinfacheListe=

#
# Protokolle befinden sich im Verzeichnis ./dat/Protokolle
# Ist dieser Schalter gesetzt, so wird davon ausgegangen, dass es hier 
# Unterverzeichnisse gibt. Der Namen der Unterverzeichnisse ist
# in dieser Einstellung angegeben. Default ist <Leer> also kein
# weiteres Unterverzeichnis.
#
# <Leer> | Unterverzeichnis\
#
ProtokollPfad=

ShopServer

Ein XMLRPC Dienst der vom Webshop ins Anspruch genommen wird.

FotoServer

Aufgaben

  • sofortiges Sichern jedes Fotos, das über FTP hochgeladen wird


llll-ggg-rrrrrr-pp.jpg

lll = laufende Backupnummer

ggg = geräte ID

rrr = Auftrags-RID

pp = Foto Parameter 
  • das Zuordnen der Fotos in die jeweiligen Ablagen
  • Umbenennen der Fotos nach bestimmen Namensmodellen
  • Aufräumen in den Internet-Ablage incl. Wegsichern der Daten

FotoBenennung

  • Sind ZaehlerNummerNeu oder ReglernummerNeu teil des Dateinamens, so ist zum Zeitpunkt der Foto-Dateilieferung in der Regel dieser Wert noch nicht bekannt
  • Der Monteur müsste "Senden" um die Information dem Foto-Server zugänglich zu machen
  • Die Konvention fordert, dass FN= das Einbau Zähler Bild ist, das "ZaehlerNummerNeu" im Dateinamen enthält
  • Die Konvention fordert, dass FE= das Einbau Regler Bild ist, das "ReglerNummerNeu" im Dateinamen enthält
  • Solange die Umbenennung noch nicht möglich ist wird der Platzhalter "Neu" in den Dateinamen eingefügt
  • Bei der Umbenennung wird in folgender Reihenfolge versucht diese Eintragungen zu ermitteln
  1. Bei FotoBenennung=6 direkt aus der "Fotobenennung.csv" der Baustelle
  2. Im (gesicherten aber nicht mehr ganz frischen) .\dat\db\AUFTRAG+TS.BLA
  3. Im absichtlich veralteten .\dat\db\_AUFTRAG+TS.BLA

Datensicherung

  • Im .\bak Verzeichnis muss sich zumindest ein Unterverzeichnis befinden mit dem Namen #zzz (wobei "z" eine Ziffer "0" .. "9" sein muss)
  • Der Server startet und ermittelt aus allen "#*" Unterverzeichnissen das mit der höchsten Nummer "zzz", nur in dieses wird gesichert
  • Direkt wenn ein Bild im FTP- Bereich komplett hochgeladen ist, wird noch vor der Zuordnung eine Sicherungskopie nach .\bak\Fotos gemacht
  • die Befüllung von ./bak/#zzz ist also kontinuierlich über den ganzen Tag zu erwarten
  • Im Rahmen des "Ablagedienstes" der automatisch nach 00:00 Uhr anläuft werden zudem alte Dateien aus allen Internetablagen (./web) nach #zzz verschoben
  • Nach dem Verschieben der Zips wird die Grösse des aktuell verwendeten Sicherungsverzeichnisses protokolliert
  • Ist es >3,8 GB so wird ein neues Sicherungsverzeichnis angelegt (Name ist die alte Nummer + 1), die Umschaltung auf dieses Sicherungsverzeichnis erfolgt beim nächsten Dienste-Start, aber möglicherweise nicht sofort
  • Sicherungsverzeichnisse, die man wegverschieben darf, werden deshalb mit der leeren Datei ./MOVE-OK markiert
  • Ein externes Sicherungstool sollte also z.B. #222 erst verschieben wenn #222/MOVE-OK vorhanden ist

Entlastung

  • Mit dem Programm "Flatdigger" kann ein zu groß gewordenes #zzz Unterverzeichnis entlastet werden
  • das Programm verschiebt die Daten so, dass neue Unterverzeichnisse (fortlaufende Nummer) entstehen, die alle maximal 4 GB gross sind
  • die 4 GB-Grenze hat historische Gründe: Diese Unterverzeichniss-Grössen konnten auf DVD-Medien gesichert werden

Installation

  • Betrieb und Installation von cOrgaMon.exe auf Linux Linux.wine

Sektions-Migration

  • Den Id, sprich die Sektion der .ini, sprich den Mandanten oder den Namensraum unter dem der OrgaMon-App-Server läuft kann man ändern, dies muss aber an einigen Stellen gemacht werden:
  • zunächst eine Diagnose: Stellen Sie zunächst fest unter welcher Id das System im Moment läuft
systemctl status | grep cOrgaMon
  • es werden alle bisherigen --Id ausgegeben
  • es wird nun beschrieben wie Sie "alte-Id" auf "neue-Id" ändern können

/etc/crontab editieren

10 02 * * * root systemctl stop cOrgaMonApp@alte-Id
10 02 * * * root systemctl stop cOrgaMonFoto@alte-Id
15 02 * * * root systemctl start cOrgaMonApp@alte-Id
15 02 * * * root systemctl start cOrgaMonFoto@alte-Id
  • umstellen auf
10 02 * * * root systemctl stop cOrgaMonApp@neue-Id
10 02 * * * root systemctl stop cOrgaMonFoto@neue-Id
15 02 * * * root systemctl start cOrgaMonApp@neue-Id
15 02 * * * root systemctl start cOrgaMonFoto@neue-Id

OrgaMon.ini in "Documents" editieren

[alte-Id]
  • umstellen auf
[neue-Id]
  • Merken Sie sich das angegebene Verzeichnis im Wert DatabaseName=, dieses Verzeichnis ist für den nächsten Schritt nötig

cOrgaMon.ini im .\dat editieren

[alte-Id]
  • umstellen auf
[neue-Id]

systemctl Befehle durchführen

systemctl stop cOrgaMonApp@alte-Id
systemctl disable cOrgaMonApp@alte-Id
systemctl stop cOrgaMonFoto@alte-Id
systemctl disable cOrgaMonFoto@alte-Id
 
systemctl enable cOrgaMonApp@neue-Id
systemctl enable cOrgaMonFoto@neue-Id
systemctl start cOrgaMonApp@neue-Id
systemctl start cOrgaMonFoto@neue-Id

Neustart unter Linux

  • da wine einzelne Resourcen für alle cOrgaMon.exe Prozesse teilt, muss ein Neustart immer alle Instanzen und Identitäten betreffen
  • zudem verwendet wine Optimierungen die eine verzögerte Freigabe dieser Resourcen bewirkt
  • somit ist nach dem Beenden der Prozesse eine Wartezeit einzuplanen
  • geschieht das nicht, kann das Ergebnis sein, dass z.B. Sockets oder Dateien noch nicht freigegeben sind
  • Bei gleichzeitigem Start der Idendität "App" und "Foto" kann Streit um Resourcen entstehen, wodurch der Start dann misslingt
systemctl stop cOrgaMonApp@~FirmenKurzbegriff~
systemctl stop cOrgaMonFoto@~FirmenKurzbegriff~
sleep 100
systemctl start cOrgaMonFoto@~FirmenKurzbegriff~
sleep 100
systemctl start cOrgaMonApp@~FirmenKurzbegriff~


XML-RPC Funktionen

  jonda.BasePlug () : array of string; { Infos }
  
  // liefert diverse Informations-String:
  // 1) Datenbankname (im Moment nicht verfügbar, jonda benötigt im Moment keine Datenbank)
  // 2) Jonda - Server Versions-Nummer
  // 4) Indy Versions-Nummer
  //
  jonda.StartTAN (GeraetID : string) : string; { TAN }
  
  // erwartet eine 3 stellige Geräte Identifiktationsnummer wie z.B. 422
  // Die Funktion holt die passenden Gerätedaten von einem FTP Server
  // Ist das Gerät bekannt, so wird eine neue TAN Nummer gezogen, es wird
  // ein entsprechendes Verzeichnis geöffnet, und Upload Daten können 
  // gezogen werden.
  // Format: GeraetID;_TAN;VERSION;OPTIONEN;UHR;
  //  GeraetID   : z.B. 003
  //  _TAN       : bisherige TAN
  //  VERSION    : Programmversion z.B. 1.114
  //  OPTIONEN   : 85
  //  UHR        : Datum + Uhr im Format: "26.09.2005 - 07:21:05"


  jonda.ProceedTAN (TAN : string) : integer; { 0=OK,Ansonsten Fehlercodes }
  
  // verarbeitet alle Eingangsdaten und stellt die Ergebnisdateien
  // im entsprechenden TAN Verzeichnis zur Verfügung.

Kommunikation bei "senden"

  • Schritte des Skripts
  1. up.php zieht eine neue Transaktions-Nummer und erstellt das gleichnamige Verzeichnis
  2. up.php hat Zeile für Zeile Auftragsergebnisse in die Datei [] geschrieben
  3. Final kontaktiert up.php den XML-RPC Server und führt die Funktion "proceed" aus


#
# Initialisierungsphase
#
up.php?id=666;50000;1.011     // GeräteID;LetzteErfolgreicheTAN;Programmversionsnummer
                              // Antwort: liefert im BODY eine neue TAN

# 
# Datenübertragungsphase 
#
up.php?tan=50999&data=RID1   // lädt Daten hoch
up.php?tan=50999&data=RID2   // ...
up.php?tan=50999&data=RID3   // ...


#
#
up.php?proceed=50999          // fordert zum verarbeiten auf, liefert "OK" im BODY

Diagnose

#
# Test der XMLRPC-Verfügbarkeit
# liefert im BODY die BasePlug-Infos
#
http://<deinAppServer>/up.php?info=JA
                                          

#
# Ausgabe der aktuellen Logs für die Idendität "Foto"
#
journalctl -e -nall -t cOrgaMonFoto

Info zum Verzeichnisinhalt

Web

  • Verzeichnis .\web\
TTTTT.auftrag.utf-8.txt  (vom Server) das neue Auftragsvolumen für die OrgaMon-App
TTTTT.txt                (vom Script up.php) die Eingabeergebnisse der OrgaMon-App

dat

./dat/Daten

AUFTRAG+TS.BLA   binäre Tabelle aller bekannten Aufträge (plus TimeStamp) auf allen Geräten

FOTO+TS.BLA      Foto (plus TimeStamp). binäre Tabelle aller bekannten Meldungen an den 
                 OrgaMon wobei F?= beteiligt war. 

# 
# Im Rahmen des Abschlusses von cOrgaMon.exe werden die Tabellen AUFTRAG+TS.BLA und FOTO+TS.BLA
# von "alten" Datensätzen befreit, Datensätze, die 32 Tage und älter sind, werden in der Tabelle 
# gelöscht. Bei Einfügen in die Tabelle wird das Datum aufgezeichnet
#

./dat/db

  • Bei jedem Neustart des App-Servers werden Kopieen aus ./dat/Daten gezogen, damit sich Foto-Dienste und "proceed" nicht in die Quere kommen
AUFTRAG+TS.BLA   (eine Kopie aus ./dat/Daten) binäre Tabelle aller bekannten Aufträge (plus TimeStamp) auf 
                 allen Geräten
_AUFTRAG+TS.BLA  zweite, meist ältere Variante dieser Tabelle die manuell 
                 zur Seite gestellt wird wenn sehr alte Transaktionen wiederholt werden
                 sollen, bei denen die Gefahr besteht, dass AUFTRAG-RIDs in
                 AUFTRAG+TS.BLA nicht mehr vorhanden sind.
Eingabe.GGG.txt  GGG ist die Gerätenummer
                 eine csv mit folgender Kopfzeile (diese Kopfzeile wird nicht in der .csv gespeichert!)
                 DATUM;UHRZEIT;RID;REGLER_NUMMER_NEU;ZAEHLER_NUMMER_NEU

./dat/TTTTT

  • Transaktionsverzeichnise, durchnummeriert von 10000 bis 99999
  • jedes "senden" verbraucht eine Transaktions-Nummer und erzeugt ein Unterverzeichnis mit dieser Nummer
  • TTTTT ist die Transaktionsnummer
  • Verzeichnis .\dat\TTTTT\


GGG.DAT     (vom FTP) Netto-Auftragsvolumen für dieses Gerät, wird frisch vom ftp-Bereich geholt.
GGG.ZIP     (vom Gerät) komplett Daten vom Gerät kommend
TTTTT.DAT   (zum OrgaMon) Meldenswerte Volumen für OrgaMon (Bericht Datei)
TTTTT.TXT   (vom Gerät) Eingaben den Monteures
AUFTRAG.DAT (zum Gerät) das neue, vom Server zusammengestellte Volumen
auftrag.txt (zum Gerät) das neue, vom Server zusammengestellte Volumen in Textform
JONDA.DAT   (vom Gerät) vom Monteur getätigte Eingaben.
GERAET.DAT  (vom Gerät) Geräteeinstellungen
LOST.DAT    (nur Zwischendatei) verschimmelte Restaten landen dort
STAY.DAT    (nur Zwischendatei) GGG.DAT+STAY.DAT=AUFTRAG.DAT

ftp

  • Verzeichnis .\ftp\, das zentrale Up- Downloadverzeichnis des Servers
# 
# dynamisch (Dateien werden nach dem Verarbeiten durch den OrgaMon gelöscht)
#
TTTTT.DAT           Meldungen der OrgaMon-App an OrgaMon (binär)
TTTTT.utf-8.txt     Meldungen der OrgaMon-App an OrgaMon (als Text)

# 
# dynamisch (Dateien werden nach dem Verarbeiten durch den OrgaMon-App-Server gelöscht)
#
baustelle.csv

#
# dynamisch (Dateien werden nach dem Verarbeiten durch den OrgaMon-Foto-Server  gelöscht)
#
GGG-RRRRRR-PP.jpg

#
# statisch (Dateien werden durch den OrgaMon bereitgestellt/aktualisiert und bleiben bestehen)
#
GGG.DAT
abgearbeitet.dat
abgezogen.GGG.dat

#
# statisch (Dateien werden durch den OrgaMon-App-Server 
#
AUFTRAG.GGG.DAT

Verarbeitungsschritte

start

  1. erstelle das TTTTT Verzeichnis
  2. prüfe die IMEI und Datum / Uhrzeit des Handy
  3. erstelle .\web\TTTTT.txt mit allen Infos wer "senden" will als Key=Value, in der Folge wird up.php diese Datei iterativ immer um eine Zeile erweitern, bis das Handy ein "proceed" auslöst

proceed

  • Begrifflichkeiten
  • Abgearbeitete, sind Auftrags-RIDS die aus OrgaMon Sicht fertig sind und nicht mehr aufs Handy sollen
  • Abgezogene, die Auftrags-RIDs die nicht mehr auf dem Handy erscheinen dürfen


  • Schritte der Proceed-Funktion
  1. Geräte Speziefische Optionen laden
  2. Transaktion Initialisieren (InitTRN)
    1. lade "abgearbeitet.dat"
    2. lade "unberuecksichtigt.txt"
    3. lade "abgezogen.GGG.dat"
    4. lade "GGG.dat"
  3. .\web\TTTTT.txt verarbeiten
    1. die Datei um Zeilen erweitern die nicht aus "senden" stammen, sondern dem schnelleren "melden"
    2. dabei allerlei Tatsachen beachten: Restanten, Stay-Liste, Abgearbeitet, Abgezogene usw.
  4. mit "WriteOrgaMon" den OrgaMon über Ergebnisse informieren
    1. TTTTT.DAT und TTTTT.utf8 wird erstellt
  5. Zug um Zug das neue Auftragsvolumen erstellen
    1. AUFTRAG.DAT und auftrag.txt erstellen

Datenabruf

  • Der Client lädt die Datei TTTTT.auftrag.utf-8.txt vom .\web\ Verzeichnis

todo

  • von dem binären Format des MDEREC komplett verabschieden (immer mit csv arbeiten)