一些routeros-script折腾随记

来自三线的随记


第三方cn docs: https://mikrotik-doc-cn.readthedocs.io/zh/latest/source/Scripts/content.html

常用操作:

变量定义: 可以通过 :local 或者 :global 定义,区别就是作用域不一样

:local pppoeInterface "pppoe-sfp-telecom"
:local pppoeUptime

:put 可以将定义好的变量输出到console,但是不能输出到log


一般情况下,Scripts 在运行的时候,如果出现异常,不会有异常信息,只有简单的一句话:

script,error executing script script-test from xxxxxxx failed, please check it manually

可以通过类似以下方式把 exception (e) 打到log中方便排查

:onerror e {
:local pppoeInterface "pppoe-sfp-telecom"
:local pppoeUptime
[/interface/pppoe-client/monitor $pppoeInterface once do={:set pppoeUptime $uptime} ]
:log info "PPPoE interface uptime: $pppoeUptime"

} do {:log info  "script running error: $e"}


some example:

用于判断 pppoe 连接时间,如果不在 3-5 点,就运行指定的脚本

:onerror e {
:local pppoeInterface "pppoe-sfp-telecom"
:local pppoeUptime
:local pppoeUptimeHour
:local dayPos
:local hourSemicolonPos
:local timeCutPosStart 0


[/interface/pppoe-client/monitor $pppoeInterface once do={:set pppoeUptime $uptime} ]
:log info "PPPoE interface uptime: $pppoeUptime"

:set dayPos [:find $pppoeUptime "d"]
:if ($dayPos >0) do={
        :set timeCutPosStart ($dayPos + 1)
        #:log debug "day pos found."
}
:log info "timeCutPosStart: $timeCutPosStart"

:set hourSemicolonPos [:find $pppoeUptime ":"]
:set pppoeUptimeHour [:pick $pppoeUptime $timeCutPosStart $hourSemicolonPos]
:log info "pppoeUptimeHour: $pppoeUptimeHour"

:if ( $pppoeUptimeHour > 5 or $pppoeUptimeHour < 3 ) do={
    :log info "PPPOE connection uptime not as expected! will be restarted..."
    /interface/pppoe-client/disable $pppoeInterface
    :log info "$pppoeInterface disabled"
    delay 3
    /interface/pppoe-client/enable $pppoeInterface
    :log info "$pppoeInterface enabled"
}

} do {:log info  "script running error: $e"}