Archives for posts with tag: bash

Nachdem ich gestern den anderen Miix 320 repariert habe, ist mir aufgefallen, dass das Script fürs automatische Drehen des Bildschirms gar nicht im Blog ist. Gnome kann das unter Linux inzwischen zwar selbst, auf dem kleinen Lenovo nehm’ ich aber doch lieber XFCE – da muss man das selber nachrüsten.

Beim Miix ist die Orientierung des Displays unter Xorg per Default im Hochformat mit den Knöpfen oben. Fürs korrekte Querformat müsste man den Bildschirm nach rechts drehen: xrandr -o right

Das soll natürlich auch beim Loginbildschirm schon alles richtig sein. Ich verwende auf meinem Miix 320 als Displaymanager lightdm. In der lightdm-Konfiguration legt man ein Startscript fest: In /etc/lightdm/lightdm.conf.d/ legen wir mit erhöhten Rechten eine Datei namens 80-display-setup.conf an:

[SeatDefault]
greeter-setup-script=/etc/lightdm/greeter_setup.sh

Dieses bash-script muss ebenfalls mit erhöhten Rechten angelegt und folgendermaßen befüllt werden:

#!/bin/bash
# Loginscreen auf querformat
xrandr -o right
xinput set-prop “FTSC1000:00 2808:1015” “Coordinate Transformation Matrix” 0 1 0 -1 0 1 0 0 1

Ausführbar gemacht chmod u+x /etc/lightdm/greeter_setup.sh erscheint der Login korrekt gedreht. Die xinput-Zeile sorgt dafür, dass der Touchscreen mit gedreht wird.

Jetzt stimmt zwar die Bildschirmausrichtung erstmal, von selber drehen tut sich aber nichts, das funktioniert nur unter Gnome von alleine. Ich verwende allerdings XFCE: beheben wir das mal! Ich bin nicht der erste mit dem Problem und einen guten Ansatz findet man bei Julien auf github, der das schonmal für sein Yoga gebastelt hat, und auch beim LinuxAppFinder.

Meine Variante besteht aus drei Scripten: einem zum Aktivieren der Dreherei, eines das die Dreherei selbst ausführt und einem zum Abschalten des Bildschirm drehens. Sinn ist, wie bei jedem Tablet ScreenRotate per Knöpfchen schalten zu können.

Das Script fürs eigentliche Bildschirmdrehen benötig das iio-sensor-proxy Package. Unter Ubuntu ist das mit sudo apt install iio-sensor-proxy schnell nachinstalliert.

Hier der Code vom Script autorotate.sh

#!/bin/bash
# Sensor pipe to get output from monitor-sensor
sensorpipe=/tmp/pivotsensor
# if pipe doesn’t exist, create it
if [[ ! -p $sensorpipe ]]; then
/usr/bin/mkfifo $sensorpipe
fi
/usr/bin/logger “autorotate started”
/usr/bin/monitor-sensor >> $sensorpipe 2>&1 &
monisenspid=$!
# Parse output or monitor sensor to get the new orientation whenever a line appaers in sensorpipe
# Possible are: normal, bottom-up, right-up, left-up, quit. Light data will be ignored
while true; do
if read line<$sensorpipe; then #echo $line # Read the last line that was added to the pipe and get the orientation ORIENTATION=$(/usr/bin/echo $line | /usr/bin/grep 'orientation' | /usr/bin/grep -oE '[^ ]+$') case "$ORIENTATION" in # Set the actions to be taken for each possible orientation normal) /usr/bin/xrandr -o normal /usr/bin/xinput set-prop "FTSC1000:00 2808:1015" "Coordinate Transformation Matrix" 1 0 0 0 1 0 0 0 1 ;; bottom-up) /usr/bin/xrandr -o inverted /usr/bin/xinput set-prop "FTSC1000:00 2808:1015" "Coordinate Transformation Matrix" -1 0 1 0 -1 1 0 0 1 ;; right-up) /usr/bin/xrandr -o right /usr/bin/xinput set-prop "FTSC1000:00 2808:1015" "Coordinate Transformation Matrix" 0 1 0 -1 0 1 0 0 1 ;; left-up) /usr/bin/xrandr -o left /usr/bin/xinput set-prop "FTSC1000:00 2808:1015" "Coordinate Transformation Matrix" 0 -1 1 1 0 0 0 0 1 ;; quit) # if you send "orientation quit" to the pipe, the script exits break ;; esac fi done /usr/bin/rm -f $sensorpipe /usr/bin/kill $monisenspid /usr/bin/logger "autorotate ended" exit 0

