¿Cómo ignoro un proxy si no está disponible?

15

Siguiendo las instrucciones de la mejor manera de almacenar en caché las descargas de apt en una LAN , Configuré un proxy de almacenamiento en caché en mi red local. Dado que esa máquina no siempre está activa, me gustaría poder actualizar la lista de fuentes e instalar paquetes sin usar ese proxy si no está disponible.

Ya leí la sección Adquirir grupo en la página del manual de apt.conf(5), pero no pude encontrar una opción como "Silent-Fail".

Por el momento, sudo apt-get updatey los comandos relacionados fallan porque no se pudo establecer una conexión. Entonces, ¿cómo configuro el cliente para que se ignore el proxy si no está disponible?

Lekensteyn
fuente
¿Está utilizando el descubrimiento zeroconf o configura manualmente el proxy en cada cliente?
Jorge Castro
Estoy configurando manualmente el proxy debido a posibles firewalls / transmisión deshabilitada.
Lekensteyn

Respuestas:

20

Hay una configuración no documentada, Acquire::http::ProxyAutoDetect . Esta configuración debe contener la ruta completa al binario y no puede tener argumentos. El comando debe generar el proxy que se utilizará (ejemplo:) http://10.0.0.1:8000.

Dada la información anterior, se podría crear un script que pruebe un proxy antes de configurarlo. Si no hay un proxy disponible, se debe usar una conexión directa.

A continuación se muestra un script de detección de proxy que prueba el http://10.0.0.1:8000/yhttp://10.0.0.2:8000 proxys .

Pon el código en /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

Ahora, APT debe estar configurado para usar el script de detección de proxy anterior, por lo tanto, ingrese el siguiente código /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";

También puse el siguiente código en el archivo para evitar que algún host sea proxificado.

# Override the default proxy, DIRECT causes a direct connection to be used
Acquire::http::Proxy {
    deb.opera.com DIRECT;
    dl.google.com DIRECT;
};

Por defecto, el script muestra si se usa un proxy o no. Para deshabilitar eso, edite /etc/apt/detect-http-proxyy cambie show_proxy_messages=1a show_proxy_messages=0.

Lekensteyn
fuente
Lekensteyn, ¿podría tener su permiso para pegar eso en puppet-apt-cacher-ng como una opción apt-cacher-ng::client?
Garth Kidd
1
Permiso otorgado, haz lo que quieras con él :)
Lekensteyn
2
Estoy muy feliz de haber encontrado esta respuesta cuando configuré apt-cacher-ng hace un tiempo. Tengo apt-cacher-ng instalado en una de las computadoras de mi hogar (192.168.0.2). El guión se sintió un poco excesivo para mi caso, así que escribí un simplificado detectan-http-proxy: if nc -w1 -z 192.168.0.2 3142; then printf http://192.168.0.2:3142; else printf DIRECT; fi. Esperemos que la característica indocumentada se elimine :)
geirha
2
Documenté el script ampliamente para su beneficio, si le importa el tamaño, puede hacerlo aún más corto con i=192.168.0.2;nc -zw1 $i 3142&&echo http://$i:3142/||echo DIRECT: p
Lekensteyn
3

Ahora hay una forma oficial de hacer esto, usando la opción Acquire::http::Proxy-Auto-Detect(vea la apt.confpágina de manual). El comportamiento es similar al antiguo indocumentadoAcquire::http::ProxyAutoDetect (nota presencia / ausencia de guiones en las opciones de configuración nuevas / antiguas), es en gran medida compatible con versiones anteriores, pero se ha extendido ...

Estoy en el proceso de enviar un parche a los mantenedores de apt para mejorar la documentación, pero dado que es poco probable que sea una versión de apt que se envíe con un lanzamiento de distribución durante bastante tiempo, incluiré el texto de El parche propuesto aquí:

Acquire::http::Proxy-Auto-Detectse puede usar para especificar un comando externo para descubrir el proxy http que se usará. APT puede invocar el comando varias veces y pasará un URI al comando como su primer y único parámetro. APT espera que el comando muestre el proxy que se usará para contactar al URI en cuestión en su stdout como una sola línea en el estilo http://proxy:port/, o la palabra DIRECTsi no se debe usar un proxy. Ningún resultado indica que se debe usar la configuración genérica del proxy.

Tenga en cuenta que la detección automática no se utilizará para un host si ya se ha configurado una configuración de proxy específica del host a través de Acquire::http::Proxy::HOST.

Para diagnosticar interacciones con el comando externo, configure Debug::Acquire::http=yesy / o, Debug::Acquire::https=yespor ejemplo, utilice el -oparámetro de línea de comando.

Tenga en cuenta que está utilizando una versión preliminar de apt, versiones 1.3 ~ exp2 a 1.3, luego hay un error (probablemente corregido por 1.3.1) que hace que apt analice el stderr del comando externo junto con el stdout.

Tim Small
fuente
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

Línea de comando

  • Tiene ncque funcionar ( sudo apt-get install netcat) si falta.
  • Asegúrese chmod +x /usr/local/bin/apt-proxy-detect.sh
  • Utilice la ruta completa al especificar el script.

Cómo funciona

Si puede conectarse a un proxy, imprime el proxy que APT usa. Si no puede, imprime CHUG DIRECTOS y APT normalmente.

salsa

Luke Mlsna
fuente