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

Ansible Vaults bequem editieren

Ansible ist eine ganz nette Software um Serverlandschaften deklarativ zu administrieren /konfigurieren. Nicht so schön ist die Tatsache, daß alles per Yaml definiert wird – einer Auszeichnungssprache die mit Einrückungen arbeitet. Unangenehm wird es, wenn man Vault Files editieren möchte. Diese sind mit einem Passwort verschlüsselt und müssen mit dem Befehl

ansible-vault

entschlüsselt werden. Im Erfolgsfall öffnet sich nun der Default Editor (konfiguriert über update-alternatives –config editor unter Debian oder Ubuntu).

Das funktioniert prinzipiell, ist aber sehr fehleranfällig beim Anlegen von neuen Strukturen. Um z.B. Sublime Text für das Editieren zu nutzen muß nur die EDITOR Variable gesetzt werden :

EDITOR="subl -n -w"

Um den Editor dauerhaft auf Sublime umzustellen muß die Variable nur in die Shell Konfiguration ( ~/.bashrc) eingetragen werden:

export EDITOR="subl -n -w"

Pipe Operator in Ansible nutzen

Ansible ist ein nettes Tools  um deklarativ Rechner über SSH zu administrieren oder aufzusetzen. Deklarativ meint, daß man Zustände definiert die Ansible herbeiführen soll. Man erklärt in Tasks welche Software auf einem Rechner installiert sein soll und Ansible führ diesen Zustand herbei.

 

Ab und an muß man diesen deklarativen Pfad leider verlassen. Im konkreten Beispiel müßen alte Datenbanken (benannt nach dem Schema YYYY-mm-dd-hh-i-s)  gelöscht werden damit das RDBMS nicht volläuft. Wichtig ist es statt command shell zu nutzen, da es sonst mit dem Pipen nicht klappt.

- name: remove old databases
  shell: mysql  --user={{ vault_mysql_server[env][tld].wp_content_user }} --password='{{ vault_mysql_server[env][tld].wp_content_password }}'  --batch --execute "show databases;" |grep wp_content|sort -hr  |tail -n+4|while read line; do mysql  --user={{ vault_mysql_server[env][tld].wp_content_user }} --password='{{ vault_mysql_server[env][tld].wp_content_password }}'  --batch --execute  "DROP DATABASE $line;" 2>/dev/null;done
  register: debugOutput

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

Jenkins – Authentifizierung mit jenkins-cli.jar

Momentan konfiguriere ich mir einen Jenkins CI Server für private PHP Sachen. Da ich das nicht alle Tage mache schreibe ich mir hakelige Sachen oder Dinge die ich recherchieren mußte hier für das nächste mal nieder. Ich werde den Server primär zum Ausführen von Unit-Tests, dem Erzeugen von Dokumentation und Softwaremetriken nutzen. Eventuell hänge ich noch ein Deployment dran.

Eine schöne Anleitung für die PHP Projekte gibt es hier. Wenn man den Server per Kommandozeile steuern möchte – um z.B. Plugins zu installieren – muß man sich per SSH Key authentifizieren.

Hier die Konfiguration auf der Kommandozeile + Webinterface im Schnelldurchgang:

1. jenkins-cli.jar besorgen

Von der Seite http://yourserver.com/cli runterladen – der Eintrag im Jenkins Wiki zu dem Thema ist auch sehr nützlich

2. Key erzeugen

ms@jenkins:~$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ms/.ssh/id_rsa): id_rsa_jenkins_cli
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in id_rsa_jenkins_cli.
Your public key has been saved in id_rsa_jenkins_cli.pub.
The key fingerprint is:
xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx ms@jenkins
The key's randomart image is:
+--[ RSA 4096]----+
| cxxxxxxxxxxx    |
| xxxxxxxxxxxx    |
| xxxxxxxxxxxx    |
|   xxxxxxxxxx    |
|     xxxxxxxx    |
|       x         |
|                 |
|                 |
|                 |
+-----------------+
ms@jenkins:~$ mv id_rsa_jenkins_cli* .ssh/

3. Public Key im Jenkins Webinterface eintragen

Die Url lautet https://yourserver.com/me/configure

ms@jenkins:~$ cat .ssh/id_rsa_jenkins_cli.pub