Das Script kümmert sich auch um das Drehen des Touchscreens, sodass das Tablet auch bedienbar bleibt. Jedes Mal, wenn der Sensor eine Drehung registriert, schreibt monitor-sensor die neue Orientierung des Displays in die pipe. Das read line liest die Zeile und das case führt die entsprechende Aktion aus. Ein orientation quit beendet das Script und die Bildschirm-Dreherei.

Ein Script für das Einschalten der Dreherei brauchen wir noch, das ist übersichtlich:

#!/bin/bash
~/.bin/autorotate.sh &

Wie ihr seht, gibt es in meinem home-Verzeichnis einen versteckten bin-ordner, der meine kleinen Helferlein beherbergt.
Kaum länger fällt das stop-script aus:

#!/bin/bash
# Sensor pipe to get output from monitor-sensor
sensorpipe=/tmp/pivotsensor
# if the pipe doesn’t exist the autorotate script does not run
if [[ ! -p $sensorpipe ]]; then
echo “$sensorpipe: no such pipe”
exit 0
fi
/usr/bin/logger “stopping autorotate”
/usr/bin/echo “orientation quit” > $sensorpipe
exit 0

Herunterladen könnt ihr die drei auch einfach:

Alle drei Scripte müssen ausführbar sein! Das startautorotate.sh lasse ich beim login von XFCE starten – das lässt sich über “Sitzung und Startverhalten” einstellen. Ansonsten kann man sich in eine beliebige Leiste die entsprechenden Symbole mit den hinterlegten Scripten nageln und das AutoRotate manuell ein- und ausschalten.

(swg)

Langsam wird mein Elektrozoo mit sinnvollen Aufgaben betraut. Der Rasperry Pi im Küchenschrank kümmert sich nicht mehr nur ums Radio (MPD). Kürzlich hatte ich dort die Nextcloud installiert. Marias und mein Handy synchronisieren da hin, so haben wir immer alle Termine im Blick. Die Daten der Cloud habe ich inzwischen auf einer kleinen Festplatte gelagert, da hab ich jetzt ordentlich Platz.

Was mir noch fehlte, ist, dass das Küchenradio auch die Musiksammlung unter der Fuchtel hat und ich außerdem per Cloud drauf zugreifen kann. Besagte Sammlung lungert aber auf der ganz großen Datenschleuder, meinem Debian-Server mirny. Kann man doch gleich den Küchen-Raspi als Backup mit Mehrwert verwenden!

Damit die Musiksammlung auch immer aktuell ist, braucht es ein Sync-Script. Hier müssen gleich ein paar Aufgaben gelöst werden:

Sync

Als erstes muss das Musik-Verzeichnis synchronisiert werden, es reicht, wenn das Verzeichnis kopiert wird und es eine Sperre gegen versehentliches Löschen gibt. Dafür nehme ich rsync:
/usr/bin/rsync -xltbr –delete –backup-dir=/nextcloud-data/gelöscht –rsh=’ssh’ \
–exclude-from=/opt/nextcloud/rsync-exclude swg@mirny:/Musikverzeichnis/ /nextcloud-data/Musik

Ein paar Erklärungen zu den Optionen seien hier noch gegeben

  • -l copy symlinks as symlinks
  • -t preserve modification times
  • -x berücksichtigt nur Objekte, die sich im gleichen Dateisystem befinden
  • –rsh wählt die remote shell aus, die meisten werden SSH nutzen. Also -e ssh
  • –delete vergleicht Quellverzeichnisse und Zielverzeichnisse und sorgt dafür, dass Dateien, die im Quellverzeichnis nicht (mehr) vorhanden sind, im Zielverzeichnis gelöscht werden. Dies kann dazu führen, dass man ungewollt Dateien löscht, die man aber noch in der Sicherung behalten möchte.
  • -b sorgt dafür, dass durch die Option –delete gelöschte sowie alle veränderten Objekte gesichert werden (siehe dazu folgende Option –backup-dir=)
  • –backup-dir=Verzeichnis gibt ein Verzeichnis für die gelöschten und geänderten Objekte an, siehe Option -b
  • -r –recursive
  • –exclude-from=Datei die Datei enthält eine Liste auszuschließender Muster

