From c57dfad3b2585e0bc49e53fc24491776149e6283 Mon Sep 17 00:00:00 2001 From: Taketo Takashima Date: Mon, 16 Oct 2017 11:14:47 +0900 Subject: [PATCH] Init commit --- .gitignore | 3 + linux/README.txt | 10 + linux/sendlog.sh | 54 + linux/sindan.conf | 42 + linux/sindan.sh | 1434 +++++++++++++++++ macos/keep_sendlog.sh | 7 + macos/keep_sindan.sh | 7 + macos/sendlog.sh | 54 + macos/sindan.conf | 44 + macos/sindan.sh | 1261 +++++++++++++++ ...ndan_datalink_channel1441240445.38089.json | Bin 0 -> 568 bytes ...sindan_datalink_ifmtu1441240445.02764.json | Bin 0 -> 476 bytes ...dan_datalink_ifstatus1441240445.02364.json | Bin 0 -> 484 bytes ...indan_datalink_iftype1441240445.02563.json | Bin 0 -> 484 bytes .../sindan_datalink_noise1441240445.2558.json | Bin 0 -> 484 bytes .../sindan_datalink_rate1441240445.2588.json | Bin 0 -> 482 bytes .../sindan_datalink_rssi1441240445.2528.json | Bin 0 -> 564 bytes .../sindan_datalink_ssid1441240445.12871.json | Bin 0 -> 494 bytes ...globalnet_v4alive_srv1441240466.19364.json | Bin 0 -> 520 bytes ...globalnet_v4alive_srv1441240469.45795.json | Bin 0 -> 534 bytes ...globalnet_v6alive_srv1441240469.48597.json | Bin 0 -> 532 bytes ...globalnet_v6alive_srv1441240469.50599.json | Bin 0 -> 528 bytes ...dan_interface_netmask1441240447.18416.json | Bin 0 -> 512 bytes ...ndan_interface_v4addr1441240447.17816.json | Bin 0 -> 512 bytes ...an_interface_v4ifconf1441240447.17516.json | Bin 0 -> 496 bytes ...terface_v4nameservers1441240448.06479.json | Bin 0 -> 682 bytes ...n_interface_v4routers1441240447.19117.json | Bin 0 -> 514 bytes ...an_interface_v6lladdr1441240448.27694.json | Bin 0 -> 544 bytes ...n_interface_v6routers1441240448.28294.json | Bin 0 -> 494 bytes ...alnet_v4alive_namesrv1441240460.95793.json | Bin 0 -> 586 bytes ...calnet_v4alive_router1441240453.61672.json | Bin 0 -> 534 bytes windows/sendlog.ps1 | 42 + windows/sindan.conf | 33 + windows/sindan.ps1 | 480 ++++++ 34 files changed, 3471 insertions(+) create mode 100644 .gitignore create mode 100644 linux/README.txt create mode 100755 linux/sendlog.sh create mode 100644 linux/sindan.conf create mode 100755 linux/sindan.sh create mode 100644 macos/keep_sendlog.sh create mode 100644 macos/keep_sindan.sh create mode 100755 macos/sendlog.sh create mode 100644 macos/sindan.conf create mode 100755 macos/sindan.sh create mode 100644 windows/log/sindan_datalink_channel1441240445.38089.json create mode 100644 windows/log/sindan_datalink_ifmtu1441240445.02764.json create mode 100644 windows/log/sindan_datalink_ifstatus1441240445.02364.json create mode 100644 windows/log/sindan_datalink_iftype1441240445.02563.json create mode 100644 windows/log/sindan_datalink_noise1441240445.2558.json create mode 100644 windows/log/sindan_datalink_rate1441240445.2588.json create mode 100644 windows/log/sindan_datalink_rssi1441240445.2528.json create mode 100644 windows/log/sindan_datalink_ssid1441240445.12871.json create mode 100644 windows/log/sindan_globalnet_v4alive_srv1441240466.19364.json create mode 100644 windows/log/sindan_globalnet_v4alive_srv1441240469.45795.json create mode 100644 windows/log/sindan_globalnet_v6alive_srv1441240469.48597.json create mode 100644 windows/log/sindan_globalnet_v6alive_srv1441240469.50599.json create mode 100644 windows/log/sindan_interface_netmask1441240447.18416.json create mode 100644 windows/log/sindan_interface_v4addr1441240447.17816.json create mode 100644 windows/log/sindan_interface_v4ifconf1441240447.17516.json create mode 100644 windows/log/sindan_interface_v4nameservers1441240448.06479.json create mode 100644 windows/log/sindan_interface_v4routers1441240447.19117.json create mode 100644 windows/log/sindan_interface_v6lladdr1441240448.27694.json create mode 100644 windows/log/sindan_interface_v6routers1441240448.28294.json create mode 100644 windows/log/sindan_localnet_v4alive_namesrv1441240460.95793.json create mode 100644 windows/log/sindan_localnet_v4alive_router1441240453.61672.json create mode 100644 windows/sendlog.ps1 create mode 100644 windows/sindan.conf create mode 100644 windows/sindan.ps1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6fd41c0 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +.DS_Store +*~ +*.swp diff --git a/linux/README.txt b/linux/README.txt new file mode 100644 index 0000000..dca2671 --- /dev/null +++ b/linux/README.txt @@ -0,0 +1,10 @@ +# necessary packages + uuid-runtime (for uuidgen) + wireless-tools (for iwgetid, iwconfig) + ndisc6 (for rdisc6) + dnsutils (for dig) + curl (for curl) + +# crontab +*/5 * * * * root cd && ./sindan.sh 1>/dev/null 2>/dev/null +*/1 * * * * root cd && ./sendlog.sh 1>/dev/null 2>/dev/null diff --git a/linux/sendlog.sh b/linux/sendlog.sh new file mode 100755 index 0000000..b12e91b --- /dev/null +++ b/linux/sendlog.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# sendlog.sh +# version 0.9 + +# read configurationfile +. ./sindan.conf + +# Check LOCKFILE_SENDLOG parameter +if [ "X${LOCKFILE_SENDLOG}" = "X" ]; then + echo "ERROR: LOCKFILE_SENDLOG is null at configration file." 1>&2 + return 1 +fi +trap 'rm -f ${LOCKFILE_SENDLOG}; exit 0' INT + +if [ ! -e ${LOCKFILE_SENDLOG} ]; then + echo $$ >"${LOCKFILE_SENDLOG}" +else + pid=`cat "${LOCKFILE_SENDLOG}"` + kill -0 "${pid}" > /dev/null 2>&1 + if [ $? = 0 ]; then + exit 0 + else + echo $$ >"${LOCKFILE_SENDLOG}" + echo "Warning: previous check appears to have not finished correctly" + fi +fi + +# +# main +# + +# upload campaign log +for file in `find log/ -name "campaign_*.json"`; do +# echo " send campaign log to ${URL_CAMPAIGN}" + status=`curl --max-time 5 -s -w %{http_code} -F json=@${file} ${URL_CAMPAIGN}` + if [ "${status}" = "200" ]; then + rm -f ${file} + fi +done + +# upload sindan log +for file in `find log/ -name "sindan_*.json"`; do +# echo " send sindan log to ${URL_SINDAN}" + status=`curl --max-time 15 -s -w %{http_code} -F json=@${file} ${URL_SINDAN}` +# echo " status:${status}" + if [ "${status}" = "200" ]; then + rm -f ${file} + fi +done + +# remove lock file +rm -f ${LOCKFILE_SENDLOG} + +exit 0 diff --git a/linux/sindan.conf b/linux/sindan.conf new file mode 100644 index 0000000..7778e9e --- /dev/null +++ b/linux/sindan.conf @@ -0,0 +1,42 @@ +# SINDAN Configuration file +# version 0.4 + +# lock file +readonly LOCKFILE=/tmp/sindan.isrunning +readonly LOCKFILE_SENDLOG=/tmp/sendlog.isrunning + +# result parameters +readonly FAIL=0 +readonly SUCCESS=1 +readonly INFO=10 + +# reconnect flag (yes or no) +readonly RECONNECT=no + +# verbose flag (yes or no) +readonly VERBOSE=yes + +# target interface +readonly IFTYPE=Wi-Fi +readonly DEVNAME=ra0 + +# set ssid +readonly SSID=wide2015-nohb +readonly SSID_KEY=matsushiro2015 + +# target servers +readonly PING_SRVS="8.8.8.8,203.178.139.60" +readonly PING6_SRVS="2001:4860:4860::8888,2001:200:0:180c::6" + +# servers for name resolution +readonly FQDNS="dual.imc.kanazawa-u.ac.jp,v4only.imc.kanazawa-u.ac.jp,v6only.imc.kanazawa-u.ac.jp" +readonly GPDNS4="8.8.8.8" +readonly GPDNS6="2001:4860:4860::8888" + +# servers for web comminication +readonly V4WEB_SRVS="www.wide.ad.jp,www.yahoo.co.jp" +readonly V6WEB_SRVS="www.wide.ad.jp,www.google.co.jp" + +# upload urls +readonly URL_CAMPAIGN="http://fluentd.c.u-tokyo.ac.jp:8888/sindan.log_campaign" +readonly URL_SINDAN="http://fluentd.c.u-tokyo.ac.jp:8888/sindan.log" diff --git a/linux/sindan.sh b/linux/sindan.sh new file mode 100755 index 0000000..30b96f2 --- /dev/null +++ b/linux/sindan.sh @@ -0,0 +1,1434 @@ +#!/bin/bash +# sindan.sh +# version 1.3 + +# read configurationfile +. ./sindan.conf + +# +# functions +# + +## for initial +# +cleate_uuid() { + uuidgen +} + +# +write_json_campaign() { +# if [ $# -lt 4 ]; then +# echo "ERROR: write_json_campaign ." 1>&2 +# return 1 +# fi + local json="{ \"log_campaign_uuid\" : \"$1\", + \"mac_addr\" : \"$2\", + \"os\" : \"$3\", + \"ssid\" : \"$4\", + \"occurred_at\" : \"`date -u '+%Y-%m-%d %T'`\" }" + echo ${json} > log/campaign_`date -u '+%s'`.json +} + +# +write_json() { + if [ $# -lt 5 ]; then + echo "$1, $2, $3, $4, #5" + echo "ERROR: write_json . ($3)" 1>&2 + return 1 + fi + local json="{ \"layer\" : \"$1\", + \"log_group\" : \"$2\", + \"log_type\" : \"$3\", + \"log_campaign_uuid\" : \"${uuid}\", + \"result\" : \"$4\", + \"detail\" : \"$5\", + \"occurred_at\" : \"`date -u '+%Y-%m-%d %T'`\" }" + echo ${json} > log/sindan_$1_$3_`date -u '+%s'`.json +} + +## for datalink layer +# +get_devicename() { + echo ${DEVNAME} +} + +# +do_ifdown() { + if [ $# -lt 1 ]; then + echo "ERROR: do_ifdown ." 1>&2 + return 1 + fi + ifdown $1 + rm /var/lib/dhcp/dhclient.$1.leases +} + +# +do_ifup() { + if [ $# -lt 1 ]; then + echo "ERROR: do_ifup ." 1>&2 + return 1 + fi + ifup $1 +} + +# +get_os() { + if type lsb_release > /dev/null 2>&1; then + lsb_release -ds + else + grep PRETTY_NAME /etc/*-release | awk -F\" '{print $2}' + fi +} + +# +get_ifstatus() { + if [ $# -lt 1 ]; then + echo "ERROR: get_ifstatus ." 1>&2 + return 1 + fi +# local status=`ip link show $1 | grep state | awk '{print $9}'` + local status=`cat /sys/class/net/$1/operstate` + if [ "${status}" = "up" ]; then + echo ${status}; return 0 + else + echo ${status}; return 1 + fi +} + +# +get_ifmtu() { + if [ $# -lt 1 ]; then + echo "ERROR: get_ifmtu ." 1>&2 + return 1 + fi +# ip link show $1 | grep mtu | awk '{print $5}' + cat /sys/class/net/$1/mtu +} + +# +get_macaddr() { + if [ $# -lt 1 ]; then + echo "ERROR: get_macaddr ." 1>&2 + return 1 + fi + cat /sys/class/net/$1/address +} + +# +get_mediatype() { + if [ $# -lt 1 ]; then + echo "ERROR: get_mediatype ." 1>&2 + return 1 + fi + local speed=`cat /sys/class/net/$1/speed` + local duplex=`cat /sys/class/net/$1/duplex` + echo ${speed} ${duplex} +} + +# +get_wifi_ssid() { + if [ $# -lt 1 ]; then + echo "ERROR: get_wifi_ssid ." 1>&2 + return 1 + fi +# wpa_cli -i $1 status | grep [^b]ssid | awk -F: '{print $2} + iwgetid $1 --raw +} + +# +get_wifi_bssid() { + if [ $# -lt 1 ]; then + echo "ERROR: get_wifi_bssid ." 1>&2 + return 1 + fi +# wpa_cli -i $1 status | grep bssid | awk -F: '{print $2} + iwgetid $1 --raw --ap +} + +# +get_wifi_channel() { + if [ $# -lt 1 ]; then + echo "ERROR: get_wifi_channel ." 1>&2 + return 1 + fi + iwgetid $1 --raw --channel +} + +# +get_wifi_rssi() { + if [ $# -lt 1 ]; then + echo "ERROR: get_wifi_rssi ." 1>&2 + return 1 + fi + grep $1 /proc/net/wireless | awk '{print $4}' +} + +# +get_wifi_noise() { + if [ $# -lt 1 ]; then + echo "ERROR: get_wifi_noise ." 1>&2 + return 1 + fi + grep $1 /proc/net/wireless | awk '{print $5}' +} + +# +get_wifi_rate() { + if [ $# -lt 1 ]; then + echo "ERROR: get_wifi_rate ." 1>&2 + return 1 + fi + iwconfig $1 | sed -n 's@^.*Bit\ Rate=\([0-9.]*\) Mb/s.*$@\1@p' +} + +## for interface layer +# +get_v4ifconf() { + if [ $# -lt 1 ]; then + echo "ERROR: get_v4ifconf ." 1>&2 + return 1 + fi + grep "$1 inet" /etc/network/interfaces | awk '{print $4}' +# echo "TBD" +} + +# +check_v4autoconf() { + if [ $# -lt 2 ]; then + echo "ERROR: check_v4autoconf ." 1>&2 + return 1 + fi + if [ $2 = "dhcp" ]; then + cat /var/lib/dhcp/dhclient.$1.leases | sed 's/"//g' + return 0 + fi + echo "v4conf is $2" + return 9 +} + +# +get_v4addr() { + if [ $# -lt 2 ]; then + echo "ERROR: get_v4addr ." 1>&2 + return 1 + fi +# if [ $2 = "dhcp" ]; then +# echo "TBD" +# else + ip -4 address show $1 | sed -n 's@^.*inet \([0-9.]*\)/.*$@\1@p' +# fi +} + +# +get_netmask() { + if [ $# -lt 2 ]; then + echo "ERROR: get_netmask ." 1>&2 + return 1 + fi +# if [ $2 = "dhcp" ]; then +# echo "TBD" +# else + local preflen=`ip -4 address show $1 | sed -n 's@^.*inet [0-9.]*/\([0-9]*\) .*$@\1@p'` + case "${preflen}" in + 16) echo "255.255.0.0" ;; + 17) echo "255.255.128.0" ;; + 18) echo "255.255.192.0" ;; + 19) echo "255.255.224.0" ;; + 20) echo "255.255.240.0" ;; + 21) echo "255.255.248.0" ;; + 22) echo "255.255.252.0" ;; + 23) echo "255.255.254.0" ;; + 24) echo "255.255.255.0" ;; + 25) echo "255.255.255.128" ;; + 26) echo "255.255.255.192" ;; + 27) echo "255.255.255.224" ;; + 28) echo "255.255.255.240" ;; + 29) echo "255.255.255.248" ;; + 30) echo "255.255.255.252" ;; + 31) echo "255.255.255.254" ;; + *) ;; + esac +# fi +} + +# +get_v4routers() { + if [ $# -lt 2 ]; then + echo "ERROR: get_v4routers ." 1>&2 + return 1 + fi +# if [ $2 = "dhcp" ]; then +# echo "TBD" +# else + ip -4 route | grep default | grep $1 | awk '{print $3}' +# fi +} + +# +get_v4nameservers() { + if [ $# -lt 2 ]; then + echo "ERROR: get_v4nameservers ." 1>&2 + return 1 + fi +# if [ $2 = "dhcp" ]; then +# echo "TBD" +# else + grep nameserver /etc/resolv.conf | awk '{print $2}' | grep -v : | + awk -v ORS=' ' '1; END{printf "\n"}' +# fi +} + +# +get_v6ifconf() { + if [ $# -lt 1 ]; then + echo "ERROR: get_v6ifconf ." 1>&2 + return 1 + fi + local v6ifconf=`grep "$1 inet6" /etc/network/interfaces | awk '{print $4}'` + if [ "X${v6ifconf}" != "X" ]; then + cat ${v6ifconf} + else + echo "automatic" + fi +# echo "TBD" +} + +# +get_v6lladdr() { + if [ $# -lt 1 ]; then + echo "ERROR: get_v6lladdr ." 1>&2 + return 1 + fi + ip -6 address show $1 | sed -n 's@^.*inet6 \(fe80[0-9a-f:]*\)/.*$@\1@p' +} + +# +get_ra_prefixes() { + if [ $# -lt 1 ]; then + echo "ERROR: get_ra_prefixes ." 1>&2 + return 1 + fi + rdisc6 -1 $1 | grep Prefix | awk '{print $3}' | + awk -F\n -v ORS=',' '{print}' | sed 's/,$//' +} + +# require ndisc6 ver 1.0.3 +get_ra_prefix_flags() { + if [ $# -lt 2 ]; then + echo "ERROR: get_ra_prefix_flags ." 1>&2 + return 1 + fi + local prefix=`echo $1 | awk -F/ '{print $2}'` + rdisc6 -1 $1 | + awk 'BEGIN{ + find=0; + while (getline line) { + if (find==1) { + if (match(line,/'"On-link"'.*/) && match(line,/'"Yes"'.*/)) { + print "O"; + } else if (match(line,/'"Autonomous"'.*/) && match(line,/'"Yes"'.*/)) { + print "A"; + find=0; + } + } else if (match(line,/'"$prefix"'.*/)) { + find=1; + } + } + }' | + awk -F\n -v ORS='' '{print}' +} + +# +get_ra_flags() { + if [ $# -lt 1 ]; then + echo "ERROR: get_ra_flags ." 1>&2 + return 1 + fi + rdisc6 -1 $1 | + awk 'BEGIN{ + while (getline line) { + if (match(line,/'"Stateful address"'.*/) && match(line,/'"Yes"'.*/)) { + print "M"; + } else if (match(line,/'"Stateful other"'.*/) && match(line,/'"Yes"'.*/)) { + print "O"; + } + } + }' | + awk -F\n -v ORS='' '{print}' +} + +# +check_v6autoconf() { + if [ $# -lt 5 ]; then + echo "ERROR: check_v6autoconf ." 1>&2 + return 1 + fi + local prefix=`echo $3 | sed -n 's@\([0-9a-f:]*\)::/.*$@\1@p'` + local v6addrs="" + local a_flag=`echo $3 | grep A` + local m_flag=`echo $5 | grep M` + if [ $2 = "automatic" ]; then +# if [ "X${a_flag}" != "X" ]; then +# #TBD +# fi +# if [ "X${m_flag}" != "X" ]; then +# #TBD +# fi + echo ${v6addrs} | sed 's/,$//' + return 0 + else + ip -6 address show $1 | sed -n '/${prefix}/s@^.*inet6 \([0-9a-f:]*\)/.*$@\1@p' + return 9 + fi +} + +# +get_v6addrs() { + if [ $# -lt 4 ]; then + echo "ERROR: get_v6addrs ." 1>&2 + return 1 + fi + local prefix=`echo $3 | sed -n 's@\([0-9a-f:]*\)::/.*$@\1@p'` + local m_flag=`echo $4 | grep M` + if [ $2 = "automatic" -a "${m_flag}" ]; then + echo "TBD" + else + ip -6 address show $1 | grep inet6 | grep ${prefix} | awk '{print $2}' | + awk -F\n -v ORS=',' '{print}' | sed 's/,$//' +# ip -6 address show $1 | sed -n '/${prefix}/s@^.*inet6 \([0-9a-f:]*\)/.*$@\1@p' | +# awk -F\n -v ORS=',' '{print}' | sed 's/,$//' + fi +} + +# +get_prefixlen() { + if [ $# -lt 1 ]; then + echo "ERROR: get_prefixlen ." 1>&2 + return 1 + fi + echo $1 | awk -F/ '{print $2}' +} + +# +get_v6routers() { + if [ $# -lt 1 ]; then + echo "ERROR: get_v6routers ." 1>&2 + return 1 + fi + local v6router=`ip -6 route | grep default | grep $1 | awk '{print $3}'` + echo ${v6router}%$1 +} + +# +get_v6nameservers() { + if [ $# -lt 2 ]; then + echo "ERROR: get_v6nameservers ." 1>&2 + return 1 + fi +# local dhcpv6=`echo $3 | grep M` +# if [ $2 = "automatic" -a "${dhcpv6}" ]; then +# echo "TBD" +# else + # need for IPv6 + grep nameserver /etc/resolv.conf | awk '{print $2}' | grep : | + awk -v ORS=' ' '1; END{printf "\n"}' +# fi +} + +## for localnet layer +# +do_ping() { + if [ $# -lt 2 ]; then + echo "ERROR: do_ping ." 1>&2 + return 1 + fi + local command="" + case $1 in + "4" ) command=ping ;; + "6" ) command=ping6 ;; + * ) echo "ERROR: must be 4 or 6." 1>&2; return 9 ;; + esac + ${command} -c 5 $2 + return $? +} + +# +get_rtt() { + if [ $# -lt 1 ]; then + echo "ERROR: get_rtt ." 1>&2 + return 1 + fi + echo "$1" | grep rtt | awk '{print $4}' | awk -F"/" '{print $2}' +} + +## for globalnet layer +# +do_traceroute() { + if [ $# -lt 2 ]; then + echo "ERROR: do_traceroute ." 1>&2 + return 1 + fi + local command="" + case $1 in + "4" ) command=traceroute ;; + "6" ) command=traceroute6 ;; + * ) echo "ERROR: must be 4 or 6." 1>&2; return 9 ;; + esac + ${command} -n -w 1 -q 1 -m 50 $2 2>/dev/null | grep -v traceroute | + awk '{print $2}' | awk -F\n -v ORS=',' '{print}' | sed 's/,$//' +} + +# +do_pmtud() { + if [ $# -lt 4 ]; then + echo "ERROR: do_pmtud ." 1>&2 + return 1 + fi + local command="" + local dfopt="" + case $1 in + "4" ) command=ping; dfopt="-M do" ;; + "6" ) command=ping6 ;; + * ) echo "ERROR: must be 4 or 6." 1>&2; return 9 ;; + esac + ${command} -c 1 $2 > /dev/null + if [ $? -ne 0 ]; then + echo 0 + return 1 + fi + + local version=$1 + local target=$2 + local min=$3 + local max=$4 + local mid=`expr \( ${min} + ${max} \) / 2` + local result=0 + if [ ${min} -eq ${mid} ] || [ ${max} -eq ${mid} ]; then + echo ${min} + return + fi + ${command} -c 3 -s ${mid} ${dfopt} ${target} >/dev/null 2>/dev/null + if [ $? -eq 0 ]; then + result=$(do_pmtud ${version} ${target} ${mid} ${max}) + else + result=$(do_pmtud ${version} ${target} ${min} ${mid}) + fi + echo ${result} +} + +## for dns layer +# +do_dnslookup() { + if [ $# -lt 3 ]; then + echo "ERROR: do_dnslookup ." 1>&2 + return 1 + fi + dig @$1 $3 $2 +short +time=1 + return $? +} + +## for web layer +# +do_curl() { + if [ $# -lt 2 ]; then + echo "ERROR: do_curl ." 1>&2 + return 1 + fi + if [ $1 != 4 -a $1 != 6 ]; then + echo "ERROR: must be 4 or 6." 1>&2 + return 9 + fi + curl -$1 --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null $2 +} + +# +# main +# + +#################### +## Preparation + +# Check parameters +if [ "X${LOCKFILE}" = "X" ]; then + echo "ERROR: LOCKFILE is null at configration file." 1>&2 + return 1 +fi +if [ "X${IFTYPE}" = "X" ]; then + echo "ERROR: IFTYPE is null at configration file." 1>&2 + return 1 +fi +if [ "X${DEVNAME}" = "X" ]; then + echo "ERROR: DEVNAME is null at configration file." 1>&2 + return 1 +fi + +#################### +## Phase 0 + +# Set lock file +trap 'rm -f ${LOCKFILE}; exit 0' INT + +if [ ! -e ${LOCKFILE} ]; then + echo $$ >"${LOCKFILE}" +else + pid=`cat "${LOCKFILE}"` + kill -0 "${pid}" > /dev/null 2>&1 + if [ $? -eq 0 ]; then + exit 0 + else + echo $$ >"${LOCKFILE}" + echo "Warning: previous check appears to have not finished correctly" + fi +fi + +# Make log directory +mkdir -p log + +# Cleate UUID +uuid=$(cleate_uuid) + +# Get devicename +# Check {IFTYPE} parameter +if [ "X${IFTYPE}" = "X" ]; then + echo "ERROR: IFTYPE is null at configration file." 1>&2 + return 1 +fi +devicename=$(get_devicename "${IFTYPE}") + +# Get MAC address +mac_addr=$(get_macaddr ${devicename}) + +# Get OS version +os=$(get_os) + +# Write campaign log file +#write_json_campaign ${uuid} ${mac_addr} "${os}" ${ssid} + +#################### +## Phase 1 +echo "Phase 1: Datalink Layer checking..." +layer="datalink" + +# Get current SSID +pre_ssid=$(get_wifi_ssid ${devicename}) + +# XXXX +# set specific ssid +#if [ "X${SSID}" != "X" -a "X${SSID_KEY}" != "X" ]; then +# echo " set SSID:${SSID}" +# networksetup -setairportnetwork ${devicename} ${SSID} ${SSID_KEY} +# sleep 5 +##elif [ "X${pre_ssid}" != "X" ]; then +## networksetup -setairportnetwork ${devicename} ${pre_ssid} +## sleep 5 +#fi + +# Select band +if [ "X${BAND}" != "X" ]; then + set_band ${devicename} +fi + +# Down, Up interface +if [ ${RECONNECT} = "yes" ]; then + # Down target interface + if [ "${VERBOSE}" = "yes" ]; then + echo " interface:${devicename} down" + fi + do_ifdown ${devicename} + sleep 2 + + # Start target interface + if [ "${VERBOSE}" = "yes" ]; then + echo " interface:${devicename} up" + fi + do_ifup ${devicename} + sleep 20 +fi + +# Check I/F status +result=${FAIL} +ifstatus=$(get_ifstatus ${devicename}) +if [ $? -eq 0 ]; then + result=${SUCCESS} +fi +if [ "X${ifstatus}" != "X" ]; then + write_json ${layer} "common" ifstatus ${result} ${ifstatus} +fi + +# Get iftype +write_json ${layer} "common" iftype ${INFO} ${IFTYPE} + +# Get ifmtu +ifmtu=$(get_ifmtu ${devicename}) +if [ "X${ifmtu}" != "X" ]; then + write_json ${layer} "common" ifmtu ${INFO} ${ifmtu} +fi + +# +if [ ${IFTYPE} != "Wi-Fi" ]; then + # Get media type + media=$(get_mediatype ${devicename}) + if [ "X${media}" != "X" ]; then + write_json ${layer} "${IFTYPE}" media ${INFO} ${media} + fi +else + # Get Wi-Fi SSID + ssid=$(get_wifi_ssid ${devicename}) + if [ "X${ssid}" != "X" ]; then + write_json ${layer} "${IFTYPE}" ssid ${INFO} ${ssid} + fi + # Get Wi-Fi BSSID + bssid=$(get_wifi_bssid ${devicename}) + if [ "X${bssid}" != "X" ]; then + write_json ${layer} "${IFTYPE}" bssid ${INFO} ${bssid} + fi + # Get Wi-Fi channel + channel=$(get_wifi_channel ${devicename}) + if [ "X${channel}" != "X" ]; then + write_json ${layer} "${IFTYPE}" channel ${INFO} ${channel} + fi + # Get Wi-Fi RSSI + rssi=$(get_wifi_rssi ${devicename}) + if [ "X${rssi}" != "X" ]; then + write_json ${layer} "${IFTYPE}" rssi ${INFO} ${rssi} + fi + # Get Wi-Fi noise + noise=$(get_wifi_noise ${devicename}) + if [ "X${noise}" != "X" ]; then + write_json ${layer} "${IFTYPE}" noise ${INFO} ${noise} + fi + # Get Wi-Fi rate + rate=$(get_wifi_rate ${devicename}) + if [ "X${rate}" != "X" ]; then + write_json ${layer} "${IFTYPE}" rate ${INFO} ${rate} + fi +fi + +# Report phase 1 results +if [ "${VERBOSE}" = "yes" ]; then + echo " datalink information:" + echo " type: ${IFTYPE}, dev: ${devicename}" + echo " status: ${ifstatus}, mtu: ${ifmtu} MB" + if [ "${IFTYPE}" != "Wi-Fi" ]; then + echo " media: ${media}" + else + echo " ssid: ${ssid}, ch: ${channel}, rate: ${rate} Mbps" + echo " bssid: ${bssid}" + echo " rssi: ${rssi} dB, noise: ${noise} dB" + fi +fi + +echo " done." +sleep 5 + +#################### +## Phase 2 +echo "Phase 2: Interface Layer checking..." +layer="interface" + +## IPv4 +# Get IPv4 I/F configurations +v4ifconf=$(get_v4ifconf "${devicename}") +if [ "X${v4ifconf}" != "X" ]; then + write_json ${layer} IPv4 v4ifconf ${INFO} ${v4ifconf} +fi + +# Check IPv4 autoconf +result=${FAIL} +v4autoconf=$(check_v4autoconf ${devicename} ${v4ifconf}) +if [ $? -eq 0 -a "X${v4autoconf}" != "X" ]; then + result=${SUCCESS} +fi +write_json ${layer} IPv4 v4autoconf ${result} "${v4autoconf}" + +# Get IPv4 address +v4addr=$(get_v4addr ${devicename} ${v4ifconf}) +if [ "X${v4addr}" != "X" ]; then + write_json ${layer} IPv4 v4addr ${INFO} ${v4addr} +fi + +# Get IPv4 netmask +netmask=$(get_netmask ${devicename} ${v4ifconf}) +if [ "X${netmask}" != "X" ]; then + write_json ${layer} IPv4 netmask ${INFO} ${netmask} +fi + +# Get IPv4 routers +v4routers=$(get_v4routers ${devicename} ${v4ifconf}) +if [ "X${v4routers}" != "X" ]; then + write_json ${layer} IPv4 v4routers ${INFO} ${v4routers} +fi + +# Get IPv4 name servers +v4nameservers=$(get_v4nameservers ${devicename} ${v4ifconf}) +if [ "X${v4nameservers}" != "X" ]; then + write_json ${layer} IPv4 v4nameservers ${INFO} ${v4nameservers} +fi + +# Get IPv4 NTP servers +#TBD + +# Report phase 2 results (IPv4) +if [ "${VERBOSE}" = "yes" ]; then + echo " interface information:" + echo " IPv4 conf: ${v4ifconf}" + echo " IPv4 addr: ${v4addr}/${netmask}" + echo " IPv4 router: ${v4routers}" + echo " IPv4 namesrv: ${v4nameservers}" +fi + +## IPv6 +# Get IPv6 I/F configurations +v6ifconf=$(get_v6ifconf "${devicename}") +if [ "X${v6ifconf}" != "X" ]; then + write_json ${layer} IPv6 v6ifconf ${INFO} ${v6ifconf} +fi + +# Get IPv6 linklocal address +v6lladdr=$(get_v6lladdr ${devicename}) +if [ "X${v6lladdr}" != "X" ]; then + write_json ${layer} IPv6 v6lladdr ${INFO} ${v6lladdr} +fi + +# Get IPv6 RA flags +ra_flags=$(get_ra_flags ${devicename}) +if [ "X${ra_flags}" != "X" ]; then + write_json ${layer} RA ra_flags ${INFO} ${ra_flags} +fi + +# Get IPv6 RA prefix +ra_prefixes=$(get_ra_prefixes ${devicename}) +if [ "X${ra_prefixes}" != "X" ]; then + write_json ${layer} RA ra_prefixes ${INFO} ${ra_prefixes} +fi + +# Report phase 2 results (IPv6) +if [ "${VERBOSE}" = "yes" ]; then + echo " IPv6 conf: ${v6ifconf}" + echo " IPv6 lladdr: ${v6lladdr}" +fi + +if [ "X${ra_flags}" != "X" -o "X${ra_prefixes}" != "X" ]; then + if [ "${VERBOSE}" = "yes" ]; then + echo " IPv6 RA flags: ${ra_flags}" + fi + for pref in `echo ${ra_prefixes} | sed 's/,/ /g'`; do + # Get IPv6 RA prefix flags + ra_prefix_flags=$(get_ra_prefix_flags ${devicename} ${pref}) + write_json ${layer} RA ra_prefix_flags ${INFO} "(${pref}) ${ra_prefix_flags}" + if [ "${VERBOSE}" = "yes" ]; then + echo " IPv6 RA prefix(flags): ${pref}(${ra_prefix_flags})" + fi + + # Get IPv6 prefix length + prefixlen=$(get_prefixlen ${pref}) + write_json ${layer} RA prefixlen ${INFO} "(${pref}) ${prefixlen}" + + # Get IPv6 address + v6addrs=$(get_v6addrs ${devicename} ${v6ifconf} ${pref} ${ra_prefix_flags}) + write_json ${layer} IPv6 v6addrs ${INFO} "(${pref}) ${v6addrs}" + if [ "${VERBOSE}" = "yes" ]; then + for addr in `echo ${v6addrs} | sed 's/,/ /g'`; do +# echo " IPv6 addr: ${addr}/${prefixlen}" + echo " IPv6 addr: ${addr}" + done + fi + done + + # Check IPv6 autoconf #TBD + result=${FAIL} + if [ ${v6ifconf} = "automatic" -a "X${v6addrs}" != "X" ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv6 v6autoconf ${result} ${v6addrs} + + # Get IPv6 routers + v6routers=$(get_v6routers ${devicename}) + if [ "X${v6routers}" != "X" ]; then + write_json ${layer} IPv6 v6routers ${INFO} "${v6routers}" + fi + if [ "${VERBOSE}" = "yes" ]; then + echo " IPv6 routers: ${v6routers}" + fi + + # Get IPv6 name servers + v6nameservers=$(get_v6nameservers ${devicename} ${v6ifconf} ${ra_flags}) + if [ "X${v6nameservers}" != "X" ]; then + write_json ${layer} IPv6 v6nameservers ${INFO} "${v6nameservers}" + fi + if [ "${VERBOSE}" = "yes" ]; then + echo " IPv6 nameservers: ${v6nameservers}" + fi + + # Get IPv6 NTP servers + #TBD +else + if [ "${VERBOSE}" = "yes" ]; then + echo " RA does not exist." + fi +fi + +echo " done." +sleep 2 + +#################### +## Phase 3 +echo "Phase 3: Localnet Layer checking..." +layer="localnet" + +# Do ping to IPv4 routers +for var in `echo ${v4routers} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " ping to IPv4 router: ${var}" + fi + v4alive_router=$(do_ping 4 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv4 v4alive_router ${result} "(${var}) ${v4alive_router}" + v4rtt_router=$(get_rtt "${v4alive_router}") + write_json ${layer} IPv4 v4rtt_router ${INFO} "(${var}) ${v4rtt_router}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, rtt: ${v4rtt_router} msec" + else + echo " status: ng" + fi + fi +done + +# Do ping to IPv4 nameservers +for var in `echo ${v4nameservers} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " ping to IPv4 nameserver: ${var}" + fi + v4alive_namesrv=$(do_ping 4 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv4 v4alive_namesrv ${result} "(${var}) ${v4alive_namesrv}" + v4rtt_namesrv=$(get_rtt "${v4alive_namesrv}") + write_json ${layer} IPv4 v4rtt_namesrv ${INFO} "(${var}) ${v4rtt_namesrv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, rtt: ${v4rtt_namesrv} msec" + else + echo " status: ng" + fi + fi +done + +# Do ping to IPv6 routers +for var in `echo ${v6routers} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " ping to IPv6 router: ${var}" + fi + v6alive_router=$(do_ping 6 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv6 v6alive_router ${result} "(${var}) ${v6alive_router}" + v6rtt_router=$(get_rtt "${v6alive_router}") + write_json ${layer} IPv6 v6rtt_router ${INFO} "(${var}) ${v6rtt_router}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, rtt: ${v6rtt_router} msec" + else + echo " status: ng" + fi + fi +done + +# Do ping to IPv6 nameservers +for var in `echo ${v6nameservers} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " ping to IPv6 nameserver: ${var}" + fi + v6alive_namesrv=$(do_ping 6 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv6 v6alive_namesrv ${result} "(${var}) ${v6alive_namesrv}" + v6rtt_namesrv=$(get_rtt "${v6alive_namesrv}") + write_json ${layer} IPv6 v6rtt_namesrv ${INFO} "(${var}) ${v6rtt_namesrv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, rtt: ${v6rtt_namesrv} msec" + else + echo " status: ng" + fi + fi +done + +echo " done." +sleep 2 + +#################### +## Phase 4 +echo "Phase 4: Globalnet Layer checking..." +layer="globalnet" + +# Check PING_SRVS parameter +if [ "X${PING_SRVS}" = "X" ]; then + echo "ERROR: PING_SRVS is null at configration file." 1>&2 + return 1 +fi + +if [ "X${v4addr}" != "X" ]; then + # Do ping to extarnal IPv4 servers + for var in `echo ${PING_SRVS} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " ping to extarnal IPv4 server: ${var}" + fi + v4alive_srv=$(do_ping 4 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv4 v4alive_srv ${result} "(${var}) ${v4alive_srv}" + v4rtt_srv=$(get_rtt "${v4alive_srv}") + write_json ${layer} IPv4 v4rtt_srv ${INFO} "(${var}) ${v4rtt_srv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, rtt: ${v4rtt_srv} msec" + else + echo " status: ng" + fi + fi + done + + # Do traceroute to extarnal IPv4 servers + for var in `echo ${PING_SRVS} | sed 's/,/ /g'`; do + if [ "${VERBOSE}" = "yes" ]; then + echo " traceroute to extarnal IPv4 server: ${var}" + fi + v4path_srv=$(do_traceroute 4 ${var}) + write_json ${layer} IPv4 v4path_srv ${INFO} "(${var}) ${v4path_srv}" + if [ "${VERBOSE}" = "yes" ]; then + echo " path: ${v4path_srv}" + fi + done + + # Check path MTU to extarnal IPv4 servers + for var in `echo ${PING_SRVS} | sed 's/,/ /g'`; do + if [ "${VERBOSE}" = "yes" ]; then + echo " do pmtud to extarnal IPv4 server: ${var}" + fi + data=$(do_pmtud 4 ${var} 1470 1500) + if [ ${data} -eq 0 ]; then + write_json ${layer} IPv4 v4pmtu_srv ${INFO} "(${var}) unmeasurable" + if [ "${VERBOSE}" = "yes" ]; then + echo " pmtud: unmeasurable" + fi + else + v4pmtu_srv=`expr ${data} + 28` + write_json ${layer} IPv4 v4pmtu_srv ${INFO} "(${var}) ${v4pmtu_srv}" + if [ "${VERBOSE}" = "yes" ]; then + echo " pmtu: ${v4pmtu_srv} MB" + fi + fi + done +fi + +# Check PING6_SRVS parameter +if [ "X${PING6_SRVS}" = "X" ]; then + echo "ERROR: PING6_SRVS is null at configration file." 1>&2 + return 1 +fi + +if [ "X${v6addrs}" != "X" ]; then + # Do ping to extarnal IPv6 servers + for var in `echo ${PING6_SRVS} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " ping to extarnal IPv6 server: ${var}" + fi + v6alive_srv=$(do_ping 6 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv6 v6alive_srv ${result} "(${var}) ${v6alive_srv}" + v6rtt_srv=$(get_rtt "${v6alive_srv}") + write_json ${layer} IPv6 v6rtt_srv ${INFO} "(${var}) ${v6rtt_srv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, rtt: ${v6rtt_srv} msec" + else + echo " status: ng" + fi + fi + done + + # Do traceroute to extarnal IPv6 servers + for var in `echo ${PING6_SRVS} | sed 's/,/ /g'`; do + if [ "${VERBOSE}" = "yes" ]; then + echo " traceroute to extarnal IPv6 server: ${var}" + fi + v6path_srv=$(do_traceroute 6 ${var}) + write_json ${layer} IPv6 v6path_srv ${INFO} "(${var}) ${v6path_srv}" + if [ "${VERBOSE}" = "yes" ]; then + echo " path: ${v6path_srv}" + fi + done + + # Check path MTU to extarnal IPv6 servers + for var in `echo ${PING6_SRVS} | sed 's/,/ /g'`; do + if [ "${VERBOSE}" = "yes" ]; then + echo " do pmtud to extarnal IPv6 server: ${var}" + fi + data=$(do_pmtud 6 ${var} 1232 1453) + if [ ${data} -eq 0 ]; then + write_json ${layer} IPv6 v6pmtu_srv ${INFO} "(${var}) unmeasurable" + if [ "${VERBOSE}" = "yes" ]; then + echo " pmtud: unmeasurable" + fi + else + v6pmtu_srv=`expr ${data} + 48` + write_json ${layer} IPv6 v6pmtu_srv ${INFO} "(${var}) ${v6pmtu_srv}" + if [ "${VERBOSE}" = "yes" ]; then + echo " pmtu: ${v6pmtu_srv} MB" + fi + fi + done +fi + +echo " done." +sleep 2 + +#################### +## Phase 5 +echo "Phase 5: DNS Layer checking..." +layer="dns" + +# Clear dns local cache +#TBD + +# Check FQDNS parameter +if [ "X${FQDNS}" = "X" ]; then + echo "ERROR: FQDNS is null at configration file." 1>&2 + return 1 +fi + +if [ "X${v4addr}" != "X" ]; then + # Do dns lookup for A record by IPv4 + for var in `echo ${v4nameservers} | sed 's/,/ /g'`; do + if [ "${VERBOSE}" = "yes" ]; then + echo " do dns lookup for A record by IPv4 nameserver: ${var}" + fi + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " do resolve server: ${fqdn}" + fi + v4trans_a_namesrv=$(do_dnslookup ${var} a ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv4 v4trans_a_namesrv ${result} "(@${var}, resolv ${fqdn}) ${v4trans_a_namesrv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v4trans_a_namesrv}" + else + echo " status: ng ($stat)" + fi + fi + done + done + + # Do dns lookup for AAAA record by IPv4 + for var in `echo ${v4nameservers} | sed 's/,/ /g'`; do + if [ "${VERBOSE}" = "yes" ]; then + echo " do dns lookup for AAAA record by IPv4 nameserver: ${var}" + fi + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " do resolve server: ${fqdn}" + fi + v4trans_aaaa_namesrv=$(do_dnslookup ${var} aaaa ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv4 v4trans_aaaa_namesrv ${result} "(@${var}, resolv ${fqdn}) ${v4trans_aaaa_namesrv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v4trans_aaaa_namesrv}" + else + echo " status: ng ($stat)" + fi + fi + done + done +fi + +if [ "X${v6addrs}" != "X" ]; then + # Do dns lookup for A record by IPv6 + for var in `echo ${v6nameservers} | sed 's/,/ /g'`; do + if [ "${VERBOSE}" = "yes" ]; then + echo " do dns lookup for A record by IPv6 nameserver: ${var}" + fi + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " do resolve server: ${fqdn}" + fi + v6trans_a_namesrv=$(do_dnslookup ${var} a ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv6 v6trans_a_namesrv ${result} "(@${var}, resolv ${fqdn}) ${v6trans_a_namesrv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v6trans_a_namesrv}" + else + echo " status: ng ($stat)" + fi + fi + done + done + + # Do dns lookup for AAAA record by IPv6 + for var in `echo ${v6nameservers} | sed 's/,/ /g'`; do + if [ "${VERBOSE}" = "yes" ]; then + echo " do dns lookup for AAAA record by IPv6 nameserver: ${var}" + fi + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " do resolve server: ${fqdn}" + fi + v6trans_aaaa_namesrv=$(do_dnslookup ${var} aaaa ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv6 v6trans_aaaa_namesrv ${result} "(@${var}, resolv ${fqdn}) ${v6trans_aaaa_namesrv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v6trans_aaaa_namesrv}" + else + echo " status: ng ($stat)" + fi + fi + done + done +fi + +# Check GPDNS[4|6] parameter +if [ "X${GPDNS4}" = "X" ]; then + echo "ERROR: GPDNS4 is null at configration file." 1>&2 + return 1 +fi +if [ "X${GPDNS6}" = "X" ]; then + echo "ERROR: GPDNS6 is null at configration file." 1>&2 + return 1 +fi + +if [ "X${v4addr}" != "X" ]; then + # Do dns lookup for A record by GPDNS4 + if [ "${VERBOSE}" = "yes" ]; then + echo " do dns lookup for A record by IPv4 nameserver: ${GPDNS4}" + fi + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " do resolve server: ${fqdn}" + fi + v4trans_a_namesrv=$(do_dnslookup ${GPDNS4} a ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv4 v4trans_a_namesrv ${result} "(@${GPDNS4}, resolv ${fqdn}) ${v4trans_a_namesrv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v4trans_a_namesrv}" + else + echo " status: ng ($stat)" + fi + fi + done + + # Do dns lookup for AAAA record by GPDNS4 + if [ "${VERBOSE}" = "yes" ]; then + echo " do dns lookup for AAAA record by IPv4 nameserver: ${GPDNS4}" + fi + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " do resolve server: ${fqdn}" + fi + v4trans_aaaa_namesrv=$(do_dnslookup ${GPDNS4} aaaa ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv4 v4trans_aaaa_namesrv ${result} "(@${GPDNS4}, resolv ${fqdn}) ${v4trans_aaaa_namesrv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v4trans_aaaa_namesrv}" + else + echo " status: ng ($stat)" + fi + fi + done +fi + +if [ "X${v6addrs}" != "X" ]; then + # Do dns lookup for A record by GPDNS6 + if [ "${VERBOSE}" = "yes" ]; then + echo " do dns lookup for A record by IPv6 nameserver: ${GPDNS6}" + fi + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " do resolve server: ${fqdn}" + fi + v6trans_a_namesrv=$(do_dnslookup ${GPDNS6} a ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv6 v6trans_a_namesrv ${result} "(@${GPDNS6}, resolv ${fqdn}) ${v6trans_a_namesrv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v6trans_a_namesrv}" + else + echo " status: ng ($stat)" + fi + fi + done + + # Do dns lookup for AAAA record by GPDNS6 + if [ "${VERBOSE}" = "yes" ]; then + echo " do dns lookup for AAAA record by IPv6 nameserver: ${GPDNS6}" + fi + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " do resolve server: ${fqdn}" + fi + v6trans_aaaa_namesrv=$(do_dnslookup ${GPDNS6} aaaa ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv6 v6trans_aaaa_namesrv ${result} "(@${GPDNS6}, resolv ${fqdn}) ${v6trans_aaaa_namesrv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v6trans_aaaa_namesrv}" + else + echo " status: ng ($stat)" + fi + fi + done +fi + +echo " done." +sleep 2 + +#################### +## Phase 6 +echo "Phase 6: Web Layer checking..." +layer="web" + +# Check V4WEB_SRVS parameter +if [ "X${V4WEB_SRVS}" = "X" ]; then + echo "ERROR: V4WEB_SRVS is null at configration file." 1>&2 + return 1 +fi + +if [ "X${v4addr}" != "X" ]; then + # Do curl to extarnal web servers by IPv4 + for var in `echo ${V4WEB_SRVS} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " curl to extarnal server: ${var} by IPv4" + fi + v4http_srv=$(do_curl 4 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv4 v4http_srv ${result} "(${var}) ${v4http_srv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, http status code: ${v4http_srv}" + else + echo " status: ng ($stat)" + fi + fi + done + + # Do measure http throuput by IPv4 + #TBD + # v4http_throughput_srv +fi + +# Check V6WEB_SRVS parameter +if [ "X${V6WEB_SRVS}" = "X" ]; then + echo "ERROR: V6WEB_SRVS is null at configration file." 1>&2 + return 1 +fi + +if [ "X${v6addrs}" != "X" ]; then + # Do curl to extarnal web servers by IPv6 + for var in `echo ${V6WEB_SRVS} | sed 's/,/ /g'`; do + result=${FAIL} + if [ "${VERBOSE}" = "yes" ]; then + echo " curl to extarnal server: ${var} by IPv6" + fi + v6http_srv=$(do_curl 6 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv6 v6http_srv ${result} "(${var}) ${v6http_srv}" + if [ "${VERBOSE}" = "yes" ]; then + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, http status code: ${v6http_srv}" + else + echo " status: ng ($stat)" + fi + fi + done + + # Do measure http throuput by IPv6 + #TBD + # v6http_throughput_srv +fi + +echo " done." +sleep 2 + +#################### +## Phase 7 +echo "Phase 7: Create campaign log..." + +# Write campaign log file +ssid=$(get_wifi_ssid ${devicename}) +write_json_campaign ${uuid} ${mac_addr} "${os}" ${ssid} + +# remove lock file +rm -f ${LOCKFILE} + +echo " done." + +exit 0 diff --git a/macos/keep_sendlog.sh b/macos/keep_sendlog.sh new file mode 100644 index 0000000..f11a282 --- /dev/null +++ b/macos/keep_sendlog.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +while true +do + sh ./sendlog.sh + sleep 15 +done diff --git a/macos/keep_sindan.sh b/macos/keep_sindan.sh new file mode 100644 index 0000000..f352230 --- /dev/null +++ b/macos/keep_sindan.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +while true +do + ./sindan.sh + sleep 15 +done diff --git a/macos/sendlog.sh b/macos/sendlog.sh new file mode 100755 index 0000000..272479a --- /dev/null +++ b/macos/sendlog.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# sendlog.sh +# version 0.9 + +# read configurationfile +source sindan.conf + +# Check LOCKFILE_SENDLOG parameter +if [ "X${LOCKFILE_SENDLOG}" = "X" ]; then + echo "ERROR: LOCKFILE_SENDLOG is null at configration file." 1>&2 + return 1 +fi +trap 'rm -f ${LOCKFILE_SENDLOG}; exit 0' INT + +if [ ! -e ${LOCKFILE_SENDLOG} ]; then + echo $$ >"${LOCKFILE_SENDLOG}" +else + pid=`cat "${LOCKFILE_SENDLOG}"` + kill -0 "${pid}" > /dev/null 2>&1 + if [ $? = 0 ]; then + exit 0 + else + echo $$ >"${LOCKFILE_SENDLOG}" + echo "Warning: previous check appears to have not finished correctly" + fi +fi + +# +# main +# + +# upload campaign log +for file in `find log/ -name "campaign_*.json"`; do +# echo " send campaign log to ${URL_CAMPAIGN}" + status=`curl --max-time 5 -s -w %{http_code} -F json=@${file} ${URL_CAMPAIGN}` + if [ "${status}" = "200" ]; then + rm -f ${file} + fi +done + +# upload sindan log +for file in `find log/ -name "sindan_*.json"`; do +# echo " send sindan log to ${URL_SINDAN}" + status=`curl --max-time 15 -s -w %{http_code} -F json=@${file} ${URL_SINDAN}` +# echo " status:${status}" + if [ "${status}" = "200" ]; then + rm -f ${file} + fi +done + +# remove lock file +rm -f ${LOCKFILE_SENDLOG} + +exit 0 diff --git a/macos/sindan.conf b/macos/sindan.conf new file mode 100644 index 0000000..3516424 --- /dev/null +++ b/macos/sindan.conf @@ -0,0 +1,44 @@ +# SINDAN Configuration file +# version 0.13 + +# lock file +readonly LOCKFILE=/tmp/sindan.isrunning +readonly LOCKFILE_SENDLOG=/tmp/sendlog.isrunning + +# result parameters +readonly FAIL=0 +readonly SUCCESS=1 +readonly INFO=10 + +# reconnect flag (yes or no) +readonly RECONNECT=yes + +# verbose flag (yes or no) +readonly VERBOSE=yes + +# target interface +readonly IFTYPE=Wi-Fi + +# set ssid +readonly SSID=wide2015-nohb +readonly SSID_KEY=matsushiro2015 + +# airport command +readonly AIRPORT=/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport + +# target servers +readonly PING_SRVS="8.8.8.8,203.178.139.60" +readonly PING6_SRVS="2001:4860:4860::8888,2001:200:0:180c::6" + +# servers for name resolution +readonly FQDNS="dual.imc.kanazawa-u.ac.jp,v4only.imc.kanazawa-u.ac.jp,v6only.imc.kanazawa-u.ac.jp" +readonly GPDNS4="8.8.8.8" +readonly GPDNS6="2001:4860:4860::8888" + +# servers for web comminication +readonly V4WEB_SRVS="www.wide.ad.jp,www.yahoo.co.jp" +readonly V6WEB_SRVS="www.wide.ad.jp,www.google.co.jp" + +# upload urls +readonly URL_CAMPAIGN="http://fluentd.c.u-tokyo.ac.jp:8888/sindan.log_campaign" +readonly URL_SINDAN="http://fluentd.c.u-tokyo.ac.jp:8888/sindan.log" diff --git a/macos/sindan.sh b/macos/sindan.sh new file mode 100755 index 0000000..1e188da --- /dev/null +++ b/macos/sindan.sh @@ -0,0 +1,1261 @@ +#!/bin/sh +# sindan.sh +# version 1.1 + +# read configurationfile +source sindan.conf + +# +# functions +# + +## for initial +# +cleate_uuid() { + uuidgen +} + +# +write_json_campaign() { + if [ $# -lt 4 ]; then + echo "ERROR: write_json_campaign ." 1>&2 + return 1 + fi + local json="{ \"log_campaign_uuid\" : \"$1\", + \"mac_addr\" : \"$2\", + \"os\" : \"$3\", + \"ssid\" : \"$4\", + \"occurred_at\" : \"`date -u '+%Y-%m-%d %T'`\" }" + echo ${json} > log/campaign_`date -u '+%s'`.json +} + +# +write_json() { + if [ $# -lt 5 ]; then + echo "ERROR: write_json . ($3)" 1>&2 + return 1 + fi + local json="{ \"layer\" : \"$1\", + \"log_group\" : \"$2\", + \"log_type\" : \"$3\", + \"log_campaign_uuid\" : \"${uuid}\", + \"result\" : \"$4\", + \"detail\" : \"$5\", + \"occurred_at\" : \"`date -u '+%Y-%m-%d %T'`\" }" + echo ${json} > log/sindan_$1_$3_`date -u '+%s'`.json +} + +## for datalink layer +# +do_ifdown() { + if [ $# -lt 1 ]; then + echo "ERROR: do_ifdown ." 1>&2 + return 1 + fi + networksetup -setairportpower $1 off +} + +# +do_ifup() { + if [ $# -lt 1 ]; then + echo "ERROR: do_ifup ." 1>&2 + return 1 + fi + networksetup -setairportpower $1 on +} + +# +get_os() { + sw_vers | awk -F: '{sub(/\t/,""); print $2}' | + awk -v ORS=' ' '1; END{printf "\n"}' +} + +# +get_devicename() { + if [ $# -lt 1 ]; then + echo "ERROR: get_devicename ." 1>&2 + return 1 + fi + networksetup -listnetworkserviceorder | grep Hardware | grep "$1" | + sed 's/^.*Device: \(.*\))$/\1/' +} + +# +get_ifstatus() { + if [ $# -lt 1 ]; then + echo "ERROR: get_ifstatus ." 1>&2 + return 1 + fi + local status=`ifconfig $1 | grep status | awk '{print $2}'` + if [ "${status}" = "active" ]; then + echo ${status}; return 0 + else + echo ${status}; return 1 + fi +} + +# +get_ifmtu() { + if [ $# -lt 1 ]; then + echo "ERROR: get_ifmtu ." 1>&2 + return 1 + fi + ifconfig $1 | grep mtu | awk '{print $4}' +} + +# +get_macaddr() { + if [ $# -lt 1 ]; then + echo "ERROR: get_macaddr ." 1>&2 + return 1 + fi + ifconfig $1 | grep ether | awk '{print $2}' +} + +# +get_mediatype() { + if [ $# -lt 1 ]; then + echo "ERROR: get_mediatype ." 1>&2 + return 1 + fi + ifconfig $1 | grep media | awk '{print $2}' +} + +# +get_wifi_ssid() { +# networksetup -getairportnetwork en0 | awk '{print $4}' + $AIRPORT -I | grep [^B]SSID | awk '{print $2}' +} + +# +get_wifi_bssid() { + $AIRPORT -I | grep BSSID | awk '{print $2}' +} + +# +get_wifi_channel() { + $AIRPORT -I | grep channel | awk '{print $2}' +} + +# +get_wifi_rssi() { + $AIRPORT -I | grep agrCtlRSSI | awk '{print $2}' +} + +# +get_wifi_noise() { + $AIRPORT -I | grep agrCtlNoise | awk '{print $2}' +} + +# +get_wifi_rate() { + $AIRPORT -I | grep lastTxRate | awk '{print $2}' +} + +## for interface layer +# +get_v4ifconf() { + if [ $# -lt 1 ]; then + echo "ERROR: get_v4ifconf ." 1>&2 + return 1 + fi + if networksetup -getinfo "$1" | grep 'DHCP Configuration' > /dev/null + then + echo 'dhcp' + elif networksetup -getinfo "$1" | grep 'Manually Using DHCP' > /dev/null + then + echo 'manual and dhcp' + elif networksetup -getinfo "$1" | grep 'BOOTP Configuration' > /dev/null + then + echo 'bootp' + elif networksetup -getinfo "$1" | grep 'Manual Configuration' > /dev/null + then + echo 'manual' + else + echo 'unknown' + fi +} + +# +check_v4autoconf() { + if [ $# -lt 2 ]; then + echo "ERROR: check_v4autoconf ." 1>&2 + return 1 + fi + if [ $2 = "dhcp" -o $2 = "bootp" ]; then + ipconfig getpacket $1 | awk -F\n -v ORS=',' '{print}' + return 0 + fi + echo "v4conf is $2" + return 9 +} + +# +get_v4addr() { + if [ $# -lt 2 ]; then + echo "ERROR: get_v4addr ." 1>&2 + return 1 + fi + if [ $2 = "dhcp" ]; then + ipconfig getpacket $1 | grep yiaddr | awk '{print $3}' + else + ifconfig $1 | grep inet[^6] | awk '{print $2}' + fi +} + +# +get_netmask() { + if [ $# -lt 2 ]; then + echo "ERROR: get_netmask ." 1>&2 + return 1 + fi + if [ $2 = "dhcp" ]; then + ipconfig getpacket $1 | grep subnet_mask | awk '{print $3}' + else + var=`ifconfig $1 | grep inet[^6] | awk '{print $4}'` + oct1=0x`echo ${var} | cut -c 3-4` + oct2=0x`echo ${var} | cut -c 5-6` + oct3=0x`echo ${var} | cut -c 7-8` + oct4=0x`echo ${var} | cut -c 9-10` + printf "%d.%d.%d.%d" ${oct1} ${oct2} ${oct3} ${oct4} + fi +} + +# +get_v4routers() { + if [ $# -lt 2 ]; then + echo "ERROR: get_v4routers ." 1>&2 + return 1 + fi + if [ $2 = "dhcp" ]; then + ipconfig getpacket $1 | grep router | sed 's/.*{\([0-9.,]*\)}$/\1/' + else + netstat -rn | grep default | grep $1 | grep -v % | awk '{print $2}' + fi +} + +# +get_v4nameservers() { + if [ $# -lt 2 ]; then + echo "ERROR: get_v4nameservers ." 1>&2 + return 1 + fi + if [ $2 = "dhcp" ]; then + ipconfig getpacket $1 | grep domain_name_server | + sed 's/.*{\([0-9., ]*\)}$/\1/' + else + grep nameserver /etc/resolv.conf | grep -v : | awk -F\n -v ORS=' ' '{print}' | + sed 's/nameserver \([0-9.]*\) /\1, /g' + fi +} + +# +get_v6ifconf() { + if [ $# -lt 1 ]; then + echo "ERROR: get_v6ifconf ." 1>&2 + return 1 + fi + if networksetup -getinfo "$1" | grep 'IPv6: Automatic' > /dev/null + then + echo 'automatic' + elif networksetup -getinfo "$1" | grep 'IPv6: Manual' > /dev/null + then + echo 'manual' + elif networksetup -getinfo "$1" | grep 'IPv6 IP address: none' > /dev/null + then + echo 'linklocal' + else + echo 'unknown' + fi +} + +# +get_v6lladdr() { + if [ $# -lt 1 ]; then + echo "ERROR: get_v6lladdr ." 1>&2 + return 1 + fi + ifconfig $1 | grep inet6 | grep fe80 | awk '{print$2}' +} + +# +get_ra_prefix() { + if [ $# -lt 1 ]; then + echo "ERROR: get_ra_prefix ." 1>&2 + return 1 + fi + ndp -pn | grep $1 | grep -v 'fe80:' | awk '{print $1}' +} + +# +get_ra_prefixes() { + if [ $# -lt 1 ]; then + echo "ERROR: get_ra_prefixes ." 1>&2 + return 1 + fi + ndp -pn | grep $1 | grep -v fe80 | awk '{print $1}' | + awk -F\n -v ORS=',' '{print}' | sed 's/,$//' +} + +# +get_ra_prefix_flags() { + if [ $# -lt 1 ]; then + echo "ERROR: get_ra_prefix_flags ." 1>&2 + return 1 + fi + local prefix=`echo $1 | awk -F/ '{print $1}'` + ndp -pn | + awk 'BEGIN{ + find=0; + while (getline line) { + if (find==1) { + print line; + find=0; + } else if (match(line,/'"$prefix"'.*/)) { + find=1; + } + } + }' | + awk '{print $1}' | + awk -F= '{print $2}' +} + +# +get_ra_flags() { + if [ $# -lt 1 ]; then + echo "ERROR: get_ra_flags ." 1>&2 + return 1 + fi + ndp -rn | grep $1 | sed 's/,//g' | awk '{print $3}' | + awk -F= '{print $2}' +} + +# +check_v6autoconf() { + if [ $# -lt 5 ]; then + echo "ERROR: check_v6autoconf ." 1>&2 + return 1 + fi + local v6addrs="" + local a_flag=`echo $3 | grep A` + local m_flag=`echo $5 | grep M` + if [ $2 = "automatic" ]; then + if [ "X${a_flag}" != "X" ]; then + v6addrs=`ifconfig $1 | grep inet6 | grep -v fe80 | grep ${prefix} | awk '{print $2}' | + awk -F\n -v ORS=',' '{print}'` + fi + if [ "X${m_flag}" != "X" ]; then + v6addrs=`ipconfig getv6packet $1 | grep yiaddr | awk '{print $3}'` + fi + echo ${v6addrs} | sed 's/,$//' + return 0 + else + ifconfig $1 | grep inet6 | grep -v fe80 | grep ${prefix} | awk '{print $2}' | + awk -F\n -v ORS=',' '{print}' | sed 's/,$//' + return 9 + fi +} + +# +get_v6addrs() { + if [ $# -lt 4 ]; then + echo "ERROR: get_v6addrs ." 1>&2 + return 1 + fi + local prefix=`echo $3 | awk -F':/' '{print $1}' | sed 's/:0:/::/g'` + local m_flag=`echo $4 | grep M` + if [ $2 = "automatic" -a "${m_flag}" ]; then + ipconfig getv6packet $1 | grep yiaddr | awk '{print $3}' + else + ifconfig $1 | grep inet6 | grep -v fe80 | grep ${prefix} | awk '{print $2}' | + awk -F\n -v ORS=',' '{print}' | sed 's/,$//' + fi +} + +# +get_prefixlen() { + if [ $# -lt 1 ]; then + echo "ERROR: get_prefixlen ." 1>&2 + return 1 + fi + echo $1 | awk -F/ '{print $2}' +} + +# +get_v6routers() { + if [ $# -lt 3 ]; then + echo "ERROR: get_v6routers ." 1>&2 + return 1 + fi + local m_flag=`echo $3 | grep M` + if [ $2 = "automatic" -a "${m_flag}" ]; then + ipconfig getv6packet $1 | grep router | + sed 's/.*{\([0-9A-Fa-f:]*\)}$/\1/' + else + netstat -rn | grep default | grep "%$1" | awk '{print $2}' + fi +} + +# +get_v6nameservers() { + if [ $# -lt 2 ]; then + echo "ERROR: get_v6nameservers ." 1>&2 + return 1 + fi + local dhcpv6=`echo $3 | grep M` + if [ $2 = "automatic" -a "${dhcpv6}" ]; then + ipconfig getv6packet $1 | grep : | grep -v DUID | + awk -F\n -v ORS=',' '{print}' | + sed 's/.* \([0-9a-f:,]*\) /\1/' +# awk -F\n -v ORS='' '{print}' | +# sed 's/.* \([0-9a-f:]*\) /\1, /' + else + grep nameserver /etc/resolv.conf | grep : | awk -F\n -v ORS=' ' '{print}' | + sed 's/nameserver \([0-9a-f:]*\) /\1, /g' + fi +} + +## for localnet layer +# +do_ping() { + if [ $# -lt 2 ]; then + echo "ERROR: do_ping ." 1>&2 + return 1 + fi + local command="" + case $1 in + "4" ) command=ping ;; + "6" ) command=ping6 ;; + * ) echo "ERROR: must be 4 or 6." 1>&2; return 9 ;; + esac + ${command} -c 5 $2 + return $? +} + +get_rtt() { + if [ $# -lt 1 ]; then + echo "ERROR: get_rtt ." 1>&2 + return 1 + fi + echo "$1" | grep round-trip | awk '{print $4}' | awk -F"/" '{print $2}' +} + +## for globalnet layer +# +do_traceroute() { + if [ $# -lt 2 ]; then + echo "ERROR: do_traceroute ." 1>&2 + return 1 + fi + local command="" + case $1 in + "4" ) command=traceroute ;; + "6" ) command=traceroute6 ;; + * ) echo "ERROR: must be 4 or 6." 1>&2; return 9 ;; + esac + ${command} -n -w 1 -q 1 -m 50 $2 2>/dev/null | awk '{print $2}' | + awk -F\n -v ORS=',' '{print}' | sed 's/,$//' +} + +# +do_pmtud() { + if [ $# -lt 4 ]; then + echo "ERROR: do_pmtud ." 1>&2 + return 1 + fi + local command="" + local dfopt="" + case $1 in + "4" ) command=ping; dfopt="-D" ;; + "6" ) command=ping6 ;; + * ) echo "ERROR: must be 4 or 6." 1>&2; return 9 ;; + esac + ${command} -c 1 $2 > /dev/null + if [ $? -ne 0 ]; then + echo 0 + return 1 + fi + + local version=$1 + local target=$2 + local min=$3 + local max=$4 + local mid=`expr \( ${min} + ${max} \) / 2` + local result=0 + if [ ${min} -eq ${mid} ] || [ ${max} -eq ${mid} ]; then + echo ${min} + return + fi + ${command} -c 3 -s ${mid} ${dfopt} ${target} >/dev/null 2>/dev/null + if [ $? -eq 0 ]; then + result=$(do_pmtud ${version} ${target} ${mid} ${max}) + else + result=$(do_pmtud ${version} ${target} ${min} ${mid}) + fi + echo ${result} +} + +## for dns layer +# +do_dnslookup() { + if [ $# -lt 3 ]; then + echo "ERROR: do_dnslookup ." 1>&2 + return 1 + fi + dig @$1 $3 $2 +short +time=1 + return $? +} + +## for web layer +# +do_curl() { + if [ $# -lt 2 ]; then + echo "ERROR: do_curl ." 1>&2 + return 1 + fi + if [ $1 != 4 -a $1 != 6 ]; then + echo "ERROR: must be 4 or 6." 1>&2 + return 9 + fi + curl -$1 --connect-timeout 5 --write-out %{http_code} --silent --output /dev/null $2 +} + +# +# main +# + +#################### +## Phase 0 + +# Set lock file +# Check LOCKFILE parameter +if [ "X${LOCKFILE}" = "X" ]; then + echo "ERROR: LOCKFILE is null at configration file." 1>&2 + return 1 +fi +trap 'rm -f ${LOCKFILE}; exit 0' INT + +if [ ! -e ${LOCKFILE} ]; then + echo $$ >"${LOCKFILE}" +else + pid=`cat "${LOCKFILE}"` + kill -0 "${pid}" > /dev/null 2>&1 + if [ $? = 0 ]; then + exit 0 + else + echo $$ >"${LOCKFILE}" + echo "Warning: previous check appears to have not finished correctly" + fi +fi + +# Make log directory +mkdir -p log + +# Cleate UUID +uuid=$(cleate_uuid) + +# Get devicename +# Check {IFTYPE} parameter +if [ "X${IFTYPE}" = "X" ]; then + echo "ERROR: IFTYPE is null at configration file." 1>&2 + return 1 +fi +devicename=$(get_devicename "${IFTYPE}") + +# Get MAC address +mac_addr=$(get_macaddr ${devicename}) + +# Get OS version +os=$(get_os) + +# Write campaign log file +#write_json_campaign ${uuid} ${mac_addr} "${os}" ${ssid} + +#################### +## Phase 1 +echo "Phase 1: Datalink Layer checking..." +layer="datalink" + +# Get current SSID +pre_ssid=$(get_wifi_ssid) + +if [ ${RECONNECT} = "yes" ]; then + # Down target interface + echo " interface:${devicename} down" + do_ifdown ${devicename} + sleep 2 + + # Start target interface + echo " interface:${devicename} up" + do_ifup ${devicename} + sleep 2 +fi + +# set specific ssid +if [ "X${SSID}" != "X" -a "X${SSID_KEY}" != "X" ]; then + echo " set SSID:${SSID}" + networksetup -setairportnetwork ${devicename} ${SSID} ${SSID_KEY} + sleep 5 +#elif [ "X${pre_ssid}" != "X" ]; then +# networksetup -setairportnetwork ${devicename} ${pre_ssid} +# sleep 5 +fi + +# Check I/F status +ifstatus=$(get_ifstatus ${devicename}) +result=${FAIL} +if [ $? = 0 ]; then + result=${SUCCESS} +fi +if [ "X${ifstatus}" != "X" ]; then + write_json ${layer} "common" ifstatus ${result} ${ifstatus} +fi + +# Get iftype +write_json ${layer} "common" iftype ${INFO} ${IFTYPE} + +# Get ifmtu +ifmtu=$(get_ifmtu ${devicename}) +if [ "X${ifmtu}" != "X" ]; then + write_json ${layer} "common" ifmtu ${INFO} ${ifmtu} +fi + +# +if [ ${IFTYPE} != "Wi-Fi" ]; then + # Get media type + media=$(get_mediatype ${devicename}) + if [ "X${media}" != "X" ]; then + write_json ${layer} "${IFTYPE}" media ${INFO} ${media} + fi +else + # Get Wi-Fi SSID + ssid=$(get_wifi_ssid) + if [ "X${ssid}" != "X" ]; then + write_json ${layer} "${IFTYPE}" ssid ${INFO} ${ssid} + fi + # Get Wi-Fi BSSID + bssid=$(get_wifi_bssid) + if [ "X${bssid}" != "X" ]; then + write_json ${layer} "${IFTYPE}" bssid ${INFO} ${bssid} + fi + # Get Wi-Fi channel + channel=$(get_wifi_channel) + if [ "X${channel}" != "X" ]; then + write_json ${layer} "${IFTYPE}" channel ${INFO} ${channel} + fi + # Get Wi-Fi RSSI + rssi=$(get_wifi_rssi) + if [ "X${rssi}" != "X" ]; then + write_json ${layer} "${IFTYPE}" rssi ${INFO} ${rssi} + fi + # Get Wi-Fi noise + noise=$(get_wifi_noise) + if [ "X${noise}" != "X" ]; then + write_json ${layer} "${IFTYPE}" noise ${INFO} ${noise} + fi + # Get Wi-Fi rate + rate=$(get_wifi_rate) + if [ "X${rate}" != "X" ]; then + write_json ${layer} "${IFTYPE}" rate ${INFO} ${rate} + fi +fi + +# Report phase 1 results +echo " datalink information:" +echo " type: ${IFTYPE}, dev: ${devicename}" +echo " status: ${ifstatus}, mtu: ${ifmtu} MB" +if [ "${IFTYPE}" != "Wi-Fi" ]; then + echo " media: ${media}" +else + echo " ssid: ${ssid}, ch: ${channel}, rate: ${rate} Mbps" + echo " bssid: ${bssid}" + echo " rssi: ${rssi} dB, noise: ${noise} dB" +fi + +sleep 10 + +#################### +## Phase 2 +echo "Phase 2: Interface Layer checking..." +layer="interface" + +## IPv4 +# Get IPv4 I/F configurations +v4ifconf=$(get_v4ifconf "${IFTYPE}") +if [ "X${v4ifconf}" != "X" ]; then + write_json ${layer} IPv4 v4ifconf ${INFO} ${v4ifconf} +fi + +# Check IPv4 autoconf +v4autoconf=$(check_v4autoconf ${devicename} ${v4ifconf}) +result=${FAIL} +if [ $? = 0 -a "X${v4autoconf}" != "X" ]; then + result=${SUCCESS} +fi +write_json ${layer} IPv4 v4autoconf ${result} "${v4autoconf}" + +# Get IPv4 address +v4addr=$(get_v4addr ${devicename} ${v4ifconf}) +if [ "X${v4addr}" != "X" ]; then + write_json ${layer} IPv4 v4addr ${INFO} ${v4addr} +fi + +# Get IPv4 netmask +netmask=$(get_netmask ${devicename} ${v4ifconf}) +if [ "X${netmask}" != "X" ]; then + write_json ${layer} IPv4 netmask ${INFO} ${netmask} +fi + +# Get IPv4 routers +v4routers=$(get_v4routers ${devicename} ${v4ifconf}) +if [ "X${v4routers}" != "X" ]; then + write_json ${layer} IPv4 v4routers ${INFO} ${v4routers} +fi + +# Get IPv4 name servers +v4nameservers=$(get_v4nameservers ${devicename} ${v4ifconf}) +if [ "X${v4nameservers}" != "X" ]; then + write_json ${layer} IPv4 v4nameservers ${INFO} ${v4nameservers} +fi + +# Get IPv4 NTP servers +#TBD + +# Report phase 2 results (IPv4) +echo " interface information:" +echo " IPv4 conf: ${v4ifconf}" +echo " IPv4 addr: ${v4addr}/${netmask}" +echo " IPv4 router: ${v4routers}" +echo " IPv4 namesrv: ${v4nameservers}" + +## IPv6 +# Get IPv6 I/F configurations +v6ifconf=$(get_v6ifconf "${IFTYPE}") +if [ "X${v6ifconf}" != "X" ]; then + write_json ${layer} IPv6 v6ifconf ${INFO} ${v6ifconf} +fi + +# Get IPv6 linklocal address +v6lladdr=$(get_v6lladdr ${devicename}) +if [ "X${v6lladdr}" != "X" ]; then + write_json ${layer} IPv6 v6lladdr ${INFO} ${v6lladdr} +fi + +# Get IPv6 RA flags +ra_flags=$(get_ra_flags ${devicename}) +if [ "X${ra_flags}" != "X" ]; then + write_json ${layer} RA ra_flags ${INFO} ${ra_flags} +fi + +# Get IPv6 RA prefix +ra_prefixes=$(get_ra_prefixes ${devicename}) +if [ "X${ra_prefixes}" != "X" ]; then + write_json ${layer} RA ra_prefixes ${INFO} ${ra_prefixes} +fi + +# Report phase 2 results (IPv6) +echo " IPv6 conf: ${v6ifconf}" +echo " IPv6 lladdr: ${v6lladdr}" + +if [ "X${ra_flags}" != "X" ]; then + echo " IPv6 RA flags: ${ra_flags}" + for pref in `echo ${ra_prefixes} | sed 's/,/ /g'`; do + # Get IPv6 RA prefix flags + ra_prefix_flags=$(get_ra_prefix_flags ${pref}) + write_json ${layer} RA ra_prefix_flags ${INFO} "(${pref}) ${ra_prefix_flags}" + echo " IPv6 RA prefix(flags): ${pref}(${ra_prefix_flags})" + + # Get IPv6 prefix length + prefixlen=$(get_prefixlen ${pref}) + write_json ${layer} RA prefixlen ${INFO} "(${pref}) ${prefixlen}" + + # Get IPv6 address + v6addrs=$(get_v6addrs ${devicename} ${v6ifconf} ${pref} ${ra_prefix_flags}) + write_json ${layer} IPv6 v6addrs ${INFO} "(${pref}) ${v6addrs}" + for addr in `echo ${v6addrs} | sed 's/,/ /g'`; do + echo " IPv6 addr: ${addr}/${prefixlen}" + done + done + + # Check IPv6 autoconf + result=${FAIL} + if [ ${v6ifconf} = "automatic" -a "X${v6addrs}" != "X" ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv6 v6autoconf ${result} ${v6addrs} + + # Get IPv6 routers + v6routers=$(get_v6routers ${devicename} ${v6ifconf} ${ra_flags}) + if [ "X${v6routers}" != "X" ]; then + write_json ${layer} IPv6 v6routers ${INFO} "${v6routers}" + fi + echo " IPv6 routers: ${v6routers}" + + # Get IPv6 name servers + v6nameservers=$(get_v6nameservers ${devicename} ${v6ifconf} ${ra_flags}) + if [ "X${v6nameservers}" != "X" ]; then + write_json ${layer} IPv6 v6nameservers ${INFO} "${v6nameservers}" + fi + echo " IPv6 nameservers: ${v6nameservers}" + + # Get IPv6 NTP servers + #TBD +else + echo " RA does not exist." +fi + +sleep 2 + +#################### +## Phase 3 +echo "Phase 3: Localnet Layer checking..." +layer="localnet" + +# Do ping to IPv4 routers +for var in `echo ${v4routers} | sed 's/,/ /g'`; do + result=${FAIL} + echo " ping to IPv4 router: ${var}" + v4alive_router=$(do_ping 4 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv4 v4alive_router ${result} "(${var}) ${v4alive_router}" + v4rtt_router=$(get_rtt "${v4alive_router}") + write_json ${layer} IPv4 v4rtt_router ${INFO} "(${var}) ${v4rtt_router}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, rtt: ${v4rtt_router} msec" + else + echo " status: ng" + fi +done + +# Do ping to IPv4 nameservers +for var in `echo ${v4nameservers} | sed 's/,/ /g'`; do + result=${FAIL} + echo " ping to IPv4 nameserver: ${var}" + v4alive_namesrv=$(do_ping 4 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv4 v4alive_namesrv ${result} "(${var}) ${v4alive_namesrv}" + v4rtt_namesrv=$(get_rtt "${v4alive_namesrv}") + write_json ${layer} IPv4 v4rtt_namesrv ${INFO} "(${var}) ${v4rtt_namesrv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, rtt: ${v4rtt_namesrv} msec" + else + echo " status: ng" + fi +done + +# Do ping to IPv6 routers +for var in `echo ${v6routers} | sed 's/,/ /g'`; do + result=${FAIL} + echo " ping to IPv6 router: ${var}" + v6alive_router=$(do_ping 6 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv6 v6alive_router ${result} "(${var}) ${v6alive_router}" + v6rtt_router=$(get_rtt "${v6alive_router}") + write_json ${layer} IPv6 v6rtt_router ${INFO} "(${var}) ${v6rtt_router}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, rtt: ${v6rtt_router} msec" + else + echo " status: ng" + fi +done + +# Do ping to IPv6 nameservers +for var in `echo ${v6nameservers} | sed 's/,/ /g'`; do + result=${FAIL} + echo " ping to IPv6 nameserver: ${var}" + v6alive_namesrv=$(do_ping 6 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv6 v6alive_namesrv ${result} "(${var}) ${v6alive_namesrv}" + v6rtt_namesrv=$(get_rtt "${v6alive_namesrv}") + write_json ${layer} IPv6 v6rtt_namesrv ${INFO} "(${var}) ${v6rtt_namesrv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, rtt: ${v6rtt_namesrv} msec" + else + echo " status: ng" + fi +done + +sleep 2 + +#################### +## Phase 4 +echo "Phase 4: Globalnet Layer checking..." +layer="globalnet" + +# Check PING_SRVS parameter +if [ "X${PING_SRVS}" = "X" ]; then + echo "ERROR: PING_SRVS is null at configration file." 1>&2 + return 1 +fi + +if [ "X${v4addr}" != "X" ]; then + # Do ping to extarnal IPv4 servers + for var in `echo ${PING_SRVS} | sed 's/,/ /g'`; do + result=${FAIL} + echo " ping to extarnal IPv4 server: ${var}" + v4alive_srv=$(do_ping 4 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv4 v4alive_srv ${result} "(${var}) ${v4alive_srv}" + v4rtt_srv=$(get_rtt "${v4alive_srv}") + write_json ${layer} IPv4 v4rtt_srv ${INFO} "(${var}) ${v4rtt_srv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, rtt: ${v4rtt_srv} msec" + else + echo " status: ng" + fi + done + + # Do traceroute to extarnal IPv4 servers + for var in `echo ${PING_SRVS} | sed 's/,/ /g'`; do + echo " traceroute to extarnal IPv4 server: ${var}" + v4path_srv=$(do_traceroute 4 ${var}) + write_json ${layer} IPv4 v4path_srv ${INFO} "(${var}) ${v4path_srv}" + echo " path: ${v4path_srv}" + done + + # Check path MTU to extarnal IPv4 servers + for var in `echo ${PING_SRVS} | sed 's/,/ /g'`; do + echo " do pmtud to extarnal IPv4 server: ${var}" + data=$(do_pmtud 4 ${var} 1470 1500) + if [ ${data} -eq 0 ]; then + write_json ${layer} IPv4 v4pmtu_srv ${INFO} "(${var}) unmeasurable" + echo " pmtud: unmeasurable" + else + v4pmtu_srv=`expr ${data} + 28` + write_json ${layer} IPv4 v4pmtu_srv ${INFO} "(${var}) ${v4pmtu_srv}" + echo " pmtu: ${v4pmtu_srv} MB" + fi + done +fi + +# Check PING6_SRVS parameter +if [ "X${PING6_SRVS}" = "X" ]; then + echo "ERROR: PING6_SRVS is null at configration file." 1>&2 + return 1 +fi + +if [ "X${v6addrs}" != "X" ]; then + # Do ping to extarnal IPv6 servers + for var in `echo ${PING6_SRVS} | sed 's/,/ /g'`; do + result=${FAIL} + echo " ping to extarnal IPv6 server: ${var}" + v6alive_srv=$(do_ping 6 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + fi + write_json ${layer} IPv6 v6alive_srv ${result} "(${var}) ${v6alive_srv}" + v6rtt_srv=$(get_rtt "${v6alive_srv}") + write_json ${layer} IPv6 v6rtt_srv ${INFO} "(${var}) ${v6rtt_srv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, rtt: ${v6rtt_srv} msec" + else + echo " status: ng" + fi + done + + # Do traceroute to extarnal IPv6 servers + for var in `echo ${PING6_SRVS} | sed 's/,/ /g'`; do + echo " traceroute to extarnal IPv6 server: ${var}" + v6path_srv=$(do_traceroute 6 ${var}) + write_json ${layer} IPv6 v6path_srv ${INFO} "(${var}) ${v6path_srv}" + echo " path: ${v6path_srv}" + done + + # Check path MTU to extarnal IPv6 servers + for var in `echo ${PING6_SRVS} | sed 's/,/ /g'`; do + echo " do pmtud to extarnal IPv6 server: ${var}" + data=$(do_pmtud 6 ${var} 1232 1453) + if [ ${data} -eq 0 ]; then + write_json ${layer} IPv6 v6pmtu_srv ${INFO} "(${var}) unmeasurable" + echo " pmtud: unmeasurable" + else + v6pmtu_srv=`expr ${data} + 48` + write_json ${layer} IPv6 v6pmtu_srv ${INFO} "(${var}) ${v6pmtu_srv}" + echo " pmtu: ${v6pmtu_srv} MB" + fi + done +fi + +sleep 2 + +#################### +## Phase 5 +echo "Phase 5: DNS Layer checking..." +layer="dns" + +# Clear dns local cache +#TBD + +# Check FQDNS parameter +if [ "X${FQDNS}" = "X" ]; then + echo "ERROR: FQDNS is null at configration file." 1>&2 + return 1 +fi + +if [ "X${v4addr}" != "X" ]; then + # Do dns lookup for A record by IPv4 + for var in `echo ${v4nameservers} | sed 's/,/ /g'`; do + echo " do dns lookup for A record by IPv4 nameserver: ${var}" + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + echo " do resolve server: ${fqdn}" + v4trans_a_namesrv=$(do_dnslookup ${var} a ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv4 v4trans_a_namesrv ${result} "(@${var}, resolv ${fqdn}) ${v4trans_a_namesrv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v4trans_a_namesrv}" + else + echo " status: ng ($stat)" + fi + done + done + + # Do dns lookup for AAAA record by IPv4 + for var in `echo ${v4nameservers} | sed 's/,/ /g'`; do + echo " do dns lookup for AAAA record by IPv4 nameserver: ${var}" + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + echo " do resolve server: ${fqdn}" + v4trans_aaaa_namesrv=$(do_dnslookup ${var} aaaa ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv4 v4trans_aaaa_namesrv ${result} "(@${var}, resolv ${fqdn}) ${v4trans_aaaa_namesrv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v4trans_aaaa_namesrv}" + else + echo " status: ng ($stat)" + fi + done + done +fi + +if [ "X${v6addrs}" != "X" ]; then + # Do dns lookup for A record by IPv6 + for var in `echo ${v6nameservers} | sed 's/,/ /g'`; do + echo " do dns lookup for A record by IPv6 nameserver: ${var}" + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + echo " do resolve server: ${fqdn}" + v6trans_a_namesrv=$(do_dnslookup ${var} a ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv6 v6trans_a_namesrv ${result} "(@${var}, resolv ${fqdn}) ${v6trans_a_namesrv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v6trans_a_namesrv}" + else + echo " status: ng ($stat)" + fi + done + done + + # Do dns lookup for AAAA record by IPv6 + for var in `echo ${v6nameservers} | sed 's/,/ /g'`; do + echo " do dns lookup for AAAA record by IPv6 nameserver: ${var}" + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + echo " do resolve server: ${fqdn}" + v6trans_aaaa_namesrv=$(do_dnslookup ${var} aaaa ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv6 v6trans_aaaa_namesrv ${result} "(@${var}, resolv ${fqdn}) ${v6trans_aaaa_namesrv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v6trans_aaaa_namesrv}" + else + echo " status: ng ($stat)" + fi + done + done +fi + +# Check GPDNS[4|6] parameter +if [ "X${GPDNS4}" = "X" ]; then + echo "ERROR: GPDNS4 is null at configration file." 1>&2 + return 1 +fi +if [ "X${GPDNS6}" = "X" ]; then + echo "ERROR: GPDNS6 is null at configration file." 1>&2 + return 1 +fi + +if [ "X${v4addr}" != "X" ]; then + # Do dns lookup for A record by GPDNS4 + echo " do dns lookup for A record by IPv4 nameserver: ${GPDNS4}" + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + echo " do resolve server: ${fqdn}" + v4trans_a_namesrv=$(do_dnslookup ${GPDNS4} a ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv4 v4trans_a_namesrv ${result} "(@${GPDNS4}, resolv ${fqdn}) ${v4trans_a_namesrv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v4trans_a_namesrv}" + else + echo " status: ng ($stat)" + fi + done + + # Do dns lookup for AAAA record by GPDNS4 + echo " do dns lookup for AAAA record by IPv4 nameserver: ${GPDNS4}" + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + echo " do resolve server: ${fqdn}" + v4trans_aaaa_namesrv=$(do_dnslookup ${GPDNS4} aaaa ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv4 v4trans_aaaa_namesrv ${result} "(@${GPDNS4}, resolv ${fqdn}) ${v4trans_aaaa_namesrv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v4trans_aaaa_namesrv}" + else + echo " status: ng ($stat)" + fi + done +fi + +if [ "X${v6addrs}" != "X" ]; then + # Do dns lookup for A record by GPDNS6 + echo " do dns lookup for A record by IPv6 nameserver: ${GPDNS6}" + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + echo " do resolve server: ${fqdn}" + v6trans_a_namesrv=$(do_dnslookup ${GPDNS6} a ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv6 v6trans_a_namesrv ${result} "(@${GPDNS6}, resolv ${fqdn}) ${v6trans_a_namesrv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v6trans_a_namesrv}" + else + echo " status: ng ($stat)" + fi + done + + # Do dns lookup for AAAA record by GPDNS6 + echo " do dns lookup for AAAA record by IPv6 nameserver: ${GPDNS6}" + for fqdn in `echo ${FQDNS} | sed 's/,/ /g'`; do + result=${FAIL} + echo " do resolve server: ${fqdn}" + v6trans_aaaa_namesrv=$(do_dnslookup ${GPDNS6} aaaa ${fqdn}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv6 v6trans_aaaa_namesrv ${result} "(@${GPDNS6}, resolv ${fqdn}) ${v6trans_aaaa_namesrv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, result: ${v6trans_aaaa_namesrv}" + else + echo " status: ng ($stat)" + fi + done +fi + +sleep 2 + +#################### +## Phase 6 +echo "Phase 6: Web Layer checking..." +layer="web" + +# Check V4WEB_SRVS parameter +if [ "X${V4WEB_SRVS}" = "X" ]; then + echo "ERROR: V4WEB_SRVS is null at configration file." 1>&2 + return 1 +fi + +if [ "X${v4addr}" != "X" ]; then + # Do curl to extarnal web servers by IPv4 + for var in `echo ${V4WEB_SRVS} | sed 's/,/ /g'`; do + result=${FAIL} + echo " curl to extarnal server: ${var} by IPv4" + v4http_srv=$(do_curl 4 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv4 v4http_srv ${result} "(${var}) ${v4http_srv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, http status code: ${v4http_srv}" + else + echo " status: ng ($stat)" + fi + done + + # Do measure http throuput by IPv4 + #TBD + # v4http_throughput_srv +fi + +# Check V6WEB_SRVS parameter +if [ "X${V6WEB_SRVS}" = "X" ]; then + echo "ERROR: V6WEB_SRVS is null at configration file." 1>&2 + return 1 +fi + +if [ "X${v6addrs}" != "X" ]; then + # Do curl to extarnal web servers by IPv6 + for var in `echo ${V6WEB_SRVS} | sed 's/,/ /g'`; do + result=${FAIL} + echo " curl to extarnal server: ${var} by IPv6" + v6http_srv=$(do_curl 6 ${var}) + if [ $? -eq 0 ]; then + result=${SUCCESS} + else + stat=$? + fi + write_json ${layer} IPv6 v6http_srv ${result} "(${var}) ${v6http_srv}" + if [ ${result} = ${SUCCESS} ]; then + echo " status: ok, http status code: ${v6http_srv}" + else + echo " status: ng ($stat)" + fi + done + + # Do measure http throuput by IPv6 + #TBD + # v6http_throughput_srv +fi + +sleep 2 + +#################### +## Phase 7 + +# Write campaign log file +write_json_campaign ${uuid} ${mac_addr} "${os}" ${ssid} + +# remove lock file +rm -f ${LOCKFILE} + +exit 0 diff --git a/windows/log/sindan_datalink_channel1441240445.38089.json b/windows/log/sindan_datalink_channel1441240445.38089.json new file mode 100644 index 0000000000000000000000000000000000000000..812a9a848d395525932cabe9df2259acc3851cf0 GIT binary patch literal 568 zcma)(OOC=Y5JYQ@Gb3hUzF}_jxsHeeh=R9AMnO za9PJ4E7PCWTGpa+rD!O?Za_bEB>DxtCKll9`c=q;sukFn9x2r`yzR;D3s)E20d9Ik z0G~%5ah5JareQT8o8!IjvNm@yZu_i+`;f|VeXFpr6s~uvv6|uJZ8G=C*PjMn^N;#z n&AcoBDHG3eym|CD8sp#7i2Yk}`RhCCv$tOl_|;0s$*H*lwh%*D literal 0 HcmV?d00001 diff --git a/windows/log/sindan_datalink_ifmtu1441240445.02764.json b/windows/log/sindan_datalink_ifmtu1441240445.02764.json new file mode 100644 index 0000000000000000000000000000000000000000..e90007650f49ad836b5aa16e72bc73b93e4a9b38 GIT binary patch literal 476 zcmaKp-3r1m4293N;5$gK6}CBlUuMiz$8b8)?Lx#?SHD*AZz7>-NOMk-)9dA=t~%;H z%&1a^HQHlKStUwU%V_Q^j3NaJHPV24=KYYD0Gn&57$5Lz)c@iw;W@&%f8(;AJ5{Md zTdjYhD&@>jgWZ9C%~5Ej4f*B|DuaImE`>j*Lqc^!Y~OfB%p9`G7z^nzAf9o%4P%tB zni4J8d*Y*rT*{^sPDVba(w+9k7M9xgE}#9Ja!#wZI`=(u^r@I}_e7W<%Syn7{ysb~ literal 0 HcmV?d00001 diff --git a/windows/log/sindan_datalink_ifstatus1441240445.02364.json b/windows/log/sindan_datalink_ifstatus1441240445.02364.json new file mode 100644 index 0000000000000000000000000000000000000000..8a5dc81d87546a90b23a00339d061d2f924373f0 GIT binary patch literal 484 zcmZvZ>k7g!4292c!FQ1TR@lw!%Sc^y45t&_1QB0d{aO`=lh8DzIVUIS<9=0NJq_L# zs8WVCI$~>CEoD?I(85;)iWMr-SR?Ma_X#f{wosxJAMzS#_`_SmbAj>L;E@6~88ti5hAugMmee=Iw#7C^dBi*uETYedc+TzS zOxcIkjA+I5Qy<0T4D(Jo8Tph-ce*MpEKX&?lwb7*R88*eXX@_ir95X_6X5_nGBP8@6Aje_p91! zsq;3YQaN_k5nIV>p-h#GroO_cr&x&winu4<_j!r2srpLsF|S75A6^H~1;%5*Wj%K$ zr;Ya7{za84=%E680R8D>qjivNs=aVI3OkS)3I!SqCOZ?`fN4P239}5b1dWJz!d=gp zvJ0y*(UQqWKI)Onn03U-$){A-r#Z8QrSjS?(3_(lX@+ki9Q&{5E!a~@r-uO7tge6P QM3wvcp@bhWe)~7?pGgTlwg3PC literal 0 HcmV?d00001 diff --git a/windows/log/sindan_datalink_noise1441240445.2558.json b/windows/log/sindan_datalink_noise1441240445.2558.json new file mode 100644 index 0000000000000000000000000000000000000000..5abbd700f53562cccf3a1c2806c1a1dbb4f02e1a GIT binary patch literal 484 zcmZvZO$x$5429oX@D4I-3vI2x2k;6mOYKMz$5ym1M7+BCbrh^t!em0`7v34g{^dt!gbGDdO491|>pKOmlS zck`v}!D~kJ$<$MeVsbfiPB{hnl*;b(Rd`rh>s?*@CAOz`dP{awqi}bvcUqx0&=TM8 T(EZO3_0_}wMD%dB`=j}PPRczX literal 0 HcmV?d00001 diff --git a/windows/log/sindan_datalink_rssi1441240445.2528.json b/windows/log/sindan_datalink_rssi1441240445.2528.json new file mode 100644 index 0000000000000000000000000000000000000000..bafb463b42dccdb5b17fdb1131442003df742d08 GIT binary patch literal 564 zcmaKp(Q3j#5Jm5^;6KPdH;^?^8$ZBb@Szk*vn7bJkr*GO^w(QYHm!~ABE#+syEAv@ z-ue1`*H|M>zRjpsft}P~uX5TbS1Y5X&oG)QmeouVKJ$0NPmC>h5LXADEl|@Yszx4D@ z&)lwOy=bE8!;ET`*ii@ULsq#8buwCo45OK1C7LVZUIw4?6Jsl-%J4D2Mz4Q(9Xux( z4?Qj$xC=Rb>RVreQmBar>5QWdR;5$gJDpbjz_2&(G*Ea|;ksxdv(HIc%)os67EM1yXhS?ovXU>^3 z`+2`=tdS-Ui`1&Z&N^Z{)hbk~Q>2Zrh?FW;qJ?JMYky|E#Mnlea?X@|q~~9_4x9^! z#{jF5gKx`=(+6+HGwf^CFhxiAftsI5df2RUubzCN6WIMf2o=@uV3c$;@D->$6W0Oe z0?dT@U$6w!8S$Fi^yciP){1D0#-)!^awWQ#ctt*^(tN0+2Bq`dF5r9e`^+?l%@FO* uV4TArYl_=$zkP^m`?KvdXm3$-2(VxE#y;{tX0e|=QSE}CP5gh|{P_ihmP2*` literal 0 HcmV?d00001 diff --git a/windows/log/sindan_globalnet_v6alive_srv1441240469.48597.json b/windows/log/sindan_globalnet_v6alive_srv1441240469.48597.json new file mode 100644 index 0000000000000000000000000000000000000000..6752032006a30c6f1455d0ae2541a9b121364fd0 GIT binary patch literal 532 zcmaKp-D-nC5QWcmq3=+3-QUEd%WEh22ABr24US5N!xCZIG@4!b+d&YanE z_UC%mv!3*Fho@F07<2@msGS;VG1_K(SVw8@I2y@j9~u!%$NF1xKL<#seJ#XwW!u z#wZAQe*ywnSHv4mt2e@zN*U1}jj4-5as|3mR!Kgh(ym7x6)e4*ZD#XcouAgxoW6{y r*2gKz$=&d_z-isH-qa{>(bCPBxB9@1WTDIc>xpVJ`&Zxn*2V3=J5QWdR(03@gYC$21F>2nxJKsQJA|bFE(HJPDudaTx3Wh2&><_y$-|RVi zIsfWI1AX2jP@{r4=|F5$YNcGQ0%blUP^?gqCK|EM{XFI-Br=VaFvpw+8vf%tI6n{% zJys=0zcn{bJMOH{b6ul~SF}{`$$7k_Q|c>gb)2tsgx$R%6l8B<8xIm5WGab+st zHg_vt6QW;vrPipZ$lh7ROG&}0(w5AFHh(e`5Le+p)$_rI>cjW)0sq!#H5qbdVt!!F gKb0uo)p(|w=|tsbmYLoGbpA0t&sH!KzuNgc09L9%vH$=8 literal 0 HcmV?d00001 diff --git a/windows/log/sindan_interface_v4addr1441240447.17816.json b/windows/log/sindan_interface_v4addr1441240447.17816.json new file mode 100644 index 0000000000000000000000000000000000000000..540571cb04934e1f8166dc5fd0cb20139663c540 GIT binary patch literal 512 zcmZvZ(Qbl35Jm5^iT_}DE(Qdo@&~^44;ln(NT?VE6Jz@8+B2(0EX`zhC%ZG}&g@(- zXN@(|iWIX4N{N5_!>!?*Antpt zN?X`=_r+_0_g`M44OO&c?_9*Ak|Sz46_$=U)Vt*s#C(&PtAewI)L|7_&z=%UA>GWe z5Dg!H!D(H_)K%&oZ$4p5!6s4GaJ0ovg;uN8-oQ6+AT`k{R4dvFB3@nn5)|qmOR~#mc6KLwzg^T; zOP!|$DrK-*2W%;;xiVD>lzK#Gn`_Dij*qAuDo7w6C!IZl%PZ1kbn6Hw*==6 z#N7#2p$cq^y>Of1&DGV~@`{e?#%ByKInb@5?v-fkQ4U_W|Da?(zd;wER^aZD0-nDN zQ*a}=T_X{Q0sabWoD*J|!!OVilURB$Cboh5l9Lfn$h0%%l7rIu-sQ31{b)|Z9_Fp% zJvRL-j(KK#ozC=|#~7khtQZVK?6FRN#ZWW04>LRNceQ1sHFIr_ES+w3C)?O`D)!G> PvdhswGiJ`u=ELi69rR7~ literal 0 HcmV?d00001 diff --git a/windows/log/sindan_interface_v4routers1441240447.19117.json b/windows/log/sindan_interface_v4routers1441240447.19117.json new file mode 100644 index 0000000000000000000000000000000000000000..929d1ef4cee716a6ffdd5fec456e7902e77f821e GIT binary patch literal 514 zcmaKpU24NX420*okUJDVH^G02W8a`}xj}L5G#H%3_@_`xub%eP;$jn*B6cOTnvq8P zef!i(4|*KU(^UmFsKt&d^`cz8JY}xJQz&17wp!y;cSpSVSf)rZx37fyr#s#no(~w? z8CRtX+?IRewIKQnch!k0deDul_?_gPZY}c;BS-fSx`6)-K34_X1-=2R&^IaD!WW=v zhXr(66Q_978Z%v~J<%&0NL&<>%h8;03i2_Pc9t4SSbEpHp7jgZ)P_zmc=I8w=9l;y im9~S^sJEH1JnJCa#1duy*P*he_oULgdhTz&-2DSNB|$_0 literal 0 HcmV?d00001 diff --git a/windows/log/sindan_interface_v6lladdr1441240448.27694.json b/windows/log/sindan_interface_v6lladdr1441240448.27694.json new file mode 100644 index 0000000000000000000000000000000000000000..4fd869a99b835ade0b1d5589026bacb7df43214b GIT binary patch literal 544 zcmZvZ(MrQm42J*ff$ty%?<}-kw|3_Zyz>o4*V<7yTgU7MLwt4JccNmoBP1u}B!BWJ zpC50!(@gi@5~){>oODE9)M%|rgCaT0h?FT&s)b_SmDxEz3F0(Yj!jgO|M(BrgL47# zIKt|*2Rp=Cervp2b-lJsF;IQ5jGsx)TFN68Q#OV>?fF$(le43`QU}%^v=h=%^~-C) z>?w?vNJ^g=f5jV^=FHZ>D%J-6g?SmV3dRLm6VJ&EI%Uv+GFWdv>emu2ZEMaDL$#xG zN&gJ5#pdKVA}yNff#2c=zUO9PLtA#x!|O2W@}y^lJx!+y*L@}1|G93;M3G(Y-Ru<> C9Yq}g literal 0 HcmV?d00001 diff --git a/windows/log/sindan_interface_v6routers1441240448.28294.json b/windows/log/sindan_interface_v6routers1441240448.28294.json new file mode 100644 index 0000000000000000000000000000000000000000..fc71aeff26402348306455299cb2c432fd5c36c0 GIT binary patch literal 494 zcmaKpT?)cL420)d@D8%i7Fw-;y@7AuKx(T}sI6!#hwu2_|fB9~#*ldnJndE66c`@HxdQePp~*O>h77jF*F5yssISEd4P z8(Z<3;QgvAwPuQn>aELoPIAzY%92^{9Q!}j3H%%CV`Z=v@YNtg-&@&$=>s$kK|m)D zf5L6GhD?{D%hQ4%7&)&;EJpK)lMoNdw5O>dg{5-6^H;xu{yAv=(_QcSp>6xBFq WtGe02?rQHCKX(C;4nT1L literal 0 HcmV?d00001 diff --git a/windows/log/sindan_localnet_v4alive_namesrv1441240460.95793.json b/windows/log/sindan_localnet_v4alive_namesrv1441240460.95793.json new file mode 100644 index 0000000000000000000000000000000000000000..9ff14bbbd0a6893d4cedcf8ecc8a7b6a57bbbd84 GIT binary patch literal 586 zcmaKq-Acni5QWdR;5(FDDOgF;#M-`rcfLW1iIl*$32hn>@zvFDMxl#Q8D@5}bLPxX z_T&9km%7mGTM~7uk&_O{vl?wwX;7lIBNF9Gm8sO6bLDnHBt_O*sK6Q`(ajIu0M84I zhlne9wMs#IB35OZ)oDu)1Gznza~~tMEVI?f{RW0gJG>(m#($V<$Mx72<~^Awq-D}G zcL{gKbazMw=Nx~uH7a&ci^E9vwUOPnfuBc*Ly+zHl z^UId7%={~k=G+>_qSqj8|9|PU2iv;sbjzkXX78g;9`wleieEan*Kh $params["LOCKFILE_SENDLOG"] +} + +foreach ($jsonlog in (Get-ChildItem .\log)) { + $notdelete = 0 + $body = Get-Content ("log\"+$jsonlog.Name) -Encoding UTF8 -Raw | ConvertFrom-Json + + try { + echo (ConvertTo-Json $body) + Invoke-RestMethod -Method Post -Uri http://fluentd.c.u-tokyo.ac.jp:8888/sindan.log -Body (ConvertTo-Json $body) -ContentType "application/json" + } catch { + $notdelete = 1 + } + + if ($notdelete -ne 1) { + Remove-Item ("log\"+$jsonlog.Name) + } +} + +Remove-Item $params["LOCKFILE_SENDLOG"] \ No newline at end of file diff --git a/windows/sindan.conf b/windows/sindan.conf new file mode 100644 index 0000000..5966d48 --- /dev/null +++ b/windows/sindan.conf @@ -0,0 +1,33 @@ +# SINDAN Configuration file +# version 0.9 + +# lock file +LOCKFILE=.\sindan.isrunning +LOCKFILE_SENDLOG=.\sendlog.isrunning + +# result parameters +FAIL=0 +SUCCESS=1 +INFO=10 + +# reconnect flag (yes or no) +RECONNECT=yes + +# target interface +IFTYPE=Wi-Fi + +# airport command +AIRPORT=/System/Library/PrivateFrameworks/Apple80211.framework/Versions/Current/Resources/airport + +# target servers +PING_SRVS=8.8.8.8,203.178.139.60 +PING6_SRVS=2001:4860:4860::8888,2001:200:0:180c::6 + +# servers for name resolution +FQDNS=dual.imc.kanazawa-u.ac.jp,v4only.imc.kanazawa-u.ac.jp,v6only.imc.kanazawa-u.ac.jp +GPDNS4=8.8.8.8 +GPDNS6=2001:4860:4860::8888 + +# servers for web comminication +V4WEB_SRVS=www.wide.ad.jp,www.yahoo.co.jp +V6WEB_SRVS=www.wide.ad.jp,www.google.co.jp \ No newline at end of file diff --git a/windows/sindan.ps1 b/windows/sindan.ps1 new file mode 100644 index 0000000..3cd51ff --- /dev/null +++ b/windows/sindan.ps1 @@ -0,0 +1,480 @@ +$params = @{ } +$body = @{ } + +function read_conf($filename) +{ + $lines = get-content $filename + foreach($line in $lines){ + # コメントと空行を除外する + if($line -match "^$"){ continue } + if($line -match "^\s*;"){ continue } + + $param = $line.split("=",2) + + $params[$param[0]] = $param[1] + } +} + +read_conf ".\sindan.conf" + +function resolve_check($fqdns, $dns_server, $group, $type, $dnstype) { + foreach ($fqdn in $fqdns) { + try { + $result = 1 + if ($dns_server) { + $dns_results = Resolve-DnsName $fqdn $dnstype -DnsOnly -Server $dns_server + } else { + $dns_results = Resolve-DnsName $fqdn $dnstype -DnsOnly + } + } catch { + $result = 0 + } + $detail = "" + foreach ($dns_result in $dns_results) { + if ($dns_result.Section -eq 1) { + if($dns_result.IPAddress) { + $detail = $detail + $dns_result.IPAddress + $detail = $detail + " " + } + } + } + if ($detail -ne "") { + write_json "dns" $group $type $result $detail + } + } + +} + +function ping_check($target_host, $layer, $group, $type) { + $ping = Test-Connection $target_host + if (($ping.StatusCode -join ' ') -eq "0 0 0 0") { + write_json $layer $group $type 1 ("("+$target_host+")"+$ping.StatusCode -join ' ') + } else { + write_json $layer $group $type 0 ("("+$target_host+")"+$ping.StatusCode -join ' ') + } +} + +function ConvertTo-DottedDecimalIP { + <# + .Synopsis + Returns a dotted decimal IP address from either an unsigned 32-bit integer or a dotted binary string. + .Description + ConvertTo-DottedDecimalIP uses a regular expression match on the input string to convert to an IP address. + .Parameter IPAddress + A string representation of an IP address from either UInt32 or dotted binary. + #> + + [CmdLetBinding()] + param( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] + [String]$IPAddress + ) + + process { + Switch -RegEx ($IPAddress) { + "([01]{8}.){3}[01]{8}" { + return [String]::Join('.', $( $IPAddress.Split('.') | ForEach-Object { [Convert]::ToUInt32($_, 2) } )) + } + "\d" { + $IPAddress = [UInt32]$IPAddress + $DottedIP = $( For ($i = 3; $i -gt -1; $i--) { + $Remainder = $IPAddress % [Math]::Pow(256, $i) + ($IPAddress - $Remainder) / [Math]::Pow(256, $i) + $IPAddress = $Remainder + } ) + + return [String]::Join('.', $DottedIP) + } + default { + Write-Error "Cannot convert this format" + } + } + } +} + +function ConvertTo-Mask { + <# + .Synopsis + Returns a dotted decimal subnet mask from a mask length. + .Description + ConvertTo-Mask returns a subnet mask in dotted decimal format from an integer value ranging + between 0 and 32. ConvertTo-Mask first creates a binary string from the length, converts + that to an unsigned 32-bit integer then calls ConvertTo-DottedDecimalIP to complete the operation. + .Parameter MaskLength + The number of bits which must be masked. + #> + + [CmdLetBinding()] + param( + [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)] + [Alias("Length")] + [ValidateRange(0, 32)] + $MaskLength + ) + + Process { + return ConvertTo-DottedDecimalIP ([Convert]::ToUInt32($(("1" * $MaskLength).PadRight(32, "0")), 2)) + } +} +# Create UUID +$campaign_uuid = [guid]::NewGuid().ToString(); + +function write_json($layer, $group, $type, $result, $detail) { + $json_data = @{ } + + $json_data["layer"] = $layer + $json_data["log_group"] = $group + $json_data["log_type"] = $type + $json_data["result"] = $result + $json_data["detail"] = $detail + $json_data["occurred_at"] = Get-Date -Format "yyyy-MM-dd HH:mm:ss" + $json_data["log_campaign_uuid"] = $campaign_uuid + + echo (ConvertTo-Json $json_data) > ("log\sindan_"+$layer+"_"+$type+(Get-Date -Uformat %s)+".json") +} + +$destructive=1 + +################# +## Phase 0 + +# Set lock file + +function GetCurrentSSID() { + return (netsh wlan show interfaces) -Match 'プロファイル' -NotMatch '接続モード' -Replace "^\s+プロファイル\s+:\s+", "" -Replace "\s+$", "" +<# + $WifiGUID = (Get-NetAdapter -Name $params["IFTYPE"]).interfaceGUID + + $InsterfacePath = "C:\ProgramData\Microsoft\Wlansvc\Profiles\Interfaces\" + foreach ($WifiGUID in $WifiGUIDs) { + $WifiPath = Join-Path $InsterfacePath $WifiGUID + $WifiXmls = Get-ChildItem -Path $WifiPath -Recurse + } + + foreach ($wifixml in $WifiXmls) { + [xml]$x = Get-Content -Path $wifixml.FullName + + [PSCustomObject]@{ + FileName = $WifiXml.FullName + WifiName = $x.WLANProfile.Name + ConnectionMode = $x.WLANProfile.ConnectionMode + SSIDName = $x.WLANProfile.SSIDConfig.SSID.Name + SSIDHex = $x.WLANProfile.SSIDConfig.SSID.Hex + } + } +#> +} + +<# +function GetInterfaces() { +# $body["layer"] = "Layer2"; + $body["occurred_at"] = Get-Date -Format "yyyy-MM-dd HH:mm:ss" +# $body["log_group"] = "Wired" +# $body["log_type"] = "Media" + + # Get devicename + $interface = (Get-NetAdapter -Name $params["IFTYPE"]).interfaceGUID + + $body["detail"] = $interface + + # Get MAC address + $body["mac_addr"] = ((Get-NetAdapter -Name $params["IFTYPE"]).MacAddress -replace ("-", ":")).ToLower() + $body["log_campaign_uuid"] = $campaign_uuid + + # Get OS version + $body["os"]=(Get-WmiObject Win32_OperatingSystem).Name.split("|")[0] + + # Register log_unit_id + Invoke-RestMethod -Method Post -Uri http://fluentd.c.u-tokyo.ac.jp:8888/sindan.log_campaign -Body (ConvertTo-Json $body) -ContentType "application/json" +# Invoke-RestMethod -Method Post -Uri http://fluentd.c.u-tokyo.ac.jp:8888/sindan.log -Body (ConvertTo-Json $body) -ContentType "application/json" + +# for($i=0; $i -lt $interfaces.Length ; $i++) { +# $body["detail"] = $interfaces[$i] +# Invoke-RestMethod -Method Post -Uri http://fluentd.c.u-tokyo.ac.jp:8888/sindan.log -Body (ConvertTo-Json $body) -ContentType "application/json" +# } +} +#> + +function RegisterCampaingLog() { + # Set Date + $body["occurred_at"] = (Get-Date).ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss") + + # Get MAC address + $body["mac_addr"] = ((Get-NetAdapter -Name $params["IFTYPE"]).MacAddress -replace ("-", ":")).ToLower() + $body["log_campaign_uuid"] = $campaign_uuid + + # Get OS version + $body["os"]=(Get-WmiObject Win32_OperatingSystem).Name.split("|")[0] + $body["ssid"] = GetCurrentSSID + + # Register campaign id + Invoke-RestMethod -Method Post -Uri http://sindan-dev.c.u-tokyo.ac.jp:8888/sindan.log_campaign -Body (ConvertTo-Json $body) -ContentType "application/json" + +} + + +RegisterCampaingLog + +################## +### Phase 1 +echo "Phase 1: Datalink Layer checking..." +$layer = "datalink" + +if ($destructive) { + # Record current ssid + $ssid = GetCurrentSSID +# echo $ssid_profile + # If up/down + echo "Interface Up/Down..." + netsh interface set interface name= $params["IFTYPE"] admin=DISABLED + sleep 1 + netsh interface set interface name= $params["IFTYPE"] admin=ENABLED + + # Change to recorded ssid + sleep 5 + netsh wlan connect ssid=$ssid name=$ssid +} + +sleep 2 +$netadapter = Get-NetAdapter -Name $params["IFTYPE"] + +# Check I/F status +$result = 0 +if ($netadapter.Status -eq 'Up') { + $result = 1 + $ifstatus = 'active' +} else { + $result = 0 + $ifstatus = 'inactive' +} +write_json $layer "" ifstatus $result $ifstatus + +# Get iftype +write_json $layer "" iftype $params['INFO'] $params['IFTYPE'] + +# Get ifmtu +write_json $layer "" ifmtu $params['INFO'] $netadapter.MtuSize + +# Wi-Fi +if ($params["IFTYPE"] -eq 'Wi-Fi') { + # Get Wi-Fi SSID + $ssid = GetCurrentSSID + write_json $layer "Wi-Fi" ssid $params['INFO'] $ssid + + # Get Wi-Fi RSSI + $rssi = (netsh wlan show interfaces) -Match 'シグナル' -Replace "^\s+シグナル\s+:\s+", "" -Replace "\s+$", "" -Replace "%", "" + write_json $layer "Wi-Fi" rssi $params['INFO'] $rssi + + # Get Wi-Fi noise + write_json $layer "Wi-Fi" noise $params['INFO'] '-' + + # Get Wi-Fi rate + write_json $layer 'Wi-Fi' rate $params['INFO'] (($netadapter.speed)/1000000) + + # Get Wi-Fi channel + $channel = (netsh wlan show interfaces) -Match 'チャネル' -Replace "^\s+チャネル\s+:\s+", "" -Replace "\s+$", "" -Replace "%", "" + write_json $layer "Wi-Fi" channel $params['INFO'] $channel + +} else { + # Get media type +} + +#Get-NetAdapter + +################## +### Phase 2 + +echo "Phase 2: Interface Layer checking..." +$layer = 'interface' + +$ifindex = (Get-NetIPInterface 'Wi-Fi' -AddressFamily IPv6).ifIndex + +$ipinterface = Get-NetIPInterface $params["IFTYPE"] -AddressFamily 'IPv4' +$ip6interface = Get-NetIPInterface $params["IFTYPE"] -AddressFamily 'IPv6' +$ipconfig = (Get-NetIPConfiguration $params["IFTYPE"]) + +# Get if configuration +if ($ipinterface.Dhcp -eq 'Enabled') { + $v4ifconf = 'dhcp' +} else { + $v4ifconf = 'static' +} +write_json $layer 'IPv4' v4ifconf $params['INFO'] $v4ifconf + +# Get IPv4 address +write_json $layer 'IPv4' v4addr $params['INFO'] $ipconfig.IPv4Address.IPAddress + +# Get IPv4 netmask +write_json $layer 'IPv4' netmask $params['INFO'] (ConvertTo-Mask $ipconfig.IPv4Address.PrefixLength) + +# Get IPv4 routers +$ipv4gateway = $ipconfig.IPv4DefaultGateway.NextHop +write_json $layer 'IPv4' v4routers $params['INFO'] $ipv4gateway + +# Get IPv4 name servers +$ipv4nameserver = ((Get-NetIPConfiguration 'Wi-FI').DNSServer | Where-Object {$_.AddressFamily -eq 2}).ServerAddresses +write_json $layer 'IPv4' v4nameservers $params['INFO'] $ipv4nameserver + +# Get IPv4 NTP servers + +# Get IPv6 linklocal address +$v6addrs = (Get-NetIPAddress -InterfaceIndex $ifindex -AddressFamily IPv6) +foreach ($v6addr in $v6addrs) { + if ($v6addr.PrefixOrigin -eq 'WellKnown') { + write_json $layer 'IPv6' v6lladdr $params['INFO'] $v6addr.IPv6Address + } +} +# Get IPv6 RA prefix + +# if RA prefix present + # Get IPv6 RA prefix flags + # Get IPv6 RA flags + # Get Ipv6 address + # Get IPv6 routers + $ipv6gateway = $ipconfig.IPv6DefaultGateway.NextHop + write_json $layer 'IPv6' v6routers $params['INFO'] $ipv6gateway + # Get IPv6 name servers + + # Get IPv6 NTP servers +# fi + +# Report phase 2 results + +################## +### Phase 3 + +echo "Phase 3: Localnet Layer checking..." +$layer = "localnet" + +# Do ping to IPv4 routers +ping_check $ipv4gateway $layer 'IPv4' 'v4alive_router' + +# Do ping to IPv4 nameservers +ping_check $ipv4nameserver $layer 'IPv4' 'v4alive_namesrv' + +# Do ping to IPv6 routers +if ($ipv6gateway) { + ping_check $ipv6gateway $layer 'IPv6' 'v6alive_router' +} + +# Do ping to IPv6 nameservers +if ($ipv6nameserver) { + ping_check $ipv6nameserver $layer 'IPv6' 'v6alive_namesrv' +} + +################## +### Phase 4 +echo "Phase 4: Globalnet Layer checking..." +$layer="globalnet" + +# Check PING_SRVS parameter +if ($params["PING_SRVS"]) { + # Do ping to external IPv4 servers + foreach ($target in ($params["PING_SRVS"] -split ",")) { + ping_check $target $layer 'IPv4' 'v4alive_srv' + } +} + +# Do traceroute to external IPv4 servers + +# Check path MTU to external IPv4 servers + +# Check PING6_SRVS parameter +if ($params["PING6_SRVS"]) { + # Do ping to external IPv6 servers + foreach ($target in ($params["PING6_SRVS"] -split ",")) { + ping_check $target $layer 'IPv6' 'v6alive_srv' + } +} + +# Do traceroute to external IPv6 servers + +# Check path MTU to external IPv6 servers + +################## +### Phase 5 +echo "Phase 5: DNS Layer checking..." + +$layer="dns" +# Clear dns local cache +echo "flushing DNS caches..." +Clear-DnsClientCache + +# Check FQDNS parameter +if ($params["FQDNS"]) { + $fqdns = $params["FQDNS"] -split "," + + # Do dns lookup for A record by IPv4 + resolve_check $fqdns "" 'IPv4' v4trans_a_namesrv 'A' + + # Do dns lookup for AAAA record by IPv4 + resolve_check $fqdns "" 'IPv4' v4trans_aaaa_namesrv 'AAAA' + + # Do dns lookup for A record by IPv6 + resolve_check $fqdns "" 'IPv6' v6trans_a_namesrv 'A' + + # Do dns lookup for AAAA record by IPv6 + resolve_check $fqdns "" 'IPv6' v6trans_aaaa_namesrv 'AAAA' + + # Check GPDNS[4|6] parameter + if ($params["GPDNS4"]) { + # Do dns lookup for A record by GPDNS4 + resolve_check $fqdns $params["GPDNS4"] 'IPv4' v4trans_a_namesrv 'A' + + # Do dns lookup for AAAA record by GPDNS4 + resolve_check $fqdns $params["GPDNS4"] 'IPv4' v4trans_aaaa_namesrv 'AAAA' + } + if ($params["GPDNS6"]) { + # Do dns lookup for A record by GPDNS6 + resolve_check $fqdns $params["GPDNS6"] 'IPv6' v6trans_a_namesrv 'A' + + # Do dns lookup for AAAA record by GPDNS6 + resolve_check $fqdns $params["GPDNS6"] 'IPv6' v6trans_aaaa_namesrv 'AAAA' + + } + +} + +################## +### Phase 6 +echo "Phase 6: Web Layer checking..." +$layer="web" + +# Check V4WEB_SRVS parameter +if($params["V4WEB_SRVS"]) { + + foreach ($v4target in ($params["V4WEB_SRVS"] -split ',')) { + $webresult = Invoke-WebRequest $v4target + if ($webresult.StatusDescription -eq "OK") { + $result = 1 + } else { + $result = 0 + } + write_json $layer 'IPv4' v4http_srv $result $webresult.StatusCode + } +} + +if($params["V6WEB_SRVS"]) { + + foreach ($v6target in ($params["V6WEB_SRVS"] -split ',')) { + $webresult = Invoke-WebRequest $v6target + if ($webresult.StatusDescription -eq "OK") { + $result = 1 + } else { + $result = 0 + } + write_json $layer 'IPv6' v6http_srv $result $webresult.StatusCode + } +} + +################## +### Phase 7 + +# write log file + +# remove lock file + +exit 0 + + +