Comment ignorer un proxy s'il n'est pas disponible?

15

Vous suivez les instructions de la meilleure façon de mettre en cache les téléchargements apt 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 un groupe dans la page de manuel de apt.conf(5), mais je n'ai pas trouvé une option comme "Silent-Fail".

Pour le moment, sudo apt-get updateles commandes associées échouent car aucune connexion n'a pu être établie. Alors, comment puis-je configurer le client pour que le proxy soit ignoré s'il n'est pas disponible?

Lekensteyn
la source
Utilisez-vous la découverte zeroconf ou définissez-vous manuellement le proxy sur chaque client?
Jorge Castro
Je configure manuellement le proxy en raison de pare-feu possibles / diffusion désactivée.
Lekensteyn

Réponses:

20

Il y a un cadre sans papier, Acquire::http::ProxyAutoDetect. Ce paramètre doit contenir le chemin d'accès complet au binaire et ne doit pas avoir d'arguments. La commande doit sortir le proxy à utiliser (exemple:) http://10.0.0.1:8000.

Compte tenu des informations ci-dessus, un script pourrait être créé pour essayer 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 essaie les proxy 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, alors entrez le code suivant /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 éviter qu'un hôte ne soit mandaté.

# 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 affiche si un proxy est utilisé ou non. Pour désactiver cela, modifiez /etc/apt/detect-http-proxyet changez show_proxy_messages=1en show_proxy_messages=0.

Lekensteyn
la source
Lekensteyn, pourrais-je avoir votre permission pour coller cela dans puppet-apt-cacher-ng en option apt-cacher-ng::client?
Garth Kidd
1
Permission accordée, faites ce que vous voulez avec elle :)
Lekensteyn
2
Je suis très heureux d'avoir trouvé cette réponse lorsque j'ai configuré apt-cacher-ng il y a quelque temps. J'ai apt-cacher-ng installé sur l'un de mes ordinateurs personnels (192.168.0.2). Le script était un peu trop pour mon cas, j'ai donc écrit une version simplifiée Detect-http-proxy: if nc -w1 -z 192.168.0.2 3142; then printf http://192.168.0.2:3142; else printf DIRECT; fi. Espérons juste que la fonctionnalité non documentée sera supprimée :)
geirha
2
J'ai largement documenté le script à votre avantage, si vous vous souciez de la taille, vous pouvez le rendre encore plus court avec i=192.168.0.2;nc -zw1 $i 3142&&echo http://$i:3142/||echo DIRECT: p
Lekensteyn
3

Il existe maintenant un moyen officiellement pris en charge pour ce faire - en utilisant l'option - Acquire::http::Proxy-Auto-Detect(voir la apt.confpage de manuel). Le comportement est similaire à l'ancien non documenté Acquire::http::ProxyAutoDetect(notez la présence / l'absence de tirets dans les nouvelles / anciennes options de configuration), il est largement rétrocompatible, 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 cela devienne une version d'apt livrée avec une version de distribution pendant un certain temps, je vais inclure le texte de le patch proposé ici:

Acquire::http::Proxy-Auto-Detectpeut être utilisé pour spécifier une commande externe pour découvrir le proxy http à utiliser. APT peut invoquer la commande plusieurs fois et transmettra un URI à la commande comme premier et seul paramètre. APT s'attend à ce que la commande génère le proxy qui doit être utilisé pour contacter l'URI en question sur sa sortie standard sous la forme d'une seule ligne dans le style http://proxy:port/, ou le mot DIRECTsi aucun proxy ne doit ê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 externe, définissez Debug::Acquire::http=yeset / ou Debug::Acquire::https=yespar exemple en utilisant le -oparamètre de ligne de commande.

Notez que vous utilisez une version préliminaire d'apt, les versions 1.3 ~ exp2 à 1.3, puis il y a un bogue (probablement corrigé par 1.3.1) qui oblige apt à analyser le stderr de la commande externe avec la stdout.

Tim Small
la source
1

/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

Ligne de commande

  • Il doit ncfonctionner ( sudo apt-get install netcat) s'il est manquant.
  • Assurez-vous chmod +x /usr/local/bin/apt-proxy-detect.sh
  • Utilisez le chemin complet lors de la spécification du script.

Comment ça fonctionne

S'il peut se connecter à un proxy, il imprime le proxy qu'APT utilise. Si ce n'est pas le cas, il imprime les chugs DIRECT et APT normalement.

sauce

Luke Mlsna
la source