Linux/WSL/Macでproxy環境と非proxy環境のネットワーク設定をよりスマートに切り替える

1年前に書いた[記事](https://qiita.com/kurokoji/items/72311ab2a82830727d56)がわりと見られているようですが，もっとスマートな方法があったので書いておきます．

ちなみに筆者は`fish`ユーザですが，本記事では`bash`, `zsh`ユーザ向けにもスクリプト置いておきます．


## どうやるの?

proxy環境下のDNSサーバアドレスが`/etc/resolv.conf` に書かれているかどうかで判断します．前記事ではSSIDを元に判断していたため，有線で繋いだ場合に対応していませんでしたが，この方法なら大丈夫です．

ちなみに，必ずしもDNSサーバアドレスである必要はなくて，proxy環境下において `/etc/resolv.conf` に必ず書かれているものを指定しても当然構いません．

## スクリプト

### `bash`, `zsh`

``` shell:~/.switch_proxy
#!/bin/sh

proxy=hogehoge.com:XXX # プロキシアドレス
_dns="XXX.XXX.XXX.XXX" # プロキシ環境下でのDNSサーバアドレス(cat /etc/resolv.conf で確認してください)

function set_proxy() {
  export http_proxy="http://$proxy"
  export https_proxy="http://$proxy"
  export ftp_proxy="http://$proxy"
  export all_proxy="http://$proxy"
  export no_proxy="127.0.0.1,localhost"

  export HTTP_PROXY="http://$proxy"
  export HTTPS_PROXY="http://$proxy"
  export FTP_PROXY="http://$proxy"
  export ALL_PROXY="http://$proxy"
  export NO_PROXY="127.0.0.1,localhost"

  git config --global http.proxy "http://$proxy"
  git config --global https.proxy "https://$proxy"
  git config --global url."https://".insteadOf git://
}

function unset_proxy() {
  unset http_proxy
  unset https_proxy
  unset ftp_proxy
  unset all_proxy
  unset no_proxy
  unset HTTP_PROXY
  unset HTTPS_PROXY
  unset FTP_PROXY
  unset ALL_PROXY
  unset NO_PROXY

  git config --global --unset http.proxy
  git config --global --unset https.proxy
  git config --global --unset url."https://".insteadOf
}

_dns_state=""

if test -e /etc/resolv.conf; then
  _dns_state=$(grep $_dns /etc/resolv.conf)
fi

if test -n "$_dns_state"; then
  echo -e '\e[31mSet proxy settings\e[m' 1>&2
  set_proxy
else
  echo -e '\e[36mUnset proxy settings\e[m' 1>&2
  unset_proxy
fi
```


``` shell:~/.bashrc(.zshrc)
source ~/.switch_proxy
```

### `fish`
``` fish:~/.config/fish/switch_proxy.fish
set proxy 'hogehoge.com:XXXX' # プロキシアドレス
set _dns 'XXX.XXX.XXX.XXX' # プロキシ環境下でのDNSサーバアドレス(cat /etc/resolv.conf で確認してください)

set -x http_proxy ''
set -x https_proxy ''
set -x ftp_proxy ''
set -x all_proxy ''
set -x no_proxy ''

function set_proxy
  set -x http_proxy "http://$proxy"
  set -x https_proxy "http://$proxy"
  set -x ftp_proxy "http://$proxy"
  set -x all_proxy "http://$proxy"
  set -x no_proxy '127.0.0.1,localhost'

  set -x HTTP_PROXY "http://$proxy"
  set -x HTTPS_PROXY "http://$proxy"
  set -x FTP_PROXY "http://$proxy"
  set -x ALL_PROXY "http://$proxy"
  set -x NO_PROXY '127.0.0.1,localhost'

  git config --global http.proxy "http://$proxy"
  git config --global https.proxy "https://$proxy"
  git config --global url."https://".insteadOf git://
end

function unset_proxy
  set -e http_proxy
  set -e https_proxy
  set -e ftp_proxy
  set -e all_proxy
  set -e no_proxy
  set -e HTTP_PROXY
  set -e HTTPS_PROXY
  set -e FTP_PROXY
  set -e ALL_PROXY
  set -e NO_PROXY

  git config --global --unset http.proxy
  git config --global --unset https.proxy
  git config --global --unset url."https://".insteadOf
end

if test -e /etc/resolv.conf
  grep $_dns /etc/resolv.conf | read _dns_state
end

if test -n "$_dns_state"
  echo -e '\e[31mSet proxy settings\e[m' 1>&2
  set_proxy
else
  echo -e '\e[36mUnset proxy settings\e[m' 1>&2
  unset_proxy
end
```

``` fish:~/.config/fish/config.fish
source ~/.config/fish/switch_proxy.fish
```