Alle Beiträge von steviehs

Jitsi auf dem eigenen Server

Jitsi unter Debian zu installieren ist recht straightforward und hier auch gut erklärt. Ich hatte aber doch ein paar Hänger:

a) Es ist doch eine ganz wilde Kette von Authentisierung und Modulen, am besten, um auch das logging zu verstehen, ist das hier erklärt. Bei mir erkannte ich dann, dass die Java Version, die ich für Minecraft installiert hatte, irgendwie das prosody cert nicht intus hatte, das konnte ich nachdem ich auf den standard JRE umgestellt hatte, als user jicofo mit keytool -importcert -file /var/lib/prosody/auth.jitsi.stevekist.de.crt fixen. Ausserdem hab ich im profile noch JAVA_HOME gesetzt.

b) Da mein Server hinter einer Fritte hängt und ich – wie wir fast alle – DynIP habe, musste ich das hier auch so anpassen, das ist in der Doku etwas strange erklärt.

cat /etc/jitsi/videobridge/sip-communicator.properties
org.jitsi.videobridge.AUTHORIZED_SOURCE_REGEXP=focus@auth.jitsi.stevekist.de/.*
org.ice4j.ice.harvest.NAT_HARVESTER_LOCAL_ADDRESS=192.168.243.10
org.ice4j.ice.harvest.STUN_MAPPING_HARVESTER_ADDRESSES=stun.l.google.com:19302 ,stun1.l.google.com:19302 ,stun2.l.google.com:19302

Die Googleeinträge werden benutzt um die eigene IP Adresse rauszubekommen. Ich glaub, das könnte ich auch irgendwie anders machen?

Und last not least musste ich der Fritte erklären, dass sie auf der richtigen IP des Servers port forwarded, siehe hier,

Virtuelle Interfaces und Die Fritzbox

Auf meinem Serverlein laufen schon richtig viele Dienste… die meisten sind einfach Webdienste auf nem nginx, aber dann gibt es auch manchmal was anderes… ha-bridge um homematic über die Alexa zu steuern, minecraft für den Nachwuchs… und jetzt – for reasons – auch Jitsi.

Da ist es dann doch nötig mehrere Interfaces mit mehreren IPs zu haben, an die sich die Services dann binden können. Nun erkennt die Fritte aber zum Portforwarden die Geräte nicht anhand der IPs sondern wohl anhand der Mac-Adresse -> einfach ein virtuelles Interface anlegen reicht nicht, es muss eins sein, das auch noch ne eigene Macadresse hat:

Das steht dann entsprechend in der /etc/network/interfaces:

# The primary network interface
auto eth0 eth0.0
iface eth0 inet static
      address 192.168.243.2
      netmask 255.255.255.0
      gateway 192.168.243.1
      dns-nameservers 192.168.243.1
      up  ip link add link eth0 address 74:d4:35:84:f4:10 eth0.0 type macvlan


iface eth0.0 inet static
      address 192.168.243.10

Eigentlich völlig easy, wenn man es weiss, oder?

BLTOUCH am CR-10S

Nun muss ich auch was zum BLTOUCH am CR-10S schreiben, da ich mir das alles zusammensuchen musste. Ganz wichtig (IMHO): keinen Clone kaufen, sondern das Original!!! Mit dem Clone hatte ich einen formidablen Headcrash (kommt noch ein anderer Artikel zu).

a) Montage

https://www.thingiverse.com/thing:2493610 ist der mount für den BL-Touch. Dafür braucht man etwas längere M3 Schrauben um das Teil am Kopf zu befestigen und ich würde statt der M2,5 Schrauben, die beim BL-Touch dabei sind, M3 Schrauben mit passenden Scheiben und Muttern nehmen.

Nun also erst den Mount montieren und dann die Schrauben von unten durch den BLTOUCH, die Federn dazwischen und das von oben mit den Muttern soweit hochdrehen, dass die Feder auf ca. 1-2 mm zusammengedrückt wird. Um das Ganze auf die richtige Höhe zu bringen, kann man sich noch die Lehre: https://www.thingiverse.com/thing:1538742 ausdrucken. der BLTOUCH smart sollte 8,5mm über dem Druckbett sein. Höher spricht er irgendwann nicht mehr an, tiefer kann der Stift am Druck hängen bleiben.

b) Firmwaresetup – mei, da hab ich jetzt keine Lust was zu schreiben. Halt ne aktuelle Marlin FW um die BLTOUCH Sachen erweitern.

