// Datei: ./praxis/eigenes-apt-repository-anlegen/dpkg-scanpackages.adoc

// Baustellenstatus: Notizen

=== dpkg-scanpackages ===

// Stichworte für den Index
(((Debianpaket, dpkg-dev)))
(((dpkg-scanpackages)))
(((dpkg-scanpackages, -m)))
(((dpkg-scanpackages, --multiversion)))
(((Paket, installieren)))
(((Paket, bereitstellen)))
(((Paketquelle, lokal)))

Die nachfolgend vorgestellte Lösung ist ähnlich zu der in
<<eigenes-apt-repository-anlegen-verzeichnis>>. Es ergänzt diese jedoch
noch um passende Metadaten (auch 'Packages index files' genannt). Die
Basis bildet hier ebenfalls ein Verzeichnis, welches Sie als Ablage für
ihre Softwarepakete benutzen möchten. Hier heißt dieses Verzeichnis
beispielhaft `/opt/paketarchiv/local`. Sofern es noch nicht vorhanden
ist, legen Sie dieses im **1. Schritt** noch wie folgt an:

.Schritt 1: Verzeichnis für das Paketarchiv anlegen
----
# mkdir -p /opt/paketarchiv/local
----

Im **2. Schritt** kopieren Sie alle gewünschten `.deb`-Pakete in dieses 
Verzeichnis:

.Schritt 2: Daten hineinkopieren
----
# cp -v *.deb /opt/paketarchiv/local
----

Im **3. Schritt** erzeugen Sie noch zusätzliche Metadaten für ihr
Paketarchiv. Dabei kommt das Werkzeug `dpkg-scanpackages` aus dem Paket
'dpkg-dev' <<Debian-Paket-dpkg-dev>> zum Einsatz. Sofern Sie bisher noch
keine Debian-Pakete selbst gebaut haben, dürfte dieses Paket noch nicht
auf ihrem System vorhanden sein und Sie müssen es daher vor der
Benutzung nachinstallieren.

Nun erstellen Sie die benötigten Metadaten mittels `dpkg-scanpackages`.
Als minimale Angabe erwartet `dpkg-scanpackages` den Pfad zum
Paketarchiv und schreibt dann seine Ausgabe auf `stdout`. Besser ist es,
die Ausgabe mittels Umleitungsoperator `>` gleich in eine passende Datei
namens `Packages` umzulenken (Schreibweise des Dateinamens mit großem
`P`). Der nachfolgende Aufruf geht noch einen Schritt weiter und
komprimiert die Ausgabe zusätzlich mittels `gzip`, so dass als Ergebnis
die Datei `Packages.gz` entsteht:

.Schritt 3: Metadaten zum Paketarchiv erzeugen (`Packages.gz`)
----
# cd /opt/paketarchiv
# dpkg-scanpackages local/ | gzip -c > local/Packages.gz
dpkg-scanpackages: Information: 6 Einträge wurden in Ausgabe-Paketdatei geschrieben.
#
----

Liegen bspw. 6 Debian-Pakete in Form von `.deb`-Dateien im Paketarchiv,
liest `dpkg-scanpackages` deren Metadaten, gibt eine Meldung wie oben
aus und leitet die Informationen an `gzip` weiter. `gzip` komprimiert
die empfangenen Daten zunächst und speichert diese dann als Datei
`Packages.gz` im Verzeichnis des Paketarchivs. Die erzeugte Datei
`Packages.gz` beinhaltet Informationen pro Paket in der folgenden Form:

.Paketinformationen zum beispielhaft verwendeten Paket 'meta-mc'
----
# cat local/Packages 
Package: meta-mc
Version: 1.0
Architecture: all
Maintainer: Frank Hofmann <frank.hofmann@efho.de>
Installed-Size: 9
Depends: mc, mc-data
Filename: local/meta-mc_1.0_all.deb
Size: 3392
MD5sum: e8889ea18c25b40ba4cac00b7faf1518
SHA1: 58e5f6b03643d6da7fa471f63f387335a2df5e55
SHA256: fb6ee7948c5a5b243b6940b172af96fa72123d9c031caca62541d8c4f14aa7de
Section: misc
Priority: optional
Multi-Arch: foreign
Description: Installs the Midnight Commander
 Installs the Midnight Commander

