martes, 27 de diciembre de 2011
Backup buzones zimbra en intervalos de fechas
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
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
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
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-----------------------------------------------------------------