b) Softwaresetup / Kalibrierung

  1. Heizen (Extruder und Bett auf Solltemperatur)
  2. Mal zur Sicherheit merken, was in M851 (Z-Offset) drinsteht
  3. EEPROM löschen mit M502 (oder nur M851 Z0 machen)
  4. EEPROM speichern mit M500
  5. mit G28 homen
  6. Z-Offset zur Sicherheit nochmal kontrollieren und evtl. löschen: M851
  7. Jetzt mach ich nochmal mit der CR-10 Controllerbox oder per Octoprint CR-10 Bed Levelling Plugin ein manuelles Levelling. Das ist nicht unbedingt nötig, hilft aber schon, die Einstellerei danach in Grenzen zu halten (ich hab somit -0.3mm Z-Offset hinbekommen)
  8. mit G28 homen
  9. G1 Z0 F60 (damit fährt der Extruder auf Druckhöhe)
  10. Nun ganz wichtig: Endstopp abschalten, wenn er denn an ist: M211 ist hier der passende Code: M211 S0 schaltet die Endstops aus.
  11. Nun mit G1 und absoluten werten im 0.1 mm Bereich oder dem Menü nach unten bewegen, bis ein doppelt gefaltetes Blatt leicht klemmt.
  12. Z Wert auf dem Display merken und mit M851 Z-1.0 (oder was halt rauskommt) speichern.
  13. M500 im EEPROM speichern
  14. Wenn man nun merkt, dass man weiter nach oben oder unten muss: Z wert entsprechend korrigieren.

Flashing Bootloader on CR-10S

Ups… there I did it. Unfortunately I tried to install the wrong hex file on the CR-10S board and it was gone. Empty LCD. No answer on boot.

To help others in fixing it faster, here the result of my research: The best hints I’ve found on https://www.instructables.com/id/Flashing-a-Bootloader-to-the-CR-10/

This is for the CR-10 and the CR-10S mainboard is a different beast: It has a different processor and the ICSP connector is at a different position.

CR-10S Mainboard with ICSP pins


I tried to follow Donovans walk through, but hat no success with his first method mentioned, but full success with the alternative method:

Her is the very fast howto:

  1. Pick up your Arduino One
  2. Get Nick Gammon’s sketches from https://github.com/nickgammon/arduino_sketches/archive/master.zip
  3. Flash the Atmega_Board_Programmer sketch on the Arduino One
  4. Connect the Arduino ICSP pins (except Reset) to the CR-10S boards (V2.1) ICSP pins. Reset on Arduino site is digital pin 10.
  5. At least you should see the CR-10S board power on. If not, you did something wrong.
  6. Go into Arduino->Tools->Serial Monitor
  7. Set Baudrate to 115200 and Communication to “Both NL and CR”
  8. If you see the menu of the Board Programmer, type G in the text box to program the bootloader. You should get a positive result in the programmer.
  9. Ready to continue business as usual with uploading firmwares.

Supasimple Picture Frame Raspberry Pi

Der plan ist für eine – ja genau eine bestimmte – Anwendung einen Pi aufzusetzen, der innerhalb eines Ordners Bilder als Slideshow zeigt und beim Anstecken eines USB Sticks mit Bildern diese lokal kopiert und dann diese als neue Slideshow nimmt.

Was braucht man:

  • Raspberry Pi mit Raspian und folgenden paketen:
  • feh, nodm, xutils (xset)

Das ganze läuft unter dem User “pictures” also legen wir diesen an, ob mit oder ohne Passwort, alles egal. Auf jeden Fall wird der in nodm (/etc/default/nodm) als startuser eingetragen (das sind nur die geänderten Zeilen):

NODM_ENABLED=true
NODM_USER=picture

Dann bekommt der user picture ein .xession:

xset s off
xset -dpms
xset s noblank
feh --quiet --fullscreen --borderless \\
--hide-pointer --slideshow-delay 30 \\
/home/picture/Pictures

Dass die entsprechenden Directories existieren müssen ist klar, oder?

So, jetzt fehlt nur noch ein Script um beim Anstecken eines Dongles, den Inhalt auf die SD Karte zu kopieren:

/etc/udev/rules.d/usbstick.rules enthält:

ACTION=="add", KERNEL=="sd[a-z][0-9]", TAG+="systemd", ENV{SYSTEMD_WANTS}="usbstick-handler@%k"