4. Beim Aufruf von jenkins-cli.jar den Pfad zum Key mit -i mitgeben.

ms@jenkins:~$ java -jar jenkins-cli.jar -i .ssh/id_rsa_jenkins_cli -s http://localhost/jenkins install-plugin checkstyle cloverphp crap4j dry htmlpublisher jdepend plot pmd violations warnings xunit
Installing checkstyle from update center
Installing cloverphp from update center
Installing crap4j from update center
Installing dry from update center
Installing htmlpublisher from update center
Installing jdepend from update center
Installing plot from update center
Installing pmd from update center
Installing violations from update center
Installing warnings from update center
Installing xunit from update center

DNS für Entwickler

Als Webentwickler gerät man schnell in die Problematik das geschriebene Markup auf Tablets, Telefonen, TV Geräten usw. zu prüfen.  Ich schreibe eigentlich immer an mehreren Projekten gleichzeitig und löse das durch Subdomains auf localhost. Klappt auch ganz gut, aber spätestens wenn ich in oben genannte Situation komme oder ein Kollege nen Blick von seiner Maschine drauf werfen will wird es schnell doof.  Ein Dienst der Aussagen wie „Geh auf http://dev.michael.irgendwas!“ ermöglicht muß her.

In meinem Fall lautet die Lösung dnsmasq – ein im Vergleich zu bind9 sehr einfach zu konfigurierender DNS Dienst.

Dnsmasq löst dev.michael.office bis michael.office auf. Das dev erledigt meine Maschine. Das hat den Vorteil, daß man nicht für jede neue Subdomain und jeden neuen Entwickler die Config anpassen muß.

Zuerst wird im Router ein weiterer DNS Server eingetragen – in einem meiner Fälle ein Raspberry Pi. Auf der Kiste wird nach der Anleitung im Ubuntuusers Wiki dnsmasq installiert.

Die Konfiguration ist wirklich simpel.

Zuerst in der /etc/hosts auf dem dnsmasq server die domains auflösen

#......
#Ip                         Domainname             Machine 
192.168.0.105               dns.office		   this
192.168.0.104	            michael.office         michael's machine
192.168.0.104	            hans.office            hans machine

Um alle Domains die hintendran oder davor hängen (kommt auf die Leserichtung an:-) ) muß noch eine Regel erstellt werden.

Die Konfiguration meiner Kiste auf dem dnsmasq server

pi@funkybert ~ $ cat /etc/dnsmasq.d/thinkpad 
address=/.thinkpad.home/192.168.0.104

Der Rest der Domain wird lokal aufgelöst:

ms@w530 ~ $ cat /etc/hosts
 
#.........
127.0.1.1 dev.michael.office

 

Zum Debuggen ist das Tool dig sehr zu empfehlen.

ms@w530 ~ $ dig michael.office

Zeigt wie die Domain aufgelöst wird.

ms@w530 ~ $ dig michael.office @192.168.0.105

Zeigt wie die Domain von dem DNS Sever unter 192.168.0.105 aufgelöst wird.

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.

Debian Wheezy auf dem Raspberry Pi installieren

Seit etwa einem Jahr nutze ich einen Raspberry Pi um mir damit Filme und Serien anzuschauen.Läuft ganz gut und mit OpenElec etwas flüssiger in der Menüführung als Raspbmc.Wenn weitere Dienste laufen wird das Filmvergnügen leider ein wenig ausgebremst weshalb ich mir ein zweites Gerät zugelegt habe.Auf dem neuen Raspberry Pi soll nun Debian seine Dienste verrichten und mir als Pyload Server und digitales Tor zu meiner Bude via sshd dienen.

Ich habe keine Lust den Pi mit Monitor und Tastatur zu schmücken, deshalb wird das System als Image auf eine SD Karte geschrieben und gut ist.

Die Debian Version für den Pi nennt sich Raspbian und läßt sich auf der Homepage des Projekts downloaden.

Eine Variante von Debian für den Pi nennt sich Raspbian und läßt sich auf der Homepage des Projekts downloaden.

1. Image auf die SD Karte schreiben, Pi starten

Die Blocksize war in der offiziellen Anleitung leider falsch angegeben.

