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

martes, 29 de noviembre de 2011

WPAD (Web Proxy Auto Discovery) ClearOS linux

Y seguimos con otra entrada esta ves relacionada a autoconfiguración de proxys, esta ves el caso es el siguiente:

La empresa tiene funcionarios que se estan desplazando continuamente por las sedes ubicadas en el país lo cual implica que cada ves que llegan a una oficina es necesario llamar al técnico para que configure el proxy (es obligatorio en toda sede el uso de proxy) a lo cual se exigió una solución.

La respuesta a este incidente es WPAD que básicamente consiste en que el navegador busque la configuración del proxy en caso de no encontrar nada deja al navegador sin proxy, pues bien para esto necesitamos varios componentes:

1) servidor web
2) servidor dns o DHCP
3) script

1) Pues inicialmente necesitamos el navegador web para publicar el script (javascript) para que el navegador lo lea y lo entregue al navegador, para este caso que estamos trabajando con ClearOS él ya tiene un servidor corriendo lo que se llama webconfig, por lo tanto no necesitamos instalar mas servicios, el cual el directorio de trabajo es /var/webconfig/htdocs/ ese es el directorio en donde colocaremos el script del paso 3.

2) En nuestro caso utilizaremos la configuración con dns ya que la configuración por DHCP no es reconocida por firefox solo por IE, una ves aclarado esto podemos continuar, vamos a las configuraciones del DNS, necesitamos una zona dedicada a la LAN en caso de tener en el mismo servidor zonas externas e internas, para el caso presente vamos a /var/named o en donde se tenga las configuraciones de las zonas DNS y agregamos los siguientes registros:

wpad IN A 192.168.0.1
IN TXT "service: wpad:!http://wpad.midominio.com:82/wpad.dat"
wpad.tcp IN SRV 0 0 80 wpad.midominio.com.

En esta configuración ya debemos tener varios aspectos en cuenta, primero es en donde va a estar ubicado el archivo de configuración "http://wpad.midominio.com:82/wpad.dat" la razón para que el puerto sea el 82 es que el webconfig de clearOS escucha por este puerto, lo otro es que la ip a la que apunta el registro wpad debe ser en donde este el servidor web (casi lógico) recargamos el servicio dns y con esto ya terminamos esta sección.

3) Ahora la parte mas importante es el script que autoconfigurará el navegador, este script en este caso se llama wpad.dat, estará ubicado en /var/webconfig/htdocs/ de ClearOS y tendrá el siguiente contenido:

function FindProxyForURL(url, host) 
{
return "PROXY fw.midomonio.com.co:8080"; 


Con esto terminamos este minihowto el cual nos ahorrará mucho tiempo en la administración de las maquinas así como tiempo de los técnicos de soporte.

Referencias: http://boticati.wordpress.com/2009/11/04/implementar-wpad-dat-en-linux/
http://www.findproxyforurl.com/pac_functions_explained.html

jueves, 20 de octubre de 2011

REDIRECCIÓN DE TRAFICO ENTRE SERVIDORES INTERNOS

En la constante mejora que se lleva en la empresa a nacido la necesidad de redirigir trafico que llegaba a un servidor, la redirección no solamente es de puertos si no de ip..

entonces el trafico llega a un servidor 192.168.x.20 al puerto 8080 en este servidor no existe servicio en ese puerto. a lo cual hay que redirigir el trafico al servidor 192.168.x.30 al puerto 80

las reglas quedarian de la siguiente forma:

iptables -t nat -A PREROUTING -d 192.168.x.20 -p tcp --dport 8080 -j DNAT --to 192.168.x.30:80
iptables -t nat -A POSTROUTING -d 192.168.x.30 -j MASQUERADE

Es necesario también tener habilitado el reenvío de paquetes (en este caso para ipv4):

echo 1 > /proc/sys/net/ipv4/ip_forward

ó en /etc/sysctl.conf (para que tome los cambios sysctl -p)

agregar o modificar la siguiente linea y dejarla de la siguiente forma:

# Controls IP packet forwarding
net.ipv4.ip_forward = 1

Seguidamente vamos a dejar las reglas para que sean permanentes, en este caso estamos trabajando con CentOS (RedHat) asi que procedemos a modificar el script de inicio de iptables /etc/sysconfig/iptables

y al final del archivo o en su respectiva sección de NAT agregamos (si ya tenemos la sección de nat, debemos omitir desde la linea 1 hasta la 4 y la ultima linea)

*nat
:PREROUTING ACCEPT [114:6773]
:POSTROUTING ACCEPT [628:39550]
:OUTPUT ACCEPT [628:39550]
-A PREROUTING -d 192.168.100.13 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.100.23:80
-A POSTROUTING -d 192.168.100.23 -j MASQUERADE
COMMIT

Una ves hecho esto ya debe redireccionar el trafico que llegue al puerto 8080 al segundo host al puerto 80.


fuentes:
http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables
http://adminuser.wordpress.com/2008/03/17/redirecting-network-traffic-to-a-new-ip-using-iptables/

martes, 12 de julio de 2011

GNU/Linux - Bloquear Ctrl + C y Ctrl + Z

Por estos días reviviendo viejos tiempos en donde me defendía un poco con bash me encuentro con la necesidad de hacer un menú de selección básico con el detalle de no permitir al usuario escapar de ese mené si no obligarlo a entrar a un programa.

Buscando en inet me encuentro con que esto se puede hacer con la instrucción "trap" que básicamente lo que hace es capturar una señal del sistema (algunas se llaman a través de combinaciones de teclas como las que queremos bloquear) y ejecuta una orden.

claro esto, la orden quedaría de la siguiente forma

trap "" 2 20

Colocamos esta instrucción al inicio del script que se quiera ejecutar y listo.

A continuación se deja la tabla de señales del sistema:

1) SIGHUP
2) SIGINT
3) SIGQUIT
4) SIGILL
5) SIGTRAP
6) SIGABRT
7) SIGBUS
8) SIGFPE
9) SIGKILL
10) SIGUSR1
11) SIGSEGV
12) SIGUSR2
13) SIGPIPE
14) SIGALRM
15) SIGTERM
16) SIGSTKFLT
17) SIGCHLD
18) SIGCONT
19) SIGSTOP
20) SIGTSTP
21) SIGTTIN
22) SIGTTOU
23) SIGURG
24) SIGXCPU
25) SIGXFSZ
26) SIGVTALRM
27) SIGPROF
28) SIGWINCH
29) SIGIO
30) SIGPWR
31) SIGSYS
34) SIGRTMIN
35) SIGRTMIN+1
36) SIGRTMIN+2
37) SIGRTMIN+3
38) SIGRTMIN+4
39) SIGRTMIN+5
40) SIGRTMIN+6
41) SIGRTMIN+7
42) SIGRTMIN+8
43) SIGRTMIN+9
44) SIGRTMIN+10
45) SIGRTMIN+11
46) SIGRTMIN+12
47) SIGRTMIN+13
48) SIGRTMIN+14
49) SIGRTMIN+15
50) SIGRTMAX-14
51) SIGRTMAX-13
52) SIGRTMAX-12
53) SIGRTMAX-11
54) SIGRTMAX-10
55) SIGRTMAX-9
56) SIGRTMAX-8
57) SIGRTMAX-7
58) SIGRTMAX-6
59) SIGRTMAX-5
60) SIGRTMAX-4
61) SIGRTMAX-3
62) SIGRTMAX-2
63) SIGRTMAX-1
64) SIGRTMAX

Extraído del siguiente post: http://nixcraft.com/shell-scripting/12605-shell-script-disable-ctrl-c-ctrl-z.html

lunes, 14 de febrero de 2011

Extraer información de una maquina

Esta ves me ha tocado crear un sencillo script que extrae información de una maquina, probadlo a ver que tal va, si tienes algun comentario por favor hacerlo saber.

---------------------------------------------------------------inicio del script---------------------------------------------------------------

#!/bin/bash

# Script desarrollado por Andrey Amado, usted es libre de realizar cualquier modificación sobre el archivo siempre y cuando mencione al autor o autores de dicho script, o en su defecto gastando una pola al creador del script.

if [ `id -u` -ne 0 ]; then

{

echo "El script debe ejecutarse como root"

exit 1

}

fi

if [ -e dump.txt ]; then rm dump.txt ; fi

echo "Bienvenido al script de informe del sistema\n"

pedir_tecla()

{

read -p "presione cualquier tecla" /dev/null

clear

hola

}

opt1_nm()

{

echo "El nombre del host es: " `hostname`

}

opt2_nm()

{

if [ -e /etc/debian_version ] ; then

echo "el sistema es Debian versión: " `cat /etc/debian_version`

else

if [ -e /etc/redhat-release ]

then

echo "el sistema es: " `cat /etc/redhat_version`

fi

fi

}

opt3_nm()

{

echo "El kernel del sistema operativo es: " `uname -r`

}

opt4_nm()

{

echo "El dominio al cual pertenece es: " `hostname -d`

}

opt5_nm()

{

echo "Las ips de la maquina son: "

ip addr show

}

opt6_nm()

{

echo "Las rutas son: "

ip route show

}

opt7_nm()

{

echo "los dns son: "

cat /etc/resolv.conf

}

opt8_nm()

{

echo "los discos conectados al sistema son: "

fdisk -l

}

opt9_nm()

{

echo "las particiones y uso son: "

df -kh

}

opt10_nm()

{

echo "El tamaño y uso de la RAM es: "

free -m

}

opt11_nm()

{

echo "El uso del procesador es: "

vmstat 2 10

}

