#!/bin/bash
#### ping a server and traceroute for Zabbix ####

cd $(dirname $0)

# define variables #
function=$1
#目标IP或域名（尽量使用IP，免去DNS解析时间）
target_ip=$2
#功能，可选参数有ping、avg、max、min。ping将进行ping测量，avg、max、min将取得上次ping的结果
ping_result_file=/var/www/traceroute/ping.$target_ip.txt

# net ping #
function net_ping {
        # define variables #
        time=$(date +"%Y-%m-%d %H:%M:%S")
        date=$(date +"%Y%m%d")
        traceroute_result_file=/var/www/traceroute/$target_ip/traceroute.$date.txt
        mkdir -p /var/www/traceroute/$target_ip/ && chown -R zabbix.zabbix /var/www/traceroute/
        split="\n-------------------\n"

        ping_interval=${3-1}
        #发包间隔，默认1秒，可设置小数
        ping_timeout=${4-1}
        #指定ping的超时时间，单位秒，必须为整数，最小1秒，超过该时间返回的包也视作丢包；如果不加这个参数，Linux默认为10秒
        #切忌设置小数，否则会一直等待下去
        ping_packet_count=${5-10}
        #发包数量，默认10个包
        ping_packet_size=${6-64}
        #发包大小，默认64字节
        ping_lost_alarm=${7-10}
        #丢包率告警线，大于等于该数值时触发路由跟踪，设置为0将会每次ping均会做路由跟踪

###        interface=$8
###        dx=eth0
###        lt=eth0:1
###        yd=eth0:2
###        case "$8" in
###                dx) interface=$dx ;;
###                lt) interface=$lt ;;
###                yd) interface=$yd ;;
###                *) interface=$8 ;;
###        esac
        #指定出去的IP或者网卡接口，可使用接口名称或者IP
        #请填写Zabbix Agent所在机器的IP

        ping_result_org=$(ping -q -n -i $ping_interval -W $ping_timeout -c $ping_packet_count -s $ping_packet_size $target_ip)
        ping_result_a=$(echo -e "$ping_result_org" | grep "packets transmitted" | grep -o -P "(\d+%|\d+ms|\d+)" | sed ':a;N;$!ba;s/\n/,/g')
        ping_result_b=$(echo -e "$ping_result_org" | grep -o -P 'min.+\d+')
        if [[ -z "$ping_result_b" ]] ; then
                ping_result=$(echo -e "$ping_result_a")
        else
                ping_result=$(echo -e "$ping_result_a""\n""$ping_result_b")
        fi

        LOSS=$(echo "$ping_result_a" | grep -o -P "\d+%" | cut -f 1 -d "%")
        if [[ $LOSS -ge $ping_lost_alarm ]]; then
                traceroute_result=$(traceroute -n -w 2 -m 20 $target_ip 2>/dev/null)
                mtr_result=$(mtr -n -r -i 0.5 $target_ip 2>/dev/null)
                #$mkdir -p /var/www/traceroute/$target_ip/
                echo -e "$ping_result""$split""$traceroute_result""$split""$mtr_result""$split""$time" > $ping_result_file
                #echo -e "$ping_result""$split""$traceroute_result""$split""$mtr_result""$split""$time"
                #mail_to_admin
        else
                echo -e "$ping_result""\n""$time" > $ping_result_file
        fi
        exit 0
}

# mail to admin #
function mail_to_admin {
#        source mail_list.sh #load the mail list address
#        for mail_address in ${mail_list[@]}
#        do
#                {
#                echo -e "$ping_result""$split""$time""$split""$traceroute_result""$split""$mtr_result" | mutt "$mail_address" -s "Warning! $1 在 $time 出现丢包"
#                }
#        done
        exit 0
}

net_ping $@
