Benutzer-Werkzeuge

Webseiten-Werkzeuge


softwareanleitungen:hadesd
no way to compare when less than two revisions

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.


softwareanleitungen:hadesd [2021/01/25 20:14] (aktuell) – angelegt - Externe Bearbeitung 127.0.0.1
Zeile 1: Zeile 1:
 +====== 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:
 +
 +  * **cmake**: Buildsystem
 +  * **libdbus-1-dev**: DBus-Anbindung
 +  * **libsystemd-dev**: systemd-Anbindung
 +  * **nlohmann-json3-dev**: json-parsing
 +
 +===== Funktionsweise =====
 +
 +hadesd baut zwei Verbindungen über den DBus auf:
 +  - Der UDisks2-Daemon wird über DBus angesprochen, um Informationen zu den verbundenen Festplatten zu gewinnen.
 +  - 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:
 +
 +<code>
 +{
 +    "id": "<ID>",
 +    "blockdevice": "<BLOCKDEVICE>"
 +}
 +</code>
 +
 +----
 +
 +==== 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
 +
 +<code>
 +{
 +    "id": "<JOB ID>",
 +    "progress": "<JOB PROGRESS [%]>"
 +}
 +</code>
 +
 +=== 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
 +
 +<code>
 +{
 +    "name": "<NAME>",
 +    "filename": "<FILENAME>"
 +}
 +</code>
 +
 +Die Liste ist im Lebenszyklus von Hadesd stets konstant, sodass die Methode nur einmalig vom Client aufgerufen werden muss.
softwareanleitungen/hadesd.txt · Zuletzt geändert: 2021/01/25 20:14 von 127.0.0.1