Skriptverarbeitungssystemereignisse unter Verwendung von DBus

    Dbus ist ein Interprozesskommunikationswerkzeug. Mit anderen Worten, ein Tool, mit dem ein Programm einem anderen Programm Befehle erteilen kann.
    Im Internet finden Sie leicht Beispiele für die Verwaltung verschiedener Programme über die Befehlszeile mit DBus. Das Thema, wie Signale von anderen Programmen verfolgt werden können, ist jedoch nur unzureichend bekannt. In diesem Artikel möchte ich diese Ungerechtigkeit korrigieren und ein Beispiel für die Verarbeitung von Ereignissen analysieren, die vom System über Dbus empfangen werden.

    Zusätzlich zu den Bindungen an Programmiersprachen für Dbus gibt es eine Reihe von Konsolenprogrammen, mit denen Sie es über die Befehlszeile verwenden können.
    • qdbus - Mit dieser Option können Sie eine Liste der Dienste und ihrer Schnittstellen auf der Konsole anzeigen und Befehle an Anwendungen senden.
    • dbus-send - Ermöglicht das Senden von Befehlen an Anwendungen.
    • dbus-monitor - Zeigt Informationen zu den empfangenen Signalen zum Zeitpunkt des Empfangs an der Konsole an.

    Wenn Sie mit DBus arbeiten, ist auch das Programm qdbusviewer von Interesse - eine grafische Anwendung, mit der Sie vorhandene Programme im System untersuchen können, die DBus unterstützen.

    Und so das versprochene Beispiel.


    Aufgabe: Schreiben Sie ein Skript, das beim Herstellen einer Verbindung zum Internet den Yandex.Disk-Client startet.
    Wir starten qdbusviewer und suchen, für welchen Dienst eine Änderung des Netzwerkstatus gemeldet werden kann. Auf der Registerkarte Systembus sehen wir den Dienst org.freedesktop.NetworkManager. Wenn wir in diesem Dienst den Pfad / org / freedesktop / NetworkManager verwenden, finden wir ein Objekt, das die Schnittstelle org.freedesktop.NetworkManager implementiert. In dieser Schnittstelle befindet sich ein StateChanged-Signal. Überprüfen Sie: Klicken Sie mit der rechten Maustaste auf das Signal und wählen Sie Verbinden. Wir trennen, verbinden die Netzwerkschnittstelle, wir sehen eingehende Signale, die den Status des Netzwerks melden. Was wir brauchen
    Jetzt werden wir das gleiche Ergebnis auf der Kommandozeile erzielen. Wir werden den Befehl dbus-monitor verwenden. Geben Sie in die Befehlszeile ein:
    dbus-monitor --system "sender=org.freedesktop.NetworkManager, path=/org/freedesktop/NetworkManager, member=StateChanged"
    

    Hier ist die Option --system eine Anweisung zum Abhören des Systembusses. Die Anführungszeichen kennzeichnen den Filter des für uns interessanten Signals. Der Dienst org.freedesktop.NetworkManager, der Pfad / org / freedesktop / NetworkManager und das StateChanged-Signal.
    Trennen Sie die Verbindung, schließen Sie die Netzwerkschnittstelle an. Während der Änderung des Netzwerkstatus zeigt die Konsole alle neuen Zeilen an:
    signal sender=org.freedesktop.DBus -> dest=:1.540 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
       string ":1.540"
    signal sender=:1.2 -> dest=(null destination) serial=1870 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged
       uint32 20
    signal sender=:1.2 -> dest=(null destination) serial=1883 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged
       uint32 40
    signal sender=:1.2 -> dest=(null destination) serial=1899 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged
       uint32 70
    

    Für jedes empfangene Signal werden 2 Zeilen ausgegeben. Die erste mit einer Beschreibung des Signals, die zweite mit dem Wert des Arguments. Übrigens, wenn das Signal mehr Argumente hat, gibt es mehr Zeilen.
    Es wird experimentell festgestellt, dass der Wert des angeschlossenen Netzwerks 70 entspricht.
    Genau genommen müssen Sie die konstanten Werte in der NM_STATE- Dokumentation betrachten (danke für die Verknüpfung von avalak ).

    Nun müssen wir die empfangenen Signale verarbeiten und den Yandexdisk-Startbefehl bilden. Geben Sie in die Befehlszeile ein:
    dbus-monitor --system "sender=org.freedesktop.NetworkManager, path=/org/freedesktop/NetworkManager, member=StateChanged" | sed -u -n 's/   uint32 70/yandex-disk start/p'
    

    Wir haben die vorherige Befehlszeile | hinzugefügt sed -u -n s / uint32 70 / yandex-disk start / p '. Hier verarbeiten wir jede vom dbus-monitor empfangene Zeile mit dem sed-Programm. Die Option -u weist sed an, das Ergebnis sofort auszugeben, ohne den Puffer zu verzögern. Die Option -n zeigt nichts an, bis ein expliziter Befehl vorliegt. In einfachen Anführungszeichen wird der Befehl dem sed-Programm angezeigt: Ersetzen Sie den Ausdruck "uint32 70" durch den Ausdruck "yandex-disk start" in der Zeichenfolge und zeigen Sie das Ergebnis an. Ein solcher Befehl konvertiert Text
    signal sender=org.freedesktop.DBus -> dest=:1.540 serial=2 path=/org/freedesktop/DBus; interface=org.freedesktop.DBus; member=NameAcquired
       string ":1.540"
    signal sender=:1.2 -> dest=(null destination) serial=1870 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged
       uint32 20
    signal sender=:1.2 -> dest=(null destination) serial=1883 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged
       uint32 40
    signal sender=:1.2 -> dest=(null destination) serial=1899 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged
       uint32 70
    signal sender=:1.2 -> dest=(null destination) serial=1870 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged
       uint32 20
    signal sender=:1.2 -> dest=(null destination) serial=1883 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged
       uint32 40
    signal sender=:1.2 -> dest=(null destination) serial=1899 path=/org/freedesktop/NetworkManager; interface=org.freedesktop.NetworkManager; member=StateChanged
       uint32 70
    

    in
    yandex-disk start
    yandex-disk start
    

    Das heißt, bei jeder Verbindung zum Netzwerk wird der Befehl yandex-disk start generiert.

    Endlich die endgültige Fassung:
    dbus-monitor --system "sender=org.freedesktop.NetworkManager, path=/org/freedesktop/NetworkManager, member=StateChanged" | sed -u -n 's/   uint32 70/yandex-disk start/p' | sh
    

    Sendet den generierten Yandex.Disk-Befehl zur Ausführung.

    In Datei speichern
    #!/bin/bash
    dbus-monitor --system "sender=org.freedesktop.NetworkManager, path=/org/freedesktop/NetworkManager, member=StateChanged" | sed -u -n 's/   uint32 70/yandex-disk start/p' | sh
    

    Wir machen die Datei ausführbar. Und zu Autorun hinzufügen. Wenn Sie nun mit dem Internet verbunden sind, wird der Yandex.Disk-Client automatisch gestartet.

    Ebenso können Sie die Signale jeder Anwendung verarbeiten, die DBus unterstützt.

    Der Artikel untersuchte die Möglichkeit, die Verarbeitung von Signalen aus verschiedenen Anwendungen mit DBus zu automatisieren. Zur Überwachung der Signale in der Konsole wird das Programm dbus-monitor verwendet. Mit diesem Programm können Sie alle Signale aller Dienste erfassen und nur das herausfiltern, was uns interessiert.
    Einige Beispiele:
    • dbus-monitor - alle gesteuert von allen anwendungen.
    • dbus-monitor --system "sender = org.freedesktop.NetworkManager" - alle Signale vom NetworkManager.
    • dbus-monitor --system "sender = org.freedesktop.NetworkManager, path = / org / freedesktop / NetworkManager" - alle Signale vom Objekt / org / freedesktop / NetworkManager im NetworkManager-Dienst.
    • dbus-monitor --system "sender = org.freedesktop.NetworkManager, path = / org / freedesktop / NetworkManager, member = StateChanged" - nur das StateChanged-Signal vom Objekt / org / freedesktop / NetworkManager im NetworkManager-Dienst

    dbus-monitor zeigt für jedes empfangene Signal mehrere Zeilen an. In der ersten Beschreibung des Signals, in den nachfolgenden Werten der Argumente.
    Als nächstes verarbeiten wir die empfangenen Signale nach Belieben.

    Jetzt auch beliebt: