Sonos: Gut zu wissen

Dieser Beitrag ist “Deprecated”. Sonos ist dabei das schöne Upnp mit ihrer neuen API abzulösen (siehe https://developer.sonos.com/). Es wird wohl zwei API-Versionen geben. Eine für private Developer, für welche eine Cloud-API zur Verfügung gestellt wird und eine für Firmen, welche ein “lokales” API nutzen (und sich dafür zertifizieren) dürfen. Für Entwickler wie mich wäre also zukünftig das Ansteuern der Boxen nur noch über die Cloud möglich, was für mich nicht in Frage kommt. Ich hoffe Sonos bietet da dann doch noch etwas womit die Sonos Boxen über das LAN angesprochen werden können. Aktuell sieht es aber leider nicht so aus. Erste Funktionen, welche ich hier noch beschrieben habe, sind bereits durch Firmware-Updates herausgefallen (z.B. reboot). Wundert euch also nicht, wenn nicht mehr alle Upnp oder HTTP-Calls funktionieren.

Mittlerweile habe ich meine Sonos Boxen verkauft und bin auf eine OpenSource-Lösung, basierend auf Hifiberry und Max2Play umgestiegen. Damit ist es möglich, die gleiche Funktionalität von Sonos mit eigenen Boxen nachzubauen. Wie ich das gemacht habe, werde ich hier dokumentieren – sobald ich Zeit dafür habe.

Hints, Tips und Tricks rund um Sonos

Mein Sonos System umfasst insgesamt 7 Player (1 Sonos Soundbar und 6 Sonos Play:1). Sonos erstellt und unterhält sein eigenes Netz (Sonos-Net) selber. Grundsätzlich funktioniert das “out of the box”. Es kann aber doch manchmal nötig sein das Sonos-Net zu optimieren. Dazu anbei ein paar nützliche Infos:

Tools

Auf jeder Sonos-Box läuft ein Webserver, den man über den Browser ansprechen kann. Dabei können einige nützliche Infos eingesehen oder aber auch Einstellungen vorgenommen werden:

http://IP:1400/support/review Übersicht über die Sonos Box. Hier kann auch die Network-Matrix aufgerufen werden
http://IP:1400/advconfig.htm Einstellen der Root-Bridge (FirstZP und Priority auf „enabled“).
http://IP:1400/reboot Reboot der Sonos Box
http://IP:1400/region.htm WLAN Region sezten  (bei uns EU – Europa)
http://IP:1400/tools.htm Netzwerktools wie Ping, Traceroute, nslookup
http://IP:1400/status Status-Seite
http://IP:1400/wifictrl?wifi=off Stellt das WIFI bis zum nächsten Reboot ab
http://IP:1400/wifictrl?wifi=persist-off Stellt das WIFI Interface komplett ab. Wenn man nur über Kabel arbeiten möchte
http://IP:1400/status/scanresults Scanresults zeigt euch alle WLAN-Verbindungen an, welche von Sonos erreicht wurden. Kann je nachdem noch nützlich sein, für Android Smartphones gibt es da noch bessere Apps
http://<IP>:1400/status/tracks_summary Mit diesem Befehl kannst Du dir die Anzahl der Tracks anzeigen lassen
http://<IP>:1400/status/topology Zeigt die Sonos Topologie mit allen Sonos Playern und Media Servern

Nützliche Links:

Raspberry Images komprimieren/verkleinern

Hier beschreibe ich, wie man Images einer ganzen HD/SD ziehen kann. DD erstellt 1:1 Kopien und die daraus resultierenden Images sind entsprechend gleich gross wie die ursprüngliche HD/SD. Wenn man nun ein Image eines Raspberry Pis auf eine kleinere SD kopieren möchte, gibt es ein schönes Tool dazu: Pishrink

Hier wird schön beschrieben, wie man das Tool installieren und nutzen kann.

Linux Referenz Card

Hilfe

man cmdLesen des Manualeintrags zu cmd
man -k printfDurchsucht den Index der Manpages (Whatis-Datenbank) nach Stichworten (hier printf)
type cmdAnzeigen der Art, resp. des Typs von cmd
file fileAnzeigen der Art, resp. des Typs von file
whereis cmdSuchen des Speicherortes von cmd

Allgemeine Commands

dateAusgabe der Zeit und des Datums
echo [-n][Argumente]Ausgabe der Argumente (-n keine NewLine am Ende)

File/Directory Commands

pwdAnzeigen des aktuellen Datums
cd [directory]Wechseln des aktuellen Directories zu directory
ls [files(s)/director(ies)]Anzeigen von Files / Directories
cp source(s) targetKopieren von Files / Directories
rm file(s) / director(ies)Löschen von Files / Directories
mv file(s) / director(ies)Verschieben (auch Umbenennen) von Files / Directories
mkdir [-p] directory(ies)Erstellen eines leeren Directories (-p ganze Trees)
ln [-s] source targetErstellen eines Links (-s symbolischer Link)

File Commands

Wenn kein file(s) Parameter => Lesen von StdIn

cat [file(s)]Ausgeben / Zusammenhängen von Files
more, less file(s)Seitenweises Lesen von Files
cmp, diff file1 file2Vergleichen zweier Files
touch file(s)/directory(ies)Aktualisieren des Datums von Files/Directory(ies)

File Filter Commands

Wenn kein file(s) Parameter => Lesen von StdIn

grep [-cinrv] pattern [file(s)]Suchen nach Mustern (z.B. Grep -i “user” ~/.profile)
head [-n count] [file(s)]Ausgabe der ersten n Zeilen (Ohne Parameter n: n=10)
tail [-f] [-n count] [file(s)]Ausgabe der letzten n Zeilen (Ohne Parameter n: n=10)
cut -crange [file(s)]Ausschneiden von Textblöcken (z.B. cut -c10-20 index.html)
sort [file(s)]Sortieren (Mehrere Files werden gesamthaft sortiert
wc [-lwc] [file(s)]Zählen von Zeilen (-l), Wörtern (-w), Zeichen (-c)
tr char-old char-newErsetzen von Zeichen (z.B.: tr a A < index.html)
sed cmd [file(s)]Stream-Editor (z.B. sed s/test/TEST/g index.html)
awk cmd [file(s)]Tabellenstream-Editor (z.B.: awk ‘{print $2}’ /etc/fstab)

User & Zugriffsrechte

id, fingerAnzeigen der persönlichen Identifikation
passwdÄndern des Passwortes
who, rwhoAnzeigen der eingeloggten Benutzer
who: localhost, rwho: remotehosts
chmod mode target
mode: u=rwx,g=rwx,o=rwx
mode (oktal): r=4,w=2,x=1
Umdefinieren der Zugriffsrechte von Files/Directory(ies)
u: User (owner), g: Gropu, o: Others (world)
z.B. mode o=rwx, g=rx, o= – ergibt 750
umask [mode]Zeigen/Setzen der Defaultrechte beim erstellen von Files/Directories

Prozesse, Job-Control

ps [-alf]Anzeigen der aktuellen Prozesse
jobsAnzeigen der Prozesse im Hintergrund (BIC)
bg [%job-nummer]Starten eines gestoppten Prozesses im Hintergrund (BIC)
fg [%job-nummer]Starten eines Prozesses im Vordergrund (BIC)
kill [-signal] processs-idSenden eines Signals an einen Prozess
<ctrl> CAbbrechen/Beenden eines Prozesses im Vordergrund
<ctrl> ZStoppen eines Prozesses im Vordergrund und Verschieben in den Hintergrund;
=> muss mit bg/fg gestartet werden.

Shell Commands

.scriptScript wird in aktueller Shell abgearbeitet (kein Subprozess)
historyAusgabe der Commandhistory
exitTerminieren der Shell; Logout auf Terminal
alias name=defDefinition eines alias
alias [name]Ausgabe eines definierten Alias; Ohne Parameter [name] alle
unalias nameLöschen eines Alias
(set) var=defZuweisen eines Wertes an eine lokale Variable (z.B. myvar=’test’)
(set) var=$(cmd)Zuweisen der Ausgabe eines Commands an eine lokale Variable
unset varLöschen einer Variable
$varZugriff auf Variable var (z.B. echo $myvar)
export var=valueDefinition einer globalen Umgebungsvariablen (exportieren)
set, export, env, printenvAusgabe aller definierten Variablen
set -oAusgabe der Shell Optionen
set (-/+)o optionSetzen (-)/Löschen(+) einer Shell Option
<crtl> DEnd-Of-File (Abschluss Standard Input)

Shell-Sonderzeichen

~Home-Directory
*Beliebige Folge von Zeichen (Ohne Folgen mit führendem Punkt)
?Beliebiges Zeichen
[abc]Zeichen a, b oder c
[0-9]Zeichen 0 bis 9
[!abc]Nicht a, b oder C
cmd > fileUmlenken (Redirection) von Standard-Out in ein File
cmd >> fileAnhängen von Standard-Out an ein File
cmd < fileLesen von Standard-In von einem File
cmd 2> file Umlenken von Standard-Err in ein File
cmd >fle 2>&1Umlenken von Standard-Out, Standard-Err nach Standard-Out
cmd | tee fileZeigt Ausgaben am Bildschirm an und speichert gleichzeitig in einem file
\Quoting (Ausmaskieren) des folgenden Zeichens
‘…’Quoting aller eingeschlossenen Zeichen
“…”Quoting aller eingeschlossenen Zeichen ausser $,’,”,\
cmd &Ausführen eines Befehls als Hintergrundprozess
cmd_1; cmd_2; …;Sequentielle Abarbeitung mehrerer Befehle
( cmd_1; cmd_2; .. )Befehlsgruppe in Subshell ausführen
cmd_1 $(cmd_2)Ausgabe des zweiten Commands wird als Argument an den ersten Command übergeben
cmd_1 | cmd_2 | … | cmd_nPipeing (Fliessbandverarbeitung von mehreren Commands

Spezielle Shell Variablen

$?Exit Status des letzten Commands
$#Anzahl Argumente von cmd
$nn-tes Argument von cmd
$ENVVariable für persönliches Shell-Profile
$PATHAktueller Suchpfad für Utilities
$PS1Variable mit Inhalt des primären Prompts
$RANDOMGeneriert einen Random Integer
$SHELLName/Pfad der aktuellen Shell
$HOMEPfad zu Home-Directory

Spezielle Files/Directories

.(Punkt) aktuelles Directory
..(Punkt-Punkt) übergeordnetes Directory
/Root-Directory (Basis des File-Systems)
/etcDirectory für globale Konfigurationen (Schreibgeschützt)
/etc/profile, /etc/profile.dGlobale User-Environment Scripte
/tmpDirectory für temporäre Files (nicht schreibgeschützt)
/devDirectory für alle Devices (z.B. /dev/cdrom, /dev/hda, …)
/dev/nullNull-File (unendliche Senke für nicht erwünschten Output)
~/.profilePersönliches Profile-Script für alle Shells
{x,yz,ww}Brace Expansion
z.B. ls sand{x,yz,ww}wich => sandxwich, …

Linux Datei-Rechte

GruppeUserGroupOthers
Rechtr w xr – xr – –
Wertung4 2 14 0 14 0 0
Mode (Octal)754
Recht Mode (Octal)
0
–x 1
-w- 2
-wx 3
r– 4
r-x 5
rw- 6
rwx 7

Debian sudo: Benutzer für sudo berechtigen

Erscheint die Fehlermeldung

username is not in the sudoers file. This incident will be reported.

hat der aktuelle Benutzer kein Recht, sudo zu nutzen. Das heißt, er ist nicht in einer Benutzergruppe, welche ihm die Nutzung dieser Funktion gestattet.

In der Standardkonfiguration haben der Benutzer “root” und die Benutzergruppe “sudo” Zugriff auf die gleichnamige Funktion sudo. Es gibt auch hinreichend viele Tutorials, welche sich mit der Thematik befassen, einem Benutzer das Recht zu geben, sudo zu nutzen. Diese sind jedoch meiner Meinung nach umständlicher.

Umständliche Variante

Diese nutzen das Programm visudo, welches von sudo ebenfalls mitgeliefert wird. Damit öffnet sich die Konfigurationsdatei von sudo und man kann mit der richtigen Syntax Benutzer oder Benutzergruppen hinzufügen, um ihnen das Nutzen von sudo zu erlauben.

Für den Benutzer “test” sähe das z.B. folgendermaßen aus:

test ALL=(ALL) ALL

Für die Benutzergruppe “test” sähe das dagegen folgendermaßen aus:

%test ALL=(ALL) ALL

Einfache Variante

Da jedoch bereits die Gruppe “sudo” das Recht hat, sudo zu nutzen, kann man auch einfach diese nutzen. Hierzu muss man den Benutzer lediglich dieser Gruppe hinzufügen:

usermod -a -G sudo test

Nach dem nächsten Login per SSH können dann der jeweilige Benutzer bzw. Benutzer der jeweiligen Benutzergruppe sudo problemlos nutzen und erhalten nicht mehr die Fehlermeldung “username is not in the sudoers file. This incident will be reported.”.

Benutzerverwaltung (User Administration)

User und Gruppen

Auflisten aller registrierten User

sudo cat /etc/passwd

Auflisten aller Gruppen

sudo cat /etc/group

Benutzerkonten hinzufügen (adduser)

Das Hinzufügen neuer Benutzerkonten (neuer User erstellen) ist Aufgabe des Systemadministrators und muss daher mit Administrator-Rechten durchgeführt werden. Neben dem klassischen Weg, dem Hinzufügen der erforderlichen Daten mittels eines Editors in den entsprechenden Dateien, steht unter Debian GNU das Programm

adduser

zur Verfügung.

adduser kennt eine Reihe von Optionen, die in der Manpage beschrieben sind oder, in verkürzter Form, mittels

adduser -h

angezeigt werden. Für den „Hausgebrauch“ ist es ausreichend, das Programm ohne weitere Optionen aufzurufen; adduser verfügt über einen interaktiven Modus, in dem alle notwendigen Angaben erfragt werden.

sushi:~# adduser
Enter a username to add: dd
Adding user dd...
Adding new group dd (1001).
Adding new user dd (1001) with group dd.
Creating home directory /home/dd.
Copying files from /etc/skel
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for dd
Enter the new value, or press return for the default
    Full Name []: Donald Duck
    Room Number []:
    Work Phone []:
    Home Phone []:
    Other []:
Is the information correct? (y/n) y

Benutzerkonten löschen (deluser)

Das Entfernen von Benutzerkonten (User löschen) aus dem System ist deutlich einfacher. Hierzu steht das Kommando

deluser

zur Verfügung. Auch dieses Programm kann interaktiv benutzt werden; hier aber ein Beispiel mit der Angabe des Login-Namens auf der Kommandozeile:

sushi:~# deluser dd
Removing user dd...
done.
{code}
Zu beachten ist, dass dabei nicht das Heimatverzeichnis des Benutzers gelöscht wird. Dies bleibt dem Systemadministrator überlassen.
1.1 Gruppe erstellen
{code:txt}
addgroup ~~gruppenname~~
{code}
Alle schon bestehenden Groupen findet man auch unter *cat /etc/group*
1.1 Existierender User einer Existierenden Gruppe hinzufügen
{code:txt}
adduser ~~username gruppe~~

User Passwort ändern unter Ubuntu

Folgendermassen kann man das Passwort eines bestimmten Users ändern:

sudo passwd <username>

z.B.

sudo passwd ralph

Das eigene Passwort ändern man mit einem simplen:

passwd

Passwort für User entfernen (erlaubt Login ohne Passworteingabe unter Ubuntu 18.04)

passwd -d <username>

 

Sonos über Upnp steuern

 

Interessante Links:

http://www.hirahim.com/blog/2012/04/29/dissecting-the-sonos-controller/

http://blog.travelmarx.com/2010/06/exploring-sonos-via-upnp.html

http://musicpartners.sonos.com/node/427

https://forum.logicmachine.net/showthread.php?tid=339

http://www.lua.org

http://openrb.com/sonos-control-from-logic-machine/

https://forum.logicmachine.net/showthread.php?tid=12

https://www.tutorialspoint.com/lua/lua_overview.htm

https://learnxinyminutes.com/docs/de-de/lua-de/

http://nova-fusion.com/2012/08/27/lua-for-programmers-part-1/

http://openrb.com/docs/lua.htm

https://forum.logicmachine.net/forumdisplay.php?fid=12

OpnSense: Netflix IP-Range für VPN Bypass

Ich verwende eine OpnSense Firewall und betreibe darauf einen VPN Client, der den ganzen LAN-Traffic über einen VPN-Anbieter routet. Leider blockiert Netflix seit 2016 VPN Server, so dass im LAN Netflix schauen nicht mehr möglich ist. Damit der WAF (Wife Acceptance Factor) für die Firewall trotzdem erhalten bleibt, habe ich einen VPN-Bypass auf der OpnSense Firewall eingerichtet (Firewall > Rules > LAN). Hier können bestimmte IP-Ranges (definiert als Aliases) über das normale WAN-Interface (und nicht über das VPN-Interface) geroutet werden. Ich möchte hier nicht weiter beschreiben, wie man ein Routing in OpnSense installiert. Aber: Wie finde ich alle relevanten Netflix-Server bzw. deren IP Adressen?

Dazu sind folgende Terminal-Befehle hilfreich:

---------- Netflix IP Range herausfinden
curl https://ipinfo.io/AS2906 2>/dev/null | grep -E "a href.*2906\/" | grep -v ":" | sed 's/^.*<a href="\/AS2906\///; s/" >//' > /home/<user>/NETFLIX-ip-range.txt

Netflix hostet auf Amazon AWS Servern. Deswegen müssen auch diese Server mit auf die Bypass Rule. Aus der Schweiz sind nur die eu-west-1 Server von Amazon relevant:

--------- Amazon: Get all IP-Ranges
wget https://ip-ranges.amazonaws.com/ip-ranges.json -O /home/<user>/ip-ranges.json

--------- Select only EU-West-1
jq -r '.prefixes[] | select(.region=="eu-west-1") | .ip_prefix' < /home/<user>/ip-ranges.json

Siehe auch:

Dualboot System mit Ubuntu und Windows – Zeit nicht korrekt

Auf meinen Dualboot-System ist Ubuntu und Windows installiert.

Die beiden Betriebssysteme interpretieren die Hardware-Clock nicht gleich. Linux interpretiert die Hardware-Clock als UTC. Windows aber als “Local-Time”. Daraus resultiert, dass in dem einen Betriebssystem die Zeit korrekt gesetzt wird und im anderen falsch angezeigt wird.

Ich korrigiere dies, indem ich Ubuntu beibringe die Local-Zime zu verwenden:

  1. Im Bios die HW-Clock auf die aktuelle Local-Zeit einstellen
  2. Dann im Linux die Local-Zeit konfigurieren
    sudo timedatectl set-local-rtc 1

Man könnte dies auch so korrigieren, indem man Windows beibringt, die UTC zu verwenden. Aber umständlicher als die Korrektur über Linux.

Links

https://askubuntu.com/questions/169376/clock-time-is-off-on-dual-boot

test