Routeos腳本主要腳本如下
InitializeAndManageUserRoutes
# 腳本名稱(chēng): InitializeAndManageUserRoutes
# 聲明全局變量userRoutes,并初始化為空數(shù)組
:global userRoutes []
# 定義全局函數(shù) addUserRoute
:global addUserRoute do={
# 這表示函數(shù)能夠訪問(wèn)和修改這個(gè)全局變量
:global userRoutes;
# :local newEntry {"$user"; "$network"; "$route"; "$client"};
:local newEntry {"$1"; "$2"; "$3"; "$4"};
# 更新全局 userRoutes 變量,將新的條目追加到現(xiàn)有的 userRoutes 列表中
:set userRoutes ($userRoutes, {$newEntry});
}
#給userRoutes數(shù)組添加內(nèi)容
/import file-name="addUserRoute.txt"
#檢查VPN用戶(hù)名是否存在,路由表是否存在
/system script run ManageUserRoutesAndSecrets
ManageUserRoutesAndSecrets
:global userRoutes
# 遍歷 userRoutes,處理每個(gè)子數(shù)組
:foreach row in=$userRoutes do={
# 提取用戶(hù)名、路由表和路由名稱(chēng)
:local username ([:pick $row 0])
:local network ([:pick $row 1])
:local routeTableName ([:pick $row 2])
:local routeName ([:pick $row 3])
# 檢查 PPP secrets 是否存在該用戶(hù)名
:local userResult [/ppp/secret/find where name=$username]
:if ($userResult = "") do={
:log info ("新增 PPP 用戶(hù)密鑰:用戶(hù)名:" . $username)
/ppp/secret/add name=$username service=any password="123456" profile=VPN-Profile comment="用戶(hù): $username 用于維護(hù): $routeName"
} else={
:log info ("PPP 用戶(hù)密鑰已存在:用戶(hù)名:" . $username)
}
# 檢查 PPP secrets 是否存在該路由名稱(chēng)
:local routeResult [/ppp/secret/find where name=$routeName]
:if ($routeResult = "") do={
:log info ("新增路路由 PPP 用戶(hù)密鑰:名稱(chēng):" . $routeName)
/ppp/secret/add name=$routeName service=any password="123456" profile=VPN-Profile comment="$routeName 路由器VPN客戶(hù)端"
} else={
:log info ("路由相關(guān) PPP 用戶(hù)密鑰已存在:名稱(chēng):" . $routeName)
}
# 檢查路由表是否存在
:local tableResult [/routing/table/find where name=$routeTableName]
:if ($tableResult = "") do={
:log info ("新增路由表:名稱(chēng):" . $routeTableName)
/routing/table add name=$routeTableName fib comment="$routeName 私有路由表,用戶(hù) $username 使用"
} else={
:log info ("路由表已存在:名稱(chēng):" . $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
# 全局變量,用于存儲(chǔ)上次的文件修改時(shí)間
:global lastModifiedTime
# 要監(jiān)控的文件名稱(chēng)
:local fileName "addUserRoute.txt"
# 獲取當(dāng)前文件的修改時(shí)間
:local currentModifiedTime [/file get [find where name=$fileName] last-modified]
# 如果全局變量未定義,初始化為當(dāng)前修改時(shí)間
:if ($lastModifiedTime = nil) do={
:set lastModifiedTime $currentModifiedTime
}
# 比較當(dāng)前修改時(shí)間與上次修改時(shí)間
:if ($currentModifiedTime != $lastModifiedTime) do={
# 如果修改時(shí)間不一致,說(shuō)明文件已修改,執(zhí)行指定的腳本
/system script run InitializeAndManageUserRoutes
:log info "文件 $fileName 已修改,已執(zhí)行 InitializeAndManageUserRoutes 腳本。"
# 更新全局變量為當(dāng)前修改時(shí)間
:set lastModifiedTime $currentModifiedTime
} else={
:log info "文件 $fileName 未修改。"
}
[ 此帖被uthman在2024-10-08 18:42重新編輯 ]