miércoles, 13 de marzo de 2013

Crear usuarios en un directorio activo

Primero
Creamos un script llamado crear_usuario.vbs


strContainer = WScript.Arguments.Unnamed(0)
strName = WScript.Arguments.Unnamed(1)
strPasswd = WScript.Arguments.Unnamed(2)
strLogonScript= WScript.Arguments.Unnamed(3)
strGroup = WScript.Arguments.Unnamed(4)

'Conectarse
'***********************************************
Set objRootDSE = GetObject("LDAP://rootDSE")
If strContainer = "" Then
  Set objContainer = GetObject("LDAP://" & objRootDSE.Get("defaultNamingContext"))
Else
  Set objContainer = GetObject("LDAP://" & strContainer & "," & objRootDSE.Get("defaultNamingContext"))
End If

'Crear el usuario
'***********************************************
Set objUser = objContainer.Create("user", "cn=" & strName)
objUser.Put "sAMAccountName", strName
objUser.SetInfo

'Poner la clave de usuario
'-----------------------------------------------
Set objUser = GetObject("LDAP://cn=" & strName & "," & strContainer & "," & objRootDSE.Get("defaultNamingContext"))
objUser.SetPassword(strPassword)
objUser.scriptPath = strLogonScript
objUser.SetInfo

Wscript.Quit



Segundo
Llamamos al script para que cree los usuarios.
cscript crear_usuario.vbs "OU=admins,OU=IT" adminit clave123 script-usuarios.bat it-admins
cscript crear_usuario.vbs "OU=users,OU=IT" userit1 clave123 script-usuarios.bat it-users

Script para crear un grupo de usuarios que contenga todos los usuarios de una OU



Primero
creamos un script llamado crear_grupos.bat
@echo off
color 0a
cls
SET strContainer=%1
SET strMidominio=%2
SET GRUPO_SAMID=%3

SET UNIDAD_ORGANIZATIVA=%strContainer%,%strMidominio%
SET GRUPO=cn=%GRUPO_SAMID%,%UNIDAD_ORGANIZATIVA%

echo Create group alumnos
dsadd group %GRUPO% -samid %GRUPO_SAMID%

echo Add all member of OU to group 
dsquery user %UNIDAD_ORGANIZATIVA% | dsmod group %GRUPO% -addmbr

echo --------------------------------------------
dsquery user %UNIDAD_ORGANIZATIVA%
echo --------------------------------------------
dsquery user %GRUPO%
dsquery group %GRUPO% | dsget group -members

Segundo
llamamos al script para crear los grupos de usuarios.
rem Crear un grupo de usuarios que contenga todos los usuarios de una OU 
call crear_grupos.bat "OU=admins,OU=IT" "dc=midominio,dc=local" it-admins

rem Crear un grupo de usuarios que contenga todos los usuarios de una OU 
call crear_grupos.bat "OU=users,OU=IT" "dc=midominio,dc=local" it-users

Optimizar windows 7


He encontrado este script para optimizar maquinas virtuales windows 7 pero no recuerdo donde, de todas formas para que no se olvide aquí lo dejo.
rem Use this script for desktops _without_ View Persona Management implemented.
rem  Setting Default HKCU values by loading and modifying the default user registry hive
reg load "hku\temp" "%USERPROFILE%\..\Default User\NTUSER.DAT"
reg ADD "hku\temp\Software\Policies\Microsoft\Windows\Control Panel\Desktop" /v SCRNSAVE.EXE /d "%windir%\system32\scrnsave.scr" /f
reg ADD "hku\temp\Software\Policies\Microsoft\Windows\Control Panel\Desktop" /v ScreenSaveTimeOut /d "600" /f
reg ADD "hku\temp\Software\Policies\Microsoft\Windows\Control Panel\Desktop" /v ScreenSaverIsSecure /d "1" /f
reg ADD "hku\temp\Software\Microsoft\Windows\CurrentVersion\Policies\System" /v Wallpaper /d " " /f
reg ADD "hku\temp\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Cache" /v Persistent /t REG_DWORD /d 0x0 /f
reg ADD "hku\temp\Software\Microsoft\Feeds" /v SyncStatus /t REG_DWORD /d 0x0 /f
reg ADD "hku\temp\Software\Microsoft\WIndows\CurrentVersion\Policies\Explorer" /v HideSCAHealth /t REG_DWORD /d 0x1 /f
reg unload "hku\temp"

