miércoles, 29 de agosto de 2012

Mi primer certificación LPIC

Hace unos días, la llegada de un paquete a mi casa me puso en gran medida emocionado, no me había buscado el espacio para compartirlo con el mundo, sin embargo, ahora les comento que me llego la certificación LPIC-1.

Después de aprobar los exámenes 101 y 102, espere un poco mas de seis semanas para recibir mi documento. Ustedes pueden leer mis comentarios preliminares para el proceso que seguí [ aquí ]. Los exámenes no son para nada fáciles, hay que estudiar mucho, son precisos (parámetros exactos, rutas absolutas, archivos de configuración, comandos, etc). Pero..., ¿Que fue lo que me llego?:


  • Certificación.
  • Tarjeta de Certificación (algo así como una cédula profesional en México).
  • Una revista Linux Magazine.
  • Certificacion adicional: Novell Certified Linux Administrator, la cual requiere un registro y esperar un tiempo adicional.

jueves, 19 de julio de 2012

Otrs stat from last week, last month, last everyday


Hace unos días había tenido la necesidad de automatizar el envió de reportes en OTRS (3.1.2), lo que buscábamos era enviar el reporte de las actividades realizadas en los últimos N días, por ejemplo enviar automáticamente cada domingo por la noche un reporte semanal de los tickets creados en la semana actual.

El problema: Las estadísticas con objetos dinámicos no permiten especificar un parámetro como "LastWeek", solo permite dos opciones
  • Definir un rango de fechas estéticamente.
  • Dejar a elección del usuario escoger la fecha en la interface web.

¿Que pasa con el script de generación de estadísticas?
El script otrs.GenerateStats.pl recibe algunos parámetros como el ID de la estadística, el directorio destino donde colocara el archivo, el formato en que entregara la estadística (csv, pdf). Incluso una opción "-p" que recibe valores para Format, GraphSize, StatID  y ExchangeAxis. Debo mencionar que esta parte tiene una documentación muy pobre.

Como la idea es automatizar el proceso, tenemos que pensar en cron job, pero cron implica otrs.GenerateStats.pl, y este ultimo no tiene el soporte que ocupamos, esperando que esta descripción sea clara ¿quien podrá ayudarnos?

La solución:  Construcción de un script traductor.

En la base de datos de OTRS, las estadísticas se almacenan en "xml_storage", cada generación de estadísticas consultara las fechas primeramente en un cache y luego en la tabla

select * from xml_storage where xml_key=29



xml_typexml_keyxml_content_keyxml_content_value
Stats29[0]{'otrs_stats'}[1]{'UseAsRestriction'}[1]{'TimeStop'} 2012-07-18 23:59:59
Stats29[0]{'otrs_stats'}[1]{'UseAsRestriction'}[1]{'TimeStart'} 2012-07-11 00:00:00


Es recomendable crear un usuario en mysql con acceso de select/update a nuestra tabla y nada mas, este para ser usado en nuestro script. Con esta información preliminar les presento el script resultante:
#!/bin/bash

################################################
# Martin Edmundo, [ Julio 2012 ]
# @martinedmundo
# www.elrincondemartin.org
# Funcion: Script de generacion de estadisticas
#          basado en los ultimos dias.
# Release: OTRS 3.1.2
################################################

#Definicion de variables usadas
OTRS_DIR=/opt/otrs
OTRS_BIN=$OTRS_DIR/bin
BODYMAIL=/usr/local/sbin/bodymail.txt

DBUSER='otrsstat'
DBPASSWD='xxxxxx'
DBNAME='otrs'
DBTABLE='xml_storage'

STATNUM='';
TARGETDIR=$HOME;
DAYSNUM='7';
FILENAME='';

FILENAMESTAT='';
PREFIXFILENAMESTAT='Estad';
datestart=''
datestop=''

function phelp {
        echo -e "Usage: $0 -n  -o  -d  | -h"
        echo -e "  -n Numero de estadistica."
        echo -e "  -o Directorio destino de la estadistica. [ Predeterminado: $HOME ]"
        echo -e "  -d Rango de fechas de los utimos dias hasta hoy. [ Predeterminado: 7 ]"
        echo -e "  -h Ayuda, este mensaje.\n"
}

