Donnerstag, 1. Februar 2018

Setup FHEM

Es gibt einen aktuellen Artikel. Detail werden aber weitestgehend hier erklärt.

FHEM installieren ist eigentlich ziemlich einfach. Bevor meiner folgenden Anleitung gefolgt wird, sollte man sich unbedingt hier über den aktuellen Stand informieren. Mit minimalem Aufwand kann man das Setup von hier durchführen.
Alle meine Setup Schritte erfordern erhöhte Rechte. Also bitte alles in einer "sudo su" Session ausführen!
Und so setze ich diese Aufgabe praktisch in einem Script um:
# von debian.fhem.de installieren - siehe aktuelle Anleitung dort https://debian.fhem.de/
wget -qO - http://debian.fhem.de/archive.key | apt-key add -
echo "deb http://debian.fhem.de/nightly/ /" >> /etc/apt/sources.list
apt-get update
apt-get install fhem

Den zusätzlichen Eintrag in der sources.list entfernt das Setup Programm von FHEM. Alle benötigten und sinnvollen debian Pakete werden automatisch mit installiert. Ist ein systemd System vorhanden wird auch der Dienst für FHEM entsprechend installiert.

Damit ist man grundlegend fertig! Aber ein paar Dinge fehlen noch!

Das aus meiner Sicht wichtigste aktuelle Feintuning des frischen FHEM ist die Deaktivierung der USB Stick Erkennung. Dieser kleine direkte Patch auf diese Art ist nur unmittelbar nach der Installation zulässig! Später muss man diese Attribute bitte über die FHEM Oberfläche setzen.
# Den USB Check besser abschalten
/opt/fhem/fhem.pl 7072 "attr initialUsbCheck disable 1"
/opt/fhem/fhem.pl 7072 "save"

Weitere Attribute die man irgendwie braucht, kann man einfach über die Raw definition setzen. Die findet man in jeder Detail Ansicht von Definitionen ganz unten in der Mitte als Link.
attr global backup_before_update 1
attr global commandref modular
attr global title FHEM-Name
attr global sendStatistics onUpdate
attr global latitude 51.xxxxxxxxxxxxx
attr global longitude 12.xxxxxxxxxxxxx
attr global language de
attr WEB JavaScripts codemirror/fhem_codemirror.js
attr WEB codemirrorParam { "theme":"blackboard", "lineNumbers":true }
attr WEB plotfork 1
attr WEB longpoll websocket

Fast fertig - allowed

ToDo

Speziell - Mplayer Ersatz

Ich arbeite viel mit Ansagen unter anderem mit Text2Speech.
Nachtrag: Mittlerweile ist der Aufruf für play direkt mit Parametern im MplayerCall eingebaut. Das Script ist also überflüssig.
Aktuell verwende ich dieses Script um mplayer zu ersetzen. In der Quelle gibt es auch noch eine Variante mit setzen des AUDIODEV.
#!/bin/sh
# die Kommentarezeichen vor echo  fuer den Test entfernen
# echo Parameteranzahl $# > /tmp/mplay.txt

