Para todos los que estan usando las librerías de PHP de Denis Basta (como yo), luego de actualizar tu RouterOS a la version 6.43 «en adelante» van a tener el inconveniente de que la libreria deja de funcionar (de conectar mas bien). Esto se debe a que el Team de Mikrotik Modifico la manera en que RouterOS internamente almacena las contraseñas, ya que según explican en su foro ellos comparan al viejo Telnet inseguro que usa contraseñas en texto plano con el API inseguro, y el SHH con el API HTTPs. Esto genera un poco de controversia entre los que usan el API sin HTTPs ya que lo bueno era que al menos las contraseñas viajaban encriptadas.
A raíz de las ultimas vulnerabilidades y tantos ataques dirigidos a dispositivos con Mikrotik, han tenido que hacer muchos cambios que nos obliga a tener que ponernos las pilas e instalar un certificado en cada router para no ser víctimas de los ataques de diccionario (con MKBrutus u otros) que atacan el puerto 8728 (API inseguro). Seria muy importante tener también HTTPs en el dominio donde tengamos corriendo la libreria.
Si se fijan en el manual explican la diferencia entre lo que seria el antes y el después de la version 6.43. Incluso aclaran que en la version 6.45.1 ya se toma como obsoleto.
Por suerte hay un colega que edito la libreria de Denis Basta para que intente conectar primero de forma segura, si no tiene exito lo hace de manera plana. A editar nuestro codigo.!. Si se fijan en la linea 109 y 116 estan las 2 formas de loggeo.
Requisito: Descargar la librería api_mt_include2.php (podes hacerlo en uno de nuestros primeros ejemplos)
<?php require_once('api_mt_include2.php'); ?>
<?php
/*
/// AUTOR: Tech-Nico.com ///
/// admin@tech-nico.com /////
/// API: Firewall Address-list: Elimino una direccion IP a un address-list
/// Fecha: 10/08/2016
//////// configura tus datos
$ServerList ="192.168.100.1"; //ip_de_tu_API
$Username ="api"; //usuario_API
$Pass ="#pass"; //contraseña_API
$Port ="8727"; //puerto_API
*/
/// VARIABLES DE FORMULARIO
$address= "5.4.3.1"; // direccion que borraremos en el address-list
$list= "FACEBOOK"; // nombre de la lista que borraremos
if( $address !="" && $list!="" ){
$API = new routeros_api();
$API->debug = false;
if ($API->connect($ServerList, $Username, $Pass, $Port)) {
$API->write("/ip/firewall/address-list/getall",false);
$API->write('?address='.$address,false);
$API->write('?list='.$list,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ); // busco si ya existe
if(count($ARRAY)>0){
$ID = $ARRAY[0]['.id'];
$API->write('/ip/firewall/address-list/remove', false);
$API->write('=.id='.$ID, true);
$READ = $API->read(false);
}else{ // si no existe lo creo
echo 'La IP "'.$address.'" No existe en el address-list "' . $list .'" del firewall L3, no se hará nada!';
}
$API->disconnect();
}
}
?>
Primero en tech-nico.com: Por favor, pongan la fuente si van a copiar y pegar en otro sitio.!!.
En esta ocasión, les traigo algo muy usado por todos los mikroteros. Los address-list que siempre nos han facilitado las cosas. He visto ejemplos en otros sitios webs intentando manejarlas, y hasta incluso códigos copiados/editados de este blog (sin poner la fuente), pero claro, sin funcionar :p. Bueno, aca lo tienen!.
<?php require_once('api_mt_include2.php'); ?>
<?php
/*
/// AUTOR: Tech-Nico.com ///
/// admin@tech-nico.com /////
/// API: Firewall Address-list: agrego una direccion IP a un address-list
/// Fecha: 26/08/2015
//////// configura tus datos
$ServerList ="192.168.100.1"; //ip_de_tu_API
$Username ="api"; //usuario_API
$Pass ="#pass"; //contraseña_API
$Port ="8727"; //puerto_API
*/
/// VARIABLES DE FORMULARIO
$address= "5.4.3.1"; // direccion que cargaremos en el address-list
$list= "FACEBOOK"; // nombre de la lista donde cargaremos la direccion
$comment= "Este es un ejemplo de tech-nico.com"; // comentario
if( $address !="" && $list!="" ){
$API = new routeros_api();
$API->debug = false;
if ($API->connect($ServerList, $Username, $Pass, $Port)) {
$API->write("/ip/firewall/address-list/getall",false);
$API->write('?address='.$address,false);
$API->write('?list='.$list,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ); // busco si ya existe
if(count($ARRAY)>0){
echo "Error: Ya existe " . $list ." con la direccion: ".$address;
}else{ // si no existe lo creo
$API->write("/ip/firewall/address-list/add",false);
$API->write('=address='.$address,false); // IP
$API->write('=list='.$list,false); // lista
$API->write('=comment='.$comment,true); // comentario
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
echo "Se agrego la direccion " . $address ." a la lista: ".$list;
}
$API->disconnect();
}
}
?>
Por favor, pongan la fuente si van a copiar y pegar en otro sitio.!!
A pedido de (ahora un colaborador del blog) Alejando Mogollon, voy a postear un código muy sencillo para mostrar el ping desde tu router Mikrotik RouterOS hacia la dirección IP que quieras testear para que agregues a tu App, o simplemente potencies tus herramientas de monitoreo y soporte técnico. Este es el resultado:
En este caso, (para testear) desenchufe el cable del port WAN de mi router.
Solo debemos setear como siempre los valores del Router y en este caso las variables $ping_address y $ping_count.
//////// configura tus datos
$ipRouteros ="192.168.100.1"; //ip_de_tu_API
$Username ="api_usuario"; //usuario_API
$Pass ="#pass"; //contraseña_API
$Port = 8727; //puerto_API
$ping_address = "8.8.8.8"; // ip a pingear que puede venir de un formulario
$ping_count = 5; // cantidad de pings que quiero ejecutar.
IMPORTANTE: Agregarle permisos «test» al grupo del usuario que estes usando para conectar. De lo contrario va a tirar un error de permisos.
Te voy a enseñar como graficar en vivo una interfaz en particular de tu RouterOS. El ejemplo que arme en esta ocasión con las fabulosas, increíbles gráficas highcharts.com. (tal como lo pidio Cesar Maffini).
Actualización: un fiel lector de nombre Alejandro Mogollon nos armo un video tutorial para demostrar que es muy muy facil la puesta en marcha.
El codigo tiene 3 archivos:
1) api_mt_include2.php: API RouterOS.
2) data.php: Conecta a RouterOS, trae TX, RX y los imprime en formato JSON.
3) index.html: Utiliza Ajax para llamar data.php cada 1 segundo y graficar puntos en tiempo real usando highcharts.
Sin duda esta es la parte mas importante del codigo En la linea donde comienza el setInterval lo que hace es llamar a la funcion requestDatta() y pasarle como parametro el nombre de la interfaz de red de nuestro Mikrotik que queremos graficar en tiempo real, cada 1 segundo. Esto funciona con cualquier interfaz. Bridge, Vlan, pppoe, Wlan, etc. En este caso, el parametro con el nombre de la interfaz que le vamos a pasar a la funcion requestDatta lo asigne a un campo de texto editable para hacerlo un poco mas interesante.
function requestDatta(interface) {
$.ajax({
url: 'data.php?interface='+interface,
datatype: "json",
success: function(data) {
var midata = JSON.parse(data);
if( midata.length > 0 ) {
var TX=parseInt(midata[0].data);
var RX=parseInt(midata[1].data);
var x = (new Date()).getTime();
shift=chart.series[0].data.length > 19;
chart.series[0].addPoint([x, TX], true, shift);
chart.series[1].addPoint([x, RX], true, shift);
document.getElementById("trafico").innerHTML=TX + " / " + RX;
}else{
document.getElementById("trafico").innerHTML="- / -";
}
}
Aqui, como explicábamos mas arriba, tenemos la función que se conecta al RouterOS y nos trae el dato de TX / RX de la interfaz que nosotros le pidamos.
Los datos que traemos de data.php estan en formato JSON, por lo tanto los tenemos que parsear para poner cada dato en una variable y luego graficar el punto en el Highchart. Si se fijan, es muy importante convertir el valor que viene en JSON a numero «parseINT».
La linea, shift=chart.series[0].data.length > 19; la usamos para que, cada vez que agregamos un punto nuevo, guardemos un indice con la cantidad de puntos, que le va a decir al chart cuando comenzar a pisar los valores antiguos de la serie.
Aqui pego las lineas con comentario:
var TX=parseInt(midata[0].data); // UPLOAD
var RX=parseInt(midata[1].data); // DOWNLOAD
var x = (new Date()).getTime(); // tooltip cuando hacemos hover en el punto
shift=chart.series[0].data.length > 19; // indice de cantidad de puntos
chart.series[0].addPoint([x, TX], true, shift); // agrego TX en SERIE 0
chart.series[1].addPoint([x, RX], true, shift); // agrego RX en SERIE 1
Podemos agregar la cantidad de series que queramos; solo que mas abajo tenemos que definirlas asi:
Con esto de arriba, tendriamos serie0 y serie1 (siempre contamos de arriba hacia abajo).
Presten atencion que «data» esta vacio, ya que nosotros le agregamos los puntos en tiempo de ejecución.
Si se nos ocurre graficar un tercer valor a la par de TX y RX lo haríamos definiendo otra serie, de esta manera:
Aca tendriamos, serie0, serie1 y serie2.
Espero que se entienda.
data.php
Este archivo como dijimos mas arriba es el que se conecta al routerOS y hace su trabajito. Editen las primeras lineas con los datos de su servidor Mikrotik.
Usaremos el comando /interfaces/monitor-traffic
Este nos pide el nombre de la interfaz, que ya la traemos desde el otro archivo.
Esto ya lo hemos explicado en los posts anteriores, así que solo quiero detallar que la ultima linea dice =once= para que el trafic monitor, ejecute el comando 1 vez y pare. Si no ponemos este comando, se queda trabado, trayendo y trayendo el trafico en tiempo real, pero de manera infinita, con esto nos aseguramos que lo haga 1 vez.
Espero que les guste tanto como a mi. Investiguen un poco las graficas lindas que tiene higcharts porque son fantasticas y por supuesto si tienen modificaciones, mejoras, etc no duden en pasar un mail que las posteamos!!
Estoy pensando en usar github para control de versiones 😀
En esta ocasión, te traigo un pequeño sistema desarrollado en php y mysql para que puedas controlar cada cliente de un nodos AP de distintas o una misma localidad. Esto te permitirá habilitar/deshabilitar un MacAddress del access-list de muchísimos AP desde un solo lugar, tambien ver el nivel de señal y patearlo para que re-conecte cuando sea necesario.
Editamos el archivo config.php con los datos del mysql y con el usuario y contraseña del API. Este es el usuario y contraseña que va a utilizar el sistema para acceder a todos los equipos routerboard que cargues.
//////// Base de datos //////////////
$hostname_myCnx = "localhost";
$database_myCnx = "manage_isp";
$username_myCnx = "root";
$password_myCnx = "";
/// API /// Se usa el mismo para todos los routerboards.
$Username ="tusuario";
$Pass ="tucontraseña";
Base de datos MYSQL
Las tablas son 4, por supuesto que aqui faltan muchas cosas, como la tabla de Login, de Logs, de bajas. etc, pero para mostrar un ejemplo totalmente funcional nos alcanza con estas 4. Tabla Categorías: Contiene si el cliente es 2,4 ghz o 5,8 por ejemplo. Tabla Localidades: Como su nombre lo dice aquí cargaremos las localidades. Tabla Internet: Aquí cargaremos nuestros clientes a los que les brindamos internet. Esta tabla tiene 2 campos importantes. «ip_equipo_inalambrico» es el campo que nos identifica el equipo por el comentario que le demos en el «access-list» del RouterOS. Podemos escribirle su direccion IP o bien un string que lo identifique. Luego el campo «activo» es para identificar que hemos cortado el servicio por falta de pago. Simplemente lo identifica con 0 o 1 si esta activo y por supuesto lo activa/desactiva del access-list, identificándolo con el campo anterior «ip_equipo_inalambrico». Tabla Puntos_de_acceso: Aquí cargaremos en cada localidad (ejemplo: Liniers) y categoría (ejemplo: 2,4 Ghz), el o los puntos de acceso que necesitemos. Entonces si en Liniers tenemos 2 o 3 puntos de acceso, el cliente lo va a buscar en los 3 puntos de acceso hasta que lo encuentre. Por supuesto que si tenemos muchos puntos de acceso para 1 localidad quizás se pueda hacer mas lenta la busqueda. De todos modos podemos crear «Barrios o Zonas» (en vez de localidades) para que el sistema haga mas rapida la busqueda. Se entiende?. Aqui hay 2 cosas a recalcar, Cuando busca un cliente, lo busca «conectado» en el wireless-registration-table, esto es asi, para poder usar el sistema no solo para desactivar un cliente sino que ademas para poder tomar un reclamo. Y claro que cuando activa o desactiva lo hace en el access-list 🙂 .
Estructura de la base de datos: Pueden importar el achivo «.sql» que esta junto a los archivos a descargar, y luego lo borran por seguridad.
Pantalla principal:
1) Primer paso, recomiendo cargar las localidades, para ello vamos a {Nueva Localidad}.
2) Luego volvemos a la pantalla principal cargamos los Nodos AP o puntos de acceso en el link {Nuevo Punto de Acceso} Aqui necesitaremos elegir la localidad ( o zona), por eso es importante que primero carguemos las localidades del paso 1.
Para que el API pueda ver la señal de los equipos en el Wireless registration table de cada RB, tenemos que elegir la categoría «INALAMB 2,4» y el modo «Mikrotik Wireless»
Y finalmente, lo mas importante, tenemos que cargar la IP y puerto de nuestro Routerboard para esa localidad o zona que estemos generando. Si el RB tiene una IP privada, hacemos un port-forwarding en el router donde este la IP publica.
El modo «Mikrotik Neighbords» No esta probado pero debería estar funcionando, se usa para la categoría «INALAMB 5,8» y poder ver si el equipo cliente esta conectado. Como se trata de un AP «Ubiquiti Rocket» del cual no tenemos acceso mediante el API, lo que hacemos es acceder al API del router principal donde se encuentra conectado el Rocket y acceder al IP-Neighbords. Este nos va a mostrar todos los clientes (si el equipo esta encendido) para poder atender un reclamo y ademas ver cual es su firmware.
3) Volvemos a la pantalla principal y hacemos click sobre algun cliente.
Como ejemplo hay 2 para clickear. Editamos la localidad y categoría, presionamos en el boton [Guardar] y volvemos a entrar. Finalmente, donde dice «Ip Equipo», le ingresamos la IP o algun identificador que hayamos puesto en el comentario del access-list. Si presionan [Enter] hara una busqueda para, si el cliente esta conectado en este momento, trae sus datos.
En IP Equipo podemos poner lo que haya en el comentario, me ha pasado que no toma la primer palabra, siempre las ultimas. Tiene que ser un identificador «Unico» ya que con esto controlaremos si se activa o desactiva.
Al darle [enter], deberiamos ver datos de señal, CCQ, TimeUp. Etc. Como ejemplo les pongo una imagen de otro sistema que había hecho para uso propio.
Vean que, usando su imaginacion pueden integrar todo lo que deseen.
4) Volvemos a la pantalla principal y veremos que en el link {Nuevo Cliente} aparece la pantalla:
Revisen como esta hecho y veran que es muy facil editarlo. Cualquier duda, sugerencia o error, seran contestados aqui en los comentarios.
En esta ocasión voy a publicar un código sencillo pero que varios lectores me han consultado como se hace. El codigo se utiliza con el include para manejar el API, que pueden encontrar en cualquiera de las publicaciones anteriores.
<?php require_once('api_mt_include2.php'); ?>
<?php
////////////////////////////////////////////////////////////////////
// ESTE EJEMPLO SE DESCARGO DE www.tech-nico.com ///////////////////
// Creado por: Nicolas Daitsch. Guatrache. La Pampa ////////////////
// Contacto: administracion {@} tech-nico.com //////////////////////
// RouterOS API: Busco cliente pppoe activo y lo pateo ////////////
////////////////////////////////////////////////////////////////////
$ipRouteros="200.20.30.40"; // tu RouterOS.
$Username="blog.tech-nico.com";
$Pass="tupassword";
$api_puerto=8728;
$name = "dolores"; // ---- nombre del usuario pppoe
$API = new routeros_api();
$API->debug = false;
if ($API->connect($ServerList , $Username , $Pass, $Port)) {
$API->write("/ppp/active/getall",false);
$API->write('?name='.$name,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
if(count($ARRAY)>0){ // si el usuario esta activo lo pateo.
$API->write("/ppp/active/remove",false);
$API->write("=.id=".$ARRAY[0]['.id'],true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
}
$API->disconnect();
}
?>
A pedido del lector Vitor Monteiro, vamos a presentar un pequeño y facil ejemplo para habilitar o deshabilitar un puerto ethernet con cierto nombre.
¿Como funciona?
Lo que vamos a hacer es definir una variable llamada $name que va a contener el nombre de la interfaz que queremos activar o desactivar. El script verifica primero si ese nombre existe, luego, (si existe), almacenamos «el ID» y si «esta activa o no» en distintas variables. Si esta activa, entonces tomamos el ID y la desactivamos, de lo contrario, la habilitamos.
El codigo es el siguiente:
<?php require_once('api_mt_include2.php'); ?>
<?php
////////////////////////////////////////////////////////////////////
// ESTE EJEMPLO SE DESCARGO DE www.tech-nico.com ///////////////////
// Creado por: Nicolas Daitsch. Guatrache. La Pampa ////////////////
// Contacto: administracion@tech-nico.com //////////////////////////
// RouterOS API: Busco interfaz ethernet y la activo o desactivo //
////////////////////////////////////////////////////////////////////
$ipRouteros="200.20.30.40"; // tu RouterOS.
$Username="blog.tech-nico.com";
$Pass="tupassword";
$api_puerto=8728;
$name="ether1"; // -------> aqui el nombre de tu interfaz!!
$API = new routeros_api();
$API->debug = false;
if ($API->connect($ipRouteros , $Username , $Pass, $api_puerto)) {
$API->write("/int/ether/getall",false);
$API->write('?name='.$name,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
if(count($ARRAY)>0){ // SI LA INTERFAZ EXISTE!!
$id_interfaz = $ARRAY[0][".id"];
$disabled = $ARRAY[0]["disabled"];
if ($disabled=="true"){ // SI ESTA DESACTIVADA!!
$API->write("/int/ether/enable",false);
$API->write("=.id=".$id_interfaz,true);
echo '<strong>'.$name.'</strong> esta ahora activada <img alt="" src="icon_led_green.png" /> ';
}else{ // SI ESTA ACTIVADA!!
$API->write("/int/ether/disable",false);
$API->write("=.id=".$id_interfaz,true);
echo '<strong>'.$name.'</strong> esta ahora desactivada <img alt="" src="icon_led_grey.png" /> ';
}
$READ = $API->read(false);
}else{ //el servidor API esta of line
echo 'Ocurrio un error: '.$ARRAY['!trap'][0]['message'];
}
}else{
echo "<span style="color: #ff0000;">La conexion ha fallado. Verifique si el Api esta activo.</span>";
}
$API->disconnect();
?>
Hola viejos amigos!. Algo que me han preguntado bastante es como hacer que el cliente o nosotros mismos veamos las graficas de consumo con el API de Mikrotik. Y para su sorpresa les cuento que esta parte se hace sin el API.
Estudiemos la ruta que nos da mikortik para ver el graph de un cliente:
Nota: Comprobar que en /tools/graphing este graficando todos los queues.
Hagamoslo mas interesante:
Ahora que ya sabemos la ruta exacta de cada gráfica (no tuvimos que usar el api), es cuestión de armar esto con PHP, pero para que sea un poco mas interesante vamos dale uso del API para hacer que si el usuario pppoe esta activo, mostramos el Graph usando la ruta anterior, pero si no esta conectado, mostramos el log del usuario. Para ello vamos a armar un buscador de usuarios activos.
Si el usuario esta desconectado.
Si el usuario esta activo
Archivos importantes:
log.php: Este es el archivo raiz principal, aquí esta el formulario y los contenedores desde donde se carga el JS, estilos, etc. Ademas, en este archivo debemos modificar las variables de Session.
<!--
////////////////////////////////////////////////////////////////////
// ESTE EJEMPLO SE DESCARGO DE www.tech-nico.com ///////////////////
// Creado por: Nicolas Daitsch. Guatrache. La Pampa ////////////////
// Contacto: administracion@tech-nico.com //////////////////////////
// RouterOS API: Busco Usuario PPPoE activo y muestro Graph o Log //
////////////////////////////////////////////////////////////////////
-->
<?php
session_start();
$_SESSION['api_ip'] ="192.168.0.1"; // Tu RouterOS
$_SESSION['api_user'] ="tu_usuario";
$_SESSION['api_pass'] ="tu_password";
$_SESSION['api_port'] =8728;
$_SESSION['www_port'] =80;
?>
Desde este archivo se configura todo!!. Solo tienes que modificar las variables que están justo aquí arriba en el archivo log.php.
Si sigues mirando un poco mas abajo de los seteos veras que en esta ocasión estoy usando el framework de Mootools, aunque por el poquito código que estamos usando tranquilamente podríamos hacerlo todo con javascript (ajax). Lo dejo a tu criterio.
api/isonline_soporte.php: Este archivo se ocupa de conectarse mediante el API, a tu servidor Mikrotik. Chequea si el usuario esta activo y muestra la grafica en una etiqueta IMG. Miren el código porque esta muy fácil de entender.
api/log.php: Este codigo trae todo el log y filtra por nombre de secret para mostrarte solo por usuario.
Importante: para buscar tienes que escribir el nombre exacto del secret. Y luego presionar la tecla Enter.
Buscar Secret con el API de Mikrotik.
Espero que te haya gustado, puedes probar, investigar mi código y ademas modificarlo, pero asegúrate de no quitar las lineas del autor.
Hola colegas, a pedido del publico, comparto mi Theme usado en el proyecto.
No tiene nada de otro mundo, solo es HTML y CSS. Pero por si a alguno le sirve, programe sobre el usando Dreamweaver. Ahora estoy probando Sublime Text 2 con el package Emmet; y realmente es «magia» se programa mucho mas rapido y facil.
Tal como lo habíamos anunciado en la Segunda parte, vamos a dar un caso de uso real,
en esta ocasión dedicado para el señor Nemox de Micromax Computación R.L. (Barinas – Venezuela) El nos pidio hacer algo especifico: Poder controlar la lista de «Hotspot > IP-Bindings» desde su celular; y para comprobar que con el API se puede hacer prácticamente todo, tome su caso como un desafió.
Y aqui el resultado:
A la izquierda esta visto desde el Iphone de Nemox. Y a la derecha desde el google chrome.
Muestra la lista de Hotspot – Ip Bindings y permite eliminar, habilitar y deshabilitar un cliente. El boton «agregar» no esta programado, pero dejo el código abierto para que cualquiera pueda editarlo y agregar o quitar funcionaliedades.
Esta armado el esqueleto del sitio en HTML5 y CSS3, los eventos y funcionalidades estan hechos con JQuery y el manejo del API con PHP5.
Vamos por partes:
El codigo de los 4 botones, Agregar, Eliminar, Habilitar, Deshabilitar, esta en el archivo index.html; si lo abrimos y vamos hacia el final, mas precisamente en la linea 110 veremos el codigo de cada boton. Pueden notar que cada boton tiene un codigo muy parecido. Lo que hace es, si esta seleccionado algun cliente (binding), toma su ID de un campo oculto (hidden field) para luego enviarlo como parametro al PHP que ejecuta la accion dentro del routerOS.
En la linea 119 vemos como ejemplo la ruta api/hotspot_general.php?ac=enable&id=numero que tiene 2 parametros: «ac» (accion) que en nuestro caso son las de los botones e «id» que es el codigo que identifica al IP Binding seleccionado con 1 click.
index.html
api/hotspot_general.php Este es el archivo que se comunica con tu RouterOS por medio del API, tienes que editar las primeras lineas con los datos de tu servidor: Revisen los otros archivos de la carpeta «api».
A partir de la linea 30 comenzamos a ver los casos para el parametro «ac» y depende el parametro que le pasemos es lo que ira a ejecutar. Creo que esta muy facil de entender. Para el boton «Agregar» debemos añadir un nuevo «case» con el parametro correspondiente.
El codigo que ejecuta la accion en el Mikrotik es este:
case «enable»:
$API->write(«/ip/hotspot/ip-binding/enable«,false);
$API->write(«=.id=».$id,true);
$READ = $API->read(false);
$API->parse_response($READ);
break;
Es muy facil de entender:
Hay comandos que nos solicitan datos. Antes de ejecutar el codigo con PHP lo probamos en la consola. Escribimos /ip hotspot ip-binding print y vamos a saber quien esta desabilitado y su codigo ID.
Tomemos cualquier nro para testear y probemos: /ip hotspot ip-binding enable.(enter) y nos va a pedir el ID, en nuestro ejemplo de prueba ponemos el 7 que esta deshabilitado.
El flag false o true se refiere a que si este comando requiere de un dato, id, etc todavia no ejecuta el comando hasta no tener todo lo que necesita. Como vemos en la segunda linea el flag es true ya que el comando esta completo y lo manda a ejecutar.
son la respuesta de lo que ejecutamos, que en nuestro codigo no la estamos mostrando. Si el numero de ID no existiera, nos devolvería un error de «no such item». O si el comando ejecutado nos traeria una lista deberiamos recorrer el array $READ con un for para mostrar lo que se nos antoje.
Hay cosas que no las estoy explicando porque estan muy bien comentadas. Si no se entiende algo por favor pregunten.
En la primera parte, explicamos cual podría ser su uso y para que sirve.
Ahora vamos a explicar como se configura el API en pocos pasos, con un poco de PHP y usando las clases creadas por Denis Basta. (version 1.3 o 1.4), con apenas un minimo cambio hecho para que la clase «connect» permita pasar ademas el numero de puerto del RouterOS como parametro.
Yo estoy familiarizado con programar en PHP pero para el que no, pueden hacerlo con el lenguaje que desee. En la Wiki de Mikrotik podran encontrar ejemplos para:
a) Habilitar el servicio API.
desde IP > Services. Seleccionas la fila que dice «api» y la habilitas, luego doble click sobre ella para editar. Puedes asignarle el puerto que quieras, pero por defecto usa el 8728 tcp. Si te gusta tener todo ecualizado podrías agregarlo en los mangles para darle QoS. Finalmente donde dice «Avaliable From» es la direccion IP desde donde estara el API corriendo. En nuestro caso, como usaremos PHP puede ser el servidor Apache. (sigue los pasos de la imagen).
b) Crear un grupo
Para darle seguridad necesitamos crear un usuario y un grupo nuevo dentro del RouterOS donde queremos ordenar nuestras tareas diarias. Para ello vamos a «System > Users > Groups» y presionamos en el icono «+». En esta ventana simplemente escribimos el nombre del grupo, (para este ejemplo yo le puse «tugrupoapi») y elegi las politicas «read, write, api». Damos click en OK
c) Crear un usuario
Luego de crear el Grupo, nos movemos a la pestaña Users como esta en la imagen a continuacion. Presionamos el icono «+» para crear un usuario nuevo. Name: aqui escribiremos nuestro nuevo nombre de usuario: Ejemplo blog.tech-nico.com, (puedes crear el tuyo). Group: elegimos el grupo «tugrupoapi» (ver el punto «b»), Address allowed: Es la IP que tiene permitido acceder a nuestro RouterOS a través del API. «El apache server en nuestro caso», Password: tipeamos nuestro password, asegurate que sea fuerte.
Finalmente click en el boton «OK».
Paso 2: Crear un script para testear el acceso: conectar_test_api.php
}else{
echo «<font color=’#ff0000′>La conexion ha fallado. Verifique si el Api esta activo.</font>»;
}
$API->disconnect();
?>
Paso 3: Editamos las lineas que dicen:
$ipRouteros=»200.20.30.40″; // tu RouterOS.
$Username=»blog.tech-nico.com»;
$Pass=»tupassword»
$api_puerto=8728;
Paso 4: Finalmente subimos por FTP los archivos a nuestro servidor Web y ejecutamos en el navegador el archivo conectar_test_api.php;
Si todo salio bien, vamos a ver una pantalla parecida a la de arriba. Lo que hicimos fue loguearnos mediante el API a nuestro servidor, y luego traer el nombre «Identity», la plataforma, la version del ROS, que licencia tiene instalada, etc.
Como veran, este seria el primer paso para comenzar a programar tus scripts. Ya teniendo esto funcionando vamos a poder realizar varios ejemplos que voy ir posteando en mi tiempo libre.
Cualquier cosa comenten que les respondo enseguida.
Vengo aprovechando a pleno esta GRAN posibilidad que nos dio Mikrotik de poder programar nuestros propios scripts, y de mostrar la informacion de manera que nos quede comodo administrar varios servidores y en lo posible en una sola pantalla.
.
Este era mi escenario de antes de usar el API:
Aqui tengo la administracion de distintos routers PPPoE Servers, y a su ves cada router esta conectado a distintos Access Points, ya sean Mikrotik (2,4Ghz) o Ubiquiti(5,8Ghz).
Siempre fue engorroso tener que entrar a cada AP para agregar o quitar un MAC Address de un equipo cliente. Lo mismo con los usuarios y contraseñas de los clientes PPPoE. Bueno, ni hablar de tomar un reclamo telefónico por mas que sepamos la localidad de donde nos llama el cliente, hay que pensar en:
a «Que equipo AP» esta asociado,
si esta con Wireless 2,4Ghz o 5,8 o cable,
Cual es la direccion IP del equipo wireless, etc
Por desgracia todas las topologias y redes son distintas, entonces es extremadamente dificil encontrar un sistema que tenga lo que nosotros necesitamos. Ademas cada sysadmin tiene su manera de configurarle al cliente: esta el que routea, el que bridgea, ip fija o dinamica.. y miles de posibilidades mas.
Hay otros que tienen redes bastante híbridas, con un poco de hotspot otro de IP Fija y PPPoE; Yo digo que, en esos casos seria aun mas practico administrarlos en una sola pantalla sin tener que recorrer el Winbox de una punta a la otra o mejor aun, sin tener que darle un usuario del Winbox a ningún técnico.
Veo constantemente en el foro gente que busca programas de facturación y o soporte, o prueban algo y no les gusta. A no ser que sea un software realmente grande y robusto (que seguro lo debe haber). Pero de todos modos, volvemos a lo mismo de siempre, es bastante difícil encontrar un software adecuado a nuestra medida porque si es grande y robusto seguro es complejo.
Todo cambia con un poco de imaginación cuando llega el famoso API.
Veamos algunos ejemplos de lo que se podría hacer:
Tareas comunes:
Altas, Bajas, Modificaciones de velocidad, cambio de titular, etc.
Este donde este ubicado el cliente, asociamos el nro de IP del router y AP con la localidad. Entonces al hacer click sobre el cliente, sin pensar donde esta, te trae sus datos. Desde datos de Wireless (sin importar si usa mikrotik o ubiquiti), hasta datos de autenticacion, log si esta desconectado y grafica si esta loggeado.
Es muy bueno saber si el cliente le esta errando la contraseña o esta filtrado por mac en el PPP, y para eso mikrotik es malisimo, porque te tira un log de miles de lineas que pasa rapidisimo y no podes encontrar nada. Para este caso lo que hice fue filtrarlo por cliente. entonces podemos ver en detalle que le esta pasando.
Aqui les dejo un pantallazo; y en mis proximos posts les voy a detallar un poco mas de como funciona.