Debian Datum einstellen

Wenn die Uhr nicht korrekt auf dem Rechner eingestellt ist geschehen die lustigsten Dinge.
Deshalb synchronisiert sich Debian Linux per NTP gegen einen Zeitserver. Manchmal muß man jedoch an sowas vorbei arbeiten.
Um ein Script in der Vergangenheit oder Zukunft auszuführen muß NTP deaktiviert werden.

Unter Debian / Ubuntu funktioniert das so:

root@server:~# timedatectl set-ntp 0
root@server:~# timedatectl set-time 2017-06-20
root@server:~# date
Tue Jun 20 00:00:01 CEST 2017

Im Anschluss auf keinen Fall vergessen NTP wieder zu aktivieren und die Uhr prüfen!

root@server:~# timedatectl set-ntp 1
root@server:~# date
Wed Jun 21 12:30:45 CEST 2017

LibreELEC Kodi bequem updaten

Für bewegte Bilder auf der Glotze ist bei mir Kodi auf einem Raspberry Pi2 zuständig. Ich nutze dafür die Testbuilds von Milhouse weil man damit auch den Streaming Dienst von Amazon nutzen kann. Wie man das initial einrichtet erklärt Christoph von bei Linuxundich ganz gut. Da es sich um Testbuilds handelt macht es Sinn öfter mal ein Update einzuspielen. Wenn man das händisch macht ist es halt mit viel Arbeit verbunden und Arbeit sollten man vermeiden wo es nur geht. Deshalb habe ich ein kleines Script gebastelt welches mir diese Arbeit abnimmt. Die Geschichte ist natürlich bei weitem nicht perfekt. Ich habe aufgehört als es funktioniert hat.

Wichtig: mein Script lädt die Files für den Raspberry PI2 /3 wenn du einen Raspberry Pi 1 hast solltest Du dieses Script auf keinen Fall verwenden!

Benötigte Software

Um das ganze zum laufen zu bringen brauchst du PHP und Bash.

Die Scripte liegen in einem Repo auf Github wenn Du dir das genauer anschauen magst.

Falls nicht mußt du nur dieses Phar File  und ein Bash Script downloaden und in ein bin folder legen – $USER/bin wäre ein schöner Ort dafür.

Nun muß noch das executable flag gesetzt werden:

chmod +x today-release.phar 
chmod +x update-kodi.sh

Nutzung

Einfach das Script mit dem ssh String zum Raspberry aufrufen

update-kodi.sh kodi@192.168.0.89

Tipps zur Nutzung

  • Generell solltest Du Deinen public SSH Key auf dem Raspberry ablegen. Das erspart das Eintippen des Passworts bei jedem Aufruf. Zu dem Thema gibt es wohl eine Million Blog Posts. Hier ist einer.
  • Das SSH Config File nutzen.
  • Einen Cronjob in der Nacht einrichten der dann die Arbeit für einen erledigt –  00 00 * * * $HOME/bin/update-kodi.sh kodi

Was noch fehlt

Die Geschichte mit den Scripts ist schon ein wenig smelly. Eigentlich wollte ich mir das mit Ansible aufsetzen und das ADHS hat mich gezwungen  diese Scripte zu erzeugen. Sinnvoll wäre es auch, wenn vor dem Einspielen des Updates die /etc/issue geprüft wird um zu schauen ob das Gerät schon auf der aktuellen Version läuft.

Hat jemand einen Tipp für mich?

Ich parse die Url http://milhouse.libreelec.tv/builds/master/RPi2/ das ist ziemlich unelegant wie ich finde. Gibt es da vielleicht eine Art Http Standard um sowas direkt lesen zu können?

 

Bash – Touchpad bei Bedarf deaktivieren

Langjährige Büroarbeit hat mir einen ordentlichen Bauch verschafft der ab und an die Kontrolle über die Tasten meines Touchpads übernimmt. Abhilfe schafft hier Sport und ein kleines Script um das Touchpad bei Bedarf zu deaktivieren. Das Script liest den Status des Touchpads aus und invertiert ihn.