# falls volume nicht vorhanden = 1
volume=1
# Alsa Device, Volume und Dateinamen ermitteln
while [ $# -gt 0 ]
do
# echo $1 >> /tmp/mplay.txt
 if [ $1 = -ao ]
 then
  shift
#   echo $1 >> /tmp/mplay.txt
  device=$(echo $1|cut -d= -f2)
#   echo $device >> /tmp/mplay.txt
 elif [ $1 = -volume ]
 then
  shift
#  echo $1 >> /tmp/mplay.txt
   if [ $1 -lt 100 ]
   then
    volume=0.$(($1))
   fi
 elif [ -e $1 ]
 then
  file=$1
 fi
 shift
done
#echo $volume $file >> /tmp/mplay.txt
play -q -v $volume $file
exit 0

Dieses Script muss für FHEM ausführbar sein. Wenn man es im aktuellen Homdedir liegen hat (User pi) dann kann man es wie folgt als User fhem an Ort und Stelle kopieren. Automatisch mit den richtigen Rechten und Besitz.
sudo -u fhem cp mplayer.sh /opt/fhem/
chmod +x /opt/fhem/mplayer.sh
Zur Vorbereitung sind zwei Pakete erforderlich.
sudo apt-get install libdigest-sha-perl mp3wrap
In Text2Speech kann man einfach den Aufruf durch dieses Script ersetzen. Minimal kann man Text2Speech so definieren:
define MyTTS Text2Speech default
attr MyTTS TTS_MplayerCall /opt/fhem/mplayer.sh

Weitere Software Pakete installieren

Viele der Module in FHEM erfordern zusätzliche Software auf System Ebene.
Aus meiner Liste sind bisher folgende debian Pakete noch nicht installiert
sudo apt-get install avrdude libcrypt-cbc-perl libcrypt-ecb-perl libcrypt-rijndael-perl libdigest-md5-perl libimage-info-perl liblwp-useragent-determined-perl libmime-base64-perl libnet-telnet-perl libnet-upnp-perl libsoap-lite-perl libxml-parser-lite-perl libxml-parser-perl sendemail
Diese Pakete müssen mit cpan installiert werden, es gibt kein debian Paket.
sudo cpan install Crypt::Rijndael_PP

Das folgende Script ermittelt ob die Pakete schon installiert sind und gibt eine Liste der noch nicht installierten Pakete aus. Der Aufruf erfolgt mit Übergabe der zu ermittelnden Pakete.
bash software.sh paket1 paket2 paket3
Script software.sh
# Eine von beiden Zeilen auskommentieren
#echo -n "cpan install " >notinstalled.sh
echo -n "apt-get install " >notinstalled.sh
while [ $# -gt 0 ]
do
# eine von beiden Zeilen auskommentieren
#perl -M$1 -e '' 2>/dev/null
dpkg -s $1 &> /dev/null

if [ $? -eq 0 ]; then
    echo $1" is installed!"
else
    echo $1" is not installed!"
    echo -n $1" " >>notinstalled.sh
fi
shift
done

Man kann auch nur die Perl Module ermitteln, die im System installiert sind.
Aus diesem Beitrag mal abgeleitet könnte man alle Module ausgeben, die in einem System vollständig installiert sind:
dpkg -l |grep ^ii| awk '{ print $2 }'
Oder nur die Perl Module
dpkg -l |grep -i '\-perl'| awk '{ print $2 }'

Diese List könnte man von Zeilenumbrüchen befreien:
|tr -d "\r"|tr "\n" " "

...und in ein ähnliches Script wie oben einspeisen. Damit hätte man alle Pakete die nicht installiert sind. Das geht auch gleich remote von der "Quell Maschine". (Alle Pakete außer die mit "raspberry" in der Zeile)
bash software.sh $(ssh pi@remotehost "dpkg -l " |grep ^ii|grep -vi raspberry | awk '{ print $2 }' |tr -d "\r"|tr "\n" " ")
Das abgewandelte software.sh Script mit Loggingfunktion
LOG=DiffInstall.log
{
date
while [ $# -gt 0 ]
do
   if dpkg -s $1 &> /dev/null
     then
        echo $1" is installed!"
     else
        apt-get -y install $1
   fi
   shift
done
} >> $LOG 2>&1

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

Da in modernen debian Systemen der mount von systemd durchgeführt wird, muss man anschließend noch systemctl daemon-reload ausführen (Fehlermeldung).

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

Donnerstag, 28. Dezember 2017

Netzlaufwerke verbinden Windows 10 Version 1709

Mit der Version 1709 von Windows 10 hat man mal wieder ein verändertes "Anmelde" Verhalten Microsoft hat da wieder kräftig "optimiert" - was (wie schon so oft im Leben von Windows) mal wieder dazu führt, dass Netzlaufwerke nach der Anmeldung mit einem roten Kreuz versehen sind und Applikationen die diese Netzlaufwerke brauchen nicht funktionieren.
Klar, ein Doppelklick auf das rote Kreuz im Explorer behebt das Problem.
Das Verhalten ist davon abhängig wie schnell man sich nach dem Systemstart anmeldet, wartet man erst eine Weile, hat man unter Umständen rote Kreuze an den Laufwerken:

Automatische Abhilfe würde eine kleine Batchdatei schaffen, die man einfach in den Autostartordner des Benutzers legt, der sich anmeldet.
Apropos Autostart Ordner - wo ist der eigentlich? - Der wird seit einigen Windows Versionen auch ziemlich versteckt. Man erreicht ihn eigentlich nur noch über:
Windows + "R"
shell:startup eintippen und enter

Dort erzeugt man eine neue Textdatei mit beliebigen Namen und der Endung bat oder cmd mit folgendem Inhalt:

@echo off
set Server=<Servername>

REM es gibt Problem mit dem find Befehl wenn man sich nicht im Systempfad befindet
cd %SystemRoot%\system32

REM zunächst prüfen ob der Server online ist, wenn nicht Warteschleife
:Loop
ping -n 1 -w 5000 %Server% | find /i "Zeit" && (goto Online)
echo Server %Server% ist nicht erreichbar! 
timemout 10
goto Loop

:Online
REM zunächst Laufwerk löschen und dann wieder verbinden
if exist V: net use /d /yes V: > NUL
net use V: \\%Server%\Videos /yes > NUL

Dieses Script muss man natürlich für Servernamen,  Laufwerk und Share anpassen. Es sind mehrere Laufwerke möglich, einfach die letzen beiden Zeilen kopieren, einfügen und modifizieren.

Eine von vielen alternativen Möglichkeiten diese Datei bei der Anmeldung auszuführen wäre die Aufgabenplanung.

Die Grundlage für mein Script stammt aus dieser Quelle. Es gibt aber ganz wesentliche Änderungen:

  1. find /i "TTL" im Original funktioniert nur für IPV4, bei IPV6 ist die Antwort ohne TTL. Das "Zeit" Feld existiert aber bei beiden IP Versionen. Hier kann sich jederzeit wieder etwas ändern. Insbesondere Sprachabhängigkeiten!
  2. net use im Original forciert nicht die vorhandene Verbindung zu überschreiben. Mit dem Zusatz /yes wird auch eine leicht anders lautende Verbindung für das gleiche Laufwerk überschrieben.

Sonntag, 26. November 2017

Windows Speicherpools umziehen

Was ist ein Speicherpool?

Speicherpools sind ein Windows Feature ab Version 8 bzw. Server 2012. Dabei werden physische Datenträger quasi virtualisiert und es lassen sich allerlei Skalierungs- und Ausfallsicherheitsfeatures einrichten.

            physische Datenträger -> Speicherpool -> virtuelle Datenträger

Wenn man einen solchen Speicherpool von einer Installation auf eine Andere einfach "umstecken" will - also im einfachsten Fall einen Server nicht aktualisieren sondern neu installieren will und die Datenplatten erhalten bleiben sollen, muss man im neuen System den Speicherpool wieder aktivieren. Er wird nicht von selbst wieder eingebunden!

Ansicht in der Datenträgerverwaltung 

Ist der Speicherpool aktiv werden die virtuellen Datenträger angezeigt, die physischen sind nicht zu sehen.
Ist der Speicherpool nicht aktiv, werden die physischen Datenträger offline oder nicht angezeigt.

Einen unbekannten Speicherpool wieder einbinden

Die Verwaltung erfolgt im Servermanager - die ersten beiden Schritte im
-> Datei und Speicherdienste -> Volumes -> Speicherpools

Es ergibt folgendes Bild:
Physischer Datenträger: ok
Virtueller Datenträger und Speicherpool: gelbes Dreieck (unbekannt/getrennt unbekannt/unbekannt)

Man klickt mit mit rechts auf den Speicherpool und wählt "Schreibzugriff festlegen".
Damit verschwindet das gelbe Dreieck vor dem Speicherpool. Offenbar wird dieser Schreibzugriff in den Speicherpool geschrieben, dies ist beim zweiten Versuch nicht mehr wiederholbar.

Danach klickt man rechts auf den virtuellen Datenträger und wählt "virtuellen Datenträger anfügen".

Man wechselt im Servermanager die Ebene für die abschließenden zwei Schritte
-> Datei und Speicherdienste -> Volumes -> Datenträger
Hier erscheint jetzt der virtuelle Datenträger aber mit dem Zusatz offline.
Mit einem Rechtsklick kann man ihn online Schalten, allerdings erhält er den nächsten freien Laufwerksbuchstaben. Den kann man hier aber sofort ändern.

Dieser virtuelle Datenträger (nicht der physische) erscheint jetzt auch in der normalen Datenträgerverwaltung.

Leider ist diese Einbindung noch nicht dauerhaft und würde einen Neustart nicht überleben.
Mit powershell und dem Befehl
Get-VirtualDisk
Sieht man das der virtuelle Datenträger auf "IsManualAttach" steht. Powershell liefert uns die Möglichkeit das zu ändern (Quelle):
Get-VirtualDisk | Where-Object {$_.IsManualAttach –eq $True} | Set-VirtualDisk –IsManualAttach $False