Каталог Поиск 0 Сравнить 0 Закладки 0 Корзина Войти
Каталог
105082, Москва, ул. Фридриха Энгельса, 75с21, БЦ Бауманский ИТКОЛ
Пн - Пт: с 09-00 до 18-00 Сб: с 10-00 до 18-00 Вс: выходной
Страницы: 1 2 След.
RSS
Получение статистики пользователей Mongodb, UniFi Network
 
Здравствуйте, можно ли получить из MongoDB статистику трафика (МБ) по MAC-адресам пользователей? В портале у нас есть информация о полученных байтах по MAC-адресу. Во-вторых, интересно узнать, есть ли возможность заблокировать пользователя, когда он достигает лимита скачивания, например, 1 ГБ в месяц. Спасибо. Михаил.
 
ordos... как вообще использовать API, чтобы получить такие статистики, как ты говорил?
 
Не понимаю, почему эти опции до сих пор не добавили в контроллер UniFi. Если они показываются на странице Hotspot Manager, почему их нельзя отобразить так, чтобы каждый клиент мог видеть свою информацию? Просто непонятно.
 
Я использую API Unifi, чтобы получить данные о трафике пользователей и гостей. Через API можно запросить эндпоинт api/s/site/stat/alluser, который содержит трафик для каждого пользователя/mac. Таким образом, нет необходимости напрямую подключаться к внутреннему серверу mongodb, и одновременно можно выполнять действия через API, например блокировать конкретных пользователей на основе их трафика.
 
Mks, хорошо, я продолжу искать, спасибо. Вот что у меня есть для отображения оставшегося времени.

<?php
$m = new MongoClient("mongodb://localhost:27117");
$db = $m->ace;
$clguest = $db->guest;
?>

<?php
$rangeQueryguest = $clguest->find(array('mac' => ($_GET["m"])));
$rangeQueryguest->sort(array('_id' => 1));
foreach ($rangeQueryguest as $docguest) {
   $endo = $docguest['end'];
   $voucher = $docguest['voucher_code'];
}
?>

<br />

<?php
$start = time();
$end = "{$docguest['end']}\n";
$td = time_diff($end - $start); // результат должен быть положительным
$td2 = time_diff($start - $end); // результат должен быть положительным
if ($td2 > 1) $td .= ($td == "Expiro") ? "" : ""; // в этом примере "назад"
echo $td;

function time_diff($s) {
   $m = 0;
   $hr = 0;
   $d = 0;
   $td = "Билет истек или недействителен";
   if ($s > 59) {
       $m = (int)($s / 60);
       $s = $s - ($m * 60); // остаток секунд
       $td = "$m мин";
   }
   if ($m > 59) {
       $hr = (int)($m / 60);
       $m = $m - ($hr * 60); // остаток минут
       $td = "$hr час";
       if ($hr > 1) $td .= "ов";
       if ($m > 0) $td .= ", $m мин";
   }
   if ($hr > 23) {
       $d = (int)($hr / 24);
       $hr = $hr - ($d * 24); // остаток часов
       $td = "$d день";
       if ($d > 1) $td .= "й";
       if ($d < 3) {
           if ($hr > 0) $td .= ", $hr час";
           if ($hr > 1) $td .= "ов";
       }
   }
   return $td;
}
?>
 
Вот очень простой способ подключения MongoDB к Excel или любому другому стороннему приложению. SimbaODBCDriver. Обратите внимание, что это программное обеспечение платное — скоро появятся пробные версии. В данный момент я не предлагаю разрабатывать бесплатное ПО для получения доступа к данным MongoDB через приложения — это исключительно коммерческое направление. Тем не менее, обратите внимание на следующее из документации Mongo — Драйверы¶. Смотрите следующие страницы для получения дополнительной информации о драйверах MongoDB: JavaScript (Language Center, docs), Python (Language Center, docs), Ruby (Language Center, docs), PHP (Language Center, docs), Perl (Language Center, docs), Java (Language Center, docs), Scala (Language Center, docs), C# (Language Center, docs), C (Language Center, docs), C++ (Language Center, docs), Haskell (Language Center, docs), Erlang (Language Center, docs). Некоторые из них довольно экзотические. ODBC-драйвер гораздо полезнее. Существует проект с открытым исходным кодом по разработке ODBC-драйвера — NYU Project, но он пока на ранней стадии. Учитывая характер данных, хранящихся в базах mFI и UniFi, MongoDB в долгосрочной перспективе может оказаться не лучшей СУБД: в MongoDB есть задачи, которые трудно реализовать. Однако у MongoDB есть функции, которые позволяют быстро запустить что-то в начале проекта и легко адаптироваться к меняющимся структурам данных. R+C
 
