#!/bin/sh # export LANG=C # . /lib/lib.scripthelper.sh # export NETWORKENVFILE='/tmp/network.env' # if [ ! -s "$NETWORKENVFILE" ] then dlog "WARNING: NETWORKENVFILE $NETWORKENVFILE no exist or empty." exit 0 fi . "$NETWORKENVFILE" case "$NETWORKACTION" in renew|bound|connected) NETWORKACTION="$NETWORKACTION" ;; deconfig) exit 0 ;; *) dlog "ERROR: unknow NETWORKACTION: $NETWORKACTION" exit 0 ;; esac # #echo "$INTERFACE $PHYDEV $ROUTER $SUBNET $ISPDNS $ISPSERVERID $IPADDR $ISPDOMAIN $ISPSERVERID" | grep -q ' ' echo "$INTERFACE $PHYDEV $ROUTER $SUBNET $ISPDNS $ISPSERVERID $IPADDR $ISPSERVERID" | grep -q ' ' if [ $? -eq 0 ] then dlog "ERROR: no all ENV VAR exported: $NETWORKENVFILE" dlog "INFO: dhcp client $NETWORKACTION, INTERFACE=$INTERFACE PHYDEV=$PHYDEV ROUTER=$ROUTER SUBNET=$SUBNET ISPDNS=$ISPDNS ISPSERVERID=$ISPSERVERID IPADDR=$IPADDR ISPDOMAIN=$ISPDOMAIN ISPSERVERID=$ISPSERVERID" exit 1 fi # #sample info, do not remove #ENV: #ARGS:deconfig/bound/renew #INTERFACE=wan #interface=eth0.2 #ROUTER=10.237.100.1 #IPADDR=10.237.100.118 #SUBNET=255.255.255.0 #mask=24 #ISPDOMAIN=mioffice.cn #ISPDNS=10.237.8.8 #ISPSERVERID=10.237.8.8 #lease=432000 #sample info, do not remove #arping -D -f -w 5 -I eth0.2 -s 0.0.0.0 10.237.100.66 #ARPING to 10.237.100.66 from 10.237.100.118 via eth0.2 #Unicast reply from 10.237.100.66 [14:fe:b5:e6:fc:68] 0.385ms #Sent 1 probe(s) (1 broadcast(s)) #Received 1 replies (0 request(s), 0 broadcast(s)) #check arp of IPADDR befor bound, return 0 for ok, 1 for error, and write syslog #compare wan IPADDR/mask to lan IPADDR/mask befor_bound(){ test "$PHYDEV" != 'eth0.2' && return 0 test -z "$IPADDR" && return 0 arping -D -f -w 5 -I $PHYDEV -s 0.0.0.0 $IPADDR > /tmp/dhcp.${PHYDEV}.befor_bound.log 2>&1 dupmac=$(cat /tmp/dhcp.${PHYDEV}.befor_bound.log | grep "reply from $IPADDR "|head -n 1|tr -d '[]'|awk '{print $5}'|tr '[a-z]' '[A-Z]') if [ -n "$dupmac" ] then dlog "#" dlog "INFO: arping -D -f -w 5 -I $PHYDEV -s 0.0.0.0 $IPADDR" dlog "ERROR: interface ${INTERFACE}(${interface} $(ifconfig eth0.2|grep 'HWaddr '|awk '{print $5}')) $IPADDR confict:" dlog "INFO: got lease IPADDR $IPADDR from dhcp server ${ISPSERVERID}, but confict with host ${dupmac}" dlog "INFO: contract your network administartor for help." cat /tmp/dhcp.${PHYDEV}.befor_bound.log | pipelog dlog return 1 fi return 0 } # #check gateway arp/ping ISPDNS/resolv ISPDNS after bound, return 0 for ok, 1 for error, and write syslog after_bound(){ errcode=0 if [ "$PHYDEV" = 'eth0.2' ] then if [ -n "$ROUTER" ] then arping -f -w 5 -I $PHYDEV -s 0.0.0.0 $ROUTER > /tmp/dhcp.${PHYDEV}.after_bound.log 2>&1 dupmac=$(cat /tmp/dhcp.${PHYDEV}.after_bound.log | grep "reply from $ROUTER "|head -n 1|tr -d '[]'|awk '{print $5}'|tr '[a-z]' '[A-Z]') if [ -z "$dupmac" ] then dlog "#" dlog "INFO: arping -f -w 5 -I $PHYDEV -s 0.0.0.0 $ROUTER" dlog "ERROR: got ROUTER IPADDR $ROUTER from dhcp server ${ISPSERVERID}, but arping failed." dlog "INFO: contract your network administartor for help." cat /tmp/dhcp.${PHYDEV}.after_bound.log | pIPADDRedlog errcode=1 fi else dlog "#" dlog "WARNING: dhcp server ${ISPSERVERID} do not offer default ROUTER." fi #192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 br-lan lannet=$(ip route list dev br-lan | head -n1|pipegetspacepos 1) wannet=$(ip route list dev eth0.2 | head -n1|pipegetspacepos 1) if [ "$lannet" = "$wannet" ] then dlog "#" dlog "WARNING: wan network $wannet is confict with lan network $lannet" dlog "WARNING: wan link will not work." dlog "INFO: contract your network administartor for help." fi fi if [ -n "$ISPDNS" ] then ISPDNSokcnt=0 for onedup in 1 2 3 4 5 do for oneISPDNS in $ISPDNS do addrlist=`/usr/sbin/nslookupt 127.0.0.1 $oneISPDNS 3` ret=`echo "$addrlist" | awk -F'/' '{print $3}'` if [ -n "$ret" ] then let ISPDNSokcnt=$ISPDNSokcnt+1 slog defun-${oneISPDNS} release else slog defun-${oneISPDNS} dlog "#" slog defun-${oneISPDNS} dlog "WARNING: ISPDNS server $oneISPDNS check failed." fi done if [ $ISPDNSokcnt -ne 0 ] then break fi done if [ $ISPDNSokcnt -eq 0 ] then dlog "#" dlog "WARNING: all ISPDNS server $ISPDNS check failed." errcode=1 fi else dlog "#" dlog "WARNING: dhcp server ${ISPSERVERID} do not offer DNS server." fi return $errcode } # #run in daemon # if [ "$1" != 'nodaemon' ] then # procdaemon mute # dlog "INFO: $NETWORKACTION, INTERFACE=$INTERFACE PHYDEV=$PHYDEV ROUTER=$ROUTER SUBNET=$SUBNET ISPDNS=$ISPDNS ISPSERVERID=$ISPSERVERID IPADDR=$IPADDR ISPDOMAIN=$ISPDOMAIN ISPSERVERID=$ISPSERVERID" # sleep 10 # fi # befor_bound test $? -ne 0 && dlog "WARNING: dhcp client $NETWORKACTION, befor_bound check failed." sleep 1 after_bound test $? -ne 0 && dlog "WARNING: dhcp client $NETWORKACTION, after_bound check failed." exit 0 #