function chdb {
        #Se define el rango de fechas para los ultimos DAYSNUM dias
        datestart=`date --date="-$DAYSNUM day" +"%F "`00:00:00;
        datestop=`date +"%F %H:%M:%S"`;

        #Limpiamos cache de estadisticas
        rm $OTRS_DIR/var/tmp/CacheFileStorable/XML/* 2> /dev/null

        #Actualizamos fechas de estadisticas
        mysql -u $DBUSER -p$DBPASSWD --database=$DBNAME --execute="UPDATE $DBTABLE SET xml_content_value='$datestart' WHERE xml_key=$STATNUM and xml_content_key LIKE '%TimeStart%'"
        mysql -u $DBUSER -p$DBPASSWD --database=$DBNAME --execute="UPDATE $DBTABLE SET xml_content_value='$datestop' WHERE xml_key=$STATNUM and xml_content_key LIKE '%TimeStop%'"
}

function sendmail_ {
        #Nos vamos al diretorio de los reportes
        cd $TARGETDIR

        #Se revisa los destinatarios de correo
        for mail in `cat $FILENAME`; do
                isComment=`echo "$mail" | cut -d "#" -f1`

                #Si no es un comentario, analizamos
                if [ -n "$isComment" ]; then
                        #Se requiere mejorar la expresion regular para correo
                        isMail=`echo "$mail" | grep ".*@.*"`

                        #Enviamos correo electronico
                        if [ "$?" = "0" ]; then
                                ( echo -e "Reporte de actividades correspondientes al siguiente periodo: \n
[ $datestart a $datestop ]"; uuencode $FILENAMESTAT Reporte_$STATNUM.pdf  ) | mail -s "Servicios update" $mail
                        else
                                echo "Formato de correo desconocido: $mail"
                        fi
                fi
        done
}

while getopts n:o:d:f:h OPT
do
        case $OPT in
                n) STATNUM="$OPTARG" ;;
                o) TARGETDIR="$OPTARG" ;;
                d) DAYSNUM="$OPTARG" ;;
                f) FILENAME="$OPTARG" ;;
                h)
                        phelp
                        exit 0
                ;;
                ?)
                        phelp
                        exit 1
                ;;
                esac
done

if [ -z "$STATNUM" ]; then
        echo "*** Ocurrio un error o hace falta el parametro -n"
        phelp
        exit 1;
fi

#Se actualiza la base de datos
chdb

#Se genera el reporte
rm $TARGETDIR/*.pdf 2> /dev/null
FILENAMESTAT=`$OTRS_BIN/otrs.GenerateStats.pl -n $STATNUM -o $TARGETDIR -f Print 2> /dev/null | grep -o "$PREFIXFILENAMESTAT.*pdf"`

#¿Quiere que se envie por correo?
if [ -n "$FILENAME" ]; then
        if [ -f $FILENAME ]; then
                sendmail_
        else
                echo "No existe el archivo $FILENAME"
                exit 1;
        fi
fi

exit 0;

Como lo usamos:
martinbarriga@monitoreo:/usr/local/sbin$ ./otrs.GenerateStats.sh -h
Usage: ./otrs.GenerateStats.sh -n  -o  -d  | -h
 -n Numero de estadística.
 -o Directorio destino de la estadistica. [ Predeterminado: /home/user ]
 -d Rango de fechas de los utimos dias hasta hoy. [ Predeterminado: 7 ]
 -h Ayuda, este mensaje.

lunes, 2 de julio de 2012

Resultados Elecciones 2012

Como parte de mi compromiso social con mi patria el pasado 1 de Julio fui a votar y el día 2 de Julio a verificar los resultados con los registrados por el PREP. Esto ultimo por que encontré algunas imágenes compartidas en las redes sociales donde se pone en evidencias supuestas anomalías en el proceso de contabilización.

Basado en esta información me decidí a tomar una muy pequeña muestra de mis distritos vecinos para validar la veracidad de los números mostrados en el PREP. No encontré ningún error, en mi pequeña muestra, les paso las imágenes para que uds. mismos las verifiquen en [ aqui ] y corresponden al estado de Michoacan:

Sección: 1148, Casilla contigua


Sección: 1150, Casilla básica



Sección: 1151, Casilla básica y contigua



Sección: 1152, Casilla básica y contigua



Sección: 1153, Casilla básica y contigua



Sección: 1154, Casilla básica


También revise la sección 1149 pero ya se habían robado los resultados, incluso de la 1148 tampoco estaba los resultados de la casilla básica, mi revisión la realice en la mañana.  Debo agregar que me interese por hacer esta tarea debido a las fotos que circulan en las redes sociales y las cuales no coinciden con los datos del PREP donde en el mejor de los casos se trata de errores de captura (para no pensar que existe malas intenciones en afectar un resultado en favor de algún candidato):

DISTRITO FEDERAL
Distrito 25 - IZTAPALAPA
Sección 2937


DISTRITO FEDERAL
Distrito 04 - IZTAPALAPA
Sección 2641
Nota: compartida por @joseluigarcia


NUEVO LEÓN
Distrito 07 - MONTERREY
Sección 1076


OAXACA
Distrito 11 - SANTIAGO PINOTEPA NACIONAL
Sección 2062
NOTA: Esta ya se ha corregido en PREP.


SAN LUIS POTOSÍ
Distrito 02 - SOLEDAD DE GRACIANO SANCHEZ
Sección 1257

TABASCO
Distrito 06 - CENTRO
Sección 0389
Nota: Se corrige el valor anterior de 11, pero ahora actualizan con 112

Si alguien tiene información de errores en la captura del PREP, por favor compartan.



sábado, 30 de junio de 2012

RRDTool Primeros pasos - Parte 1


Este sera la primera de dos entradas en mi blog donde hablare un poco RRDtool, una herramienta que apenas estoy conociendo, pero que me resulta mucho muy divertida. Hoy en día varios proyectos de software lo usan como centreon, mrtg, ipcop, cacti, etc.

En lo poco que he explorado a RRDtool puedo comentarles que me ha ayudado a graficar valores en 2D sobre una linea de tiempo, haciendo uso de archivos con una estructura muy parecida a una base de datos donde almacena muchos parámetros y valores.

Graficando.

Nuestro objetivo en esta entrada va a ser graficar los tiempos de respuesta ICMP hacia un servidor en Internet. Para comenzar a graficar se requiere el conjunto de RRDtool, esto lo hacemos en Debian instalando el siguiente paquete:
sudo apt-get install rrdtool

La información de las graficas se almacenan en archivos con el postfijo "rrd", el primer paso es definir y crear estos archivos. Lo que hace divertido graficar es que nuestras graficas únicamente estan limitadas por nuestra imaginación y dominio de gnu shell. Vamos entonces a definir nuestro archivo rrd para la latencia hacia un servidor de google:
user@localhost:~/rrd$ rrdtool create latency.rrd --step 60 DS:latency:GAUGE:300:0:100000000 RRA:AVERAGE:0.5:1:259200 RRA:AVERAGE:0.5:12:100946

El parámetro step, nos indica que tendremos representaciones lineales individuales cada 60 segundos, el DS:latency indica que nuestro DasaSource se llama "latency", el GAUGE indica que usaremos este Datasource para medir los valores que le pasaremos en el futuro. Después de esta definición, se crea el archivo "latency.rrd" y podemos ver la información de sus parámetros con:
user@localhost:~/rrd$ rrdtool info latency.rrd
filename = "latency.rrd"
rrd_version = "0003"
step = 60
last_update = 1341035342
header_size = 740
ds[latency].index = 0
ds[latency].type = "GAUGE"
ds[latency].minimal_heartbeat = 300
ds[latency].min = 0.0000000000e+00
ds[latency].max = 1.0000000000e+08
ds[latency].last_ds = "143"
ds[latency].value = 2.9254425200e+02
ds[latency].unknown_sec = 0
rra[0].cf = "AVERAGE"
rra[0].rows = 259200
rra[0].cur_row = 103763
rra[0].pdp_per_row = 1
rra[0].xff = 5.0000000000e-01
rra[0].cdp_prep[0].value = NaN
rra[0].cdp_prep[0].unknown_datapoints = 0
rra[1].cf = "AVERAGE"
rra[1].rows = 100946
rra[1].cur_row = 74902
rra[1].pdp_per_row = 12
rra[1].xff = 5.0000000000e-01
rra[1].cdp_prep[0].value = 1.4305392777e+02
rra[1].cdp_prep[0].unknown_datapoints = 0

Una vez que tenemos nuestra base de datos RRD, nos queda estar actualizandolo para estar alimentandolo de información. En la secuencia siguiente primeramente vemos como conseguir el tiempo de respuesta usando la salida del comando ping, después indicamos como se alimenta el archivo con un valor contante y finalmente indicamos como lo actualizamos con el tiempo de respuesta, el cual tiene que estar cambiando en canda instante del tiempo.
user@localhost:~/rrd$ ping -c 1 8.8.8.8 | grep -o time=[0-9]* | cut -d "=" -f2
145
user@localhost:~/rrd$ rrdtool update ~/rrd/latency.rrd N:100
user@localhost:~/rrd$ rrdtool update ~/rrd/latency.rrd N:`ping -c 1 8.8.8.8 | grep -o time=[0-9]* | cut -d "=" -f2`

Siendo mas prácticos podemos colocar esta ultima linea en nuestro cron par que se actualice cada minuto.
*/1 * * * * /usr/bin/rrdtool update ~/rrd/latency.rrd N:`ping -c 1 8.8.8.8 | egrep -o time=[0-9]* | cut -d "=" -f2`

Hasta aquí vamos a estar actualizando el archivo cada minuto. Lo ultimo que nos queda es conseguir graficas de estos datos que estamos pasando. Las graficas las podemos hacer basandonos en un periodo de tiempo, por ejemplo si quisieramos las ultimas 3 horas y colocarlo en el archivo latency.png:
user@localhost:~/rrd$ rrdtool graph latency.png --title="Latencia" --vertical-label "Time (ms)" --end now --start end-10800s DEF:time=latency.rrd:latency:AVERAGE  LINE1:time#ff0000:Tiempo
497x173
user@localhost:~/rrd$



Puede ser que solo queremos ver la ultima hora, podemos graficarlo así:
user@localhost:~/rrd$ rrdtool graph latency.png --title="Latencia" --vertical-label "Time (ms)" --end now --start end-3600s DEF:time=latency.rrd:latency:AVERAGE  LINE1:time#ff0000:Tiempo
497x173
user@localhost:~/rrd$



Finalmente podemos ver que es posible graficar muchas cosas con la ayuda de varios comandos. En la próxima entrada les mostrare como estoy graficando algunos de los recursos de mi notebook y graficas con un poco de mejor diseño.

miércoles, 30 de mayo de 2012

Enviar y recibir correo desde nuestro GNU Shell con fetchmail y ssmtp

En este ultimo par de días, me ha tocado realizar algunas pruebas de correo electrónico, por lo que creo que tengo un poco de información agrupada aquí que les puede servir para manejar básicamente un correo electrónico desde nuestro shell (en mi caso mis pruebas son con bash).

Para enviar correo electrónico usamos el protocolo smtp, por lo tanto requerimos un servidor que ofrezca este servicio. Por otro lado, en cuanto a la recepción de correo nos apoyamos de los servidores pop. Conocer un poco mas de estos detalles es importante a la hora de comenzar nuestro trabajo de configurar un cliente de correo cualquiera que este sea. En nuestra practica vamos a configurar una cuenta de Gmal. A continuación les dejo un muy breve listado con algunos servidores.


Propietario Servidor Protocolo Cifrado Puerto
Gmail imap.googlemail.com imap ssl 993
Gmail pop.googlemail.com pop3 ssl 995
Gmail smtp.googlemail.com smtp ssl 465
Yahoo imap.mail.yahoo.com imap ssl 993
Yahoo pop.mail.yahoo.com pop3 ssl 995
Yahoo smtp.mail.yahoo.com smtp ssl 465
Hotmail pop3.live.com pop3 ssl/tls 995
Hotmail smtp.live.com smtp starttls 587


1. Enviar correo
En el envió de correo vamos ocupar instalar un agente de envió: ssmtp. Es un paquete muy básico y simple: ssmtp. Primero hacemos la instalación y luego modificamos su archivo de configuración.

user@localhost:~$ sudo apt-get install ssmtp
user@localhost:~$ sudo vim /etc/ssmtp/ssmtp.conf


En la configuración tenemos que especificar correo electrónico, contraseña para identificarnos, servidor smtp, tipo de cifrado, etc. A continuación les muestro parcialmente mi archivo ssmtp.conf.

root=martingmail@gmail.com
mailhub=smtp.gmail.com:587
AuthUser=martingmail
AuthPass=xxxxxxxxxx
UseSTARTTLS=YES
FromLineOverride=YES
rewriteDomain=
hostname=martingmail@gmail.com


Una vez configurado los datos de la cuenta, asociamos el correo con una cuenta local de nuestro sistema en el archivo /etc/ssmtp/revaliases, eso lo hacemos colocando la siguiente linea "martin:martingmail@gmail.com:smtp.gmail.com:587".

Si nuestra configuracion y atutentificacion es correcta ya podemos enviar correos con mail command.

#Envio de correo, con redaccion interactiva
mail -s "Mi primer correo" miamigo@sudominio.org
#Envio de correo con redaccion desde el mismo shell
echo "Hola" | mail -s "Mi primer correo" miamigo@sudominio.org
cat miarchivo.txt | mail -s "Mi primer correo" miamigo@sudominio.org
#Enviar correo con archivo adjunto
uuencode ~/mifoto.png mifoto.png | mail -s "Mi foto" milindaamiga@sudominio.org
#Enviar correo con archivo adjunto y texto
( cat declaraciondeamor.txt ; uuencode ~/mifoto.png mifoto.png ) | mail -s "Mi foto" milindaamiga@sudominio.org


Para el caso donde adjuntamos archivos el comando uuencode lo encontramos en el paquete sharutils, por lo que tendríamos que instalarlo también.

2. Recibir correo
Fetchmail es un programa que nos ayuda a traer los nuestros correos de un mail server remoto, por lo tanto es el que no va a traer los correos de nuestro buzón gmail. El siguiente paso es instalar fechtmail y configurar su archivo:

user@localhost:~$ sudo apt-get install fetchmail
user@localhost:~$ sudo vim ~/fetchmailrc


El siguiente es mi archivo de configuración parcial (¿Por que parciales?, por que no puedo mostrar mis datos personales)

#Cada 600 segundos actualizar
set daemon 600
set logfile fetchmail.log
poll pop.googlemail.com proto POP3
user "martingmail@gmail.com" pass "xxxxxxxxx" is "martin"
ssl
mda "/usr/bin/procmail -f %F -d %T"


Ya configurado esto, podemos leer los correos con el mail command, y hacer las operaciones básicas que este nos ofrece, principalmente la redacción y respuesta de correos. El uso de comandos internos del mail command, no lo voy a tratar aquí ya que es un tema muy extenso y no lo domino ampliamente, por lo que en ese aspecto les tocara investigar.

viernes, 11 de mayo de 2012

OTRS y Nagios/Centreon

Como les había comentado antes, había estado trabajando un poco en OTRS para el control de servicios dentro de una unidad organizacional. Por simple curiosidad se me ocurrió agregar dos características al monitoreo para que se generen gráficas estadistas del los servicios que se realizan.

¿Por que construir un propio plugin y no usar los mecanismos que otrs nos ofrece para integrarse con Nagios? Primeramente por cuestiones de facilidad de implementación, la documentación de estos mecanismos no son muy claros (al menos para mi), sobre todo por que otrs ha cambiado entre versiones. La otra razón es por que los mecanismos de otrs tienen la limitante de trabajar únicamente en un entorno donde conviven en un mismo servidor Otrs/Nagios.

El script es muy básico, para este post, soporta  únicamente el monitoreo de tickets abiertos y tickets creados por día:

#!/bin/bash

dbHostname="127.0.0.1"
dbUser="otrsguest"
dbPasswd="qwerty"
dbName="otrs"
dbWhere=""

WARNING=10
CRITICAL=15
TYPE=""

# Plugin return codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

function report {
        val=`mysql -h $dbHostname -u $dbUser -p$dbPasswd --database=$dbName --execute="select count(*) as open from ticket $dbWhere" | awk 'BEGIN{FS="\n"; RS="\n\n";}{print $2}'`
        if [ "$val" -le "$WARNING"  ]; then
                echo "Tickets $TYPE: $val [ OK ] | value=$val"
                exit $STATE_OK
        else
                if [ "$val" -le "$CRITICAL" ]; then
                        echo "Tickets $TYPE: $val [ WARNING ] | value=$val"
                        exit $STATE_WARNING
                else
                        echo "Tickets $TYPE: $val [ CRITICAL ] | value=$val"
                        exit $STATE_CRITICAL
                fi
        fi
}

function phelp {
        echo -e "Usage: $0 -t  -w  -c  | -h"
        echo -e "  -t Tipo de tickets a consultar"
        echo -e "  -c Valor critico"
        echo -e "  -w Valor warning"
        echo -e "  -h Help, this message.\n"
}

while getopts t:w:c:h OPT
do
        case $OPT in
                t) TYPE="$OPTARG" ;;
                w) WARNING="$OPTARG" ;;
                c) CRITICAL="$OPTARG" ;;
                h)
                        phelp
                        exit $STATE_UNKNOWN
                ;;
        esac