rsync kopiert immer alles aus dem Musik-Verzeichnis von mirny. Wenn eine Datei auf mirny nicht mehr da ist, wird sie auf dem Küchen-Raspi in ein Verzeichnis für gelöschte Dateien verschoben. So hab ich noch eine Kontrolle über das, was so verschwindet. Wogegen es nicht hilft, ist ein schleichender Defekt der Platte, kaputte Dateien werden auch im Backup kaputt sein.

Der Inhalt der exclude-Datei sieht bei mir so aus:
– .*
– upload

Es sind alle versteckten Dateien und Verzeichnisse ausgeschlossen, und was upload heißt.

Aufwachen!

Aus Gründen läuft mirny nicht durch. Die eeeBox ist eher schlecht entwärmt, woran die ION-Grafik die Hauptschuld trägt. Außerdem will ich die große Platte schonen, die soll nicht dauerlaufen. Naja und letzten Endes muss ich den Strom ja auch bezahlen. Mirny hat einen Mechanismus, der ihn ohne äußeren Zugriff nach ca. 20 min in den Suspend schickt. Wenn das Backup laufen soll, muss mirny also geweckt werden: etherwake hilft. Ob mirny läuft, teste ich mit nc auf einen aktiven ssh. Fünf Versuche in einer Schleife sollten fürs Wecken reichen:
MIRNY_AWAKE=0
wakeup_mirny()
{
_RETRY=5
while (( RETRY > 0 ))
do
# Test, ob mirny per ssh erreichbar ist
/bin/nc -z -w1 mirny > /dev/null
if [ $? -eq 0 ]
then # ja fertig!
RETRY=0
MIRNY_AWAKE=1
else # nein: mirny wecken
/usr/sbin/etherwake -i eth0 aa:bb:cc:dd:ee:ff
/bin/sleep 5
((RETRY–))
fi
done
}

Das ganze als bash-Funktion mit einem Rückgabewert MIRNY_AWAKE, obs geklappt hat.

Berechtigung & Index

Damit die Nextcloud wirklich auf die Musik zugreifen kann, müssen die Dateien für den www-data Benutzer zugreifbar sein. Nach dem rsync ist also die Besitzübernahme mit chown -R fällig.
chown -R www-data:www-data /nextcloud-data/Musik

Das die Daten im richtigen Verzeichnis liegen, ist nur die halbe Miete. In der Nextcloud sieht man sie erst, wenn sie auch in deren Datenbank indiziert stehen. Dafür muss im Installationsverzeichnis der Nextcloud manuell gesorgt werden:
/usr/bin/php occ files:scan –all

Sowas zieht sich je nach Umfang der Verzeichnisse ganz schön hin.

Script

Als ganzes Script ergibt sich dieses schöne Bild:

#!/bin/bash
MIRNY_AWAKE=0
LOGGER=”/usr/bin/logger”
#
wakeup_mirny()
{
RETRY=5
while (( RETRY > 0 ))
do
$LOGGER “music backup: check mirny!”
# Test, ob mirny per ssh erreichbar ist
/bin/nc -z -w1 mirny > /dev/null
if [ $? -eq 0 ]
then # ja fertig!
$LOGGER “music backup: mirny is awake!”
RETRY=0
MIRNY_AWAKE=1
else # nein: mirny wecken
$LOGGER “music backup: waking mirny…”
/usr/sbin/etherwake -i eth0 aa:bb:cc:dd:ee:ff
/bin/sleep 5
((RETRY–))
fi
done
}
#
$LOGGER “music backup: Starting backup…”
wakeup_mirny
if [ $MIRNY_AWAKE -eq 0 ]
then
$LOGGER “music backup: Failed to wake mirny! Backup failed!”
exit 1
fi
/usr/bin/rsync -xltbr –delete –backup-dir=/nextcloud-data/gelöscht –rsh=’ssh’ \
–exclude-from=/opt/nextcloud/rsync-exclude \
swg@mirny:/Musikverzeichnis/ /nextcloud-data/Musik
if [ $? -eq 0 ]
then
$LOGGER “music backup: rsync successfully done!”
/bin/chown -R www-data:www-data /nextcloud-data/Musik
cd /var/www/nextcloud
# Das folgende muss als www-data laufen, sonst ist das nicht erlaubt!
$LOGGER “music backup: updating nextcloud index…”
/usr/bin/sudo -u www-data /usr/bin/php occ files:scan –all
$LOGGER “music backup: successfully done!”
else
$LOGGER “music backup: rsync error! Backup failed!”
fi
exit 0;

