e_zhangiso 发表于 2018-8-19 12:44:32

切换用户规则

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

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



第二个脚本

{
:local telpx "0"
:set telpx [:len ]
:if ($telpx>1) do={
/ppp secret;
:foreach tepuse in= do={
:local tenam ;
:local tezprof ;
:local tei "2"
:for teii from=1 to=$tei do={
:if ($tezprof=("ADSL".$teii)) do={
/ppp secret set profile=("adsl".$teii);
/ppp active remove }
:if ($tezprof=("VIP".$teii)) do={
/ppp secret set profile=("vip".$teii);
/ppp active remove }
       }
   }
   }
}




mrli 发表于 2018-8-19 17:57:05

干什么用的 ?

e_zhangiso 发表于 2018-8-19 19:33:13

两条电信线路全部断线,将用户切换到联通线路,当电信线路有一半以上恢复的时候,在把电信用户从联通切换回来。

cspm333 发表于 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

on-down:
:if ([:len ]=0) do={/interface pppoe-c enable }

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

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

e_zhangiso 发表于 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负载均衡。

47771885 发表于 2018-8-20 20:39:14

完全不需要用脚本的

cspm333 发表于 2018-8-23 03:04:30

本帖最后由 cspm333 于 2018-8-23 10:24 编辑

e_zhangiso 發表於 2018-8-20 20:34
感謝大神回覆,我的這種情況比較特殊,內部用戶分為電信用戶和聯通用戶,分別進行標記路由,平時線路正常 ...#負載標記script:
:local connected
:local notyet

: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= do={
   :local nrm "to_$ name]"
   :if (($v+1)<=[:len $connected]) do={
          /ip firewall mangle set $i disabled=nonew-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
      }
}

e_zhangiso 发表于 2018-8-23 12:18:40

cspm333 发表于 2018-8-23 03:04
#負載標記script:
:local connected
:local notyet

感谢指导,脚本加上注释才好,有些地方真心看不明。

cspm333 发表于 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的關係,閱讀下圖一定能明白:

页: [1]
查看完整版本: 切换用户规则