Inhaltsverzeichnis

hadesd

hadesd ist das Herzstück der hades-Distribution. Dieser Daemon stellt Informationen zu Quell- und Zielgeräten bereit und informiert die Clients, wenn sich der Status eines Speichergerätes ändert. Zudem verwaltet der Daemon laufende Aufträge (Jobs), die auf den Zielgeräten ausgeführt werden. Clients können auch den Status von Jobs abfragen oder neue Jobs in Auftrag geben.

Abhängigkeiten

Die Entwicklung erfolgt in C++17 unter Zuhilfenahme folgender Pakete:

Funktionsweise

hadesd baut zwei Verbindungen über den DBus auf:

  1. Der UDisks2-Daemon wird über DBus angesprochen, um Informationen zu den verbundenen Festplatten zu gewinnen.
  2. Hadesd bietet selbst DBus-Interfaces an, um von Clients gesteuert werden zu können. Über Signale werden alle Clients über die Aktionen anderer Clients, Statusänderungen von Aufträgen und angeschlossene Geräte informiert.

Somit ist hadesd ein Vermittler zwischen dem low-level Interface (UDisks2) und dem graphischen oder textbasierten Client. Hadesd verwaltet Aufträge (Jobs), die jeweils von einer Quelle lesen und dann auf ein Gerät (die Festplatte) schreiben. Zukünftig sollen solche Jobs auch Kommandos auf der Festplatte ausführen können (secure erase). Jobs sind im Prinzip separate Threads, die sich jeweils um ein Ausgabegerät kümmern und unabhängig voneinander parallel laufen.

Konfiguration der Quellgeräte

Quellen werden in /etc/hades/sources.cfg bzw. .json definiert. Jede Quelle wird durch ein Objekt in einer Liste repräsentiert, das folgende Attribute haben kann:

Attribut Info
name eindeutiger Name
filename Dateiname, der geladen wird
check_size Wenn 'true', wird die Dateigröße vor dem Lesen überprüft. Auch beim Schreiben wird dann geprüft, ob die Quelldatei bis zum Ende gelesen wurde. 'true' ist bei Linux-images sinnvoll, 'false' bei virtuellen Dateien wie /dev/urandom.
pre Befehl, der vor dem Schreibvorgang vom System ausgeführt wird. Damit können z.B. Images vorbereitet werden.
post Befehl, der nach dem erfolgreichen Schreibvorgang ausgeführt wird. Damit können z.B. Partitionen auf der Platte verändert werden.

Für Dateinamen, sowie für pre- und post-hooks können Formatparameter angegeben werden:

Parameter Info
%prefix% Installationsprefix. Wenn im System installiert, ist das „/“. Wenn nicht, ist das z.B. „/home/user/dev/Hades/build/“.
%blockdevice% Ort des Blockdevice, z.B. „/dev/sdb“

Man kann dadurch z.B. im post hook „echo ', +' | sfdisk -N 1 %blockdevice%“ angeben, um die entstandene Partition im Blockdevice (nach Schreiben eines Linux-Images) zu erweitern.

Spezifikation der DBus-Schnittstellen

Sollte der Wunsch bestehen, Server in anderen Programmiersprachen zu entwickeln, sollte aus Kompatibilitätsgründen auf die folgende Spezifikation zurückgegriffen werden. Ein DBus-Server muss die im Folgenden angegebenen Interfaces und Methoden implementieren, um mit allen Clients kompatibel zu sein.

Mit einem [✓] werden Methoden und Signale gekennzeichnet, die in Hadesd bereits implementiert sind.


Interface org.computerwerk.Hades.DeviceManager

Der DeviceManager verwaltet alle Geräte, die beschrieben werden können. Konkret sind das alle angeschlossenen Massenspeicher, die nicht auf der Blacklist stehen. Einzelne Partitionen werden nicht aufgeführt, da Partitionstabellen sowieso überschrieben werden.

[✓] Signal: DeviceAdd ⮕ (String deviceid)

[✓] Signal: DeviceRemove ⮕ (String deviceid)

[✓] ListDevices() ⮕ (String devicelist)

