lunes, 30 de diciembre de 2013

Dansguardian Console Manager ncurses Version (Beta)

Después de estar tocando cosas aquí y allá con mi primera versión de dansguardiancm y ver lo incomodo que resultaba trabajar con él, decidí crear otra versión un poco mas seria y un poco mas elaborada, esta ves escrita en C++ apoyandome en las librerias ncurses, la nueva versión es mucho mas amigable y mucho mas facil de expandir sus funcionalidades ya que se cuidaron bastantes aspectos es la programación estructurada (si, si ya se que debo hacerlo en POO pero eso será para futuras versiones) que no es lo mejor pero por algo se empieza (recuerden no soy desarrollador) asi que al igual que en la versión anterior lo cargue a sourceforge allí encontraran la wiki y demas puntos a considerar.

Sobra decir que espero sus comentarios a fines de hacer mejor la herramienta y claro desempolvar c++ ya que hacía años que no hacía algo minimamente serio :)

Dansguardiancm ncurses version

viernes, 6 de septiembre de 2013

Agregar alias y enmascarar dominio en Zimbra

Esta ves les comento la situación que se presento  con un cliente el cual decidió cambiar su dominio de .com a .net, como ya sabrán cambiar el dominio principal en zimbra no es cosa que sea facil por no decir que imposible a cambio de intentar una tarea suicida lo que optamos fue por crear un alias y enmascarar el correo de salida como lo haría cualquier buen samaritano, para el ejemplo vamos a utilizar los dominios "dominioexistente.com" y "dominioalias.net".

Ahora vamos a proceder con los pasos:

1) Realizar los ajustes acordes necesarios en el DNS, ajustes tales como registros MX, PTR (este es con su isp) y registros spf

2) Asegurarse de realizar un backup, nunca esta demás hacerlo y te puede sacar de un apuro en caso que los dedos te traicionen al momento de teclear algún comando.

3) Ahora como usuario zimbra ejecutamos el siguiente comando: "zmprov createAliasDomain dominioalias.net dominioexistente.com zimbraMailCatchAllForwardingAddress @dominioexistente.com" en este punto ya tenemos creado el alias es decir que todos los emails que lleguen a dominioalias.net serán redirigidos a  dominioexistente.com.

4) Una ves creado el alias ahora debemos enmascarar el correo saliente, es decir que todos los correos salientes no se envíen con @dominioexistente.com si no dominioalias.net esto lo hacemos con el siguiente comando: "zmprov md dominioexistente.com zimbraMailCatchAllAddress @dominioexistente.com zimbraMailCatchAllCanonicalAddress @dominioalias.net".

5) Hacer pruebas de envío y recepción de correo

En caso que se quiera eliminar el enmascaramiento sencillamente se ejecuta el mismo comando con el que se agrego pero anteponiendo el menos a la opción del enmascaramiento, esto de la siguiente forma: "zmprov md dominioexistente.com zimbraMailCatchAllAddress @dominioexistente.com -zimbraMailCatchAllCanonicalAddress @dominioalias.net"

Esto sería todo en esta ocasión, espero que sea de ayuda a alguien y como siempre las criticas o preguntas son bienvenidas.

martes, 13 de agosto de 2013

fedora 18 - mouse bloqueado al inicio / mouse blocked when start

Bueno esta ves el detalle esta con el mouse y fedora 18 (fedora 19 con hw ati vaya que se lleva mal), el inconveniente se esta presentando a la hora del arranque, el sistema inicia correctamente pero despues de uno o dos minutos el touchpad comienza a fallar y se bloquea por unos minutos hasta que vuelve a reaccionar, esto claramente es un dolor de cabeza que no e  podido solucionar y no se si culpar a los drivers propietarios de ati (seguramente que si) o como tal un bug del f18.

El tema se me ocurrió "y que pasa si a nivel de kernel desconecto el mouse y lo vuelvo a conectar" a pues vaya trabajo para hacer esto, pues aquí esta lo que hice para poder desbloquear el mouse en caso de que se quede bloqueado.

