mxso 发表于 2010-1-23 19:58:02

NEW! PPP用户日期比较,页面通知!

本帖最后由 mxso 于 2010-1-24 16:07 编辑

以下脚本适用于已建立的PPP服务
脚本将应用PPP用户注释,不影响注释正常使用
添加“[日期8位数]”字段即参与比较,不添加“[日期8位数]”将不作比较
如只需6位日期须修改script部分代码第4行[:pick $Date 7 11]将7改为9,第7行([:len $temp ]>=10)将10改为8.即为6位日期“”10年3月8日

当获取到用户注释的日期小于系统日期将作页面通知并禁止访问其他网络.
当获取到用户注释的日期大于系统日期将当前用户设置回为正常上网//此功能尽管作用不大,如:到期用户续费,设置日期后,在下一次调用脚本时对当前续费用户开通上网.取决于调用脚本的间距时间



注释格式 “…[日期8位数]…”年月日
如“张三到期”到2010年3月8日将对当前注释的用户操作
如“……” 不是数值将不作比较,脚本不对当前注释用户进行操作
如 “邻居李四”或空注释,将不作比较,脚本不对当前注释用户进行操作



思路:
到期用户拨号获取到的IP禁止访问其他网络,其网页请求转换到指定的ip,作为到期通知

以下代码不能照搬 X.X.X.1-X.X.X.254为禁止访问和页面跳转的IP段,请自己修改,X.X.X.X为到期通知的Web服务器IP端口80,PPP_Server 更改为你的本地IP或地址池
添加1个到期的IP地址池(Pool)expire_pool X.X.X.1-X.X.X.254 //到期的用户将分派这个地址段IP/ip pool add name=expire_pool ranges=X.X.X.1-X.X.X.254添加1个防火墙规则(Filter Rules)drop X.X.X.1-X.X.X.254 //禁止这个地址段的IP/ip firewall filter add action=drop chain=forward comment="禁止到期用户IP" disabled=no src-address=X.X.X.1-X.X.X.254添加1个NAT转换规则(NAT)dstnat X.X.X.1-X.X.X.254 //将这个地址段IP的Tcp 80(即web默认端口)请求跳到指定的IP地址,作为到期通知/ip firewall nat add action=dst-nat chain=dstnat comment="到期通知跳转" disabled=no dst-port=80 protocol=tcp src-address=X.X.X.1-X.X.X.254 to-addresses=X.X.X.X to-ports=80注意: X.X.X.X为到期通知的Web服务器IP端口80

添加1个为到期PPP规则(PPP Profiles)expire RemoteAddress=expire_pool //建立expire Profiles 将用户地址池(即Remote Address)指向刚建立的expire_pool地址池/ppp profile add change-tcp-mss=default comment="到期规则" local-address=PPP_Server name=expire-profiles remote-address=expire_pool注意 PPP_Server 更改为你的PPP服务IP或地址池!

补充:
设置时区和网络自动校时/system clock manual set time-zone=+08:00
/system ntp client set enabled=yes mode=unicast primary-ntp=129.6.15.28 secondary-ntp=129.6.15.29下面代码保存到script,用scheduler设置每天至少调用一次:local Date
:local Month ([:find jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec [:pick $Date 0 3]]+1)
:if ($Month<10) do={:set Month (0 . $Month)}
:set Date ([:pick $Date 7 11] . $Month . [:pick $Date 4 6])
:foreach i in= do={
:local temp
:if ([:len $temp ]>=10) do={
:if ([:tonum [:pick $temp ([:find $temp "["]+1) [:find $temp "]"]]] < $Date) do={
:if (!="expire-profiles") do={/ppp active remove ]}
/ppp secret set $i profile=expire-profiles} else={
:if (="expire-profiles") do={/ppp active remove ]}
/ppp secret set $i profile=default}}}

47771885 发表于 2010-1-23 20:03:54

本帖最后由 47771885 于 2010-1-23 20:06 编辑

{:3_53:}。。。不错啊 新意 不错 呵呵

mxso 发表于 2010-1-23 20:04:47

本帖最后由 mxso 于 2010-1-24 16:08 编辑

如不需要页面通知,只需使用下面script不用建立地址池Pool,防火墙,NAT……
脚本将剔除并禁用到期用户,未到期用户将启用:local Date
:local Month ([:find jan,feb,mar,apr,may,jun,jul,aug,sep,oct,nov,dec [:pick $Date 0 3]]+1)
:if ($Month<10) do={:set Month (0 . $Month)}
:set Date ([:pick $Date 7 11] . $Month . [:pick $Date 4 6])
:foreach i in= do={
:local temp
:if ([:len $temp ]>=10) do={
:if ([:tonum [:pick $temp ([:find $temp "["]+1) [:find $temp "]"]]] < $Date) do={
/ppp secret disable $i
/ppp active remove ]} else={/ppp secret enable $i}}}

mxso 发表于 2010-1-23 20:08:40

回复 2# 47771885


    谢谢

47771885 发表于 2010-1-23 20:13:33

本帖最后由 47771885 于 2010-1-23 20:29 编辑

单模版

:local ab {{"jan";"01"};{"feb";"02"};{"mar";"03"};{"apr";"04"};{"may";"05"};{"jun";"06"};{"jul";"07"};{"aug";"08"};{"sep";"09"};{"oct";"10"};{"nov";"11"};{"dec";"12"}};
:local aa [:pick 9 11];
:local bb [:pick 0 3];
:local cc [:pick 4 6];
:foreach i in=$ab do={:if ([:pick $i 0] = $bb) do={:set ab ($aa . [:pick $i 1] . $cc);}}

就没你用的好

WGHBOY 发表于 2010-1-23 20:30:08

不用搞的太复杂,ros累

47771885 发表于 2010-1-23 20:39:34

不用搞的太复杂,ros累
WGHBOY 发表于 2010-1-23 20:30 http://bbs.routerclub.com/images/common/back.gif


    比你搞的轻松多了
请看
使事情尽可能地简单,但不过于简单;

mxso 发表于 2010-1-27 19:02:27

本帖最后由 mxso 于 2010-1-27 19:05 编辑

这么快就沉底了,不会这么不值吧!

以上脚本存在日期对比缺陷,例如 2010年5月1号到期,但要在前3天提示用户快到期如需继续使用请续费,
这问题就来了,20100501-3=20100498,也就是2010年4月98日,日历上面没有98号。

但如果不做提示不会有问题。

此问题已解决并在下版本发布

chen198320 发表于 2010-2-19 13:17:02

又学习一下了,改天试试

zooyo 发表于 2010-2-19 14:22:10

好贴。

wugalang88 发表于 2010-2-23 19:40:18

期待新版本

flashalang 发表于 2010-3-6 20:49:52

顶上去!支持!

routerprint 发表于 2010-3-9 17:06:23

很好

kkkkkk 发表于 2010-3-9 17:41:07

好东西 !!新概念

deng198896125 发表于 2010-3-11 00:55:39

新版才是硬道理
页: [1] 2 3
查看完整版本: NEW! PPP用户日期比较,页面通知!