Dienstag, 15. April 2014

Speicherplatz Netzwerkuser

Speicherplatz von Netzwerkusern unter OS X auswerten.


Wichtig: Dies ist ein Proof of Concept und keine für den Einsatz gedachte Software. Mit diesem Skript wird eine Möglichkeit gezeigt, wie der verwendete Speicherplatz der einzelnen User regelmäßig automatisiert in ein Logfile gespeichert werden kann. Verwendet wurde für den Test OS X 10.9.2

1. Anwendungsszenario

Existieren mehrere Hundert Netzwerkuser, so machte es Sinn nicht nur einen Überblick über den insgesamt verfügbaren Speicherplatz zu behalten, sondern auch regelmäßig zu beobachten, in welchem Umfang dieser von einzelnen Usern genutzt wird. Werden die Accounts auf eine eigene Festplatte ausgelagert, so ist es zwar relativ einfach möglich den Gesamtverbrauch zu überwachen, nicht aber den individuell verbrauchten Speicherplatz. Um diesen festzustellen, werden Leserechte auf gespeicherten Daten der User benötigt. Diese hat neben dem User selbst idealer Weise nur root bzw. diradmin. Um also im Finder diese Informationen anzuzeigen, wäre die Anmeldung aus privilegierte User notwendig. Dies ist nach Möglichkeit zu vermeiden.

2. Speicherplatzstatistik

Zur Ausgabe von benötigtem Speicherplatz existiert das Programm du, das über die Kommandozeile (unter OS X steht hierfür das Programm Terminal zur Verfügung) aufgerufen werden kann. Ein kurzer Blick auf die Hilfe (man du) zeigt die möglichen Argumente. Interessant hierbei sind die Optionen -s für die Ausgabe des Verbrauchs aller Dateien in einem Verzeichnis und -h um eine "Human-readable" Ausgabe zu erhalten. Um also eine Statistik für den verbrauchten Speicherplatz aller User, deren Accounts auf der Festplatte network_user_disk1 liegt, auszugeben, kann als privilegierter User der folgende Befehl verwendet werden.

du -sh /Volumes/network_user_disk1/*/

2. Logfile

Das Speichern der Ausgabe in einem Logfile kann aus unterschiedlichen Gründen hilfreich sein. Je nach Geschwindigkeit der verwendeten Festplatte, Anzahl der User und Größe der Accounts wird für die Auswertung relativ viel Zeit benötigt, für eine generelle Auswertung sind Daten, die zu einem Zeitpunkt erhoben werden, zu dem die Auslastung und Beanspruchung gering ist, das könnte etwa nachts oder in den frühen Morgenstunden sein, meist auch noch aktuell genug. Eine Weiterverarbeitung der Daten kann bei Bedarf zu einem späteren Zeitpunkt erfolgen. Bei regelmäßiger Ausführung lässt sich eine Statistik über die Entwicklung des Bedarfs erstellen. Eine Analyse ob ein Zusammenhang zwischen Auftreten von Problemen bei Usern und deren verfügbaren Speicherplatz besteht, kann im Nachhinein erfolgen. Selbst bei vielen Usern ist der benötigte Speicherplatz minimal. Zur besseren Organisation kann das aktuelle Datum als Teil des Dateinamens verwendet werden. Nähere Informationen zur Ausgabe von Datum und Zeit siehe man date.

3. Script

Da es Sinn macht die Aufgabe zu automatisieren, bietet sich an mit einem Texteditor der Wahl ein kleines Skript zu erstellen. Im Terminal kann vi oder nano verwendet werden. Im TextEdit sollte darauf geachtet werden, dass über Format -> In reinen Text umwandeln gewählt wurde. Das Script in der Datei spacelog.sh könnte etwa so aussehen:

#!/bin/bash
HEUTE=`date +"%Y%m%d"`
LOGFILE=`echo /logfiles/network_user_"$HEUTE".txt`
du -sh /Volumes/network_user_disk1/*/ > $LOGFILE


Existieren mehrere Platten mit Useraccounts, können die Daten für diese entsprechend angehängt werden:

du -sh /Volumes/network_user_disk2/*/ > $LOGFILE
#
du -sh /Volumes/...

Zum Ausführen können entweder die entsprechenden Rechte mit chmod gesetzt werden, oder das Script wird an sh übergeben. Der ausführende User benötigt natürlich entsprechende Rechte um die Daten auszulesen.

sh spacelog.sh

4. Sortierung

Zur Sortierung und weiteren Auswertung können sort (siehe man sort) und grep (siehe man grep) verwendet werden. Je nach Anwendungszweck der Daten ist es möglich mit sed (siehe man sed) den Pfad zum Speicherort zu entfernen. Sind etwa nur Userordner interessant, die ein Gigabyte oder mehr enthalten, kann das Skript noch um die folgenden Befehle ergänzt werden:

LOGFILE_GB=`echo /logfiles/network_user_GB_sort_"$HEUTE".txt`
less $LOGFILE | sort -nr -k 1 | grep "G\t" | sed 's,/Volumes/network_user_disk1/,,g' | sed 's,/,,g' > $LOGFILE_GB


5. crontab vs. launchd

Zur regelmäßigen Ausführung des Skripts um die Daten automatisiert zu erheben, kann sowohl crontab als auch launchd verwendet werden. Wichtig ist, dass der ausführende Benutzer auch entsprechende Leserechte auf die Userordner hat. Nähere Informationen zur Einrichtung – erraten siehe man crontab.
Unter Umstanden macht es auch Sinn den Eigentümer des Logfiles entsprechend zu ändern. Hier sei auf chown (siehe man chown) verwiesen.

6. Bemerkungen

Wichtig ist Speicherort und Bearbeitungsrechte für das Skript zu beachten.

Das Arbeiten als privilegierter User sollte so weit als möglich vermieden werden. Der User root ist unter OS X aus gutem Grund standardmäßig deaktiviert. Durch ein regelmäßig erstelltes Logfile ist zumindest der Login unter der grafischen Oberfläche nicht mehr notwendig.

Natürlich ist es primär wichtig, den insgesamten Speicherbedarf im Auge zu behalten. Für eine vorausschauende Betrachtung eines Systems macht es aber auch Sinn jene User im Auge zu behalten, die dieses mehr als der Durchschnitt beanspruchen.

Dienstag, 18. Februar 2014

PoC-Ö1d

Proof of Concept - Automatischer Sendungsdownload von '7 Tage Ö1' mit einem *nix System.


Wichtig: Dies ist ein Proof of Concept und keine für den Einsatz gedachte Software. Mit einem kleinen Skript wird hier demonstriert, dass es theoretisch möglich ist einzelne Sendungen automatisiert herunterzuladen. Verwendet wurde für den Test OS X 10.9.1 Prinzipiell sollten die verwendete Befehlt aber auf allen anständigen *nix Systemen identisch funktionieren. Es ist nicht geplant eine Software wie MediathekView zu entwickeln.

1. Sendungsliste

Ein kurzer Blick in den Quelltext der Website zeigt, dass der Player mit JavaScript umgesetzt wurde. Besonders interessant ist der Link zu /programm/konsole/heute Ruft man die Seite oe1.orf.at/programm/konsole/heute auf so gibt die angezeigte Datei die Information Preis von welcher Quelle die Adressen für den Stream der Sendungen geladen werden: An oe1.orf.at/programm/konsole/tag/ ist eine achtstellige Zahl angehängt. Diese gibt das Datum der Sendungsliste in der Form Jahr Monat Tag an. Verfügbar sind die 8 Dateien mit diesem Aufbau. Der aktuelle Tag sowie der letzte Tag sind nicht komplett, da diese Streams erst hochgeladen bzw. wieder entfernt werden.

http://oe1.orf.at/programm/konsole/tag/YYYYmmdd

2. Datum von Gestern

Die aktuellste Liste für einen kompletten Überblick über alle Sendungen eines Tages ist somit die Liste der Sendungen des Vortages. Daher macht es Sinn diese Liste einmal täglich abzufragen und nach den Links für die Streams zu durchsuchen. Das Datum lässt sich mit der Kommandozeile (unter OS X steht hierfür das Programm Terminal zur Verfügung) mit den Befehl date abfragen. Ausgegeben wird von diesem Programm die aktuelle Zeit auf dem Computer. (Wir gehen davon aus, dass wir uns in der selben Zeitzone wie der Sender befinden.) Uns interessiert das Datum des Vortages. Ein kurzer Blick auf die Hilfe (man date) zeigt die möglichen Argumente. Interessant hierbei ist die Option mit -v -1d die ausgegebene Zeit um einen Tag zurück zu setzen. Für die Ausgabe der Form YYYYmmdd muss noch +"%Y%m%d" an den Befehl angehängt werden.

date -v -1d +"%Y%m%d"


3. Download mit curl

Natürlich ist es möglich sich die Links aus diesem File heraus zu kopieren und die verknüpften mp3-files herunterzuladen. In den nächsten Schritten soll dies automatisiert werden. Dazu macht es Sinn sich die Datei mit den Links einmal herunter zu laden und mit einem Editor näher anzuschauen. Für den download kann curl verwendet werden. Nach etwas scrollen in man curl findet sich die Option mit –o den heruntergeladenen Datenstrom in eine Datei zu speichern. Zusätzlich bietet sich an für ein Script noch den Output für den Fortschritt mit –s zu unterdrücken. Alternativ kann natürlich auch wget eingesetzt werden.

curl -s http://oe1.orf.at/programm/konsole/tag/$GESTERN -o $GESTERNFILE

4. Script und Variablen

Obriger Befehl wird natürlich noch nicht funktionieren, da ja die Variablen $GESTERN und $GESTERNFILE noch nicht die entsprechenden Werte haben. Da noch einige Befehle dazukommen werden bietet sich an mit einem Texteditor der Wahl ein kleines Testskript zu erstellen. Wenn das Terminal schon offen ist, so bieten sich vi oder nano an. Im TextEdit sollte darauf geachtet werden, dass über Format -> In reinen Text umwandeln gewählt wurde. Nachdem bash die Standard-Shell ist, macht es Sinn diese für das Skript zu verwenden und in der ersten Zeile mit #!/bin/bash zu definieren. Als Dateiendung für spätere leichter Auffindbarkeit bietet sich .sh an. Um den curl Befehl zum Download ausführen zu können fehlt nur noch die Zuordnung der entsprechenden Werte an die Variablen. Das Script in der Datei test.sh könnte etwa so aussehen:

#!/bin/bash
GESTERN=`date -v -1d +"%Y%m%d"`
GESTERNFILE=`echo "$GESTERN".txt`
curl -s http://oe1.orf.at/programm/konsole/tag/$GESTERN -o $GESTERNFILE

Zum Ausführen können entweder die entsprechenden Rechte mit chmod gesetzt werden oder das Script wird an sh übergeben:

sh test.sh 

5. Auswahl mit grep

Ein übersichtliches Programm würde die Informationen auslesen und die Sendungstitel zur Auswahl geben. Wenn es nur um ein Proof of Concept geht, so reicht es einen beliebigen Titel auszuwählen. Um einzelne Zeilen aus einem File, die ein bestimmtes Suchmuster enthalten, zu exportieren, bietet sich grep an. Ein genauerer Blick auf die Adresse in der Zeile url_stream zeigt, dass diese sehr übersichtlich aufgebaut ist. Nach Datum, Uhrzeit, Sendungsnummer und Sendungsteil folgen Sendungstitel sowie eine Abkürzung. Reichen sollte somit der Sendungstitel inklusive führenden und beendenden _ um nicht mit anderen Beschreibungen in Konflikt zu geraten. Für die sonntägliche Sendung matrix - computer & neue medien wäre das Suchmuster etwa _matrix_

grep '_matrix_' $GESTERNFILE

Die Ausgabe kann entweder direkt weiterverarbeitet oder in eine weitere Datei abgespeichert werden. Sollen mehrere Sendungen heruntergeladen werden so bietet sich Zweiteres an.

# Sendungslinks heraussuchen
# grep '_Sendungstitel_' $GESTERNFILE >> "$GESTERNFILE".tmp
grep '_matrix_' $GESTERNFILE >> "$GESTERNFILE".tmp

6. Downloadschleife

Für den Download selbst bietet sich wieder curl an. Allerdings müssen die Links noch von den zusätzlichen Informationen in der Zeile bereinigt werden. Dazu gibt es viele Möglichkeiten mit den unterschiedlichsten Programmen. Da der Aufbau immer identisch ist und die Links immer zwischen Anführungszeichen stehen kann cut verwendet und das 4. Feld zur Weiterverarbeitung ausgegeben werden. Zum Auslesen der Datei kann less verwendet werden.

less "$GESTERNFILE".tmp | cut -d "\"" -f 4

Für den Download bietet sich an den Dateinamen aus dem Link zu verwenden. Das abschneiden der URL kann zum Beispiel mit egrep -o '20(.*)' erledigt werden. Da mehrere (oder keine) URLs heruntergeladen werden können, kann der jeweilige Download in einer while Schleife ablaufen.

less "$GESTERNFILE".tmp | cut -d "\"" -f 4 | while read -r DOWNLOADURL ; do
            FILENAME=`echo $DOWNLOADURL | egrep -o '20(.*)'`
            curl -s $DOWNLOADURL -o "$FILENAME".mp3
done

7. Aufräumen

Es wurden einige Dateien angelegt, die nach dem Download nicht mehr benötigt werden. Diese können mit rm direkt gelöscht werden.

rm $GESTERNFILE "$GESTERNFILE".tmp

8. Das Skript

Das war es eigentlich auch schon. Das Skript mit ca. 10 Zeilen kann nun um Sendungslinks ergänzt werden und sollte 1 x Pro Tag aufgerufen werden.

#!/bin/bash

GESTERN=`date -v -1d +"%Y%m%d"`
GESTERNFILE=`echo "$GESTERN".txt`
curl -s http://oe1.orf.at/programm/konsole/tag/$GESTERN -o $GESTERNFILE

# Sendungslinks heraussuchen
grep '_matrix_' $GESTERNFILE >> "$GESTERNFILE".tmp

less "$GESTERNFILE".tmp | cut -d "\"" -f 4 | while read -r DOWNLOADURL ; do
        FILENAME=`echo $DOWNLOADURL | egrep -o '20(.*)'`
        curl -s $DOWNLOADURL -o "$FILENAME".mp3
done
rm $GESTERNFILE "$GESTERNFILE".tmp

9. Dateityp und Umwandlung

Der Stream hat keine Dateiendung. Informationen über Format und Codierung gibt das Programm file aus. Zum Zeitpunkt des Tests war dies MPEG ADTS, layer III, v1, 128 kbps, 44.1 kHz, JntStereo Soll der Inhalt stärker komprimiert werden kann lame verwendet werden. Dies ist bei OS X nicht standardmäßig installiert und muss zuerst heruntergeladen und kompiliert (wozu Xcode installiert sein muss) werden. lame können unterschiedliche Parameter übergeben werden, die die Stärke der Komprimierung angeben. Um eine tatsächliche Verkleinerung der Datei zu erreichen kommen aber nur -V7, -V8 oder -V9 infrage. Auch bei lame kann mit --quiet die Ausgabe der Aktivität unterdrückt werden. Die Umwandlung kann in die while Schleife eingebaut werden.

10. crontab vs. launchd

Da das Script ja einmal pro Tag ausgeführt werden soll, macht es Sinn dies automatisiert zu erledigen. Auf Servern, die 7/24 laufen bietet sich an crontab zu verwenden. Nachteil ist jedoch, dass - sollte der Rechner zum Ausführungszeitpunkt nicht laufen – der entsprechende Tag einfach ausgelassen wird. Unter OS X wird daher die Verwendung von launchd empfohlen. Nähere Informationen zur Einrichtung – erraten siehe man crontab

11. Bemerkungen

Die Formatierung und der Aufbau der Playlist sowie die entsprechenden Links können jederzeit geändert werden. Daher gibt es keine Garantie, dass das Script in dieser Form in Zukunft noch funktioniert. Sollte es sich nur um kleinere Änderungen handeln so ist auf dieser Seite das wichtigste Werkzeug um diese vorzunehmen.

Das Script überprüft nicht die Korrektheit der heruntergeladenen Playlist oder ob diese überhaupt erhalten wurde. Daher führt ein fehlerhafter Download dieses Files zum Verlust der Sendungen eines Tages. Auch ein fehlerhafter oder abgebrochener Download eines Streams wird nicht bemerkt.

Natürlich wäre eine grafische Oberfläche für normale Anwender über die einzelne Sendereihen ausgewählt werden können angenehm. Bei Verständnis der Funktionsweise, ist dies aber überflüssig.

Ob ein automatisierter Download und die Speicherung im Sinne des Anbieters ist, und in wie fern sich das mit Urheberrecht und Gewissen vereinbaren lässt, möge bitte jeder für sich selbst beantworten. An der geistigen Schöpfungshöhe des obrigen 10-Zeilers wage ich aber zu zweifeln ;)

Ziel war ein Proof of Concept zu erstellen - also die relative einfache Machbarkeit mit wenige Zeilen auf einem *nix System ohne der Installation von zusätzlicher Software - und somit zu zeigen, dass es relativ einfach möglich wäre ein Programm dafür zu schreiben.