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

Marcar IP de Google Youtube Video para dar Calidad de Servicio

La manera mas efectiva de marcar el trafico de video youtube en tu red (en este caso mikrotik) es utilizando listas de direcciones. Las recolecte por DNS y Whois.
Si queres hacer QoS, vas a necesitar esta lista.
.
.
.
.

/ip fire addr
add address=173.194.0.0/16 disabled=no list=Youtube
add address=208.65.152.0/22 disabled=no list=Youtube
add address=64.15.112.0/20 disabled=no list=Youtube
add address=74.125.96.0/19 disabled=no list=Youtube
add address=72.14.221.0/24 disabled=no list=Youtube
add address=84.53.128.0/18 disabled=no list=Youtube
add address=87.248.192.0/19 disabled=no list=Youtube
add address=216.155.128.0/19 disabled=no list=Youtube
add address=208.73.208.0/21 disabled=no list=Youtube
add address=66.55.140.0/23 disabled=no list=Youtube
add address=74.125.208.0/24 disabled=no list=Youtube
add address=208.117.224.0/19 disabled=no list=Youtube

Buena suerte!!

Nicolas tech-nico.com

Dominios .com.ar seran pagos a partir de mañana

Mañana 5 de marzo, un dominio com.ar que siempre fue gratuito comenzara a costar $160 por año, (registro y renovación). Parece mentira que un dominio .com cueste $80 por año y el .com.ar ya comienza costando el doble. Yo particularmente creo que de aqui en adelante los nuevos sitios van a ser .com 😀

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

Nuevo binario de Ubiquiti Airmax v5.5.8

Hoy, 25 de enero, me encuentro con la excelente noticia, «después de casi 8 meses de publicada la versión 5.5.6» (que realmente dio muy buenos resultados). Estos son los fixes y mejoras.

New:
- New: Remote Provisioning Functionality for AirGateway

Improvements:
- airMax: Rate drops when using narrow channel widths on AP with more than 30 clients 
- Ethernet: Ethernet negotiation issues after ESD damage
- NanoBridge M5: Cold temperature issues

Fixes:

- Fix: DFS frequencies are not functional for Canada (Rocket M5 Titanium)
- Fix: Possible fix for unexpected AP reboots
- Fix: Auto IP Address generation for MAC addresses ending with FF:FF and 00:00
- Fix: SSL server accepts weak ciphers
- Fix: SSH server (dropbear) update to version v2013.58
- Fix: Disabling DHCP server leaves dnsmasq running

_____________________
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

Mikrotik Script: ejecutar un script si aparece cierta palabra o frase en el Log.

En el foro de Mikrotik un participante ha posteado algo interesante!!

Creo que el titulo esta bastante claro, es un script que detecta cierto contenido en el log, y luego ejecuta «otro script».

Script:

:global lastTime;

:local currentBuf [ :toarray [ /log find message~"wrong peer state" || message~"master flag=false" ] ] ;
:local currentLineCount [ :len $currentBuf ] ;

if ($currentLineCount > 0) do={
   :local currentTime "$[ /log get [ :pick $currentBuf ($currentLineCount -1) ] time ]";

   :if ([:len $currentTime] = 15 ) do={
      :set currentTime [ :pick $currentTime 7 15 ];
   }

   :local output "$currentTime $[/log get [ :pick $currentBuf ($currentLineCount-1) ] message ]";

   :if (([:len $lastTime] < 1) || (([:len $lastTime] > 0) && ($lastTime != $currentTime))) do={
      :set lastTime $currentTime ;
      /system script run myScript
   }
}

ver el post completo en el foro de Mikrotik

Primero en 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

Como reiniciar el servicio de DNS en MAC OS X

Luego de hacer cualquier cambio en nuestro /etc/hosts hay que reiniciar el servicio para que tome los cambios.
Hay que ejecutar esto en consola:

sudo killall -HUP mDNSResponder

_____________
Tech-nico.com/blog

Mikrotik Script: Buscar en PPP las IP libres no asignadas en una Clase C

Bueno, este es un script muy rebuscado que arme para listar las IP Libres de un /24. Es muy util ya que hay escasos bloques IPv4. En mi caso doy pppoe con IP fija, entonces es muy facil a veces (por error) saltearnos alguna IP y quede en desuso.

Antes de ejecutarlo hay que editar una variable que contiene nuestro rango de IP a buscar.

:global BUSCA "210.100.200";
/ip firewall address-list remove [/ip firewall address-list find list="pool_ip_libres"];
:for i from= 1 to= 254 do={
:local DIREC ($BUSCA . "." . $i);
:local VAR [:put [/ppp secret find where remote-address=$DIREC]];
:if ($VAR!="") do={
:log info (" Existe " . $DIREC );
} else={
/ip firewall address-list add list=pool_ip_libres address=$DIREC;
}
}

Luego de ejecutarlo vamos a ver que se crea una nueva lista llamada «pool_ip_libres».
Cada vez que ejecutamos el script, se limpia primero esa lista para que no queden ips duplicadas.

Se puede mejorar, se aceptan modificaciones. El que modifique también comparta su versión asi ampliamos el post.

___________
Primero en Tech-nico.com
Nicolas

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

Problemas comunes y críticos de un reclamo en un proveedor de internet

Detallemos los problemas que se han presentado en un reclamo (algunos con un plus de humor).

Reclamos Comunes:

  1. Le anda lento
  2. Coloco un router y no conecta porque esta fijado (el usuario) al mac address anterior (pppoe).
  3. Perdio el usuario y contraseña porque le formatearon la PC.
  4. Desactivo la placa de red.
  5. Puso «su email» en el «nombre de servicio» de la conexion. (marcando zulma@hotmail)

Reclamos Criticos:

  1. Le funciona en la PC de escritorio pero en la Notebook NO. (desactivo el wifi con el boton)
  2. Corto el conector RJ45 porque cambio la computadora al living. je
  3. Se reseteo el equipo a valores de fabrica con un golpe de corriente.
  4. No enciende la fuente de alimentación o largo olor a quemado (seguro entro agua por el cable).
  5. Se callo el equipo arriba del techo porque se resecaron los precintos.
  6. Se corto el cable. (lo mastico el perro o podo un árbol y le cayo una rama encima)
  7. Estaba limpiando y cuando puso los cables de nuevo no anduvo mas (puso los cables al revés en el POE)

Seguro me estoy olvidando unos cuantos. (si alguien nos cuenta su reclamo critico lo agregamos a la lista con los creditos).

Y para terminar algo que siempre recuerdo:
Me aparece el «salerito» me dijo una señora, y me di cuenta que lo que para ella era un salero, para nosotros es un reloj de arena. Y bueno, cada uno ve lo que quiere :P.

Un saludo amigos.

_____________________

Nicolas
Tech-nico.com

Nueva version Mikrotik v6.0 rc08

Mikrotik ha lanzado su nueva version beta con muchas correcciones y novedades.
Hice la migracion de la version 5.x a la v6.0 y realmente es muy notable lo bien que funciona.

Entre los cambios mas importantes:

*) ppp,pppoe,pptp,l2tp,sstp – solo 2 mangles «mss change» para todas los tuneles ppp; antes se creaba automáticamente 2 por cada tunel conectado y por ejemplo en mi caso, con 500 tuneles conectados tenia 1000 mangles dinámicos, algo que seguro consumía recursos.

*) Wireless: se arreglaron problemas de velocidad en encriptacion AES.

*) Webfig: Se comprimieron todos los archivos y recursos html para acelerar la carga al abrir la pagina de webfig. (de hecho, si se fijan en las graficas, el RouterOS ocupa menos que en las versiones anteriores)

*) snmp – provide POE info;

*) Las interfaces son eliminadas mucho mas rápido  (cuando había muchos tuneles ppp se ponía muy lento eliminar una interface).

*) fix queue simple en el matcheo de interface, cuando tiene la encapsulacion de algún tunel, podía tener doble conteo de paquetes.

*) ip/ipv6 firewall tiene ahora todas como matcheo de interfaces, todas las ether, todas las wireless, todas las vlan, y todos los tuneles ppp.

*) Queue Limits podía ser inexacto para grandes limites (100M o mas);

*) Se agrego soporte inicial de OpenFlow;

Realmente son todas cosas muy buenas. Anoche hice la migracion de la version 5.2 a las 5.23, (como version final de la serie 5). Y luego salte a la version rc8 de la serie 6. Lo unico que tuve que modificar fue: en queue tree el global-total por global. El resto levanto perfecto!!! Es muy notable ver en las graficas que consume mucho menos recursos.

Hoy por sorpresa, veo que en el sitio de www.mikrotik.com.ar/download no esta mas la version rc8. Tengo que decir que me asuste!!!.. pero luego lei a Normis (del foro oficial) decir que la sacaron de linea por un problema de certificados, pero para los que no usamos certificados no corremos ningun tipo de peligro.

Normis: RC8 has a critical issue with Certificates. We temporarily pulled it off the website. If you don’t use certificates, you can keep using RC8

Mientras tanto para los que quieran corregir este inconveniente pueden utilizar un pre-release rc9 con la corrección de los certificados, o bien esperar a que salga el fix oficial.

Saludos.
___________
Nicolas tech-nico.com

Template Cacti AirOS 5.5 para cacti version: 0.8.7g (hash version)

Para los que no lo saben, en el firmware 5.5 de ubiquiti dejaron de funcionar los graficos del Cacti. Por suerte un colaborador del foro oficial forum.ubnt.com publico un template que funciona de maravillas.

El unico inconveniente que se presenta al importar el archivo cacti_host_template_airos-ubnt_5_5.xml en el panel de control de cacti es que arroja el error:

Error: XML: Hash version does not exist

Este error es porque dentro del archivo xml tiene un tag llamado hash, que se forma con la version de cacti y unos numeros aleatorios. Por lo tanto si tu version no coincide con la del hash, arroja el error de arriba.

ejemplo: hash_0200248f0dcc6cc49fee26220bfeb7ae781802

0024 es la version de Cacti, que si miramos en la siguiente tabla de versiones corresponde a la 0.8.8 o 0.8.8a

"0.8.4"  => "0000",
"0.8.5"  => "0001",
"0.8.5a" => "0002",
"0.8.6"  => "0003",
"0.8.6a" => "0004",
"0.8.6b" => "0005",
"0.8.6c" => "0006",
"0.8.6d" => "0007",
"0.8.6e" => "0008",
"0.8.6f" => "0009",
"0.8.6g" => "0010",
"0.8.6h" => "0011",
"0.8.6i" => "0012",
"0.8.6j" => "0013",
"0.8.7"  => "0014",
"0.8.7a" => "0015",
"0.8.7b" => "0016",
"0.8.7c" => "0017",
"0.8.7d" => "0018",
"0.8.7e" => "0019",
"0.8.7f" => "0020",
"0.8.7g" => "0021",
"0.8.7h" => "0022",
"0.8.7i" => "0023",
"0.8.8"  => "0024",
"0.8.8a" => "0024"

En mi caso tengo la version 0.8.7g. Por lo tanto tendria que modificar el 24 por 21. :).
Lo que hice fue usar Adobe Dreamweaver para buscar y reemplazar mediante una expresion regular:  (lo vamos a hacer en 2 pasos).

Paso 1:

Buscar:

(hash_)([0-9]{2})(00)(24)

y reemplazarlo con:

$1$2$3{loquequieras}21

Paso 2:

Buscar:

{loquequieras}

y reemplazarlo por NADA. (dejar vacio).

