Neues Modul: Signalbot (Integration für den Signal Messenger) via signal-cli

Begonnen von Adimarantis, 31 Januar 2021, 19:16:19

Vorheriges Thema - Nächstes Thema

BAfH

Ich habe weiter getestet, jetzt läuft es bei mir im Docker.

Mein Weg:
1. Mit Docker-compose p -d Container erstellen
2. nach dem Start in der Console wie bei Jörg beschrieben
2.1 apt-get update
2.2 Container check im Script deaktivieren!
2.3 ./signal_install.sh system
2.4 ./signal_install.sh install
2.5 dbus-daemon --system --address=unix:path=/run/dbus/system_bus_socket &
2.6 Registrierung der Rufnummer
2.6.1 ./signal_install.sh register oder copy vom Sicherungspfad
2.6.2 cp -r /opt/fhem/signal-cli /var/lib
2.7 cd /var/lib
2.8 chown -R signal-cli: signal-cli
2.9 Starten sudo -u signal-cli /opt/signal/bin/signal-cli -u +49xxx --config /var/lib/signal-cli daemon --system &


Angelehnt an diesen Post, Danke Michel
https://forum.fhem.de/index.php/topic,84996.msg1124412.html#msg1124412
Nutze ich dieses Dockerfile
ARG BASE_IMAGE="fhem/fhem"
ARG BASE_IMAGE_TAG="latest"
FROM ${BASE_IMAGE}:${BASE_IMAGE_TAG}

ARG L_SIGNAL_CLI="0.7.4"

# Install base environment
RUN DEBIAN_FRONTEND=noninteractive apt-get update \
    && DEBIAN_FRONTEND=noninteractive apt-get install -qqy --no-install-recommends \
        cpanminus \
        build-essential \
        wget \
        shared-mime-info \
#        default-jre-headless \
        libunixsocket-java \
        dbus \
        libnet-dbus-perl \
shared-mime-info \
haveged \
# default-jdk \
        net-tools \
nano \
systemd \
        hping3 \
        wakeonlan \
    && wget https://download.bell-sw.com/java/11.0.10+9/bellsoft-jdk11.0.10+9-linux-arm32-vfp-hflt.deb \
    && apt-get install -qqy --no-install-recommends ./bellsoft-jdk11.0.10+9-linux-arm32-vfp-hflt.deb \
    && cpanm \
        Net::DBus \
#       Lirc::Client \
        Crypt::Cipher::AES \
    && rm -rf /root/.cpanm \
    && apt-get purge -qqy \
        build-essential \
        cpanminus \
        subversion \
    && apt-get autoremove -qqy && apt-get clean \
    && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

COPY ./src/pre-start.sh /pre-start.sh
RUN mkdir /run/dbus

RUN chmod +x /pre-start.sh

Auszug aus der docker-compose.yml
services:
    fhem:
        build: fhem
        privileged: true
        restart: always
        ports:
            - "1884:1884"
            - "8083:8083"
            - "8084:8084"
            - "7072:7072"
            - "8090:8090"
        volumes:
         - ./fhem/core/:/opt/fhem/
        network_mode: host
        devices:
            - "/dev/ttyUSB0:/dev/ttyUSB0"
            - "/dev/ttyUSB1:/dev/ttyUSB1"
        environment:
            FHEM_UID: 1000
            FHEM_GID: 1000
            TIMEOUT: 10
            RESTART: 1
            TELNETPORT: 7072
            TZ: Europe/Berlin
            NUMBER: "+49xxxx"
            SLEEPTIME: "5"
        depends_on:
            - "mysql"
            - "mqtt"

das Script pre-start.sh sieht wie folgt aus#!/bin/bash
export NUMBER="${NUMBER:-"undef"}"
export SLEEPTIME="${SLEEPTIME:-"10s"}"
SIGNALUSER=signal-cli

if [ $NUMBER != "undef" ]; then