rem Making modifications to the HKLM hive 
reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Internet Explorer\Main" /v DisableFirstRunCustomize /t REG_DWORD /d 0x1 /f
reg ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters" /v EnableSuperfetch /t REG_DWORD /d 0x0 /f
reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows\WindowsUpdate\AU" /v NoAutoUpdate /t REG_DWORD /d 0x1 /f
reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows NT\SystemRestore" /v DisableSR /t REG_DWORD /d 0x1 /f
reg ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Disk" /v TimeOutValue /t REG_DWORD /d 200 /f
reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Image" /v Revision /t REG_SZ /d 1.0 /f

reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Image" /v Virtual /t REG_SZ /d Yes /f
reg ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application" /v MaxSize /t REG_DWORD /d 0x100000 /f
reg ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Application" /v Retention /t REG_DWORD /d 0x0 /f
reg ADD "HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Network\NewNetworkWindowOff" /f
reg ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\System" /v MaxSize /t 

REG_DWORD /d 0x100000 /f
reg ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\System" /v Retention /t REG_DWORD /d 0x0 /f
reg ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security" /v MaxSize /t REG_DWORD /d 0x100000 /f
reg ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\eventlog\Security" /v Retention /t REG_DWORD /d 0x0 /f
reg ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl" /v CrashDumpEnabled /t REG_DWORD /d 0x0 /f
reg ADD "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer" /v NoRecycleFiles /t REG_DWORD /d 0x1 /f
reg ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0x0 /f
reg ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v UserAuthentication /t REG_DWORD /d 0x0 /f
reg ADD "HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\policies\system" /v EnableLUA /t REG_DWORD /d 0x0 /f
reg Add "HKEY_LOCAL_MACHINE\Software\Policies\Microsoft\Windows\Sideshow" /v Disabled /t REG_DWORD /d 0x1 /f

rem Using Powershell to perform Windows Services modifications
Powershell Set-Service 'BDESVC' -startuptype "disabled"
Powershell Set-Service 'wbengine' -startuptype "disabled"
Powershell Set-Service 'DPS' -startuptype "disabled"
Powershell Set-Service 'UxSms' -startuptype "disabled"
Powershell Set-Service 'Defragsvc' -startuptype "disabled"
Powershell Set-Service 'HomeGroupListener' -startuptype "disabled"
Powershell Set-Service 'HomeGroupProvider' -startuptype "disabled"
Powershell Set-Service 'iphlpsvc' -startuptype "disabled"
Powershell Set-Service 'MSiSCSI' -startuptype "disabled"
Powershell Set-Service 'swprv' -startuptype "disabled"
Powershell Set-Service 'CscService' -startuptype "disabled"
Powershell Set-Service 'SstpSvc' -startuptype "disabled"
Powershell Set-Service 'wscsvc' -startuptype "disabled"
Powershell Set-Service 'SSDPSRV' -startuptype "disabled"
Powershell Set-Service 'SysMain' -startuptype "disabled"
Powershell Set-Service 'TabletInputService' -startuptype "disabled"
Powershell Set-Service 'Themes' -startuptype "disabled"
Powershell Set-Service 'upnphost' -startuptype "disabled"
Powershell Set-Service 'VSS' -startuptype "disabled"
Powershell Set-Service 'SDRSVC' -startuptype "disabled"
Powershell Set-Service 'WinDefend' -startuptype "disabled"
Powershell Set-Service 'WerSvc' -startuptype "disabled"
Powershell Set-Service 'MpsSvc' -startuptype "disabled"
Powershell Set-Service 'ehRecvr' -startuptype "disabled"
Powershell Set-Service 'ehSched' -startuptype "disabled"
Powershell Set-Service 'WSearch' -startuptype "disabled"
Powershell Set-Service 'wuauserv' -startuptype "disabled"
Powershell Set-Service 'Wlansvc' -startuptype "disabled"
Powershell Set-Service 'WwanSvc' -startuptype "disabled"

