HowTo: DSM-Desktop-Benachrichtigungen unter DSM 7 erstellen!

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.151
Punkte für Reaktionen
1.115
Punkte
314
Mit Einführung von DSM 7 ist das Absetzen von DSM-Desktop-Benachrichtigungen aus einer App heraus ein wenig aufwändiger geworden, als noch unter DSM 6. Im aktuellen Synology DSM 7 Developer Guide (aus dem ich mich im folgenden beziehen und zitieren werde) wird das genaue Vorgehen leider nur sehr wage und teils zusammenhangslos beschrieben. Daher möchte ich hier gerne meine Erfahrungen mit euch teilen, indem ich dieses kleine HowTo verfasse.

Ausgehend von der Standard Paket Dateisystem Hierarchie [dsmuidir] wird unter /var/packages/[PAKET-NAME]/target/ui eine neue Ordnerstruktur aufgebaut. In diesem Zweig werden die entsprechenden Sprachdateien zur späteren Ausgabe von DSM-Desktop-Benachrichtigungen abgelegt.

JSON:
ui (specified by dsmuidir in INFO)
??? texts
    ??? enu
    |    ??? strings
    ??? ger
    |    ??? strings
    ??? ...
         ??? strings

Der jeweilige Inhalt einer Sprachdatei strings wird im sogenannten section:key Format (Synology spricht hier von einem i18n string) abgelegt.

JSON:
[app_tree]
index_title="This is a title"
node_1="This is node1"

Abschließend sollte bei allen neu angelegten Ordnern und Dateien noch der Eigentümer auf [PAKET-NAME]:[PAKET-NAME] sowie die Rechte auf 755 oder auch 644 geändert werden.

Der nun folgende Befehl löst die eigentliche DSM-Desktop-Benachrichtigung aus. Hierbei wird die Benachrichtigung an das im DSM aktive Paket gebunden. Das bedeutet, das der Befehl nur dann korrekt ausgeführt wird, wenn das zugehörige Paket im DSM aktiv, sprich das App Fenster geöffnet ist, oder sich zumindest minimiert in der Taskleiste befindet.

Bash:
synodsmnotify -c SYNO.SDS._ThirdParty.App.[PAKET-NAME] @administrators [PAKET-NAME]:app_tree:index_title [PAKET-NAME]:app_tree:node_1

Das sieht erstmal ein wenig verwirrend aus, ist bei genauerer Betrachtung aber gut zu lesen. Die Bezeichnung SYNO.SDS._ThirdParty.App.[PAKET-NAME] wird durch den "url:" type in der Datei config definiert. @administrators steht Beispielhaft für die Benutzergruppe, die diese Benachrichtigung erhalten soll. Darauf folgt dann das section:key Format, wobei im ersten Teil die Überschrift, im zweiten Teil ein entsprechender Text ausgegeben wird.

Möchte man eine Benachrichtigung z.B. über ein externes Script bei inaktiver App auslösen wollen, so muss ein zusätzlicher Eintrag in der Datei config erfolgen. Hier wird festgeleg, welche section:key Werte bei inaktiver App ausgeführt werden dürfen. Entscheidend sind Nachfolgen die letzten drei Einträge…

JSON:
{
   ".url": {
      "SYNO.SDS._ThirdParty.App.[PAKET-NAME]": {
      "type": "url",
      "icon": "images/app_{0}.png",
      "title": "Test App1",
      "desc": "Description",
      "url": "http://www.yahoo.com",
      "allUsers": true,
      "preloadTexts": [
      "app_tree:index_title",
      "app_tree:node_1"
       ]
   }
}

Ich hoffe, ich konnte dieses HowTo einigermaßen verständlich rüber bringen. Falls Fragen offen bleiben, werde ich gerne versuchen, diese zu beantworten.

Noch ein Hinweis: Die eckigen Klammern bei [PAKET-NAME] dienen nur der Übersicht und werden nicht mitgeschrieben.

Viel Spaß

Tommes
 
Zuletzt bearbeitet:
  • Like
Reaktionen: geimist

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.151
Punkte für Reaktionen
1.115
Punkte
314
Hier noch die Syntax zu synodsmnotify ... hab ich mir freundlicher Weise von hier geklaut ;)