Quelle: Lenovo.com
Quelle: Lenovo.com
#!/bin/bash
 
DEVICE_NAME="SynPS/2 Synaptics TouchPad"
 
#read state of the touchpad
STATE=$(xinput list-props "$DEVICE_NAME" |grep "Device Enabled"|cut -f3)
#flip the variable
if [ $STATE = 1 ]; then
	echo disable $DEVICE_NAME
	STATE=0
    else
       	STATE=1
       	echo enable $DEVICE_NAME
fi
 
xinput set-prop  "$DEVICE_NAME"  "Device Enabled" $STATE

Serielle Kommunikation über Bluetooth

Für ein kleines Projekt (Mobiltelefon steuert Arduino) habe ich mir ein HC-06 Bluetooth Modul für wenig Geld in China besorgt. Bluetooth habe ich nie gemocht, weil ich nie viel Freude daran hatte diese Gerätschaften unter Linux zu konfigurieren, aber der Preisunterschied zu Arduino WLAN Modulen hatte dann doch den Ausschlag gegeben:).
 Über GUI ließ sich das Gerät leider nicht konfigurieren, aber  mit den bluez-utils auf der Kommandozeile ließ sich das Problem rasch beheben.

Zuerst muß die MAC Adresse des Moduls in Erfahrung gebracht werden.

ms@debian:~/$ hcitool scan
Scanning ...
	0C:DF:A4:DE:01:54	S3350
	20:14:04:11:15:16	HC-06

Das File rfcomm.conf anpassen

root@debian:/# cat /etc/bluetooth/rfcomm.conf 
#
# RFCOMM configuration file.
#
 
rfcomm0 {
#	# Automatically bind the device at startup
	bind yes;
#
#	# Bluetooth address of the device
	device 20:14:04:11:15:16;
#	# RFCOMM channel for the connection
	channel	1;
#
#	# Description of the connection
	comment "HC-06";
}

Nun die Pin des Geräts (Default ist 1234) setzen – Mac Adresse am Besten per Tabulator vervollständigen
root@debian:/# sudo echo „20:14:04:11:15:16 1234“ >> /var/lib/bluetooth/08\:3E\:8E\:E5\:1C\:5E/pincodes

Und den Bluetooth Daemon neu starten.

root@debian:/# sudo /etc/init.d/bluetooth restart

Befehle an den Bluetooth Client senden

Strings kann man nun einfach an das Gerät redirecten
ms@debian:~$ echo „beep“ >/dev/rfcomm0

Ausgabe des Bluetooth Clients lesen

Einfach mit cat die Gerätedatei ausgeben

ms@debian:~$ cat /dev/rfcomm0
==Commands==
led on
led off
beep
beep_d [duration]
==Commands==
led on
led off
beep
beep_d [duration]

fin.

Click’N’Load per Tunnelbau an die Pyload Maschine weiterleiten

Wer ab und an bei Sharehostern Dateien lädt kennt sicherlich Click’n’Load. Nach dem Klick auf einen Button im Browser füllt sich die Queue des Downloadmanagers mit neuen Files. Dabei werden Informationen zu Dateien per Http POST vom lokal laufenden Download Programm wie jDownloader oder PyLoad entegengenommen. Dies geschieht durch einen kleinen Webserver der auf dem Port 9666 lauscht. Wenn der Downloadmanager nicht lokal läuft funktioniert der Mechanismus leider nicht.

Mit einem SSH-Tunnel kann man den POST Request an einen anderen Rechner weitleiten. Dort muß neben dem Downloadmanager auch ein SSH-Server laufen.

In meinem kleinen Beispiel läuft Pyload auf einem Pi mit der Ip 192.168.0.110. Um den Tunnel nachzubauen mußt Du also nur die Ip anpassen:

