zshでhook使って特定の環境下でプロキシを設定してくれるシェルスクリプトを作る

# はじめに
ごりごりにシェルスクリプトがかけるわけではありません。おかしなところは指摘していただけると幸いです。

# 作ろうと思った経緯
実は大学生しているんですが、研究室のネットワークにはプロキシが設定されており、git使ったり、apt使ったりなんなりでいちいち設定を切り替えたりするのが非常に面倒でここですべてのやる気がなくなります。zshにhook関数を登録することで、コマンドライン上で何かの処理を行う前に、接続中のSSIDからプロキシ設定の有無を検知してプロキシの設定ファイルの内容の変更処理をかけます。

# 必要なもの
SSIDの検知には`network-manager`を使用します。筆者の環境では標準インストールされていましたが、ない場合は以下を実行してください。
```shell
sudo apt install network-manager
```

# 作成したもの
## ソースコード類
### シェルスクリプト
```changer.sh
#!/bin/zsh

function suggest_gnome() {
    echo -e -n "\e[33m[Warning] If you do not change this setting, you may not be able to use your browser or other services.\e[m\nDo you want to change the manual proxy settings?[Y/n]: "
    for i in `seq 1 5`
    do
        read yn
        if [ $yn = "Y" ] || [ $yn = "y" ]
        then
            gnome-control-center
            break
        elif [ $yn = "N" ] || [ $yn = "n" ]
        then
            echo "To change the setting, go to 'Settings'>'Network'>'Network Proxy'."
            break
        else
            echo -e -n "\e[31m[ERROR]Input [Y/n]: \e[m"
        fi
    done
}

function connect_to_proxy() {
    export ALL_PROXY=http://proxyserver:port
    export http_proxy=http://proxyserver:port
    export https_proxy=https://proxyserver:port
    export HTTP_PROXY=http://proxyserver:port
    export HTTPS_PROXY=https://proxyserver:port
    sudo cp -f $HOME/proxy-change/configure_files/apt.conf.lab /etc/apt/apt.conf
    sudo cp $HOME/proxy-change/configure_files/config.lab ~/.ssh/config
    sudo cp $HOME/proxy-change/configure_files/curlrc.lab ~/.curlrc
    sudo cp -f $HOME/proxy-change/configure_files/wgetrc.lab /etc/wgetrc
    sudo npm -g config set proxy $http_proxy
    sudo npm -g config set https-proxy $https_proxy
    sudo npm -g config set registry "http://registry.npmjs.org/"
}

function disconnect_from_proxy() {
    sudo rm -f /etc/apt/apt.conf
    sudo cp -f $HOME/proxy-change/configure_files/config.others ~/.ssh/config
    sudo rm ~/.curlrc
    sudo cp -f $HOME/proxy-change/configure_files/wgetrc.others /etc/wgetrc
    sudo npm -g config delete proxy
    sudo npm -g config delete https-proxy
    sudo npm -g config delete registry
    unset ALL_PROXY
    unset HTTP_PROXY
    unset HTTPS_PROXY
    unset http_proxy
    unset https_proxy
}

function network_hook() {
    SSID= "{WiFiのSSIDを入力}"
    FLAGRC_LINE_NUM=`sed -n '/IS_PROXY/=' $HOME/proxy-change/.flagrc`
    FLAGRC_LINE=`cat $HOME/proxy-change/.flagrc | grep "IS_PROXY"`
    IS_SSID_IN=`timeout 10 nmcli dev wifi | grep $SSID | grep "*"`
    CMD_STATE=`echo $?`
    if [ $CMD_STATE = "0" ]
    then
        LINE_STATE=`echo $FLAGRC_LINE | grep true`
        if [ -z "$LINE_STATE" ]
        then
            suggest_gnome
            connect_to_proxy
            sed -i ${FLAGRC_LINE_NUM}d $HOME/proxy-change/.flagrc && echo "IS_PROXY=true" >> $HOME/proxy-change/.flagrc
            echo -e "\e[32m[PROXY WAS CHANGED]\e[m"
        fi
    else
        LINE_STATE=`echo $FLAGRC_LINE | grep false`
        if [ -z "$LINE_STATE" ]
        then
            suggest_gnome
            disconnect_from_proxy
            sed -i ${FLAGRC_LINE_NUM}d $HOME/proxy-change/.flagrc && echo "IS_PROXY=false" >> $HOME/proxy-change/.flagrc
            echo -e "\e[32m[PROXY WAS CHANGED]\e[m"
        fi
    fi
}

autoload -Uz add-zsh-hook
add-zsh-hook preexec network_hook
```
### プロキシの更新状態を保持するための`.flagrc`ファイル
```.flagrc
IS_PROXY=false
```

# 解説
## ざっくりとした処理の説明
1. `add-zsh-hook preexec network_hook`で**network_hook関数**をエンターを押す直前に実行します。
1. .flagrcのプロキシ設定が適用されているかどうか記載されている行番号とその内容を変数に格納します。
1. `nmcli`コマンドで目的のSSID内にいるかどうかを判定します。
1. `.flagrc`の内容次第でプロキシ設定の処理を行います。主にファイル置換と環境変数の設定を行っています。
1. 環境変数でプロキシを設定するだけでは**chrome**や**Slack**が使用できなかったため、`gnome-control-center`でUbuntuの設定アプリケーションを開くようにしています。

***※各種設定ファイルの記述方法内容は各自でお調べください。***

# 最後に
わりと作り込みが甘かったので気が向いたらもう少しマシな処理を組みます。