Code:
# synodsmnotify
Copyright (c) 2003-2021 Synology Inc. All rights reserved.

synodsmnotify [-c className] [-t tag] [-e true/false] [-b true/false] [-p html/plain] [--fn fn] user/group title msg ...
    user/group: group format is @GROUPNAME, else that will be treated as a user name.

Tommes
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.151
Punkte für Reaktionen
1.115
Punkte
314
Ich stehe grade vor der Frage, wie ich den Inhalt einer bash Variable an die DSM-Desktop-Benachrichtigung übergeben kann.

Also sowas wie z.B.
Die Datei irgendwas.txt konnte nicht gefunden werden

... wobei der Dateiname durch ein bash Script ermittelt und in einer Variabel wie z.B.


... abgelegt wurde. Wie kann ich nun ${filename} an das JSON Format übergeben? In anderen Apps wie z.B. SMBService werden Übergaben in den Sprachdateien "strings" wohl so eingebettet...

Die Datei {1} konnte nicht gefunden werden

... nur weiß ich nicht, wie ich ${filename} nach {1} bekommen soll. Hat da vielleicht jemand einen Tipp?

Tommes
 

BigRonin

Benutzer
Mitglied seit
08. Mai 2015
Beiträge
1.156
Punkte für Reaktionen
130
Punkte
89
Hab das Problem mit AvrLogger auch „gehabt“ ;)

Die Lösung ist so einfach, wenn man weiß wie es geht … wunder mich nur das Synology daraus ein Geheimnis macht.
Der Trick sieht so aus:

Du legst in deiner „strings“-Datei einen extra Eintrag an :

CustomNotification = "{0}"

Der Name spielt keine Rolle. Den benutzt du um „Custom Notification’s“ auszugeben.

Deinem Aufruf von „synodsmnotify –c“ hängst du einfach die gewünschte Nachricht an. Die muss zwischen Anführungszeichen stehen sonnst werden sie getrennt und nur das erste Wort angezeigt.

In AvrLogger sieht ein Aufruf so aus:
Bash:
synodsmnotify -c SYNO.SDS.AvrLogger.Application @administrators AvrLogger:Notify:Titel AvrLogger:Notify:CustomNotification "Your message"

Ach ... und das Ganze scheint für den Titel nicht zu funktionieren, habs bis jetzt nicht hinbekommen. 😞
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Tommes

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.151
Punkte für Reaktionen
1.115
Punkte
314
Hi @BigRonin

Die Lösung ist so einfach, wenn man weiß wie es geht …

Witzig 🤣 … aber hey… danke das du das herausgefunden und hier geteilt hast. Ich werde das die Tage mal testen (bin eh grad wieder in Programmierlaune) und vielleicht klappt das dann ja auch bei mir. Wäre toll, denn ein paar Einsatzmöglichkeiten hätte ich schon dafür.

Ich hoffe nur, das Synology anstatt "Your message" auch eine Variable wie "${message}" akzeptiert, aber davon sollte man wohl ausgehen.

Tommes
 

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.151
Punkte für Reaktionen
1.115
Punkte
314
Soderle... ich habe das grade mal ausprobiert und es funktioniert hervorragend. Ich habe testweise ein Backup ausgeführt und dazu in der strings folgenden Inhalt stehen...

job_executed = "Der Datensicherungsauftrag [ {0} ] wird ausgeführt..."

... und der Aufruf endet dann mit einem...

... :job_executed "${jobname}"

Wobei ${jobname} dem Auftrags- bzw. Dateinamen "LokalerTest" entspricht. Als Ergebnis erhalte ich dann...

1645211055757.png

Echt stark 💪 und danke nochmal für den Tipp @BigRonin

Tommes
 
  • Like
Reaktionen: BigRonin

Tommes

Benutzer
Sehr erfahren
Maintainer
Mitglied seit
26. Okt 2009
Beiträge
9.151
Punkte für Reaktionen
1.115
Punkte
314
Im übrigen kann man auf diese Weise auch mehrere Werte übergeben. So folgt nach ${0} halt ${1}, ${2}, ${3} ... ${n} und man hängt die Werte einfach nacheinander an synodsmnotify an, also z.B. so...

... :job_executed "${jobtype}" "${jobname}" ... etc.
 


 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat