Zoom is a security and privacy disaster, […] In the meantime, you should either lock Zoom down as best you can, or — better yet — abandon the platform altogether.
Quelle: Security and Privacy Implications of Zoom
Donnerstag, 9. April 2020
Zoom is a security and privacy disaster, […] In the meantime, you should either lock Zoom down as best you can, or — better yet — abandon the platform altogether.
Quelle: Security and Privacy Implications of Zoom
Tags: Sicherheit, Software, Videokonferenz, Vulnerability, Zoom
Labels: IT
Sonntag, 1. März 2020
Emails von der Kommandozeile versenden — was man bei Linux im Handumdrehen hinkriegt, erforderte bei mir unter macOS stundenlange Handstände.
Doch jetzt habe ich den Kniff raus: Die von macOS mitgelieferte postfix-Installation habe ich schlussendlich ignoriert und auf das MacPorts postfix-Paket gesetzt.
Der erste Fallstrick lauert schon hier: Um heutzutage über einen Hoster E-Mails zu versenden, benötigt man zwingend SASL und TLS. Diese Features müssen als sog. MacPorts Variants explizit mitinstalliert werden, sonst landen sie nicht auf dem Mac:
# port install postfix +sasl +tls
Ansonsten meldet postfix:
... Mar 01 14:16:11 imac postfix/smtp[70687]: warning: smtp_sasl_auth_enable is true, but SASL support is not compiled in Mar 01 14:16:11 imac postfix/smtp[70687]: warning: TLS has been selected, but TLS support is not compiled in ...
Eine funktionierende postfix-Konfiguration mitsamt Installationsscript habe ich von meinen Linux-Servern herüberkopiert (diese Anleitung alleine würde das Format dieses Blog-Artikels sprengen). Die Konfiguration habe ich aber mit den MacPorts-Einstellungen ergänzt. Denke daran: Bei Linux liegen die Konfiguration sowie die Arbeitsverzeichnisse allesamt am erwarteten Ort (bspw. /etc/postfix/main.cf). Da wir unter macOS auf MacPorts setzen, liegt dieselbe Datei hier unter /opt/local/etc/postfix/main.cf. Deshalb habe ich zur Sicherheit in main.cf folgende von MacPorts vorgeschlagene Ergänzungen (siehe /opt/local/etc/postfix/main.cf.sample) hinzugefügt:
$ cat /opt/local/etc/postfix/main.cf # Directories queue_directory = /opt/local/var/spool/postfix command_directory = /opt/local/sbin daemon_directory = /opt/local/libexec/postfix data_directory = /opt/local/var/lib/postfix meta_directory = /opt/local/etc/postfix manpage_directory = /opt/local/share/man sample_directory = /opt/local/share/postfix/sample readme_directory = /opt/local/share/postfix/readme shlib_directory = no html_directory = no # Paths sendmail_path = /opt/local/sbin/sendmail newaliases_path = /opt/local/bin/newaliases mailq_path = /opt/local/bin/mailq # Log maillog_file_prefixes = /var, /var/log/macports/postfix maillog_file = /var/log/macports/postfix/postfix.log # Other stuff ... mail_owner = _postfix setgid_group = _postdrop default_privs = nobody unknown_local_recipient_reject_code = 550 debug_peer_level = 2 ...
Weiter hatte ich während dem Debuggen so meine liebe Mühe, die Logging-Informationen zu finden, da diese an syslog gesendet werden und bei macOS dann in der Console.app landen. Deshalb habe ich im Gegensatz zu meinen Linux-Installationen auch noch die Konfigurationsdatei /opt/local/etc/postfix/master.cf anpassen müssen. Essentiell war es, die folgende Zeile einzufügen:
... postlog unix-dgram n - n - 1 postlogd ...
Quelle: Postfix logging to file or stdout
Damit mir die Parallelinstallation von Postfix nicht in die Quere kommt und ich mir sicher war, dass die MacPorts-Installation von postfix tatsächlich die Konfiguration unter /opt frisst, habe ich kurzerhand den macOS postfix-Ordner verschoben:
# mv /etc/postfix /etc/postfix.bkp
Ob das wirklich nötig gewesen wäre sei dahingestellt; Vorsicht, wer das auf seinem System macht: Ich garantiere für nichts.
Die Postfix-Installation lädt man folgendermassen:
# port load postfix # launchctl unload /Library/LaunchDaemons/org.macports.postfix.plist # launchctl load -w /Library/LaunchDaemons/org.macports.postfix.plist
Die plist-Datei zeigt als symbolischer Link nach /opt/local/etc/LaunchDaemons/org.macports.postfix/org.macports.postfix.plist. In dieser Datei habe ich folgendes angepasst/ergänzt — das ist nicht zwingend nötig, sollte aber dazu führen, dass Postfix bei jedem Neustart automatisch gestartet wird. Ausserdem sollten im Fall von Start-Problemen Fehlermeldungen in eine Log-Datei geschrieben werden:
...
<string>--pid=none</string>
</array>
<key>Disabled</key>
<false/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/var/log/launchd.macports.postfix.standard.log</string>
<key>StandardErrorPath</key>
<string>/var/log/launchd.macports.postfix.error.log</string>
</dict>
</plist>
Anschliessend musste noch eine Mail-Programm her, welches erlaubt, den Absender eines E-Mails selber zu setzen. MacPorts bietet hierzu s-nail an (Homepage des Entwicklers).
# port install s-nail
Als ich mit s-nail ein Test-Mail versenden wollte folgte eine weitere Hiobs-Botschaft:
$ echo "Test email" | mail user@domain.tld unknown: fatal: open /etc/postfix/main.cf: No such file or directory /Users/user/dead.letter 7/135 mail: ... message not sent
Ich übertreibe nicht, wenn ich sage, dass ich Stunden mit Debugging verbracht habe. Bis ich plötzlich realisierte, dass s-nail die offiziellen Mail-Executables mail, mailx und/oder sendmail unter /usr/bin verwendet. Der Lackmus-Test: Wenn ich diese Mail-Executables manuell aufrief, erschien ein- und dieselbe Fehlermeldung.
Dies obwohl meine Bash PATH-Variable /opt/local/bin und /opt/local/sbin vor /usr/bin und /usr/sbin nennt, verwendete s-nail aus irgendeinem Grund standardmässig die letztgenannten Pfade.
Wie sage ich s-nail aber, dass es stattdessen die MacPorts mail-Befehle verwenden soll? Folgende Anpassung in /opt/local/etc/mail.rc war nötig:
... set mta=/opt/local/sbin/sendmail
Anschliessend musste noch eine Mail-Programm her, welches erlaubt, den Absender eines E-Mails selber zu setzen. Ich verwende in Bash-Scripts sehr oft folgendes Konstrukt, und ich wollte sicherstellen, dass die Scripts sowohl unter Debian GNU/Linux als auch macOS laufen (Argument -a):
$ echo -e "Test" | $(which mail) -a "From: DNS Query Analyzer" -s 'Top 25 DNS Queries' user@domain.tld another.user@domain.tld
Ich habe leider eine schlechte, aber auch eine gute Nachricht. Die gute: Man kann auch unter macOS den Absender setzen. Leider aber nicht mit demselben Befehl wie unter Debian GNU/Linux.
Bei s-nail muss ich leider ein anderes Argument verwenden:
$ echo -e "Test" | $(which mail) -r "DNS Query Analyzer" -s 'Top 25 DNS Queries' user@domain.tld another.user@domain.tld
Doch nun trat bereits das nächste Problem auf, wie ein Blick in die leere INBOX und in /var/log/macports/postfix.log zeigte:
... Mar 01 15:43:59 imac postfix/smtp[81049]: 4D0E3FBBE221: to=<user@domain.tld>, relay=s000.cyon.net[149.126.4.000]:25, delay=20, delays=0.03/20/0.03/0.04, dsn=5.0.0, status=bounced (host s000.cyon.net[149.126.4.000] said: 550 SPF: 1.2.3.4 is not allowed to send mail from emeidi.com (in reply to RCPT TO command)) ...
Faszinierend. Unter Linux hatte ich eine solche Fehlermeldung noch nie gesehen. Ich verwende für den Versand „offizieller“ E-Mails jeweils emeidi.com als Absenderadresse.
Schlussendlich blieb nur die Holzhammer-Methode. Ich verschob alle Konfigurationsdateien, welche auf meinen Linux-Installationen nicht existierten, von /opt/local/etc/postfix in den Unterordner _old. Schlussendlich sah das Verzeichnis so aus:
$ find /opt/local/etc/postfix/opt/local/etc/postfix /opt/local/etc/postfix/_old /opt/local/etc/postfix/_old/access /opt/local/etc/postfix/_old/access.sample /opt/local/etc/postfix/_old/aliases /opt/local/etc/postfix/_old/aliases.sample /opt/local/etc/postfix/_old/bounce.cf.default /opt/local/etc/postfix/_old/canonical /opt/local/etc/postfix/_old/canonical.sample /opt/local/etc/postfix/_old/generic /opt/local/etc/postfix/_old/generic.sample /opt/local/etc/postfix/_old/header_checks.sample /opt/local/etc/postfix/_old/LICENSE /opt/local/etc/postfix/_old/main.cf.default /opt/local/etc/postfix/_old/main.cf.proto /opt/local/etc/postfix/_old/main.cf.sample /opt/local/etc/postfix/_old/master.cf.proto /opt/local/etc/postfix/_old/master.cf.sample /opt/local/etc/postfix/_old/relocated /opt/local/etc/postfix/_old/relocated.sample /opt/local/etc/postfix/_old/TLS_LICENSE /opt/local/etc/postfix/_old/transport /opt/local/etc/postfix/_old/transport.sample /opt/local/etc/postfix/_old/virtual /opt/local/etc/postfix/_old/virtual.sample /opt/local/etc/postfix/header_checks /opt/local/etc/postfix/main.cf /opt/local/etc/postfix/makedefs.out /opt/local/etc/postfix/master.cf /opt/local/etc/postfix/postfix-files /opt/local/etc/postfix/sasl /opt/local/etc/postfix/sasl/outgoing /opt/local/etc/postfix/sasl/outgoing.db
In sasl/outgoing entfernte ich zudem den TCP-Port nach der Server-Adresse, und master.cf ergänzte ich mit Zeilen, die bisher nur unter Linux existierten.
Und jetzt endlich kann ich mir von der Kommandozeile aus E-Mails senden. Hat nur geschlagene sechs Stunden gedauert.
Tags: From, High Sierra, macOS, macOS High Sierra, MacPorts, Mail, mail.rc, mailq, mailx, main.cf, master.cf, postfix, s-nail, SASL, sendmail, SPF, TLS
Labels: Apple, IT
Montag, 10. Februar 2020
Mein Dashboard zu Hause läuft auf einem Raspberry Pi 3 mit Debian Buster 10.2. Der RPi lädt beim morgendlichen Neustart um Punkt 05:00 Uhr den Chromium-Browser, welcher die Web-Site mit dem Dashboard aufruft.
Seit ein paar Tagen zeigt Chromium oben rechts ein Layover mit folgender Meldung an:
Can’t update Chromium
Chromium couldn’t update to the latest version, so you’re missing out on new features and security fixes.
(da ich selber kein Photo des Dashboards angefertigt habe, verlinke ich hier auf einen Screenshot eines anderen Benutzers aus dem Internet)
Da Debian kein Update von Chromium anbietet, hilft ein apt-get upgrade chromium hier leider nicht weiter.
Das Symptom behebt man, indem man Chromium mit einem zusätzlichen Kommandozeilenargument startet — nachfolgend ein Auszug aus /home/pi/.config/lxsession/LXDE-pi/autostart:
... @chromium-browser --no-default-browser-check --check-for-update-interval=604800 --disable-pinch --incognito --kiosk
Den Tipp mit --check-for-update-interval=604800 (Eintrag in der Liste der Kommandozeilenargumente) habe ich auf Stack Overflow in der Frage Disable “chrome is out of date” notification gefunden.
Da man als verantwortungsvoller SysAdmin entweder Debian unattended-upgrades respektive cron-apt (Vergleich) eingerichtet hat, oder sich zumindest automatisiert über Paket-Aktualisierungen informieren lässt, ist diese Symptombekämpfung vertretbar.
Die Entwickler von Chromium könnten sich meiner bescheidenen Meinung nach überlegen, ob es nicht besser wäre, nur dann eine Meldung anzuzeigen, wenn auch tatsächlich ein Update verfügbar ist. Denn die Meldung erscheint rein basierend auf dem Alter der Applikation, nicht basierend darauf, ob eine neue Version verfügbar ist:
there’s background process that checks the build date against the current time, and will start to complain if it’s more than 12 weeks ago.
Quelle: Debian Bug report logs – #943668 Getting „Can’t update Chromium“ notifications
Tags: Chromium, Dashboard, Raspberry Pi, Raspbian, RPi, RPi3
Labels: IT
Donnerstag, 23. Januar 2020
Ein Bash-Script, welches täglich meine SVN-Logs auf unerwartete Zugriffe durchgeht, meldete mir gestern:
... 1 Binary file (standard input) matches ...
Dabei handelt es sich um eine Meldung von grep, mit welchem ich die Apache-Logs filtere. Offenbar enthält das Access Log von dieser Woche Inhalte, die grep glauben machen, dass es sich um eine Binärdatei und nicht um eine ASCII/UTF-8-Datei handelt. In Durchgängen in früheren Monaten und Wochen trat dieses Problem nicht auf.
Wenn man sich sicher ist, dass man grep ASCII-Daten füttert, kann man dies mit einem Argument forcieren:
$ grep --text README.txt
So klappt die Auswertung nun auch wieder mit meinem Bash-Script.
Gemäss diesem Unix & Linux Stack Exchange-Artikel erachtet grep eine Datei als Binär, wenn es erstmalig auf das NUL-Zeichen trifft.
Tags: --text, ASCII, Binärdaten, Binary, grep, UTF-8
Labels: IT
Sonntag, 19. Januar 2020
Kürzlich hat ein Bekannter ein zweites Stockwerk mit Netzwerkverkabelung erschlossen. Hierzu haben wir nicht Ethernet Cat6 gewählt, sondern wegen der Grösse der Lehrrohre auf Glasfaser gesetzt.
Dies bedingt leider aber auch, dass an beiden Enden des Glasfasers SFP-Module verwendet werden müssen, die die Lichtwellen auf Ethernet konvertieren.
Ich habe mich auf der einen Seite für einen gebrauchten Ubiquiti Unifi Switch US-8-150W entschieden, auf der anderen Seite ein bei mir nach Fiber7-Tests unbenutzt herumliegender TP-Link MC220L, der im Modus Auto mit Ethernet auf einen Ubiquiti Unifi Switch US-8-60W gepatcht ist. Als SFP-Module verwende ich beidseitig Ubiquiti UF-SM-1G-S. Als Kabel hat der Bekannte ein Lightwin LWL-Patchkabel LC/APC-LC, Singlemode, Simplex, 15m gezogen.
Aktuell erreiche ich mit diesem Setup auf Seite des US-8-150W folgende Signal-Werte:
Das SFP-Modul ist 47 Grad Celsius warm, die Spannung beträgt 3.284 Volt und der Strom beträgt 31.890 mA. Diese Infos kann man allesamt in Echtzeit über die UniFi Controller-Software auslesen.
Leider habe ich keine Ahnung, ob diese Werte gut oder schlecht sind …
Tags: Fiber, Glasfaser, LC/APC-LC, Lightwin, LWL, MC220L, TP-LINK, Ubiquiti, UniFi, US-8-150W, US-8-60W
Labels: IT
Sonntag, 12. Januar 2020
Ein Bekannter plant derzeit, die Stockwerke seiner Immobilie mit Ethernet- oder Glasfaser-Kabeln zu erschliessen.
Da hatte ich eine zündende Idee: Da der Bekannte upc cablecom-Kunde ist, könnte man nach der Verkabelungsaktion das Kabelmodem von der Stube im 1. OG in den Keller zügeln, wo der Verstärker angebracht ist. Ich erhoffte mir davon höhere Bandbreiten beim Up- und Download, da ich der Qualität der Verkabelung vom Verstärker zur Stube nicht traue. Je näher das Modem am Verstärker ist, desto weniger leistungsschwächende Interferenzen erhoffte ich mir.
Nachdem das Modem zum Verstärker gezügelt worden wäre, hätte man nur noch ein Netzwerkkabel vom Kabelmodem zum Stockwerks-Switch ziehen müssen und die Bewohner wären in den Genuss schnellerer Bandbreiten gekommen.
Falsch gedacht. Eine kurze Google-Recherche lotste mich auf folgende Forumsdiskussion:
Einfach so an den Verstärker anschließen geht nicht. Das Modem ist von genau definierten Pegelwerten abhängig, d.h. Deine vom Techniker gesetzte Dose wurde eingemessen. Bei dieser Einmessung fanden das zur Dose führende Kabel und die Dose selbst Berücksichtigung.
[…] [Die Installation einer neuen Kabeldose] sollte jemand machen der Ahnung von Kabelanlagen, Dämpfungen und Rückkanal hat.
Quelle: Kabelmodem direkt mit dem UM-Gerät im Keller verbinden
Tags: Kabelmodem, Unitymedia, upc, Verstärker
Labels: IT
Montag, 16. Dezember 2019
Seit ein paar Monaten steht in unserer Wohnung der erste richtig „smarte“ TV, ein Sony KD-55AF8, auf welchem mittlerweile Android TV 8.0 installiert ist.
Seit gestern analysiere ich die DNS-Queries, die von Netzwerkgeräten im LAN an den lokalen DNS-Forwarder gestellt werden sowohl quantitativ (welche Domains werden am meisten aufgelöst, welches Gerät setzt die meisten Queries ab und in welcher Stunde des Tages gibt es die meisten Queries) sowie qualitativ (werden von SANS als Suspicious eingestufte Domains aufgelöst, was ein Zeichen für Malware-Befall sein könnte). Ich war nicht schlecht überrascht, dass ein TV-Gerät, welches allerhöchsten zwei von 24 Stunden im Tag „läuft“, der Spitzenreiter aller Queries ist. Ich zählte innerhalb von 24 Stunden sage und schreibe 90’498 Queries. Gefolgt wurde der TV vom Server selber, auf welchem der DNS-Server läuft mit 72’411 Queries. Auf Platz drei dann ein Client mit noch 7’162 Queries.
Heute nun nahm mich Wunder, was zum Teufel der TV ständig abzufragen hat. Hier das Resultat der Analyse der named-Logs vom Vortag (10.1.2.3 ist die (fiktive) IPs meines TVs):
$ cat queries.log.1 | grep 10.1.2.3 | cut -d "(" -f 2 | cut -d ")" -f 1 | sort | uniq -c | sort -rn
13052 cdn-0.nflximg.com
9112 nrdp51-appboot.netflix.com
8777 api-global.netflix.com
8564 uiboot.netflix.com
8487 ichnaea.netflix.com
8332 customerevents.netflix.com
8262 nrdp.nccp.netflix.com
6970 secure.netflix.com
6886 nrdp.prod.ftl.netflix.com
3115 push.prod.netflix.com
1556 occ-0-593-769.1.nflxso.net
1284 clients3.google.com
1220 connectivitycheck.gstatic.com
1196 www.google.com
1195 mtalk.google.com
994 nrdp52-appboot.netflix.com
324 events.cid.samba.tv
162 us.edge.bamgrid.com
142 watch.product.api.espn.com
118 clients4.google.com
109 androidtvchannels-pa.googleapis.com
105 footprints-pa.googleapis.com
91 fling.cid.samba.tv
83 www.youtube.com
52 mdh-pa.googleapis.com
41 clientservices.googleapis.com
37 www.googleapis.com
35 play.googleapis.com
34 platform.cid.samba.tv
28 android.googleapis.com
13 www.gstatic.com
12 youtubei.googleapis.com
10 static.doubleclick.net
7 www.netflix.com
7 android.clients.google.com
6 api-cdn.arte.tv
5 lh3.googleusercontent.com
5 antv-26-sony-bravia4kgbatv3-414000300.api.amazonvideo.com
4 sdk.hockeyapp.net
4 middleware.7tv.de
4 devices.ted.com
4 cdn-gl.imrworldwide.com
4 android.googleapis.com
3 zdf-cdn.live.cellular.de
3 geoloc.arte.tv
3 geocheck.sim-technik.de
3 config.ioam.de
3 cdn.meta.ndmdhs.com
3 bam-sdk-configs.bamgrid.com
2 sdk.imrworldwide.com
2 api.meta.ndmdhs.com
1 www.sony.net
1 www.sony-asia.com
1 voledevice-pa.googleapis.com
1 update.biv.sony.tv
1 time.android.com
1 static-cdn.arte.tv
1 sportscenter.api.espn.com
1 secure.espncdn.com
1 safebrowsing.googleapis.com
1 r4---sn-1gieen7e.gvt1.com
1 people-pa.googleapis.com
1 ocsp.int-x3.letsencrypt.org
1 metadata.erabu.sony.tv
1 log.core.cloud.vewd.com
1 isrg.trustid.ocsp.identrust.com
1 images.erabu.sony.tv
1 fls-na.amazon.com
1 cloudfront.xp-assets.aiv-cdn.net
1 cert-cdn.meta.ndmdhs.com
1 cdn.espn.com
1 browserjs-legacy.core.cloud.vewd.com
1 broadband.espn.com
1 bravia-cfgdst-ore-pro.bda.ndmdhs.com
1 bdcore-apr-lb.bda.ndmdhs.com
1 app-measurement.com
1 api.erabu.sony.tv
1 api.auth.adobe.com
1 ajax.googleapis.com
Netflix führt die Statistik unangefochten an:
$ cat queries.log.1 | grep 10.1.2.3 | cut -d "(" -f 2 | cut -d ")" -f 1 | sort | uniq -c | sort -rn | grep -i "netflix\|nflx"
13052 cdn-0.nflximg.com
9112 nrdp51-appboot.netflix.com
8777 api-global.netflix.com
8564 uiboot.netflix.com
8487 ichnaea.netflix.com
8332 customerevents.netflix.com
8262 nrdp.nccp.netflix.com
6970 secure.netflix.com
6886 nrdp.prod.ftl.netflix.com
3115 push.prod.netflix.com
1556 occ-0-593-769.1.nflxso.net
994 nrdp52-appboot.netflix.com
7 www.netflix.com
Von den täglich über 90’000 Queries entfallen über 90 Prozent auf Netflix-Domains:
$ cat queries.log.1 | grep 10.1.2.3 | grep -i "netflix\|nflx" | wc -l 84114
Dabei schauen wir — wenn überhaupt — mit der Netflix-App auf dem Apple TV 4K mit einer anderen IP Netflix, und nie mit der Android TV App.
Netflix, shame on you! Die Frage, wieso die Netflix-App das macht, konnte ich bis jetzt noch nicht beantworten, werde es hier aber nachtragen, sollte ich es erfahren.
Tags: Android, Android TV, cat, cut, DNS, Flood, Flooding, grep, named, Netflix, OLED, Queries, SANS, Sony, sort, uniq, wc, wc -l
Labels: IT
Dienstag, 3. September 2019
Gestern wollte ich mir MacTeX 2019 herunterladen (veröffentlicht im Mai 2019). Das macOS Installations-Package für die LaTeX-Distribution ist mittlerweile sagenhafte 3.9 GB gross.
Als ich den Link tug.org/cgi-bin/mactex-download/MacTeX.pkg auf der offiziellen Download-Seite anklickte, tröpfelten die Daten nur Kilobyte-weise rein.
Nach etwas Recherche (einen Torrent-Link fand ich auf die Schnelle leider nicht) stiess ich dann auf die Homepage der Distribution auf CTAN. Dort wird stattdessen der Link mirrors.ctan.org/systems/mac/mactex/MacTeX.pkg angeboten, der per Zufall (oder nach geographischen Kriterien?) einen Mirror zum Download auswählt. Über den gestern Abend gewählten Mirror erreichte ich dann Download-Geschwindigkeiten von bis zu 10 MB/s und hatte das Paket dementsprechend in ein paar Minuten heruntergeladen. Der Web-Download über den offiziellen Link war zu dem Zeitpunkt erst bei 189 MB angelangt …
Sonntag, 21. Juli 2019
Mittels eines „manuellen“ Canary-Releases habe ich vor einer Woche einen meiner Linux-Server hier im Haus von Debian 9 „Stretch“ auf Debian 10 „Buster“ migriert.
Wie es zu erwarten war, klappte das nicht ganz ohne Schluckauf. Beispielsweise schaltet sich der Monitor meines Lenovo ThinkPads X201 (P/N 3626GN7) nicht mehr automatisch aus. Leider habe ich die Lösung im Internet noch nicht gefunden.
Das beunruhigendste Problem war aber folgende Fehlermeldung von monit, die nach der Neukompilierung von pixelserv-tls mit Debian 10 „Buster“ in meinem Postfach landete:
Connection failed Service pixelserv-tls Date: Mon, 15 Jul 2019 22:44:25 Action: restart Host: ADBLOCKER Description: failed protocol test [HTTP] at [10.1.2.3]:443 [TCP/IP TLS] -- SSL connection error: error:14094438:SSL routines:ssl3_read_bytes:tlsv1 alert internal error Your faithful employee, Monit
Der Aufruf der Statusseite unter http://10.1.2.3/servstats funktionierte ebenfalls nicht.
Am letzten Freitag fand ich nun etwas Zeit, um das Problem genauer anzuschauen.
pixelserv-tls hat seit Monaten keine Anpassung mehr erfahren — beim Abgleich meiner Sourcen mit denjenigen auf GitHub gab es nur in cert.c eine Anpassung, die ich einspielte, aber eigentlich nichts mit dem hier beschriebenen Problem zu tun hat.
Eine Ursache für das Problem war aber, dass die OpenSSL-Library, gegen welche pixelserv-tls kompiliert wird, aktualisiert worden war. Auf einem System mit Stretch (stable) waren installiert …
# dpkg --list | grep -i ssl ii libcurl3:amd64 7.52.1-5+deb9u9 amd64 easy-to-use client-side URL transfer library (OpenSSL flavour) ii libcurl4-openssl-dev:amd64 7.52.1-5+deb9u9 amd64 development files and documentation for libcurl (OpenSSL flavour) ii libflac8:amd64 1.3.2-1 amd64 Free Lossless Audio Codec - runtime C library ii libgnutls-openssl27:amd64 3.5.8-5+deb9u4 amd64 GNU TLS library - OpenSSL wrapper ii libio-socket-ssl-perl 2.044-1 all Perl module implementing object oriented interface to SSL sockets ii libnet-smtp-ssl-perl 1.04-1 all Perl module providing SSL support to Net::SMTP ii libnet-ssleay-perl 1.80-1 amd64 Perl module for Secure Sockets Layer (SSL) ii libssl-dev:amd64 1.1.0j-1~deb9u1 amd64 Secure Sockets Layer toolkit - development files ii libssl-doc 1.1.0j-1~deb9u1 all Secure Sockets Layer toolkit - development documentation ii libssl1.0.0:amd64 1.0.1t-1+deb8u6 amd64 Secure Sockets Layer toolkit - shared libraries ii libssl1.0.2:amd64 1.0.2r-1~deb9u1 amd64 Secure Sockets Layer toolkit - shared libraries ii libssl1.1:amd64 1.1.0j-1~deb9u1 amd64 Secure Sockets Layer toolkit - shared libraries ii mitmproxy 0.18.2-6 all SSL-capable man-in-the-middle HTTP proxy ii openssl 1.1.0j-1~deb9u1 amd64 Secure Sockets Layer toolkit - cryptographic utility ii perl-openssl-defaults:amd64 3 amd64 version compatibility baseline for Perl OpenSSL packages ii python-backports.ssl-match-hostname 3.5.0.1-1 all Backport of the Python 3.5 SSL hostname checking function ii python-brotli 0.5.2+dfsg-2 amd64 lossless compression algorithm and format (Python 2 version) ii python-certifi 2016.2.28-1 all root certificates for validating SSL certs and verifying TLS hosts ii python-openssl 16.2.0-1 all Python 2 wrapper around the OpenSSL library ii python-passlib 1.7.0-2 all comprehensive password hashing framework ii python-service-identity 16.0.0-2 all Service identity verification for pyOpenSSL (Python 2 module) ii ssl-cert 1.0.39 all simple debconf wrapper for OpenSSL
… auf dem neuen System war hingegen installiert:
# dpkg --list | grep -i ssl ii libcurl4:amd64 7.64.0-4 amd64 easy-to-use client-side URL transfer library (OpenSSL flavour) ii libgnutls-openssl27:amd64 3.6.7-4 amd64 GNU TLS library - OpenSSL wrapper ii libio-socket-ssl-perl 2.060-3 all Perl module implementing object oriented interface to SSL sockets ii libnet-smtp-ssl-perl 1.04-1 all Perl module providing SSL support to Net::SMTP ii libnet-ssleay-perl 1.85-2+b1 amd64 Perl module for Secure Sockets Layer (SSL) ii libssl-dev:amd64 1.1.1c-1 amd64 Secure Sockets Layer toolkit - development files ii libssl-doc 1.1.1c-1 all Secure Sockets Layer toolkit - development documentation ii libssl1.0.0:amd64 1.0.1t-1+deb8u7 amd64 Secure Sockets Layer toolkit - shared libraries ii libssl1.1:amd64 1.1.1c-1 amd64 Secure Sockets Layer toolkit - shared libraries ii libzstd1:amd64 1.3.8+dfsg-3 amd64 fast lossless compression algorithm ii mitmproxy 4.0.4-5 all SSL-capable man-in-the-middle HTTP proxy ii openssl 1.1.1c-1 amd64 Secure Sockets Layer toolkit - cryptographic utility ii perl-openssl-defaults:amd64 3 amd64 version compatibility baseline for Perl OpenSSL packages ii python3-brotli 1.0.7-2 amd64 lossless compression algorithm and format (Python 3 version) ii python3-certifi 2018.8.24-1 all root certificates for validating SSL certs and verifying TLS hosts (python3) ii python3-openssl 19.0.0-1 all Python 3 wrapper around the OpenSSL library ii python3-passlib 1.7.1-1 all comprehensive password hashing framework ii ssl-cert 1.0.39 all simple debconf wrapper for OpenSSL
Relevant ist das Paket libssl-dev — auf Stretch war die Library 1.1.0j-1~deb9u1, in Buster 1.1.1c-1. Gegen diese kompiliert pixelserv-tls.
Um Probleme mit TLSv1.3 auszuschliessen, hackte ich util.h und stellte das Script so ein, dass TLSv1.3-Support nie einkompiliert wird:
... # ifdef TLS1_3_VERSION # define FEAT_TLS1_3 " no_tls1_3" # else # define FEAT_TLS1_3 " no_tls1_3" # endif ...
Leider half dies nichts zur Lösung des Problems.
Indem man pixelserv-tls ausführt, erfährt man, ob TLSv1.3 einkompiliert ist oder nicht:
$ pixelserv-tls --help pixelserv-tls 2.2.1 (compiled: Jul 15 2019 22:34:41 flags: tfo tls1_3) ...
Respektive:
$ pixelserv-tls --help pixelserv-tls 2.2.1 (compiled: Jul 15 2019 22:48:04 flags: tfo no_tls1_3) ...
Dasselbe erfährt man auch in error.log, wenn pixelserv-tls gestartet wird:
... Jul 19 19:52:46 localhost pixelserv-tls[28352]: pixelserv-tls 2.2.1 (compiled: Jul 19 2019 19:51:13 flags: tfo no_tls1_3) options: 10.1.2.3 -u root -p 80 -k 443 -l 5 -z /tmp/pixelserv ...
Zuerst vermutete ich ein Problem mit AppArmor, welches in Debian 10 out-of-the-box aktiviert ist und läuft. Doch nachdem ich mich ein wenig eingelesen hatte, war mir klar, dass AppArmor nur dann zur Anwendung kommt, wenn ein entsprechendes Applikationsprofil erstellt wurde. Auch scheint es keine Standardeinstellungen zu geben, die auf alle Prozesse angewendet werden.
Basierend auf den lokalen Einstellungen loggt pixelserv-tls mehr oder weniger hilfreiche Informationen in das syslog. Auf Grund der von mir temporär gewählten Kommandozeilenoption -l 4 („4“ steht für den Loglevel „info“) las ich dort:
$ tail -f /var/log/error.log ... Jul 19 19:04:00 localhost pixelserv-tls[22361]: create_child_sslctx: cannot find or use $CERTDIR/_.google-analytics.com Jul 19 19:04:00 localhost pixelserv-tls[22361]: tls_clienthello_cb: fail to create sslctx or cache _.google-analytics.com ...
Fragezeichen über Fragezeichen — haben wir ein Problem mit den Zertifikatsdateien?
Dann vermutete ich Probleme beim Lesen und Schreiben der Zertifikate, obwohl ich an der Ordnerstruktur und den Ordner- und Dateiberechtigungen nichts geändert hatte. Sowohl das Starten von pixelserv-tls mit der Option -u root (normalerweise läuft pixelserv-tls unter „nobody“ — Sicherheitstechnisch eine sehr weise Einstellung, da die Software wie auch OpenSSL Schwachstellen aufweisen könnten, die dann jeder im lokalen Netzwerk ausnützen könnte) als auch das Verschieben des Zertifikatsordner nach /tmp/pixelserv lösten das Problem nicht.
Auch die Verwendung von strace — einem Werkzeug, das ich nur bei ganz hartnäckigen Problemen zur Anwendung kommen lasse, zeigte keinen Hinweis, der mich auf die richtige Fährte gebracht hätte. Was ich lernte: Mittels der Option -p kann man sich bei strace in einen bereits laufenden Prozess „einklinken“. Hier das Resultat
# strace -p %PID%
...
select(8, [5 6 7], NULL, NULL, NULL) = 1 (in [6])
accept(6, {sa_family=AF_INET, sin_port=htons(64242), sin_addr=inet_addr("10.0.1.102")}, [16]) = 9
fcntl(9, F_GETFL) = 0x2 (flags O_RDWR)
fcntl(9, F_SETFL, O_RDWR) = 0
setsockopt(9, SOL_TCP, TCP_NODELAY, [1], 4) = 0
setsockopt(9, SOL_SOCKET, SO_RCVTIMEO, "\0\0\0\0\0\0\0\0\360I\2\0\0\0\0\0", 16) = 0
getsockname(9, {sa_family=AF_INET, sin_port=htons(443), sin_addr=inet_addr("10.1.2.3")}, [128->16]) = 0
read(9, "\26\3\1\0\353", 5) = 5
read(9, "\1\0\0\347\3\3n\277\307zl\26\2155A\257@\nFK\272\326x:Z\320\32:\347\32\2\217"..., 235) = 235
stat("/usr/local/apps/pixelserv/certs/_.optimizely.com", {st_mode=S_IFREG|0644, st_size=1596, ...}) = 0
openat(AT_FDCWD, "/usr/local/apps/pixelserv/certs/_.optimizely.com", O_RDONLY) = 10
fstat(10, {st_mode=S_IFREG|0644, st_size=1596, ...}) = 0
read(10, "-----BEGIN CERTIFICATE-----\nMIIB"..., 4096) = 1596
close(10) = 0
getpid() = 23461
sendto(3, "<27>Jul 19 19:21:47 pixelserv-tl"..., 131, MSG_NOSIGNAL, NULL, 0) = 131
getpid() = 23461
sendto(3, "<27>Jul 19 19:21:47 pixelserv-tl"..., 109, MSG_NOSIGNAL, NULL, 0) = 109
write(9, "\25\3\3\0\2\2P", 7) = 7
getpid() = 23461
sendto(3, "<28>Jul 19 19:21:47 pixelserv-tl"..., 141, MSG_NOSIGNAL, NULL, 0) = 141
shutdown(9, SHUT_RDWR) = 0
close(9)
Da sah alles Bestens aus — das Zertifikat kann gelesen werden, wie die erste Zeile read(10, "-----BEGIN CERTIFICATE-----\nMIIB"..., 4096) = 1596
verdeutlicht.
Als nächstes muss man sich in solchen hartnäckigen Fällen mit dem Source-Code auseinandersetzen. Ich durchsuchte das GitHub-Repository nach folgender Fehlermeldung: „cannot find or use“. Fündig wurde ich dazu in cert.c, ab Zeile 814:
...
if(SSL_CTX_use_certificate_file(sslctx, full_pem_path, SSL_FILETYPE_PEM) <= 0
|| SSL_CTX_use_PrivateKey_file(sslctx, full_pem_path, SSL_FILETYPE_PEM) <= 0)
{
SSL_CTX_free(sslctx);
log_msg(LGG_ERR, "%s: cannot find or use %s\n", __FUNCTION__, full_pem_path);
return NULL;
}
...
Na toll! Die Log-Meldung wird somit generiert, wenn die OpenSSL-nativen-Funktionen SSL_CTX_use_certificate_file() oder SSL_CTX_use_PrivateKey_file() einen Wert zurückgeben, der kleiner gleich 0 ist. Gemäss Dokumentation der quelloffenen Library meldet ein Rückgabewert von 1, dass die Funktion erfolgreich ausgeführt wurde.
Ich bin kein C-Programmierer, aber mir gefiel die Programmlogik aus folgenden Gründen nicht:
Um dem Problem näher zu kommen war es deshalb nötig, dass ich selbst Hand an den Code anlegte, die Logik entzwirnte sowie die in OpenSSL intern vorhandenen detaillierten Fehlermeldungen in das Log ausgab. Natürlich fand ich über etwas Googlen heraus, wie man OpenSSL diese Fehlermeldung entlockt. Dies führte zu folgendem Code:
...
if(!SSL_CTX_use_certificate_file(sslctx, full_pem_path, SSL_FILETYPE_PEM)) {
log_msg(LGG_ERR, "%s: SSL_CTX_use_certificate_file error for file %s with error %s\n", __FUNCTION__, full_pem_path, ERR_error_string( ERR_get_error(), NULL ));
}
if(!SSL_CTX_use_PrivateKey_file(sslctx, full_pem_path, SSL_FILETYPE_PEM)) {
log_msg(LGG_ERR, "%s: SSL_CTX_use_PrivateKey_file error for file %s with error %s\n", __FUNCTION__, full_pem_path, ERR_error_string( ERR_get_error(), NULL ));
}
...
Neu kompiliert, installiert und gestartet, dann die Werbeschleuder SPIEGEL Online angesurft und das Log überprüft:
$ tail -f /var/log/error.loa ... create_child_sslctx: SSL_CTX_use_certificate_file error for file /tmp/pixelserv/_.ioam.de with error error:140AB18F:SSL routines:SSL_CTX_use_certificate:ee key too small ...
"ee key too small"? Now we're talking! Eine erneute Google-Suche ergab, dass sich OpenSSL 1.1.1 (im Gegensatz zu 1.1.0) weigert, ein Zertifikat zu verarbeiten, dessen RSA-Schlüssellänge kleiner als 2048 Bit ist.
Ich nahm deshalb folgende zwei Anpassungen vor:
Zuerst einmal generierte ich eine neue ca.key mit einer Schlüssellänge von 2048 Bits:
$ openssl genrsa -out $CERTDIR/ca.key 2048
Anschliessend passte ich auch noch cert.c an, da dort die mittlerweile als schwach erachtete Schlüssellänge (1024) hartkodiert ist:
... if (RSA_generate_key_ex(rsa, 2048, e, NULL) < 0) ...
Seit ich pixelserv-tls ein letztes Mal neu kompiliert und installiert habe, funktioniert das Schwarze Loch für alle Arten von Web-basierten Trackern wieder einwandfrei.
Überprüfen kann man das ... natürlich auch mit openssl auf einem separaten Client:
$ openssl s_client -connect www.googleadservices.com:443
CONNECTED(00000003)
140735858492360:error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error:s23_clnt.c:802:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 308 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1563537109
Timeout : 300 (sec)
Verify return code: 0 (ok)
---
Und jetzt:
CONNECTED(00000003)
depth=1 CN = Pixelserv CA
verify error:num=19:self signed certificate in certificate chain
---
Certificate chain
0 s:/CN=10.1.2.3
i:/CN=Pixelserv CA
1 s:/CN=Pixelserv CA
i:/CN=Pixelserv CA
---
Server certificate
-----BEGIN CERTIFICATE-----
MII...=
-----END CERTIFICATE-----
subject=/CN=10.1.2.3
issuer=/CN=Pixelserv CA
---
No client certificate CA names sent
Peer signing digest: SHA256
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 2148 bytes and written 434 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
Secure Renegotiation IS supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : ECDHE-RSA-AES128-GCM-SHA256
Session-ID: F66E6966BF7CE8F970AF4834A1CC45FE396D1F7B041F512CA5B3F65419EACD24
Session-ID-ctx:
Master-Key: 7EE1C54219A4CABF0BEB73BB420C93DD4F51F5F319897937137B9C1093045B4EB91B0FD50F30154DF5A7D18AD95A493C
Key-Arg : None
PSK identity: None
PSK identity hint: None
SRP username: None
TLS session ticket lifetime hint: 3600 (seconds)
TLS session ticket:
0000 - e8 63 17 bb 31 c0 91 7d-95 eb f8 b4 78 dc a6 89 .c..1..}....x...
0010 - be 14 43 2c ac cc 4c dd-f3 e9 9d f5 cb 36 46 a4 ..C,..L......6F.
0020 - c6 9a 67 7c fb 83 a1 a6-6d 74 6b 62 4e b5 60 33 ..g|....mtkbN.`3
0030 - 8b 1b 5f 1f cf ba c6 bf-73 c0 8a 7d 31 db 8a 75 .._.....s..}1..u
0040 - 81 8b b3 c3 e5 76 1e 34-c3 3d 2e 11 e4 58 a3 fc .....v.4.=...X..
0050 - 73 5b 2e 9c 13 f5 64 4e-c3 26 10 98 96 e1 64 aa s[....dN.&....d.
0060 - ce 41 aa cd 54 68 12 a1-87 10 98 cc f0 e5 e9 d9 .A..Th..........
0070 - de ec e6 2e 83 80 8f 51-71 ff 07 eb a7 b2 66 ae .......Qq.....f.
0080 - ad b5 44 c0 47 06 eb b7-5f 19 c2 74 5d 1f 47 20 ..D.G..._..t].G
0090 - 5d 93 0f 57 c4 ee 86 b7-7e 7f e3 2a ed 57 27 43 ]..W....~..*.W'C
Start Time: 1563745313
Timeout : 300 (sec)
Verify return code: 19 (self signed certificate in certificate chain)
---
Das Problem habe ich nun auch im GitHub Issue-Tracker des Projekts beschrieben ("Use 2048-bit RSA key to make pixelserv-tls work on Debian 10 "Buster""). Eigentlich hätte ich den Patch ja auch gleich selber als Pull Request hochladen können, doch diese Funktion von Git verstehe ich immer noch nicht wirklich richtig ... hoffen wir, dass der Maintainer die Ursache des Problems deshalb selber bald beseitigt.
Tags: 1024, 2048, Buster, Debian, OpenSSL, Pi-Hole, pixelserv-tls, RSA, strace, Stretch
Labels: IT
Dienstag, 16. Juli 2019
Vor einiger Zeit hat mir ein Bekannter mit Elektriker-Ausbildung gezeigt, dass unsere Wandschalter zum Steuern der Fensterstoren (Lamellen) mit einem Schraubenzieher ganz einfach aus der Fassung zu hebeln sind. Im Grunde ist es nur eine Platine, gespiesen von einer Flachbatterie, mit drei Knöpfen, die über Funksignale die Motoren unserer Lamellen steuern.
Dem Schalter ist zu entnehmen, dass es sich um ein Produkt des französischen Herstellers Somfy handelt.
Nachdem ich den Schalter von der Wand entfernt hatte, konnte ich auf dem Rücken der Platine die genaue Typenbezeichnung unserer Storen lesen: Somfy Centralis RTS (Handbuch).
Daraufhin machte ich mich auf die Suche nach Handbüchern und Steuerungen.
Rasch war nach der Lektüre des Handbuchs klar, dass sich die Motoren der Storen mit weiteren (offiziellen) Schaltern paaren lassen. Hierzu dient der Knopf „PROG“ auf der Rückseite bereits verbundener Schalter, die einen Motor in den „Paarungsmodus“ setzen.
Auf Ricardo ersteigerte ich mir deshalb kurzerhand zwei weitere solche Schalter mit der Idee, einen davon auf dem Nachttisch zu platzieren, und den anderen portabel zu belassen.
Doch das ist heutzutage, im Zeitalter der Heimautomation, nur die halbe Miete: Diese Dinger muss man von einem PC aus steuern können, denn dann kann man nämlich nette Automationen bauen. Beispielsweise die Storen bei Sonnenaufgang hochfahren, bei Sonnenuntergang herunterfahren, oder wenn es zu heiss wird (bedingt Temperatursensoren auf dem Fenstersims) herunterfahren, damit sich die Zimmer nicht unnötig aufheizen.
Nach etwa einer Stunde Google stiess ich auf das Gerät RFXtrx433XL USB HA controller des Herstellers RFXCOM, welche auf dem auch von Somfy verwendeten Frequenzband 433 MHz sendet und empfängt.
Ohne lange zu überlegen habe ich mir dann über den Schweizer Online-Shop Swiss Domotique ein Exemplar dieses Geräts geleistet; heute Dienstag ist es nun per Paketpost angekommen.
Hierzu ist leider ein Windows-PC nötig, auf welchem man die offizielle Software RFXmngr installiert (Download). Sobald das geschehen ist, verbindet man die USB-Fernbedienung mit dem Computer, startet das Programm und verbindet sich auf die Fernbedienung.
Im besten Fall füllt sich das Log im gelben Bereich des Tools bereits jetzt von alleine, wenn der Empfänger Signale in der Luft auffängt. Bei mir war dies der Fall; jemand in der Nachbarschaft scheint einen Oregon Scientific Temperatursensor zu betreiben:
16.07.2019 07:44:06:777
Packettype = TEMP_HUM
subtype = TH1 - THGN122/123/132,THGR122/228/238/268
channel 1
Sequence nbr = 0
ID = D401 decimal:54273
Temperature = 23.8 °C
Humidity = 22
Status = Dry
Signal level = 5 -80dBm
Battery = Low
Um die drei Motoren in unserer Mietwohnung zu paaren, bin ich der französischen, bebilderten Anleitung auf einem Blog gefolgt. Ich habe die Storen jeweils ganz hochgefahren, denn würde mit dem Paaren etwas komplett schief laufen und der bestehende Schalter auch die Verbindung zum Motor verlieren, würde jedenfalls immer noch Tageslicht in den Raum fallen. Anschliessend habe ich mit einem flachen Schraubenzieher den Schalter aus der Fassung rausgehebelt, damit ich Zugang zum jeweiligen PROG-Knopf besass. Als nächstes wechselte ich in der Software auf das Tab RFY, stellte dort eine frei gewählte fünfstellige ID sowie den einstelligen Unit Code ein (diese Zahlen unbedingt aufschreiben, mitsamt dem zugewiesenen Motor), setzte das Dropdown auf Program. Nun drückte ich den PROG-Knopf, bis sich die Storen kurz bewegten — das Signal, dass der Motor nun für die Paarung mit einer zusätzlichen Fernbedienung bereit ist. Anschliessend drückte ich in der Software auf Transmit, worauf sich die Storen noch einmal kurz bewegten. Die Paarung war somit abgeschlossen, und ab sofort konnte ich über das Dropdown in der Software Kommandos an die Store übermitteln.
Ich entschied mich, für jeden Motor eine eigenständige ID sowie einen Unit Code auszuwählen — denn, so denke ich mir, mit einem Script kann ich ja problemlos alle Storen in Serie herunter- oder hochfahren. Mindestens einen der Original Somfy-Schalter, welche ich auf Ricardo ersteigert habe, werde ich hingegen mit allen drei Motoren gleichzeitig paaren und so mittels eines Knopfdrucks alle Storen in der Wohnung hoch- oder herunterfahren.
Um meine Storen zu steuern möchte ich aber a) keinen Windows-PC in meinem Netzwerk am Laufen haben und b) auch nicht ein Win32-Software-GUI von RFXCOM verwenden — denn ein GUI ist nicht scriptbar. Somit machte ich mich auf die Suche nach einer Möglichkeit, das USB-Gerät an einen Linux-PC anzuschliessen und dann mit einer Programmiersprache zu steuern.
Fündig wurde ich bei der offiziellen nodejs-Bibliothek des Herstellers selber, freundlicherweise auf Github gehostet: rfxcom/node-rfxcom.
Installiert wird dies — ein funktionierendes nodejs vorausgesetzt — mittels …
# npm install rfxcom
Folgende Minimalvariante eines nodejs-Scripts lässt die Motoren bewegen:
var rfxcom = require('rfxcom');
var rfxtrx = new rfxcom.RfxCom('/dev/ttyUSB1', {debug: true});
var rfy = new rfxcom.Rfy(rfxtrx, rfxcom.rfy.RFY);
rfxtrx.initialise(function () {
rfy.doCommand('0x00000/0', 'up', function(err, res, sequenceNumber) {
if (!err) {
console.log('Action succeeded');
process.exit(0);
}
else {
console.log('ERROR[' + res + ']: ' + err + ' with sequenceNumber=' + sequenceNumber);
process.exit(1);
}
});
});
Erläuterungen:
Um herauszufinden, auf welchem USB-Port das Gerät lauscht, reicht ein Blick in die Ausgabe des Befehls dmesg:
... [74849.641113] usb 1-1.2: new full-speed USB device number 7 using ehci-pci [74849.756549] usb 1-1.2: New USB device found, idVendor=0403, idProduct=6015, bcdDevice=10.00 [74849.756556] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [74849.756560] usb 1-1.2: Product: RFXtrx433XL [74849.756564] usb 1-1.2: Manufacturer: RFXCOM [74849.756567] usb 1-1.2: SerialNumber: 00000000 [74849.788659] usbcore: registered new interface driver ftdi_sio [74849.788692] usbserial: USB Serial support registered for FTDI USB Serial Device [74849.788949] ftdi_sio 1-1.2:1.0: FTDI USB Serial Device converter detected [74849.789022] usb 1-1.2: Detected FT-X [74849.790248] usb 1-1.2: FTDI USB Serial Device converter now attached to ttyUSB1
Damit das finale Script auch normale Linux-Benutzer ausführen können, muss man den gewünschten Benutzer noch der Benutzergruppe dialout zuweisen, damit er auf die USB-Schnittstelle zugreifen kann:
# adduser santa dialout
Tags: Centralis, Home Automation, RFXCOM, RFXmngr, RFXtrx433XL, RTS, Somfa Centralis RTS, Somfy
Labels: IT