En suivant les instructions de Meilleur moyen de mettre en cache les téléchargements sur un réseau local? , j'ai configuré un proxy de mise en cache sur mon réseau local. Étant donné que cette machine n'est pas toujours opérationnelle, j'aimerais pouvoir actualiser la liste des sources et installer des packages sans utiliser ce proxy s'il n'est pas disponible.
J'ai déjà lu la section Acquérir de la page de manuel de apt.conf(5)
, mais je n'ai pas trouvé d'option comme "Silent-Fail".
Pour le moment, Sudo apt-get update
et les commandes connexes échouent car aucune connexion n'a pu être établie. Alors, comment configurer le client pour que le proxy soit ignoré s'il n'est pas disponible?
Il existe un paramètre non documenté, Acquire::http::ProxyAutoDetect
. Ce paramètre doit contenir le chemin d'accès complet au binaire et ne peut pas avoir d'argument. La commande doit générer le proxy à utiliser (exemple: http://10.0.0.1:8000
).
Compte tenu des informations ci-dessus, vous pouvez créer un script qui essaie un proxy avant de le définir. Si aucun proxy n'est disponible, une connexion directe doit être utilisée.
Vous trouverez ci-dessous un tel script de détection de proxy qui teste les proxies http://10.0.0.1:8000/
et http://10.0.0.2:8000
.
Mettez le code dans /etc/apt/detect-http-proxy
:
#!/bin/bash
# detect-http-proxy - Returns a HTTP proxy which is available for use
# Author: Lekensteyn <[email protected]>
# Supported since APT 0.7.25.3ubuntu1 (Lucid) and 0.7.26~exp1 (Debian Squeeze)
# Unsupported: Ubuntu Karmic and before, Debian Lenny and before
# Put this file in /etc/apt/detect-http-proxy and create and add the below
# configuration in /etc/apt/apt.conf.d/30detectproxy
# Acquire::http::ProxyAutoDetect "/etc/apt/detect-http-proxy";
# APT calls this script for each Host that should be connected to. Therefore
# you may see the proxy messages multiple times (LP 814130). If you find this
# annoying and wish to disable these messages, set show_proxy_messages to 0
show_proxy_messages=1
# on or more proxies can be specified. Note that each will introduce a routing
# delay and therefore its recommended to put the proxy which is most likely to
# be available on the top. If no proxy is available, a direct connection will
# be used
try_proxies=(
10.0.0.1:8000
10.0.0.2:8000
)
print_msg() {
# \x0d clears the line so [Working] is hidden
[ "$show_proxy_messages" = 1 ] && printf '\x0d%s\n' "$1" >&2
}
for proxy in "${try_proxies[@]}"; do
# if the Host machine / proxy is reachable...
if nc -z ${proxy/:/ }; then
proxy=http://$proxy
print_msg "Proxy that will be used: $proxy"
echo "$proxy"
exit
fi
done
print_msg "No proxy will be used"
# Workaround for Launchpad bug 654393 so it works with Debian Squeeze (<0.8.11)
echo DIRECT
Maintenant, APT doit être configuré pour utiliser le script de détection de proxy ci-dessus, placez donc le code suivant dans /etc/apt/apt.conf.d/30detectproxy
:
# Fail immediately if a file could not be retrieved. Comment if you have a bad
# Internet connection
Acquire::Retries 0;
# undocumented feature which was found in the source. It should be an absolute
# path to the program, no arguments are allowed. stdout contains the proxy
# server, stderr is shown (in stderr) but ignored by APT
Acquire::http::ProxyAutoDetect "/etc/apt/detect-http-proxy";
J'ai également mis le code suivant dans le fichier pour empêcher la projection de certains hôtes.
# Override the default proxy, DIRECT causes a direct connection to be used
Acquire::http::Proxy {
deb.opera.com DIRECT;
dl.google.com DIRECT;
};
Par défaut, le script indique si un proxy est utilisé ou non. Pour le désactiver, éditez /etc/apt/detect-http-proxy
et changez show_proxy_messages=1
en show_proxy_messages=0
.
Il existe maintenant un moyen officiellement supporté de le faire - en utilisant l'option - Acquire::http::Proxy-Auto-Detect
(voir la page de manuel apt.conf
). Le comportement est similaire à l'ancien Acquire::http::ProxyAutoDetect
non documenté _ (notez la présence/l'absence de traits d'union dans les options de configuration nouvelles/anciennes), il est largement compatible avec les versions antérieures, mais a été étendu ...
Je suis en train de soumettre un correctif aux mainteneurs d'apt pour améliorer la documentation, mais comme il est peu probable que cette version soit intégrée à une version d'apt qui est livrée avec une distribution distro pendant un bon bout de temps, je vais inclure le texte de le patch proposé ici:
Acquire::http::Proxy-Auto-Detect
peut être utilisé pour spécifier une commande externe permettant de découvrir le proxy http à utiliser. APT peut appeler la commande plusieurs fois et transmettra un URI à la commande en tant que premier et unique paramètre. APT s'attend à ce que la commande génère le proxy à utiliser pour contacter l'URI en question sur sa sortie standard sous la forme d'une seule ligne du style http://proxy:port/
ou du mot DIRECT
si aucun proxy ne devrait être utilisé. Aucune sortie n'indique que les paramètres de proxy génériques doivent être utilisés.
Notez que la détection automatique ne sera pas utilisée pour un hôte si une configuration de proxy spécifique à l'hôte est déjà définie via Acquire::http::Proxy::Host
.
Pour diagnostiquer les interactions avec la commande external, définissez Debug::Acquire::http=yes
et/ou Debug::Acquire::https=yes
par exemple à l'aide du paramètre de ligne de commande -o
.
Notez que vous utilisez une version préliminaire d’apt, les versions 1.3 ~ exp2 à 1.3, puis un bogue (probablement corrigé par la version 1.3.1) peut entraîner l’analyse de stderr de la commande externe avec la stdout.
/etc/apt/apt.conf.d/02proxy
:
Acquire::http::Proxy-Auto-Detect "/usr/local/bin/apt-proxy-detect.sh";
/usr/local/bin/apt-proxy-detect.sh
:
#!/bin/bash
IP=192.168.88.1
PORT=3142
if nc -w1 -z $IP $PORT; then
echo -n "http://${IP}:${PORT}"
else
echo -n "DIRECT"
fi
nc
fonctionne (Sudo apt-get install netcat
) s'il manque.chmod +x /usr/local/bin/apt-proxy-detect.sh
S'il peut se connecter à un proxy, il imprime le proxy APT l'utilise. S'il ne le peut pas, il affiche normalement DIRECT et APT.