Best PracticesEntwicklungHätt ich das mal eher benutztLinuxProblemeTools

Automatisches Indizieren von DVDs unter Linux

Vor nun fast knapp zwei Jahren kam ein Bekannter auf mich zu, der eine Hand Datendvds indizieren wollte. Neben dem eigentlich Einlesen der DVDs in eine ISO Datei, sollte ebenfalls ein kurzes Inhaltsverzeichnis erstellt werden.

Der ganze Ablauf sollte, wenn möglich, voll automatisch ablaufen. Als einziger notwendiger Schritt sollte das Wechseln des Mediums notwendig sein, nachdem es vollständig eingelesen worden ist.

Nach einigem Suchen bin ich auf die Linux udev rules aufmerksam geworden, die einem erlauben, auf gewisse Events von Devices (also auch DVD Laufwerken) zu reagieren. Kurz darauf enstand der Plan, das ganze als VM aufzusetzen, die sowohl lokale ISO Files, als auch (per paththrough vom physikalischen Laufwerk) DVDs einlesen kann.

Ich habe gerade durch Zufall die Dateien wiedergefunden und dachte, ich schreibe einen kurzen Post drüber.

Die Zutaten sind:

  • VirtualBox – dort soll die VM laufen.
  • Vagrant zum Aufsetzen der VM.
  • Ansible um die notwendigen Script zu installieren.
  • Ein paar weitere Scripte, die auf den jeweiligen Events vom Device reagieren.
  • Ein Script, welches das Einbinden, Indizieren, Kopieren und anschließende Auswerfen des Mediums durchführt.

Tooling

Sowohl Vagrant und VirtualBox sollten sich ohne Problem aufsetzen lassen.

Ansible sollte man am besten per PIP installieren. Eine aktuelle Python Installation (>= 2.7) vorrausgesetzt, reicht hierzu ein pip install ansible.

udev Scripte

Wie bereits schon erwähnt, soll auf die jeweiligen Events (z.B. DVD wurde eingelegt) des jeweiligen Devices reagiert werden. Hierzu benötigen wir zwei Scripte, welche in einer bestimmten Reihenfolge aktiviert werden müssen (weshalb sie 70-* und 80–* benannt werden)

cat 70-persistent-cd.rules

Diese Script ist recht selbsterklärend. Es legt liegt in /etc/udev/rules.d/70-persistent-cd.rules und dient dazu, dass für jedes der vier (virtuellen) Devices ein Link erstellt wird.

Unter /dev/ finden sich dann folgende Einträge:

Kommen wir nun zum zweiten Script.

cat 80-autodvd.rules

Dieses Script sorgt dafür das alle Events der jeweiligen Devices das Script /usr/local/bin/autodvd triggern. Wichtig zu wissen ist, dass hierdurch dem Script auch ein paar Umgebungsvariablen bekannt sind.

Diese stehen dann unter anderem beim Aufruf von env zur Verfügung:

Diese können wir im nachfolgendem Script verwenden.

Das Indizierungsscript

Das Script zum Indizieren ist das eigentlich Herzstück des gestamten Setups:

cat autodvd

Ziemlich viel Inhalt. Aber fangen wir der Reihe nach an:

  • Der ganze Aufruf wird in einem Block {…} ausgeführt, dass Ergebnis (inkl. aller Fehler) wird dem Log File /var/log/autodvd.log hinzugefügt.
  • Wir erstellen das Verzeichnis /vagrant/dvdindex, in dem alle ISO und Index Files gespeichert werden. Da /vagrant eine gemountete Netzfreigabe vom VM Host sind, landen alle Dateien demnach auf dem VM Host System.
  • Damit wir exklusiven Zugriff auf das Device bekommen erstellen wir ein einfaches LOCK:
  • Danach wird das Laufwerk gemountet und eine Checksum über den Inhalt erstellt:

    sum=find /var/run/usbmount$DEVNAME -type f -print0 | sort -z | xargs -0 sha1sum | sha1sum | cut -d ' ' -f 1Diese Checksum wird als Dateiname für das ISO File, als auch für die Index Datei erstellt.

  • Wir erstellen ein Listing auf der obersten Ebene – natürlich lässt sich in diese Datei auch das komplette Medium indizieren.
  • Dann wird das Medium unmountet, per dd kopiert und ein checksum file für das ISO Image erstellt.
  • Zuletzt wird per eject das Medium ausgeworfen:

Das Log enthält (neben obigem env Listing) folgende Einträge:

Im Dateisystem befinden sich nach erfolgreichem Import dann folgende Dateien:

ls -al /vagrant/dvdindex

Im Prozess sieht der gesamte Ablauf vom Einlegen eines 400Mb Mediums bis zum Auswerfen so aus:

 

Alle Sourcen (Vagrant File + Ansible Script), findet ihr auf Github.

Tags

Leave a Reply

Your email address will not be published. Required fields are marked *

Back to top button
Close