Como ignoro um proxy, se não estiver disponível?

15

Seguindo as instruções da melhor maneira de armazenar em cache os downloads apt em uma LAN? , Configurei um proxy de cache na minha rede local. Como essa máquina nem sempre está funcionando, eu gostaria de poder atualizar a lista de fontes e instalar pacotes sem usar esse proxy, se não estiver disponível.

Eu já li a seção Adquirir grupo na página de manual apt.conf(5), mas não consegui encontrar uma opção como "Silent-Fail".

No momento, sudo apt-get updateos comandos relacionados falham porque nenhuma conexão pôde ser estabelecida. Então, como configuro o cliente para que o proxy seja ignorado se não estiver disponível?

Lekensteyn
fonte
Você está usando o zeroconf discovery ou define manualmente o proxy em cada cliente?
Jorge Castro
Estou configurando manualmente o proxy por causa de possíveis firewalls / transmissão desativada.
Lekensteyn

Respostas:

20

Há uma configuração não documentada Acquire::http::ProxyAutoDetect,. Essa configuração deve conter o caminho completo para o binário e não pode ter argumentos. O comando deve gerar o proxy a ser usado (exemplo http://10.0.0.1:8000:).

Dadas as informações acima, pode ser criado um script que tente um proxy antes de defini-lo. Se nenhum proxy estiver disponível, uma conexão direta deve ser usada.

Abaixo é tal script de detecção de proxy de um que tenta o http://10.0.0.1:8000/e http://10.0.0.2:8000proxies.

Coloque o código em /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

Agora, o APT deve ser configurado para usar o script de detecção de proxy acima, portanto, coloque o seguinte código em /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";

Também coloquei o próximo código no arquivo para impedir que algum host seja proxy.

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

Por padrão, o script gera se um proxy é usado ou não. Para desativar isso, edite /etc/apt/detect-http-proxye mude show_proxy_messages=1para show_proxy_messages=0.

Lekensteyn
fonte
Lekensteyn, eu poderia ter sua permissão para colar isso em puppet-apt-cacher-ng como uma opção apt-cacher-ng::client?
Garth Kidd
1
Permissão concedida, fazer o que quiser com ele :)
Lekensteyn
2
Estou muito feliz por ter encontrado essa resposta quando instalei o apt-cacher-ng um tempo atrás. Eu tenho o apt-cacher-ng instalado em um dos meus computadores domésticos (192.168.0.2). O script senti um pouco exagerado para o meu caso, então eu escrevi um simplificado detectar-http-proxy: if nc -w1 -z 192.168.0.2 3142; then printf http://192.168.0.2:3142; else printf DIRECT; fi. Vamos apenas esperar que o recurso não documentado é removido :)
geirha
2
Eu documentei o script extensivamente para o seu benefício, se você se preocupa com o tamanho que você pode torná-lo ainda mais curto com i=192.168.0.2;nc -zw1 $i 3142&&echo http://$i:3142/||echo DIRECT: p
Lekensteyn
3

Agora existe uma maneira oficialmente suportada de fazer isso - usando a opção - Acquire::http::Proxy-Auto-Detect(consulte a apt.confpágina de manual). O comportamento é semelhante ao antigo não documentado Acquire::http::ProxyAutoDetect(observe a presença / ausência de hífens nas novas / antigas opções de configuração), é amplamente compatível com versões anteriores, mas foi estendido ...

Estou no processo de enviar um patch aos mantenedores do apt para melhorar a documentação, mas como é improvável que isso se transforme em uma versão do apt que é fornecida com uma distribuição por um bom tempo, incluirei o texto de o patch proposto aqui:

Acquire::http::Proxy-Auto-Detectpode ser usado para especificar um comando externo para descobrir o proxy http a ser usado. O APT pode chamar o comando várias vezes e passará um URI para o comando como seu primeiro e único parâmetro. O APT espera que o comando produza o proxy que deve ser usado para contatar o URI em questão em seu stdout como uma única linha no estilo http://proxy:port/, ou a palavra DIRECTse nenhum proxy deve ser usado. Nenhuma saída indica que as configurações genéricas de proxy devem ser usadas.

Observe que a detecção automática não será usada para um host se uma configuração de proxy específica do host já estiver definida via Acquire::http::Proxy::HOST.

Para diagnosticar interações com o comando externo, defina Debug::Acquire::http=yese / ou, Debug::Acquire::https=yespor exemplo, usando o -oparâmetro da linha de comandos.

Note que se está usando uma versão de pré-lançamento do apt, versões 1.3 ~ exp2 a 1.3, existe um erro (provavelmente corrigido pelo 1.3.1) que faz com que o apt analise o stderr do comando externo junto com o stdout.

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

Linha de comando

  • Ele precisa ncfuncionar ( sudo apt-get install netcat) se estiver ausente.
  • Assegure-se de que você chmod +x /usr/local/bin/apt-proxy-detect.sh
  • Use o caminho completo ao especificar o script.

Como funciona

Se ele pode se conectar a um proxy, ele imprime o proxy que o APT usa. Se não puder, imprime os checagens DIRECT e APT normalmente.

molho

Luke Mlsna
fonte