Routeos脚本主要脚本如下
InitializeAndManageUserRoutes
# 脚本名称: InitializeAndManageUserRoutes
# 声明全局变量userRoutes,并初始化为空数组
:global userRoutes []
# 定义全局函数 addUserRoute
:global addUserRoute do={
# 这表示函数能够访问和修改这个全局变量
:global userRoutes;
# :local newEntry {"$user"; "$network"; "$route"; "$client"};
:local newEntry {"$1"; "$2"; "$3"; "$4"};
# 更新全局 userRoutes 变量,将新的条目追加到现有的 userRoutes 列表中
:set userRoutes ($userRoutes, {$newEntry});
}
#给userRoutes数组添加内容
/import file-name="addUserRoute.txt"
#检查VPN用户名是否存在,路由表是否存在
/system script run ManageUserRoutesAndSecrets
ManageUserRoutesAndSecrets
:global userRoutes
# 遍历 userRoutes,处理每个子数组
:foreach row in=$userRoutes do={
# 提取用户名、路由表和路由名称
:local username ([:pick $row 0])
:local network ([:pick $row 1])
:local routeTableName ([:pick $row 2])
:local routeName ([:pick $row 3])
# 检查 PPP secrets 是否存在该用户名
:local userResult [/ppp/secret/find where name=$username]
:if ($userResult = "") do={
:log info ("新增 PPP 用户密钥:用户名:" . $username)
/ppp/secret/add name=$username service=any password="123456" profile=VPN-Profile comment="用户: $username 用于维护: $routeName"
} else={
:log info ("PPP 用户密钥已存在:用户名:" . $username)
}
# 检查 PPP secrets 是否存在该路由名称
:local routeResult [/ppp/secret/find where name=$routeName]
:if ($routeResult = "") do={
:log info ("新增路路由 PPP 用户密钥:名称:" . $routeName)
/ppp/secret/add name=$routeName service=any password="123456" profile=VPN-Profile comment="$routeName 路由器VPN客户端"
} else={
:log info ("路由相关 PPP 用户密钥已存在:名称:" . $routeName)
}
# 检查路由表是否存在
:local tableResult [/routing/table/find where name=$routeTableName]
:if ($tableResult = "") do={
:log info ("新增路由表:名称:" . $routeTableName)
/routing/table add name=$routeTableName fib comment="$routeName 私有路由表,用户 $username 使用"
} else={
:log info ("路由表已存在:名称:" . $routeTableName)
}
}
remove_hw_offloaded_routes_and_invalid_mangle_rules
/ip route remove [find where hw-offloaded=yes]
/ip firewall mangle remove [find where invalid=yes]
check-file-change
# 全局变量,用于存储上次的文件修改时间
:global lastModifiedTime
# 要监控的文件名称
:local fileName "addUserRoute.txt"
# 获取当前文件的修改时间
:local currentModifiedTime [/file get [find where name=$fileName] last-modified]
# 如果全局变量未定义,初始化为当前修改时间
:if ($lastModifiedTime = nil) do={
:set lastModifiedTime $currentModifiedTime
}
# 比较当前修改时间与上次修改时间
:if ($currentModifiedTime != $lastModifiedTime) do={
# 如果修改时间不一致,说明文件已修改,执行指定的脚本
/system script run InitializeAndManageUserRoutes
:log info "文件 $fileName 已修改,已执行 InitializeAndManageUserRoutes 脚本。"
# 更新全局变量为当前修改时间
:set lastModifiedTime $currentModifiedTime
} else={
:log info "文件 $fileName 未修改。"
}
[ 此帖被uthman在2024-10-08 18:42重新编辑 ]