Das Script lasse ich per cron mit dem Nutzer root einmal die Woche laufen. Mit dem Logger ist dafür gesorgt, dass ein paar nachvollziehbare Meldungen im syslog landen.

Jetzt muss ich den MPD noch mit dem Musik-Verzeichnis bekannt machen, dann hab ich meine Musik nicht nur immer im Zugriff, sondern kann sie auch in der Wohnung direkt hören.

Wenn ihr das Script nutzen wollt, passt bitte bei etherwake Netzwerkinterface und MAC an, und ihr müsst natürlich alle Verzeichnisse, aus und zu denen ihr kopieren wollt, korrigieren. Wenn in Eurem Netzwerk Namen nicht in IPs aufgelöst werden, setzt einfach die (fest vergebenen) IPs ein.

(swg)

Prinzipiell halte ich mich ja von den sozialen Netzwerken und den großen Datenkraken fern. Weder hab ich facebook, noch irgend einen seiner einkassierten Ableger. Auf google hab ich eine Mailadresse (für Müll), aber google+ hab ich nie benutzt. Tut auch sonst kaum jemand, weswegen google den Krams jetzt abschaltet.

Was ich wirklich benutze, ist der google-Account mit Youtube. Was man da sonst als “trending” angezeigt bekommt, spottet jeder Beschreibung. Ich brauch echt meine Filterblase.

Und dann wäre da noch der Kalender. Google kennt jeden unserer Termine. Es ist ja auch unglaublich einfach zu nutzen, zu syncen und mit dem Webinterface hat man immer und überall Zugriff, auch ohne Handy. Ein Dorn im Auge ist mir das trotzdem schon lange: Googles wegen.

Aber wie ändern? Eine komplette Owncloud installieren? Gedacht hab ich das vor ein paar Jahren schon. Etwas Recherche zeigte erstmal, dass das nicht komplett freie Software ist und es schien auch massig Probleme zu geben. Neue Probleme brauchte ich nicht. Also blieb erstmal alles, wie es war.

Neulich hat Roman mir dann was empfohlen: Baikal. Das synchronisiert als Zentrale alle Kalender per Caldav und benötigt selbst kaum Ressourcen. Was mir dennoch fehlt, ist ein Webinterface. Das ist schon irgendwie Pflicht, meine Termine will ich nicht nur im Handy zurecht frickeln.

So’ne richtige Cloud wäre ja schon cool, so mit Dateiablage, Kontakten und dem Kalender natürlich. Inzwischen wurde Owncloud von einem der Gründer geforkt. Nextcloud ist komplett freie Software und es gibt ‘ne Menge Tutorials, sogar für den Raspberry Pi.

Mein Raspi in der Ladestation im Küchenschrank ist damit wohl aber überfordert, das ist noch ein 2B+. Als Küchenradio und WLAN-AP im Hof reicht er, für mehr aber auch nicht. Ein 3B+ ist schnell bei Conrad geholt. Zwei Tage Kind-krank spielen mir in die Hände, dann ist alles installiert (ganz frei von Stolperfallen ist das nämlich trotz aller Tutorials nicht). Bei Strato richte ich noch eine Dyndns-Subdomain ein und der Zugriff von außen klappt auch.

Damit ist der Google-Kalender nun endlich Geschichte.

(swg)

Damit das mit der Bloggerei wieder richtig funktioniert, hab ich erstmal für das richtige Werkzeug gesorgt: Das IMG-Helpr-Script kann jetzt die Bilder automatisch zum Hoster hochladen.

Danke muss ich für die Unterstützung bei der Programmierung ein paar Leuten sagen – ohne die vielen fleißigen Anleitungsschreiber wäre das alles verdammt mühselig:

Wie man Arrays in der Bash verwendet:
Andy Balaam’s Blog > Bash Arrays
StackOverflow: Is there a way to create key-value pairs in Bash script?

Den Tipp für SSH-Upload, wenn der Zielpfad eventuell nicht existiert ist klasse:
StackOverflow: How do I create a directory on remote host if it doesn’t exist without ssh-ing in?

Fett: Danke!

(swg)