root@debian:/home/ms/Downloads# dd bs=1M if=2014-01-07-wheezy-raspbian.img of=/dev/mmcblk0
root@debian:/home/ms/Downloads# sync

Pi vom Stromnetz trennen, Karte einstecken. Wenn nur eine rote LED leuchtet ist etwas schief gegangen
Nun dem Pi ein wenig Zeit zum booten geben und per nmap nach neuen Geräten suchen

ms@debian:~$ nmap -sP 192.168.0/24

2. Initiale Konfiguration

Per SSH einloggen, Konfiguration ausführen

#default password raspberry
ms@debian:~/Downloads$ ssh pi@192.168.0.110
pi@raspberrypi ~ $ sudo raspi-config

Erstmal Vim und Screen installieren

pi@raspberrypi ~ $ sudo su
root@raspberrypi:/home/pi# apt-get update
root@raspberrypi:/home/pi# apt-get install vim screen

Swap anpassen

root@raspipy:/home/pi# echo "CONF_SWAPSIZE=512" > /etc/dphys-swapfile
root@raspipy:/home/pi# dphys-swapfile setup
want /var/swap=512MByte, checking existing: deleting wrong size file (104857600), generating swapfile ... of 512MBytes
root@raspipy:/home/pi# dphys-swapfile swapon

3. NFS Freigaben einrichten

Ich nutze für Dateifreigaben nur noch nfs, das ist schneller als Samba und man hält sich den M$ Mist aus dem Netz. Mußte den Daemon ein wenig anpassen (Kernel Version 3.10 vom 2014-01-07).

NEED_STATD auf YES setzen in /etc/init.d/nfs-common
Einmal alles bezüglich NFS neustarten oder rebooten.

Die Shares einrichten und mounten (die uninteressanten Dinge aus fstab habe ich entfernt):

root@raspipy:/home/pi# cat /etc/fstab
192.168.0.50:/media_movies /media/nfs_movies nfs auto,rw 0 0 
192.168.0.50:/media_serien /media/nfs_serien nfs auto,rw 0 0
192.168.0.50:/downloads /media/downloads nfs auto,rw 0 0
root@raspipy:/home/pi# mkdir /media/nfs_movies
root@raspipy:/home/pi# mkdir /media/nfs_serien
root@raspipy:/home/pi# mkdir /media/downloads
root@raspipy:/home/pi# mount -a

Das wars soweit mit der Einrichtung von Debian. Ich habe zusätzlich den Port 22 am Router auf den Pi weitergeleitet und in /etc/ssh/sshd_config Logins mit Passwort verboten. Demnächst gehts weiter mit der Einrichtung von Pyload oder was Anderem wenn es mir nicht taugt :).

Mehrere Bildschirme mit dem Thinkpad W530

Eines der nervigsten Bastelthemen die mich jemals beschäftigt haben war die Konfiguration dieses Laptops für den Linuxbetrieb. Die Installation von Debian verlief problemlos – das Thinkpad wollte jedoch auf Gedeih und Verderb nicht mit mehreren Displays arbeiten. In dem Thinkpad arbeiten 2 Grafikkarten, eine von Intel und eine NVIDIA Optimus. Da mir das Umschalten mit Bumblebee zu umständlich war habe ich im BIOS die NVIDIA Karte als Default ausgewählt – siehe Screenshots und den proprietären NVIDIA Treiber installiert.

Diese Konfiguration läuft jedoch nur bedingt – ab und an bootet das System und manchmal leider nicht. Das Stichwort lautet waiting for /dev to be fully populated. Die Lösung ist dieses Problems ist absolut logisch und selbst für den Laien verständlich – im BIOS einfach die Virtualisierung deaktivieren und alles ist gut.

Da ich die letzten 12 Monate wenig Zeit und noch mehr Arbeit hatte begleitete mich dieses Problem wirklich sehr lange – zeitweise mußte ich sogar einen sehr bizarren KDE Klon zum Arbeiten verwenden.

Die Früchte dieser merkwürdigen Konfigurationsarbeit sehen dann so aus:

 

4 mal Slayer

 

2 Displays sind via DisplayPort angeschlossen und eines über VGA. Einen sinnvollen Verwendungszweck habe ich für soviele Displays noch nicht gefunden. Aber auf 3 Screens läßt sich wunderbar Java schreiben:)