opt12_nm()

{

echo "El procesador es: "

cat /proc/cpuinfo | grep 'model name'

}

opt13_nm()

{

echo "Los procesos corriendo son: "

ps xa | less

}

opt14_nm()

{

echo "Los puertos abiertos son: "

netstat -toanp | grep 'LISTEN'

}

opt15_nm()

{

echo "Los ultimos accesos son: "

last | tail -10

}

opt16_nm()

{

if [ `cat /proc/sys/net/ipv4/ip_forward` -eq 0 ] ; then

echo "El reenvio de paquetes esta desactivo"

else

echo "El reenvio de paquetes esta activado"

fi

}

opt17_nm()

{

echo "Los usuarios con acceso de root son: "

cat /etc/passwd | grep ':0:'

}

opt18_nm()

{

echo "Los usuarios con acceso al sistema son: "

cat /etc/passwd | grep 'bash'

}

opt19_nm()

{

echo "Actualizaciones: "

if [ -e /etc/debian_version ] ; then

apt-get update

apt-get upgrade -s

else

if [ -e /etc/redhat_version ]

then

yum update

fi

fi

}

opt20_nm()

{

echo "El estado de SELinux es: " `getenforce`

}

opt21_nm()

{

echo "Las reglas de iptables son: "

iptables -nL

iptables -t nat -nL

}

opt22_nm()

{

which chkrootkit

x=$?

if [ $x -eq 1 ] ; then

{

echo "Chkrootkit NO esta instalado en su sistema"

}

else

{

echo "Chkrootkit esta instalado en su sistema"

}

fi

}

opt23_nm()

{

echo "Los dispositivos scsi conectados al sistema son: "

lsscsi

}

opt24_nm()

{

echo "Los dispositivos usb conectados al sistema son: "

lsusb

}

opt25_nm()

{

echo "El archivo en donde se esta guardando la información es dump.txt en el directorio en: " `pwd`

for i in `seq 1 24`;

do

opt`echo $i`_nm >> dump.txt

echo "\n" >> dump.txt

done

}

sel_opcion()

{

read -p "Seleccione una opción: " opc

echo "\n"

case $opc in

1)

opt1_nm

pedir_tecla

;;

2)

opt2_nm

pedir_tecla

;;

3)

opt3_nm

pedir_tecla

;;

4)

opt4_nm

pedir_tecla

;;

5)

opt5_nm

pedir_tecla

;;

6)

opt6_nm

pedir_tecla

;;

7)

opt7_nm

pedir_tecla

;;

8)

opt8_nm

pedir_tecla

;;

9)

opt9_nm

pedir_tecla

;;

10)

opt10_nm

pedir_tecla

;;

11)

opt11_nm

pedir_tecla

;;

12)

opt12_nm

pedir_tecla

;;

13)

opt13_nm

pedir_tecla

;;

14)

opt14_nm

pedir_tecla

;;

15)

opt15_nm

pedir_tecla

;;

16)

opt16_nm

pedir_tecla

;;

17)

opt17_nm

pedir_tecla

;;

18)

opt18_nm

pedir_tecla

;;

19)

opt19_nm

pedir_tecla

;;

20)

opt20_nm

pedir_tecla

;;

21)

opt21_nm

pedir_tecla

;;

22)

opt22_nm

pedir_tecla

;;

23)

opt23_nm

pedir_tecla

;;

24)

opt24_nm

pedir_tecla

;;

25)

opt25_nm

pedir_tecla

;;

default)

exit 0

;;

esac

}

hola()

{

echo "---------------------Menu principal------------------\nPresione el numero de la opción que desea ver\n"

echo "1. Nombre del sistema"

echo "2. Version del sistema operativo"

echo "3. Version del kernel"

echo "4. Nombre del dominio"

echo "5. Ips de la maquina"

echo "6. Primeras 10 rutas de la maquina"

echo "7. Dns de la maquina"

echo "8. Discos del sistema"

echo "9. Particiones del disco duro y uso"

echo "10. Tamaño y uso de ram"

echo "11. Uso de procesador"

echo "12. Tipo de procesador"

echo "13. Procesos corriendo"

echo "14. Puertos abiertos"

echo "15. Ultimos accesos"

echo "16. Reenvio de paquetes"

echo "17. Usuarios root en el sistema"

echo "18. Usuarios con acceso al sistema"

echo "19. Tiene actualizaciones?"

echo "20. SELinux activado?"

echo "21. Reglas de iptables"

echo "22. Tiene chkrootkit?"

echo "23. Dispositivos scsi"

echo "24. Dispositivos usb"

echo "25. Si usted quiere realizar todas operaciones de testo y guardarlas en un archivo"

echo "Presione cualquier otra tecla para salir\n"

sel_opcion

}

hola

------------------------------------------------------------------------------------------fin del script-----------------------------------------------------------------