done


if [ "$TYPE" = "abiertos" ]; then
        dbWhere="where ticket_state_id='4'"
        report
else
        if [ "$TYPE" = "creados" ]; then
                date=`date +"%Y-%m-%d"`
                dbWhere="where create_time like '$date%'"
                report
        else
                echo "Carecteristica a monitorear desconocida. Conocidas: abiertos, creados"
                exit $STATE_UNKNOWN
        fi
fi


La siguiente gráfica nos representa la actividad de tickets abiertos para los últimos dos días.
 La siguiente gráfica nos representa la actividad de tickets creados por día, en los últimos tres días.

lunes, 7 de mayo de 2012

Construcción de Plugin Nagios/Centreon para HP Printer

Hace unas horas termine un script en bash para monitorear los consumibles de unas impresoras HP, la idea de agregarlas a centreon es para darnos conocer en buen momento cuando uno de los consumibles se están por terminar así como un histórico (usando las graficas) de cuanto se esta consumiendo. A posteriori, este script se tendría que poder usar en cualquier impresora HP con SNMP activado, los modelos de impresoras que tenemos son las siguientes:
  • HP LaserJet 4700 Color
  • HP LaserJet 4600 Color
  • HP LaserJet 4250
Requerimientos del script:
  • awk
  • snmpwalk
  • A nivel de red, acceso al segmento de las impresoras.
  • bash
  • etc.