echo -n "Checking user $SIGNALUSER ..."
if id "$SIGNALUSER" &>/dev/null; then
    echo 'found'
else
adduser --disabled-password --gecos none $SIGNALUSER
    echo 'created'
fi


   if [ -s /var/run/dbus/pid ]; then
      rm /var/run/dbus/pid
   fi

   echo "Starting DBus System Daemon"
   dbus-daemon --system --address=unix:path=/run/dbus/system_bus_socket &

   echo "Starting signal-cli"
   #/usr/local/bin/signal-cli -u $NUMBER --config /opt/fhem/signal-cli daemon --system &
   sudo -u signal-cli /opt/signal/bin/signal-cli -u $NUMBER --config /var/lib/signal-cli daemon --system &

   echo "Wait $SLEEPTIME to give signal-cli time to come up"
   sleep $SLEEPTIME
fi


Das Script pre-script.sh wird bei jedem Start des Conatiners ausgeführt. Setzt für mich den Rest, siehe Log
Running /pre-start.sh script ...
Checking user signal-cli ...Adding user `signal-cli' ...
Adding new group `signal-cli' (1001) ...
Adding new user `signal-cli' (1001) with group `signal-cli' ...
The home directory `/home/signal-cli' already exists.  Not copying from `/etc/skel'.
created
Starting DBus System Daemon
Starting signal-cli
Wait 5 to give signal-cli time to come up
/opt/signal/bin/signal-cli: 41: cd: can't cd to /opt/fhem
Preparing configuration ... done
Starting FHEM ...


Ich weiß ist sicherlich nicht so elegant, aber läuft. Ich bleibe weiter am Ball.
Gruß Thorben
mit sonnige Grüße aus Schönow

Adimarantis

Hi Thorben,

bin mit meiner Lösung auch schon weiter.
Tricky ist halt, was macht man im Dockerfile (so es es persitent im Image ist) und was im Script.
Und dann eben auch: Wo macht man die Registrierung?
Bis auf ein paar Kleinigkeiten die ich noch verbessern möchte, habe ich auf jeden Fall schon mal ein Script, das ein blankes FHEM basierend auf dem standard Ubuntu Image hochzieht.
die Verzeichnisse für fhem und die signal-cli registry liegen dabei außerhalb des Containers damit sie erhalten bleiben. Der Rest ist weitgehend ins Image gebacken und bleibt auch nach einem "docker rm" des Containers erhalten, so dass ein erneuter Start (bei dem man sowohl fhem config als auch signal-cli registry vorher austauschen könnte) flott vonstatten geht.
Natürlich werden jetzt Module die Abhängigkeiten außerhalb von FHEM oder spezielle Perl Module brauchen nicht berücksichtigt. Da muss man dann das Dockerfile ergänzen, bzw. vielleicht eine Konfiguration anbieten, in der man weitere "apt install" oder einfach RUN Befehle einfach ergänzen kann.

Gruß,
Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Deekay2000

Hallo,

ich habe versucht, signal-cli über das Script zu installieren. Dabei ist mir aufgefallen, dass die Registrierung nur über Voice ging, SMS brach mit einer Fehlermeldung ab:

Receive registration code for +49xxxxxxxxxx by (S)MS or (V)oice (s/v)? s
Registering +49xxxxxxxxxx with SMS
Unknown option , exiting


Mit Eingabe von "v" statt "s" ging dann die Voice-Registrierung. Nach Abschluss war allerdings die Verknüpfung der Signal-App auf meinem Telefon und der Nummer aufgehoben. Wahrscheinlich hatte ich hier einen Denkfehler und hätte stattdessen mit "link" nur meine Nummer verknüpfen sollen. Das habe ich dann im zweiten Schritt gemacht, und der FHEM-Server taucht unter "Gekoppelte Geräte" auf. Allerdings kann ich mir mit der "test"-Option keine Nachricht auf das Telefon schicken lassen. Oder kann ich keine Testnachricht an mich selber schicken?

