需要はないが気持ちの良いPingを打ちたい。

# はじめに
本記事の内容としてPingコマンドの表示を少し変えたというものになります。（実用性はないです)
実際の業務等では役立つことはないと思いますのでご注意ください。

## 動機
私は普段の業務でCisco,JuniperといったNW機器を扱うことが多く、その際に実行するPingの表示結果が個人的に好きです。
以上の理由から、shell scriptで似たような表示結果にしてみようと考えました。

## 環境
OS　:debian 10
言語:bash(gnu bash ver 5.0.3)

## 要件
・オプションの対応
-i : interval
-c : count
-w : timeout
-s : size
・とりあえずIPv4のみ対応させてみる。

## コード全体

```bash
#!/bin/bash
# デフォルト値
PacketRev=0
PacketLoss=0
PingCount=100
PingInterval=0.2
PingSize=56
PingTimeOut=1

# 太い文字にするやつ
Bold=$(tput bold )
BoldOff=$(tput sgr0 )


function version {
    # 変更履歴とバージョン
    local LastModfiy="2020-03-25"
    local Version="1.0"
    
    echo  "最終更新履歴： ${LastModfiy}"
    echo  "バージョン　： ${Version}"
}

function usage {
cat << EOF
Usage: rping [ipv4 address]
    
exsample:
    ~$rping 8.8.8.8
    
opsion:
    -c, --count
            引数：数値
            送信するPing packetの数
    -i, --interval
            引数：数値（秒単位)
            Ping Packetを送信する間隔
    -s, --size
            引数：数値(Byte)
            送信するPing Packetのサイズ
    -w, --timeout
            引数：数値（秒単位）
            Pingの応答を待つ時間
EOF
}

for OPT in "$@" #引数をすべてOPTへ順次代入
do
    case $1 in #$OPTで指定するとShiftが効かないので$1を使用
        -h | --help | --usage)
            usage
            exit 1
            ;;
        -v | --version)
            version
            exit 1
            ;;
        -i|--interval)
            PingInterval=$2
            shift 2
            ;;
        -c|--count)
            PingCount=$2
            shift 2
            ;;
        -s|--size)
            PingSize=$2
            shift 2
            ;;
        -w|--timeout)
            PingTimeOut=$2
            shift 2
            ;;
        -*|--*)
            echo [ERROR] ${1} is not options
            usage
            exit 1
            ;;
        *)
            IpCheck=$(echo ${1} | egrep "^(([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$")
            if [ ! "${IpCheck}" ]; then
                echo [ERROR] ${1} is not options
                usage
                exit 1
            else
                PingDest=${1}
            fi
            ;;  
    esac
done

StartTime=$(date '+%Y-%m-%d %T' )
echo "Sending ${PingCount} Packet Size ${PingSize} Ping Packets to ${PingDest}"

cnt=1
while ((cnt <= PingCount))
do
    data=$(ping -w ${PingTimeOut} -c 1 -s ${PingSize} -i ${PingInterval} ${PingDest} | grep "1 packets transmitted") &
    case "$data" in
        *100%*packet*loss*)
            ((PacketLoss+=1))
            echo -n .
            ;;
        *)  
            ((PacketRev+=1))
            echo -n !
            ;;
        esac
        wait
        ((cnt+=1))
done
echo
EndTime=$(date '+%Y-%m-%d %T' )
((success=PacketRev*100 / PingCount ))
((loss=PacketLoss*100 / PingCount ))
echo "$Bold % $success success... % $loss packet loss... $BoldOff"
echo "$StartTime - $EndTime "
```
### 実行結果
```terminal
$./rping -s 1400 -c 10 8.8.8.8
Sending 10 Packet Size 1400 Ping Packets to 8.8.8.8
!!!!!!!!!!
% 100 success... % 0 packet loss... 
2020-03-25 15:02:13 - 2020-03-25 15:02:13 
```

## 課題
・今更だが、-iのオプションが効いていないであろうことに気づく。
・IPv6対応やFQDNでPingを打てるようしなければ。。。
・RTTのmin/avg/maxの部分とかも見せれるようにしたい。
※また暇なときにでもやってみます。

### 参考
今回参考にさせていただいたサイトのリンクを載せさせていただきます。
https://qiita.com/b4b4r07/items/dcd6be0bb9c9185475bb
https://www.unix.com/shell-programming-and-scripting/172519-animation-ping-solaris-like-cisco-ping.html
https://qiita.com/tiida26/items/e842e5034e02ee309873

### まとめ
・一応表示はそれっぽくできた。
・未対応な部分がおおいので対応させていく必要がある。