自由的生活_软路由论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 4010|回复: 9

[脚本] 切换用户规则

[复制链接]
发表于 2018-8-19 12:44:32 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册

x
以下是经测试可以在6.X版本上使用的脚本,分享出来,有高手能把两个脚本合二为一就更好。

:global telstatus1
:global telstatus2
:delay 16;
:set telstatus1 [/interface get [/interface find name="tel-1"] running]
:set telstatus2 [/interface get [/interface find name="tel-2"] running]
:if (($telstatus1=false) && ($telstatus2=false)) do={
/ppp secret;
:foreach tepuse in=[find disabled=no comment="tel"] do={
:local tenam [get $tepuse name];
:local tezprof [get $tepuse profile];
:local tei "2"
:for teii from=1 to=$tei do={
:if ($tezprof=("adsl".$teii)) do={
/ppp secret set [/ppp secret find name=$tenam] profile=("ADSL".$teii);
/ppp active remove [/ppp active find name=$tenam]}
:if ($tezprof=("vip".$teii)) do={
/ppp secret set [/ppp secret find name=$tenam] profile=("VIP".$teii);
/ppp active remove [/ppp active find name=$tenam]}
       }
     }
   }
}



第二个脚本

{
:local telpx "0"
:set telpx [:len [/interface pppoe-client find running=yes (name~"uni")=no]]
:if ($telpx>1) do={
/ppp secret;
:foreach tepuse in=[find disabled=no comment="tel"] do={
:local tenam [get $tepuse name];
:local tezprof [get $tepuse profile];
:local tei "2"
:for teii from=1 to=$tei do={
:if ($tezprof=("ADSL".$teii)) do={
/ppp secret set [/ppp secret find name=$tenam] profile=("adsl".$teii);
/ppp active remove [/ppp active find name=$tenam]}
:if ($tezprof=("VIP".$teii)) do={
/ppp secret set [/ppp secret find name=$tenam] profile=("vip".$teii);
/ppp active remove [/ppp active find name=$tenam]}
       }
     }
   }
}


115953qg1w1yfl27lkkl05.png

routeros
发表于 2018-8-19 17:57:05 | 显示全部楼层
干什么用的 ?
routeros
 楼主| 发表于 2018-8-19 19:33:13 | 显示全部楼层
两条电信线路全部断线,将用户切换到联通线路,当电信线路有一半以上恢复的时候,在把电信用户从联通切换回来。
routeros
发表于 2018-8-19 23:18:50 | 显示全部楼层
本帖最后由 cspm333 于 2018-8-19 23:49 编辑

您script寫的太複雜了,有部份是router自帶的能力,不需要全靠script安排.

在/ppp profile新增tel-profile設定檔,將tel-1與tel-2撥號都指定tel- profile.

tel-profile裡的script頁籤可設定腳本,
on-up是撥號成要執行的;on-down是離線時執行的.所以只要:

on-up:
/interface pppoe-c disable [find name~"uni" disabled=no]

on-down:
:if ([:len [/interface pppoe-c find name~"tel" running=yes]]=0) do={/interface pppoe-c enable [find name~"uni" disabled=yes]}

說明:
兩個電信套上tel-profile ,會去run on-up即代表至少目前這筆電信的pppoe撥號是成功的.
所以這時的script就只有一個目的,將未關閉的聯通給關閉.

當tel-profile run on-down時,即代表目前的pppoe轉成離線...
所以script要先計數電信是否還有在線上的,若記數的結果為0 ,則將關閉中的聯通全給啟用.

点评

赞,本来也想回复类似内容,但没楼上说得明白  发表于 2018-8-19 23:29
routeros
 楼主| 发表于 2018-8-20 20:34:54 | 显示全部楼层
本帖最后由 e_zhangiso 于 2018-8-20 21:15 编辑
cspm333 发表于 2018-8-19 23:18
您script寫的太複雜了,有部份是router自帶的能力,不需要全靠script安排.

在/ppp profile新增tel-profile ...

感谢大神回复,我的这种情况比较特殊,内部用户分为电信用户和联通用户,分别进行标记路由,平时线路正常的情况下只允许电信走电信,联通走联通,二者收费不同,只有在极端情况下,例如电信全部断线,才让电信用户走联通双线进行负载,所以通过切换出口进行线路转换行不通,况且新版ROS也能够不需要脚本自动切换默认路由,所以我是通过切换用户规则,指定用户走相应的线路,电信双线和联通双线分别进行PCC负载均衡。
routeros
发表于 2018-8-20 20:39:14 | 显示全部楼层
完全不需要用脚本的
routeros
发表于 2018-8-23 03:04:30 | 显示全部楼层
本帖最后由 cspm333 于 2018-8-23 10:24 编辑
e_zhangiso 發表於 2018-8-20 20:34
感謝大神回覆,我的這種情況比較特殊,內部用戶分為電信用戶和聯通用戶,分別進行標記路由,平時線路正常 ...
#負載標記script:
:local connected [/interface pppoe-c find running=yes]
:local notyet [/interface pppoe-c find running=no]

:local pppoe
:foreach i in=$connected do={:set pppoe "$pppoe,$i"}
:foreach i in=$notyet do={:set pppoe "$pppoe,$i"}
:set pppoe [:toarray [:pick $pppoe 1 [:len $pppoe]]]

:foreach v,i in=[/ip firewall mangle find action=mark-routing] do={
   :local nrm "to_$[/interface pppoe-c get [:pick $pppoe $v] name]"
   :if (($v+1)<=[:len $connected]) do={
          /ip firewall mangle set $i disabled=no  new-routing-mark=$nrm \
             per-connection-classifier="src-port:$[:len $connected]/$v"
      } else={
          /ip firewall mangle set $i disabled=yes new-routing-mark=$nrm !per-connection-classifier
      }
}

routeros
 楼主| 发表于 2018-8-23 12:18:40 | 显示全部楼层
cspm333 发表于 2018-8-23 03:04
#負載標記script:
:local connected [/interface pppoe-c find running=yes]
:local notyet [/interface pp ...

感谢指导,脚本加上注释才好,有些地方真心看不明。
routeros
发表于 2018-8-23 14:25:30 | 显示全部楼层
本帖最后由 cspm333 于 2018-8-23 21:49 编辑
e_zhangiso 發表於 2018-8-23 12:18
感謝指導,腳本加上註釋才好,有些地方真心看不明。

第1段落: 分別搜尋已連線與未連線的pppoe
第2段落: 將已連線 與未連線的id再合併併入pppoe變數.已連線在前,未連線的在後.

第3段落:
迴圈開始,因變數pppoe已將連線的id排在前,未連線的id排在後
所以計數($v+1) 註:迴圈計數是從0開始,所以需用$v+1來辨識
<=已連線的量,設定PCC參數並啟用;

當計數($v+1)>已連線的量時,則代表迴圈進入未連線的id...關閉並取消PCC.

若還看不懂計數$v與foreach的關係,閱讀下圖一定能明白:
Snap2.png
routeros
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|Archiver|软路由论坛 ( 渝ICP备15001194号-1,渝公网安备 50011602500124号 )

GMT+8, 2019-8-22 00:34 , Processed in 0.155248 second(s), 26 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表