Viele Grüße,
Daniel

Edit: Jetzt habe ich es hinbekommen. Diesmal habe ich meine Festnetznummer genommen und erfolgreich registriert. Die Tücke war, dass nun noch im Systemd-Script die Nummer per Hand geändert werden musste :-)

BAfH

Hallo Daniel,
ich vermute mal, Du solltest eine neue Rufnummer (z.B. Dein Festnetz) im Signal registrieren. Damit erzeugst Du einen "neuen" Empfänger.
So habe ich das gelöst. Mit Deiner Lösung doppelst Du nur deinen Signal Account.
Gruß Thorben
mit sonnige Grüße aus Schönow

Adimarantis

Habe im Wiki einen Hinweis auf die Link Option und Folgen einer Registrierung eingefügt.
Die "SMS" Option wird in der nächsten Release gefixed (den Pfad hatte ich nie probiert).

Um eine neue Nummer zu hinterlegen, kann man übrigens getrost das Script einfach neu starten (komplett oder Argument "install") - dann wird man gefragt ob man die Config anpassen möchte.

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Deekay2000

Hallo Jörg,

ich habe im Systemd-Script noch eine Änderung vorgenommen. Hintergrund ist, dass auf meinem System der signal.service nach einem Neustart nicht automatisch mitstartete. So sieht meine Install-Section jetzt aus:


[Install]
WantedBy=multi-user.target
Alias=dbus-org.asamk.Signal.service


Jetzt wird der Dienst nach einem Systemneustart mit gestartet.

Ansonsten: Das Script ist echt gut, die Installation hat bis auf die Unschärfe mit der Rufnummerregistrierung einwandfrei bei mir funktioniert. Ich nutze es auf einem RPi4 mit Raspbian Buster.

Viele Grüße,
Daniel

Adimarantis

Danke fürs Feedback.
Die "WantedBy" Anregung habe ich jetzt mal einfach übernommen - du hast es ja getestet :)

Siehe erster Post zu weiteren Updates im Script.

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Adimarantis

Hier mal meine erste Version eines Docker Installers. Getestet habe ich das bisher nur in einer Ubuntu x86 VM (also keine Ahnung ob das mit Raspberry geht).

Grundidee:
- Das Script basiert auf dem Ubuntu/latest docker image
- Am Anfang des Scripts kann man wie üblich die Telefonnummer festlegen
- Außerdem lassen sich dort weitere Pakete konfigurieren (Beispiele z.B. für logdb enthalten, aber noch nicht getestet)
- Es wird ein neues Dockerimage fhem/signal erstellt, worauf der Container "fhem_signal" dann läuft
- Die Verzeichnisse für FHEM und signal-befinden sich außerhalb des Containers, damit Änderungen erhalten bleiben
- Dadurch ist es auch möglich dem Container bestehende FHEM Installationen sowie signal-cli configs mitzugeben