ms@debian:/home/ms# ssh -L 127.0.0.1:9666:192.168.0.110:9666  pi@192.168.0.110 -N

Den Tunnel kannst du mit diesem Link testen.

Nachtrag 21.06.2014
Die Arbeit mit ssh kann man sich generell einfacher machen wenn man ein Configfile für das Tool benutzt. Dort kann man Aliase für Server definieren, deklarieren auf welchem Port sshd läuft oder welcher Key zur Authentifizierung genutzt werden soll. Nähere Informationen dazu gibt es bei den Ubuntuusers oder Nerderati.

Node.js Mysql

Ich muß einen recht großen Haufen Daten von einer Mysqldatenbank nach Mongodb schaufeln. Das ganze spielt in der Kommandozeile.

app.js

var mysql = require('mysql');
 
config=require('./config').production;
 
var connection = mysql.createConnection({
    host : config.mysqlHost,
    port : config.mysqlPort,
    database: config.mysqlDatabase,
    user : config.mysqlUser,
    password : config.mysqlPassword
});
 
 
connection.connect(function(err){
	if(err != null) {
		console.log(err);
	}
	connection.query("SELECT * from  feeds", function(err, rows){
	if(err != null) {
		console.log("Problem with Query "  +err);    
	} else {
	    // Shows the result on console window
	    console.log(rows[0]);
 
 
	    connection.end();
 
	}
 
	});
 
});

package.json

{
  "name": "node-mysqltest",
  "version": "0.0.1",
  "private": true,
  "scripts": {
    "start": "node app"
  },
  "dependencies": {
 
    "mysql" : "*"
  }
}

config.js

var config ={};
 
config.development = {
 
};
 
config.production = {
 
 
  mysqlPort:3306,
  mysqlHost:'localhost',
  mysqlDatabase:'<DB>',
  mysqlUser: '<USR>',
  mysqlPassword:  '<PWD>',
 
  env : global.process.env.NODE_ENV || 'production'
};
 
 
module.exports  = config;

Tastenbelegung der Maus ändern unter Debian

Ich habe auf meinem Laptop 3 Möglichkeiten den Cursor über den Screen zu schubsen – via Touchpad, Trackpoint und meiner ergonomischen Linkshändermaus. Leider hat sich der Hersteller dieses edlen Geräts überlegt den Rechtsklick auf die Linke Taste zu legen und umgekehrt. Um diese Verhalten nur für die Maus zu ändern benötigt man das Kommando xpinput.

Vorgehen

Eingabegerät mit xinput identifizieren:

