Mittwoch, 31. Januar 2018

Installation Raspberry Pi

Es ist immer wieder ein gefragtes Thema, es ist einige Zeit ins Land gegangen, ich halte eigentlich meinen Artikel vom September 2016 aktuell - aber jetzt ist Zeit für neues! Kurz knackig und ohne Prosa soll es werden.
Achtung: Es gibt seit 2021 die Möglichkeit mit dem Raspberry Pi Imager die Konfiguration des Images vor dem ersten Start vorzunehmen. Dabei ensteht eine Datei firstrun.sh in der Boot Partition, die man einfach kopieren und für die Zukunft aufbewahren könnte.
  1. Download raspbian-lite, aktuell die Version 2017-11-29 immer wieder von hier.
  2. Mit windisk32imager auf die SD Card schreiben, es entstehen zwei Laufwerke nur das Erste ist unter Windows lesbar.
  3. Eine leere Datei mit dem Namen ssh in diesem Laufwerk erstellen, sonst geht kein ssh nach dem Start. 
  4. Bei Modellen mit Wlan die Datei wpa_supplicant.conf in dieses Laufwerk kopieren um mit Wlan starten zu können. 
  5. SD Karte auswerfen.
  6. SD Karte in Raspberry Pi stecken und booten.
  7. Monitor und Tastatur braucht man nicht. Mit Putty auf Host raspberrypi verbinden und anmelden. User pi, Passwort raspberry
  8. Dem Sicherheitshinweis folgen und passwd eingeben -> Passwort ändern!

Vorbemerkung

Alle folgende Code Blöcke benötigen root Rechte. Deshalb bitte immer am Besten per sudo su ausführen. Man kann auch einzelne Befehle mit sudo davor ausführen, allerdings wird das bei Pipe Befehlen nicht durchgereicht. Ich empfehle die benötigten Abschnitte vorher in ein oder zwei  Scriptdateien zu packen und diese gleich mit auf die SD Karte zu kopieren.
Alle Dateien müssen im Linux Format (nur lf als Zeilenende) erzeugt/editiert werden! Unbedingt einen geeigneten Editor verwenden und auf das Format beim speichern achten!

Wlan 

Eine Text Datei mit Namen wpa_supplicant.conf und diesem Inhalt bereitstellen: Entweder in die /boot Partition vorm ersten Start oder später ins Verzeichnis /etc/wpa_supplicant/ kopieren.
country=DE
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
        ssid="FRITZ!Box 7490"
        psk="12345678901234567890"
}

Meine Grundeinstellung

Zeitzone, Sprache und  Hostname ändern. Entweder Menügeführt mit
sudo raspi-config
oder per Script / Shell Befehle
# Zeitzone
timedatectl set-timezone Europe/Berlin

# Konfigurieren lokale Sprache deutsch
localedef -f UTF-8 -i de_DE de_DE.UTF-8
localectl set-locale LANG=de_DE.UTF-8 LANGUAGE=de_DE
localectl set-keymap de
setupcon

# Hostname 
hostnamectl set-hostname mymachine

#Neustart
reboot

Das war es erstmal, Damit funktioniert bei allen Pi Versionen die eingebaute Hardware, inklusive Wlan und BT beim Pi3 oder Pi Zero W.

UART

Wer für Zusatz Module die serielle Schnittstelle am GPIO braucht, muss etwas zusätzlich konfigurieren.

Bei allen Pi Modellen muss dafür der Dienst serial-getty@ttyAMA0 deaktiviert werden.
# serial-getty@ttyAMA0.service deaktivieren
systemctl stop serial-getty@ttyAMA0.service
systemctl disable serial-getty@ttyAMA0.service
systemctl mask serial-getty@ttyAMA0.service
Bei den Modellen ohne BT ist die UART per default aktiviert.
Beim den Modellen mit BT muss die UART aktiviert und BT umkonfiguriert werden.
# serielle Schnittstelle aktivieren und mit BT Schnittstelle tauschen
echo "enable_uart=1" >> /boot/config.txt 
echo "dtoverlay=pi3-miniuart-bt" >> /boot/config.txt 
echo "core_freq=250" >> /boot/config.txt 
Für diesen Abschnitt ist ein Neustart erforderlich!
# Neustart erforderlich 
reboot