#!/bin/bash
# Martin Barriga 2012

# Default options
COMMUNITY="public"
HOSTNAME="127.0.0.1"
CONSUMMABLE="black"
WARNING=20
CRITICAL=10
SNMPVERSION=2c
SHEETCOUNT="0"
sheetcount=""

#used MIBs
MAINMIB="mib-2.43.11.1.1.6.1"
SHEETMIB="enterprises.11.2.3.9.4.2.1.4.1.10.5.1.1"

# Plugin return codes
STATE_OK=0
STATE_WARNING=1
STATE_CRITICAL=2
STATE_UNKNOWN=3

# Option processing
function phelp {
  echo -e "Usage: $0 -H  -C  -v  -o  -w  -c   [ -l | -s ] | -h "
  echo -e "  -H IP Addres HP Printer"
  echo -e "  -C SNMP Community. Default 'public'"
  echo -e "  -v SNMP Version. Default '2c'"
  echo -e "  -o Color Tonner: black, cyan, magenta, yellow, transfer, fuser. Default 'black'"
  echo -e "  -w Warning Value. Default '80'"
  echo -e "  -c Critical Value. Default '90'"
  echo -e "  -l List consumible support."
  echo -e "  -s Print with sheet count available."
  echo -e "  -h Help, this message.\n"
}

