Nagios Core Tutorial – Instala, configura y usa

Nagios Core, la poderosa herramienta opensource de monitoreo es el tema del articulo de hoy.

Te mostrare como instalar, configurar y comenzar a usar Nagios Core en un servidor Linux paso a paso y en español. Comenzamos?

Que es Nagios y como funciona?

Nagios es una herramienta de software de código abierto que nos permite monitorear hardware y software de equipos.

Esta herramienta opensource esta diseñada de forma modular permitiéndonos personalizar alertas y chequeos por medio de plugins.

Que puerto usa nagios?

Nagios como servidor de monitoreo se utiliza desde una consola web, dependiendo de tu configuracion te conectaras por http (puerto tcp 80) o https (puerto tcp 443).

Debemos aclarar que los agentes o servicios a los que Nagios se conecte en los equipos monitoreados seguramente serán diferentes.

Que puede monitorear nagios?

Por medio de de sus plugins o los que tu puedes desarrollar o personalizar podemos monitorear diferentes equipos y servicios.

Hardware (impresoras, UPS, servidores, switches, etc), ya sea por medio del protocolo SNMP o servicios con la ayuda de puertos y protocolos.

Como instalar nagios en centos 7

Por medio de repositorios podemos instalar Nagios en Centos, pero mi recomendación es que vayamos directo a la fuente.

Puede que nos demoremos un poco mas, pero al final tendremos la ultima versión disponible de Nagios Core.

Algo mas, es importante usar solo para Nagios este servidor Linux, así no tendremos problemas con otros servicios.

Instalamos dependencias para Nagios en Centos Linux.

yum install gd gd-devel gcc make glibc glibc-common wget unzip net-snmp* openssh-server httpd which file gnutls-devel postgresql-devel perl-DBI less openldap-devel mysql-devel mysql-libs freeradius-devel bind-utils rpcbind samba-client sudo postfix php php-gd

Prefieres verlo en vídeo? Aquí debajo te comparto la instalación de Nagios y plugins en Centos Linux.

No olvides suscribirte a mi canal 👈

Nagios Tutorial español. Instalación y configuracion en Centos Linux

Seguidamente instalamos el repositorio Epel para instalar dependencias que no encontramos en los repo defaults.

yum install epel-release
yum install fping qstat
yum install "perl(Net::SNMP)"

Creación de usuario y grupos de Nagios

Por motivos de seguridad Nagios debe tener su propio usuario y grupo.

Ademas de eso, tener un grupo para ejecutar scripts o plugins a nombre de nuestro servidor web.

Creamos usuario Nagios y le activamos una contraseña

useradd -m nagios
passwd nagios

Seguidamente creamos el grupo nagcmd para ejecutar scripts o plugins y lo agregamos a los grupos nagios y apache.

groupadd nagcmd
usermod -a -G nagcmd nagios
usermod -a -G nagcmd apache

Es muy importante tener el grupo nagcmd ya que Nagios ejecutara sus chequeos desde el.

Descargamos Nagios Core y Nagios plugins

Navegamos al sitio oficial y descargamos los paquetes de Nagios Core y Nagios plugins en su ultima versión.

wget -c https://assets.nagios.com/downloads/nagioscore/releases/nagios-4.4.3.tar.gz
wget -c https://nagios-plugins.org/download/nagios-plugins-2.2.1.tar.gz

Compilamos codigo fuente de Nagios Core

Ya con los tar.gz en el disco del servidor, descomprimimos el archivo de nagios core y entramos a su directorio.

tar xzvf nagios-4.4.3.tar.gz
cd nagios-4.4.3

Ejecutamos configure pasandole de parámetro el grupo nagcmd.

Este comando nos dirá si nos falta alguna dependencia y debe ejecutarse sin errores.