echo -n "serio1" | tee /sys/bus/serio/drivers/psmouse/unbind

ojo que serio1 debe existir dentro del directorio /sys/bus/serio/drivers/psmouse/ de lo contrario no va a funcionar, aquí la muestra de como luce el directorio.

ls -la /sys/bus/serio/drivers/psmouse/
total 0
drwxr-xr-x. 2 root root    0 ago 13 09:00 .
drwxr-xr-x. 4 root root    0 ago 13 09:00 ..
--w-------. 1 root root 4096 ago 13 09:11 bind
-rw-r--r--. 1 root root 4096 ago 13 09:10 bind_mode
-r--r--r--. 1 root root 4096 ago 13 09:10 description
lrwxrwxrwx. 1 root root    0 ago 13 09:10 module -> ../../../../module/psmouse
lrwxrwxrwx. 1 root root    0 ago 13 10:55 serio1 -> ../../../../devices/platform/i8042/serio1
--w-------. 1 root root 4096 ago 13 09:00 uevent
--w-------. 1 root root 4096 ago 13 09:35 unbind


si solo ejecutamos el comando ya mencionado el kernel se encargara de reactivarlo y listo el mouse volverá a estar funcional.

En caso que se desactive el tapclik y el vertscroll pueden utilizar los siguientes comandos desde el usuario de trabajo.

synclient TapButton1=1
synclient VertEdgeScroll=1

Bueno eso es todo por el momento hasta el momento en que encuentre cual es la raiz del problema.

Hasta la próxima.

domingo, 12 de mayo de 2013

Dansguardian console manager

Bueno, despues de mucho tiempo de no publicar nada en mi blog y ver que ya era necesario de agregar algo, pues aquí esta.

dansguardiancm (dansguardian console manager), ;) hasta suena bonito y todo jjeje, esto no es mas que una iniciativa propia al ver que dansguardian no cuenta con un configurador amigable y todo toca a través de los archivos de configuración (claro soluciones como ipcop, clearos, entre otros traen estas interfaces pero todas web).


A esta ves fui un poco mas lejos y subi mi script a sourceforge jejeje, espero poder ir mejorando este script con miras a que se convierta en una opción de confiar y de utilidad a la hora de manipular dansguardian desde consola.

Pues no es mas aquí dejo en enlace a la url:

https://sourceforge.net/projects/dansguardiancm

Por el momento no lo e documentado pero a grosso modo cuenta con una sección de configuración al inicio y eso es todo el script se encarga de el resto.

Saludos y pues espero criticas de cualquier tipo a fin de cuenta si es critica es constructiva ;).

martes, 4 de septiembre de 2012

Agregar Scripts al autoarranque de systemd

Hace mucho que no escribía nada por cuestiones personales y pues me coloque a revisar mi nuevo fedora 17 y vi que necesitaba agregar un script al inicio del sistema, lo lógico hubiese sido buscar /etc/rc.d/rc.local o similar /etc/rc.local pero o sorpresa este archivo ya no existe en fedora 16 y 17 , asi que decidi documentarme al respecto y en la documentación de fedora [1] nos dicen que creemos el archivo /etc/rc.d/rc.local, le demos permisos de ejecución y ya podemos utilizar normalmente ya que el sistema revisa si existe el archivo mencionado anteriormente y si existe que tenga permisos de ejecución y lo podrá utilizar. Pero la pregunta real es si hay un nuevo sistema de arranque por que seguir con los viejos métodos?, teniendo esta pregunta en la cabeza pues vamos a aprender como escribir nuestros script para que arranquen con el sistema haciendo uso de systemd.