function list {
        allinfo=`snmpwalk -c $COMMUNITY -v $SNMPVERSION $HOSTNAME $MAINMIB`;
        echo "$allinfo" | ( while read line; do
                echo $line | cut -d "\"" -f2;
        done )
}

function withsheetcount {
        index=`echo "$1" | cut -d "." -f8`;
        count=`snmpwalk -c $COMMUNITY -v $SNMPVERSION $HOSTNAME $SHEETMIB.$index | cut -d " " -f4`;
        sheetcount=", Sheet Available: $count";
}

while getopts H:C:v:o:w:c:slh OPT
do
  case $OPT in
    H) HOSTNAME="$OPTARG" ;;
    C) COMMUNITY="$OPTARG" ;;
    v) SNMPVERSION="$OPTARG" ;;
    o) CONSUMMABLE="$OPTARG" ;;
    w) WARNING=$OPTARG ;;
    c) CRITICAL=$OPTARG ;;
    s) SHEETCOUNT="1" ;;
    l)
       list
       exit $STATE_UNKNOWN
    ;;
    h)
       phelp
       exit $STATE_UNKNOWN
    ;;
    #V)
    #  print_version
    #  exit $STATE_UNKNOWN
    #  ;;
   esac
done

info=`snmpwalk -c $COMMUNITY -v $SNMPVERSION $HOSTNAME $MAINMIB | grep -i $CONSUMMABLE`
if [ "$info" != "" ]; then
        name=`echo "$info" | cut -d "\"" -f 2`;
        mib=`echo "$info" | cut -d " " -f 1 | cut -d ":" -f 3`;
        newmib=`echo "$info" | cut -d " " -f 1 | cut -d ":" -f 3 | awk -F. -v OFS=. '{$6=8}1'`;
        size=`snmpwalk -c $COMMUNITY -v $SNMPVERSION $HOSTNAME $newmib | cut -d " " -f4`;
        newmib=`echo "$info" | cut -d " " -f 1 | cut -d ":" -f 3 | awk -F. -v OFS=. '{$6=9}1'`;
        value=`snmpwalk -c $COMMUNITY -v $SNMPVERSION $HOSTNAME $newmib | cut -d " " -f4`;
        let porcent=($value*100)/$size;

        #If sheet count is required
        if [ "$SHEETCOUNT" = "1" ]; then
                withsheetcount $mib
        fi

        if [ "$porcent" -le "$CRITICAL" ]; then
                echo "$name: Status: $value/$size $porcent% available [ CRITICAL ] | size=$size used=$value";
                exit $STATE_CRITICAL;
        else
                if [ "$porcent" -le "$WARNING" ]; then
                        echo "$name: Status: $value/$size $porcent% available [ WARNING ] | size=$size used=$value";
                        exit $STATE_WARNING;
                else
                        echo "$name: Status: $value/$size $porcent% available [ OK ] | size=$size used=$value";
                        exit $STATE_OK;
                fi
        fi