./configure --with-command-group=nagcmd
checking for a BSD-compatible install... /usr/bin/install -c
checking build system type... x86_64-pc-linux-gnu
checking host system type... x86_64-pc-linux-gnu
checking for gcc... gcc
checking whether the C compiler works... yes
checking for C compiler default output file name... a.out
checking for suffix of executables...
checking whether we are cross compiling... no
checking for suffix of object files... o
checking whether we are using the GNU C compiler... yes
checking whether gcc accepts -g... yes
checking for gcc option to accept ISO C89... none needed
checking whether make sets $(MAKE)... yes
checking whether ln -s works... yes
checking for strip... /usr/bin/strip
checking how to run the C preprocessor... gcc -E
checking for grep that handles long lines and -e... /usr/bin/grep
checking for egrep... /usr/bin/grep -E
checking for ANSI C header files... yes
checking whether time.h and sys/time.h may both be included... yes
checking for sys/wait.h that is POSIX.1 compatible... yes
checking for sys/types.h... yes
checking for sys/stat.h... yes
checking for stdlib.h... yes
checking for string.h... yes
checking for memory.h... yes
checking for strings.h... yes
checking for inttypes.h... yes
checking for stdint.h... yes
checking for unistd.h... yes
checking arpa/inet.h usability... yes
checking arpa/inet.h presence... yes
checking for arpa/inet.h... yes
checking ctype.h usability... yes
checking ctype.h presence... yes
checking for ctype.h... yes
checking dirent.h usability... yes
checking dirent.h presence... yes
checking for dirent.h... yes
checking errno.h usability... yes
checking errno.h presence... yes
checking for errno.h... yes
checking fcntl.h usability... yes
checking fcntl.h presence... yes
checking for fcntl.h... yes
checking getopt.h usability... yes
checking getopt.h presence... yes
checking for getopt.h... yes
checking grp.h usability... yes
checking grp.h presence... yes
checking for grp.h... yes
checking libgen.h usability... yes
checking libgen.h presence... yes
checking for libgen.h... yes
checking limits.h usability... yes
checking limits.h presence... yes
checking for limits.h... yes
checking math.h usability... yes
checking math.h presence... yes
checking for math.h... yes
checking netdb.h usability... yes
checking netdb.h presence... yes
checking for netdb.h... yes
checking netinet/in.h usability... yes
checking netinet/in.h presence... yes
checking for netinet/in.h... yes
checking pwd.h usability... yes
checking pwd.h presence... yes
checking for pwd.h... yes
checking regex.h usability... yes
checking regex.h presence... yes
checking for regex.h... yes
checking signal.h usability... yes
checking signal.h presence... yes
checking for signal.h... yes
checking socket.h usability... no
checking socket.h presence... no
checking for socket.h... no
checking stdarg.h usability... yes
checking stdarg.h presence... yes
checking for stdarg.h... yes
checking for string.h... (cached) yes
checking for strings.h... (cached) yes
checking sys/loadavg.h usability... no
checking sys/loadavg.h presence... no
checking for sys/loadavg.h... no
checking sys/mman.h usability... yes
checking sys/mman.h presence... yes
checking for sys/mman.h... yes
checking for sys/types.h... (cached) yes
checking sys/time.h usability... yes
checking sys/time.h presence... yes
checking for sys/time.h... yes
checking sys/resource.h usability... yes
checking sys/resource.h presence... yes
checking for sys/resource.h... yes
checking for sys/wait.h... (cached) yes
checking sys/socket.h usability... yes
checking sys/socket.h presence... yes
checking for sys/socket.h... yes
checking for sys/stat.h... (cached) yes
checking sys/timeb.h usability... yes
checking sys/timeb.h presence... yes
checking for sys/timeb.h... yes
checking sys/un.h usability... yes
checking sys/un.h presence... yes
checking for sys/un.h... yes
checking sys/ipc.h usability... yes
checking sys/ipc.h presence... yes
checking for sys/ipc.h... yes
checking sys/msg.h usability... yes
checking sys/msg.h presence... yes
checking for sys/msg.h... yes
checking sys/poll.h usability... yes
checking sys/poll.h presence... yes
checking for sys/poll.h... yes
checking syslog.h usability... yes
checking syslog.h presence... yes
checking for syslog.h... yes
checking uio.h usability... no
checking uio.h presence... no
checking for uio.h... no
checking for unistd.h... (cached) yes
checking locale.h usability... yes
checking locale.h presence... yes
checking for locale.h... yes
checking wchar.h usability... yes
checking wchar.h presence... yes
checking for wchar.h... yes
checking sys/prctl.h usability... yes
checking sys/prctl.h presence... yes
checking for sys/prctl.h... yes
checking for an ANSI C-conforming const... yes
checking whether struct tm is in sys/time.h or time.h... time.h
checking for struct tm.tm_zone... yes
checking for mode_t... yes
checking for pid_t... yes
checking for size_t... yes
checking return type of signal handlers... void
checking for uid_t in sys/types.h... yes
checking type of array argument to getgroups... gid_t
checking what the operating system is ... linux
checking what the distribution type is ... rhel
checking what init system is being used ... systemd
checking what inetd is being used ... systemd
checking for which paths to use ... default
checking for which init file to use ... default-service
checking for which inetd files to use ... default-socket
checking for va_copy... yes
checking for vsnprintf... yes
checking for snprintf... yes
checking for asprintf... yes
checking for vasprintf... yes
checking for sigaction... yes
checking for C99 vsnprintf... yes
checking for library containing getservbyname... none required
checking for library containing connect... none required
checking for initgroups... yes
checking for setenv... yes
checking for strdup... yes
checking for strstr... yes
checking for strtoul... yes
checking for unsetenv... yes
checking for type of socket size... size_t
checking for library containing nanosleep... none required
checking for mail... no
which: no mail in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
which: no sendmail in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
checking for RLIMIT_PROC... yes
checking for glibc at least version 2.4... yes
checking sys/epoll.h usability... yes
checking sys/epoll.h presence... yes
checking for sys/epoll.h... yes
checking sys/select.h usability... yes
checking sys/select.h presence... yes
checking for sys/select.h... yes
checking for main in -liconv... no
checking for gdImagePng in -lgd (order 1)... no
checking for gdImagePng in -lgd (order 2)... yes
checking for GD library... yes
checking for gdImageCreateTrueColor in -lgd... yes
checking ltdl.h usability... no
checking ltdl.h presence... no
checking for ltdl.h... no
checking dlfcn.h usability... yes
checking dlfcn.h presence... yes
checking for dlfcn.h... yes
checking for dlopen in -ldl... yes
checking for extra flags needed to export symbols... -Wl,-export-dynamic
checking for linker flags for loadable modules... -shared
checking for traceroute... no
checking for type va_list... yes
checking for perl... /usr/bin/perl
checking for unzip... /usr/bin/unzip
configure: creating ./config.status
config.status: creating html/index.php
config.status: creating Makefile
config.status: creating lib/Makefile
config.status: creating base/Makefile
config.status: creating common/Makefile
config.status: creating contrib/Makefile
config.status: creating cgi/Makefile
config.status: creating html/Makefile
config.status: creating module/Makefile
config.status: creating worker/Makefile
config.status: creating worker/ping/Makefile
config.status: creating xdata/Makefile
config.status: creating subst
config.status: creating pkginfo
config.status: creating startup/openrc-init
config.status: creating startup/default-init
config.status: creating startup/default-service
config.status: creating startup/upstart-init
config.status: creating t/Makefile
config.status: creating t-tap/Makefile
config.status: creating include/config.h
config.status: include/config.h is unchanged
config.status: creating lib/snprintf.h
config.status: lib/snprintf.h is unchanged
config.status: creating lib/iobroker.h
config.status: lib/iobroker.h is unchanged