Lo primero que debemos tener en cuenta es en donde van a quedar ubicados nuestros scripts, estos van a estar ubicados en /etc/systemd/system.
Como systemd controla otros aspectos del sistema operativo necesita un poco mas de información que no es muy compleja en sus aspectos básicos, para invocar un script necesitamos colocarlo como un demonio del sistema por lo tanto debemos escribirlo de tal forma que systemd lo entienda, lo primero que debemos tener en cuenta es el nombre del script que debe ser algo similar a esto "ejemplo.service" para una mayor información podemos ver la documentación de la nomenclatura utilizada por el sistema [2], ahora debemos crear el contenido del script, podemos tomar como ejemplo otro script que este dentro del directorio donde residen los scripts de systemd, básicamente esta compuesto de tres partes:

[Unit]
Description=Daemon of axample
After=syslog.target

En esta sección se da información básica del script, una descripción básica de la tarea que ejecuta el script y en donde va a estar ubicado en el orden de arranque.

[Service]
ExecStart=/usr/sbin/example
Type=forking

En esta sección se da la ruta en donde realmente esta el script a ejecutar y el tipo de script o demonio que va a ser para esto ver mas detalladamente la documentación de systemd
[Install]
WantedBy=multi-user.target
Y por ultimo la sección Install que nos dice en que runlevel se ejecutará en el modo multiusuario o en el clásico sysv seria el runlevel 3.

Con esto ya tenemos todo listo para agregar nuestro script al inicio del sistema, el archivo final sería algo como lo siguiente.
--------------------/etc/systemd/system/ejemplo.service-----------------------
[Unit]
Description=Daemon of axample
After=syslog.target

[Service]
ExecStart=/usr/sbin/example
Type=forking

[Install]
WantedBy=multi-user.target
----------------------------------------------
pero primero tenemos que refrescar al systemd para que lea de nuevo las configuraciones, esto lo hacemos con systemctl daemon-reload, ahora podemos probar con systemctl start ejemplo.service lo cual nos inicia el servicio (No debe mostrar errores), ahora verificamos que el servicio se este ejecutando con systemctl status ejemplo.service lo cual nos mostrará algo similar a lo siguiente:

ejemplo.service - Daemon  of example
          Loaded: loaded (/etc/systemd/system/ejemplo.service; enabled)
          Active: activating (start) since Tue, 00 Sep 2010 10:04:02 -0600; 9s xx
         Control: 23604 (lkl)
          CGroup: name=systemd:/system/ejemplo.service
                  └ 23604 /usr/sbin/example
Sep 04 22:04:02 xxx ejemplo[23604]:

Ahora podemos verificar que el servicio esta activo, lo cual solo nos queda habilitar el servicio para el autoarranque, esto lo haremos con systemctl enable ejemplo.servicey lo cual nos mostrara algo como lo siguiente:

ln -s '/etc/systemd/system/ejemplo.service' '/etc/systemd/system/multi-user.target.wants/ejemplo.service'

Finalmente tenemos listo nuestro script ejecutándose al inicio del sistema y homologado al esquema de systemd.

[1] http://docs.fedoraproject.org/es-ES/Fedora/16/html/Release_Notes/sect-Release_Notes-Changes_for_Sysadmin.html
[2] http://0pointer.de/public/systemd-man/systemd.special.html

jueves, 31 de mayo de 2012

squid NONE/417

Hoy trabajando con una de las tantas herramientas que se tiene (herramientas del gobierno que en su mayoria NO cumplen estandares) y una en especial que se llama efiquest, la cual tiene que pasar por un proxy empresarial para poder llegar a una base de datos en linea.

El problema en si era que en el log del squid mostraba:

127.0.0.1 NONE/417 886 POST http://www.rentec.com.co/rentecALic/rentecAlic.asmx - NONE/- text/html

