В выходные немного заскучал и написал скрипт, который публикует статус netwatch на веб-странице. Понадобится: -вебсервер с php и mysql -ros 3.16 (работает и на более ранних версиях, но я использовал именно эту…). Обратите внимание, что я не предпринял никаких мер по безопасности этих скриптов, так что не публикуйте их на внешних веб-серверах. Код для проверки статуса «вверх»: /tool fetch mode=http address=www.yourpage.no src-path=("/net_status.php?router=1&status=1&time=".[/system clock get time]."%20".[/system clock get date]) dst-path="/netwatch" port=80 host=www.yourpage.no Код для проверки статуса «вниз»: /tool fetch mode=http address=www.yourpage.no src-path=("/net_status.php?router=1&status=2&time=".[/system clock get time]."%20".[/system clock get date]) dst-path="/netwatch" port=80 host=www.yourpage.no Обратите внимание на следующие параметры php строки: router =1 <-это идентификатор маршрутизатора в базе данных- (вам нужно изменить это значение в скрипте на «вверх/вниз» в зависимости от идентификатора маршрутизатора в базе данных, если вы этого не сделаете, он будет обновлять данные только для одного маршрутизатора) status =1 (или 2) <-статус 1 означает, что маршрутизатор работает, статус 2 означает, что маршрутизатор не работает time ← время и дата для действия. Настройка базы данных: создайте базу данных с именем «netwatch» и таблицу с именем «netwatch». Создайте следующие поля: id (Int, auto, index), name (varchar), status (int), time (varchar). Теперь вставьте несколько маршрутизаторов в базу данных, вам нужно заполнить только поле «name», остальные заполнятся автоматически позже. Скрипт подключения к базе данных: (databaseconfig.php) <?php $conn = mysql_connect("localhost", "username", "password") or die(mysql_error()); $db=mysql_select_db("netwatch") or die(mysql_error()); ?> PHP-скрипт для приема значений: (net_status.php) <?php include "databaseconfig.php"; //получаем данные из заголовка $router=$_GET['router']; $status=$_GET['status']; $time=$_GET['time']; $query="UPDATE netwatch SET status='".$status."', time='".$time."' WHERE id='".$router."'"; $result=mysql_query($query)or die(mysql_error()); echo "готово"; ?> Скрипт для отображения значений на странице: (display.php) <?php include "databaseconfig.php"; $query="SELECT * FROM netwatch"; $result=mysql_query($query)or die(mysql_error()); $num=mysql_numrows($result); echo "
"; echo "
Маршрутизатор
Время
Статус
"; echo "
"; for ($i=0; $i<$num; $i++) { if (mysql_result($result,$i,"status")=="1") { echo "".mysql_result($result,$i,"name")."<br>"; }else{ echo "".mysql_result($result,$i,"name")."<br>"; } } echo "
"; for ($i=0; $i<$num; $i++) { if (mysql_result($result,$i,"status")=="1") { echo "".mysql_result($result,$i,"time")."<br>"; }else{ echo "".mysql_result($result,$i,"time")."<br>"; } } echo "
"; for ($i=0; $i<$num; $i++) { if (mysql_result($result,$i,"status")=="1") { echo "Работает<br>"; }else{ echo "Не работает<br>"; } } echo "
"; echo "
<center>Надеюсь, это работает нормально...</center>
Во-первых, хочу поблагодарить тебя за эту замечательную идею. Я пытаюсь сделать что-то подобное, но у меня есть проблема. Надеюсь, ты сможешь помочь. Когда я пытаюсь отправить что-то, что содержит пробелы, отправляется только первая часть, вот так: for i from=2 to=5 do={:local id [/queue simple find target-addresses="192.168.1.$i/32"];:local name [/queue simple get $id name];:local targ [/queue simple get $id target-addresses];/tool fetch mode=http address=mysite.com src-path=("/mt/insert.php?name=$name&dst=$targ") dst-path="/netwatch" port=80 host=mysite.com} Если имя было “Sarah Mark”, то отправляется только Sarah, а всё остальное, включая $targ, игнорируется! Если ты заметил, я не обновляю, а вставляю данные. Я хочу вставить имена моих простых очередей и цели в базу данных. Есть ли какой-то способ это сделать? Буду признателен.
Извини, что я долго не отвечал и не видел твое сообщение раньше, не знаю, исправил ли ты это или нет. Дело в том, что проблема в пробелах. Переменная, содержащая "Sarah Mark", должна быть отформатирована как "Sarah%20Mark" перед отправкой на твой веб-сервер, потому что он не любит пробелы.
Отличная работа. На самом деле, Mikrotik запрашивает php, задает значения, php в домене сохраняет эти значения в SQL, а display.php показывает записи SQL по всему миру. Это именно то, что я искал. Я заметил одну вещь после тестирования. У меня подключены 2 ADSL модема/роутера к 433AH (назовем его ROS1). У меня есть 2 канала связи от ROS1 к 2 роутерам 433AH (назовем их ROS2 и ROS3). Интервал запроса get_status.php составляет 10 минут. Я использую этот код для netwatch в ROS1, чтобы проверить 2 ADSL линии и 2 канала связи с ROS2 и ROS3, получая корректный статус на веб-странице. Единственное, что меня беспокоит, это то, что когда ADSL модемы отключаются, значения, сохраненные в базе данных, остаются, и пользователь, заходя на мой домен, видит статус «В сети» для всего. На самом деле, они офлайн, потому что get_status.php больше не запрашивается отключенным роутером. Не должен ли php что-то делать для удаления этих значений каждые 9 минут и 59 секунд? Так каждую 10 минуту статус будет правильным? Просто мысль. PS: Возможно, стоит проверить значение fileatime/filemtime в php? Я на правильном пути? Еще хочу узнать, сработает ли этот код для отображения числа пользователей в hotspot с другим полем под названием users в таблице: /tool fetch mode=http address=www.yourpage.no src-path=("/net_status.php?router=1&status=1&time=".[/system clock get time]."%20".[/system clock get date]&users=".[/ip hotspot access print count-only]) dst-path="/netwatch" port=80 host=www.yourpage.no
Итак, после нескольких тестов и без знаний по скриптованию в устройствах MikroTik, я использовал такой обходной путь для статистики пользователей хотспота MikroTik на внешнем сайте, при этом не имея возможности использовать rrdtool (возможно, на общем хостинге с cPanel, PHP и MySQL). Надеюсь, что смогу помочь многим другим, у кого была такая же проблема, как у меня. Это отправка каждую минуту количества активных пользователей хотспота на мой сайт. Я также в процессе написания модуля для Joomla, где можно настроить названия роутеров и т. д. Это не мой скрипт. Я просто модифицировал вышеуказанный. Кроме того, он больше не в netwatch. Он в scripting/schedules. Итак, вот что вам нужно сделать: как указано выше от fosben: Создать базу данных с названием «netwatch» и таблицу с названием «netwatch». Создайте следующие поля: id (Int, auto, index), name (varchar), users (varchar). Теперь вставьте несколько роутеров в базу данных, вам нужно только заполнить поле «name», остальные будут заполнены позже автоматически. Вам нужны три PHP-файла, указанные выше: databaseconfig.php <?php $conn = mysql_connect("localhost", "username", "password") or die(mysql_error()); $db=mysql_select_db("netwatch") or die(mysql_error()); ?> net_status.php <?php /** * @author bent ole fosse * */ include "databaseconfig.php";
// Получение данных из заголовка $hotspot=$_GET['hotspot']; $users=$_GET['users'];
$query="UPDATE netwatch SET users='".$users."' WHERE id='".$hotspot."'";
$result=mysql_query($query) or die(mysql_error());
echo "done"; ?> display.php <?php /** * @author bent ole fosse * */ include "databaseconfig.php";
$query="SELECT * FROM netwatch"; $result=mysql_query($query) or die(mysql_error()); $num=mysql_numrows($result);
echo "
";
echo "
Hotspot
Users
";
echo "
";
for ($i=0; $i<$num; $i++) { echo "".mysql_result($result,$i,"name")."<br>"; }
echo "
";
for ($i=0; $i<$num; $i++) { echo "".mysql_result($result,$i,"users")."<br>"; }
echo "
";
echo "
<center>Состояние активных пользователей</center>
"; echo "
"; ?> В коде display.php, вероятно, вы захотите добавить время, когда файл запрашивается роутером, или просто сохранить временное поле в базе данных для каждого роутера. Я просто добавил время, когда файл был доступен. <?php // Измените на имя файла $last_modified = fileatime("net_status.php");
// Отображение результатов // например. Последнее изменение в понедельник, 27 октября 2003 г., в 14:59 print "Последний доступ " . date("l, dS F, Y @ h:ia", $last_modified); ?> Теперь для роутеров MikroTik (я использую версию 4): В /System Scripting добавьте скрипт с именем “hotspotusers” и отметьте все политики. Исходный код для этого: :local husers [/ip hotspot host print count-only]; /tool fetch mode=http address=www.webpage.com src-path=("/folder/net_status.php?hotspot=1&users=$husers") dst-path="/netwatch" port=80 host=www.webpage.com} hotspot=1 — это имя роутера. Оно должно быть таким, как установлено в базе данных. Разные номера для каждого роутера 1, 2, 3 и т. д. В /system scheduler добавьте расписание с именем “hotspotusers schedule”, дата начала “Jan/01/1970”, время старта “00:00:00”, интервал “00:01:00”, задержка “00:00:00”. Событие “hotspotusers” и отметьте все в политике, чтобы при запуске расписания также выполнялся скрипт. Таким образом, каждые 1 минуту каждый роутер MikroTik запрашивает net_status.php и сохраняет количество пользователей в базе данных. Любой пользователь, запрашивающий ваш домен (http://www.webpage.com), увидит display.php и получит последние сохраненные значения из базы данных. Надеюсь, это поможет. Уверен, что мне это помогло. Вся заслуга принадлежит fosben.
Код netwatch для включения: Код: Выбрать все /tool fetch mode=http address=www.yourpage.no src-path=(“/net_status.php?router=1&status=1&time=”.[/system clock get time].“%20”.[/system clock get date]) dst-path=“/netwatch” port=80 host=www.yourpage.no Код netwatch для отключения: Код: Выбрать все /tool fetch mode=http address=www.yourpage.no src-path=(“/net_status.php?router=1&status=2&time=”.[/system clock get time].“%20”.[/system clock get date]) dst-path=“/netwatch” port=80 host=www.yourpage.no Для этих скриптов нужно использовать MikroTik роутер или php-скрипт? В http address= указывается наш xampp локальный хост, например http://localhost/bla..bla, или это должно быть доменное имя? Могу я использовать IP-адрес? Поскольку я использую xampp для apache-сервера, какой http address мне следует использовать? Ros — это Router OS? Извините, я новичок. Спасибо.
Файлы ДОЛЖНЫ быть размещены на вашем сервере, так как они связаны с базой данных MySQL. Если вы сохраните файлы в вашем RB, это не сработает, потому что база данных отсутствует. http-адрес = URL вашего сайта или IP-адрес на вашем локальном компьютере, а host = IP-адрес пользователя, которого вы хотите отслеживать. (Обратите внимание, что IP-адрес пользователя ДОЛЖЕН быть СТАТИЧНЫМ!!) RoS = Router OS. Вопрос для разработчиков по этому скрипту: Может ли каждое время работы и время простоя храниться в отдельной строке в базе данных, а не только последнее состояние устройства/пользователя, чтобы мы могли видеть, когда пользователь в сети и как долго он был в сети до отключения?
в приложениях со скриншотами вверх и вниз, а также на веб-сервере и в работе на вебе, пожалуйста, дайте совет. после того как я разместил данные типа varchar на веб-сайте, они не отображаются. спасибо.