forked from ibrovko78/MikroTik
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathLCplxAutoBlockMac
173 lines (170 loc) · 5.37 KB
/
LCplxAutoBlockMac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
################################### SETTING ################################################
# topic log
:local needenter "hotspot";
# server name
:local needserver "hotspotVS";
# failed password
:local fPass 3;
#enables module UnBind
:local UBlocked true;
#period for blocked in second
:local TimeBlocked ( 6 * 3600 );
##############################################################################################
:global LCplxMacBrut;
:global LCplxMacBrutTime;
:global LCplxMacBlocked;
:global getSQLDate;
:global getSQLDateTime;
:global UNIXTime;
:local nowdate [$getSQLDate];
:if ([/system scheduler find name="LCplxAutoBlockMac"] = "") do={
/system scheduler add name="LCplxAutoBlockMac" start-date="Jan/01/1970" start-time="00:00:00" interval="1m" on-event="/system script run \"LCplxAutoBlockMac\";";
};
:if ( [:typeof $LCplxMacBrut]!="array" ) do={
:set LCplxMacBrut [:toarray ("")];
};
:if ( [:typeof $LCplxMacBlocked]!="array" ) do={
:if ([:typeof $LCplxMacBlocked]="nothing") do={
:set LCplxMacBlocked [:toarray ("")];
:local tmpBlock [/system script get LCplxAutoBlockMac comment];
:if ( $tmpBlock!="" ) do={
:set tmpBlock [:toarray $tmpBlock];
:foreach a,b in=$tmpBlock do={
:local bpos [:find $b "="];
:local c ([:pick $b 0 $bpos]);
:local d ([:pick $b ($bpos+1) [:len $b]]);
:set ($LCplxMacBlocked->"$c") $d;
};
} else={
:set LCplxMacBlocked [:toarray ("")];
};
};
};
:local fs true;
:do {
:local fs [/ip hotspot get $needserver name];
} on-error={
:set $fs false;
};
:if ($fs!=false) do={
:local msgLog [/log find message~"login failed: user"];
:foreach i in=$msgLog do={
:local mmsg [/log get $i message ];
:local t [/log get $i time];
:local DateTime ($nowdate . " " . $t);
:local Utime [$UNIXTime [$DateTime]];
:if ($LCplxMacBrutTime < $Utime ) do={
:set LCplxMacBrutTime $Utime;
:local topic ([:toarray [/log get $i topics]]);
:foreach topi in=$topic do={
:if ( $topi = $needenter) do={
:local ip;
:local tryIP false;
:local Ipl;
:for i from=0 to=[:len $mmsg] step=1 do={
:if ($tryIP=false) do={
:if ([:pick $mmsg $i]="(") do={
:set tryIP true;
:set Ipl ($i);
};
} else={
:if ([:pick $mmsg $i]=")") do={
:set tryIP false;
};
};
:if ($tryIP) do={
:if ($Ipl<$i) do={
:set ip ($ip . [[:pick $mmsg $i]]);
};
};
};
:local Mac ([/ip hotspot host get [/ip hotspot host find address="$ip"] mac-address]);
:local id ([/ip hotspot ip-binding find mac-address="$Mac"]);
:local HotServer ([/ip hotspot host get [/ip hotspot host find address="$ip"] server]);
:local typeRec;
:do {
:local typeRec [/ip hotspot ip-binding get number="$id" type];
} on-error={
:local typeRec "";
};
:local disRec;
:do {
:local disRec [/ip hotspot ip-binding get number="$id" disabled];
} on-error={
:local disRec "";
};
:if ($typeRec!="bypassed" || $typeRec!="blocked") do={
:local iok [($LCplxMacBrut->"$Mac")];
if ( [typeof $iok] ="nil" ) do={
:set ($LCplxMacBrut->"$Mac") 1;
} else={
:local MBC ($LCplxMacBrut->"$Mac");
:set $MBC ( $MBC + 1 );
:set ($LCplxMacBrut->"$Mac") $MBC;
:if ($MBC>$fPass) do={
:if ($needserver=$HotServer) do={
:if ($id!="") do={
:if ($typeRec!="blocked" || $disRec=true) do={
:local comm;
:do {:set comm ([/ip hotspot ip-binding get number="$id" comment]);} on-error={:set comm "";};
:local comm ($comm . " Auto Blocked " . $DateTime);
/ip hotspot ip-binding set mac-address="$Mac" type=blocked comment="$comm" numbers="$id" disabled=no;
};
} else={
:local comm ("Auto Bind Brutforce " . $DateTime);
/ip hotspot ip-binding add mac-address="$Mac" comment="$comm" server="$HotServer" type=blocked disabled=no;
};
:local tmpArray [:toarray ("")];
:foreach a,b in=$LCplxMacBrut do={
:if ($a!=$Mac) do={
:set ($tmpArray->"$a") $b;
};
};
:set LCplxMacBrut $tmpArray;
:if ( $UBlocked ) do={
:local a ( $LCplxMacBrutTime + $TimeBlocked );
:set ($LCplxMacBlocked->"$Mac") $a;
/system script comment LCplxAutoBlockMac comment="$LCplxMacBlocked";
};
};
};
};
};
};
};
};
};
:if ( $UBlocked=true ) do={
:local timef [$UNIXTime];
:local delArray [:toarray ("")];
:set LCplxMacBlocked [:toarray $LCplxMacBlocked];
:foreach a,b in=$LCplxMacBlocked do={
:local timelabel [:tonum $b];
:if ( $timef > $timelabel ) do={
:local Mac $a;
:local id ([/ip hotspot ip-binding find mac-address="$Mac"]);
:if ( $id!="" ) do={
:local typeRec [/ip hotspot ip-binding get number="$id" type];
:if ( $typeRec="blocked") do={
/ip hotspot ip-binding remove numbers=$id;
};
};
:set ($delArray->"$Mac") 999;
};
};
:local tmpArray [:toarray ("")];
:if ( [:len $delArray] > 0 ) do={
:foreach a,b in=$delArray do={
:foreach c,d in=$LCplxMacBlocked do={
:if ($a!=$c) do={
:set ($tmpArray->"$c") $d;
};
};
};
:set LCplxMacBlocked $tmpArray;
/system script comment LCplxAutoBlockMac comment="$LCplxMacBlocked";
};
};
} else={
:log error ("ERROR: configure error LCplxAutoBlockMac. See variable \"needserver\".");
};