Schlagwort-Archive: bash

WebUntis Scraper

Der Stundeplanrechner wirft die WebUntis HTML Dateien in ein WebDAVs Share. Dieses ist auf dem Moodle Server per Symlink in das Arbeitsverzeichnis des folgenden untisparser Skriptes eingebunden. Von dort wird das Ergebnis in ein File Repository des Lehrermoodles geschrieben und aus dem Kursraum „Schwarzes Brett“ (die Kommunikationsplattform der Schule) verlinkt. Das stellt sicher, dass nur Menschen, die a) am Moodle angemeldet und b) Mitglied des entsprechenden Kursraumes sind den Inhalt (hier: Vertretungsplan) einsehen können.

Mit geschlossenem Accordion

Accordion offen

Das muss leider so umständlich sein, weil ich keinen Weg gefunden habe, den WebDavs Ordner als solchen navigierbar im Kursraum so einzubinden, dass man diesen nicht auch von außerhalb des Moodles aufrufen könnte. Mir bleibt (sofern ich richtig liege) nix anderes über, als aus den X html Dateien, die WebUntis mir hinwirft, eine einzige zu bauen, die ich klar benamen und dann „verlinken“ kann. Dazu muss ich die vielen WebUntis HTML Dateien in ihre Bestandteile zerlegen. Ich brauche: Die Tabellen und die Zeitangaben.

Im Prinzip geht das mit beautifulsoup und Python. Meine Python-Kenntnisse sind jedoch leider noch rudimentärer als meine Bash-Kenntnisse … also muss  ein bash Skript her. Und HTML mit Bash nativ parsen  – nun: ich weiß, dass das Probleme macht. Das will man nicht.

Die Lösung ist pup, das ich in ein Bash-Skript einbinde.

Zur Information die Struktur der WebUntis Dateien in ihren Ordnern / Unterordnern:

Die zu erzeugende Output-Datei soll HTML sein und braucht dazu einen Kopf:

Siehe zum Code für das Accordion im Kopf und im „Kleister“: https://www.w3schools.com/howto/howto_js_accordion.asp  Leider hat das aber nicht gereicht. Zuerst muss gewartet werden, bis die gesamte Seite geladen ist, dann erst darf die for-Schleife beginnen. Also wird das Skript in den Footer gelegt oder gekapselt in:

Was einen Kopf hat, braucht auch einen Fuß:

Und dann braucht es den „Kleister“, der die Arbeit macht und alles zusammenpackt. Nennen wir es untisparser.sh und legen es in das passende Verzeichnis auf dem Server:

Cron ruft das Skript alle 20 Minuten auf. Schöner wäre natürlich, wenn das Skript nur liefe, wenn sich was ändert im WebDavs Share. Aber inotify und Freunde sind auch nicht ohne. So ist es simpel und scheint zu funktionieren, ohne viel Ressourcen zu fressen.

Update 23.08

Einige Fehler im Skript (meist die vergessenenen \ vor den „) behoben und mit Hilfe von JavaScript mehr Übersichtlichkeit im Output erzeugt.

Passwortänderung, PuTTY und Kollegen

Damit meine Kollegen ihre Passwörter auf dem schulischen Mailserver selbst ändern können will ich diesen keine Möglichkeit direkt über Horde5 zur Verfügung stellen. Im Kontext von Heartbleed wurde mir klar, dass Aufrufe zur Passwortänderung nämlich von Lehrer/innen schlicht ignoriert werden oder Passwörter gewählt werden, die diesen Namen nicht verdienen.

Ich habe nun vor, die Passwortverwaltung einerseits selbst in der Hand zu halten, so weit es eben geht, und andererseits aber auch nicht zu sehr zu gängeln.

Es wird deswegen die Möglichkeit geben, sich über SSH mit einem Passwort-geschützten Schlüssel am Mailserver anzumelden und dort passwd zu nutzen, das wiederum ein paar Prüfroutinen auf die Eingaben loslässt. Restricted Shell sollte genug Sicherheit bieten. So richtig böse ist keiner und wenn doch, dann ist der Mailserver eben weg.

Will also ein Lehrer sein Passwort selbst verwalten, dann erhält er von mir in einer verschlüsselten Mail einen TrueCrypt Container und das zugehörige Passwort. im Container befinden sich PuTTYPortable.exe, puttygen.exe und seine private Schlüsseldatei im SSH Format. Weiter kommt noch eine Anleitung mit dazu – denn: Die Ersteinrichtung von PuTTY überlasse ich ebenfalls dem Benutzer.

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

Mit puttygen muss man zuerst den SSH Key über /Conversions /Import key importieren und dann den privaten Schlüssel im PPK Format wieder abspeichern. Beim Import fragt puttygen nach dem Passwort für den Schlüssel.

http://portableapps.com/apps/internet/putty_portable

In PuTTYPortable sind dann die folgenden Einstellungen vorzunehmen:

  • unter /Session sind der Server und der Port einzustellen
  • unter /Connection /Data /Auto-login-username ist der Benutzername einzutragen
  • unter /Connection /SSH /Auth wird über den Schalter /Browse die vorher erstellte PPK Datei mit dem privaten Schlüssel ausgewählt

Ist PuTTY erst einmal zufrieden gestellt, dann speichert man die ganze Geschichte unter /Session ab, so dass man sich dieses Gefrickel in Zukunft sparen kann.

Pam_unix prüft bei entsprechender Konfiguration und in Zusammenarbeit mit pam_cracklib einiges ab, was zu simple Einfälle unmöglich macht. Da muss ich aufpassen, dass ich nicht übertreibe.