Este paso ultimo paso es necesario porque si no, dreamweaver se confunde y piensa que $3 es $321, entonces separamos $3__algo__21 con algo que quieras y finalmente quitamos ese «algo» con el paso 2.

El archivo finalmente queda asi: descargar aqui

Recuerda situar el archivo AirOS5_5.xml en la ruta:
<path_cacti>/resource/snmp_queries/AirOs5_5.xml

__________________
Nicolas
tech-nico.com

Improvisar WinSCP en Mac o Linux

Algo que no me quiero olvidar es la sintaxis del comando scp que acabo de usar en MacOS X Lion. Me encontre en google con varias interfaces gráficas muy parecidas a WinSCP pero como no las conozco me da un poco de temor ingresar datos tan sensibles como usuario, contraseña, etc.

El comando es:

scp -P numpuerto -i path/to/keyfile  ruta/al/archivo_que _queres_subir  usuario_remoto@ip_servidor:/ruta/en/servidor

-P es el flag del numero de puerto, en la mayoria de los casos el 22.
-i es la ruta a la llave publica si es que tienes.

Ejemplo: supongamos que queremos subir el archivo tech-nico.xml que esta en la carpeta /nicolas.
$ cd /nicolas
$ scp -P 22  tech-nico.xml  patricio@192.168.72.9:/home/patricio
patricio@192.168.72.9’s password:  

Finalmente te va a solicitar la contraseña del servidor.

Como veran es muy facil.

Feliz año nuevo!!!!.

____________________
Nicolas
tech-nico.com

Mikrotik script para recorrer lista de secrets pppoe y reemplazar IP’s

PPPoE Secrets: Migrar de IP privada «fija» a IP publica «fija»
Algo muy puntual que tuve que hacer cuando migre de IP Privadas a IP Publicas fue mantener la terminación de las IP de los clientes PPPoE de mi Red. Se preguntarán.. para que?. Bueno en mi caso tengo un sistema de gestión que maneja el servidor usando el API mediante PHP y Mysql. Entonces me tiene que quedar sincronizadas las IP del Mysql con las del Mikrotik. Por otro lado, siempre fui de la idea de que todos los secrets tengan una IP fija asignada, ya que cuando me reportan un problema, de virus, ataque o violación de derechos de autor, puedo identificar con velocidad de quien se trata.

Ejemplo 192.168.100.8     por 201.250.45.8

Para ello, elabore un script que me recorra la lista y reemplace lo que quiero.

El Script es el siguiente:

       :local BUSCA "192.168.100";
       :local REMPL "201.250.45";
       # recorro todos los secrets
       :foreach i in=[/ppp secret find] do={
       # guardo remote IP
          :local tmpIP [/ppp secret get $i remote-address];
       # guardo la primera parte
          :local ipfirst [pick $tmpIP 0 11];
       #guardo la ultima parte
          :local iplast [pick $tmpIP 12 15];
       #busco los secrets que tienen el rango de Ip a reemplazar
            :if ($ipfirst=$BUSCA) do={
                  :log info ($REMPL .".".  $iplast);
                 /ppp secret set $i remote-address="$REMPL.$iplast"
            }
       }

Solo tienes que editar las primeras 2 variables «BUSCA» por la IP actual que vas a buscar, y «REMPL» por la IP nueva que quieres asignar a cada secret. Si tienes 4 clases C tendras que ejecutar el script 4 veces.

Para importarlo hay que copiar y pegar lo siguiente en la consola:

sys scr add name=recorro_ppp_remoteAddress policy=\
    ftp,reboot,read,write,policy,test,winbox,password,sniff,sensitive,api source=":local\
    \_BUSCA \"192.168.100\";\r\
    \n:local REMPL \"201.250.45\";\r\
    \n# recorro todos los secrets\r\
    \n:foreach i in=[/ppp secret find] do={\r\
    \n# guardo remote IP\r\
    \n   :local tmpIP [/ppp secret get \$i remote-address]; \r\
    \n# guardo la primera parte\r\
    \n   :local ipfirst [pick \$tmpIP 0 11];\r\
    \n#guardo la ultima parte\r\
    \n   :local iplast [pick \$tmpIP 12 15];\r\
    \n#busco los secrets que tienen el rango de Ip a reemplazar\r\
    \n     :if (\$ipfirst=\$BUSCA) do={ \r\
    \n           :log info (\$REMPL .\".\".  \$iplast);\r\
    \n          /ppp secret set \$i remote-address=\"\$REMPL.\$iplast\"\r\
    \n     }\r\
    \n}"

Salutes

_________
Nicolas Daitsch
tech-nico.com

Publicar Imagen de Ubiquiti Aircam en un sitio web (sin login) de manera automática

Esta webcam, mas precisamente la Aircam de Ubiquiti no tiene muchos parámetros para configurarla. Solo se acceden via login. Otras camaras tienen la opcion de desactivar el login o bien configurar un servidor FTP y publicar la imagen de la cámara cada x tiempo.
Nosotros lo que haremos es ingresarle por SSH y copiar la imagen /tmp/snap.jpeg (que es la ruta donde publica ubiquiti la imagen en vivo) dentro de nuestro sitio web de apache.

Para ello deberemos primero crear las Keys que requiere el acceso SSH.

Crear el par de claves públicas y privadas:

$ sudo ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):

Damos enter, para que las llaves se guarden en ~/.ssh

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

Le ponen el password que quieran. Luego vamos a la carpeta home del usuario root o bien al home del usuario logeado y veremos 2 archivos: id_rsa e id_rsa.pub.

Publicamos la llave publica id_rsa.pub en nuestra cámara desde el navegador. Como esta en la imagen.

Para testear que ingresas bien a la cámara puedes correr la siguiente linea desde la consola de linux donde se hospeda tu sitio web:

$ sudo /usr/bin/scp -qv «ubnt@IPdeAircam:/tmp/snap.jpeg» /var/www/tusitio/webcam.jpg.
Si todo va bien te tiene que solicitar la contraseña de la cámara. Luego revisa que se haya generado el archivo webcam.jpg en tu sitio.  :). Perfecto!, Ahora si queremos que la foto se publique sola, tenemos que lograr que esta linea de comandos no nos pida la contraseña. Para ello necesitamos instalar «expect», un programa para automatizar tareas que va a encargarse del login.

sudo apt-get install expect

Luego vamos a armar 2 script; uno que hara el trabajo de ingresar a la camarita, con lo siguiente:   webcam_image_get.sh

#! /usr/bin/expect
set hostName [lindex $argv 0]
 ### Modificar ubnt por el usuario, y /var/... por la ruta de tu sitio.
spawn /usr/bin/scp -q "ubnt@$hostName:/tmp/snap.jpeg" /var/www/tusitio/webcam.jpg

set timeout 10
expect {
  ### Modificar ubnt por la contraseña de tu camara
 -re ".*passphrase.*" { send "ubnt\n"; expect eof exit }
  eof { exit }
  timeout { puts "\n--TIMEOUT!--\n";exit}
}
exit

Modificar «ubnt ubnt» por el usuario y contraseña de tu camara y la ruta que tiene que apuntar a la de tu sitio web.

Y el otro script ejecutara el anterior cada cierto tiempo en segundos, y ademas usaremos «convert» para reescribir la imagen con un texto personalizado.

Para poder usar «convert» instalamos:  $ sudo apt-get install imagemagick

Y aqui el script: webcam_cron.sh

#! /bin/sh

while [ true ]; do
        sleep 2   # espearmos 2 segundos
 /home/tu_usario/webcam_image_get.sh 190.100.100.5 # ip de tu camara
        sleep 1  # esperamos 1 segundo mas
        convert -family Arial -pointsize 16 -fill "#ffffff"  -draw "text 20,20 'Tech-Nico.com Live'" /var/www/tusitio/webcam.jpg/var/www/tusitio/webcam.jpg
done

En rojo las cosas que tenes que modificar para tu caso.
Le damos permisos de ejecución a los 2 scripts con: $ sudo chmod +x

Finalmente para ejecutar «webcam_cron.sh» como trabajo en background y re-direccionamos la salida estándar a un archivo de texto llamado output para esconder los mensajes.

$  sudo ./webcam_cron.sh >>output 2>&1 &

Ahora si! ya tenemos nuestra imagen publicandose automaticamente. Solo tenemos que armar un archivito HTML y ponerle la etiqueta Refresh para que refresque cada cierto tiempo.

La única desventaja de esto es que «no vamos a ver la imagen como un video» Es mas lento porque hasta que se logea por ssh, intercambia las llaves.. ingresa la contraseña… copia el archivo..  todo eso le demora unos 2 segundos. Asi que lo mas rapido que puede publicar va a ser en 3 o 4 segundos como maximo.

Resultado

Espero que les guste y.. lo mas importante.. «les sirva».

________________
Nicolas Daitsch
tech-nico.com/blog

Como detectar BOTNET Torpig en una Red desde Mikrotik

Torpig o también conocido como Sinowal o Anserin es un tipo de botnet (variedad de troyano que pueden afectar a los equipos que utilizan Microsoft Windows). Torpig evita aplicaciones anti-virus a través del uso de rootkits y busca en el sistema infectado para robar credenciales, las cuentas y contraseñas de home banking, así como potencialmente permite a un atacante el acceso total al equipo. También es supuestamente capaz de modificar los datos en la computadora, e infectar el sector MBR.

Entendiendo como bloquearlo mediante Mikrotik

Lo que haremos a continuación es loggear (crear una lista dinámica automática) con la IP de origen (del cliente infectado) de todo trafico TCP en cualquier puerto con destino 91.19.0.0/16 y 91.20.0.0/16.

/ip firewall filter
add action=add-src-to-address-list address-list=MebRootVictim address-list-timeout=1d chain=forward comment=\
    "Detectamos clientes comprometidos con Torpig" disabled=no dst-address-list=MebRoot

NOTA: Se da por hecho que cualquier trafico saliente que apunte a estas 2 redes «91.19.0.0/16 y 91.20.0.0/16″, proviene de un cliente comprometido.

Luego eliminamos todo el trafico con destino a estas redes en el input, forward y output.

add action=drop chain=forward disabled=no dst-address-list=MebRoot
add action=drop chain=input disabled=no dst-address-list=MebRoot
add action=drop chain=output disabled=no dst-address-list=MebRoot

También eliminamos todo el trafico del cliente infectado «distinto al puerto 80 TCP» y «distinto al puerto 53 UDP». Esto deja sin navegación al cliente y solo le permite DNS y HTTP. Entonces queda el cliente filtrado (sin servicio) y lo único que puede ver es la pagina que dice que su equipo esta comprometido y necesita llamar a un técnico.

add action=drop chain=forward disabled=no dst-port=110,25,995,465,1863,20,21,22,23 protocol=tcp src-address-list=MebRootVictim
add action=drop chain=forward disabled=no dst-port=!53 protocol=udp src-address-list=MebRootVictim

En resumen nos quedaria asi:

/ip firewall filter
add action=add-src-to-address-list address-list=MebRootVictim address-list-timeout=1d chain=forward comment=\
    "Drop Mebroot y Torpig y logueo el cliente de origen." disabled=no dst-address-list=MebRoot
add action=drop chain=forward disabled=no dst-address-list=MebRoot
add action=drop chain=input disabled=no dst-address-list=MebRoot
add action=drop chain=output disabled=no dst-address-list=MebRoot
add action=drop chain=forward disabled=no dst-port=!80 protocol=tcp src-address-list=MebRootVictim
add action=drop chain=forward disabled=no dst-port=!53 protocol=udp src-address-list=MebRootVictim

