script para backup de directorios de usuarios / users home backup script


Acá va un pequeño y simple script que recorre todos los directorios home de los usuarios, comprime su contenido y luego hace un scp hacia otro servidor.

La idea es comprimir y copiar a otro servidor que realizará otra acción en función de donde se encuentre o las necesidades que tengamos.

Dejo comentada una línea que nos serviría para copiar a un servidor remoto con Windows.

#!/bin/bash
#hvivani. 20110218
#realiza backups de directorios de usuario y userdata y copia a srvremoto

dd=`date +%d`
mm=`date +%m`
YY=`date +%Y`
HH=`date +%H`
MM=`date +%M`

cd /home/
for i in $(ls)
do
   tar -zcvf $i$YY$mm$dd$HH$MM.tar.gz $i"/"
#   smbclient \\srvremotoWin\back002 password -U userwin -c "put $i$YY$mm$dd$HH$MM.tar.gz;quit"
   scp $i$YY$mm$dd$HH$MM.tar.gz root@srvremoto:/backup/userdata/
   rm $i$YY$mm$dd$HH$MM.tar.gz
done

Creando un Live USB con livecd-iso-to-disk.sh


Vamos a crear un live usb booteable utilizando una imágen de Linux, de por ejemplo algún cd de rescate.

Esta es una herramienta útil en cualquier momento para salvar algún servidor o hacer una instalación por red.

OJO: supongo que el pendrive está vacío. De otro modo, tomar los recaudos necesarios.

Para esto primero descargamos el script livecd-iso-to-disk.sh que es el que realizará el trabajo de instalación de la imágen al usb.

Necesitaremos el archivo imágen de linux a instalar previamente descargado. yo voy a utilzar una de Fedora 7 Rescue.

Necesitamos tener instalado syslinux, si no lo tenemos:

$ sudo yum install syslinux

Debemos tener marcada la partición del usb como booteable, si no es así, la modificamos con fdisk:

$ sudo fdisk /dev/sdc

Orden (m para obtener ayuda): p

Disco /dev/sdc: 1940 MB, 1940226048 bytes
16 heads, 32 sectors/track, 7401 cylinders, 3789504 sectores en total
Units = sectores of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0xc3072e18

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sdc1            8064     3789503     1890720    6  FAT16

Orden (m para obtener ayuda): h
h: orden desconocida
Orden  Acción
   a   Conmuta el indicador de iniciable
   b   Modifica la etiqueta de disco bsd
   c   Conmuta el indicador de compatibilidad con DOS
   d   Suprime una partición
   l   Lista los tipos de particiones conocidos
   m   Imprime este menú
   n   Añade una nueva partición
   o   Crea una nueva tabla de particiones DOS vacía
   p   Imprime la tabla de particiones
   q   Sale sin guardar los cambios
   s   Crea una nueva etiqueta de disco Sun
   t   Cambia el identificador de sistema de una partición
   u   Cambia las unidades de visualización/entrada
   v   Verifica la tabla de particiones
   w   Escribe la tabla en el disco y sale
   x   Funciones adicionales (sólo para usuarios avanzados)

Orden (m para obtener ayuda): a
Número de partición (1-4): 1

Orden (m para obtener ayuda): p

Disco /dev/sdc: 1940 MB, 1940226048 bytes
16 heads, 32 sectors/track, 7401 cylinders, 3789504 sectores en total
Units = sectores of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identificador del disco: 0xc3072e18

Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/sdc1   *        8064     3789503     1890720    6  FAT16

Orden (m para obtener ayuda): w
¡Se ha modificado la tabla de particiones!

Llamando a ioctl() para volver a leer la tabla de particiones.
Se están sincronizando los discos.

Ahora procedemos a ejecutar el script pasandole como parámetros la imágen a instalar y la partición del usb donde debe instalarse:

OJO: Desmontar el pendrive antes de ejecutar.

$ su -c "./tools_livecd-iso-to-disk.sh --format --reset-mbr Fedora7-i386-rescuecd.iso /dev/sdc1"
Contraseña:
Verifying image...
./tools_livecd-iso-to-disk.sh: línea 806: checkisomd5: no se encontró la orden
Are you SURE you want to continue?
Press Enter to continue or ctrl-c to abort

/home/hvivani/TMP/Fedora7-i386-rescuecd.iso uses initrd.img w/o install.img
Copying DVD image to target device.
Updating boot config file
Installing boot loader
Target device is now set up with a Live image!

Listo !

 

 

 

Script de notificación de uso de quota de disco / Disk Quota Notification Script


