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重新編輯 ]