Cambios en RouterOS 6.43: API Class con passwords en texto plano

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.

Saludos!!!

____________________
Primero en tech-nico.com/blog

API MIKROTIK – Eliminar una dirección del firewall address-list

Te interesa saber como agregar una direccion IP a una lista?.

Exactamente hace 1 año atrás, el armamos un ejemplo para agregar una direccion IP una lista determinada del firewall; pero nunca dijimos como eliminarla y por eso aquí esta la solución.

Aquí va el código de como hacerlo:

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.!!.

API MIKROTIK – Agregar una dirección al firewall address-list

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.!!

_________________
Primero en tech-nico.com

API MIKROTIK – Haciendo ping desde tu herramienta de monitoreo con PHP

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:

api_ping
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.

Descargar ejemplo aqui.
______________________
publicado primero en tech-nico.com

API MIKROTIK – Graficar trafico de interfaces en tiempo real con Highcharts y PHP

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).

Si te interesa podes continuar leyendo una actualizacion de este post con bastantes mejoras: Graficar Interfaces y Queues con Highcharts version mejorada

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.
highchart_tech-nico.com_API_MIKROTIK

El codigo esta muy muy facil. Vamos a resumirlo:

index.html

           chart = new Highcharts.Chart({
			   chart: {
				renderTo: 'container',
				animation: Highcharts.svg,
				type: 'spline',
				events: {
					load: function () {
						setInterval(function () {
							requestDatta(document.getElementById("interface").value);
						}, 1000);
					}
			}
		 },

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:

            series: [{
                name: 'TX',
                data: []
            }, {
                name: 'RX',
                data: []
            }]

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:

series: [{
name: ‘TX’,
data: []
}, {
name: ‘RX’,
data: []
}, {
name: ‘RX’,
data: []
}]

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.

		   $API->write("/interface/monitor-traffic",false);
		   $API->write("=interface=".$interface,false);
		   $API->write("=once=",true);

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 😀

Descargar el codigo fuente completo

Se escribió primero en Tech-nico.com por Nicolas Daistch

API MIKROTIK – Crear queues simples con PHP (con validacion)

Hola señores, el codigo para agregar un Queue Simple validando que no se duplique ningún cliente seria asi:

ACTUALIZADO: agrega un queue si no existe el nombre, y si existe, lo edita.

<?php require_once('api_mt_include2.php'); ?>
<?php

/// AUTOR: Tech-Nico.com ///
/// admin@tech-nico.com /////
///  API: agrega un queue simple y si este existe lo edita.
/// Editado: 03/05/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
$target= "192.168.0.5";  // IP Cliente
$name=    "nicolas222";
$maxlimit=    "5M/5M";
$comment= "Este es un ejemplo.";
if( $target !="" ){
    $API = new routeros_api();
    $API->debug = false;
    if ($API->connect($ServerList, $Username, $Pass, $Port)) {
       $API->write("/queue/simple/getall",false);
       $API->write('?name='.$name,true);
       $READ = $API->read(false);
       $ARRAY = $API->parse_response($READ);
        if(count($ARRAY)>0){ // si el nombre de usuario "ya existe" lo edito
			$API->write("/queue/simple/set",false);
			$API->write("=.id=".$ARRAY[0]['.id'],false);
            $API->write('=max-limit='.$maxlimit,true);   //   2M/2M   [TX/RX]
			$READ = $API->read(false);
			$ARRAY = $API->parse_response($READ);
            echo "Error: El nombre no puede estar duplicado, el queue fue editado.";
            echo '<img src="../images/icon_error.png" />';
        }else{
            $API->write("/queue/simple/add",false);
            $API->write('=target='.$target,false);   // IP
            $API->write('=name='.$name,false);       // nombre
            $API->write('=max-limit='.$maxlimit,false);   //   2M/2M   [TX/RX]
            $API->write('=comment='.$comment,true);         // comentario
            $READ = $API->read(false);
            $ARRAY = $API->parse_response($READ);
            echo "El Usuario $name, ha sido creado con exito!.";
            echo '<img src="../images/okicon.png" />';
        }
        $API->disconnect();
    }
}
?>

Descargar el Descargar_ejemplo_actualizado_03-05-2015

No hay mucho que explicar porque esta comentado el codigo y explicado en los post anteriores.

API MIKROTIK – Como optimizar tu administracion con un poco de PHP (introduccion)

API MIKROTIK Segunda parte – Usando el API con PHP

API MIKROTIK Tercera parte – Nuestro primer ejemplo (codigo abierto)

_________________
Nicolas
Primero en Tech-nico.com

API MIKROTIK – Manipular Wireless-Registration y Access-List con PHP y MYSQL

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 🙂 .

CREATE DATABASE IF NOT EXISTS `manage_isp` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `manage_isp`;

CREATE TABLE `categorias` (
  `id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
  `descripcion` char(100) DEFAULT '0',
  `default` int(1) DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

CREATE TABLE `internet` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `numloca` int(2) NOT NULL DEFAULT '1',
  `apellido` char(100) DEFAULT NULL,
  `descripcion` char(100) DEFAULT NULL,
  `categoria` int(1) DEFAULT '0',
  `ip_equipo_inalambrico` char(40) DEFAULT NULL,
  `activo` int(1) DEFAULT NULL,
  `fecha_alta` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

CREATE TABLE `localidades` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nombre` char(80) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

CREATE TABLE `puntos_de_acceso` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `nombre` char(50) DEFAULT NULL,
  `localidad` int(6) DEFAULT NULL,
  `categoria` int(6) DEFAULT NULL,
  `modo_neighbords` int(1) DEFAULT NULL,
  `ip` char(15) DEFAULT NULL,
  `puerto` int(5) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;

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:
main

1) Primer paso, recomiendo cargar las localidades, para ello vamos a {Nueva Localidad}.
nueva_localida

2) Luego volvemos a la pantalla principal cargamos los Nodos AP o puntos de acceso en el link {Nuevo Punto de Acceso}
nuevo_nodo
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.
modificar_cliente

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.
ejemplo_sistema

4) Volvemos a la pantalla principal y veremos que en el link {Nuevo Cliente} aparece la pantalla:
nuevo_cliente