Agregamos las redes de destino a las que apunta el virus:

/ip firewall address-list
add address=91.19.0.0/16 comment=BOTNET disabled=no list=MebRoot
add address=91.20.0.0/16 comment=BOTNET disabled=no list=MebRoot

En la parte de NAT hacemos el direccionamiento a la pagina de error. (en caso de tenerla). Es una buena manera de que el cliente bloqueado se de cuenta que tiene un virus.

add action=dst-nat chain=dstnat comment="REDIRECT VIRUS TORPIG" disabled=no dst-port=80 protocol=tcp \
    src-address-list=MebRootVictim to-addresses=###IP_TU_APACHE### to-ports=#83#

Reemplazamos ###IP_TU_APACHE### por la IP correspondiente a tu linux. Por ejemplo, pueden probar con la de google: 173.194.42.50 y puerto en este caso reemplazamos #83# por 80. En mi caso tengo en el puerto 81 el cartel del virus confiker y en el 83 el mensaje del virus Torpig.

Eso es todo. Espero que les sirva de ayuda como a mi.
Esta es mi versión modificada de la que aparece en el Wiki oficial de Mikrotik

________________________
Nicolas tech-nico.com

Hacer tunel ssh sin instalar putty

Hoy tuve la necesidad de armar un tunel SSH en Mac Lion. Se que hay una version de Putty para UNIX, por lo que estimo debería funcionar tanto en Mac como en Linux.
Para salir de un apuro sin instalar Putty lo que podemos hacer es lo siguiente:

sudo ssh -2 201.234.33.58 -l TuUsuario -p 22 -i ~/Llave.ppk -L 127.0.0.1:8080:127.0.0.1:80

nota: el ssh viene instalado de forma nativa en todas las plataformas UNIX.

Paso a paso:

1)  -2 Fuerza a usar protocolo version 2
2)  -l (ele) Nombre de Usuario remoto
3)  -p Numero de puerto
4)  -i ~/Llave.ppk. Esto significa, que busque la llave en el directorio del usuario logueado. hay que poner la llave con permisos de lectura/escritura para el propietario. sudo chmod 600 Llave.ppk.
5) -L 127.0.0.1:8080:127.0.0.1:80. Es para hacer un port forwarding (si tenemos que utilizar una intranet por ejemplo). IpLocal:PuertoLocal:IpDestino:PuertoDestino.

Para mas detalles ejecutamos: man ssh

Que sirva de ayuda memoria.
_____
Nicolas
tech-nico.com/blog

Clonar Mac-Address en AirOS Ubiquiti

Un colaborador del foro ISPARG (David Aldret) nos resolvió el gran problema de poder clonar un Mac address en AirOS y que se mantenga el cambio luego de reiniciar.

Por que clonar un mac?. Se quema un equipo; y muchos clientes tienen fijado el mac del AP. Si hubiera tenido este tip no habria ido casa por casa 😛

Hay que entrar al equipo por SSH o bien por el admin.cgi y pegarle este codigo

echo «ifconfig ath0 down; ifconfig ath0 hw ether MAC; ifconfig ath0
up» > /etc/persistent/rc.poststart; chmod +x /etc/persistent/
rc.poststart; cfgmtd -w -p /etc/; reboot

___________________
Nicolas tech-nico.com

Nuevo Firmware Ubiquiti AirMax v5.5

Una excelente noticia para todos los WISP, el nuevo firmware v5.5 de la serie «M» Airmax trae muchas sorpresas y cambios muy solicitados. Entre ellas el poder agregar infinitos MAC address en un ACL y poder comentarlos o desactivarlos como lo hacemos con RouterOS. Tambien tenemos la actualizacion del kernel a una version superior.
Ademas también tenemos ahora la posiblidad de usar Airmax Client en todos los productos 802.11 a/b/g.

Creo que mas muchas de las funcionalidades agregadas son las que faltaban para que mas de uno se decida a utilizar Ubiquiti, e incluso migrar hacia ubiquiti.

Entre las mejoras destacadas tenemos:

- Improvement: Linux kernel update to 2.6.32 version
- Improvement: AirMax performance in large PtMP networks
- Improvement: AirSync performance in PtMP networks
- Improvement: ACL List: Dynamic list now allows instant changes (no restart or dropped connections required)
- Improvement: ACL List: MAC list limit increased from 64 to unlimited
- Improvement: ACL List: Ability to add comments to MACs
- Improvement: ACL List: Ability to enable/disable a MAC without removing it from the list
- Improvement: DFS functionality improvement according FCC/ETSI requirements
- Improvement: Report Horizontal / Vertical antenna instead of "Chain 0 / Chain 1"
- Improvement: New look for wireless mode configuration
- Improvement: Various WEB GUI tweaks, changes, improvements
- Improvement: Send NASID in Access-Request packet.
- Improvement: Add internal speed test tool to DMZ exemption ports
- Improvement: Hide Discovery Tool for read-only account
- Improvement: Extension for Port Forward configuration. Allow to specify Public IP

Entre las nuevas funcionalidades:

- New: Management VLAN support
- New: Advanced network settings configuration mode
- New: RADIUS MAC authentication
- New: Low TX power mode support for all M series models
- New: AirMax client support for 802.11 a/b/g products
- New: DHCP relay functionality in Router/SOHO Router mode
- New: UPnP server support in Router/SOHO Router modes
- New: Ability to Block WAN Access in SOHO Router mode
- New: Fallback IP for PPPoE client
- New: 3/8 MHz channel width support for M900
- New: 8/30 MHz channel width support for M2/M5
- New: 8/25 MHz channel width support for M3
- New: 25 MHz channel width support for M365
- New: Full range of channel width options in Compliance mode
- New: Max allowed MTU size for newer HW revision models is 2024 bytes
- New: Make Device name the Product Model by default
- New: Separate throughput graphs for LAN0/LAN1 interfaces
- New: Option to create support info file with ping watchdog before device reboot
- New: Enable/Disable CDP option in Device Discovery section
- New: Check for existing uploaded firmware image when opening System page
- New: Prepare for IPv6 support
- New: Traffic shaper for ingress traffic
- New: Notification for software updates
- New: Add PPPoE service name configuration
- New: Kernel patches for SIP conntrack/NAT support
- New: Show AirMax priority in Main page for Station mode

Fixes:

- Fix: Configuration change causes device with a long uptime to lock up
- Fix: Device stops passing traffic after some time and requires a reboot or "kick" to work again
- Fix: Dynamic DNS update after PPPoE session initialization
- Fix: Station list is empty when there are few stations associated
- Fix: Port ID is mandatory in CDP packet
- Fix: STA-WDS in bridge mode is passing back multicast/broadcast packets
- Fix: "Antenna Gain" and "Cable Loss" fields are locked for LocoM900 with external antenna
- Fix: Incorrect connection time reporting
- Fix: Timestamps reset because of stuck beacon. Causes other manufacturers' (i.e. Tranzeo) devices to re-associate.
- Fix: Can't launch airView with HTTPS enabled on IE8
- Fix: Traceroute fails to DNS host with multiple addresses

__________________
Nicolas tech-nico.com

Recuperando Std exception old lock file terminating – mongodb

Cuando un servidor tiene un apagado forzoso (se apaga por un corte de energia) o por alguna otra razón, es probable al querer iniciar nuevamente la base de datos /etc/init.d/mongodb start obtengamos el error: «exception in initAndListen std::exception: old lock file, terminating» en el el log de mongodb.

Para resolverlo simplemente eliminamos el archivo  /var/lib/mongodb/mongod.lock.
__________________
Nicolas tech-nico.com

Como refrigerar un Azbox HD Bravoo

Hoy decidí modificar mi equipo de FTA (Free to Air).

Al parecer en lugares donde corre poco aire los equipos levantan temperatura y terminan apagándose o destellando la pantalla.

Lo que hice fue comprar un Cooler de PC marca NogaNet ($ 15 pesos). Mientras sean de 12v. Cualquier marca sirve.

Aqui va el resultado en imagenes:

Feliz Navidad!!!!! 😀
______________________
Nicolas Tech-nico.com

[Solucionado] Error en Thundercache (mongodb) luego de la instalación (Uncaught exception ‘MongoCursorException’ )

Desde hace un tiempo que estoy intentando instalar ThunderCache en Ubuntu Server 11.04 64bits. La cuestión es que siempre que finalizaba la instalación se rompía algo, y perdía el el acceso por web al ThunderCenter. A muchos les ha pasado luego de instalar las actualizaciones o bien hacer upgrade a las versiones mas nuevas.

Mas en detalle
Luego de terminar con la instalación de ThunderCache (bin 846) con ThunderCenter 3.4.4 hay que ingresar a http://ipthunder:82     usuario: admin     password:admin

La primer pantalla es la de configuración, algo como:

 

Al presionar en <Confirm> nos obliga a reiniciar el servidor. La gran sorpresa es que luego del reinicio, no podemos ingresar mas por web. Si bien la IP responde, el apache no!!.

Mirando en el log del apache nos vamos a encontrar con este error:

# tail /var/log/apache2/error.log

Uncaught exception ‘MongoCursorException’ with message ‘getFile(): bad file number value (corrupt db?): run repair’ in /usr/local/tcenter/www/index.php:15\nStack trace:\n#0 /usr/local/tcenter/www/index.php(15): MongoCollection->findOne(Array)\n#1 {main}\n thrown in /usr/local/tcenter/www/index.php on line 15

Para resolverlo seguimos estos pasos:

1 #  /etc/init.d/thunder restart
2 #  apache2ctl stop
3 #  /etc/init.d/mongo stop
4 #  /etc/init.d/mongodb stop
5 #  mongod --dbpath /var/lib/mongodb --config /etc/mongodb.conf --repair
6 #  chown mongodb  /var/lib/mongodb -R
7 #  /etc/init.d/mongodb start
8 #  apache2ctl start

El funcionamiento es impresionante, realmente vale la pena instalarlo en redes grandes.

Las Barras de progreso en verde son descargas de objetos cacheados. Y las azulcitas son objetos que esta almacenando en el cache.

Que tengan unas muy felices fiestas!
______________________
Nicolas tech-nico.com/blog

Native instrument Audio 8 DJ | micro cortes y ruidos raros

Esto va para todos aquellos que sufren problemas con la placa Audio 8 y Traktor.
El problema esta en los drivers que son bastante inestables, probé:

  • 3.0.1
  • 3.0.0
  • 2.9.8 beta (ya no están mas en el sitio de NI)
  • 2.0.15
Y para mi sorpresa los únicos que reproducen sin micro pausas en el audio son casi los mas viejos, la version 2.0.15; pero tampoco son perfectos. En mi caso se escuchan unos pequeños ruidos aleatorios, son ruidos bastante sutiles pero en fin ruidos que no debería hacer por el valor del equipamiento. Hoy encontré ademas algunos tips interesantes en el foro oficial de Native Instrument, que consisten en modificar la prioridad de los IRQ (interrupciones) para dar prioridad al IRQ10 que es la interrupción que maneja la parte de audio. También es conveniente desactivar interfaces Wireless, Ethernet, Bluethoot. Usar la Notebook con el mayor rendimiento posible de energía. (No usar dispositivos USB innecesarios). Etc.
A continuación, editar el registro para Windows 7 o Vista
1. Ir a Inicio -> Ejecutar -> Escribir "Regedit" (sin comillas) -> Press Enter