Voraussetzungen:
- Setzen der Variablen am Anfang vom Script: PHONE=zu verwendende Telefonnummer, FHEMUSER=existierende User in der Host Umgebung, FHEMGROUP= existerende Grupppe in der Host Umgebung
- Standardverzeichnis ist ~/fhem
- Bestehende FHEM Umgebung nach ~/fhem/fhem-6.0 oder vom Script eine aktuelle Version von fhem.de installieren lassen
- Bestehende Signal Config (z.B. aus /var/log/signal-cli nach ~/fhem/signal kopieren oder eine neue Registrierung vornehmen
- Script mit "sudo -E ./fhem_signal_docker_install.sh" starten (wenn vorher ein export PHONE=+49xxxx gemacht wurde, sorgt da -E dafür das es auch verwendet wird)

Der Rest ist selbsterklärend. Die initiale Erstellung des Image kann aber eine Weile dauern (schon auf dem PC, auf einem Raspberry wahrscheinlich ewig...)

Wird der Container mal beendet kann er mit
cd ~/fhem
docker-compose up -d

wieder gestartet werden.

mit "sudo -E ./fhem_signal_docker_install.sh remove" wird die Dockerumgebung aufgeräumt und der erstellte Container sowie das Image gelöscht (falls man nochmal ganz neu starten möchte, was z.B. notwendig ist, wenn man weitere Pakete für Module braucht). Da FHEM und signal aber außerhalb liegen, sollten diese davon unberührt bleiben.

Da ich ein rechter Docker "newbie" bin, kann es sein das nicht alles ideal gelöst ist. Anregungen willkommen.
Ich setze bewusst nicht auf dem fhem-docker Projekt (Image fhem/fhem) auf, da mir da zuviel drin ist, was ich nicht brauche.
Übrigens sollte hier nur eine exklusiv verwendete Festnetznummer verwendet werden. Mit eine gelinkten Nummer hatte ich kein Glück, das gab es Fehlermeldungen und er hat nichts empfangen. Andersherum hat meine kopierte Config vom Produktivsystem, zu Fehlern auf dem Produktivsystem geführt. Signal-cli scheint also nicht gut damit zurecht zu kommen wenn es zwei gleiche Empfänger gibt.

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

MarcoE

Hallo,
ein paar Tage lief alles aber jetzt kommen keine Nachrichten mehr. Ubuntu ist aktuell. Fhem läuft. Hab gerade auch noch die aktuellsten Files gezogen und installiert (50_... und signal_install.sh).
von der sh get es mittels:
dbus-send --system --type=method_call --print-reply --dest="org.asamk.Signal" /org/asamk/Signal org.asamk.Signal.sendMessage string:"Test message via DBus" array:: string:+49xxx

via script (signal_install.sh test) geht es auch.

aber in Fhem mittels set signal send @blabla text geht es nicht mehr (wie gesagt bis vor kurzem lief es) sondern es kommt folgende Fehlermeldung:
Error sending message:org.asamk.Signal.Error.Failure: org.whispersystems.signalservice.api.push.exceptions.NotFoundException: Not found

im Log steht auch nicht wirklich viel hilfreiches (verbose ist auf 5):
2021.02.14 17:45:03 3: signal: Before parse:@Nummer Sensoren:

2021.02.14 17:45:03 5: signal: sendMessage called for Nummer::Sensoren


Was könnte das sein? Wie kann ich weiter suchen?

Danke und viele Grüße
Marco

Adimarantis

Zitat von: MarcoE am 14 Februar 2021, 17:46:47
Was könnte das sein? Wie kann ich weiter suchen?

Du könntest mal sehen was im /var/log/syslog steht - da schreibt signal-cli eine Menge rein.
Eventuell einfach mal ein "shutdown restart" von FHEM. Sollte zwar nicht sein, aber mal sehen.
Habe gerade auch noch ein update von Signalbot veröffentlich, das u.a. auch ein paar Feinheiten in der Fehlerbehandlung verbessert.

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Adimarantis

Update V1.2 von Signalbot:

Ich habe jetzt jetzt mal alles an Funktionen die signal-cli über Dbus unterstützt in Signalbot eingebaut (zumindest die, die ich sinnvoll fand).
Leider gehen ja eine Menge Sachen (noch) nicht über das Interface.

Neu:

  • block #gruppe oder contact : Serverseitiges blockieren (wogegen allowedPeer erst bei FHEM blocked)
  • unblock #gruppe oder contact: Vorheriges "block" rückgängig machen
  • createGroup gruppenname : Neue Gruppe erstellen
  • invite gruppenname contact1,contact2.... : Kontakte in Gruppe einladen
  • updateGroup gruppenname neuername : Name der Gruppe ändern
Und bevor jemand fragt - wer eine Gruppe verlassen möchte oder aktiv einer beitreten, muss das CLI bemühen - das gibt's nicht über DBus.

Außerdem gibt es jetzt ein Attribut "babbleExclude" welches ein RegEx von Nachrichten ist, die nicht nach "babble" gehen sollen (z.B. "^/" schickt keine Nachrichten die mit "/" anfangen nach Babble - Events werden aber ausgelöst)
Achso, ein paar keine Bugfixes bzw. abfangen von weiteren Fehlerfällen sind auch noch drin.

Viel Spass beim Testen.
Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

Adimarantis

Signal-Cli update 0.8.0:

signal-cli wurde heute auf eine neue offizielle Version aktualisiert.
Wer die Installation aktualisieren will einfach den neusten Installer aus dem ersten Post holen und mit
sudo -E ./signal_install.sh
starten. Dies ist gefahrlos möglich, ohne Nachfrage wird nichts geändert/aktualisiert. Insbesondere kann die Frage nach der Registrierung verneint werden  um dann ganz normal den Test mit der bestehenden Registrierung zu machen.
Parameter "-E" ist nötig falls die Telefonummer mit
export PHONE=+49xxxxx
gesetzt war. In diesem Fall ist keine Veränderung des Scripts notwendig.

Das Script installiert auch die weitere native Library für Raspberry - aber jetzt werden diese im .jar aktualisiert und nicht mehr nach /usr/lib kopiert. Außerdem gibt es jetzt eine Platz auf fhem.de (Danke Rudi) von dem die beiden lib.so geladen werden.

Ich habe bereits ein wenig mit der neuen Version "gespielt" und erstmal keine Auffälligkeiten entdeckt. Wer aber auf eine stabile Umgebung angewiesen ist, sollte vielleicht auf weitere Tests von "early adopters" warten. Bitte eure Erfahrungen hier posten.

Danke,
Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)