Gibt eine Liste aller Devices in Form einer JSON-Liste von JSON-Objekten zurück. Ein Objekt hat die Struktur:

{
    "id": "<ID>",
    "blockdevice": "<BLOCKDEVICE>"
}

Interface org.computerwerk.Hades.JobManager

Der JobManager verwaltet Aufträge, die von Clients erteilt werden. Ein Auftrag besteht darin, Daten von einer Quelldatei auf ein Gerät zu kopieren. Aufträge werden parallel abgearbeitet, wobei jeder Auftrag einen eigenen Thread hat. Pro Gerät kann nur ein Auftrag abgearbeitet werden.

[✓] Signal: JobStart ⮕ (String jobid)

Wird ausgelöst, wenn ein Auftrag hinzugefügt wurde. Das ist nützlich, wenn mehrere Clients mit Hadesd kommunizieren.

[✓] Signal: JobError ⮕ (String jobid)

Dieses Signal wird ausgelöst, wenn ein Auftrag aufgrund eines Fehlers oder durch Zutun eines Clients beendet wird.

[✓] Signal: JobFinish ⮕ (String jobid)

Dieses Signal wird ausgelöst, wenn ein Auftrag erfolgreich beendet wird.

[✓] ActiveJobs() ⮕ (Int32 active)

Gibt die Zahl laufender Jobs zurück.

[✓] AddJob(String source, String device) ⮕ (String job)

Fügt einen neuen Job hinzu; einen Auftrag, der darin besteht, aus der Quelle source auf ein Gerät device zu schreiben.

AddEraseJob(String device) ⮕ (String job)

Fügt einen neuen Auftrag hinzu, der eine Festplatte mit dem ATA-erase Kommando löscht. Dabei wird die Platte mit Nullen überschrieben.

AddSecureEraseJob(String device) ⮕ (String job)

Fügt einen neuen Auftrag hinzu, der eine Festplatte mit dem dafür vorgesehenen ATA-secure-erase Kommando löscht. Die Daten auf der Platte werden mit vom Hersteller definierten Mustern überschrieben. Je nach Implementierung auf dem Festplatten(/SSD)-Controller kann es sein, dass dieses Kommando durch eine Verschlüsselung der Platte mit einem zufälligen Schlüssel – der nach dem „Löschen“ verworfen wird – realisiert wird.

[✓] InactiveJobs() ⮕ (Int32 inactive)

Gibt, analog zu ActiveJobs, die Zahl inaktiver, d.h. pausierter oder abgeschlossener, Jobs zurück.

[✓] JobStatus(String id) ⮕ (String status)

Gibt den Status eines Jobs als String zurück.

[✓] ListJobs() ⮕ (String joblist)

Gibt eine Liste aller Jobs als JSON-Liste von JSON-Objekten zurück. Auch abgeschlossene Jobs werden gelistet, sofern das betreffende Zielgerät noch angeschlossen ist. Ein Objekt hat die Form

{
    "id": "<JOB ID>",
    "progress": "<JOB PROGRESS [%]>"
}

PauseJob(String jobid) ⮕ (Bool status)

Pausiert einen Auftrag. Solange das Gerät angeschlossen ist, kann der Auftrag wieder aufgenommen werden. Andere Jobs können erst dann gestartet werden, wenn (a) das Gerät entfernt und wieder angeschlossen oder (b) der aktuelle Auftrag per StopJob beendet wurde.

StopJob(String jobid) ⮕ (Bool status)

Beendet einen Auftrag.

ResumeJob(String jobid) ⮕ (Bool status)

Nimmt einen pausierten Auftrag wieder auf.


Interface org.computerwerk.Hades.SourceManager

[✓] ListSources() ⮕ (String sourcelist)

Gibt eine Liste aller Quellobjekte als JSON-Liste zurück. Ein Objekt hat die Form

{
    "name": "<NAME>",
    "filename": "<FILENAME>"
}

Die Liste ist im Lebenszyklus von Hadesd stets konstant, sodass die Methode nur einmalig vom Client aufgerufen werden muss.