hyes 发表于 2025-3-14 16:01

分享Mikrotik RouterOS脚本:pppoe的物理网卡、以及LAN/WAN list排错

本帖最后由 hyes 于 2025-3-14 16:03 编辑

此脚本自用,大概是我这种奇葩使用情况时候可能用到:
1、x86;
2、pppoe;
3、防火墙基于interface-list,区分了WAN-List、LAN-list;
4、新机器可能没有vga显示接口或者显示器没有了老接口了。。。又或者console口有有点费劲;
5、基于interface ether num轮替检查和排错。检查ether的advertise是否有效,应该可以排除光电复用网卡被设置为pppoe口~~只有1个有效物理网卡时候会禁用pppoe并并入bridge。

当然、最简单的办法是写脚本直接再backup之前启用allow all ip/mac to winbox。

没有做完全测试,仅供参考,主要就是为了backup恢复后,不通过vga或者console,网线直接可以winbox。
ps: 为啥不直接rsc配置导入,因为有时候,真的很难导入成功,排错也费劲。


:delay 15s;
:log info ":::-The Start-:The pppoeout interface settings Checker."

:local pppoenm;
:local LanList;
:local WanList;
:local WanNM;

:set pppoenm "pppoe-out1";
:set WanNM "WANifc";
:set LanList "LANs";
:set WanList "WANs";

##------------------------------------------------------------------------------------------##
#!!!! DO NOT CHANGE ANYTHING BELOW THIS LINE, IF YOU ARE NOT SURE WHAT YOU ARE DOING !!!!#
##------------------------------------------------------------------------------------------##


:local pppoeint;
:local BridgeNM;
:local tmms;
:local Ether1NM;
:local EtherNumALl;
:local EachEthNM;
:local EachEthDNM;


:local EtherNum;
:local NumEther;
:local EtherTNum;
:local EtherANum;
:local MaxNum;
:local csifnm;
:local Ether1Count;

:local adv;
:local advallCount;

:set tmms ([ :pick 0 2 ] . [ :pick 3 5 ] . [ :pick [ /system clock get time ] 6 8 ] );


:set pppoeint [ /interface pppoe-client get [ find name="$pppoenm" ] interface ];
:set BridgeNM [ /interface bridge get num=0 name ];


# for loop to check how many ether there are.
:local Minimum; \
:for Minimum from=0 to=24 step=1 do={ \
:do { \
    /interface ethernet get num="$Minimum" name;
    :set EtherNum [ :tonum $Minimum ];
    :set NumEther [ :tonum $Minimum ];
    :set EtherTNum [ :tonum $Minimum ];
    :set EtherANum [ :tonum $Minimum ];
    :set EtherNumALl [ :tonum $Minimum ];
    :set MaxNum [ :tonum ( $Minimum+1 ) ];
    } on-error={
      :if ( [:tonum $Minimum ]<=0 ) do={
      :log info "::There is at most one ether."

      :if ( [ :tobool [ /interface find default-name=ether1 ] ]=true ) do={
          :set Ether1NM [ /interface get name]

          :log info ( "Disabled " . $pppoenm . "." )
          /interface pppoe-client set [ find name="$pppoenm" ] disabled=no
         
          :if ( [ :tobool [ /interface list member find list="$WanList" interface="$Ether1NM" ] ]=true ) do={
            :log info ( "Remove " . $Ether1NM . " from list named " . $WanList . "." );
            /interface list member remove [ find list="$WanList" interface="$Ether1NM" ];
          };

          :if ( [ :tobool [ /interface bridge port find bridge="$BridgeNM" interface="$Ether1NM" ] ]=false ) do={
            :log info ( "Add " . $Ether1NM . " to list list named " . $LanList . "." );
            /interface bridge port add bridge="$BridgeNM" interface="$Ether1NM";
          };
         
          :if ( [ :tobool [ /interface list member find list="$WanList" interface="$BridgeNM" ] ]=true ) do={
            :log info ( "Remove interface bridge named " . $BridgeNM . " from lists named " . $WanList . "." )
            /interface list member remove [ find list="$WanList" interface="$BridgeNM" ];
            :delay 2s;
          } else={
            :log info ( "Inter-lists " . $WanList . "'s member does not exist interface " . $BridgeNM . "." )
          };

          :if ( [ :tobool [ /interface list member find list="$WanList" interface~"ether" ] ] =true ) do={
            :log info ( "Remove ether~ from Inter-lists " . $WanList . "..." )
            /interface list member remove [ find list="$WanList" interface~"ether" ];
            :delay 2s;
          } else={
            :log info ( "Inter-lists " .$WanList . "'s member does not exist interface ether~." )
          };

          :log warning"The only ehter has been set as the bridge port..."
          :error "The only ehter has been set as the bridge port..."
      } else={
          :log info "::There is no ethernet interface with default-name=ether1."
          :error "::There is no ethernet interface with default-name=ether1."
      }
      }
    }
}