MarcoE

Hallo,
Zitat von: Adimarantis am 14 Februar 2021, 17:51:49
Du könntest mal sehen was im /var/log/syslog steht - da schreibt signal-cli eine Menge rein.
Eventuell einfach mal ein "shutdown restart" von FHEM. Sollte zwar nicht sein, aber mal sehen.
Habe gerade auch noch ein update von Signalbot veröffentlich, das u.a. auch ein paar Feinheiten in der Fehlerbehandlung verbessert.

Jörg
hm- jetzt geht es wieder ohne das ich wissentlich etwas verändert hätte. Dann installiere ich auf jeden Fall mal die updates und beim nächsten Problem suche ich weiter.

Viele Grüsse
Marco

enno

Moin Jörg,

irgend etwas fehlt bei meinem System. Ich bekomme eine Fehlermeldung wenn ich sudo ./signal_install.sh starte. Ich habe mal gegoogelt, aber noch keine Lösung gefunden... sudo: ./signal_install.sh: command not found
nun starte ich halt mit sudo bash signal_install.sh

Damit läuft es durch aber:Sending a message via dbus-send command
method return time=1613385994.085536 sender=:1.73 -> destination=:1.74 serial=6 reply_serial=2
   int64 1613385993121
Sending a message via perl Net::DBus
org.asamk.Signal.Error.Failure: org.whispersystems.signalservice.api.push.exceptions.NotFoundException: Not found


Gruss
  Enno
Einfacher FHEM Anwender auf Intel®NUC

Adimarantis

Hallo Enno,

Zwei Dinge sind wichtig damit das geht

1.) Du hast die bash in "/bin/bash" installiert (das script fordert dies in der ersten Zeile mit #!/bin/bash an)
2.) Das script hat "x" Rechte (ggf. chmod u+x machen)

Jörg
Raspberry 4 + HM-MOD-RPI-PCB (pivCCU) + RfxTrx433XL + 2xRaspberry 1
Module: 50_Signalbot, 52_I2C_ADS1x1x , 58_RPI_1Wire, (50_SPI_MAX31865)