rem Making miscellaneous modifications
bcdedit /set BOOTUX disabled
vssadmin delete shadows /All /Quiet
Powershell disable-computerrestore -drive c:\
netsh advfirewall set allprofiles state off
powercfg -H OFF
net stop "sysmain"
fsutil behavior set DisableLastAccess 1

rem Making modifications to Scheduled Tasks
schtasks /change /TN "\Microsoft\Windows\Defrag\ScheduledDefrag" /Disable
schtasks /change /TN "\Microsoft\Windows\SystemRestore\SR" /Disable
schtasks /change /TN "\Microsoft\Windows\Registry\RegIdleBackup" /Disable
schtasks /change /TN "\Microsoft\Windows Defender\MPIdleTask" /Disable
schtasks /change /TN "\Microsoft\Windows Defender\MP Scheduled Scan" /Disable
schtasks /change /TN "\Microsoft\Windows\Maintenance\WinSAT" /Disable

Script para cambiar la clave de un usuario del directorio activo


Un sencillo script en visual basic script para realizar el cambio de contraseñas automatizado
Option Explicit
Dim objOU, objUser, objRootDSE
Dim strContainer, strDNSDomain, strPassword, strName

Set objRootDSE = GetObject("LDAP://RootDSE")
strDNSDomain = objRootDSE.Get("DefaultNamingContext")
' -----------------------------------------------'
strContainer = WScript.Arguments.Unnamed(1)
strName = WScript.Arguments.Unnamed(0)
strPassword = WScript.Arguments.Unnamed(2)
If strContainer = "" Then
  Set objUser = GetObject("LDAP://cn=" & strName & "," & _
objRootDSE.Get("defaultNamingContext"))
Else
  Set objUser = GetObject("LDAP://cn=" & strName & "," & strContainer & "," & _
    objRootDSE.Get("defaultNamingContext"))
End If
objUser.SetPassword(strPassword)
objUser.SetInfo
WScript.Quit

Podemos utilizar el script para cambiar una clave o hacer otro script que llame al primero para cambiar claves a mas de un usuario
cscript resetear_clave.vbs usuario01 "OU=SUB-CARPETA,OU=CARPETA" NuevaClave
cscript resetear_clave.vbs usuario02 "OU=SUB-CARPETA,OU=CARPETA" NuevaClave
cscript resetear_clave.vbs usuario03 "OU=SUB-CARPETA,OU=CARPETA" NuevaClave
·
·
·

martes, 12 de marzo de 2013

Backup programado de los equipos CISCO usando TFTP

A veces se nos puede olvidar realizar el típico write mem o copy running-config startup-config y ya no te digo nada si tienes que copiar la configuración al servidor tftp (que si no me acuerdo de la IP, ...).

Por eso puedes tomar la decisión de que todos los días se guarde la configuración actual "copy runnig-config startup-config" y además esta configuración la copiamos a un servidor TFTP.

La variable $h indica el nombre del host (router, switch, ...). Recomiento aprovechar para crear carpetas en el servidor TFTP, una para cada host.

La variable $t indica la fecha y hora a la que se realiza la copia de la configuración.


De esta forma obligamos a que se guarde una copia de la configuracion cada vez que realizamos write mem.
archive
 path tftp://IP_SERVIDOR_TFTP/$h/$h-$t
 write-memory


Programamos una tarea que guarda la configuración que se esta ejecutando:

kron policy-list backup
 cli write memory

Programamos la ejecución de la tarea a las 0h todos los días:
kron occurrence backup at 0:00 recurring
 policy-list backup