Esto abrirá el registro

2. Ahora en la izquierda del Regedit muévase hasta: 

HKEY_LOCAL_MACHINE\SYSTEM\Curr entControlSet\Control\Priority Control

Aquí debería ver 2 filas: "Predeterminado" y "Win32PrioritySeparation"

3. Click derecho en el area blanca de la derecha y click en

Nuevo -> Valor de DWORD (32-bit) |  (como podrás ver)

Ahora veras una nueva fila!

4. Click derecho en esta nueva fila y elegir renombrar.

Renombrar como "IRQ10Priority" sin comillas (escribir Exactamente como esta!)

Presionar <Enter>.

5. Ahora que lo has renombrado, hacer doble click en este y veras una área de texto con el valor 0 en su interior.  

Cambiar el 0 por 1, <dejar el resto igual, y click en ACEPTAR>

6. Cierre el registro y reinicie la computadora!
Luego en el administrador de dispositivos, hay que destildar una opcion en los puertos USB, haciendo doble click en cada dispositivo llamado «Controlador raíz USB».
Nos movemos a la solapa «Administración de Energía» y finalmente destildar la opción «Permitir que el equipo apague este dispositivo para ahorrar energía«.
Todavía sigo con esos pequeños ruidos. Espero que alguien tenga un tip para eliminarlos o bien salga un driver como la gente. :P. Eso fue todo amigos.
Que tengan una muy Feliz Navidad y prospero año nuevo!!!_____________________
Nicolas tech-nico.com/blog 

Crontab y PHP: Enviar logs, procesos, o backups via mail

Algo que surgió anoche en la clase de Linux (Crontab), fue casualmente «poder hacer un backup automático y que lo envie a nuestro mail». Todavía no aprendimos Bash Scripting / Pyton / Perl o bien para el que esta mi situación, tenemos la alternativa de ejecutar un script PHP.

Inicialmente este script hacia un dump de la base de datos mysql y enviaba el archivo .sql via mail. Aca lo posteo con algunas modificaciones para que cada uno lo adapte a sus necesidades.
En este ejemplo vamos a imprimir el syslog (tail syslog) y enviarlo via mail como archivo adjunto.
La funcion en PHP para ejecutar un comando Linux es:

system(«tu comando»);            // Ej:  system(«ps -fea»);
*En este ejemplo listamos los procesos.

Sabiendo esto, el código del script PHP podría ser algo asi:

<?php
//// Script: Nicolas Daitsch 24 de noviembre de 2011
//// http://tech-nico.com/blog

////////////// CONFIGURACION //////////////////////////
$sendto = "Webmaster <tuemail@gmail.com>"; // DESTINO
$sendfrom = "Log Diario Servidor <logs@tuempresa.com>"; // ORIGEN
$sendsubject = "Log Diario mi servidor"; // ASUNTO
$bodyofemail = "Aca esta el log que genero el Crontab."; // MENSAJE
$COMANDO_LINUX = "tail /var/log/syslog"; // COMANDO
////////////////////////////////////////////////////////

    $backupfile = "syslog_". date("Y-m-d") . '.txt';
    system($COMANDO_LINUX > $backupfile);
    include('Mail.php');
    include('Mail/mime.php');

    $message = new Mail_mime();
    $text = "$bodyofemail";
    $message->setTXTBody($text);
    $message->AddAttachment($backupfile);
    $body = $message->get();
    $extraheaders = array("From"=>"$sendfrom", "Subject"=>"$sendsubject");
    $headers = $message->headers($extraheaders);
    $mail = Mail::factory("mail");
    $mail->send("$sendto", $headers, $body);

    //unlink($backupfile);
?>

Editamos la sección que dice //// CONFIGURACION y escribimos nuestros valores.
Luego instalamos el modulo PEAR para envio de mails con PHP:

#  apt-get  install  php-mail   php-mail-mime   php-mail-mimedecode

Editamos el Crontab:

# crontab -e

Agregamos esta linea al final, guardamos y salimos:

08 12 * * * /usr/bin/php -f /var/www/backup.php > /root/cronerrors.txt 2>&1

Explicamos lo que hace esta linea:

  1. (08 12 * * *) Todos los dias a las 12:08 PM
  2. (/usr/bin/php -f) Ruta del interprete PHP en Debian/Ubuntu. Flag «-f» Ejecutar un archivo PHP.
  3. (/var/www/log_script/log_send.php) Ruta del Script
  4. (> /root/cronerrors.txt 2>&1) Redirecciono la salida de error hacia un archivo de texto en /root. Esto también puede ser /home/usuario/errores.log
Descargamos los archivos necesarios para el funcionamiento. Y los ubicamos en la ruta /var/www/.
___________________

Configurar OpenVPN Roadwarrior en Debian 6 y Windows

Vamos a configurar OpenVPN del modo RoadWarrior con PKI (Public Key Infraestructure)
Un claro ejemplo para explicar el modo RoadWarrior: Son 1 o mas clientes que se conectan (autenticándose) de manera remota desde una PC hacia nuestro «linux OpenVPN Server», y utilizando internet como medio de acceso para ingresar de manera segura a los recursos de la empresa, como serian, un servidor de aplicaciones, mail, recursos compartidos, etc.

Comenzamos con la instalacion:

1) Instalamos OpenVPN

# apt-get install openvpn

2)  comenzamos generando los certificados:

01. #  cp -a /usr/share/doc/openvpn/examples/easy-rsa /etc/openvpn/
02. #  cd /etc/openvpn/easy-rsa/2.0/
03. #  . ./vars
04. #  ./clean-all
05. #  ./build-ca
06. #  ./build-key-server servidor
07. #  ./build-key cliente1
08. #  ./build-dh
09. #  cd keys
10. #  cp ca.crt ca.key servidor.crt servidor.key dh1024.pem  /etc/openvpn/

Explicación paso a paso:
01: Copiamos los scripts con el comando «cp»
02: Nos posicionamos sobre el directorio de scripts
03: Inicializamos variables «. ./vars»
04: blanqueamos el directorio de claves «./clean-all»
05: generamos certificado CA  «./build-ca»

Aquí nos nos preguntara un montón de datos sobre la empresa que utiliza el certificado. Sugiero llenarlo con datos reales. NOTA: Debemos prestar mucha atención en el «Common Name».  Si en Common Name completamos con «TECHNICO» Lo anotamos o recordamos para no repetirlo en los proximos pasos; ya que en las 3 veces que lo generaremos, necesitamos nombres que no se repitan.

06: Creamos las credenciales para el servidor. » ./build-key-server servidor».

Completamos con los datos anteriores, sin repetir «common name» (como mencionamos anteriormente).

07: Creamos las credenciales para el cliente. » ./build-key cliente1″. Esto va a generar «cliente1.key» y «cliente1.crt»
08: Creamos los parámetros con el comando»./build-dh».  *dh: Diffie Hellman (Protocolo Criptografico).
09: nos posicionamos en el directorio donde se generaron los certificados «cd keys».
10: copiamos los certificados a /etc/openvpn/

3) Continuamos con la configuración:
Instalamos el editor VI y luego entramos a editar server.conf

# apt-get install vim
# vi /etc/openvpn/server.conf

USO DEL VI Editor
a) Para editar presionan la letra «i» o la tecla <insert>. Luego para finalizar de editar <esc>
b) para guardar y salir del vi: escriben ‘ : ‘ (dos puntos); aparecera un path para escribir.
c) Escriben ‘wq’ y presionan <Enter> (w de write y q de quit). Con esto ya deberian estar nuevamente en el path de linux.
Archivo server.conf:

port 1194
proto udp
dev tun
persist-tun
ca ca.crt
cert servidor.crt
key servidor.key
dh dh1024.pem

#Direcciones que se asignaran a los clientes, el server es .1
server 10.1.1.0 255.255.255.0

ifconfig-pool-persist ipp.txt

#Routeo para que los clientes alcancen la red local del server (1.0/24)
push .route 192.168.1.0 255.255.255.0.

#Para que los clientes se visualicen entre ellos
#Debe ir junto con la opción routeback en el shorewall
client-to-client

keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
verb 4

4) Configuración de cliente OpenVPN en Windows XP, Vista o Seven.

a) Descargar: openvpn-2.0.9-gui-1.0.3-install.exe y luego instalarlo.
b) Copiar a la carpeta «C:\Program Files\OpenVPN\config» con WinSCP o desde un Sftp los archivos:

  • /etc/openvpn/easy-rsa/2.0/keys/ca.crt
  • /etc/openvpn/easy-rsa/2.0/keys/cliente1.crt
  • /etc/openvpn/easy-rsa/2.0/keys/cliente1.key

c) Creamos un archivo TXT y lo guardamos como cliente1.ovpn en «C:\Program Files\OpenVPN\config». Luego le pegamos lo siguiente:

tls-client
client
dev tun
proto udp
remote 192.168.1.135   # IP o dominio del servidor OpenVPN
float #debido a que la IP de arriba es dinamica
resolv-retry infinite
nobind
persist-key
persist-tun
ca "C:\\Program Files\\OpenVPN\\config\\ca.crt"  #revisar las comillas luego de copy/paste
cert "C:\\Program Files\\OpenVPN\\config\\cliente1.crt"
key "C:\\Program Files\\OpenVPN\\config\\cliente1.key"
comp-lzo
verb 4

5) Reiniciamos openvpn en Debian

#  /etc/init.d/openvpn restart

Stopping virtual private network daemon: server.
Starting virtual private network daemon: server.

6) Iniciamos OpenVpn en windows. Ver Imagen

Click con boton derecho en el iconito señalado, y luego click en Connect. Si no nos arroja ningún error significa que todo es un éxito.

______________
Nicolas Tech-Nico.com

Ejercicios de expresiones regulares

Dado el siguiente archivo:  «expr_reg_1.txt»

a
aba
aabb
aabbb
aaabbb
aa
baa
abab
ababa
bababa
ab
bbb
baaa
abbba
bbaabb
ba
aaaa
baba
bbaab
bbabaa
aaa
aaba
bbbb
bbbaa
bbbabb

1.no tenga más de tres «a» o tres «b» seguidas
root@debian:~# cat expr_reg_1.txt | grep -E ‘^[^aaaa]|[^bbbb]$^[^bbbb]|[^aaaa]$’
a   <  falta (por error no lo trae)
ab
ba
baa
bbb
aabb
abab
baaa
baba
bbbb
aabbb
bbaab
bbbaa
aaabbb
bababa
bbaabb
bbabaa
bbbabb

2.vayan alternando las «a» y las «b» sin repetirse
root@debian:~# cat expr_reg_1.txt | grep -E ‘^(ab)+$|^(ba)+$’
ab
ba
abab
baba
bababa

3.sólo tenga parejas de «a» y de «b»
root@debian:~# cat expr_reg_1.txt | grep -E ‘[a]{2}[b]{2}’
aabb
aabbb
aaabbb  < este se filtro :p
bbaabb

4.tengan sólo «a» o sólo «b»
root@debian:~# cat expr_reg_1.txt | grep -E ‘^[a]+$|^[b]+$\b’
a
aa
aaa
bbb
aaaa
bbbb

5.haya unas cuantas «a» y luego unas cuantas «b» o al revés
root@debian:~# cat expr_reg_1.txt | grep -E ‘^[a]{2,}[b]{2,}$|^[b]{2,}[a]{2,}$’
aabb
aabbb
bbbaa
aaabbb

