hcb 发表于 2008-5-20 23:23:03

pppoe用户限制时间上网的脚本

今晚闲来无事,就顺便写一段脚本来实现前几天的一为坛友对 "pppoe用户限制时间上网"的要求

1,在system-->Scheduler里面建一规则,一分钟执行一次,如图
2,脚本如下
###############################################
#功能:指定拨号用户上网时间 只能指定一个时间段#
#用户列表,一用户写一行,可以用空格对齐,格式:用户帐号-起始时间-终止时间,\ 例如 test-hh:mm:ss-hh:mm:ss,\
:set STR "\
test    -8:30:00 - 12:30:00,\
abc   -9:00:00 - 22:30:00,\
"
###############################################
#当前时间
:set T [:totime ]
#逐行处理帐号参数
:foreach i in=$STR do={
# 除去参数中的空格
:while([:set j [:find $i " "]]>=0 || $j>=0) do={:set i ([:pick $i 0 $j] . [:pick $i ($j+1) [:len $i]])}
# 把参数分解成集合
:while([:set j [:find $i "-"]]>=0 || $j>=0) do={:set i ([:pick $i 0 $j] . "," . [:pick $i ($j+1) [:len $i]])}
# 分解取得各项参数
:set k 0; :set ZH ""; :set T1 00:00:00; :set T2 23:59:59
:foreach j in=$i do={
    :set k ($k + 1)
    :if($k=1) do={:set ZH $j}
    :if($k=2) do={:set T1 [:totime $j]}
    :if($k=3) do={:set T2 [:totime $j]}
    }
# 判断参数的正确性
:set ok "yes"
:if($T1=[:nothing] || $T2=[:nothing]) do={:log error ($i . "时间表达错误"); :set ok "no"}
:set id ""; :set id
:if($id="") do={:log error ("帐号" . $ZH . "不存在"); :set ok "no"}
# 参数正确的话继续
:if($ok="yes") do={
#   当前帐号的状态
    :set stat
#   如果在开放时间段,没有打开的帐号,则打开该帐号
    :if($T>=$T1 && $T<=$T2 && $stat=true)do={/ppp secret enable$id}
#   如果不在开放时间段,打开了的帐号,则关闭该帐号
    :if(($T<$T1 || $T>$T2) && $stat=false) do={/ppp secret disable $id}
    }
}
测试达到预期要求

在用户列表部分增加减少修改需要控制的帐号和时间就可以了,每个用户可以设置不同的时间段,但只能设置一个时间段,若须多个时间段的,则代码复杂很多,一分钟执行一次,效率不是很高,但设置简单具有一般性,如果时间段全部都是一样或者只有很少的几种时间段的话,可以为每个时间段设置一个调度,效率就高些。如果用户很多的话,比如成百上千,效率上这个方法基本就不太可行了,也许该用radius

tpy372 发表于 2008-5-20 23:46:56

顶一下

消瘦的浮云 发表于 2008-5-21 11:26:40

顶一下!改天测试看看

蔡都小周 发表于 2008-5-21 12:51:20

谢谢楼主分享!:victory: :victory:

消瘦的浮云 发表于 2008-6-19 14:54:21

存在漏洞:如果在上网时间拨号了的用户只要没有断开PPPOE连接,时间到了也一样的上网~!
虽然不是很完美,但我还是非常感谢LZ!!:handshake

bensonhb 发表于 2008-6-21 09:46:21

顶起,好东东,学习咯,感谢楼主分享了!!!!

10074755 发表于 2010-7-30 10:35:09

这么好的东西不顶都难。
页: [1]
查看完整版本: pppoe用户限制时间上网的脚本