En principio todas las configuraciones son texto y no deberían ocupar mucho pero si programamos una copia al día son 365 configuraciones al año. Tened cuidado con que no se llene el servidor TFTP, pues dejaría de hacer copias de las configuraciones.


Bibliografía:
http://www.cisco.com/en/US/products/sw/iosswrel/ps1835/products_tech_note09186a008020260d.shtml#ab
http://www.certificationkits.com/cisco-certification/Cisco-CCNP-TSHOOT-Complex-Network-Maintenance.html

jueves, 7 de marzo de 2013

Servidor TFTP en Ubuntu con permisos de escritura

Mucho hardware de red todavía utiliza TFTP para subir y bajar configuraciones y para copiar firmware, etc.
Existen pequeños programas para windows que como administrador de sistemas te sacan del apuro cundo los necesitas, pero en este articulo trataremos de explicar como configurar un servidor TFTP en Ubuntu.


Elegimos tftpd-hpa por que no tiene limitacion de 32MB (atftpd la tiene) y por que permite que utilicemos los comandos put y get.

Instalamos el cliente tftp, y los demonios tftpd-hpa y xinetd
apt-get install tftp tftpd-hpa xinetd

Una vez instalado configuramos los siguiente archivos de la siguiente manera:
root@hostname:~# nano /etc/default/tftpd-hpa
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
#la opción --create es la que permite                               #que se puedan crear archivos cuando realizamos put
TFTP_OPTIONS="--secure --create"



root@hostname:~#nano /etc/inetd.conf
#FIJAROS QUE ESTA TODO COMENTADO
# /etc/inetd.conf:  see inetd(8) for further informations.
#
# Internet superserver configuration database
#
#
# Lines starting with "#:LABEL:" or "#<off>#" should not
# be changed unless you know what you are doing!
#
# If you want to disable an entry so it isn't touched during
# package updates just comment it out with a single '#' character.
#
# Packages should modify this file by using update-inetd(8)
#
# <service_name> <sock_type> <proto> <flags> <user> <server_path> <args>
#
#:INTERNAL: Internal services
#discard                stream  tcp     nowait  root    internal
#discard                dgram   udp     wait    root    internal
#daytime                stream  tcp     nowait  root    internal
#time           stream  tcp     nowait  root    internal
#:STANDARD: These are standard services.
#:BSD: Shell, login, exec and talk are BSD protocols.
#:MAIL: Mail, news and uucp services.
#:INFO: Info services
#:BOOT: TFTP service is provided primarily for booting.  Most sites
#       run this only on machines acting as "boot servers."
#:RPC: RPC based services
#:HAM-RADIO: amateur-radio services
#:OTHER: Other services

Por si acaso alguno tiene iniciativa recordar que NO hay que crear un archivo dentro de la ruta /etc/xinet.d/tftpd o algo parecido

A continuación creamos los directorios necesarios y asignamos los  permisos adecuados.
root@hostname:~# sudo mkdir /var/lib/tftpboot
root@hostname:~# sudo chmod -vfR 777 /var/lib/tftpboot
root@hostname:~# sudo chown -vfR tftp:tftp /var/lib/tftpboot

Reiniciamos los servicios
root@hostname:~# sudo service xinetd stop;sudo service tftpd-hpa stop;sudo service tftpd-hpa start;sudo service xinetd start

Comprobamos que se esta ejecutando el servicio TFTPD
root@hostname:~# ps -aux | grep tftpd
root     29285  0.0  0.0  15088   332 ?        Ss   20:07   0:00 /usr/sbin/in.tftpd --listen --user tftp --address 0.0.0.0:69 --secure --create /var/lib/tftpboot
root@hostname:~# netstat -nap | grep tftp
udp        0      0 0.0.0.0:69              0.0.0.0:*                           29285/in.tftpd
unix  2      [ ]         DGRAM                    98078    29285/in.tftpd

Ahora podemos probar el tftp con el cliente
root@hostname:~# tftp 127.0.0.1
tftp> ?
Commands may be abbreviated.  Commands are:

connect         connect to remote tftp
mode            set file transfer mode
put             send file
get             receive file
quit            exit tftp
verbose         toggle verbose mode
trace           toggle packet tracing
status          show current status
binary          set mode to octet
ascii           set mode to netascii
rexmt           set per-packet retransmission timeout
timeout         set total retransmission timeout
?               print help information
tftp> get prueba1.txt
Received 9350 bytes in 0.0 seconds
tftp> put prueba2.txt
Sent 9350 bytes in 0.0 seconds

tftp> quit




Servidor FTP en Ubuntu con permisos de escritura

Instalamos los paquetes necesarios:
sudo apt-get install vsftpd
Des-habilitamos los usuarios que no nos interesa que accedan a través del protocolo FTP.

more /etc/pam.d/vsftpd
# Standard behaviour for ftpd(8).
auth    required        pam_listfile.so item=user sense=deny file=/etc/ftpusers onerr=succeed
# Note: vsftpd handles anonymous logins on its own. Do not enable pam_ftp.so.
# Standard pam includes
@include common-account
@include common-session
@include common-auth
auth    required        pam_shells.so


nano /etc/ftpusers
# /etc/ftpusers: list of users disallowed FTP access. See ftpusers(5).

root
daemon
bin
sys
sync
games
man
lp
mail
news
uucp
nobody

Modificamos el archivo de configuración para permitir que los usuarios del sistema accedan y su máscara por defecto sea rwxrwxrwx
nano /etc/vsftpd.conf

listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
syslog_enable=YES
connect_from_port_20=YES
ftpd_banner=Servidor FTP
chroot_local_user=YES
secure_chroot_dir=/var/run/vsftpd/empty
pam_service_name=vsftpd
rsa_cert_file=/etc/ssl/private/vsftpd.pem
local_umask=000

A veces me ha pasado que he tenido que eliminar la configuración PAM para vsftpd (Suele dar problemas, no se si es un bug)

rm /etc/pam.d/vsftpd
nano /etc/vsftpd.conf
#pam_service_name=vsftpd

Reiniciamos el demonio ftp y listo, ya tenemos funcionando un servidor FTP

service vsftpd restart

Mi recomendación para crear los usuarios y que todo funcione bien (permisos etc) es la siguiente:

Cuando creemos los usuarios tendremos que mantener la siguiente estructura.

dirFTP (r-xr-xr-x)
   |__dirusuarioA (r-xr-xr-x)
         |__dirconpermisosdeescritura(rwxrwxrwx)

   |__dirusuarioB (r-xr-xr-x)
         |__dirconpermisosdeescritura(rwxrwxrwx)
   ·
   ·
   ·

   |__dir usuario Z (r-xr-xr-x)
         |__dir con permisos de escritura(rwxrwxrwx)



El shell de los usuarios lo suelo poner a /usr/sbin/nologin por seguridad.
El directorio /home del usuario A sería /home/dirFTP/dirusuarioA
El usuario A cuando se conecta por FTP tiene que ver una única carpeta llamada dirconpermisosdeescritura y es en esta carpeta en la única que podrá subir archivos o crear carpetas etc.

ftp://usuario:clave123@ip_servidor_FTP/

Plugin nagios para enviar notificaciones html por correo


Modificaciones del plugin nagios "notify-html-email" para enviar notificaciones html por correo.

He modificado el plugin para que aparezcan mis gráficas pnpnagios dentro del correo, castellanizarlo, etc.

Un ejemplo de como queda:


Hay que recordar que en ubuntu no viene instalado por defecto la libreria MIME lite Perl pero se puede instalar facilmente desde:

apt-get install libmime-lite-perl

El comando que hay que definir en nagios debería ser algo asi:
/usr/bin/perl $USER1$/notify-html-email $USER6$

$USER1$ es el directorio de plugins
$USER6$ es la url de acceso a nagios
estas variables se definen en el archivo /etc/nagios3/resources.cfg

Aquí dejo el script modificado

#!/usr/bin/perl

use strict;
use warnings;

use MIME::Lite;
use URI::Escape;