else
        echo "No se encuentra consumible $CONSUMMABLE en $HOSTNAME [ UNKNOW ]"
        exit $STATE_UNKNOWN
fi

martes, 24 de abril de 2012

LPIC en México


Debo comentar que me encuentro en los pasos finales de alcanzar el nivel 1 de LPIC (Linux Professional Institute Certification). Para lograr la certificación LPIC-1, es necesrio la acreditacion de dos examenes 101 y 102.

Hace meses mis dudas eran ¿Cuanto cuesta? ¿Donde me certifico? ¿Cuanto se tardan los resultados en llegar?. Despues de enviar varios correos en algunas empresas de México e instituciones LPI fuera de México y basandonos en mi propia experiencia les dejo mis propias respuestas.

¿Cuanto cuesta?
El precio por cada examen es $160 dolares, en este momento es algo asi como $2,100 pesos. En algunas empresas de México me llegaron a cotizar en $3,500 + iva, no voy a decir nombres. El pago se realiza con tarjeta.

¿Donde me certifico?
Amablemente personas de LPI España recomendaron que todo aspirante debera registrarse en algunos de los dos centros de certificacion internacional VUE y Prometric, en ambos casos se requiere un registro previo en la pagina Oficial de LPI, para que se genere un LPI ID. En los centros de certificacion, el aspirante debera de buscar un lugar donde pueda aplicar el examen mas cercano a su region o donde el quiera.

