Apt-troulite
De Troulite
Une réflexion sur l'installation de logiciels sur Debian GNU/Linux sans avoir Internet, qui débouche sur une solution : apt-troulite.
Le cadre du problème
- Debian est une distribution centralisée, l'intégralité des applications disponibles est regroupée sur des serveurs.
- Une installation de Debian amène la machine dans un état précis, caractérisé par une liste regroupant les paquets installés et les paquets installables.
- L'installation d'un logiciel (le passage d'un paquet installable à un paquet installé) consiste à :
- trouver la liste des paquets manquants (le logiciel ET ses dépendances),
- télécharger ces paquets,
- installer ces paquets dans un ordre précis.
Les solutions existantes quand on n'a pas Internet
Vous avez une Debian offline, vous avez accès à une machine online non Debian mais qui a wget
- Pour installer un paquet officiel :
- sur la machine online : vous pouvez télécharger les isos de Debian contenant tous les paquets disponibles à un instant t (plusieurs DVDs)
- sur la machine offline : vous utilisez apt-cdrom pour que les isos servent de sources à votre gestionnaire de paquets
- Pour installer un paquet non officiel :
- mise à jour de vos sources offline :
- sur la machine offline : vous ajouter les url des dépots non officiels dans votre sources.list, puis vous faites un apt-zip-list -s -m /mnt/path/to/directory -a update -o tar (requiert apt-zip version patchée par franceso), ce qui génère un shell script
- sur la machine online : vous exécutez le shell script sh fetch-script-wget-machine qui va utiliser wget pour télécharger sur les dépots les listes des paquets disponibles
- sur la machine offline : vous exécutez en tant que root apt-zip-inst -s -m /mnt/path/to/directory
- installation proprement dite :
- sur la machine offline : vos sources sont désormais à jour, vous pouvez faire votre sélection avec votre gestionnaire de paquets habituels, puis apt-zip-list (avec les bonnes options) pour générer le shell script qui téléchargera vos paquets. En gros c'est un wrapper autour de apt-get qui a une option pous afficher les url des paquets à télécharger.
- sur la machine online : exécution du shell script de téléchargement (qui utilise wget)
- sur la machine offline : apt-zip-inst fera l'installation à partir des paquets téléchargés précédemment
- NB : le même mécanisme est possible avec apt-medium
- mise à jour de vos sources offline :
Notre solution : apt-troulite
Vous avez une Debian offline, vous avez accès à une machine online Debian
- Pour installer un paquet officiel ou non officiel :
- sur la machine offline : vous copiez /var/lib/dpkg/status et /etc/apt/sources.list sur un support amovible
- sur la machine online : vous exécutez apt-troulite. Evidemment vous pouvez rajouter dans le sources.list tous les dépôts officiels ou non officiels que vous voulez. apt-troulite vous fournit au choix :
- soit une archive contenant les paquets qui manquent à votre pc offline pour installer le paquet souhaité
- soit un script qui va utiliser wget pour télécharger et préparer les données pour votre pc
- sur la machine offline : vous exécutez un script généré précédemment par apt-troulite pour finir l'installation
Vous avez une Debian offline, vous avez accès à une machine online non Debian, mais vous voulez apt-troulite à tout prix (c'est tellement bien !)
- Utilisez la web interface
Vous avez une Debian offline, vous avez accès à une machine online Debian, mais vous ne voulez pas de ce apt-troulite (mais vous faites quoi ici ?)
- Consultez le script apt-troulite, vous verrez que tout repose sur l'utilisation de certaines options de la commande apt-get. Vous pouvez donc tout faire vous-même, apt-troulite n'est qu'un wrapper.
Documents qui ont servi à la conception d'apt-troulite
- http://cvs.lp.se/doc/apt-doc/offline.text.gz : le paquet apt-doc contenait la solution
- http://www.orsobruno.net/download/Debian-upgrade-without-Internet-HOWTO-en.pdf.gz
Le coin des développeurs
Faites part de vos idées sur la page de discussion.
Pool d'idées
- Pouvoir choisir son architecture.
- Pouvoir choisir sa branche officielle (oldstable, stable, testing, unstable, experimental) ce qui rajouterait automatiquement les dépots officiels.
- Pouvoir demander un upgrade ou un dist-upgrade.
ToDo
- Créer un système de log pour pouvoir garder un historique de ce que fait apt-troulite
- Récupérer le stdout du apt-get update et du apt-get install pour afficher un message d'erreur plus explicite en cas de problème (ca peut aider de voir "nom de paquet invalide" ou "paquet cassé"...)
- Revoir la gestion du temps : un travail trop long côté serveur fait sans doute "timeouter" l'ensemble. Il faut peut-être être plus asynchrone
Web Interface
La web interface se trouve sur http://www.troulite.fr/~xav/apt-troulite.php
Cas d'utilisation
- Lolo est chez lui sur son pc sans connexion Internet
- il copie sur sa clef usb /var/lib/dpkg/status (optionnel : il copie aussi /etc/apt/sources.list)
- Lolo se rend sur un pc ayant accès à Internet et donc à la web interface
- il upload son fichier status (optionnel : et son sources.list)
- il choisit son ou ses dépots officiels ou non officiels (remplissage de text area et/ou completion de son sources.list)
- il entre le nom du ou des paquets désirés
- il télécharge une archive contenant les .deb nécéssaires et un script d'installation en local
- Lolo retourne chez lui et exécute le script
v1.1
ChangeLog
- Corrections de sécurité
- Possibilité de choisir entre télécharger l'archive ou afficher les urls des paquets à télécharger
v1.0
Bugs connus
- Problème pour télécharger : l'archive est générée correctement en local mais le téléchargement se passe mal dès le début et l'utilisateur reçoit un fichier invalide de quelques ko. Problème survenu d'un coup et sans qu'il y ait eu des modifications (a priori)... enquête terminée, pollution sur stdout, bug résolu
Failles de sécurité :
- Il ne faut pas travailler dans /tmp sous peine de symbolic link attack : tout le monde peut écrire dans /tmp, donc tout le monde peut y mettre des liens symboliques vers des trucs importants avec des noms quelconques, donc php peut en croyant ouvrir/effacer/autre un fichier à lui bosser avec ce lien...
- Il faut utiliser escapeshellcmd() de php pour filtrer les champs renseignés par l'utilisateur, pour éviter un "apt-get install toto; rm *; titi"
Shell Script
v1.0Pre2
ChangeLog
- Le script généré pour faciliter l'installation sur le pc offline est moins "instrusif" (ne déclenche pas l'installation)
- Il y a un parsing des arguments avec vérification
- On peut passer en option le sources.list (on ne passe plus n dépôts en paramètres par contre)
- On peut passer un nombre quelconque de noms de paquets en paramètre
- On peut recevoir un fichier status qui a été gzippé
- On compresse le tar (les listes des packages après un 'update' sont d'énormes fichiers texte)
- Gestion multi-utilisateur de base : on peut exécuter plusieurs apt-troulite simultanément
Bugs connus
- Problème avec les chemins relatifs ?
- cp /var/lib/dpkg/status ~/toto && apt-troulite --status=~/toto => apt-troulite!!!ERROR!!! : status has to be a file.
v1.0Pre1
Bugs connus
- problème avec le nom du fichier "status" : il doit être appelé "status" mais le script ne le renomme pas et garde le nom fourni par l'utilisateur (donc a priori n'importe quoi)
- le répertoire temporaire n'est pas effacé en cas de crash ou d'interruption