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

45 Comentarios

  1. Andrea, Lo unico que he visto de Java esta en el foro oficial: forum.mikrotik.com pero por mala suerte, ningun ejemplo en el wiki.mikrotik.com. Saludos.

  2. saludos amigo y esos codigos no se podrar compartir ando trabajando en algo parecido ya tengo el modulo de registro, ahora voy con la parte del mikrotik q es un poco mas engorroso podrias echarme la mano

  3. Hola Luis Matheus, Si, la idea del post fue compartir.. Asi que si lees bien esta el link para descargar el codigo. Un saludo. !

  4. Fijate lo que dice arriba de esas lineas:

    /// VARIABLES DE FORMULARIO 
    $target= $_GET["target"];  // IP Cliente
    $name=	$_GET["name"];
    $maxlimit=	$_GET["maxlimit"];
    $comment= $_GET["comment"];
    

    Dice “VARIABLES DE FORMULARIO”. Por lo tanto tendras que armar un form html que contenga esas 4 cosas: target, name, maxlimit y comment. Luego en “action” del form le pones la URL de este archivo y metod del form: GET. Basico de html !! Si no podes avisame. Saludos.

  5. tengo un error en la linea 30 aprox
    $API->write(“=.id=”.$ARRAY[0][‘.id’],false);
    y no verifica lo ip, siempre acepta agregar
    pero reviso el router y no hay nada

  6. Hola, si alguien me puede ayudar con esto. Quiero hacer una búsqueda pero con varios parámetros; funciona con un parámetro pero con dos o mas no.

    $API->write(“/queue/simple/getall”,false);
    $API->write(“?max-limit=1M/1M”,false);
    $API->write(“?comment=libre”,true);

  7. Me pasa el mismo error que ha william:

    me sale error en $API->write(“=.id=”.$ARRAY[0][‘.id’],false); por que me dice que .id es indefinida. Ademas siempre me sale el mensaje que ha sido creado pero cuando voy al router no me ha creado nada.

    William lo pudiste solucionar en ese tiempo? o si depronto alguna persona me puede indicar como crear un queue por favor hacerlo saber

    Muchas gracias a Todos.

  8. Hola Gina, pone lal inea

    $API->debug = false;
    

    Como

    $API->debug = true;
    

    Ahi fijate si detectas el problema. Si no posteame el resultado que te imprima y lo analizo. El codigo lo subi andando al 100%. Tiene que ser una pabada. Que version de RouterOS usas. Slds.

  9. Hola gracias por responder y que pena demorarme tanto en escribir, estaba intentando hacer funcionar el código pero nada. Te cuento he activado la linea $API->debug = true; como me indicaste y esos son los mensajes que me salen.

    Connection attempt #1 to 192.168.1.1:8728… <<>> [5/5] bytes read. >>> [5, 39]!done >>> [37/37] bytes read. >>> [37, 1]=ret=85b9f04c042bf5a39737c4cddb4f90b5 <<< [6] /login <<< [8] =name=pp <<>> [5/5] bytes read. >>> [5, 1]!done Connected… <<< [20] /queue/simple/getall <<>> [5/5] bytes read. >>> [5, 1]!done <<write(“=.id=”.$ARRAY[0][‘.id’],false);

    Luego de este error sale
    << [5] =.id= <<< [23] =target=192.168.1.13/32 <<< [11] =name=billy <<< [20] =max-limit=128k/256k <<>> [5/5] bytes read. >>> [5, 35]!trap >>> [26/26] bytes read. >>> [26, 8]=message=unknown parameter >>> [5/5] bytes read. >>> [5, 1]!done Usuario nuevo creado con exito!.Disconnected…

    Donde indica que el usuario ha sido creado pero no es asi

    La versión del RouterOS es v5.25

    Saludos.

  10. El primer bloque te esta diciendo que conecto bien!!.
    Lo que no se es porque esta tirando la linea write(“=.id=”.$ARRAY[0][‘.id’],false); Ya que eso es codigo php y no deberia salir en el debug. Capas imprimiste mal una variable.

    En la segunda parte.. te esta diciendo cual es el problema. A veces solo hay que detenerse y “leer” un poco.
    Presta atención que en una parte dice: message=unknown parameter. Ahora traducilo al español: parametro “mensaje” desconocido.

    Saludos.

  11. A mi también me tira el mismo error (en la línea 30), pero creo que el error está entre la línea 26 y la 27, después de esta línea: if(count($ARRAY)>0){ // si la IP no existe (?) o existe?

    Saludos!

  12. Hola Manuel Rivas, te respondo lo que le respondo a todos cuando les arroja error. Modifica la linea:

    $API->debug = false;

    por

    $API->debug = true;

    Y luego lee cual es el error que arroja el debug. Le estas errando en algo porque el codigo funciona muy bien!!.

  13. …..
    $API->write(‘?target=’.$target,true);
    echo $target;
    ……

    192.168.100.55
    ( ! ) Notice: Undefined offset: 0 in …..\API_MKT_add_queue_simple.php on line 31
    Call Stack
    # Time Memory Function Location
    1 0.0004 262000 {main}( ) ..\API_MKT_add_queue_simple.php:0
    Usuario nuevo creado con exito!.

  14. El código que estoy usando es el mismo que copié, solo he cambiado la inf. del MT y añadí el formulario.

    Saludos!

  15. Resulta que las versiones (supongo RouterOS 6.x) actuales no te dejan añadir 2 queues con el mismo nombre.. y “el chequeo de IP no lo realiza”.
    Asi que modifique el codigo para que revise si el nombre del queue esta repetido. OJO: volve a editar los datos para conectar y los nombres de tus variables de formulario porque lo edite para testear localmente (modifique tambien el puerto). Mil disculpas, ya esta funcionado. Ahora depende de vos no hacerlo andar!!. Saludos.

    <?php require_once('api_mt_include2.php'); ?>
    <?php
    //////// 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 ejempo2.";
    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".
                echo "Error: El nombre no puede estar duplicado.";
                echo '<img src="../images/icon_error.png" />';
            }else{
                $API->write("/queue/simple/add",false);
                /// Para editar (en vez de agregar) reemplazar la linea de arriba por estas dos siguientes.
                //$API->write("/queue/simple/set",false);  
                //$API->write("=.id=".$ARRAY[0]['.id'],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();
        }
    }
    ?>
    
  16. Hola Nico!
    Gracias por todo.
    Resumen de lo hice: (Puedo añadir Queues)
    1. Me funciona con esta línea: $API->write(“/queue/simple/add”,false);

    2. Cambié en esta línea $API->write(‘=target=’.$target,false); // IP ==>> =target= por =target-addresses= ya que estoy usando la versión 5.25 y target es para la versión 6.

    3. Cuando cambio las siguientes líneas me da el mismo error INDEFINIDO en la línea 30:
    // $API->write(“/queue/simple/add”,false);
    /// Para editar (en vez de agregar) reemplazar la linea de arriba por estas dos siguientes.
    $API->write(“/queue/simple/set”,false);
    $API->write(“=.id=”.$ARRAY[0][‘.id’],false);

    Gracias mil!

  17. Hola, alguien que me ayude con este problema que tengo al enviar el comando
    $API->write(“/ip/firewall/address/set”,false);
    $API->write(“=.id=*C”,false);
    $API->write(“=name=”.”suspendido”,true);

    Me regresa un mensaje que dice “parámetro desconocido”

    Lo he intentado de así:
    $API->write(“/ip/firewall/address/set”,false);
    $API->write(“=.id=*C”,false);
    $API->write(“=comment=”.”suspendido”,true);

    Pero tampoco funciona.

  18. Hola Stalin, si no me equivoco el problema esta en que la linea..

    write("/ip/firewall/address/set",false);
    
    write("/ip/firewall/address-address/set",false);
    

    Y por ultimo, revisa que el id “*C” en verdad exista. Quizas deberias hacer un getall primero para que te traiga todo el array, y poder ver los Ids.
    Saludos, Tech-nico.

  19. hola, gracias por el ejemplo, esta perfecto, pero lo trato de modificar para agregar address-list y no me funciona, habra que modifuar algo? gracias

  20. Carlos, mira, el script funcionaba en versiones anteriores de RouterOS. En los comentarios hice una correccion para que funcione en las mas nuevas. Fijate aca. Saludos.

  21. hola, gracias por responder, si este segundo ejemplo funciona perfecto, pero lo modifico para agregar address-list en ves de queue simple, y se queda esperando , sale un error como que espero mas de 30 segundo, pero no se cual sera o donde estara ese error, gracias – saludos

  22. hola gente, realmente probe todo y de todas formas? es posible hacer un add a ip/firewall/address-list/add por el api en php, en queue y dhcp-server funciona en address-list nada, por favor si alguien me puede ayudar en este tema, saludos

  23. hola muy bueno el ejemplo anda perfecto, pero en las lineas:
    /// Para editar (en vez de agregar) reemplazar la linea de arriba por estas dos siguientes.
    //$API->write(“/queue/simple/set”,false);
    //$API->write(“=.id=”.$ARRAY[0][‘.id’],false);
    para editar , primero habria que buscar la regla a ediar y ahi reemplazarla, como seria en ese caso? gracias

  24. Belen.. agrega estas lineas dentro del “if(count($ARRAY)>0){ // si el nombre de usuario ‘ya existe’.”

    $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);
    

    Entonces si la regla esta duplicada “Modifica” y si no “Agrega una nueva”. La busqueda de la regla ya la hace mas arriba y con “.id” ya te trae el ID que tenes que editar. Probalo y si no funciona avisame y lo edito. Podes descargar el codigo (actualize el post). Saludos.

  25. Buenas noches tengo el mismo problema que dice carlos trato de hacer algo similar pero con address-list y se queda colgado, alguna ayuda?

    $API->write(“/ip/firewall/address-list/add”, false);
    $API->write(“=address=”.$ip,false);
    $API->write(“=list=cortados”, false);
    $API->write(“=comment=$contrato”, true);
    $READ = $API->read(false);
    $ARRA2 = $API->parse_response($READ);

  26. hola estoy teniendo el siguiente problema cuando cargor los clientes a mi aplicacion web en el rb 450g me muestra las ip de los clientes pero en un rb 493ah que tengo tambien no muestras las ip de los clientes mira le por hay que en versiones diferecentes al que reemplacer address por addresses pero lo hice y no hace nada sigue igual este es mi codigo de esta parte espero su ayuda porque es aprendiendo php que esoty jijiji gracias

    echo ”.$ARRAY[$i][‘name’].”.$ARRAY[$i][‘max-limit’].”.$ARRAY[$i][‘target-addresses’].”;
    else
    echo ”.$ARRAY[$i][‘name’].”.$ARRAY[$i][‘max-limit’].”.$ARRAY[$i][‘target-addresses’].”;

  27. Soy Ingeniero en sistemas desarrolle un sistema contable para el WISP que laboro y quiero que trabaje en paralelo con los servidores mikrotik por medio de la API y PHP, hay poca informacion pero aqui les dejo la apropiada para agregar queues simples

    $API-> comm(‘/queue/simple/add’, array (
    “name” => $nombre,
    “target-addresses” => $ip,
    “max-limit” => $velocidad,
    “limit-at” => $velocidad,
    “parent” => $padre,
    //”comment” => $comentario
    ));

    echo “”; echo “Usuario Creado!

    Ahora estoy buscando el codigo para editar queue y no lo consigo todabia.

  28. Hola otra vez traigo un ejemplo que les sera util, lo que realizo aqui es buscar y agregar todos los queues a un arreglo, luego con un for busco con el nombre del cliente que deseo editar el queue, y una vez encontrado muestra la velocidad anterior y edita a una nueva velocidad:

    $API->write(“/queue/simple/getall”,true);
    $READ = $API->read(false);
    $ARRAY = $API->parse_response($READ);
    for($i=0;$i<count ($ARRAY);$i++){

    if($ARRAY[$i]['name']=="JORGE LEONARDO ZAMBRANO CEVALLOS"){
    echo "La IP es:". $ARRAY[$i]['target-addresses'];
    echo "”;
    echo “La velocidad anteior es: “. $ARRAY[$i][‘max-limit’];

    $maxlimit = “1M/1M”;

    $API->write(“/queue/simple/set”,false);
    $API->write(“=.id=”.$ARRAY[$i][‘.id’],false);
    $API->write(‘=max-limit=’.$maxlimit,true); // 2M/2M [TX/RX]
    $READ = $API->read(false);
    $ARRAY = $API->parse_response($READ);
    echo “”;
    echo “La velocidad del cliente fue editada a: “. $maxlimit;
    }
    }

  29. Hola leo.jaserio, perdón por la tardanza, te hago una observación, en tu código veo comandos que no son propios de la librería que usamos en los ejemplos del blog. Desconozco la sintaxis. Saludos.

  30. Alguien resolvió el problema que tenias Carlos y Lionel para agregar (add) una ip a una lista de morosos a ip firewall address-lis?? estoy probando los códigos y me esta pasando lo mismo que, tarda en responder la aplicación sale el mensaje de tiempo excedido, PERO si agrega la ip a la lista de morosos. Alguien pudo resolverlo. Gracias

  31. El truco esta en lograr aprender, como agregar el Queue desde la terminal de winbox, con los parametros que vos necesites. Una vez que descubras cual es el parametro, usas el mismo ejemplo de PHP y solo agregas el parametro necesario.

2 Trackbacks / Pingbacks

  1. API MIKROTIK Segunda parte – Usando el API con PHP | Blog tech-nico.com
  2. API MIKROTIK – Como optimizar tu administracion con un poco de PHP (introduccion) | Blog tech-nico.com

Deja un comentario