Der usbstick handler ist in /lib/systemd/system/usbstick-handler@.service:

[Unit]
Description=Mount USB sticks
BindsTo=dev-%i.device
After=dev-%i.device

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/local/bin/automount %I
ExecStop=/usr/bin/pumount /dev/%I

Es gibt ein /usr/local/bin/automount:

#!/bin/bash

PART=$1
rm -r /home/picture/Pictures/*
/usr/bin/pmount --umask 000 --noatime -w --sync /dev/${PART} /media/usb
cp -r /media/usb/* /home/picture/Pictures/
/usr/bin/pumount /dev/${PART}
killall -HUP feh

So, was könnte man da nicht noch alles machen: ne Taste anschliessen, eine Script, das das alles steuert auch mit vom USB Stick laden, ein Fallback bildchen… aber mei. S’geht ja schon…

“Wie, und das war jetzt supasimple????”

Bilder organisieren

Da ich immer wieder mal von IT-Illiteraten dafür beneidet werde, dass ich alle meine Photos auf dem Handy dabei habe, wollte ich hier mal kurz den Verfahrensweg grob notieren, wie das recht einfach geht:

  1. Bilder auf dem PC organisieren.
  2. Bilder fürs Handy verkleinern und in eine geeignete Ordnerstruktur stellen.
  3. Diese Ordnerstruktur aufs Handy synchronisieren

Im Nachfolgenden nun meine Überlegungen dazu, ich hab auch mal – aber wirklich nur kurz – geschaut, wie das unter Windows gehen könnte. Spassig ist das nicht, aber mei… es geht irgendwie. Bei mir machen das unter Linux ein paar 10 Zeiler in Perl (ok, sind mehr Zeilen)…

Bilder auf dem PC organisieren

Ich habe einen “incoming” Ordner, in dem ich meine Bilder aus der oder den Kameras oder von Freunden reinstecke. Die sind alle unterschiedlich benamt, aber das macht an der Stelle erst mal nix. In diesem Ordner sichte ich auch und lösche schon mal fröhlich.

Danach lasse ich mein Skript digiimport auf den Ordner los. Dieses benennt die Bilder nach YYYYMMDD_HHMMSS aus den EXIF Daten um und speichert sie ein einen Zielordner mit der Struktur YYYY/MM/

Soweit so gut, damit sind die Bilder auf dem PC erst mal organisiert und bis auf den Dateinamen auch unverändert. Den Dateinamen ändere ich, weil ich keine Namen doppelt haben will, was man nach der n.ten Kamera zwangsläufig hat.

Wie geht das nun unter Windows?

Im Prinzip ähnlich, nur statt meines Skriptes nimmt man den AmoK EXIF Sorter. Dieser kann Profile anlegen und die Dateien auch entsprechend umbenennen, verschieben und passende Zielordner anlegen. Also entsprechend ein Profil für den Bildereingang und ein Profil für die Handybilder (wird weiter unten erklärt) und gut ist.

Bilder fürs Handy aufbereiten

Hier sind zwei Sachen nötig:

a) Die Programme auf Android können keine Ordnerstrukturen, bzw. gerade mal eine Ebene. Ich setze hier QuickPic ein, weil es diese eine Ebene wenigstens kann und super schnell ist.

b) Damit das Handy nicht aus allen Nähten platzt müssen die Fotos verkleinert werden: meine 15000 Fotos brauchen verkleinert gerade mal 5,5 GB, das geht auf so ziemlich allen Handies.

Bei mir kommt für diesen Zweck das Script “nexuspics” zum Einsatz, das auch gleich noch den sync auf den Server erledigt, ich mach das alles mit rsync. Unter Windows muss man das mehrstufig machen: zum Kopieren in eine neue Ordnerstruktur mit YYYY_MM Namen kann man von oben den AmoK EXIF Sorter nehmen und auf die fertig sortierten Bilder loslassen. Zum Verkleinern danach bietet sich hier der DownSizer an. Der kann auch in verschiedene Grössen ändern. Leider kann der das nicht im bestehenden Verzeichnis machen, sondern das Ding legt auch ein neues an, aber dieses kann man dann z.B. gleich in seiner Dropbox anlegen und das könnte man z.B. mit FolderSync mit dem Handy syncen.

Alles klar? Wenn nicht einfach nen Kommentar rein 🙂

Ah, und hier noch meine Scripte, wirklich “as is”, für mich gehen die.

Bohrlöcher für Festplatten

Da ich in diversen Projekten Bohrlöcher für 2,5″ und 3,5″ Festplatten brauche und ständig Müll zusammen gemessen habe, dachte ich mir, mach ich es mal ordentlich und such mir die Specs zusammen. Das sind: SFF-8300 für 3,5″ Platten und SFF-8201 für die 2,5″ Teile (äh, moment, warum ist die für die neueren Platten die mit der kleineren Nummer? Ok, nicht drüber nachdenken…)

Daraus hab ich mit qcad entsprechende Zeichnungen gemacht (geb ich auf Wunsch auch gerne weiter) und here you are: drive_holes. Es gibt eine Version (drive_holes_eco), wo die Löcher der 2,5″ Platte auf der der 3,5″ liegen, muss man zwei Löcher weniger bohren. Die PDFs sollten im 1:1 Massstab gehen, besser nochmal nachmessen oder ne Platte zum Vergleich dran halten. Am besten alle Löcher auf 3,5mm bohren, hat man noch ein wenig Spielraum.

GSM Gateway mit Asterisk und FreePBX auf Raspberry Pi

Nachdem ich erst versucht habe, das ganze zu Fuß auf Raspian zu bauen, hab ich nach gefühlten zwei Tagen aufgegeben und http://www.raspberry-asterisk.org genommen. Das hat den Riesenvorteil, dass man auch einen einigermaßen aktuellen Asterisk bekommt, auf dem der chan_dongle trotzdem geht.

Bei der Konfiguration hat vor allem:

Installing a FreePBX with FritzBox as trunk on a Raspberry Pi

geholfen. Es hat trotzdem alles nicht auf Anhieb geklappt. Irgendwann bin ich dann dazu übergegangen, alles, was nach ID und Passwort klang, gleich zu nennen, jetzt gehts 🙂 Ob das jetzt sicherheitstechnisch schlimm ist, kann ich schwer sagen (ok, stimmt nicht :-), ist alles im Intranet, da können mich die Leute auch schädigen, wenn sie einfach das Telefon in die Hand nehmen.

Vorher habe ich den UMTS Stick (Huawei E160) direkt an der Fritte betrieben, aber seit 6.83 ging das plötzlich nicht mehr. Aber da man dort eh die ausgehende Rufnummer nicht unterdrücken kann, ist mir das so eh viel lieber. Der RPi braucht übrigens mit dem Dongle ca. 3 Watt.

Im Prinzip sollte das auch immer noch mit dem UMTS Dongle an der Fritte gehen. Aber AVM gibt leider keine Liste mit unterstützten Sticks heraus und Rufnummernunterdrückung geht mit dieser Methode auch nicht… meine Handynummer soll ja nicht unbedingt bei einem Anruf von zuhause angezeigt werden.

Alexa, mach die Glotze aus

Da sitzt man auf dem Sofa, der Film fängt gleich an und daneben leuchtet der Rechner die Welt voll.

Jetzt könnte man natürlich aufstehen und das Ding einfach locken oder den Bildschirm ausschalten oder was immer, aber warum hat man sich denn dieses kleine Laberdöschen in die Bude gestellt. Also flux ein Script zusammengestohlen:

#!/usr/bin/python
import sys, os
from flask import Flask, jsonify

app = Flask(__name__)
app.config.update(
# DEBUG=True,
)

command = 'gnome-screensaver-command --lock'

@app.route('/lockscreen', methods=['GET'])
def get_tasks():
 os.system(command)
 return ""

if __name__ == '__main__':
 app.run('0.0.0.0',5000 )

Das Ding jetzt als Startprogramm eintragen.

Die Alexa steuert bei mir zuhause eh schon ziemlich viel dank der genialen HA Bridge. Dieser muss man natürlich noch erklären, dass sie z.B. das Device “Monitor” mit dem GET Befehl: http://meinlaptop.fritz.box/lockscreen ausschalten muss. Fertig.

Irgendwelche Security Bedenken?

Neben dem ganzen Amazon- und Cloud-Rotz und eigentlich recht wenige: ich nehme nicht noch nen weiteren Internet Service wie IFTT rein, sondern der Dot steuert das Dingens über die HA Bridge direkt (weil Amazon da halt ne zwei Klassen Gesellschaft hat). Der Flask Server oben ist glaub ich recht überschaubar… vielleicht fallen mir ja noch ein paar Ideen ein, was man machen könnte: Laptop Lautstärke wäre auch noch schick…

Debian Repository per ssh auf ein chroot

Für eigene Zwecke will man immer mal ein Repository haben, auf das andere nicht zugreifen können, aber das man auch an Bekannte oder Testgruppen oder wen auch immer weitergeben kann. ftp mit Passwort und http mit Passwort sind so ne Sache, ein wenig sicherer könnte das schon sein.

Debian Repositories können auch via ssh eingebunden werden, eine entsprechende Zeile in der sources list sieht dann so aus:

deb ssh://repouser@example.com/packages/ jessie main

Auf dem Server muss man einen entsprechenden Nutzer einrichten und die packages enthalten eben das Debian Repository. Authentisierung erfolg per ssh key, d.h. auf Clientseite wird ein ssh-Key erzeugt, der auf Serverseite im ~/.ssh/authorized_keys des repouser liegt. Soweit so straightforward.

Der Nachteil dieser Variante ist, dass der repouser nun einen ssh login auf dem Server hat, was ihn natürlich auch lesenden Zugriff auf andere Ressourcen gibt, was man eher nicht unbedingt will. Kann sein, dass man dies auch noch besser absichern kann, die beste Absicherung ist auf jeden Fall, diesen Benutzer in ein chroot environment zu sperren.

Dieses fahre ich über die sftp chroot variante des sshd, in der sshd_config steht dazu:

Subsystem sftp internal-sftp

Match Group sftp
ChrootDirectory %h
AllowTcpForwarding no

Nun muss der repouser noch zur Gruppe sftp dazu und jetzt kommt das eigentliche Problem: die chroot Umgebung mit den richtigen Dateien und Rechten auszustatten, d.h. alles dort einzurichten, was nötig ist, um auf Clientseite apt-get … aufzurufen. Und da war das Problem: Was braucht apt-get via ssh auf der Serverseite? Letzendlich hab ich es nur raus bekommen, in dem ich mir die Sourcen von apt-get angeschaut habe. Und da waren vor allem find und dd die Hänger… die drauf und es ging. Wie man herausbekommt, welche libs nötig sind, sagt ldd find und ldd dd und gut ist.

Das ganze ist hier in einem schmutzigen Script, das so unter Ubuntu 14.04 läuft, Achtung: die Libs werden so für andere Distris nicht passen, aber ldd ist dein Freund, der Rest stimmt.

#!/bin/bash
echo "This script should be started as root on the machine, which hosts the repo"
REPOUSER="repouser"
REPOHOME="ssdhome/$REPOUSER"
echo "Generating chroot environment for $REPOUSER in $REPOHOME"</code>

adduser --disabled-password --ingroup sftp --home /$REPOHOME $REPOUSER
mkdir -p /$REPOHOME
chown root:root /$REPOHOME
cd /$REPOHOME
mkdir -p bin dev etc home lib usr var tmp usr/bin vat/tmplib/x86_64-linux-gnu usr/lib/x86_64-linux-gnu $REPOHOME lib/x86_64-linux-gnu lib64
cp /bin/ls bin/
cp /bin/dash bin/sh
cp /bin/bash bin/
cp /usr/bin/scp usr/bin/
cp /bin/dd bin/
cp /usr/bin/find usr/bin/
cp /usr/bin/whoami usr/bin/
cp /lib/x86_64-linux-gnu/libtinfo.so.5 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libdl.so.2 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libc.so.6 lib/x86_64-linux-gnu/
cp /lib64/ld-linux-x86-64.so.2 lib64/
cp /lib/x86_64-linux-gnu/libselinux.so.1 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libacl.so.1 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libpcre.so.3 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libattr.so.1 lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libnss_compat* lib/x86_64-linux-gnu/
cp /lib/x86_64-linux-gnu/libm.so.6 lib/x86_64-linux-gnu/
mknod dev/null c 1 3
mknod dev/zero c 1 5
chmod 666 dev/*
chmod 1777 tmp
grep $REPOUSER /etc/passwd &gt;&gt; etc/passwd
echo "now, cp the repository beginning with the packages dir to ssdhome/$REPOUSER"
echo "do not forget to add the public key to ssdhome/$REPOUSER/.ssh/authorized_keys"
echo "and add a line like: deb ssh://$REPOUSER@example.com/packages/ jessie main"