Окей. Это та же самая идея, но реализация совсем другая. :-) Утилита mongo в командной строке запускает JavaScript прямо из командной строки... а тебе нужно PHP или Java, которые работают в контексте веб-сервера.  
Я особо не возился с MongoDB или UniFi. Зато установил RockMongo http://rockmongo.com/ — это браузер для MongoDB, написанный на PHP. Для него поставил драйвер mongo-php, но сам PHP не писал. Думаю, usage.js на JavaScript можно довольно легко переписать на PHP... или на JSP тоже можно, но у меня в стеке веб-сервера такая поддержка отсутствует.
 
Окей, вот что я пытаюсь сделать уже 4 месяца: мои клиенты Wi-Fi подключаются к моему гостевому порталу, я продаю им ваучеры, и как только они авторизуются, их перенаправляет на страницу info.php, где они могут видеть оставшееся время. Я хочу, чтобы там же отображалось и количество использованных байтов. Например, если клиент купил ваучер на 30 дней и 2000 МБ, он или она могли бы отслеживать оставшееся время и трафик, обращаясь к странице типа «status.php» или «status.jsp».
 
Скрипт запускается из командной строки с помощью утилиты mongo. Я не стал заморачиваться с доступом через веб-браузер.  
Я работаю на Linux. Не знаю, как это сделать на Windows, но, думаю, запуск будет примерно таким же простым, как в моём примере.  
На Linux скрипт у меня запускается ночью по расписанию через cron, и результаты мне приходят на почту. Моя задача — следить за избыточным использованием, а частый мониторинг (например, почасовой) меня не очень интересует.
 
Похоже, это именно то решение, которое я искал, но как мне подключиться к usage.jsp? Я попробовал ввести «https://mydomain.com:8443/usage.jsp», но выдает ошибку. Я просто скопировал твой код и вставил его в js-файл.
 
Смотрите вложенный файл (вставлен ниже, но отступы потерялись).  
// Пример использования:  
// mongo --port=27117 < usage.js  
// mongo --port=27117 < usage.js | grep "..:.." | sort -k4 -n -r | head -20  

use ace;  
// За сколько часов подводить итог  
var hours = 24;  
var users = db.user.find();  
for (var j = 0; j < users.length(); j++) {  
 var user = users[j];
 var sessions = db.session.find({"mac": user.mac, disassoc_time: {$gt: new Date().getTime() / 1000 - hours * 3600}});  
 var tx_bytes = 0;  
 var rx_bytes = 0;  
 for (var k = 0; k < sessions.length(); k++) {  
   var session = sessions[k];
   tx_bytes += session.tx_bytes;  
   rx_bytes += session.rx_bytes;  
 }  
 var hostname = user.hostname + " ";  
 var tx = tx_bytes / 1048576 + " ";  
 var rx = rx_bytes / 1048576 + " ";  
 print(user.mac + " " + hostname.substr(0,29) + " Rx: " + rx.substr(0,9) + " Tx: " + tx.substr(0,9));  
}
 
Подключение к mongodb — это не проблема, а вот получить количество использованных байтов гостя — вот задача. Я пытаюсь разобраться с этим уже несколько месяцев безуспешно. Если кто-то из гениев уже сделал внешнюю страницу, которая получает нужные данные по использованным байтам гостя, пожалуйста, дайте знать.
 
Я регулярно пользуюсь mongoVUE, и это просто находка для просмотра и редких правок в базе данных. Но изобретать велосипед — то есть проходить все круги ада и искать обходные пути к неизбежным препятствиям, как, кажется, указывает мистер Микиели — чтобы получить доступ к базе из такой программы, как Excel, для меня немного сложно. Может, кто-то и заинтересуется взять это с доски и действительно сделать… а потом пошагово объяснить нам обычным смертным. В таком случае мы отпразднуем этого человека… ой, то есть гипотетического героя… как бога MongoDB. Можно даже футболку для официального подтверждения.
 
В UniFi нет ничего, что мешало бы другому ПО получать доступ к данным в MongoDB. В конфигурационном файле mongo можно задать параметры, которые ограничат подключение к базе с определённых IP-адресов. Самый простой способ освоиться — установить MongoVue на другом хосте и настроить подключение к MongoDB. Тебе понадобится IP-адрес и номер порта, на котором слушает mongod. Когда освоишься, можно изучить и другие варианты подключения.

MongoDB изначально создавалась как распределённая и реплицируемая система, и эти функции легко реализовать. Хочу отметить, что разработчики MongoDB говорят — 32-битная версия подходит только для разработки и ни в коем случае не должна использоваться в промышленных системах. Так что если решил «погрузиться и покопаться», советую сразу перейти на 64-битную версию (и настроить адекватную авторизацию пользователей).

Если используешь удалённый контроллер, который управляет множеством отдельных площадок, можно сделать шардинг базы по площадкам (или логически сгруппированным сайтам) и реплицировать базу целиком на машину для отчётности и запросов (чтобы не перегружать рабочую БД тяжёлыми запросами). Всем, кто собирается делать BI-панель с данными UniFi, стоит обязательно настроить репликацию. Есть драйверы от Simba, которые позволяют сторонним приложениям легко работать с данными Mongo.

R+C
 