Estuve un rato buscando si alguien se había tomado el trabajito de armar un script para enviar un mail a los usuarios cuando estos estuvieran superando la quota de disco (al menos la SOFT quota) pero no econtré nada similar, así que no me quedó otra que hacerlo… Aquí dejo mi aporte para los que lo necesiten:

Lo que hace es recorrer los usuarios existentes en el /etc/passwd con UID >= 500. Esto es para Linux CentOS, Fedora, Redhat, pero pueden modificarlo para otros linuxes.
Para cada uno de ellos utiliza el comando repquota y compara los campos soft y hard para calcular el espacio utilizado.
En base a esto envía un mail de notificación al usuario y otro a sistemas para que nos enteremos que determinado usuario tiene problemas de quota.

#!/bin/sh
#hvivani. 20101217
#verifica quotas de usuario en filesystem y envía mail notificando exceso de soft quota.

for name in $(awk -F: ‘($3>=500) && ($3!=65534) {print $1}’ /etc/passwd)
do
      limiteSoft=`/usr/sbin/repquota /  |grep “$name ” |awk ‘($3>$4) && ($4!=0) {print $4}’`
      usado=`/usr/sbin/repquota /  |grep “$name ” |awk ‘($3>$4) && ($4!=0) {print $3}’`
      limiteHard=`/usr/sbin/repquota /  |grep “$name ” |awk ‘($3>$4) && ($4!=0) {print $5}’`

      ### si el limite soft no es nulo
      if [ -n “$limiteSoft” ]
      then
         ### si el limite soft supera el espacio utilizado
         if [ “$usado” -ge “$limiteSoft” ]
         then
            nota=”Usuario: $name, Ud. esta excediendo su espacio en disco: Limite: $limiteSoft Bytes. Utilizado: $usado Bytes. Por favor, libere espacio en su carpeta personal o sistema de correo.”
            echo $nota | mail -s “ATENCION: Uso de Disco !!” $name@dominio.com.ar
            echo “El usuario $name ha superado SOFT quota. Limite: $limiteSoft Bytes. Utilizado: $usado Bytes.” | mail -s “ATENCION: Uso de Disco $name !!” sistemas@dominio.com.ar
         fi
         ### si el limite hard supera el espacio utilizado
         if [ “$usado” -ge “$limiteHard” ]
         then
            nota=”Usuario $name, Ud, esta excediendo su espacio en disco: Limite: $limiteHard Bytes. Utilizado: $usado Bytes. No podrá escribir en su sistema hasta que libere espacio en su carpeta personal o sistema de correo.”
            echo $nota | mail -s “Uso de Disco !!” $name@dominio.com.ar
            echo “El usuario $name ha superado HARD quota. Limite: $limiteSoft Bytes. Utilizado: $usado Bytes.” | mail -s “ATENCION: Uso de Disco $name !!” sistemas@dominio.com.ar
         fi
      fi

done

scripts: qmail usage statistics


Aquí varios scripts utilizados para analizar el uso del servidor de correo qmail. Se pueden utilizar independientemente o el primero llamará al resto:

[root@test scripts]# cat chkStatus.sh 
#!/bin/bash
echo ""
echo ""
echo "Consultas de estado. Servidor Qmail"
echo "==================================="
echo ""
echo "TCP Server Hits:"
/root/scripts/chkTcpServerHits.sh $1|cut -c12-50
echo "RBL Hits:"
/root/scripts/chkRblHits.sh $1|cut -c12-50
echo "SPAM Hits:"
/root/scripts/chkSpamHits.sh $1|cut -c13-50
echo "Spam Deleted: "
/root/scripts/chkSpamHitsDeleted.sh $1|cut -c13-50
echo "Virus Hits:"
/root/scripts/chkVirusHits.sh $1|cut -c13-50
echo "Qtrap Hits:"
/root/scripts/chkQtrapHits.sh $1|cut -c12-50
echo "Failure:"
/root/scripts/chkFailure.sh $1|cut -c12-50
echo "Pop3 Hits:"
/root/scripts/chkPopHits.sh $1|cut -c12-50
echo "Send Local:"
/root/scripts/chkSendLocal.sh $1|cut -c12-50
echo "Send Remote:"
/root/scripts/chkSendRemote.sh $1|cut -c12-50
echo ""
echo "Estado de las colas: "
qmailctl queue
echo ""
echo "Uptime: "
uptime
echo ""