:delay 2s;
:log info ( "There are " . $MaxNum . " ethernet interface in total." )



# Check the number of ethernet interface with effective advertising-value.
:set advallCount 0;
:for advchk from=0 to=$EtherANum step=1 do={ \
:set adv ( [ /interface ethernet monitor num=$advchk once as-value ]->"advertising" )
:delay 2s;
:if ( "$adv"!="" ) do={
    :set advallCount ( $advallCount+1)
}
}

:log info ( "::There are " . $advallCount . " ethernet interface with effective advertising-value." );
:if ( [:tonum $advallCount ]<=1 ) do={
:log info "::The bridge may not be functioning properly."

:log info ( "Disabled " . $pppoenm . "." )
/interface pppoe-client set [ find name="$pppoenm" ] disabled=no

:for e from=0 to=$EtherNumALl step=1 do={
    :set csifnm [ /interface ether get num=$e name ];

    :log info ( "Remove num" . $e . " from list named " . $WanList . "." );
    :if ( [ :tobool [ /interface list member find list="$WanList" interface="$csifnm" ] ]=true ) do={
      /interface list member remove [ find list="$WanList" interface="$csifnm" ];
    }
   
    :log info ( "Add " . $csifnm . " to bridge " . $BridgeNM . "." );
    :if ( [ :tobool [ /interface bridge port find bridge="$BridgeNM" interface="$csifnm" ] ]=false ) do={
      /interface bridge port add bridge="$BridgeNM" interface="$csifnm";
    }
};

    :if ( [ :tobool [ /interface list member find list="$WanList" interface="$BridgeNM" ] ]=true ) do={
      :log info ( "Remove interface bridge named " . $BridgeNM . " from lists named " . $WanList . "." )
      /interface list member remove [ find list="$WanList" interface="$BridgeNM" ];
      :delay 2s;
    } else={
      :log info ( "Inter-lists " . $WanList . "'s member does not exist interface " . $BridgeNM . "." )
    };

    :if ( [ :tobool [ /interface list member find list="$WanList" interface~"ether" ] ] =true ) do={
      :log info ( "Remove ether~ from Inter-lists " . $WanList . "..." )
      /interface list member remove [ find list="$WanList" interface~"ether" ];
      :delay 2s;
    } else={
      :log info ( "Inter-lists " .$WanList . "'s member does not exist interface ether~." )
    };

:log warning "Done to bridge all ethernet interface."
:error "Done to bridge all ethernet interface."
}




:if ( [ :tobool [ /interface find name="$WanNM" ] ]=false ) do={
:log info ( "::The ether named " . $WanNM . " not exists." );
:log info ( "::Sequentially try to name the ethernet with effective advertising-valueto " . $WanNM . ".");

:log info "Reset all ether's mac-addr..."
:for r from=0 to=$EtherNumALl step=1 do={
    /interface ethernet reset-mac-address num=$r;
    :delay 2s;
}

:log info "Rename all ethernet's name..."
:for mn from=0 to=$EtherNumALl step=1 do={
    :log info ( "Rename ethernet numbered-" . $mn . "'s name to ether" . $mn . $tmms . "." )
    /interface ethernet set num=$mn name=("ether" . $mn . $tmms)
    :delay 2s;
}

:for L from=0 to=$EtherTNum step=1 do={
:set EachEthDNM [ /interface ethernet get num=$L default-name ];
    :delay 2s;
    /interface ethernet set num=$L name=($EachEthDNM . $L);
}

:for X from=0 to=$EtherTNum step=1 do={
    :delay 2s;
    :local advtnew;
    :set advtnew ( [ /interface ethernet monitor num=$X once as-value ]->"advertising" );\
    :if ( "$advtnew"!="" ) do={
      :log info ( "Rename ether numbered-" . $X . "'s name to " . $WanNM . "." );
      /interface ethernet set num=$X name="$WanNM";
      :delay 3s;
      :log warning "The system will reboot in 15 seconds";
      :delay 15s;
      /system reboot;
    }
}
} else={
:log info ( "The ether named " . $WanNM . " exists, Check..." )
:set adv ( [ /interface ethernet monitor [ find name="$WanNM" ] once as-value ]->"advertising" );
:delay 2s;
:if ( "$adv"="" ) do={
    :log info ( "The ethernet " . $WanNM . "'s advertising value is empty." );
    :log info ( "::Sequentially try to name the ether with effective advertising-value to " . $WanNM . ".");
    :log info "Reset all ether's mac-addr..."
    :for r from=0 to=$EtherNumALl step=1 do={
      /interface ethernet reset-mac-address num=$r;
      :delay 2s;
    }

    :log info "::Rename all the ether...";
    :for mn from=0 to=$EtherNumALl step=1 do={
      :log info ( "Rename ether numbered-" . $mn . "'s name to ether" . $mn . $tmms . "." )
      :delay 2s;
      /interface ethernet set num=$mn name=("ether" . $mn . $tmms)
    };
    :delay 2s;
    :for l from=0 to=$EtherTNum step=1 do={
      :set EachEthDNM [ /interface ethernet get num=$l default-name ];
      :delay 2s;
      /interface ethernet set num=$l name=($EachEthDNM . $l);
    };

    :for X from=0 to=$EtherTNum step=1 do={
      :delay 2s;
      :local advtnew;
      :set advtnew ( [ /interface ethernet monitor num=$X once as-value ]->"advertising" );\
      :if ( "$advtnew"!="" ) do={
      :log info ( "Rename ether numbered-" . $X . "'s name to " . $WanNM . "." );
      /interface ethernet set num=$X name="$WanNM";
      :delay 3s;
      :log warning "The system will reboot in 15 seconds";
      :delay 15s;
      /system reboot;
      }
    }

} else={
    :log info ( "The ether named " . $WanNM . " has a effective advertising-value." );
}
}