@Uberseehandel и @JMichieli: полностью поддерживаю этот разговор. Надеюсь, у вас найдется время проработать этот вопрос и проверить, можно ли это реализовать. Если в текущем коде есть какая-то преграда, мешающая подключению к базе данных через Excel (обожаю это!), то, возможно, команду разработчиков Unifi можно уговорить добавить такой “проход” в код версии 3.x. jim
 
Вы вдохновили на интересный разговор о функции, которую давно обсуждают на этом форуме, но так и не реализовали. А пока ваш второй вопрос решается проще. Да, вы можете ограничить использование, если пользователи заходят в систему через гостевой портал Unifi captive. Ограничение возможно, если пользователи подключаются с паролем через captive портал (однако лимиты сбрасываются каждые 24 часа — этот баг исправлен). Это настраивается через файл messages.properties, который находится в папке «bundle» внутри структуры папок unifi. Файл уже существует, но нужно вручную добавить записи, которые ограничивают трафик. Ниже пример с такими записями, выделенными отдельно:

## package 1  
# сумма указана в долларах США  
package.1.amount=1.99  
package.1.hours=2  
# как отображается в Hotspot Manager  
package.1.name=Fast Pass - до 1 часа (100MB)  
# как указывается в выписке по кредитной карте  
package.1.charged_as=Lucia Internet 1 hr fast pass  
# перезаписывать ли политику группы пользователей для WLAN/User, по умолчанию false  
package.1.limit_overwrite=true  
# кб/с, по умолчанию без ограничений  
package.1.limit_down=2048  
# кб/с, по умолчанию без ограничений  
package.1.limit_up=1024  
# Мбайт, по умолчанию без ограничений  
package.1.limit_quota=100  

Другой способ ограничения трафика — через ваучеры, что дает больше гибкости по времени. Встроенная система ваучеров Unifi не поддерживает ограничение по объему, но несколько участников форума разработали обходные пути. В приложении — отдельная сторонняя программа для создания ваучеров на Windows. Она позволяет создавать ваучеры с лимитом данных и имеет несколько дополнительных функций. Если вы, например, создадите ваучер на 1 месяц, он деактивируется после достижения лимита.  
Исходная тема, с которой началась разработка этой утилиты, здесь.
 
Очень простой способ удалённо подключиться к UniFi mongodb — использовать OpenSSH в качестве прокси. У меня контроллер установлен на Ubuntu Server, и я подключаюсь с моего Ubuntu-пк к mongo через UMongo. Просто на локальной машине запускаешь ssh -L 127.0.0.1:27017:127.0.0.1:27117 username@controller-address — и mongodb контроллера будет доступен через порт 27017 на твоём локальном компьютере.
 
Позвольте немного уточнить своё высказывание. Вы действительно можете остановить процесс mongod после запуска UniFi и затем запустить свой собственный. Очень хотелось бы, чтобы Uberseehandel говорил более понятно... Хотя этот метод работает, я всё равно не стал бы его использовать, учитывая проблемы с безопасностью, о которых вы упоминали в другой теме. Не говоря уже о том, что придётся создавать обходные решения, чтобы этот трюк срабатывал каждый раз, когда система случайно выключается из-за отключения питания или по другой причине. Кстати, я сейчас работаю над небольшим tcp-сервером, который будет отправлять и принимать команды удалённо с аутентификацией — чтобы выполнять простые действия с базой данных, например, получать отчёты или блокировать пользователей.
 
Ты пробовал сделать это самостоятельно? Если да и у тебя получилось, какую версию UniFi ты использовал? Насколько я понимаю, UniFi 3.1 НЕ позволит сделать это, потому что он, видимо, проверяет, запущен ли экземпляр самим собой, и если нет — завершает его. Обойти это никак нельзя. Позволь объяснить шаг за шагом:

1. Скачай новую версию mongoDB с официального сайта.
2. Помести mongod.exe в папку bin в директории UniFi (на самом деле это ничего не меняет, потому что бинарник абсолютно такой же, как и тот, что там уже есть).
3. Запусти [новый] mongod.exe с параметрами, позволяющими подключаться к нему удалённо и используя существующий dbpath UniFi.
4. Проверь, доступны ли данные, с помощью mongoVUE — вся база UniFi доступна удалённо.
5. Запусти UniFi.
6. UniFi ЗАВЕРШАЕТ РАБОТУ ЗАПУЩЕННОГО INSTANCА MONGO.
7. UniFi ЗАПУСКАЕТ СВОЙ СОБСТВЕННЫЙ экземпляр с собственными параметрами.

Параметры, которые использует UniFi, можно немного менять — но вот bind_ip менять нельзя. Опять же, без изменения родного java-кода это, похоже, невозможно.

Пожалуйста, дай знать, если у тебя был иной опыт.
 
Вам нужно заменить поставляемый движок MongoDB на тот, который вы скачали с официального сайта mongo. R+C
Страницы: 1 2 След.
Читают тему (гостей: 1)