• # Mon bidouillage perso

    Posté par . En réponse au message Choix du proxy fonction du reseau.. Évalué à 7.

    Alors, ça ne me concerne (pour l’instant) plus car aucun des réseaux auxquels je connecte mon PC n’a de proxy, mais j’ai été dans cette situation il y a quelques années, et je procédais ainsi.

    D’abord, un script lancé par NetworkManager se charge d’identifier le réseau auquel je viens de me connecter. Il utilise pour ça toute information disponible dans la réponse DHCP du réseau permettant d’identifier de manière unique un réseau donné (l’idéal est la variable DHCP4_DOMAIN_NAME, mais tous les serveurs DHCP ne fournissent pas cette information). Une fois le réseau identifié, il écrit un nom arbitraire pour ce réseau dans le fichier /var/state/network.

    #!/bin/sh
    interface=1ドル
    status=2ドル
    case "$status" in
    up)
     if [ "x$DHCP4_DOMAIN_NAME" = 'xschool.example' ]; then
     echo school > /var/state/network
     elif [ "x$DHCP4_DOMAIN_NAME" = 'xcompany.example' ]; then
     echo company > /var/state/network
     elif [ "x$IP4_NAMESERVERS" = 'x203.0.113.65' ]; then
     # Cas d'un réseau qui ne fournit que très peu d'infos,
     # on se base sur l'adresse du serveur DNS indiqué dans
     # la réponse DHCP -- en espérant qu'elle ne change pas
     # au cours du temps...
     echo discret > /var/state/network
     else
     echo unknown > /var/state/network
     # On dumpe toutes les variables dans un fichier,
     # dans l'espoir d'y trouver des infos qui permettront
     # de mieux caractériser ce réseau inconnu
     env > /var/state/network.infos
     fi
     ;;
    esac

    Le contenu du fichier /var/state/network peut ensuite être utilisé par d’autres scripts pour toutes les actions qui doivent varier en fonction du réseau. En particulier, un script se charge d’écrire les informations relatives aux proxys dans un fichier /etc/proxy.conf :

    #!/bin/sh
    [ "x2ドル" = xup ] || exit 0
    case "$(< /var/state/network)" in
    school)
     echo PROXY_ON=1 > /etc/proxy.conf
     echo PROXY_HOST=www-cache.school.example >> /etc/proxy.conf
     echo PROXY_PORT=3128 >> /etc/proxy.conf
     echo EXCEPTIONS=.school.example >> /etc/proxy.conf
     ;;
    company)
     echo PROXY_ON=1 > /etc/proxy.conf
     echo PROXY_HOST=cache.company.example >> /etc/proxy.conf
     echo PROXY_PORT=3128 >> /etc/proxy.conf
     echo EXCEPTIONS= >> /etc/proxy.conf
     ;;
    *)
     # No proxy on the other networks
     cat /dev/null > /etc/proxy.conf
     ;;
    esac

    À ce stade, on se retrouve avec un fichier /etc/proxy.conf qui contient les informations sur le proxy à utiliser. Le reste est l’affaire d’un script exécuté au démarrage d’une session (par exemple dans ~/.xprofile), qui doit lire ce fichier et s’assurer que tous les programmes tiennent compte du proxy. C’était la partie la plus délicate car tous les programmes n’ont pas le bon goût de respecter la variable d’environnement http_proxy ... Je n’ai plus ce script sous la main, mais de mémoire il faisait à peu près ça :

    • définir http_proxy et no_proxy pour les programmes bien élevés ;
    • éditer le fichier de configuration KDE définissant le proxy pour toutes les applications KDE (je ne sais plus quel était ce fichier, mais de toute façon depuis le temps ça a peut-être changé) ;
    • éditer le fichier .mozilla/firefox/{profile}/prefs.js pour Firefox (qui à une époque n’était pas un programme bien élevé) ;
    • définir un alias java=java -Dhttp.proxyHost=proxy_host -Dhttp.proxyPort=proxy_port pour les programmes Java ;
    • et peut-être encore deux ou trois autres cas particuliers.

    Globalement, ce n’était sûrement pas une solution parfaite, mais ça marchait quand même à peu près bien (mis à part le fait que le passage d’un réseau à un autre n’était pas pris en compte immédiatement, il fallait redémarrer la session graphique pour que le script .xprofile relise /etc/proxy.conf et que l’environnement soit mis à jour — mais comme il ne m’arrivait que rarement de changer de réseau pendant une session, ce n’était pas très gênant).