¿Cuanto se tardan los resultados en llegar?
Las empresas de México me comentaron que los paquetes se tenia que enviar a Brasil y que los resultados eran de 2 a 3 meses. En la Universidad donde realize el examen, me lo aplicaron en linea, y los resultados fueron inmediatamente despues de mi ultimo clic en el boton de finalizar.

¿Recomendaciones?
Estudiar mucho.

martes, 27 de marzo de 2012

Exportando M$ Active Directory a MySQL

El siguiente script me ayudo para exportar las cuentas de Active Directoy a una base de datos en MySql. El problema y/o interés surgió debido a la implementación de otrs, una solución para la gestión de servicios IT y help desk, donde se pretendía centralizar las cuentas locales de Active Directory como clientes en el contexto de la aplicación (otrs).
Para la solución de este problema (pensando en la automatización) había que hacer dos cosas, llenar la tabla de clientes con los datos de cada cuenta en la base de datos y cambiar el tipo de autentificación usando ldap.

Requisitos:
  • awk
  • openLdap
  • mysql-client

Script: ldap2mysql.sh

#!/bin/bash
# Martin Edmundo 2012
# Orden del listado AD: sn, givename, userPrincipalName

#Inicialización de variables
dbUser="otrs";
dbPasswd="/Gvxsn1CFaj5Q";
dbName="otrs";
let _i=0;

