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
)

jueves, 2 de junio de 2011

Construcción de Plugin Nagios/Centreon para inodos

En esta ocación quiero compartir con ustedes un plugin muy básico para revisar el estado de los inodos en un FileSystem remoto a nuestro servidor de monitorio Nagios vía SNMP.

Para conseguir que el agente SNMP, nos pueda regresar información de los i-nodos de su sistema se requiere autorización, eso lo hacemos con el atributo "disk" y como parámetro se me envía cada uno de los FileSystem que deseamos monitorear. Esto seria agregando por ejemplo unas lineas al archivo snmpd.conf como las que siguen:

disk /
disk /home

Ya con este cambio solo queda reiniciar el servicio. Se puede verificar con el comando snmpwalk o el plugin que tenemos, desde el servidor de monitoreo o NMS.


#!/bin/bash
#check_snmp_inodes.sh
# Argumentos:
# 1. Community
# 2. Version
# 3. IP Address
# 4. FS
# 5. warning
# 6. critical
if [ $# -eq 6 ]; then
#Se localiza el indice del FS
isExist=`snmpwalk -c $1 -v $2 $3 dsktable | grep -e "$4$" | wc -l`
if [ $isExist -eq 1 ]; then
index=`snmpwalk -c $1 -v $2 $3 dsktable | grep -e "$4$" | awk 'BEGIN{FS="."}{print $2}' | awk '{print $1}'`
uso=`snmpwalk -c $1 -v $2 $3 .1.3.6.1.4.1.2021.9.1.10.$index | awk '{print $4}'`
valor=""
#Menor que
if [ $uso -lt $5 ]; then
echo "I-nodos OK $4 Esta usando $uso% de sus inodos | size=100 used=$uso"
exit 0
else
if [ $uso -lt $6 ]; then
echo "I-nodos WARNING $4 Esta usando $uso% de sus inodos | size=100 used=$uso"
exit 1
else
echo "I-nodos CRITICAL $4 Esta usando $uso% de sus inodos | size=100 used=$uso"
exit 2
fi
fi
echo "I-nodos $valor: $4 Esta usando $uso% de sus inodos | size=100 used=$uso"
exit 0
else
echo "No existe el FileSystem $4"
exit 3
fi

else
echo "Error en el paso de parametros"
exit 3
fi