Script ลบผู้ใช้และ session ที่หมดอายุบน Mikrotik

สคริปต์เหล่านี้เป็นสคริปต์ที่ทำงานบนอุปกรณ์ Mikrotik ที่มี RouterOS เป็นหลัก. เป็นการทำงานลบผู้ใช้และเซสชัน (session) ที่หมดอายุแล้วในระบบ user manager ซึ่งทำงานเกี่ยวกับการจ่าย WiFi hotspot account.

สำหรับรุ่นที่รองรับ ถ้าหากระบุ 6.49 นั่นหมายถึงรุ่น 6.49.xx ย่อยทั้งหมด นอกจากนั้นในรุ่นอื่นๆอาทิเช่น 6.48 หรือ 7.0 ขึ้นไป อาจจะรองรับหรือไม่ก็ได้ ขอให้ผู้อ่านตรวจสอบอีกครั้งหนึ่ง.

ลบผู้ใช้ที่หมดอายุการใช้งานแล้ว

รองรับ: 6.49

# Automatic remove blank actual-profile user in User Manager for ROS v6.49
# https://forum.mikrotik.com/viewtopic.php?t=89184#p449692

:local username

:foreach i in [/tool user-manager user find where !actual-profile] do={
    :set username [/tool user-manager user get $i username]
    :log info "script: Remove user name $username"
    [/tool user-manager user remove $i]
};

ลบ session ที่หมดอายุ

รองรับ: 6.49

# Convert date/time to timestamp. Original source code by ( https://forum.mikrotik.com/viewtopic.php?p=994844#p994849 ).
:global datetime2epoch do={
    :local inputDateTime "$[/system clock get date] $[/system clock get time]"
    if ([:len $1]>0) do={
        :set inputDateTime $1
    }
    :local vdate [:pick $inputDateTime  0 [:find $inputDateTime  " " -1]]
    :local vtime [:pick $inputDateTime  ([:find $inputDateTime  " " -1] + 1) [:len $inputDateTime ]]
    :local vgmt  [/system clock get gmt-offset]; :if ($vgmt > 0x7FFFFFFF) do={:set vgmt ($vgmt - 0x100000000)}
    :if ($vgmt < 0) do={:set vgmt ($vgmt * -1)}
    :local arrm  [:toarray "0,0,31,59,90,120,151,181,212,243,273,304,334"]
    :local yyyy  [:pick $vdate 7 11] ; :if ((($yyyy - 1972) % 4) = 0) do={:set ($arrm->1) -1; :set ($arrm->2) 30}
    :local M     ([:find "xxanebarprayunulugepctovecANEBARPRAYUNULUGEPCTOVEC" [:pick $vdate 1 3] -1] / 2); :if ($M>12) do={:set M ($M - 12)}
    :local totd  ((($yyyy - 1970) * 365) + (($yyyy - 1972) / 4) + ($arrm->$M) + [:pick $vdate 4 6])
    :return      (((((($totd * 24) + [:pick $vtime 0 2]) * 60) + [:pick $vtime 3 5]) * 60) + [:pick $vtime 6 8] - $vgmt)
}
# end function ---------------------------------


:local username
:local tilltime
:local tilltimeTs
# number of seconds for hotspot user's session timeout
:local sessionTimeout 86400
# current user's timeout timestamp.
:local curUserTimeoutTs
# current timestamp.
:local currentTs

:foreach i in [/tool user-manager session find] do={
    :set username [/tool user-manager session get $i user]
    :set tilltime [/tool user-manager session get $i till-time]
    :set tilltimeTs [$datetime2epoch [/tool user-manager session get $i till-time]]
    :set curUserTimeoutTs ($tilltimeTs + $sessionTimeout)
    :set currentTs [$datetime2epoch]
    if ($curUserTimeoutTs <= $currentTs) do={
        :log info "script: user $username has timed out since $tilltime. deleting this session."
        #[/tool user-manager session close-session numbers=$i]
        [/tool user-manager session remove numbers=$i]
    }
};

รองรับ 7.11

# Convert date/time to timestamp. Original source code by ( https://forum.mikrotik.com/viewtopic.php?p=994844#p994849 ).
:global datetime2epoch do={
    :local dtime [:tostr $1]
    /system clock
    :local cyear [get date] ; :if ($cyear ~ "....-..-..") do={:set cyear [:pick $cyear 0 4]} else={:set cyear [:pick $cyear 7 11]}
    :if (([:len $dtime] = 10) or ([:len $dtime] = 11)) do={:set dtime "$dtime 00:00:00"}
    :if ([:len $dtime] = 15) do={:set dtime "$[:pick $dtime 0 6]/$cyear $[:pick $dtime 7 15]"}
    :if ([:len $dtime] = 14) do={:set dtime "$cyear-$[:pick $dtime 0 5] $[:pick $dtime 6 14]"}
    :if ([:len $dtime] =  8) do={:set dtime "$[get date] $dtime"}
    :if ([:tostr $1] = "") do={:set dtime ("$[get date] $[get time]")}
    :local vdate [:pick $dtime 0 [:find $dtime " " -1]]
    :local vtime [:pick $dtime ([:find $dtime " " -1] + 1) [:len $dtime]]
    :local vgmt  [get gmt-offset]; :if ($vgmt > 0x7FFFFFFF) do={:set vgmt ($vgmt - 0x100000000)}
    :if ($vgmt < 0) do={:set vgmt ($vgmt * -1)}
    :local arrm  [:toarray "0,0,31,59,90,120,151,181,212,243,273,304,334"]
    :local vdoff [:toarray "0,4,5,7,8,10"]
    :local MM    [:pick $vdate ($vdoff->2) ($vdoff->3)]
    :local M     [:tonum $MM]
    :if ($vdate ~ ".../../....") do={
        :set vdoff [:toarray "7,11,1,3,4,6"]
        :set M     ([:find "xxanebarprayunulugepctovecANEBARPRAYUNULUGEPCTOVEC" [:pick $vdate ($vdoff->2) ($vdoff->3)] -1] / 2)
        :if ($M>12) do={:set M ($M - 12)}
    }
    :local yyyy  [:pick $vdate ($vdoff->0) ($vdoff->1)] ; :if ((($yyyy - 1968) % 4) = 0) do={:set ($arrm->1) -1; :set ($arrm->2) 30}
    :local totd  ((($yyyy - 1970) * 365) + (($yyyy - 1968) / 4) + ($arrm->$M) + ([:pick $vdate ($vdoff->4) ($vdoff->5)] - 1))
    :return      (((((($totd * 24) + [:pick $vtime 0 2]) * 60) + [:pick $vtime 3 5]) * 60) + [:pick $vtime 6 8] - $vgmt)
}
# end function ---------------------------------


:local username
:local tilltime
:local tilltimeTs
# number of seconds for hotspot user's session timeout
:local sessionTimeout 86400
# current user's timeout timestamp.
:local curUserTimeoutTs
# current timestamp.
:local currentTs

:foreach i in [/user-manager/session/find] do={
    :set username [/user-manager/session/get $i user]
    :set tilltime [/user-manager/session/get $i ended]
    :set tilltimeTs [$datetime2epoch [/user-manager/session/get $i ended]]
    :set curUserTimeoutTs ($tilltimeTs + $sessionTimeout)
    :set currentTs [$datetime2epoch]
    if ($curUserTimeoutTs <= $currentTs) do={
        :log info "script: user $username has timed out since $tilltime. deleting this session."
        [/user-manager/session/remove numbers=$i]
    }
};

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *

คุณอาจใช้แท็กHTMLและแอททริบิวต์เหล่านี้: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>