lo cual investigando por la web me encontré con esta respuesta en una lista de correo (http://www.mail-archive.com/squid-users@squid-cache.org/msg83683.html)  en donde se recomienda utilizar la directiva  en la configuración del squid.

ignore_expect_100 ON

Y con esto termino mi pesadilla con dicha herramienta y se pudo acceder sin problemas.

martes, 27 de diciembre de 2011

Backup buzones zimbra en intervalos de fechas

Esta ves escribo para comentar como hice para hacer backups a zimbra de forma tal que solamente haga backups a un determinado rango de fechas concretamente la ultima semana teniendo en cuenta que el scritp se ejecuta en el cron.weekly.

para este caso solamente tenemos un script llamado bweek.sh el cual ubicaremos en un directorio el cual pueda ser leido y ejecutado por zimbra.

antes de todo vamos a crear en /var/tmp una carpeta para mantener los archivos de control, logs y demás archivos que genera el script, entonces seria algo como lo siguiente:
mkdir /var/tmp/zimbra ; chown -R zimbra /var/tmp/zimbra
tambien necesitamos crear y dar permisos al directorio en conde vamos a enviar las carpetas del backup para este caso lo vamos a dejar en /mnt, entonces quedaría de la siguiente forma:
mkdir /mnt/backup ; chown -R zimbra /mnt/backup


pues bien ahora tenemos el script:

##################bweek.sh############

#!/bin/bash
PLOG=/var/tmp/zimbra/copia.log

DIRC=/var/tmp/zimbra
DIRB=/mnt/backup

# rutina para la verificar si ya existe un proceso de backup.
if [ -e $DIRC/copia.lock ] ; then
  echo "$(date) ya hay un proceso de copia ejecutandose" >> $PLOG
    exit 1
        fi
        # -----------------------------------

        echo "$(date) Se inicia el proceso de copia de seguridad" >> $PLOG
        touch $DIRC/copia.lock

        if [ -e $DIRC/fecha.ctrl ] ; then
        FECHA=`cat $DIRC/fecha.ctrl`
        MESI=`cat $DIRC/datesback.ctrl | awk -F: '{print $1}'`
        DIAI=`cat $DIRC/datesback.ctrl | awk -F: '{print $2}'`
        MESF=`cat $DIRC/datesback.ctrl | awk -F: '{print $3}'`
        DIAF=`cat $DIRC/datesback.ctrl | awk -F: '{print $4}'`
        YEAR=`cat $DIRC/datesback.ctrl | awk -F: '{print $5}'`
        else
        FECHA="`date +%d%m%Y  -d '1 week ago 1 day ago'`to`date +%d%m%Y  -d 'now'`"
        DIAI=`date +%d -d '1 week ago 1 day ago' | bc`
        DIAF=`date +%d -d 'now' | bc`
        MESI=`date +%m -d '1 week ago' | bc`
        MESF=`date +%m -d 'now' | bc`
        YEAR=`date +%Y -d 'now'`
        fi

        # rutina para verificar si la carpeta ya existe si no existe la crea.
        if [ ! -e $DIRB/$FECHA ] ; then
            mkdir $DIRB/$FECHA
                /opt/zimbra/bin/zmprov -l gaa > $DIRC/users.txt
                sed -i '/spam.*\|ham.*\|virus-*\|quarantine.*\|admin/d' $DIRC/users.txt
                sed -i 's/@midominio.com.co//g' $DIRC/users.txt
        fi

cat $DIRC/users.txt | while read usuario
do
  echo "$(date) backup to $usuario" >> $PLOG #falta el filtro para tomar desde fechas el backup

  /opt/zimbra/bin/zmmailbox -z -m $usuario@midominio.com.co getRestURL -o $DIRB/$FECHA/$usuario.tgz "//?fmt=tgz&query=before:$MESF/$DIAF/$YEAR and after:$MESI/$DIAI/$YEAR" 2> $DIRC/dumperr.log

  ERR=$?
  if [ "`cat $DIRC/dumperr.log | grep 'No data found'`" == "" ] ; then
      if [ $ERR -eq 0 ] ; then
              sed -i  "/$usuario/d" $DIRC/users.txt
          echo "$(date) Finalizó correctamente" >> $PLOG
      else
          echo "$(date) error en el backup del usuario $usuario" >> $PLOG
      fi
  else
      sed -i  "/$usuario/d" $DIRC/users.txt
      echo "$(date) Finalizó, no se encontraron datos" >> $PLOG
  fi
                                                                                                                 
done
# crear rutina en caso que no haya terminado agregue una linea al cron para que automatice

if [ "`cat $DIRC/users.txt`" == "" ] ; then
    echo "$(date) El proceso de copia de seguridad termino exitosamente para todos los usuarios" >> $PLOG
        if [ -e $DIRC/fecha.ctrl ] ; then
            rm -f $DIRC/fecha.ctrl
                rm -f $DIRC/datesback.ctrl
            crontab -l > /tmp/crontabzim.tmp
            sed -i "/backup-semanal/d" /tmp/crontabzim.tmp
            crontab /tmp/crontabzim.tmp
            rm -f /tmp/crontabzim.tmp
        fi
else
        #   echo "$(date) El proceso de copia de seguridad no termino para todos los usuarios.. agregando registro a crontab y capturando la fecha de copia" >> $PLOG
        if [ ! -e $DIRC/fecha.ctrl ] ; then
                echo "$(date) El proceso de copia de seguridad no termino para todos los usuarios.. agregando registro a crontab y capturando la fecha de copia" >> $PLOG
        crontab -l > /tmp/crontabzim.tmp
        echo "*/20 * * * * $DIRC/backup-semanal.sh" >> /tmp/crontabzim.tmp
        crontab /tmp/crontabzim.tmp
        rm -f /tmp/crontabzim.tmp
        echo $FECHA >>
$DIRC/fecha.ctrl
        echo "$MESI:$DIAI:$MESF:$DIAF:$YEAR" >> $DIRC/datesback.ctrl
        else
        echo "$(date) El proceso de copia de seguridad no termino para todos los usuarios.. pero ya hay un archivo de control para continuar con el backup" >> $PLOG
        fi 
fi

rm -f $DIRC/copia.lock


############fin del script###############

Pues bien ya tenemos el script ahora vamos a comentar las partes mas importantes del script.

1) Las variables de las fechas, los días y los meses:

        FECHA="`date +%d%m%Y  -d '1 week ago 1 day ago'`to`date +%d%m%Y  -d 'now'`"
        DIAI=`date +%d -d '1 week ago 1 day ago' | bc`
        DIAF=`date +%d -d 'now' | bc`
        MESI=`date +%m -d '1 week ago' | bc`
        MESF=`date +%m -d 'now' | bc`
        YEAR=`date +%Y -d 'now'`


