Работаем с Router OS через API
Задача: организовать блокировку абонентов по «балансу», установка скорости интернета абонента, защита от «ручных IP». Биллинг: Lanbilling, Железка: Router OS
- Блокировка по «балансу»
Жизнь замечательных грибов
Архив статей и записей написанных Грибовым Павлом
Задача: организовать блокировку абонентов по «балансу», установка скорости интернета абонента, защита от «ручных IP». Биллинг: Lanbilling, Железка: Router OS
При следующей настройке Mikrotik:
И стандартных настройках FreeRadius мы получаем в атрибут User-Name, MAC адрес абонента. А User-Password — пустой. Нужно научить FreeRadius принимать пустые пароли. Самое простое, поправить default секцию authorize следующим образом:
1 2 3 4 5 6 7 8 9 10 11 12 |
authorize { if(User-Name =~ /^([0-9A-F]{2}:?){6}$/ && User-Password == ''){ update request { User-Password = "123" } update control { Auth-Type := Accept } } ... |
, т.е. если мы видим что пришел User-Name MAC адрес, то мы подставляем ему пароль 123 и проводим авторизацию в любом случае, даже если данный MAC адрес не найден в базе (в этом случае ответ придет Accept, но без IP, который будет автоматом выдан из пула свободных DHCP).
При этом в БД в таблицу radreply нужно добавить строки следующего вида:
1 2 3 4 5 6 |
+----------+-------------------+---------------------+----+-------------+ | id | username | attribute | op | value | +----------+-------------------+---------------------+----+-------------+ | 33727393 | 18:D6:C7:2A:5E:F5 | Mikrotik-Rate-Limit | := | 10M | | 33727396 | 18:D6:C7:2A:5E:F5 | Framed-IP-Address | := | 10.30.100.3 | +----------+-------------------+---------------------+----+-------------+ |
radtest b8:69:f4:5a:45:5b «» localhost 1812 secret123
Есть тысяча способов ограничить пользователя в 1С. Самый простой, если часть кода самописная, это «жесткая» привязка к конкретным пользователям. Например это можно сделать так:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
&НаСервере Функция ПроверитьПользователя(пользователь) рез=ложь; если пользователь=ПользователиИнформационнойБазы.ТекущийПользователь().Имя тогда рез=Истина; конецесли; возврат рез; конецфункции &НаКлиенте Процедура Моржа(Команда) если ПроверитьПользователя("Администратор")=истина или ПроверитьПользователя("Помидоров")=истина или ПроверитьПользователя("Сантаклаусов")=истина тогда Форма=ПолучитьФорму("Обработка.ОтчетПоМоржеНовыйГрибов.Форма"); ДанныеФормы=Форма.Объект; //ДанныеФормы=РеализацияТовараНаСервере(ДанныеФормы); КопироватьДанныеФормы(ДанныеФормы,Форма.Объект); Форма.Открыть(); иначе сообщить("Вам это не нужно.."); конецесли; КонецПроцедуры |
Ну вот, кто-то «подхватил» и продолжил наконец развивать заброшеный автором менеджер подключений Pac Manager. Ура товарищи. Ловите ссылку: https://www.asbru-cm.net/
В этой сборке исправлены ошибки работы под последними версиями Ubuntu, под которыми оригинальный Pac Manager без бубна уже не работал.
Задача: отправить сообщение абоненту сети IRC.
Решение: написал соответствующий класс. Исходники выложил на GitHub
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 |
<?php /* * (с) 2018 Грибов Павел * http://грибовы.рф * * Если исходный код найден в сети - значит лицензия GPL v.3 * * В противном случае - код собственность ГК Яртелесервис, Мультистрим, Телесервис, Телесервис плюс * */ class Tirc{ var $debug=false; var $server="localhost"; var $port=6667; var $errno0; var $errstr=""; var $timeout=10; var $socket; var $nick="noname"; var $chanel="noname"; /** * Внутрення функция для логов */ private function putlog($st){ if ($this->debug==true) echo date("H-i-s")." : ".trim($st)."\n"; } /** * Конструктор класса. Вызывается при создании экземпляра * @param type $server - хост сервера * @param type $port - порт сервера */ function __construct($server, $port,$debug=false) { $this->server = $server; $this->port = $port; $this->debug=$debug; $this->putlog("лог в режиме DEBUG"); $this->putlog("сервер $server, порт $port"); } /** * Соединение с сервером. Возврат - результат * @return type */ function connect(){ $this->putlog("пробуем соедениться с irc сервером"); $this->socket=stream_socket_client("tcp://$this->server:$this->port", $this->errno, $this->errstr,$this->timeout,STREAM_CLIENT_CONNECT | STREAM_CLIENT_PERSISTENT); $this->putlog("возврат: errno: $this->errno, errstr: $this->errstr, socket: $this->socket"); return $this->socket; } /** * Разрыв соединения с сервером. Возврат - результат */ function disconnect(){ $this->putlog("пробуем закрыть соединение с сервером $this->socket"); $ret=fclose($this->socket); $this->putlog("результат: $ret"); } /** * Послать команду серверу. Возврат false или количество посланый байт * @param type $command * @return type */ function send($command){ $this->putlog("пробуем послать команду сервер $command"); $ret=fwrite($this->socket, $command); $this->putlog("результат: $ret"); return $ret; } function Join($chanel){ $this->chanel=$chanel; $res=$this->send("JOIN :#$chanel\r\n"); return $res; } function is_ping($line){ if(strstr($line, 'PING')) { $this->putlog("получен PING"); return true; } } function pong(){ $this->send("PONG :".$this->server."\r\n"); $this->putlog("отправлен PONG"); } function is_msg($line){ if(strstr($line, 'PRIVMSG')) return true; } function SetNick($nick){ $this->nick=$nick; $ret=$this->send("NICK $nick\r\n"); return $ret; } function User($name){ $ret=$this->send("USER $name $this->server bla :$name\r\n"); return $ret; } function listChans(){ $this->send("LIST\r\n"); } function sendmessage($target, $msg){ $this->send("PRIVMSG $target :$msg\r\n"); } function loop($onMessage){ while (!feof($this->socket)) { $res = fgets($this->socket, 256); // ждем сообщений $onMessage($res); if($this->is_ping($res)) $this->pong(); }; } } |
Пример использования:
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 |
<?php /* * (с) 2018 Грибов Павел * http://грибовы.рф * * Если исходный код найден в сети - значит лицензия GPL v.3 * * В противном случае - код собственность ГК Яртелесервис, Мультистрим, Телесервис, Телесервис плюс * */ include_once 'irc_class.php'; $irc=new Tirc('ыкуаыукаыука',6667,true); $irc->connect(); $irc->SetNick("каыукаы"); $irc->User("ыукаыукаыук"); $irc->Join("tviinet"); $irc->listChans(); $irc->loop("OnMessage"); $irc->disconnect(); function OnMessage($msg){ global $irc; var_dump(trim($msg)); if(strstr($msg,"PRIVMSG")){ //получаю кто прислал сообщение? $ma= explode("!",$msg); $user= str_replace(":", "", $ma[0]); $irc->sendmessage("$user","Hello $user!"); }; //список пользователей канала if(strstr($msg,":$irc->server 353 $irc->nick = #$irc->chanel :")){ $users_list= str_replace(":$irc->server 353 $irc->nick = #$irc->chanel :", "", $msg); //получаю список кто онлайн? $irc->send("ISON $users_list"); }; //кто онлайн? if(strstr($msg,":$irc->server 303 $irc->nick :")){ $users_online_list= explode(" ",trim(str_replace(":$irc->server 303 $irc->nick :", "", $msg))); //Всем кто онлайн, отправляем сообщения foreach ($users_online_list as $user) { $irc->sendmessage("$user","Hello $user!"); } }; }; |