:if ( [ :tobool [ /interface list member find list="$LanList" interface="$WanNM" ] ]=true ) do={
:log info ( "Remove ether " . $WanNM . " from lists " . $LanList )
/interface list member remove [ find list="$LanList" interface="$WanNM" ];
:delay 2s;
} else={
:log info ( "Inte-lists " . $LanList . "'s member does not exist interface " . $WanNM . ".")
}


:if ( [ :tobool [ /interface list member find list="$WanList" interface="$BridgeNM" ] ]=true ) do={
:log info ( "Remove interface bridge named " . $BridgeNM . " from lists named " . $WanList . "." )
/interface list member remove [ find list="$WanList" interface="$BridgeNM" ];
:delay 2s;
} else={
:log info ( "Inter-lists " . $WanList . "'s member does not exist interface " . $BridgeNM . "." )
}


:if ( [ :tobool [ /interface list member find list="$WanList" interface~"ether" ] ] =true ) do={
:log info ( "Remove ether~ from Inter-lists " . $WanList . "..." )
/interface list member remove [ find list="$WanList"interface~"ether" ];
:delay 2s;
} else={
:log info ( "Inter-lists " .$WanList . "'s member does not exist interface ether~." )
}

:log info ( "Check whether all the interface named regex-^ether are in " . $BridgeNM . "'s port.")
:for L from=1 to=$NumEther step=1 do={
:set csifnm [ /interface ethernet get num=$L name ];
:if ( "$csifnm"!="$WanNM" ) do={
    :if ( [ :tobool [ /interface bridge port find bridge="$BridgeNM" interface="$csifnm" ] ]=false ) do={
      :log info ( "The ethernet " . $csifnm . " is not in " . $BridgeNM . "'s port. Adding...")
      /interface bridge port add bridge="$BridgeNM" interface="$csifnm";
      :delay 3s;
    }
}
}

:if ( [ :tobool [ /interface bridge port find bridge="$BridgeNM" interface="$WanNM" ] ]=true ) do={
:log info ( "Remove " . $WanNM . " from " . $BridgeNM . "'s port." )
/interface bridge port remove [ find bridge="$BridgeNM" interface="$WanNM" ];
:delay 2s;
} else={
:log info ( $BridgeNM . "'s port does not exist " . $WanNM . ".")
}

:set pppoeint [ /interface pppoe-client get [ find name="$pppoenm" ] interface ];

:if ("$pppoeint"!="$WanNM") do={
:log info ( $pppoenm . " is not bound to " . $WanNM . "...")
:log info "::Set pppoe-client WAN-ether"
/interface pppoe-client set [ find name="$pppoenm" ] interface="$WanNM";

# :log info ( "Remove all interface named regex-^ether from " . $BridgeNM . "'s port.")
# /interface bridge port remove [ find bridge="$BridgeNM" interface~"ether" ];

# :log info ( "Remove all interface named regex-^ether from list " . $LanList . "'s member.")
# /interface list member remove [ find list="$LanList" interface~"ether" ];

} else={
:log info ( $pppoenm . " is bound to " . $WanNM . "." )
}

# :delay 3s;
# /system script run [ find where name="synddnsScr" ];
# :delay 5s;

:log info ":::-The End-: The pppoeout interface settings Checker."
页: [1]
查看完整版本: 分享Mikrotik RouterOS脚本:pppoe的物理网卡、以及LAN/WAN list排错