Estas variables lo que nos permite es capturar una fecha inmediata (la fecha final de la copia) y las fechas iniciales de copia es decir una semana antes de lanzarse el script.

2) la orden de copia del buzón en especifico:
/opt/zimbra/bin/zmmailbox -z -m $usuario@midominio.com.co getRestURL -o $DIRB/$FECHA/$usuario.tgz "//?fmt=tgz&query=before:$MESF/$DIAF/$YEAR and after:$MESI/$DIAI/$YEAR" 2> $DIRC/dumperr.log

aquí lo que se tiene es basicamente la cadena construida para el backup, en donde se enmarca el usuario al cual se le hará la copia $usuario@midominio.com.co, la ruta a donde se enviará la copia $DIRB/$FECHA/$usuario.tgz, el formato de compresión y la cadena de filtro o query //?fmt=tgz&query=before:$MESF/$DIAF/$YEAR and after:$MESI/$DIAI/$YEAR, En este segmento debemos tener muy en cuenta que el formato de fecha es MM/DD/YYYY ademas de esto en caso que un mes este compuesto por un solo dígito no se aceptará el anteponer 0, y por ultimo el capturar el resultado de la operación  2> $DIRC/dumperr.log, esto basicamente lo hacemos es para poder establecer si un buzón esta vacío, en caso de estar vacío lo tomamos como una backup exitoso.

3) la sección en donde se manipula el crontab de zimbra, esto lo hacemos para poder retomar un backup en caso tal que se hayan tenido errores durante el primer intento.

Muy bien esto a sido todo por el momento, estoy seguro que a alguien le va a ser util ;) por lo menos a mi me fue muy util..

PD: recomendaciones, insultos, quejas y otras son bienvenidas ;)