|
一个EXPECT程序注释
author:bobkey
date:2007.9.17
mail:toqinbo AT msn.com
上上个周末,我在外地临时抱佛脚写的,由于对expect不深入了解,幸亏得到waker 版主的远程指导,在此衷心地谢谢热心的waker。
现在把这个比较烂的东东贴出来共享,希望能给有需要的人带来启发和帮助,并希望高手能指点改进,在技术上获得提升。
首先,简单说说实现过程:
1.启动交互式程序,然后发送特定指令到网络,并把要发送的号码作为“增加”,会在远程设备上标价一个未知的动态PID值。
2.启动交互式程序,发送查看PID值,用expect -re获得PID值,然后赋值给一个变量,再次发送一个删除指令,把刚才获得的PID作为本指令
的一个参数执行,执行后返回相应的信息,信息有成功、或者各种失败的描述。
3.把每次执行的时间、号码参数、执行种类{del|add}、返回信息记录到日志里。
以下是比较罗嗦的各个部分的描述,为了不泄露客户信息系统的细节,我把关键指令和返回信息用ABC做了替换修改。
整个shell脚本分成块功能,主要是控制整个程序执行流程,提供输入和输出,输入部分是add/del、号码,输出包括屏幕回显消息给监控人
员和日志文件给管理员。对设备操作程序主体其实在两个expect脚本上。
Shell的功能说明:
1. 定义变量,校验输入的参数,是否是两个,是否是号码白名单,由于程序执行需要调用另一个expect脚本,为了方便操作,把变量以
参数形式传递调用;
2. 生成add.exp 和del.exp脚本;
3. 增加函数,负责调用add.exp脚本执行对所输入的号码到设备的新增,并把执行成功的反馈值生成一个以号码命名的文件,内容是新增
成功的设备主机名,同时收集反馈结果输送到日志文件;
4. 删除函数,负责调用del.exp脚本执行对所输入的号码从对应的设备执行删除,此处不需要轮询16台设备,直接把上一次增加功能时生
成的文件参数传递给del.exp,同时收集反馈结果输送到日志文件;
Expect的功能说明:
1. Add.exp程序接受shell传递的号码参数,并读取设备文件,以轮询的方式新增,一旦执行成功或者失败则退出,并传递返回值给shell
,shell根据返回值把对应的提示信息写道日志里。
2. Del.xp 程序按照shell传递的号码,判断是否曾经新增过,如没有则退出,否则按照临时文件内容作为参数直接
程序文件说明:
1. 附属文件为白名单,保存可允许操作设备的号码,每行一个;
2. 设备主机名文件,保存所有的设备,共16台;
3. 在运行之前只有这个此shell程序存在;
4. 运行后会产生一个add.exp;
5. 运行后会产生一个del.exp;
6. 在运行add.exp成功时,会临时产生一个以号码命名包含设备号的文件,如果执行删除成功后会删除此临时文件;
执行流程:
1. 执行流程如下 edge用户电话通知
2. 监控人员执行上的TCL脚本
3. 执行solaris上的shell程序,传递增加/删除、号码参数
4. 调用del.exp或者add.exp
5. 执行完毕,反馈success/fail给监控人员,生成日志。
执行参数:./es.sh {add|del} 号码
#!/bin/sh
#变量声明
current_day=`date +%Y%m%d"-"%R`
TELNUM=/home/eric/wlj/Edge_APN/TELNUM #这个是号白名单
EENUM=/home/eric/wlj/Edge_APN/EENUM #登录的设备
LOG=/home/eric/wlj/Edge_APN/log #记录日志
#判断输入是否小于2个参数
if [ $# -lt 2 ]
then
echo -e " Please use two parameter. \nUsage 0 {del|add} telnumber"; exit 12
fi
#定义增加功能的函数
function add() {
if grep $2 $TELNUM #判断输入的号码是否在白名单文件内,不在则退出程序
then
echo "match"
echo $2 >$2
else
echo "no match"
exit 11
fi
#是合法号码则执行add.exp脚本,其中$2表示号码,$EENUM表示白名单文件
./add.exp $2 $EENUM
#根据add.exp运行返回值写入日志里,共18种情况,其中只有返回100时表示成功,其余是错误。
case "$?" in
100) echo -e "$current_day\tadd\t$1\tADD_EXE_CUTED" >>$LOG
;;
101) echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
102) echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
103) echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
104) echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
105) echo -e "$current_day\tadd\t$1\tABC " >>$LOG
;;
106) echo -e "$current_day\tadd\t$1\tABC " >>$LOG
;;
107) echo -e "$current_day\tadd\t$1\tABC " >>$LOG
;;
108) echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
109) echo -e "$current_day\tadd\t$1\tABC " >>$LOG
;;
110) echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
111) echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
112) echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
113) echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
114) echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
115) echo -e "$current_day\tadd\t$1\tABC " >>$LOG
;;
116) echo -e "$current_day\tadd\t$1\tEABC" >>$LOG
;;
117) echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
118) echo -e "$current_day\tadd\t$1\tABC" >>$LOG
;;
*) echo
esac
}
#定义删除功能的函数
function del() {
test –s $2||exit 12
ADDEENUM=`cat $2`
./del.exp $2 $ADDEENUM
case "$?" in
200) echo -e "$current_day\tdel\t$1\tADD_EXE_CUTED" >>$LOG
;;
201) #执行成功才删除之前增加时产生的文件
echo -e "$current_day\tdel\t$1\tADD_EXE_CUTED" >>$LOG
test -s $2 && rm -rf $2
;;
202) echo -e "$current_day\tdel\t$1\tABC " >>$LOG
;;
203) echo -e "$current_day\tdel\t$1\tABC" >>$LOG
;;
204) echo -e "$current_day\tdel\t$1\tABC " >>$LOG
;;
205) echo -e "$current_day\tdel\t$1\tABC " >>$LOG
;;
206) echo -e "$current_day\tdel\t$1\tABC" >>$LOG
;;
207) echo -e "$current_day\tdel\t$1\tABC " >>$LOG
;;
208) echo -e "$current_day\tdel\t$1\tABC" >>$LOG
;;
209) echo -e "$current_day\tdel\t$1\tABC" >>$LOG
;;
*) echo
esac
}
#生成add.exp 的expect程序并赋值可执行权限
cat <<EOF >add.exp&&chmod a+x add.exp
#!/usr/local/bin/expect
if {\$argc<2} {
send_user "usage: \$argv0 number "
exit 11
}
log_user 0 #0为屏蔽输出,缺省值1为显示
set timeout 20
#设置变量为获得的参数1、2
set TELNUM [lindex \$argv 0]
set EENUM [lindex \$argv 1]
#设置文件对象
set fil [open \$EENUM r]
set n 0
#循环读取文件内容,并把内容作为新增指令的参数之一,直到新增成功或者错误中途退出
while {[gets \$fil line ]>=0} {
incr n
spawn program \$line
expect "<"
#发送新增指令
Send ”AAAAAA:APAPAP=86\$NUM,NID=202,OSID=311;\r"
sleep 3
expect {
"*ADD_EXE_CUTED*" { send [exec echo \$line >\$TELNUM ];send_user "add..success..";exit 100 }
"*ABC*" { send_user "add..fail..;exit 101 }
"*ABC" { send_user "add..fail..";exit 102 }
"*ABC*" { send_user "add..fail..";exit 103 }
"*ABCR*" { send_user "add..fail..";exit 104 }
"*ABC*" { send_user "add..fail..";exit 105 }
"*ABC*" { send_user "add..fail..";exit 106 }
"*ABC*" { send_user "add..fail..";exit 107 }
"*ABC*" { send_user "add..fail..";exit 108 }
"*ABC*" { send_user "add..fail..";exit 109 }
"*ABC*" { send_user "add..fail..";exit 110 }
"*ABC*" {send_user "add..fail..;exit 111 }
"*ABC*" { send_user "add..fail..";exit 112 }
"*ABC*" { send_user "add..fail..";exit 113 }
"*ABC*" { send_user "add..fail..";exit 114 }
"*ABC*" { send_user "add..fail..";exit 115 }
"*ABC*" { send_user "add..fail..";exit 116 }
"*ABC*" { send_user "add..fail..";exit 117 }
"*ABC*" { send_user "add..fail..";exit 118 }
}
}
close $fil
EOF
#生成del.exp 的expect程序并赋值可执行权限
cat <<EOF >del.exp&&chmod a+x del.exp
#!/usr/local/bin/expect
log_user 0 #0为屏蔽输出,缺省值1为显示
set NUM [lindex \$argv 0]
set EENUM [lindex \$argv 1]
spawn program \$EENUM
#先查看
expect "<"
send "APPACP:TTT=\$TELNUM;\r"
sleep 3
expect -re {\s*152[^\n]*([0-9]+)\s*}
#取得PID值
set PID \$expect_out(1,string)
#执行删除指令
send "APPACE:MSISDN=86\$TELNUM,PID=\$PID\r;"
expect {
"*ADD_EXE_CUTED*" { send_user "del..success..";exit 200 }
"*ABC*" { send_user "del..fail..";exit 201 }
"*UABC*" { send_user "del..fail..";exit 202 }
"*ABC*" { send_user "del..fail..";exit 203 }
"*ABC*" { send_user "del..fail..";exit 204 }
"*ABC*" { send_user "del..fail..";exit 205 }
"*ABC*" { send_user "del..fail..";exit 206 }
"*ABC*" { send_user "del..fail..";exit 207 }
"*ABC*" { send_user "del..fail..";exit 208 }
"*ABC*" { send_user "del..fail..";exit 209 }
}
interact
EOF
case "$1" in
add) add
;;
del) del
;;
*) echo -e "Usage 0 {del|add} telnumber"; exit 13
esac |
|