[root@test scripts]# cat chkTcpServerHits.sh 
#!/bin/bash
# 20070417-hvivani-Obtiene total de tcpserver: pid de los logs de qmail para una fecha pasada por linea de comandos.
fecha=`date +%Y-%m-%d --date=$1`
# imprimo fecha. Puede cambiarse para otros dias
echo $fecha | \
# coloco una coma
awk '{printf $0","}' \
# busco "rblsmtpd" en los logs para determinar la cantidad de lineas que lo contienen
cat /var/log/qmail/qmail-smtpd/*|grep "tcpserver: pid"| \
# convert Time Atomic International timestamp to normal human readable format <-- motherfucker yeahhh!!!
/usr/local/bin/tai64nlocal | \
# busco el human readable timestamp para todas las instancias de la fecha
grep $fecha | \
# cuento numero de lineas
wc -l
# end
exit

[root@test scripts]# cat chkRblHits.sh 
#!/bin/bash
# 20070417-hvivani-Obtiene total de rblsmtpd de los logs de qmail para una fecha pasada por linea de comandos.
fecha=`date +%Y-%m-%d --date=$1`
# imprimo fecha. Puede cambiarse para otros dias
echo $fecha | \
# coloco una coma
awk '{printf $0","}' \
# busco "rblsmtpd" en los logs para determinar la cantidad de lineas que lo contienen
cat /var/log/qmail/qmail-smtpd/*|grep "rblsmtpd:"| \
# convert Time Atomic International timestamp to normal human readable format <-- motherfucker yeahhh!!!
/usr/local/bin/tai64nlocal | \
# busco el human readable timestamp para todas las instancias de la fecha
grep $fecha | \
# cuento numero de lineas
wc -l
# end
exit

[root@test scripts]# cat chkSpamHits.sh 
#!/bin/bash
# 20070417-hvivani-Obtiene total de SPAM de los logs de qmail para una fecha pasada por linea de comandos.
fecha=`date +%c --date=$1|cut -c5-15`
# imprimo fecha. Puede cambiarse para otros dias
echo $fecha | \
# coloco una coma
awk '{printf $0","}' \
# busco para determinar la cantidad de lineas que lo contienen
cat /var/spool/qscan/qmail-queue.log|grep "smells like SPAM"|cut -c6-16| \
# busco la fecha
grep "$fecha" | \
# cuento numero de lineas
wc -l
# end
exit

[root@einstein scripts]# cat chkSpamHitsDeleted.sh 
#!/bin/bash
# 20070417-hvivani-Obtiene total de SPAM eliminado de los logs de qmail para una fecha pasada por linea de comandos.
fecha=`date +%c --date=$1|cut -c5-15`
# imprimo fecha. Puede cambiarse para otros dias
echo $fecha | \
# coloco una coma
awk '{printf $0","}' \
# busco para determinar la cantidad de lineas que lo contienen
cat /var/spool/qscan/qmail-queue.log|grep "deleting message..."|cut -c6-16| \
# busco la fecha
grep "$fecha" | \
# cuento numero de lineas
wc -l
# end
exit

[root@test scripts]# cat chkVirusHits.sh 
#!/bin/bash
# 20070417-hvivani-Obtiene total de virus de los logs de qmail para una fecha pasada por linea de comandos.
fecha=`date +%c --date=$1|cut -c5-15`
# imprimo fecha. Puede cambiarse para otros dias
echo $fecha | \
# coloco una coma
awk '{printf $0","}' \
# busco para determinar la cantidad de lineas que lo contienen
cat /var/spool/qscan/qmail-queue.log|grep "there be a virus"|cut -c6-16| \
# busco la fecha
grep "$fecha" | \
# cuento numero de lineas
wc -l
# end
exit

[root@test scripts]# cat chkQtrapHits.sh 
#!/bin/bash
# 20070418-hvivani-Obtiene total dets del qtrap  de los logs de qmail para una fecha pasada por linea de comandos.
fecha=`date +%Y-%m-%d --date=$1`
fechaQtrap=`date +%m/%d/%y --date=$1`
# imprimo fecha. Puede cambiarse para otros dias
echo $fecha | \
# coloco una coma
awk '{printf $0","}' \
# busco en los logs para determinar la cantidad de lineas que lo contienen
cat /home/vpopmail/qtrap/logs/qtrap.log|grep "$fechaQtrap"|wc -l
# end
exit

[root@test scripts]# cat chkFailure.sh 
#!/bin/bash
# 20070418-hvivani-Obtiene total de failure de los logs de qmail para una fecha pasada por linea de comandos.
fecha=`date +%Y-%m-%d --date=$1`
# imprimo fecha. Puede cambiarse para otros dias
echo $fecha | \
# coloco una coma
awk '{printf $0","}' \
# busco en los logs para determinar la cantidad de lineas que lo contienen
cat /var/log/qmail/qmail-send/*|grep "failure: "| \
# convert Time Atomic International timestamp to normal human readable format <-- motherfucker yeahhh!!!
/usr/local/bin/tai64nlocal | \
# busco el human readable timestamp para todas las instancias de la fecha
grep $fecha | \
# cuento numero de lineas
wc -l
# end
exit

[root@test scripts]# cat chkPopHits.sh 
#!/bin/bash
# 20070417-hvivani-Obtiene total de tcpserver: pid de los logs de qmail para una fecha pasada por linea de comandos.
fecha=`date +%Y-%m-%d --date=$1`
# imprimo fecha. Puede cambiarse para otros dias
echo $fecha | \
# coloco una coma
awk '{printf $0","}' \
# busco "rblsmtpd" en los logs para determinar la cantidad de lineas que lo contienen
cat /var/log/qmail/qmail-pop3d/*|grep "tcpserver: pid"| \
# convert Time Atomic International timestamp to normal human readable format <-- motherfucker yeahhh!!!
/usr/local/bin/tai64nlocal | \
# busco el human readable timestamp para todas las instancias de la fecha
grep $fecha | \
# cuento numero de lineas
wc -l
# end
exit

[root@test scripts]# cat chkSendLocal.sh 
#!/bin/bash
# 20070417-hvivani-Obtiene total de entregas locales de los logs de qmail para una fecha pasada por linea de comandos.
fecha=`date +%Y-%m-%d --date=$1`
# imprimo fecha. Puede cambiarse para otros dias
echo $fecha | \
# coloco una coma
awk '{printf $0","}' \
# busco "rblsmtpd" en los logs para determinar la cantidad de lineas que lo contienen
cat /var/log/qmail/qmail-send/*|grep "to local "| \
# convert Time Atomic International timestamp to normal human readable format <-- motherfucker yeahhh!!!
/usr/local/bin/tai64nlocal | \
# busco el human readable timestamp para todas las instancias de la fecha
grep $fecha | \
# cuento numero de lineas
wc -l
# end
exit

[root@test scripts]# cat chkSendRemote.sh 
#!/bin/bash
# 20070417-hvivani-Obtiene total de entregas remotas de los logs de qmail para una fecha pasada por linea de comandos.
fecha=`date +%Y-%m-%d --date=$1`
# imprimo fecha. Puede cambiarse para otros dias
echo $fecha | \
# coloco una coma
awk '{printf $0","}' \
# busco "rblsmtpd" en los logs para determinar la cantidad de lineas que lo contienen
cat /var/log/qmail/qmail-send/*|grep  "to remote "| \
# convert Time Atomic International timestamp to normal human readable format <-- motherfucker yeahhh!!!
/usr/local/bin/tai64nlocal | \
# busco el human readable timestamp para todas las instancias de la fecha
grep $fecha | \
# cuento numero de lineas
wc -l
# end
exit

script para verificar conexión


Este script verifica la conexión con un determinado servidor. Puede ser utilizado con un router/modem y, eventualmente reiniciarlo a través de un comando expect / spawn.

[root@test scripts]# cat chkconn 
dd=`date +%d`
mm=`date +%m`
YY=`date +%Y`
HH=`date +%H`
MM=`date +%M`
d=0
u=0
HOSTS="www.google.com newton 10.0.1.4 fabrica.dyndns.org"
for HOST in $HOSTS
do
   ping $HOST -c 1|grep " 0% packet loss" > /dev/null
   if [ $? = 0 ] 
   then
      echo "$YY$mm$dd$HH$MM $HOST está levantado"
      let "u=u+1" 
   else
      echo "$YY$mm$dd$HH$MM $HOST no es accesible" >> /var/log/chkconn.log
      let "d=d+1"
   fi
done
echo
#echo "$u sistemas levantados"
#echo "$d sistemas inaccesibles"
#### Si hay mas de tres servidores inaccesibles, reinicia el modem ADSL
#if [[ $d > 3 ]]
#then
#   echo "$YY$mm$dd$HH$MM - Hay $d sistemas off-line" >> /var/log/chkconn.log
#   /usr/bin/expect /root/scripts/reboot.exp
#else
#   echo "Ok."
#fi

 

[root@test scripts]# cat reboot.exp 
spawn telnet 10.0.1.4

expect "NetDSL>"
send "reboot\r"

expect "r"