Creating sample config files in sample-config/ ...

*** Configuration summary for nagios 4.4.3 2019-01-15 ***:

General Options:
-------------------------
Nagios executable: nagios
Nagios user/group: nagios,nagios
Command user/group: nagios,nagcmd
Event Broker: yes
Install ${prefix}: /usr/local/nagios
Install ${includedir}: /usr/local/nagios/include/nagios
Lock file: /run/nagios.lock
Check result directory: /usr/local/nagios/var/spool/checkresults
Init directory: /lib/systemd/system
Apache conf.d directory: /etc/httpd/conf.d
Mail program: /bin/mail
Host OS: linux-gnu
IOBroker Method: epoll

Web Interface Options:
------------------------
HTML URL: http://localhost/nagios/
CGI URL: http://localhost/nagios/cgi-bin/
Traceroute (used by WAP):

Review the options above for accuracy. If they look okay,
type 'make all' to compile the main program and CGIs.

Compilamos el código fuente de Nagios Core.

make all
..
..
*** Compile finished ***

Finalizada la compilación, instalamos.

make install
..
..
*** Main program, CGIs and HTML files installed ***

Tareas post instalación de Nagios Core

Compilado e instalado Nagios, debemos ejecutar una serie de comandos para completar mejor nuestra instalación.