BT

Die Funktion von Bluetooth kann mit hcitool überprüft werden
hcitool dev
hcitool scan
hcitool lescan


Kamera aktivieren

# Kamera aktivieren
echo "start_x=1" >> /boot/config.txt
echo "gpu_mem=128" >> /boot/config.txt
echo "disable_camera_led=1" >> /boot/config.txt
# Neustart erforderlich
reboot

Sound 


Sound ist normal aktiviert (dtparam=audio=on)
Sollen andere User Audio ausgeben dürfen, müssen sie in der Gruppe audio sein (Beispiel)
sudo gpasswd -a fhem audio

Braucht man eine Möglichkeit um mp3 Dateien und ähnliches abzuspielen wird häufig mplayer empfohlen. Eine gute Alternative ist play.
sudo apt-get update
sudo apt-get install sox libsox-fmt-all


Dateifreigabe einrichten

Braucht man eine Freigabe für Dateien auf dem Pi, ist das mit Samba schnell erledigt. Achtung diese Freigabe ist völlig offen und ohne jede Anmeldung!
apt-get install samba
# Pfad erstellen
mkdir /var/SonosSpeak
chmod 777 /var/SonosSpeak/

# Share Definition in /etc/samba/smb.conf
echo '[SonosSpeak]' >> /etc/samba/smb.conf
echo '  comment = Audio-Files for SonosPlayer to Speak' >> /etc/samba/smb.conf
echo '  path = /var/SonosSpeak' >> /etc/samba/smb.conf
echo '  browsable = yes' >> /etc/samba/smb.conf
echo '  guest ok = yes' >> /etc/samba/smb.conf
echo '  read only = no' >> /etc/samba/smb.conf

# restart Service
systemctl restart smbd
Mit dieser Installation hat man auch die Befehle net rpc usw. zur Verfügung.
Wer einen smbclient braucht muss diesen noch installieren.
apt-get install smbclient

Sudoers

Will man einem bestimmten Benutzer Möglichkeiten geben für die man "root" Rechte braucht, geht das ganz einfach.
Das folgende Beispiel gibt dem Benutzer fhem die Möglichkeit das System herunterzufahren bzw. neu zu starten.
#!/bin/bash
# ergänze eine Datei zum sudoers Script Verzeichnis /etc/sudoers.d/
File="011_fhem-nopasswd"
echo "fhem ALL=(ALL) NOPASSWD: /sbin/reboot, /sbin/shutdown, /sbin/halt" >/etc/sudoers.d/$File
chmod 0440 /etc/sudoers.d/$File

Dienstag, 23. Januar 2018

NAS automatisch mit PC starten

Die Geräte sollte ja nur laufen wenn Sie wirklich gebraucht werden. Vom Windows PC aus ein Gerät per WOL starten geht ohne fremde Hilfsmittel.

Hauptscript

Die eigentliche Aufgabe erledigt das Script StarteNAS.ps1
Dies sendet ein magic Packet zur NAS, geht dann in eine Prüfschleife und wartet darauf, dass die IP Adresse der NAS erreichbar ist. Bei Erfolg oder Misserfolg wird der passende Balloon-Tip ausgegeben.
Die Zahl $x muss man seiner realen Umgebung anpassen, bei mir ist die NAS nach ca. 10 Schleifen Durchläufen gestartet, nach 15 Durchläufen ist irgendetwas schief gelaufen.

Hilfsmittel aus der Sammlung

Die Function Send-WOL habe ich im Scriptcenter der Technet gefunden. Ich habe diese im Script SendWOLPacket.ps1 noch mit der Variante kombiniert, einen oder mehrere PC aus einem vorhandenen Array zu starten.
Für etwas Benutzerinformation verwende ich noch das Script BalloonTipp.ps1 welches nur die Function Show-BalloonTip liefert. Wie der Name sagt, kann man damit Nachrichten im BalloonTipp Area von Windows erzeugen.
Beides sind nur allgemein verwendbare Scripts aus der Sammlung.

