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.
Die Entwicklung erfolgt in C++17 unter Zuhilfenahme folgender Pakete:
hadesd baut zwei Verbindungen über den DBus auf:
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.
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.
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.
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.
Gibt eine Liste aller Devices in Form einer JSON-Liste von JSON-Objekten zurück. Ein Objekt hat die Struktur:
{ "id": "<ID>", "blockdevice": "<BLOCKDEVICE>" }
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.
Wird ausgelöst, wenn ein Auftrag hinzugefügt wurde. Das ist nützlich, wenn mehrere Clients mit Hadesd kommunizieren.
Dieses Signal wird ausgelöst, wenn ein Auftrag aufgrund eines Fehlers oder durch Zutun eines Clients beendet wird.
Dieses Signal wird ausgelöst, wenn ein Auftrag erfolgreich beendet wird.
Gibt die Zahl laufender Jobs zurück.
Fügt einen neuen Job hinzu; einen Auftrag, der darin besteht, aus der Quelle source auf ein Gerät device zu schreiben.
Fügt einen neuen Auftrag hinzu, der eine Festplatte mit dem ATA-erase Kommando löscht. Dabei wird die Platte mit Nullen überschrieben.
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.
Gibt, analog zu ActiveJobs, die Zahl inaktiver, d.h. pausierter oder abgeschlossener, Jobs zurück.
Gibt den Status eines Jobs als String zurück.
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 [%]>" }
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.
Beendet einen Auftrag.
Nimmt einen pausierten Auftrag wieder auf.
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.