Instalamos el script de inicio de Nagios.

make install-init
/usr/bin/install -c -m 755 -d -o root -g root /lib/systemd/system
/usr/bin/install -c -m 755 -o root -g root startup/default-service /lib/systemd/system/nagios.service

Hacemos una instalación de archivos de ejemplo de la configuracion de Nagios.

Sera mas fácil y nos podremos guiar por estos ejemplos al crear grupos, usuarios, equipos, etc.

make install-config
/usr/bin/install -c -m 775 -o nagios -g nagios -d /usr/local/nagios/etc
/usr/bin/install -c -m 775 -o nagios -g nagios -d /usr/local/nagios/etc/objects
/usr/bin/install -c -b -m 664 -o nagios -g nagios sample-config/nagios.cfg /usr/local/nagios/etc/nagios.cfg
/usr/bin/install -c -b -m 664 -o nagios -g nagios sample-config/cgi.cfg /usr/local/nagios/etc/cgi.cfg
/usr/bin/install -c -b -m 660 -o nagios -g nagios sample-config/resource.cfg /usr/local/nagios/etc/resource.cfg
/usr/bin/install -c -b -m 664 -o nagios -g nagios sample-config/template-object/templates.cfg /usr/local/nagios/etc/objects/templates.cfg
/usr/bin/install -c -b -m 664 -o nagios -g nagios sample-config/template-object/commands.cfg /usr/local/nagios/etc/objects/commands.cfg
/usr/bin/install -c -b -m 664 -o nagios -g nagios sample-config/template-object/contacts.cfg /usr/local/nagios/etc/objects/contacts.cfg
/usr/bin/install -c -b -m 664 -o nagios -g nagios sample-config/template-object/timeperiods.cfg /usr/local/nagios/etc/objects/timeperiods.cfg
/usr/bin/install -c -b -m 664 -o nagios -g nagios sample-config/template-object/localhost.cfg /usr/local/nagios/etc/objects/localhost.cfg
/usr/bin/install -c -b -m 664 -o nagios -g nagios sample-config/template-object/windows.cfg /usr/local/nagios/etc/objects/windows.cfg
/usr/bin/install -c -b -m 664 -o nagios -g nagios sample-config/template-object/printer.cfg /usr/local/nagios/etc/objects/printer.cfg
/usr/bin/install -c -b -m 664 -o nagios -g nagios sample-config/template-object/switch.cfg /usr/local/nagios/etc/objects/switch.cfg

*** Config files installed ***

Habilitamos la ejecución de scripts y comandos al usuario nagios y grupo nagcmd.

make install-commandmode
/usr/bin/install -c -m 775 -o nagios -g nagcmd -d /usr/local/nagios/var/rw
chmod g+s /usr/local/nagios/var/rw

*** External command directory configured ***

Copiamos configuracion de Apache para Nagios.

make install-webconf
/usr/bin/install -c -m 644 sample-config/httpd.conf /etc/httpd/conf.d/nagios.conf
if [ 0 -eq 1 ]; then \
ln -s /etc/httpd/conf.d/nagios.conf /etc/apache2/sites-enabled/nagios.conf; \
fi

*** Nagios/Apache conf file installed ***

Creamos una cuenta de usuario nagiosadmin y le colocamos contraseña.

Esta cuenta es solo para uso de la interfaz web de Nagios Core.

htpasswd -c /usr/local/nagios/etc/htpasswd.users nagiosadmin

Compilamos código e instalamos Nagios plugins

Nos preparamos para compilar el código de Nagios Plugins.

Para esto retornamos un directorio mas arriba (donde tenemos el tar.gz) y descomprimimos el archivo.