...
#
----

Die Pfadangabe, die Sie `dpkg-scanpackages` geben, ist jedoch tückisch.
Laut Manpage und den von uns online gefundenen Beispielen kann jeder
Pfad verwendet werden, in unseren Tests können wir das jedoch nicht
bestätigen. Die von uns oben genutzte Form funktioniert auch später mit
APT und `aptitude` zur Installation von Paketen.

[NOTE]
====
Bitte beachten Sie, dass Sie diesen Schritt mittels `dpkg-scanpackages`
jedes Mal wiederholen müssen, wenn Sie Pakete im Paketarchiv hinzufügen
oder Pakete daraus entfernen. Mit dem folgenden Shellskript lässt sich
der Schritt automatisieren:

.Automatisierung mit Hilfe eines Shellskriptes
----
#! /bin/bash
dpkg-scanpackages /opt/paketarchiv/local | gzip -c > /opt/paketarchiv/local/Packages.gz
----

Idealerweise legen Sie das Skript unter einen passenden Pfad wie bspw. 
`/usr/bin` ab. Damit vereinfacht sich ihr Aufruf.
====

Nun folgt der **4. Schritt** -- das Hinzufügen ihres soeben erzeugten,
lokalen Paketarchivs zur Liste der von Ihnen genutzten Repositorys
(siehe <<etc-apt-sources.list-verstehen>>). Entweder ergänzen Sie die
Datei `/etc/apt/sources.list` um eine Zeile mit ihrem Paketarchiv oder
Sie erstellen eine separate Datei im Verzeichnis
`/etc/apt/sources.list.d`. Für obiges Beispiel sieht die Zeile wie folgt
aus, um ihr Paketarchiv zunächst lokal einzubinden:

.Schritt 4: Zusätzlicher Eintrag in der Datei `/etc/apt/sources.list`
----
deb [trusted=yes] file:///opt/paketarchiv local/
----

Die Angabe `[trusted=yes]` teilt APT mit, dass die Pakete aus der
angegebenen, lokalen Paketquelle vertrauenswürdig sind. Damit sparen Sie
sich (zunächst) den kryptographischen Überbau und können ihr Archiv
sofort verwenden.

Um das Paketarchiv nun auch für andere Benutzer via HTTP oder HTTPS
zugänglich zu machen, stellen Sie das Verzeichnis bspw. mit Hilfe eines
lokalen Webservers bereit. Ein gültiger Eintrag wäre bspw. der folgende:

.Zusätzlicher Eintrag in der Datei `/etc/apt/sources.list` (Webserver)
----
deb [trusted=yes] https://www.webserver.com/paketarchiv local/
----

// Stichworte für den Index
(((Debianpaket, apt-transport-https)))
[NOTE]
====
Ab APT in der Version 1.5 (verfügbar ab Debian 10 'Buster') unterstützt
es HTTPS von sich aus. Nutzen Sie (noch) eine frühere Veröffentlichung
und möchten ihr Paketarchiv ebenfalls via HTTPS anzubieten, greifen Sie
zusätzlich auf das Paket 'apt-transport-https'
<<Debian-Paket-apt-transport-https>> zurück. Mehr Informationen dazu
finden Sie unter <<LambAptHTTPS>>.
====

Mit obigem Eintrag vertraut APT nun allen Paketen aus ihrem Paketarchiv.
Aktualisieren Sie nun Ihre Liste der verfügbaren Pakete -- bspw. mit
`apt-get update` -- ``lernt'' APT ihr Paketarchiv und kann
Softwarepakete daraus in ihr System einbinden.

[NOTE]
====
Bitte beachten Sie, dass es bei dieser Lösung keine Authentifizierung und 
Integritätsprüfung der Pakete im Archiv gibt. Die Verantwortung über die 
bereitgestellten Softwarepakete liegt vollständig bei Ihnen.
====

// Datei (Ende): ./praxis/eigenes-apt-repository-anlegen/dpkg-scanpackages.adoc