my $nagios_url = $ARGV[0] || die('You must pass the url to your nagios installation as the first argument'); 

my $color_red    = '#FF8080';
my $color_green  = '#80FF80';
my $color_yellow = '#FFFF80';
my $color_orange = '#FF9900';
my $color_even   = '#C9C9C9';
my $color_odd    = '#EAEAEA';

my %colors=(
    'PROBLEM'         => $color_red,
    'RECOVERY'        => $color_green,
    'ACKNOWLEDGEMENT' => $color_yellow,
    'CRITICAL'        => $color_red,
    'WARNING'         => $color_yellow,
    'OK'              => $color_green,
    'UNKNOWN'         => $color_orange,
    'UP'              => $color_green,
    'DOWN'            => $color_red,
    'UNREACHABLE'     => $color_orange,
);

my %allowed_types = (
    'PROBLEM'         => 1,
    'RECOVERY'        => 1,
    'ACKNOWLEDGEMENT' => 1
);

exit if !defined($allowed_types{$ENV{NAGIOS_NOTIFICATIONTYPE}});
my $type = $ENV{NAGIOS_SERVICEATTEMPT} ? 'service' : 'host';

my $font = 'helvetica, arial';
my $style_th_even = '"background-color: #c9c9c9; font-weight: bold; width: 130px;"';
my $style_th_odd  = '"background-color: #eaeaea; font-weight: bold; width: 130px;"';
my $style_td_even = '"background-color: #c9c9c9;"';
my $style_td_odd  = '"background-color: #eaeaea;"';
my $style_table   = "\"background-color: #000000; font-family: consolas, verdana, arial; font-size: 12px;\"";
my $style_body   = "\"background-color: #ffffff;\"";

my $style_state = sprintf('"background-color: %s"', 
    $type eq 'service'
    ? $colors{$ENV{NAGIOS_SERVICESTATE}}
    : $colors{$ENV{NAGIOS_HOSTSTATE}}
);

my $subject = sprintf('[EMPRESA] %s [%s] ',
    $type eq 'service' ? $ENV{NAGIOS_HOSTNAME} . ' - ' . $ENV{NAGIOS_SERVICEDESC} : $ENV{NAGIOS_HOSTNAME},
    $type eq 'service' ? $ENV{NAGIOS_SERVICESTATE} : $ENV{NAGIOS_HOSTSTATE}
);

my $host_url = sprintf('%s/cgi-bin/status.cgi?navbarsearch=1&host=%s',
    $nagios_url,
    $ENV{NAGIOS_HOSTNAME}
);
my @rows;
my $notification_title;