cd ..
tar xzvf nagios-plugins-2.2.1.tar.gz

Entramos al directorio de Nagios plugins, ejecutando configure como usuario y grupo nagios.

Seguidamente (siempre y cuando no nos de error configure) compilamos e instalamos los plugins.

cd nagios-plugins-2.2.1
./configure --with-nagios-user=nagios --with-nagios-group=nagios
make
make install

Modificamos contactos y grupos de Nagios

En este paso, aunque no es obligatorio, te recomiendo que hagas una copia de los archivos antes de modificarlos.

Esto con la idea de si en algún momento nos equivocamos, tengamos el original.

Comenzamos sacando una copia de contacts.cfg (ejecuta todo en una sola linea, OJO).

cp /usr/local/nagios/etc/objects/contacts.cfg /usr/local/nagios/etc/objects/contacts.cfg.old

Modificamos el archivo contacts.cfg.

En este archivo es donde creamos las cuentas y grupos de contacto para envió de alertas.

vi /usr/local/nagios/etc/objects/contacts.cfg
define contact {
contact_name nagiosadmin ; Cuenta de usuario
use generic-contact ; Tomamos valores de plantilla generic-contact
alias Nagios Admin ; Nombre de la persona
email mecasoft@gmail.com ; <<***** email de la persona donde enviar notificaciones ******
}

define contactgroup {
contactgroup_name admins
alias Nagios Administrators
members nagiosadmin
}

Apache en Nagios Core

Como servidor web usaremos Apache.

Activamos el servicio para su ejecución apenas hagamos boot, lo reiniciamos y verificamos quede ok.

systemctl enable httpd
systemctl restart httpd
systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since jue 2019-02-07 17:56:20 UTC; 33s ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 28887 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─28887 /usr/sbin/httpd -DFOREGROUND
├─28888 /usr/sbin/httpd -DFOREGROUND
├─28889 /usr/sbin/httpd -DFOREGROUND
├─28890 /usr/sbin/httpd -DFOREGROUND
├─28891 /usr/sbin/httpd -DFOREGROUND
└─28892 /usr/sbin/httpd -DFOREGROUND

Verificamos configuración de Nagios

Siempre que hagamos algún cambio, es buena política verificar que hayan quedado bien.

Si tenemos un error o nos equivocamos, el servicio de nagios simplemente no se ejecutara.

Por esto es IMPORTANTE siempre verificar la configuración.

La verificación debe decirnos que no tenemos ni Warnings ni Errors.

/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Nagios Core 4.4.3
Copyright (c) 2009-present Nagios Core Development Team and Community Contributors
Copyright (c) 1999-2009 Ethan Galstad
Last Modified: 2019-01-15
License: GPL

Website: https://www.nagios.org
Reading configuration data...
Read main config file okay...
Read object config files okay...

Running pre-flight check on configuration data...

Checking objects...
Checked 8 services.
Checked 1 hosts.
Checked 1 host groups.
Checked 0 service groups.
Checked 1 contacts.
Checked 1 contact groups.
Checked 24 commands.
Checked 5 time periods.
Checked 0 host escalations.
Checked 0 service escalations.
Checking for circular paths...
Checked 1 hosts
Checked 0 service dependencies
Checked 0 host dependencies
Checked 5 timeperiods
Checking global event handlers...
Checking obsessive compulsive processor commands...
Checking misc settings...

Total Warnings: 0
Total Errors: 0

Things look okay - No serious problems were detected during the pre-flight check

Activamos y ejecutamos Nagios Core en Linux

Llega el momento de activar el servicio nagios para que se ejecute cuando haga boot el servidor Linux.

Seguidamente ejecutamos y verificamos el servicio.

