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/.
___________________

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

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! :D

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

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

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