searchBase="DC=PGJ,DC=MICH";
bindDistinguishedName="account@domain";
ldapPasswd="AcbjdaIQ6P/9g";
ldapHost="ldap://172.16.1.2";

apellido="";
nombre="";
user="";

#Leemos el arbol completo de usuarios
tree=`ldapsearch -x -z 0 -b $searchBase -D $bindDistinguishedName -w $ldapPasswd "(objectclass=user)" -H $ldapHost | egrep "userPrincipalName|givenName|sn\: "`

#Leemos el ultimo customer_id que se tiene en la BD, sobre ese se incrementaran los siguientes INSERT
let lastCustomer=`mysql -u $dbUser -p$dbPasswd --database=$dbName --execute="select max(customer_id) as a from customer_user" | awk 'BEGIN{FS="\n"; RS="\n\n";}{print $2}' `

echo "$tree" | (
while read linea;
do
te_conozco=`echo $linea | cut -c1-2`
if [ "$te_conozco" = "sn" ]; then
apellido=`echo $linea | cut -f2 -d" "`;
fi
if [ "$te_conozco" = "gi" ]; then
nombre=`echo $linea | cut -f2 -d" "`;
fi
if [ "$te_conozco" = "us" ]; then
user=`echo $linea | cut -f2 -d" "`;
if [ "$apellido" != "" -a "$nombre" != "" ]; then
let lastCustomer+=1;
uid=`echo $user | cut -f1 -d"@"`
daleDale=`mysql -u $dbUser -p$dbPasswd --database=$dbName --execute="select login from customer_user where login='$uid'" | awk 'BEGIN{FS="\n"; RS="\n\n";}{print $2}'`

#Si la cuenta no esta ya registra en DB, se hace el INSERT
if [ "$daleDale" == "" ]; then
let _i+=1;
sqlStm="INSERT INTO customer_user (login, email, customer_id, pw, title, first_name, last_name, valid_id, create_time, create_by, change_time, change_by) VALUES ('$uid', 'informaticapgjmich@gmail.com',$lastCustomer, '', 'Importado por openLdap', '$nombre', '$apellido', 1, '2012-03-23 20:00:00', 1, '2012-03-23 20:00:00', 1)";
#echo "$sqlStm"
mysql -u $dbUser -p$dbPasswd --database=$dbName --execute="$sqlStm";
echo "*** Importado ($_i): $uid"
fi

fi
apellido="";
nombre="";
fi
done
)