Installation

Alle 3 Scripts kopiert man in einen passenden Pfad, z.B. c:\Tools\Scripts
Es gibt viele Möglichkeiten ein Script bei der Anmeldung einen Benutzers zu starten, die allereinfachste ist immer noch der Autostartordner, auch wenn MS den immer weiter versteckt hat. So findet man ihn schnell:
Windows+r (Ausführen) und dort ins Fenster shell:startup eintragen und enter drücken. Schon wird der persönliche Autostartordner geöffnet.
Hier erzeugt man jetzt eine Verknüpfung mit folgendem Ziel:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -WindowStyle Hidden -ExecutionPolicy Bypass &'C:\Tools\Scripts\StarteNAS.ps1'

Tipp: Der Parameter ExecutionPolicy ignoriert die gleichnamige Einstellung im System.
Wer gerne den Link mit einem Script erzeugen möchte -> ShortCutFileErzeugen.ps1

NAS nach der Arbeit herunterfahren

Meine NAS kann eine oder mehrere IP Adressen überwachen und sich automatisch herunterfahren wenn diese IP Adressen im Netz nicht mehr aktiv sind. (Openmediavault Plugin autoshutdown)

Anmerkung: Ich habe festgestellt, dass wenn man die Scripte über Gist komplett als Zip Datei herunterlädt, sind die Inhalte beschädigt. Warum das so ist, weiß ich nicht. Also am Besten über die Raw Ansicht den Inhalt kopieren.

Donnerstag, 4. Januar 2018

WebDAV unter Windows