Revisen como esta hecho y veran que es muy facil editarlo. Cualquier duda, sugerencia o error, seran contestados aqui en los comentarios.

Les dejo el link para descargar los archivos.

Saludos amigos!!
___________________________
Publicado primero en tech-nico.com

API MIKROTIK – Patear un cliente PPPoE activo

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();
    }
?>

__________________
primero en www.tech-nico.com

API MIKROTIK – (con php) – Indice general

Hola a Todos! Los post me han quedado un poco desconectados, asi que arme un indice que voy a ir actualizando a medida que agregue info.

1) Introduccion: que puedo hacer con este API?

2) Primer Script: Crear nuestro primer ejemplo para acceder a tu RouterOS y testear el acceso.

3) Administrar Hotspot > IP-Bindings desde tu celular. (habilitar, deshabilitar y eliminar)

4) Crear Queues Simples con Validacion

5) Hacemos un buscador de clientes activos. Vemos la grafica o el log. Muy interesante!.

6) Graficamos en tiempo real, el trafico de alguna interfaz con highcharts. 

7) Activar o Desactivar algun puerto ethernet de tu Mikrotik

8) Patear un cliente PPPoE activo

9) Manipular Wireless Registration y Access-List (usando Mysql)

Espero que te guste.
Nicolas. Publicado primero en www.tech-nico.com

API MIKROTIK – Activar o desactivar un puerto ethernet

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();
?>

El resultado es este:

API-Activar_Ethernet

Para descargar el codigo fuente haz click aqui!

Saludos!.
____________________
Publicado Primero en www.tech-nico.com

API MIKROTIK – Graficar el trafico de nuestros clientes y mostrar el log

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.

http://200.20.30.40:8080/graphs/queue/%3Cpppoe-fduckardt52104%3E/

OK como veran.. aqui pueden haber 3 datos variables:

  1. La direccion IP del RouterOS.
  2. El puerto de www (/ip/services).
  3. El nombre del pppoe: fduckardt52104

Si Inspeccionamos el código de esta imagen con en el navegador veremos que solo se agrega /daily.gif al final de la URL quedando así:

http://200.20.30.40:8080/graphs/queue/%3Cpppoe-fduckardt52104%3E/daily.gif

consumo_cliente

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 desconectado.

Si el usuario esta activo

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.

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.

Descarga aqui el codigo de este ejemplo

Este post fue escrito por Nicolas. Primero en tech-nico.com/blog

Theme HTML y PSD usado en proyecto API Mikrotik

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.

Ahora ponganse a codificar sus API’s.

Descargar theme
___________________________________
Este post estuvo primero en tech-nico.com

 

API MIKROTIK Tercera parte – Nuestro primer ejemplo (codigo abierto)

Hola amigos.

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:
API-hotspot_ipbindingsapi_desde_iphone

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
APIcodigobotones

APIcodigoPHP

 

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».

$ipRouteros=»192.168.33.200″;
$Username=»usuario»;
$Pass=»contraseña»;
$api_puerto=8727;

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.

API-consola

Bien, aqui tenemos estas 2 lineas:

$API->write(«/ip/hotspot/ip-binding/enable»,false);
$API->write(«=.id=».$id,true);

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.

Las siguientes 2 lineas…

$READ = $API->read(false);
$API->parse_response($READ);

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.

Acá va el código abierto del ejemplo: mikrotik-test

Enjoy the saturday!

API MIKROTIK – Como optimizar tu administracion con un poco de PHP (introduccion)

API MIKROTIK Tercera parte – Nuestro primer ejemplo (codigo abierto)

API MIKROTIK – Crear queues simples con PHP (con validacion)

_______________________________________
Primero en tech-nico.com Autor Nicolas Daitsch

API MIKROTIK Segunda parte – Usando el API con PHP

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:

Paso 1: Configura tu RouterOS

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).
ip-services-api

 

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
user_api_group

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».

user_api_user_add

Paso 2: Crear un script para testear el acceso: conectar_test_api.php

<?php require_once(‘api_mt_include2.php’); ?>
<?php
$ipRouteros=»200.20.30.40″; // tu RouterOS.
$Username=»blog.tech-nico.com»;
$Pass=»tupassword»;
$api_puerto=8728;

$API = new routeros_api();
$API->debug = false;
if ($API->connect($ipRouteros , $Username , $Pass, $api_puerto)) {
$API->write(«/system/ident/getall»,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$name = $ARRAY[0][«name»];
if(count($ARRAY)>0){ // si esta conectado
$API->write(«/system/licen/getall»,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$nlevel = $ARRAY[0][«nlevel»];
$API->write(«/system/reso/getall»,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$cpu = $ARRAY[0][«cpu»];
$cpu_frequency = $ARRAY[0][«cpu-frequency»];
$arquitectura = $ARRAY[0][«board-name»];
$API->write(«/system/pack/getall»,true);
$READ = $API->read(false);
$ARRAY = $API->parse_response($READ);
$version = $ARRAY[0][«version»];

echo ‘<img src=»icon_led_green.png» />&nbsp;’;
echo «<strong>».$name.»(» .$arquitectura. «)</strong>&nbsp;&nbsp;»;
echo «v:» . $version. «&nbsp;&nbsp;»;
echo «level:» . $nlevel . «&nbsp;&nbsp;»;
echo $cpu.»(«.$cpu_frequency.» Mhz.)»;
}else{ //el usuario esta of line
echo ‘<img src=»icon_led_grey.png» />&nbsp;’.$ARRAY[‘!trap’][0][‘message’];
}

}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;
test_php_navegador
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.

Descarga aqui todos los archivos de este ejemplo.

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.

API MIKROTIK – Como optimizar tu administracion con un poco de PHP (introduccion)

API MIKROTIK Tercera parte – Nuestro primer ejemplo (codigo abierto)

API MIKROTIK – Crear queues simples con PHP (con validacion)

_______________
Nicolas tech-nico.com/blog

API MIKROTIK – Como optimizar tu administracion con un poco de PHP (introduccion)

 

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.

systema_soporte

API MIKROTIK Segunda parte – Usando el API con PHP

API MIKROTIK Tercera parte – Nuestro primer ejemplo (codigo abierto)

API MIKROTIK – Crear queues simples con PHP (con validacion)

_____________________

Nicolas tech-nico.com