Salut,
En ayant un peu marre d'attendre ma freebox, je viens d'écrire un petit script permettant d'utiliser très facilement apt-get avec une connexion internet lente ou inexistante. Si quelques personnes peuvent le tester et m'en dire des nouvelles, je ferai une page sur le wiki pour ça.
[Edit : Aldian
l'a fait, merci à lui (ainsi qu'à sa patience en tant que bêta-testeur... 😉)]
C'est tout simple : vous créez un fichier nommé
apt-off et vous le remplissez avec ça : [Nouvelle version, datée du 15/12/07]
#!/bin/bash
FAILURE=1
SUCCESS=0
# Répertoires
CURRENTDIR="${PWD}/"
CONFIGDIR="config_files/"
DEB="deb/"
PARTIAL="${DEB}/partial/"
LISTDIR="/var/lib/apt/lists/"
# Fichiers
CONFIGFILE="config_apt"
OFFLINE="offline.packages"
SOURCE="/etc/apt/sources.list"
# Quelques couleurs
BOLD="\\033[1;39m"
NORMAL="\\033[0;39m"
VERT="\\033[32m"
ROUGE="\\033[31m"
ROSE="\\033[35m"
BLEU="\\033[34m"
OPTIONS="${BOLD}${BLEU}OPTIONS${NORMAL}\n
\t${VERT}-d${NORMAL} ou${VERT} --download${NORMAL}\n
\tTélécharge les paquets. Cette option doit être utilisée sur un\n
\tordinateur disposant d'un système Linux et d'une connexion\n
\tinternet. Une fois téléchargés, les paquets peuvent être\n
\tplus ou moins volumineux, aussi prévoyez un support de\n
\ttransport de capacité suffisante.${BOLD}${ROUGE} N'oubliez pas le fichier\n
\t${BLEU}${OFFLINE}${NORMAL} !!!${NORMAL}\n\n
\t${VERT}-g${NORMAL} ou${VERT} --generate${BLEU} [paquet1 paquet2 ...]${NORMAL} ou${BLEU} [dist-upgrade]${NORMAL}\n
\tGénère la liste des paquets à télécharger. Cette liste est\n
\tstockée dans le fichier ${BLEU}${OFFLINE}${NORMAL}.\n\n
\t${VERT}-h${NORMAL} ou${VERT} --help${NORMAL}\n
\tAffiche cette aide.\n\n
\t${VERT}-o${NORMAL} ou${VERT} --options${NORMAL}\n
\tAffiche les options.\n\n
\t${VERT}-c${NORMAL} ou${VERT} --configure${NORMAL}\n
\tTélécharge les fichiers de configuration d'apt.\n\n
\t${VERT}-x${NORMAL} ou${VERT} --extract${BLEU} [paquet1 paquet2 ...]${NORMAL} ou${BLEU} [dist-upgrade]${NORMAL}\n
\tExtrait et installe les paquets.\n"
########################################################
## Téléchargement des fichiers de configuration d'apt ##
########################################################
function configure()
{
# On vérifie que la liste des listes de paquets est bien présente
if [[ -e ${CONFIGDIR}/${CONFIGFILE} ]]
then
cd ${CONFIGDIR}
sh -x ${CONFIGFILE} || cd ${CURRENTDIR} && return ${FAILURE}
cd ${CURRENTDIR}
echo -e "La procédure s'est déroulée correctement. Vous pouvez retourner sur votre ordinateur personnel et choisir des paquets à installer."
return ${SUCCESS}
else
echo -e "Vous n'avez pas exécuté${VERT} apt-off -g${NORMAL} sur votre ordinateur, ou vous avez supprimé le dossier${VERT} config_files${NORMAL} et le fichier${VERT} config_apt${NORMAL} qu'il contenait... Reprenez la procédure à zéro."
return ${FAILURE}
fi
return ${FAILURE}
}
################################
## Téléchargement des paquets ##
################################
function download()
{
if [[ ! -e ${DEB} ]]
then
mkdir ${DEB}
fi
sh -x ${OFFLINE}
return ${SUCCESS}
}
############################
## Extraction des paquets ##
############################
function extract()
{
# Je vois plus trop l'intérêt de ça, mais bon...
if [[ ! -e ${PARTIAL} ]]
then
PARTIAL_CREATED=1
mkdir ${PARTIAL}
else
PARTIAL_CREATED=0
fi
# Test des arguments
if [[ "$#" < 1 ]]
then
echo "ATTENTION : Vous devez indiquer le nom des programmes que vous voulez installer,"
echo "ou le mot \"dist-upgrade\" !!!"
exit
# Cas particulier : mise à jour
elif [[ $1 == "dist-upgrade" ]]
then
sudo apt-get -o dir::cache::archives=${PWD}/${DEB} dist-upgrade
else
# Liste des paquets à installer
for ((i=1; i<="$#"; i++ ))
do
sudo apt-get -o dir::cache::archives=${PWD}/${DEB} install ${!i}
done
fi
# Un peu de ménage
if (( ${PARTIAL_CREATED} )); then
rm -rf ${PARTIAL}
fi
return ${SUCCESS}
}
##########################################
## Sélection des paquets à télécharger ##
##########################################
function generate()
{
# Il faut au moins une liste de paquets
if [[ `ls ${LISTDIR} | grep binary-i386_Packages | wc -l` == 0 ]]
then
# Si toute première utilisation, on prépare la configuration
if [[ ! -e ${CONFIGDIR} ]]
then
mkdir ${CONFIGDIR}
# Déduction des listes de paquets à télécharger, d'après le sources.list
awk '($1=="deb" || $1=="deb-src") && !match($2,"cdrom") { split($2,A,"/"); for(i=4;i<=NF;++i) print "wget -O "A[3]"_"A[4]"_dists_"$3"_"$i"_binary-i386_Packages.gz "$2"dists/"$3"/"$i"/binary-i386/Packages.gz" }' < ${SOURCE} > ${CONFIGDIR}/${CONFIGFILE}
# Un message de prévention...
echo -e "ATTENTION : Il semblerait que c'est la première fois que vous essayez d'utiliser un dérivé d'apt-get sur cet ordinateur. Afin de terminer la configuration, veuillez exécuter la commande${VERT} apt-off -c${NORMAL} sur un ordinateur disposant d'un accès à internet, puis poursuivre la procédure."
exit
# Si seconde utilisation, on installe les listes de paquets
elif [[ `ls ${CONFIGDIR} | grep gz | wc -l` > 0 ]]
then
sudo cp ${CONFIGDIR}/*.gz ${LISTDIR}
sudo chmod 755 ${LISTDIR}*.gz
# Plus compliqué qu'un "gunzip *.gz", mais permet d'éviter que le script quitte en cas de fichier vide
for FICHIER in `ls ${LISTDIR}*.gz`
do
sudo gunzip ${FICHIER}
done
# Si l'utilisateur n'a pas bien compris...
else
echo -e "Vous devez d'abord exécuter${VERT} apt-off -c${NORMAL} sur un ordinateur avec internet !"
exit
fi
fi
# à‰craser ou mettre à jour le fichier de paquets à installer ?
if [[ -e ${OFFLINE} ]]
then
echo "ATTENTION : Le fichier offline.packages existe déjà , voulez-vous l'écraser (si"
echo "non, les paquets seront ajoutés à la liste) ? (o/n)"
read ECRASE
fi
# à‰craser ou mettre à jour, suite...
if [[ $ECRASE == o ]]
then
echo "cd ${DEB}" > ${OFFLINE}
else
echo "cd ${DEB}" >> ${OFFLINE}
fi
# Pas assez d'arguments !
if [[ "$#" < 1 ]]
then
echo "ATTENTION : Vous devez indiquer le nom des programmes que vous voulez installer,"
echo "ou le mot \"dist-upgrade\" !!!"
exit
# Cas particulier : mise à jour
elif [[ $1 == "dist-upgrade" ]]
then
sudo apt-get -qq --print-uris dist-upgrade > .offline_tmp
else
# Liste des paquets à installer
for ((i=1; i<="$#"; i++ ))
do
sudo apt-get -qq --print-uris install ${!i} >> .offline_tmp
done
fi
# Préparation du fichier de paquets à installer
awk '{print "wget -O " $2 " " $1}' < .offline_tmp >> ${OFFLINE}
echo "cd .." >> ${OFFLINE}
#### Lignes à décommenter pour Windows :
# awk '{print $1}' < .offline_tmp >> offline.packages_url
# awk '{print $2}' < .offline_tmp >> offline.packages_list
rm -f .offline_tmp
}
# Un peu d'aide...
function printhelp()
{
ESSAI="\\033[2J\\033[0;0f${BOLD}${BLEU}NOM${NORMAL}\n
\tapt-off\n
\n${BOLD}${BLEU}SYNOPSIS${NORMAL}\n
\t${VERT}apt-off [option]${NORMAL}\n
\n${BOLD}${BLEU}DESCRIPTION${NORMAL}\n
\t${VERT}apt-off${NORMAL} est un script destiné à permettre l'utilisation de\n
\tl'utilitaire apt sur un ordinateur ne possédant pas de connexion à \n
\tinternet. Il procède en trois étapes, devant être effectuées dans\n
\tle répertoire contenant le fichier exécutable apt-off :\n
\t1- sélection des paquets à installer,\n
\t2- téléchargement des paquets ; cette étape doit être effectuée sur\n
\tun ordinateur disposant d'un système Linux (elle${BOLD} ne nécessite pas${NORMAL} apt,\n
\tmais utilise${VERT} wget${NORMAL} ; si vous n'avez accès qu'à un système Windows, vous\n
\tdevrez décommenter une des deux lignes dédiées à la fin du fichier\n
\tapt-off et télécharger manuellement les paquets listés dans le fichier\n
\t${VERT}offline.packages_url${NORMAL} ou${VERT} offline.packages_list${NORMAL}) et connecté à internet,\n
\t3- installation des paquets.\n
\n${BOLD}${BLEU}AVERTISSEMENT${NORMAL}\n
\t${BOLD}${ROUGE}ATTENTION :${NORMAL} l'installation de paquets et a fortiori la mise à jour avec\n
\tl'option dist-upgrade ne sont pas sans risques. Il est donc fortement\n
\tconseillé, avant toute utilisation de ce programme, de simuler ces\n
\topérations avec apt-get afin d'être certain de vouloir effectuer les\n
\tmodifications (lancez simplement${VERT} apt-get install liste_de_paquets${NORMAL}\n
\tou${VERT} apt-get dist-upgrade${NORMAL}). L'auteur ne saura être tenu pour responsable\n
\ten cas de problème.\n"
ESSAI="${ESSAI}\n${OPTIONS}\n${BOLD}${BLEU}COPYRIGHT${NORMAL}\n
\tCopyright 2006, Goulven Guillard.\n
\tCe programme est copyleft, la copie, la modification et la diffusion\n
\tsont autorisées et encouragées tant qu'elles ne sont pas à but lucratif.\n
\tReportez les bugs à ${BLEU}lecotegougdelaforce [at] free.fr${NORMAL}.\n"
echo -e $ESSAI | less -R
return ${SUCCESS}
}
# Liste des options disponibles
function usage()
{
echo -e ${OPTIONS}
return ${SUCCESS}
}
# Lisons les options
while getopts "cdg:hox:-:" OPTION
do
case $OPTION in
c )
if [[ $#>1 ]]
then
echo "Trop d'arguments !!!"
usage
else
configure
fi;;
d )
if [[ $#>1 ]]
then
echo "Trop d'arguments !!!"
usage
else
download
fi;;
g )
while [[ $#>1 ]]
do
shift
PKG="${PKG} ${1}"
done
generate ${PKG};;
h ) printhelp;;
o ) usage;;
x )
while [[ $#>1 ]]
do
shift
PKG="${PKG} ${1}"
done
extract ${PKG};;
# Cas particulier : les options longues
- )
case $OPTARG in
configure )
if [[ $#>1 ]]
then
echo "Trop d'arguments !!!"
usage
else
configure
fi;;
download )
if [[ $#>1 ]]
then
echo "Trop d'arguments !!!"
usage
else
download
fi;;
extract )
while [[ $#>1 ]]
do
shift
PKG="${PKG} ${1}"
done
extract ${PKG};;
generate )
while [[ $#>1 ]]
do
shift
PKG="${PKG} ${1}"
done
generate ${PKG};;
help ) printhelp;;
options ) usage;;
* )
esac;;
# par défaut
* ) usage;;
esac
done
Ensuite vous changez les permissions de ce fichier en exécutable (
chmod +x apt-off), vous le copiez sur un disque ou une clé usb, et c'est parti ! 😃
Tous les détails sont expliqués en faisant
apt-off -h.
NB : Ce script ne fonctionne pas en l'état pour la version 64 bits. La modification à faire est très simple, postez en fin de sujet si vous utilisez cette version.
Pour vous servir... 😉
Edit : Au fait, je me suis inspiré
de ça.