Da an keiner Stelle im Prozess der Passwortänderung auch nur Sternchen angezeigt werden, sind die Fehlerquellen sicherlich Legion. Dazu kommt, dass ein solches Verfahren die meisten schlicht abschrecken wird. Schwarze Felder mit blinkenden grünem Strichlein sind die wenigsten gewohnt.

Das ist dann eben so. Ein Kollateralschaden.

Arbeitsnachweis

Ich hab immer wieder das Problem, dass ich wissen sollte, welche Arbeiten in den letzten 7, 14, 21 oder 28 Tagen von mir / jemand anderem in einem bestimmten Verzeichnis erledigt wurden – also vor allem, welche Dateien angelegt oder verändert wurden. Dazu hab ich mir ein kleines Script geschrieben:

#!/bin/bash
echo „7 TAGE“ > /home/user/workdone.txt
find . -mtime -7 -print >> /home/user/workdone.txt
echo „14 TAGE“ >> /home/user/workdone.txt
find . -mtime -14 -print >> /home/user/workdone.txt
echo „21 TAGE“ >> /home/user/workdone.txt
find . -mtime -21 -print >> /home/user/workdone.txt
echo „28 TAGE“ >> /home/user/workdone.txt
find . -mtime -28 -print >> /home/user/workdone.txt
sed ‚/zuloeschen/d‘  /home/user/workdone.txt > /home/user/workdone2.txt
cat /home/user/workdone2.txt

Der Einschub sed ‚/zuloeschen/d‘ workdone.txt sorgt dafür, dass ich Elemente, die vom Server selbst kommen (im konkreten Fall sind dies täglich erneuerte Steuerdateien) einfach wieder raus werfen kann. Im Beispiel oben würde demnach die Zeile, die das Wort zuloeschen enthält, gelöscht.

Umbenennen

Die wie immer üble Ausgangslage, wenn ich Materialienlieferungen für den LFB erhalte:

Auf der Suche nach einem ordentlichen Skript für das Umbenennen von Datei- und Verzeichnisnamen bin ich hier über die Arbeit von Andi Latte gestolpert, die ich nur unwesentlich für meine Bedürfnisse anpassen musste:


#!/bin/bash
# Ersetzt Zeichen im Dateinamen rekursiv
# Vorlage: http://www.linux-community.de/Community/Fragen/Bash-Rename-Skript
# Aufruf des Skriptes auf Korrektheit pruefen
if [ -z $1 ];then echo Verwendung: umbenennen "/PFAD" ; exit 0;fi
# Meldung ungueltige Kodierung bearbeiten
convmv -f iso-8859-15 -t utf8 -r "$1" --notest
#
# Skript Start
#
find "$1" -depth -name "*" | while read file ; do
directory=$(dirname "$file")
oldfilename=$(basename "$file")
# sed und tr als Mittel der Bearbeitung
# Befehle sind so aufgestellt, dass einzelne Aktionen
# leicht durch Loeschen zwischen den Pipes
# veraendert werden koennen
newfilename=$(echo "$oldfilename" | tr "'" "_" | tr '!@#+ ' '_____' | tr '[]{}' '()()()' | sed -e 's/[\`\´\"\]//g' | sed -e 's/\&/and/g' | sed -e 's/[àáâãäå]/ae/g;s/[ÀÁÂÃÄÅ]/Ae/g;s/[éëêè]/e/g;s/[ÈÉÊË€]/E/g;s/[ìíîï]/i/g;s/[ÌÍÎÏ¡]/I/g;s/[òóôõöø]/oe/g;s/[ÒÓÔÕÖ]/Oe/g;s/[ùúûü]/ue/g;s/[ÙÚÛÜ]/Ue/g;s/[ÿý?]/y/g;s/[ÝŸ]/Y/g;s/[æ]/ae/g;s/[Æ]/AE/g;s/[碩]/c/g;s/[Ç]/C/g;s/[ßš]/s/g;s/[$§Š]/S/g;s/[=¦#:~*¿·¸°¯\%";+^˜‰…‡†???•]/_/g;s/[²]/2/g;s/[³]/3/g' | sed -e 's/[^\(\)\.\/\_a-zA-Z0-9-]//g' | tr [:upper:] [:lower:])
# Katastrophenpotential einschraenken
if [ "$oldfilename" != "$newfilename" ]; then
# Umbenennen beginnen
mv -i "$directory/$oldfilename" "$directory/$newfilename"
# Benutzer informieren
echo ""$directory/$oldfilename" ---> "$directory/$newfilename""
#echo "$directory"
#echo "$oldfilename"
#echo "$newfilename"
#echo
fi
done
exit 0

Das nun erträgliche Ergebnis, das eine automatisierte Weiterverarbeitung bei der Umsetzung nach HTML erlaubt:

Da WordPress sicherlich aus dem Skript oben wieder einmal Wurstsalat macht, hier das Skript für den Download: umbenennen_v2.zip und zur Sicherheit auch noch mal bei pastebin.

Nachteil des Skriptes: Der Backslash wird nicht berücksichtigt. Außerdem wäre ein iconv -t ascii nicht schlecht, um die exotischen Zeichen mit zu erwischen, die nicht im Skript selbst auftauchen. Ein paar Dummheiten sind außerdem auch noch drin: Z.B. wird ? am Ende durch _ ersetzt, dabei ist es da schon lange ein y.

Das Grundgerüst steht aber.