if($type eq 'service') {
    my $service_url = sprintf('%s/cgi-bin/extinfo.cgi?type=2&host=%s&service=%s',
        $nagios_url,
        $ENV{NAGIOS_HOSTNAME},
        uri_escape($ENV{NAGIOS_SERVICEDESC})
    );
    my $service_perf_image_url = sprintf('%s/../../pnp4nagios/graph?host=%s&srv=%s',
        $nagios_url,
        $ENV{NAGIOS_HOSTNAME},
        uri_escape($ENV{NAGIOS_SERVICEDESC})
    );
    $notification_title = sprintf('Notificacion de Servicio - %s (%s)',
$ENV{NAGIOS_SERVICESTATE},
$ENV{NAGIOS_SERVICESTATETYPE}
    );

    @rows = (
        {
            'title' => 'Estado:',
            'data'  => "$ENV{NAGIOS_SERVICESTATE} ($ENV{NAGIOS_SERVICESTATETYPE})",
            'style' => $style_state,
        },
        { 
            'title' => 'Equipo:',
            'data'  => "<a href=\"$host_url\">$ENV{NAGIOS_HOSTNAME}</a> ($ENV{NAGIOS_HOSTALIAS}) $ENV{NAGIOS_HOSTGROUPNAME}",
        },
        { 
            'title' => 'Direccion IP:',
            'data'  => $ENV{NAGIOS_HOSTADDRESS},
        },
        { 
            'title' => 'Servicio:',
            'data'  => "<a href=\"$service_url\">$ENV{NAGIOS_SERVICEDESC}</a> ($ENV{NAGIOS_SERVICEDISPLAYNAME})",
        },
        {
            'title' => 'Chequeo del Servicio',
            'data'  => "$ENV{NAGIOS_SERVICEOUTPUT}",
        },
        {
            'title' => 'Momento del evento:',
            'data'  => $ENV{NAGIOS_SHORTDATETIME},
        },
        {
            'title' => 'PNP4Nagios:',
            'data'  => "<a href=\"$service_perf_image_url\">Visualizar graficos</a>",
        },
    );
} else {
    my $host_perf_image_url = sprintf('%s/../../pnp4nagios/graph?host=%s&srv=_HOST_',
        $nagios_url,
        $ENV{NAGIOS_HOSTNAME},
        uri_escape($ENV{NAGIOS_SERVICEDESC})
    );
    $notification_title = sprintf('Notificacion de Equipo - %s (%s)',
$ENV{NAGIOS_HOSTSTATE},
$ENV{NAGIOS_HOSTSTATETYPE}
    );

    @rows = (
        {
            'title' => 'Estado:',
            'data'  => "$ENV{NAGIOS_HOSTSTATE} ($ENV{NAGIOS_HOSTSTATETYPE})",
            'style' => $style_state,
        },

            'title' => 'Equipo:',
            'data'  => "<a href=\"$host_url\">$ENV{NAGIOS_HOSTNAME}</a> ($ENV{NAGIOS_HOSTALIAS}) $ENV{NAGIOS_HOSTGROUPNAME}",
        },
        { 
            'title' => 'Direccion IP:',
            'data'  => $ENV{NAGIOS_HOSTADDRESS},
        },
        {
            'title' => 'Chequeo del equipo:',
            'data'  => $ENV{NAGIOS_HOSTOUTPUT},
        },
        {
            'title' => 'PNP4Nagios:',
            'data'  => "<a href=\"$host_perf_image_url\">Visualizar graficos</a>",
        },
    );
}

if($ENV{NAGIOS_NOTIFICATIONTYPE} eq 'ACKNOWLEDGEMENT') {
    push(@rows,
        {
            'title' => 'Reconocido por:',
            'data'  => $ENV{NAGIOS_NOTIFICATIONAUTHORALIAS},
        }
    );
    push(@rows,
        {
            'title' => 'Comentario:',
            'data'  => $ENV{NAGIOS_NOTIFICATIONCOMMENT},
        }
    );
}

# Begin the email
my $body = "
<body style=$style_body>
<h2 style=\"text-align:center; font-family: verdana, arial; color: #203040\">Monitorizacion Nagios</h2>
<p style=\"text-align:center; font-family: verdana, arial; color: #404040\">$notification_title</p>
<table align=\"center\" border=\"0\" cellpadding=\"4\" cellspacing=\"2\" style=$style_table>";

# Add the rows to the email
for(my $i=0; $i<@rows; $i++) {
    $body .= sprintf('<tr><th style=%s>%s</th><td style=%s>%s</td></tr>',
        $i % 2 == 0 ? $style_th_even : $style_th_odd,
        $rows[$i]->{'title'},
        defined($rows[$i]->{'style'}) ? $rows[$i]->{'style'} : $i % 2 == 0 ? $style_td_even : $style_td_odd,
        $rows[$i]->{'data'}
    );
}
$body .= "</table><p style=\"text-align:center\"><img src=\"cid:lgNextel.png\" height=\"30px\"></body>";

my $msg = MIME::Lite->new(
    To      => $ENV{NAGIOS_CONTACTEMAIL},
    Subject => $subject,
    Type    =>'multipart/related'
);

$msg->attach(Type => 'text/html', Data => $body);
$msg->attach(Type => 'image/png', Id   => 'lgNextel.png', Path => '/var/www/img/lgNextel.png');


$msg->send();