root@debian:~# xinput list
⎡ Virtual core pointer                    	id=2	[master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer              	id=4	[slave  pointer  (2)]
⎜   ↳ Razer Razer DeathAdder                  	id=10	[slave  pointer  (2)]
⎜   ↳ SynPS/2 Synaptics TouchPad              	id=13	[slave  pointer  (2)]
⎜   ↳ TPPS/2 IBM TrackPoint                   	id=16	[slave  pointer  (2)]
⎣ Virtual core keyboard                   	id=3	[master keyboard (2)]
    ↳ Virtual core XTEST keyboard             	id=5	[slave  keyboard (3)]
    ↳ Power Button                            	id=6	[slave  keyboard (3)]
    ↳ Video Bus                               	id=7	[slave  keyboard (3)]
    ↳ Video Bus                               	id=8	[slave  keyboard (3)]
    ↳ Sleep Button                            	id=9	[slave  keyboard (3)]
    ↳ Integrated Camera                       	id=11	[slave  keyboard (3)]
    ↳ AT Translated Set 2 keyboard            	id=12	[slave  keyboard (3)]
    ↳ ThinkPad Extra Buttons                  	id=14	[slave  keyboard (3)]
    ↳ ACPI Virtual Keyboard Device            	id=15	[slave  keyboard (3)]

Nun die Belegung für die Maus setzen:
xinput set-button-map 10 3 2 1

fertig. 🙂

Led Lampen mit WLAN Anbindung

Ein Thema das mich immer wieder fasziniert ist die Vernetzung von Gegenständen des Alltags. Meine Wohnzimmerlampe glänzt nicht nur durch hässliche Form sondern auch durch kaltes Licht und Quecksilber im Leuchtmittel. Deshalb ersetze ich nach und nach Kompaktleuchtstofflampen durch LED Lampen. Der Zufall brachte mich zu diesem Lampenset mit WLAN Anbindung (Affiliate) vom Hersteller LimitlessLED. Die Lampen passen in E27 Sockel, haben 6 Watt Leistung und können mit 230V ~  betrieben werden. Die Grundidee ist die Lampen via Smartphone oder auf anderen Wegen einzuschalten, die Farben zu ändern und dimmen.Neben den 3 Lampen werden eine Fernbedienung und was viel interessanter ist einem Controller mit dokumentierter API geliefert. Apps gibt es auch! Pro Fernbedienung und Controller kann man 4 Lampen steuern. Dabei kann man die Parameter Helligkeit, Farbe regeln.

2013-10-15 16.56.18

 

Impressionen

Inbetriebnahme

Lampen

Jede Lampe muß konfiguriert werden. Dabei spielt es keine Rolle, ob man sie der Fernbedienung oder in der App konfiguriert.

Lampe in Fassung drehen und binnen 2 Sekunden nach Anlegen von Spannung auf der Fernbedienung einen Kanal aktivieren – die Lampe ist nun dem entsprechenden Kanal zugewiesen. Die erfolgreiche Zuweisung  wird durch Blinken quittiert. Um die Lampe aus dem Kanal zu lösen innerhalb von 2 Sekunden nach dem Einschalten 5 mal den entsprechenden Kanal auf der Fernbedienung aktivieren.

Controller

Der Controller wird per Micro-USB Kabel mit Spannung versorgt. Ich nutze ein Ladegerät für Smartphones. Nach dem Booten sollte man ein WLAN mit der SSID milight finden. Nun kann man der Anleitung folgen oder was ich als angenehmer per Webinterface konfigurieren. Dazu ins eigene WLAN verbinden und http://192.168.0.100/home.html aufrufen – ob die IP immer die gleiche ist kann ich nicht sagen. Hier muß in den STA Interface Settings das eigene WLAN konfiguriert werden.

App

Momentan nutze ich die in der Anleitung vorgeschlagene App Es gibt auch noch eine puristischere Version mit
Anbindung an Tasker – die  ohne Anpassungen leider nicht läuft.

LED Lampen ansteuern

Beim Hersteller gibt es eine Dokumentation.  Die Beispiele sind leider ein wenig inkonsistent, da irgendwann die Portnummer von 50000 auf 8899 umgestellt wurde.

Die Lampen werden per UDP Kommandos gesteuert. Dabei werden immer 3 Byte übertragen.

Byte 1 ist das Kommando an welches immer der Suffix 0x00  0x55 angehängt werden muß.

In PHP kann mit diesen Zeilen alle Kanäle einschalten:

&lt;?php
define("CONTROLLER_IP", "192.168.0.100");
function executeCommand( $ip, $command, $suffix1=00, $suffix2='55'){
	fwrite(fsockopen("udp://$ip", 8899), chr(hexdec($command)) . chr(hexdec($suffix1)) . chr(hexdec($suffix2)));
}
 
executeCommand(CONTROLLER_IP, 42);

Wer php5-cli installiert hat kann das Script auch auf der Kommandozeile nutzen. Für Freunde der Bash gibt es auch ein Script (geklaut bei Smileytechadventures)

#!/bin/bash 
 
if [ -z "$1" ] ; then 
    echo "You must enter a parameter: "  
    echo "  e.g. $0 allon" 
    exit 1 
fi 
 
incmd="$1" 
ipaddress="192.168.0.201" 
portnum="50000" 
 
allon="\x35\00\x55" 
alloff="\x39\00\x55" 
zone1on="\x38\00\x55" 
zone1off="\x3B\00\x55" 
zone2on="\x3D\00\x55" 
zone2off="\x33\00\x55" 
zone3on="\x37\00\x55" 
zone3off="\x3A\00\x55" 
zone4on="\x32\00\x55" 
zone4off="\x36\00\x55" 
 
eval incmd=\$$incmd 
 
echo -n -e "$incmd" &gt;/dev/udp/"$ipaddress"/"$portnum"

Ein wenig Heimautomatisierung ist auch schnell betrieben. Dieses Skript prüft, ob die Sonne untergegangen ist und schaltet in diesem Fall alle Lampen ein.

#!/usr/bin/php
&lt;?php define("CONTROLLER_IP", "192.168.0.100"); define("ZEIT_FUER_BETT", "23:59"); function executeCommand( $ip, $command, $suffix1=00, $suffix2='55'){ fwrite(fsockopen("udp://$ip", 8899), chr(hexdec($command)) . chr(hexdec($suffix1)) . chr(hexdec($suffix2))); } function getIp(){ return file_get_contents("http://icanhazip.com/"); } function getLatLongByIp($ip){ $geoplugin = unserialize( file_get_contents('http://www.geoplugin.net/php.gp?ip='.$ip) ); if ( is_numeric($geoplugin['geoplugin_latitude']) &amp;&amp; is_numeric($geoplugin['geoplugin_longitude']) ) { $ret['lat']= $geoplugin['geoplugin_latitude']; $ret['lon']=$geoplugin['geoplugin_longitude']; return $ret; } } $ret= getLatLongByIp(getIp()); $dateSunset=date_sunset(time(), SUNFUNCS_RET_TIMESTAMP,$ret['lat'], $ret['lon'], 90, 1); $dateSunrise=date_sunrise(time(), SUNFUNCS_RET_TIMESTAMP, $ret['lat'], $ret['lon'], 90, 1); //Zu einer festen Uhrzeit ausschalten if(date("H:i")&gt;= date(ZEIT_FUER_BETT)){
echo "schlafen";
	executeCommand(CONTROLLER_IP, 41);
	exit;
}  
//Nach Sonnenuntergang und vor Aufgang
if ( time() &gt;=$dateSunset &amp;&amp; $dateSunset &gt;$dateSunrise){
 
	executeCommand(CONTROLLER_IP, 42);
}else {
	executeCommand(CONTROLLER_IP, 41);
}