6.contengan la cadena «aba» o la cadena «bab»
root@debian:~# cat expr_reg_1.txt | grep -E ‘(aba|bab)’
aba
aaba
abab
baba
ababa
bababa
bbabaa
bbbabb

7.contengan la cadena «ba» dos veces
root@debian:~# cat expr_reg_1.txt | grep -E ‘(ba){2}’
baba
ababa
bababa  < este se filtro :p
bbabaa

________________
Nicolas tech-nico.com

Resolver «Zone expired | unexpected rcode (SERVFAIL)» en Bind9

Hoy me ocurrió que luego de un mal apagado del servidor, había dejado de resolver mis zonas DNS. Mirando el SYSLOG note el error: «zone tech-nico.com.ar/IN: expired«.

Oct 16 16:12:47 www named[11730]: zone tech-nico.com.ar/IN: expired
Oct 16 16:12:47 www named[11730]: zone 114.58.200.in-addr.arpa/IN: expired
Oct 16 16:12:48 www named[11730]: zone tech-nico.com.ar/IN: refresh: unexpected rcode (SERVFAIL) from master 200.58.114.78#53 (source 0.0.0.0#0)
Oct 16 16:12:48 www named[11730]: zone 114.58.200.in-addr.arpa/IN: refresh: unexpected rcode (SERVFAIL) from master 200.58.114.78#53 (source 0.0.0.0#0)
Oct 16 16:13:36 www named[11730]: zone 114.58.200.in-addr.arpa/IN: refresh: unexpected rcode (SERVFAIL) from master 200.58.114.78#53 (source 0.0.0.0#0)
Oct 16 16:13:38 www named[11730]: zone tech-nico.com.ar/IN: refresh: unexpected rcode (SERVFAIL) from master 200.58.114.78#53 (source 0.0.0.0#0)

Lo resolvi cambiando el serial code en todas las zonas; Ejemplo: /etc/bind/tech-nico.com.ar

$TTL 3600
tech-nico.com.ar.     IN      SOA     dns1.tech-nico.com.ar. root.tech-nico.com.ar.       (
                        2011101610  ;  serial number

Donde «2011101610» es formato YYYYMMDDXX. YYYY= año MM=mes DD=dia y XX=Numero de revisión.

_____________________
tech-nico.com 

Servidor de archivos en Debian 6 (Samba)

Algo que siempre nos va a venir al pelo es la configuración del Samba para compartir archivos en un Grupo de Trabajo. Lo publicamos como ayuda de memoria.

Tarea: compartir 2 carpetas en el grupo TECHNICO. Cada carpeta pertenece a un usuario distinto.

1) Vamos a instalar los paquetes del Samba:

# apt-get install samba samba-common smbclient samba-doc smbfs

2) hacemos un backup del archivo de configuracion.

# cp  /etc/samba/smb.conf   /etc/samba/smb.conf.original

3) Instalamos el editor VI y luego entramos a editar smb.conf

#  apt-get install vim
# vi /etc/samba/smb.conf

 #========= Global Settings ==============
[global]
workgroup = TECHNICO 

##### Authentication ######
## descomentar la siguiente linea.
##(Es para poder loguearnos con las cuentas de linux)
security = user 

 #### al final del archivo agregamos ###

[cattaneo]
 comment = bienvenido 
 path = /home/samba/cattaneo
 browseable = yes 
 read only = no 
 valid users = cattaneo

[deepdish] 
 comment = hola 
 path = /home/samba/deepdish 
 browseable = yes 
 read only = no 
 valid users = deepdish 

USO DEL VI Editor
a) Para editar presionan la letra «i» o la tecla <insert>. Luego para finalizar de editar <esc>
b) para guardar y salir del vi:  escriben ‘ : ‘  (dos puntos); aparecera un path para escribir.
c) Escriben ‘wq’  y presionan <Enter> (w de write y q de quit). Con esto ya deberian estar nuevamente en el path de linux.

4) Creamos usuarios de sistema (sin shell ni directorio personal) y de samba. (va a pedir las contraseñas usar la misma en adduser que en smbpasswd).

# adduser –shell /bin/false –no-create-home cattaneo
# adduser –shell /bin/false –no-create-home deepdish
# smbpasswd -a cattaneo
# smbpasswd -a deepdish

5) Creamos carpetas y permisos (en este caso le doy permisos totales 777)

# cd /home
# mkdir samba
# chmod 777 samba
# cd samba
# mkdir cattaneo
# mkdir deepdish
# chmod 777 cattaneo/   &&  chmod 777 deepdish/
# chown cattaneo:cattaneo cattaneo/
# chown deepdish:deepdish deepdish/

6) reiniciamos el servicio Samba con:

# /etc/init.d/samba restart

Fuente: Curso de Linux Clase 14 Parte II

_______________
tech-nico.com/blog
nicolas daitsch

«Plan Social» de Internet en La Pampa (Fibra Óptica del Gobierno)

El martes 2 de Agosto, estuvimos presentes junto a varias Cooperativas en las oficinas de la FEPAMCO (Federación Pampeana de Cooperativas). La reunión nos convoco para hablar sobre el “Plan Social”, (uno de los 2 planes de internet que quiere impulsar el gobierno en todos los pueblos que están conectados a su fibra óptica).

Entre las Cooperativas presentes estaban: Cooperativa de Santa Rosa, Jacinto Arauz, San Martin, Intendente Alvear, Realico, Victotica, Winifreda, Guatrache, y otras. (de 15 Cooperativas que conectan a la fibra del acueducto del colorado).

El “Plan social” consiste en U$S 40,00 + IVA por Mega para cada Cooperativa, con la condicion de que se reparta 1 Mb en 20 personas. (Relación bastante complicada). Y $ 50 (IVA inc) al cliente final. Estos costos ya fueron divulgados por el mismo gobernador hace ya un tiempo.

Abel Argüello, presidente de la FEPAMCO dijo en el Diario La Arena:

«Los números que nos dio el gobierno cierran para algunas cooperativas pero para otras no, y esto es porque tenemos realidades muy diferentes, no hay dos cooperativas iguales», aclaró. Algunas variables que determinan esos matices son la cantidad de usuarios, la dispersión de ellos -en unos casos la cooperativa provee a una única localidad, y en otros a varias-, y el tipo de conexiones -por cable o inalámbrica-, entre otras.

El negocio cierra teniendo en cuenta cuanto paga hoy en dia cada una de las Cooperativas el Mb en telefonica o telecom. Hay cooperativas que lo están consiguiendo a U$S 50,00 el Mb. Bien, entonces esta claro que a esa Cooperativa el plan Social No le Sirve (dicho plan va a autocompetir con sus planes actuales con 1 Mb que de Mega solo tiene el nombre). Pero si rechazan la propuesta, el gobierno se la da a un privado.
Para otras cooperativas el costo del mega ronda en los U$S 300,00 y efectivamente el plan social podría ser una salvación.

Fuentes: reunion-fepamco-fibra-optica-plan-social

_________________
Nicolas  www.tech-nico.com/blog

Flash CS3: Arma tu propio Datagrid con Tooltips

Después de tanto tiempo sin postear, me decidí por traerles un Datagrid (Flash) que tuve que armar en un apuro cuando necesitaba terminar uno de mis trabajos. La aplicación era muy sencilla: Imprimir datos de un Stored Procedure de SQL Server, por medio de un archivito en ASP, que parseado por Flash mostrara datos en pantalla.

Y aquí fue donde se presentaron los contratiempos: Mostrar los datos en un Datagrid puede parecer algo sumamente sencillo. Pero, en mi caso, al ser tanta la cantidad de columnas que debía mostrar, si quería lograr algunos detalles como por ejemplo 1 tooltip, (o seleccionar el ultimo registro con otro color), se tornaba algo bastante inflexible.

El Datagrid nativo de Flash sinceramente me hizo perder bastante tiempo y no logre hacer nada de lo que quería. «Llenar el datagrid fue fácil, el resto imposible :p». Supuse que alguien tenia que haber armado algo en la red. Pero no encontre nada.

Aqui va el datagrid creado.

Es bastante mas liviano pero a la hora de configurarlo, (al no ser un componente), hay que modificar mucho codigo.

A Futuro: Le falta pulir muchas cosas: Scroll vertical y horizontal y/o paginacion. Y armarlo como componente.

Creo que el uso es bastante puntual. Pero seguramente mas de uno ha perdido tiempo. Enjoy!.

Descarga de archivos

___________________

nicolas Tech-nico.com/blog

Las 10 reglas de marketing Online de Brian Clark

Algo que lei en maestrosdelweb.com (y realmente me encanto para tenerlo siempre presente), es una nota que le hicieron a Brian Clark, el CEO de copyblogger.

Una frase para destacar:

Enfócate en ellos primero (tus clientes) y luego, obtendrás todo lo que quieras de regreso.

10 Reglas del marketing Online

  1. Diferencia Ganadora: La diferencia capta mayor atención de los usuarios que lo común.
  2. No vendas…Enseña: “Vender es sólo educar a la gente sobre los beneficios de hacer negocio contigo.”
  3. Contenido de piedra Angular: Tu contenido debe tener una base sólida de desarrollo, “tu contenido de piedra angular no sólo debe ser estratégico, debe proporcionar valor fresco e intenso.”
  4. Encabezados y Ganchos: No importa el tema que desarrolles haz que tu encabezado sea interesante, “asesino” y tenga gancho para llamar la atención de tus lectores.
  5. Gana amigos para influenciar a la gente: Ten amistades con personas que te ayuden en la búsqueda de reconocimiento, que puedan promover tu contenido utilizando redes sociales para llegar a más lectores.
  6. El dinero está en la lista: Este dicho común en publicidad se resume en: “Hacer que la gente se registre y te preste atención a lo largo del tiempo es la clave para la construcción de autoridad… y para vender algo en el futuro.”
  7. El SEO importa: Dominar el tema de SEO es importante si buscas posicionarte, recuerda que: “Un contenido de mala calidad con una buena base y comprensión de SEO seguramente logrará posicionarse.”
  8. El código que Google ama: Busca que el código de tu sitio web esté bien construido y sea amigable.
  9. El diseño hace el Sitio: El contenido es importante en un sitio web pero el diseño es lo que atraerá a más lectores.
  10. Cuida a tu Tribu: Luego de convertirte en “líder” de muchos seguidores preguntate: “¿Qué tipo de líder serás?” recuerda: “trata bien a tu tribu, y la autoridad te servirá bien”.

Puedes leer la entrevista completa de Brian Clark de Copyblogger en MaestrosDelWeb

____________
Nicolas Daitsch
tech-nico.com

El pibe play

Bug de Google Ads causa problemas con Internet Explorer

A muchos de nosotros los desarrolladores nos esta pasando, que en algunos de los sitios que tienen Ads de Google aparecen errores en IE6, IE7 e IE8 sin que hayamos hecho ningún cambio.

Luego de que carga nuestro sitio aparece una ventana que dice «Internet explorer no puede abir el sitio: http://tech-nico.com
Operacion anulada
«.

Con IE8 da el siguiente error:
Detalles de error de página web

Agente de usuario: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; AskTB5.6)
Fecha: Wed, 22 Sep 2010 14:33:30 UTC

Mensaje: No se pudo completar la operación debido un error 800a03e8.
Línea: 1
Carácter: 244
Código: 0
URI: http://pagead2.googlesyndication.com/pagead/render_ads.js

La linea del error es:

(function(){var a=»window.google_render_ad();»;if(typeof google_protectAndRun==»function»&&typeof google_handleError==»function»)a=’google_protectAndRun(«render_ads.js::google_render_ad», google_handleError, google_render_ad);’;var b=»script»;document.write(«<«+b+»>»+a+»</»+b+»>»);})()

Al parecer se trata de un error en el Javascript de uno de los servidores de Adsense , que ocurre con conexiones lentas, o cuando algun script carga antes de que termine de cargar el html.

Si intentamos acceder desde el mismo u otro PC, (a través de la misma conexión), arroja el mismo error con cualquier sitio que tenga Adsense de Google.

Por lo que se ve; el problema ya fue resuelto para IE8. Por lo tanto la mayoria de nuestros sitios aun no funcionan en IE6 e IE7.

Oremos! 😀

fuente: foro google

____________________
Nicolas Daitsch
www.tech-nico.com/blog

Graficando la cantidad de túneles PPPoE (conectados simultáneamente) con DUDE 4

Lo que queremos obtener es el numero de tuneles PPP simultanes en nuestro concentrador PPPoE Server Mikrotik. Que quedaria como la imagen que se muestra a continuacion:

En primer lugar necesitamos crear una función:

Para ello vamos al menu Tree, y hacemos doble click en «Functions».

Presionamos entonces el Boton «+» como muestra la siguiente imagen.

En nombre de funcion ponemos: cant_pppoe_clients
En descripción: cantidad simultanea de clientes PPPoE .
Y en codigo:

array_size(oid_column(«iso.org.dod.internet.private.enterprises.mikrotik.mikrotikExperimentalModule.mtXRouterOs.mtxrQueues.mtxrQueueSimpleTable.mtxrQueueSimpleEntry.mtxrQueueSimpleName»))-8

Nota: Este Codigo cuenta la cantidad  de queues simples. En mi caso tengo justo 8 queues simples que agregue manualmente. Entonces como solo me interesa contar los Queues dinamicos, simplemente al final le resto 8. Es por eso el «-8» al final del codigo. Si no tienes queues manuales reemplaza por cero.

Ahora que tenemos la Función creada, vamos de nuevo al menu Tree, y hacemos doble click en «Probes», como muestra a continuacion.

Luego presionar el boton «+» que se marca en rojo.

Completamos con estos datos:
Nombre: pppoe_probe
Tips: Function
Agente: por defecto
Disponible: cant_pppoe_clients()
Error: if(cant_pppoe_clients(),»»,»»)
Valor: cant_pppoe_clients()
Unidad: Clientes

En el menu Tree, doble click en «Local» para ir al diagrama de Red.

Click derecho en el dispositivo PPPoE, y en el menu contextual click en «Configuraciones».

Click en la pestaña «Servicios» y luego en el boton «+» remarcado en rojo.

Donde dice Prueba: elegir «pppoe_probe». Y presionar OK

Deberia quedar asi. Presionamos de nuevo en OK.

Click con boton derecho sobre el Dispositivo PPPoE, y click en apariencia.

Finalmente editamos la «Etiqueta», y agregamos

[cant_pppoe_clients()] clientes conectados

Finalizamos presionando OK.
Eso es todo!!. 🙂 despues de 2 segundos aparece el contador.
Recuerda que tienes que tener el SNMP habilitado en tu Mikrotik para poder leer el OID. Saludos
_____________________
Nicolas Tech-nico.com

Galeria de Fotos Flash II con Comentarios

Por suerte la Galeria de Fotos en Flash y PHP (con thumbs GD) y lectura de folders tubo mucha aceptación; así que aquí va la «Versión del Galery en flash con comentarios» tipo fotolog 😀