systemctl enable nagios
systemctl start nagios
systemctl status nagios
● nagios.service - Nagios Core 4.4.3
Loaded: loaded (/usr/lib/systemd/system/nagios.service; enabled; vendor preset: disabled)
Active: active (running) since jue 2019-02-07 17:59:07 UTC; 11s ago
Docs: https://www.nagios.org/documentation
Process: 28923 ExecStart=/usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg (code=exited, status=0/SUCCESS)
Process: 28922 ExecStartPre=/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg (code=exited, status=0/SUCCESS)
Main PID: 28924 (nagios)
CGroup: /system.slice/nagios.service
├─28924 /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg
├─28925 /usr/local/nagios/bin/nagios --worker /usr/local/nagios/var/rw/nagios.qh
├─28926 /usr/local/nagios/bin/nagios --worker /usr/local/nagios/var/rw/nagios.qh
├─28927 /usr/local/nagios/bin/nagios --worker /usr/local/nagios/var/rw/nagios.qh
├─28928 /usr/local/nagios/bin/nagios --worker /usr/local/nagios/var/rw/nagios.qh
├─28929 /usr/local/nagios/bin/nagios --worker /usr/local/nagios/var/rw/nagios.qh
├─28930 /usr/local/nagios/bin/nagios --worker /usr/local/nagios/var/rw/nagios.qh
└─28931 /usr/local/nagios/bin/nagios -d /usr/local/nagios/etc/nagios.cfg

Modificamos configuración de Apache para Nagios

Para que podamos ejecutar correctamente la interfaz web de Nagios, debemos hacer unos cambios en Apache.

Básicamente, agregar que busque y ejecute los index.php.

Solo modificamos esta parte, lo demás lo dejamos como esta.

vi /etc/httpd/conf.d/nagios.conf
Alias /nagios "/usr/local/nagios/share"
DirectoryIndex index.html index.php

Reiniciamos el servicio de Apache para que tome los cambios.

systemctl restart httpd

Uso de interfaz web Nagios Core

Abrimos un navegador (sugiero firefox o chrome) y nos dirigimos a http://ip-servidor/nagios

Haz el cambio a la ip o dominio internet de tu servidor Linux.

Apenas conectemos se nos pedirá un usuario y contraseña, ingresamos con la cuenta nagiosadmin creada en pasos anteriores.

Prefieres verlo en vídeo? Aquí debajo te comparto un breve recorrido y explicación de interfaz web.

No olvides suscribirte a mi canal 👈

Conociniendo la interfaz web Nagios Tutorial

Usuario de solo lectura Nagios

Te preguntaras, para que necesito un usuario de solo lectura?

Sencillo, para que pueda monitorear los servicios o equipos sin modificar su configuracion, comentarios, etc.

Ahora, si prefieres verlo en vídeo, aquí debajo lo puedes ver.

Como crear cuenta de solo lectura Nagios Tutorial

Para esto primero creamos el usuario con el comando htpasswd.

htpasswd -m /usr/local/nagios/etc/htpasswd.users usuariolectura

Modificamos dos parámetros del archivo cgi.cfg agregando el usuario que creamos.

vi /usr/local/nagios/etc/cgi.cfg
authorized_for_all_services=nagiosadmin,usuariolectura
authorized_for_all_hosts=nagiosadmin,usuariolectura

Reiniciamos el servicio de nagios para que tome los cambios.

systemctl restart nagios

Ahora podemos darle los datos de la nueva cuenta de usuario a la persona que queremos que pueda monitorear.

Con la característica de que esta cuenta no podrá modificar NADA en Nagios, solo monitorear.

Ya estamos listos para comenzar a monitorear nuestros equipos por medio de Nagios.

Satisfech@ con el articulo, hazme una donación, no importa la cantidad, la intención es lo que vale, dale click a este botón

Comparte este articulo opensource en tus redes sociales (compartir es sexy) por medio de los botones de redes sociales para que otros lo conozcan y apoyes mi blog.

Ademas, no olvides escribirme en los comentarios aquí debajo y pasa la voz compartiendo el tweet.

5 2 votes
Article Rating
4 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
José Rodríguez [e]
4 years ago

Hola. buenas noches.

estuve haciendo paso a paso este tutorial y me ha fallad al momento de verificar no se reconoce el comando y es porque el directorio /usr/local/nagios/ no existe. ¿que me faltó? ¿que proceso crea ese directorio?

/usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

José Rodríguez [e]
4 years ago

Tienes razón Manuel, en algún paso me equivoqué u omití algo. pero funcionó tal como lo describes. Gracias.