Auf jedem Windows Client System ist ein WebDAV Client implementiert. Damit ist der Zugriff auf WebDAV basierte Cloudspeicher ziemlich einfach. Der Client muss gestartet werden! In der Powershell relativ leicht zu kontrollieren:
get-service WebClient|Start-Service
Man kann entweder im Explorer unter "Dieser PC / Netzwerkadresse hinzufügen" einfach die WebDAV Adresse des Cloudspeichers (z.B. https://webdav.magentacloud.de) eingeben und wird nach dem Benutzerkonto gefragt.

Verbinden per Script

Man kann in der cmd Box ein Laufwerk mit dem guten alten net use Befehl verbinden:
net use Z: https://webdav.magentacloud.de /user:<user> <passwort>
Man beachte die Ausgabe, wenn man sich das Ergebnis dann mit net use anschaut :
Status       Lokal     Remote                    Netzwerk

-------------------------------------------------------------------------------
             Z:        \\webdav.magentacloud.de@SSL\DavWWWRoot
                                                Web Client Network

Die Webadresse wird anders dargestellt, das ist wichtig, wenn man die Verbindung mit Powershell erstellen will. Das cmdlet New-PSDrive braucht genau diese Schreibweise und akzeptiert die übliche https:// Darstellung nicht!
New-PSDrive -Name Z -Root \\webdav.magentacloud.de@SSL\DavWWWRoot -PSProvider FileSystem -Credential <user>
Das cmd-let akzeptiert auch kein Klartext Passwort als Übergabe, hier muss man zum PSCredential object greifen.
Vorteil: Man kann das Passwort verschlüsselt auf dem Computer speichern. Es ist nur auf diesem Computer lesbar und nicht kopierbar.

Hürden & Tücken

Laufwerk verbunden und einfach so beliebige Dateien kopieren - nicht bei Microsoft!?! Ist die Datei mal größer erhält man die Ausschrift: "Die Dateigröße überschreitet die maximal zulässige Größe" Und wie das so ist mit den Fehlermeldungen, man liest die Datei aus dem Netz und man bekommt aber die Ausschrift: "kann nicht gespeichert werden".

Größenbeschränkung

Microsoft hat die Dateigröße für den WebDAV Client auf 50000000 Byte dezimal beschränkt. Die maximale Dateigröße für WebDAV liegt bei 4 GByte ( 4.294.967.295 Byte dezimal).
Diesen Wert kann man in Powershell anzeigen bzw. setzen. Nach der Anpassung in der Registry muss der WebClient Dienst neu gestartet werden - ich habe alle notwendigen Befehle gleich in ein kleines Script gepackt.
# WebClient FileSizeLimitInBytes ueberpruefen und setzen
$Reg="HKLM:\SYSTEM\CurrentControlSet\Services\WebClient\Parameters"
$RegItem="FileSizeLimitInBytes"
$Value="4294967295"

$WebClient = get-Item -path $Reg|get-ItemProperty
Write-Verbose ("Die maximale FileSize WebDav ist derzeit: " + $WebClient.FileSizeLimitInBytes + " byte")

if (-not ($WebClient.FileSizeLimitInBytes -eq $Value)){
  Set-ItemProperty -Type DWord -Path $Reg -Name $RegItem -value $Value
  Write-Verbose ("FileSize WebDav auf $Value gesetzt")
  Restart-Service WebClient
  Write-Verbose "WebClient neu gestartet"
}

Windows Server 

Der WebDAV Client ist auf der Server Version nicht installiert. Man bekommt ihn für Windows Server 2008/2012 mit der Installation des Features desktop experience.
Install-WindowsFeature Desktop-Experience

Achtung: Leider behindert seit März 2019 das installierte Feature Desktop-Experience ganz massiv Windows Update unter Windows Server 2012. Damit ist das dort eigentlich nicht mehr verwendbar!

Beim Windows Server 2016 gibt es einen separaten Client.(das muss ich noch untersuchen) Quelle
Install-WindowsFeature WebDAV-Redirector –Restart

Etwas mehr Code

Noch ein Beispiel für den Umgang mit der WebDAV Schnittstelle. Das Script fragt beim ersten Aufruf das Passwort des Benutzer Kontos ab und speichert dieses. Wenn der Laufwerksbuchstabe schon existiert wird das Laufwerk gelöscht und das Script sofort beendet. Ansonsten wird das Laufwerk einfach verbunden. Man kann das Script also einfach zum Verbinden oder zum Löschen aufrufen.
Set-Location $PSScriptRoot
$UserName= "User Name"
$PWDFile=".\PASSWORD.txt"
$Drive="t"
$Share="\\sd2dav.1und1.de@SSL\DavWWWRootd"

#Testen ob Laufwerk schon existiert
If (test-path $Drive":\") {
    #Netzlaufwerk löschen
    Remove-PSDrive -name $Drive
    Write-verbose "Laufwerk $Drive entfernt"
    exit
    }

#Wenn Passwort nicht gespeichert vorhanden passwort abfragen und File erzeugen
If (-not (test-path $PWDFile)) { 
    $credential = Get-Credential -Credential $UserName
    $credential.Password | ConvertFrom-SecureString | Set-Content $PWDFile
    Write-Verbose "fehlendes PWD File fuer User $UserName erzeugt"
    }

#Credential aus Passwort Datei und Username erzeugen
$encrypted = Get-Content $PWDFile | ConvertTo-SecureString
$credential = New-Object System.Management.Automation.PsCredential($UserName, $encrypted)

#Netzlaufwerk verbinden
New-PSDrive -Name $Drive -Root $Share -PSProvider FileSystem -Credential $credential
Write-Verbose "Laufwerk $Drive zu Share $Share verbunden"

WebDAV als Transportmedium

So ein Cloud Speicher lässt sich ganz gut als Transportmedium verwenden. Man kopiert an einer Lokation Daten "in die Cloud" und an einer anderen Lokation holt man sie wieder "heraus". Ich habe hier ein gutes Script gefunden um Daten mit Powershell in Ordnern zu synchronisieren.

Mittwoch, 3. Januar 2018

WebDAV auf dem Raspberry

Wer einen Telekom Anschluss besitzt oder besaß hat dort einen "Cloud" Speicher von 25 GB - dauerhaft. Dieser beherrscht im Gegensatz zu Google Drive WebDAV.
Auch andere Provider (z.B. 1und1) bieten ihren Kunden Online Speicher mit WebDAV Zugriff.
WebDAV ist eine standardisierte Schnittstelle für die Einbindung als Laufwerk ins Betriebssystem, Linux, Windows - eigentlich können das alle.

Ich will hier kurz zeigen wie der WebDAV Zugriff unter Raspbian eingerichtet wird. Was uns an Vorrausetzungen fehlt, ist das Debian Paket davfs2
sudo apt-get update
sudo apt-get install davfs2
Bei mir brachte die interactive Installation die Frage nach dem Zugriff für alle User, diese bitte mit yes beantworten. Ansonsten kann man die Berechtigung später mit diesem Befehl korrigieren.
sudo dpkg-reconfigure davfs2 # interaktiv
sudo chmod u+s /usr/sbin/mount.davfs # direkt
Unter Linux braucht man einen Ort wo man ein Laufwerk "hin" mounten kann, wir erzeugen also einen Pfad mit entsprechenden Berechtigungen:
sudo mkdir /media/magenta
sudo chmod 777 /media/magenta
Da wir das Login zu Magenta Cloud nicht immer eintippen wollen, werden die Informationen entsprechend abgelegt. Der erste Befehl öffnet den Editor und am Ende der Datei wird die zweite Zeile eingefügt. Der Username ist die 12 stellige Zugangsnummer, das Passwort ist ein extra vergebenes WebDAV Passwort und nicht das Passwort vom Kundencenter.
sudo nano /etc/davfs2/secrets
https://webdav.magentacloud.de user passwort
Nun fehlt noch der mount Eintrag in der fstab, es wird nicht automatisch gemountet, alle User dürfen mounten und es ist beschreibbar:
sudo nano /etc/fstab
https://webdav.magentacloud.de /media/magenta davfs noauto,users,rw 0 0
Jetzt können wir das Laufwerk einbinden und den Inhalt anzeigen. Damit das ohne sudo funktioniert muss der User in der Gruppe davfs2 sein. Die Reihenfolge funktioniert so nicht direkt, der User Pi muss sich neu anmelden.
sudo usermod -aG davfs2 pi
mount /media/magenta
ls -l /media/magenta
umount /media/magenta

Hinweise

Bei wheezy gibt es eine Fehlermeldung, obwohl diese Datei erstmal keine Verwendung findet:
/sbin/mount.davfs: file /home/pi/.davfs2/secrets has wrong permissions
Abhilfe schafft der Befehl:
chmod 0600 .davfs2/secrets
Das WebDAV Laufwerk wird auf diese Art nicht automatisch beim Start angebunden. Das Netzwerk ist zu diesem Zeitpunkt noch nicht verfügbar und der automount über die fstab würde nicht funktionieren. Ist für mich kein Nachteil, weil es jederzeit in einem Script per mount Befehl angebunden werden kann.

Manche Webdav Server unterstützen kein file locking (Fehlermeldung:the server does not support locks). Will man die resultierende Fehlermeldung nicht sehen, hilft ein Eintrag in der Datei davfs2.conf.
sudo sh -c 'echo "use_locks 0" >> /etc/davfs2/davfs2.conf'

 Mehr Sicherheit

Wir haben oben das Konto für den Zugriff auf WebDAV global abgelegt, man kann es auch restriktiver für einen bestimmten Benutzer machen. Anstatt der Ablage des Kontos in der Datei/etc/davfs2/secrets, kann die Information auch sicher vor dem Zugriff andere im User Home Verzeichnis hinterlegt werden (Quelle):
touch /home/$(whoami)/.davfs2/secrets
chmod 0600 /home/$(whoami)/.davfs2/secrets
echo "https://cloud.example.com/webDAV/URL <username> <password>" > /home/$(whoami)/.davfs2/secrets

Zum Nachlesen

Wiki fstab
Wiki rsync
Wiki cp
Wiki inotify
lsynd und Beispiel