Como varios me lo han pedido, aqui esta la version del galery en flash con comentarios.
El sistema de comentarios se basa en 1 solo archivo PHP llamado guestBook.php que se conecta a la base de datos e interactua con flash como gateway para postar comentarios o leerlos.
Tiene filtro de malas palabras, y para el que quiere tambien puede habilitar las lineas para que te avise por mail que alguien posteo un comment.
Con respecto a la base de datos: Esta hecho para mysql, y consiste de tan solo una sola tablita.
CREATE TABLE `fotolog` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` CHAR( 200 ) NOT NULL ,
`nombrefoto` CHAR( 200 ) NOT NULL ,
`email` VARCHAR( 200 ) NULL ,
`comments` LONGTEXT NULL ,
`time` TIME NULL
) ENGINE = innodb COMMENT = ‘comentarios galery comment’;
El funcionamiento es sencillo pero poco robusto 😛
Como las fotos no estan en la base de datos; tome en cuenta el nombre de la foto como ID, por lo tanto hay que tener mucho cuidado con los nombres de fotos duplicados.
Ademas; como no hay ningun Admin para administrar la galeria o comentarios, si eliminamos una foto por FTP el comentario «no se elimina», entonces van quedan registros perdidos en la tabla de la base de datos.
Con una galeria que no tenga demaciado movimiento no va a haber problema (como fue en mi caso), pero si hay mucho trafico de fotos que se suben y se eliminan podria aparecer comentarios huerfanos.
Configuracion:
Abrir archivo guestBook.php y modificar las lineas siguientes por las de tu base de datos.
$DBhost = «localhost»;   // servidor
$DBuser = «root»;            // usuario
$DBpass = «»;            // clave
$DBName = «fotolog»;            // nombre base de datos
$table = «fotolog»;             // nombre tabla base de datos
$numComments = 5;       // cantidad de comentarios por pagina.
To DO // Para hacer
Lo ideal seria armar un mini admin que muestre las fotos y te permita eliminar la foto con el comentario relacionado.
Agregando un campito mas de «activate» podriamos mostrar los comentarios que solo esten aprobados.
Modificar BadWords desde el admin.
Agregar filtros de metacaracteres para evitar el sql injection.
Descargar Fla Modificado y guestBook.php

El sistema de comentarios se basa en 1 solo archivo PHP llamado guestBook.php que se conecta a la base de datos e interactua con flash como gateway para postear comentarios o leerlos.

galery_commentTiene filtro de malas palabras, y para el que quiere también puede habilitar las lineas para envié por mail un aviso en caso de que haya comentarios nuevos.

Con respecto a la base de datos:  Esta hecho para mysql, y consiste de tan solo una sola tablita.

CREATE TABLE `fotolog` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`name` CHAR( 200 ) NOT NULL ,
`nombrefoto` CHAR( 200 ) NOT NULL ,
`email` VARCHAR( 200 ) NULL ,
`comments` LONGTEXT NULL ,
`time` TIME NULL
) ENGINE = innodb COMMENT = ‘comentarios galery comment’;

El funcionamiento es sencillo pero poco robusto 😛

Como las fotos no están en la base de datos; tome en cuenta el nombre de la foto como ID, por lo tanto hay que tener mucho cuidado con los nombres de fotos duplicadas.
Ademas, como no hay ningún Admin para administrar la galería o comentarios, si eliminamos una foto por FTP, el comentario «no se elimina», entonces van quedan registros perdidos en la tabla de la base de datos.
Con una galeria que no tenga demaciado movimiento no va a haber problema (como fue en mi caso), pero si hay mucho trafico de fotos que se suben y se eliminan podria aparecer comentarios huerfanos.

Configuracion:

Abrir archivo guestBook.php y modificar las lineas siguientes por las de tu base de datos.

$DBhost = «localhost»;   // servidor
$DBuser = «root»;            // usuario
$DBpass = «»;            // clave
$DBName = «fotolog»;            // nombre base de datos
$table = «fotolog»;             // nombre tabla base de datos
$numComments = 5;       // cantidad de comentarios por pagina.

To DO // Para hacer

  • Lo ideal seria armar un mini admin que muestre las fotos y te permita eliminar la foto con el comentario relacionado.
  • Agregando un campito mas de «activate» podriamos mostrar los comentarios que solo esten aprobados.
  • Modificar BadWords desde el admin.
  • Agregar filtros de metacaracteres para evitar el sql injection.

Descargar Fla Modificado y guestBook.php

________________
tech-nico.com/blog

Micro Sitio dinamico en Ajax + XML (sin base de datos)

Quiero compartir con todos ustedes, un mini sitio que diagrame hace un tiempo en el que necesitaba algo «dinámico» y tenia la restricción de no poder usar base de datos mysql.

El micro sitio esta desarrollado en PHP, y el Maquetado XHTML/CSS estan diagramados de forma limpia y accesible para todos los navegadores.
Los contenidos están en archivos XML. Esta pensado para mostrar listados de Links en columnas. Pero con algunos conocimientos de programación podes modificarlo a tu gusto y antojo.

Como ventajas:

  • es bonito y liviano
  • muy facil de modificar.
  • no usa base de datos

Desventajas:

  • Muy estructurado en el diseño.
  • No tiene CMS ni editor WYSIWYG.
  • No es practica la forma de presentar los contenidos.

El Home del sitio se ve asi:
sitio_inicio

Configuración:
1) abrir js/core.js
editar_core
2) modificar las lineas 4 y 5

Atención: Por defecto esta configurado para levantar inicialmente la sección id «inicio». Esto lo pueden modificar mas abajo en la linea 130 donde dice «section?=inicio».

Para agregar solapas o modificarlas:
1) Abrir archivo index.php
2) Duplicar las zonas seleccionadas en A y B (ver imagen Click para agrandar).
add_layers

3) Estan marcados con círculos Rojos las zonas que deben modificar con el ID «3» en el caso de los círculos. Solo basta con incrementarle el numero. Ejemplo reemplazar 3 por 4 o cualquier otro Nº que no se repita. Abajo dentro de «div_content» también va el mismo Nº.
«Servicios» también esta seleccionado, para que vean que este es el nombre de la sección a levantar. Si la sección se llama «About Us» iría: ?section=about. Tienen que usarse solo palabras resumidas, ya que esta palabra también se usa para armar la URL permanente de la sección cargada con ajax.  Ejemplo: www.tech-nico.com/#about. Algo realmente útil y que por lo general es un problema en Ajax.  :p

4) Abrir callbacks.php y agregar en el Select Case la llamada para la nueva solapa. Duplicar cualquiera de los casos del select o switch, que van desde «case ‘xx’: …. hasta break; » y lo modificamos para que quede asi:

case ‘about’: ?>
<script type=»text/javascript»>
actualizarPestanas(4);__exec_command(‘content/about.htm’,’pest4′,’Acerca de’);
</script>
<?php break;
Funciones de callbacks.php
actualizarPestanas(id): Esta funcion oculta todos los divs contents y muestra solo el que tiene el ID que pasamos como parametro. Param id{es el id que le dimos en el paso 3}
__exec_command(url, div_pestaña, titulo): Ejecuta por medio de Ajax la «url» y la muestra en «div_pestaña» y finalmente
modifica el titulo de la pagina por el que le proporcionemos. Aqui pueden levantar URL’s estaticas o dinamicas. Miren el codigo que esta facil de entender.
Contenido:
Todo el contenido del sitio esta dentro de la carpeta «content». Y sea estatico o dinamico.
Estoy seguro de que se puede mejorar muchisimo. De hecho se podrian validar varias cosas con expressiones regulares pero eso que lo haga cada uno por su cuenta. Pense en armar un mini admin para poder cargar XML’s pero por cuestiones de tiempo se complica. De todos modos esta bueno para esos proyectos que necesitan arrancar con algo sencillo. Quizas este sea el esqueleto base.
Espero que les guste y sirva. Cualquier duda sera respondida por aqui.
Nicolas
blog tech-nico.com

case ‘about’: ?>
<script type=»text/javascript»>
actualizarPestanas(4); __exec_command(‘content/about.htm’,’pest4′,’Acerca de’);</script> <?php break;

Funciones de callbacks.php

actualizarPestanas(id): Esta funcion oculta todos los divs contents y muestra solo el que tiene el ID que pasamos como parametro. Param id{es el id que le dimos en el paso 3}

__exec_command(url, div_pestaña, titulo): Ejecuta por medio de Ajax la «url» y la muestra en «div_pestaña» y finalmente modifica el titulo de la pagina por el que le proporcionemos. Aquí pueden levantar URL’s estáticas o dinámicas. Miren el código que esta fácil de entender.

Contenido:
Todo el contenido del sitio esta dentro de la carpeta «content». Y sea estático o dinámico.

Estoy seguro que se puede mejorar muchísimo. De hecho se podrían validar varias cosas con expresiones regulares pero eso que lo haga cada uno. Pensé en armar un mini admin para poder cargar XML’s pero por cuestiones de tiempo se complica. De todos modos esta bueno para esos proyectos que necesitan arrancar con algo sencillo. Quizás este sea el esqueleto base.

Espero que les guste y sirva. Cualquier duda sera respondida por aquí.

descargar el codigo

Nicolas

blog tech-nico.com

Limpiemos internet entre todos: Proyecto bogon server

Les había prometido escribir sobre el proyecto bogon que esta dando excelentes resultados para todos los que administramos redes o pertenecen a WISP. El proyecto es “totalmente gratuito” para los que se sumen y no requiere de recursos de hardware ni licencias especiales. Solo un Mikrotik ( en mi caso ) y algunas configuraciones de BGP. (Aquí solo voy a contarles algunos rasgos generales del proyecto para que mas o menos entiendan como funciona y de que se trata). Para mas detalles pueden acceder a Capaocho.net que hay un how to muy bien explicadito.

En ISPARG (Foro hispano sobre Mikrotik moderado por Maxi Dobladez) fue donde di conocimientos a este proyecto que Ariel Weher y Pablo Lucchetti embarcaron. Mas abajo un reportaje con Ariel nos cuenta como fue que iniciaron.

El «Proyecto Bogon Server» consiste en la configuración de nuestros Servidores*, mediante BGP, para conseguir finalmente el filtro de trafico.

*Los servidores que entran en el proyecto pueden ser:

  • Cisco IOS.
  • Mikrotik RouterOS.
  • GNU/Linux Zebra/Quagga.
  • GNU/Linux + IPTables.
  • BSD/Solaris/Otro UNIX.
  • Vyatta.
  • Huawei OS.
  • Juniper JunOS.
  • Force 10.
  • Otros.

Definiendo Bogon: En términos muy amigables seria todo aquel trafico proveniente de Internet o originado desde nuestros propios clientes hacia intente. Este trafico «basura» se origina en la mayoría de los casos desde rangos de IP que no fueron asignados o delegados por ningún organismo de Registro Regional de Internet (RIR’s). Las RIR’s se encargan de administrar / asignar los rangos IP o pools de IP para todas las empresas u organismos de modo que no hayan numeraciones repetidas.

¿Por qué es importante filtrar los Bogons?

Según el conocimiento popular, se sabe que si se usa la conexión de un ISP para realizar tareas malintencionadas tales como hacer SPAM, escanear puertos, hacer ataques de denegación de servicio, etc., las autoridades pueden identificarme porque saben concretamente que esa IP desde donde realicé el ataque pertenece a un único ISP (o sistema autónomo).Entonces podrían rastrearme obligando al ISP a dar los datos del cliente que tenía esa IP en el momento del ataque, generalmente mediante acciones legales.

Ahora bien, como se sabe que los rangos IP publicados en el BOGON aún no son de nadie, contando con la infraestructura necesaria pueden adueñarse temporalmente de un rango libre, realizar el ataque y luego liberarlo, haciendo más difícil el rastreo (aunque no imposible).

Esto es debido a la negligencia de los mayoristas que no se fijan en las redes que publican sus clientes, pero eso es una cuestión más avanzada de BGP que por ahora no nos interesa.

Actualmente debemos saber que mientras más empresas dispongamos de filtros de Bogon, más dificil va a ser enviar basura a estos agresores que ganan millones a cuesta de nuestros servicios.

La práctica de filtrado trae como consecuencia en que vamos a disminuír la cantidad de ancho de banda gastado en “basura”, vamos a entregar un enlace a internet más “limpio” a nuestros abonados y vamos a asegurar que nuestro servicio no cause molestias al resto de internet.

Actualizacion automatica de listas BOGON:

Team Cymu es una organización sin fines de lucro encargada de enviar las listas actualizadas de bogons.
El problema es que para hacer contacto directo con ellos e incluso lograr las configuraciones se necesita no solo hablar ingles sino además cumplir con varios requisitos. Al parecer con Mikrotik se terminan las complicaciones.

Reportaje a Ariel Weher:

tech-nico: ¿Hace cuanto tiempo comenzaron con el proyecto?.

Ariel Weher:
Allá por mayo de 2008 dicte un mini cursito de BGP en el curso avanzado de mikrotik y les prometí que iba a pasarles alguna configuración de BGP que sirva para algo útil.

El Team Cymru viene con este proyecto Bogons desde hace rato, el tema es que en el momento del inicio del proyecto los requerimientos para que te conectes con ellos eran medios elevados; y yo vi que con Mikrotik era posible hacerlo bastante fácil, entonces nos pareció mas fácil conectarnos nosotros con todos nuestros equipos al cymru y desde ahí redistribuir a todos los pequeños ISP que usan mikrotik y que ellos lidien directamente con nosotros.

Yo particularmente hace varios años que estoy tratando de generar algún tipo de concientización entre los ISP, porque hoy nadie le da bola a la seguridad y a no tirar basura hacia Internet. Este proyecto Bogon, digamos que era el pie de entrada para después profundizar con otros temas mas complejos y eficaces.

tech-nico:
Esto debe ocupar mucho de tu valioso tiempo y ustedes lo hacen con la mejor onda y free. ¿No ven esto a futuro como un negocio?.

Ariel Weher:
Llevó bastante tiempo sobre todo la etapa de pruebas.
No, el negocio es que a la larga, cuando todos se sumen a mi me va a llegar menos basura. Por ende, el mega de Internet (que es caro) va a ser un mega mas limpio, lo que implica multiplexarlo mas y al fin de cuentas es mas dinero.

¿Alguna duda?

Si, “Es Gratuito!!!” podes aportar muchísimo:

  • No solo limpiar tu trafico basura, sino también el de todos nosotros. Una vez en funcionamiento, recibirás de forma automática la lista de Bogons y dependiendo del Sistema Operativo que uses, se vera como eliminar el trafico en tu caso. ( En el caso del Mikrotik RouterOS, los bogons tienen asignado un gateway falso entonces routean por dicho gateway y mueren).
  • También se puede participar como colaborador en el proyecto brindando acceso a tus routers para que el resto acceda como vos lo haces con ellos.

Me quiero sumar al proyecto, ¿cuales son los pasos a seguir?

1) Ingresamos a capaocho.net

2) En la derecha buscamos “Súmate Ya”

3) Llegamos al formulario de adhesión. Solo completamos todos los datos que nos pide.
4) Esperamos!. Ariel o Pablo se pondrán en contacto para pasarte las configuraciones.

Espero que todos tomemos conciencia de lo importante que seria si todos tenemos nuestro ancho de banda correctamente filtrado y limpio. 🙂 Vamos!! Ayudemos!!!

_____________________

Nicolás
tech-nico.com/blog

Galeria de Fotos en Flash y PHP (con thumbs GD) y lectura de folders.

Hace mucho tiempo tuve que crear una galería de fotos en flash y PHP ( que me saco de muchos apuros ).

Lo particularmente bueno de esta galería es que levanta las fotos on the fly desde carpetas del servidor que creemos o ya estén creadas. Entonces el cliente mismo puede generar galerías de fotos simplemente creando carpetas por FTP y haciendo copy paste de las imágenes que desea subir. Algo muy practico y sencillo para los clientes no entendidos.
Mi propósito principal fue evitar que alguien tenga que editar un FLA… o un XML o mas engorroso aun tener que armar un admin con upload para el manejo de la galería.

Características de la galería:

  • Usa Flash para precarga de fotos.
  • Lee varias carpetas de fotos.
  • Paginación de fotos (20 x página).
  • Librería GD de php para generar los thumbs con cacheo para agilizar la carga.
  • No usa base de datos ni XML.
  • Fácil configuración y mantenimiento.

Dentro de la carpeta «galery» debe haber 5 archivos y 1 carpeta llamada «images». Se recomienda no cambiar el nombre de la carpeta. (De lo contrario la galería no funciona).

galery_tech_nico.fla
Archivo editable de Flash contenedor de la galería de fotos.

galery_tech_nico.swf
Este archivo es la galería de fotos compilada y lista para embeber en tu web.

folderImages.php
Recibe como parámetro un string («nombre de carpeta») y recorre en el servidor las imágenes que esta contenga. Finalmente devuelve sus rutas a flash.

folders.php
Recorre todo el directorio «images» y devuelve a flash los nombres, rutas, tamaño de cada una de las fotos y además la cantidad de fotos por directorio.

thumb.php
Recibe varios parámetros como alto, ancho, etc. y devuelve la imagen resampleada para generar los thumbnail de la galería.

INSTALACION:
1) Editar archivo galery_tech_nico.fla.
Escribe el nombre de tu dominio

2) Editar folderImages.php y folders.php.

Esta versión también tenia para postear comentarios en las fotos. Pero esa parte usa una base de datos MySQL así que verán que en el archivo de flash esta comentado. (Si alguien los necesita subo los archivos.).
Se que tiene muchas cosas por mejorar, pero ya cumplió su ciclo :P.

GALERIA CON COMENTARIOS:
http://www.tech-nico.com/blog/galeria-de-fotos-flash-con-comentarios-php/

descargar galery

Nicolas
______________________
www.tech-nico.com/blog

Notebook Dell Studio 15, una muy buena elección

Después de 1 mes sin aparecer por aquí; me decidí por escribir un poquitito sobre una nueva adquisición como para entrar en ritmo de nuevo.

Hace aproximadamente 1 mes, me llego la Studio 15, el laptop se caracteriza básicamente por su diseño exterior, que es 1 de los 4 diseños que pude elegir en el momento de la compra: En mi caso, es especie de dibujo abstracto como si estaría aerografiado sobre la tapa . Este diseño fue bautizado por ellos como “Algas Marinas”. Lo bueno de esto es que no solo compramos un diseño bonito, sino que estamos aportando un granito de arena para la campaña de HIV de África.

Caracteristicas tecnicas Generales:

Procesador: Intel® Pentium® T3200 (2.0GHz/667Mhz FSB/1MB cache)
Color: Algas Marinas
Memoria RAM: 3GB de Memoria Doble Canal Compartido DDR2 a 800MHz
Teclado: Spanish Back-lit Keyboard
Pantalla LCD: Pantalla Amplia Brillante de 15.4″ WLED (1280×800)
Video: Acelerador de Medios Gráficos Intel 4500MHD
Disco Rigido: Disco Duro SATA de 160GB (5400RPM)
Combo or DVD+RW Drive     8X Slot Load CD / DVD Burner (Dual Layer DVD+/-R Drive)
Sonido: High Definition Audio 2.0
Red Inalámbrica: Tarjeta Inalámbrica Dell 1397 802.11g Half Mini-Card
Camara: Cámara Integrada de 2.0M Pixeles
Bluetooth: Dell Bluetooth 370 Interno (2.1)
Batería Principal de Ión de Litio de 6 celdas [56 Watt-Horas]
3 años de garanía

En el proximo post voy a dar detalles de sus pro y sus contra, como tambien algunas sorpresitas interesantes.

__________________
Nicolas.!
Blog Tech-nico.com

Atacaron forosdelweb.com y maestrosdelweb.com

Cvander(Christian Van Der Henst): creador de estos renombrados sitios webs fue victima de un ataque en sus correos. (Muchos comentan que se trataria de alguien muy cercano a su entorno).

forosdelweb.com y maestrosdelweb.com (los foros hispanos con mas trayectoria), quedaron desde ayer fuera de linea, «en mantenimiento». Hoy el sitio muestra un banner publicitario hacia otro sitio web (¿del atacante?).

Robo de identidad:
Primero accedieron a su cuenta de correo, y desde allí comenzaron a acceder en cascada a todo lo que encontraron en su camino: Hosting godaddy, Facebook, Twitter de cvander. Posteriormente consiguieron acceso a su gmail.

El soporte técnico del Hosting godaddy.com se rehusó a ayudarlo. (Como si estarían involucrados en algo).

Para los que quieran dar una mano, tan solo enviando un mail o llenando un formulario, son solo 5 minutos para colaborar con alguien que quizás podrías haber sido vos. Voy a hacer hincapié en lo mismo que pide cristalab.com, que me parece genial.

  1. Dejarle claro acá a la gente de GoDaddy que deben devolver los dominios a Christian.
  2. Mandar un correo a la gente de GoDaddy pidiendo el retorno del dominio.
  3. Hacer ruido de esto.

Recuerda siempre:
1)  En proyectos grandes nunca usar hostings con acceso por panel de control publico.
2)  Nunca uses las mismas contraseñas en ningun lado.
3)  No agrupes todas tus contraseñas en 1 sola cuenta de correo.

_______________
Nicolas: Tech-nico.com

Me llego la remera de Ubiquiti :) de Taiwan

Hace un tiempo la gente de Ubiquiti comenzo a regalar remeras a los que participaban del foro; asi que me registre y me sente a esperar si en verdad enviarian mi remera hasta Argentina 🙂  y aca esta el sobre y la remera para que vean como llega.  Demoro aprox 2 meses.

1 2 3 4.. espectaculo.!.

_______________
Nicolas: Tech-nico.com

Telefónica dejó sin servicio durante 6hs a miles de personas en la capital pampeana

Tanto los usuarios de Speedy como los clientes de la CPENet ( Cooperativa Popular de Electricidad)  de Santa Rosa quedaron ayer a la deriva, y sin ningun tipo de respuestas por parte del soporte tecnico. Tambien quedaron afectados los clientes de Movistar. Pueden leer la notica completa en el diario La Arena.

El corte de un enlace que provee la conectividad del servicio de internet a los usuarios de la Cooperativa Popular de Electricidad, dejó ayer a sin esta prestación a miles de usuarios. Ha sido la interrupción más grave hasta el momento, por lo prolongado en el tiempo y la cantidad de personas afectadas.
El corte de internet comenzó sobre las 15.00 horas y recién empezó a normalizarse cerca de las 22.00. Durante todas esas horas, los miles de usuarios se quedaron con un servicio que se ha convertido en indispensable para muchas empresas, y una rutina para miles de abonados…

http://www.laarena.com.ar/la_ciudad-un_colapso_de_internet_afecto_a_toda_la_provincia-28792-115.html

Nicolas Tech-Nico.com

Embeber Objetos Audio y Video con Ajax usando swfobject

Algo realmente curioso e interesante es ver que el wp-standalone-player utiliza la
funcion Javascript para embeber Objetos Flash usando DOM creado por «Geoff Stearns, Michael Williams, y Bobby van der Sluis»
Casualmente es muy util para los que quieran embeber Objetos Flash mediante AJAX.
Es un problema muy tipico el querer embeber video de youtube y que el innerHTML no funcione. (Sinceramente da muchos dolores de cabeza).
Pero con este pequeño include llamado player.js de tan solo 11kb solucionamos todos nuestros problemas y podemos embeber indistintamente Objetos Flash (SWF) Locales, como URL de Objetos, como es el caso de los videos de Youtube.

Vamos a aclarar que salio una version de «WordPress Audio Player» version standalone. Por lo tanto podemos customizarla y usarla en cualquiera de nuestros sitios webs (aunque no tengan WP instalado).

Entonces hasta aca tenemos:
– Funcion JS para embeber objetos flash con DOM de 11 Kb.
– Reproductor de audio WordPress Audio Player (Standalone)
– Y una funcion para incluir Objetos Flash (mas especificamente Videos Youtube)

Aqui abajo les muestro como implementarlo:

<!– HEADER –>
<script src=»player/player.js» type=»text/javascript»></script>

<script type=»text/javascript»>  
 // VIDEO DE YOUTUBE
 function show_video(element_descripcion, video_objeto, video_descripcion){
     var div_element_descrip = document.getElementById(element_descripcion); 
     audioplayer_swfobject.embedSWF(video_objeto, «main_video», «295», «237», «9.0.0»);
     div_element_descrip.innerHTML = video_descripcion;
 }

 // WP_STANDALONE_PLAYER ( la siguiente linea, invoca el audioPlayer )
       
AudioPlayer.setup(«
http://<?php echo $tudominio; ?>/player/player.swf», {  
                width: 290  
        });   
</script>

 Son 2 funciones totalmente distintas; la primera, show_video( ), es la que usaremos para embeber video.  Y AudioPlayer.setup( ), es la que invoca al reproductor de audio. Lo que tienen en comun, es que ambas funciones utilizan el mismo Include player.js con el que embeben los tags usando DOM.

En el Body:

<!– BODY –>
 <!– audio player –>
<p id=»audioplayer_1″>Alternative content</p>  
<script type=»text/javascript»> 
                 AudioPlayer.embed(«audioplayer_1», {soundFile: «
http://<?php echo $tudominio;?>/<?php echo $ruta_de_tu_audio .’/’. $nombre_archivo; ?>»,transparentpagebg: «yes»,titles: «descripcion del audio»});   
</script>
                                   

 <!– video player –>
<script type=»text/javascript»> 
          show_video(‘video_descripcion’, ‘http://www.youtube.com/v/codigovideo’,  ‘la descripcion del video desde la base de datos’);
</script>
 <div id=»main_video»></div>
 <div id=»video_descripcion»></div>
 

Multiples Instancias:

Los contenedores para cada reproductor son los que estab en negrita.
Para agregar multiples reproductores de audio, solo basta con cambiar el ID del contenedor y duplicar el codigo. Para el caso del reproductor de video habria que hacer unas minimas modificaciones en la funcion show_video( ), y pasandole como parametro el identificador del DIV podriamos tener multiples reproductores de video.

Bien!. veran que es muy facil!!!

UN TIP > USAR YOUTUBE COMO SERVIDOR DE VIDEO STREAM:
Esto es para los que ahorramos ancho de banda. (Hoy en dia los que tienen reproductores de video propios insertados en su sitio web, estimo que es porque el sitio les da mucha ganancia)  🙂
Lo que yo hice fue guardar toda las rutas de los videos de youtube en mi base de datos. Para ello, se me presento un inconveniente; las URL’s de los videos son diferentes a la URL de publicacion que estan en los tags.. se entiende?.

Ejemplo: esta es la URL del video que esta en la barra de direcciones del navegador, http://www.youtube.com/watch?v=Mxo9D_aTrx4. (Esta URL NO FUNCIONA!).
pero si miramos la URL del objeto a insertar:

<object width="425" height="344"><param name="movie" value="
http://www.youtube.com/v/G8whC4Me8d4&hl=en&fs=1«></param> <param name=»allowFullScreen» value=»true»></param><param name=»allowscriptaccess» value=»always»></param> <embed src=»http://www.youtube.com/v/G8whC4Me8d4&hl=en&fs=1» type=»application/x-shockwave-flash» allowscriptaccess=»always» allowfullscreen=»true» width=»425″ height=»344″></embed></object>

Ja, si!  es totalmente distinta; en mi caso, necesitaba guardar solo la URL en el campo de la Base de datos, entonces lo que hice fue armar una expresion regular que me devuelva la URL del video de forma limpia.

function validate_youtube(text_element) {
if (text_element.value != ""){
var matches = "";
var expression = /((http:\/\/)|(www\.[^ \[\]\(\)\n\r\t]+)|(([012]?[0-9]{1,2}\.){3}[012]?[0-9]{1,2})\/)([^ \[\]\(\),;\"'<>\n\r\t]+)([^\. \[\]\(\),;\"'<>\n\r\t])|(([012]?[0-9]{1,2}\.){3}[012]?[0-9]{1,2})/gi;
var rx = new RegExp(expression);
var str = text_element.value;
matches = str.match(rx);
text_element.value=matches[0];
}
}

La podes agregar en el textfield con el evento onChange, entonces cuando hagas «Copy/Paste» del codigo <object…/object> en el textbox de tu CMS, obtendras la URL on the fly.

Esto ultimo tambien podria hacerce mucho mejor con el API de google para Youtube, y se podrian obtener hasta los comentarios de los videos (estuve viendo el codigo y no es para nada dificil). Pero yo necesitaba una solucion sencilla y rapida, asi que dejamos el API para el Upgrade del sitio.

descargar archivos

Nicolas. tech-nico.com/blog

Duplicar ancho de banda en horario nocturno con Mikrotik

Todos los que estamos trabajando como WISP sabemos que si hay algo que es sumamente valioso «es nuestro ancho de banda». El Mb para empresas pequeñas termina siendo muy caro y se pone dificil remar contra las telco.

La idea de este post: crear un script para aprovechar al maximo todo nuestro ancho de banda; ya que durante la noche queda casi sin uso, y nosotros lo estamos pagando!!!.

Escenario: PPPoE con Queues Dinamicas asignando a los clientes 128k y 256k respectivamente (de acuerdo al plan que tenga contratado) los cuales pasan a ser 256k y 512k entre las 00:45 y las 7:00 am.

El Script recorre las queue simples y cambia el max-limit. Se acpetan sugerencias y comentarios.


#subo128a256
:foreach i in=[/queue simple find] do={
:if ([:find [/queue simple get $i max-limit] "128000/128000"] = 0) do={
/queue simple set $i max-limit= "257000/257000";
}
}


#bajo256a128
:foreach i in=[/queue simple find] do={
:if ([:find [/queue simple get $i max-limit] "257000/257000"] = 0) do={
/queue simple set $i max-limit= "128000/128000";
}
}

Finalmente se cargan en el Scheduler y lo pueden configurar para que corra luego de la medianoche cada 1 hora hasta las 7 de la mañana. Digo cada 1 hora porque el script recorre los queues simple de los usuarios que estan conectados en ese momento (en que corrio el script), entonces si algun cliente conecta despues de que paso nuestro script, ese queda sin «doble velocidad», por eso es recomendable ejecutarlo cada 1 hora.

Este es nuestro resultado. (En este caso el Script duplica en un plan de 256k).

Algo muy facil de hacer; y los clientes no solo quedan conformes, si no que aumentan las ventas. 😉