RV-230SEの情報を取得するshell script

/usr/local/bin/chkgwipという名前で、次のようなシェルプログラムを作ってみた。

RV-230SEのファームウェアの更新によって、Web画面のメッセージの表示形式が変わってしまい、下記のスクリプトではIPアドレスの情報を拾えなくなった。新しいバージョンは“RV-230SEの情報を取得するシェルスクリプト Ver.2”に載せておいた。

     1	#! /bin/sh
     2	
     3	# chkgwip Ver 0.0000000001 (2008/03/27)
     4	# Copyright (C) 2008 Adsaria
     5	
     6	# This program is free software; you can redistribute it and/or
     7	# modify it. This program is distributed in the hope
     8	# that it will be useful, but WITHOUT ANY WARRANTY.
     9	
    10	CMD=`basename $0`
    11	
    12	GATEWAY_IP_FILE=/var/local/gatewayip
    13	
    14	#################### Environment dependent variables
    15	GATEWAY_USER=********
    16	GATEWAY_PASSWORD=********
    17	MAIL_TO=********@********.jp
    18	MAIL_SUBJECT="RV-230SE_Report"
    19	ZIP_PASSWORD=********
    20	####################
    21	
    22	TMP_FILE=/tmp/${CMD}_$$.txt ; rm -f $TMP_FILE
    23	TMP_ZIP_FILE=${TMP_FILE}.zip
    24	
    25	MessageAndLog () {
    26	#	echo "$1"
    27		logger "$1"
    28	}
    29	
    30	wget -q -O "$TMP_FILE" \
    31		--http-user="$GATEWAY_USER" \
    32		--http-password="$GATEWAY_PASSWORD" \
    33		'http://ntt.setup/cgi-bin/main.cgi?mbg_webname=status'
    34	
    35	if [ $? -ne 0 ]; then
    36		MessageAndLog "$CMD: Can not connect to the gateway."
    37		rm -f $TMP_FILE
    38		exit 1
    39	fi
    40	
    41	sed -i -e "1,/^WAN IP/d" $TMP_FILE
    42	WAN_IP=`head -1 $TMP_FILE | awk -F '[:<>]' '{print $4}'`
    43	
    44	sed -i -e "1,/^Peer IP/d" $TMP_FILE
    45	PEER_IP=`head -1 $TMP_FILE | awk -F '[:<>]' '{print $4}'`
    46	
    47	sed -i -e "1,/^DNS Server/d" $TMP_FILE
    48	DNS_SERVER=`head -1 $TMP_FILE | awk -F '[:<>]' '{print $4}'`
    49	
    50	SEND_MAIL=no
    51	if [ -f $GATEWAY_IP_FILE ]; then
    52		PREV_WAN_IP=`head -1 $GATEWAY_IP_FILE`
    53		if [ "$PREV_WAN_IP" != "$WAN_IP" ]; then
    54			MessageAndLog "$CMD: New gateway IP address: $WAN_IP"
    55			SEND_MAIL=yes
    56			echo $WAN_IP > $GATEWAY_IP_FILE
    57		else
    58			MessageAndLog "$CMD: gateway IP address is unchanged."
    59		fi
    60	else
    61		SEND_MAIL=yes
    62		echo $WAN_IP > $GATEWAY_IP_FILE
    63	fi
    64	
    65	if [ $SEND_MAIL = "yes" ]; then
    66		rm -f $TMP_FILE
    67		echo "$CMD:New gateway IP address: $WAN_IP" >> $TMP_FILE
    68		echo "	New peer IP address:	$PEER_IP" >> $TMP_FILE
    69		echo "	New dns IP address:	$DNS_SERVER" >> $TMP_FILE
    70		zip -q -P "$ZIP_PASSWORD" - $TMP_FILE > $TMP_ZIP_FILE
    71		echo "Gateway IP address have been changed." | \
    72			mutt -s "$MAIL_SUBJECT" -a $TMP_ZIP_FILE -- $MAIL_TO
    73	fi
    74	
    75	rm -f $TMP_FILE
    76	rm -f $TMP_ZIP_FILE
    77	exit 0

もともと、RV-230SEという機種に依存したプログラムなので汎用性はあまり考えずに各種パラメータもハードコーディングしてしまった。(汎用性を高めるのあれば、ユーザ名やメールアドレスは引数で渡すべきだろう。)ただし、環境に依存する変数は15〜19行目にまとめてあるので、ここを変えればある程度の環境には対応できると思う。

コマンドライン・インタフェースを持ったルータであればtelnetssh)を使ってもう少し柔軟にやり取りできるが、WebインタフェースをしかないとwgetでターゲットなるHTMLページを持ってくるしかないだろう(30行目)。(ポート80番に対してtelnetを使ってHTMLページを取得する方法もあるが、wgetを使ったほうが楽だ。)この方法だと、一旦ページを取得して、人間が解析してプログラムを組む必要がある(41〜48行目)。ファームウェアのアップデートなどでページの構成が変わった場合にはプログラムを変更する必要があるかも知れない。ただ、基本的には同じ方法で他の機器にも応用はできる。