Das kleine Skript fühlt sich auf kleinen Linuxrechnern im eigenen Netzwerk sehr wohl und sollte per Cronjob alle 1 Minuten angestoßen werden.

*/1 *    * * *   /home/pi/sunrise.php

Inzwischen habe ich die Lampen seit einer Woche in Betrieb und viel Spaß damit. Die Lichtausbeute ist ausreichend, der Stromverbrauch in Ordnung. Der Preis ist mit 99 EUR schon sehr happig, aber es macht auch sehr sehr viel Spaß Skripte für die Lampen zu schreiben.

Schnelleinstieg in die Kommandozeile

Vor einem Monat fand die Confoo in Montreal, Kanada statt.  Bei der Konferenz ging es primär um die Entwicklung von Webandwendungen. Die Veranstaltung war also nur bedingt für den normalen Ubuntu-User von Interesse wenn  David Winterbottom dort keinen Vortrag gehalten hätte.

David betreibt die Webseite CommandLineFu. Dort kann man nützliche Befehle für die CLI suchen, einstellen, bewerten oder kommentieren.

In der ~60 Slides langen Präsentation werden wichtige Befehle, Ausgabeumleitung, die Bedienung von SSH und Screen und einiges mehr sehr anschaulich erklärt.

Vor allem User, die ein wenig vor der Kommandozeile zurückschrecken sollten sich die Präsentation unbedingt anschauen. Have Fun!!! 🙂

CommandLineFu for web developers