domingo, 15 de noviembre de 2015

Configuración de Zabbix -> host, grupos, graficas, mapas, screens, eventos, triggers, slide shows.

Aqui pueden encontrar mi video donde explico un escenario completo de monitoreo de equipos de una red publica y una red privada. SI se integra con el video donde explico la configuración de notificaciones por correo, quedará el sistema completo e informando.


Instalación de Zabbix y alertas por gmail en Ubuntu server 14.04

Wikipedia: Zabbix es un Sistema de Monitoreo de Redes creado por Alexei Vladishev. Está diseñado para monitorear y registrar el estado de varios servicios de red, Servidores, y hardware de red.
Usa MySQLPostgreSQLSQLiteOracle o IBM DB2 como base de datos. Su backend está escrito en C y el frontend web está escrito en PHP. Zabbix ofrece varias opciones de monitoreo:
  • Chequeos simples que pueden verificar la disponibilidad y el nivel de respuesta de servicios estándar como SMTP o HTTP sin necesidad de instalar ningún software sobre el host monitoreado.
  • Un agente Zabbix puede también ser instalado sobre máquinas UNIX y Windows para monitorear estadísticas como carga deCPU, utilización de red, espacio en disco, etc.
  • Como alternativa a instalar el agente sobre los host, Zabbix incluye soporte para monitorizar vía protocolos SNMPTCP yICMP, como también sobre IPMIJMXSSHtelnet y usando parámetros de configuración personalizados. Zabbix soporta una variedad de mecanismos de notificación en tiempo real, incluyendo XMPP.
Lanzado sobre los términos de la versión 2 de la GNU General Public License, Zabbix es Software Libre.

Instalación en Ubuntu server (probado en versión 14.04)
Vea el siguiente video, los comandos de instalación están a continuación:


sudo apt-get update

//editar el archivo sources.list
sudo nano /etc/apt/sources.list
# Zabbix Application PPA
deb http://ppa.launchpad.net/tbfr/zabbix/ubuntu precise main
deb-src http://ppa.launchpad.net/tbfr/zabbix/ubuntu precise main

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys C407E17D5F76A32B

sudo apt-get update
sudo apt-get install zabbix-server-mysql php5-mysql zabbix-frontend-php

//editar el archivo zabbix_server.conf
sudo nano /etc/zabbix/zabbix_server.conf
DBName=zabbix
DBUser=zabbix
DBPassword=Your.Password.Here

cd /usr/share/zabbix-server-mysql/
sudo gunzip *.gz

//entrar a consola de mysql para crear el usuario zabbix
mysql -u root -p
//crear el usuario zabbix y contraseña, en este caso se pone zabbix123 como ejemplo. Use una propia.
create user 'zabbix'@'localhost' identified by 'zabbix123';
create database zabbix;
grant all privileges on zabbix.* to 'zabbix'@'localhost';
flush privileges;
exit;

//importar estructura de la base de datos
mysql -u zabbix -p zabbix < schema.sql
mysql -u zabbix -p zabbix < images.sql
mysql -u zabbix -p zabbix < data.sql

//editar el archivo prinicipal de php
sudo nano /etc/php5/apache2/php.ini
post_max_size = 16M
max_execution_time = 300
max_input_time = 300
date.timezone = UTC

sudo cp /usr/share/doc/zabbix-frontend-php/examples/zabbix.conf.php.example /etc/zabbix/zabbix.conf.php

//editar el archivo zabbixconf.php ara poner la contraseña fijada para el usuario zabbix de mysql en pasos anteriores
sudo nano /etc/zabbix/zabbix.conf.php
$DB['DATABASE'] = 'zabbix';
$DB['USER'] = 'zabbix';
$DB['PASSWORD'] = 'Your.Password.Here'

sudo cp /usr/share/doc/zabbix-frontend-php/examples/apache.conf  /etc/apache2/conf-enabled/zabbix.conf

sudo a2enmod alias
sudo service apache2 restart

//editar el archivo zabbix-server
sudo nano /etc/default/zabbix-server
START=yes

sudo service zabbix-server start


sudo apt-get -y install postfix mailutils libsasl2-2 ca-certificates libsasl2-modules
cd /etc/postfix/
sudo cp main.cf main.cf.bkp

//editar el archivo main.cf
sudo nano main.cf
relayhost = [smtp.gmail.com]:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt
smtp_use_tls = yes

//editar el archivo sasl_password con sus credenciales de correo de gmail
sudo nano /etc/postfix/sasl_passwd
[smtp.gmail.com]:587 sucorreo@gmail.com:contrasena

sudo postmap hash:/etc/postfix/sasl_passwd
sudo chown root:root /etc/postfix/sasl_passwd
sudo chmod 600 /etc/postfix/sasl_passwd

//Verificar los certificados
cat /etc/ssl/certs/Thawte_Premium_Server_CA.pem | sudo tee -a /etc/postfix/cacert.pem

sudo /etc/init.d/postfix reload

//realizar prueba de envio de correo por consola usando postfix
echo "prueba envio" | sudo mail -s " Test Postfix +Gmail+Zabbix " andres.gomez.ruiz@gmail.com

//verificar el log de eventos de email para comprobar que no existan errores
tail -f /var/log/mail.log

jueves, 26 de marzo de 2015

OpenWRT Router MR-3020 Controlar por puerto serie un dispositivo (Arduino)

La intención de este post es documentar el mejor escenario para dotar a un dispositivo de interfaz serial (en mi caso un Arduino uno) de capacidad para la comunicación inalámbrica que permita ser consultado y controlado.
Hay mucha documentación en ingles, pero este escenario es el que me funcionó a mi (después de probar muchas opciones), y que permite el control por el servidor Web que trae el OpenWRT.  Además de contribuir con  material en español.

Se usa router MR3020, aprovechando su puerto serial, se le conectan pines y una resistencia de 10Kohm entre vcc y tx



Router TP-Link MR3020, y su tarjeta mostrando el puerto serie.


Resistencia de 10Kohms entre VCC t tx


Se conecta el router y el arduino por sus puertos seriales mediante los pines GND, Tx y RX... NO se conecta VCC. Así:



Se flashea el rouert con OpenWRT. Así, se tiene así la interfaz /dev/ttyATH0 a 115200 bauds, para la comunicacion.


Se colocó el siguiente script en /etc/rc.local para que inicie a ejecutarse apenas el router finalice el booteo

cat /dev/ttyATH0 2>/dev/null | while read v1; do
    echo "$v1" >> /tmp/reporte
done

con esto, cada dato que llegue se va a grabar como una nueva línea del archivo /tmp/reportes
Como esto significa que el tamaño del archivo va a aumentar muchisimo, entonces se colocó una tarea cada minuto para que desocupe el archivo. En cron se coloca:

root@OpenWrt:/www/cgi-bin# crontab -e
*/1 * * * * echo "" > /tmp/reporte

Así ya se tiene que el archivo cada minuto se desocupa.

Con el codigo de Arduino del final se hace que el microcontrolador envie datos de la lectura del puerto analógico A0 cada 100mS y también esté verificando la entrada de comunicaciones seriales para accionar o no un LED segun le llegue un 1 o 0.

Para la visualización Web se usa el servidor web de OpenWRT con la opcion cgi-bin.

en  /www/cgi-bin/ se crea un archivo llamado lectura con esto:

root@OpenWrt:/www/cgi-bin# cat /www/cgi-bin/lectura

#!/bin/sh
#!/www/cgi-bin/volts
# simple CGI to tail most recent info from an arduino
/root/hora.sh
echo "Content-type: text/html"
echo ""
echo "<html><head><meta http-equiv="refresh" content="1">"
echo "<h2>Voltmeter</h2>"
echo "<pre>
</pre>"
echo "<h4>Lectura del puerto A0</h4>"
echo "<font size=24><pre>"
head -n -1 /tmp/reporte | tail -1
echo "</pre></font><br><br>"
   echo '<form action="ledon">'
    echo '<input type="radio" name="on" value="encender" checked>ON'
    echo '<br><input type="submit" value="Submit"></form><br><br>'
   echo '<form action="ledoff">'
    echo '<input type="radio" name="on" value="encender" checked>OFF'
    echo '<br><input type="submit" value="Submit"></form>'

echo "</html>"
echo ""

---
Hay que darle permisos 775 al archivo lectura

chmod 755 /www/cgi-bin/lectura

Lo anterior levanta un sencilla pagina web. Lo especial es la linea "head -n -1 /tmp/reporte | tail -1" que lee la penúltima línea del archivo reportes mencionado anteriormente. Esto ya que siempre queda una linea en blanco al final del archivo.
Se imprime esa lectura.

Los dos formularios sirven para implementar dos botones, para encender o apagar un led. Para esto se llaman a los archivos "ledon"  y "ledoff" respectivamente, lo unico que tienen esos archivos es la orden de enviar un 1 o un 0 por puerto serial:

archivo ledon:

#!/bin/sh
echo "Content-type: text/html"
echo ""
echo "<html><head><meta http-equiv="refresh" content="1">"
echo "<h2>LED encendido</h2>"
echo "<pre>
</pre>"
echo "<font size=24><pre>"
echo -n "1" > /dev/ttyATH0
echo "</pre></font></html>"

Mediante la linea echo -n "1" > /dev/ttyATH0  se envia un 1 por el puerto serie

archivo ledoff:

#!/bin/sh
echo "Content-type: text/html"
echo ""
echo "<html><head><meta http-equiv="refresh" content="1">"
echo "<h2>LED apagado</h2>"
echo "<pre>
</pre>"
echo "<font size=24><pre>"
echo -n "0" > /dev/ttyATH0
echo "</pre></font></html>"

Mediante la linea echo -n "0" > /dev/ttyATH0  se envia un 0 por el puerto serie


Se accede mediante un navegador web

http://192.168.1.1/cgi-bin/lectura (o la ip del enrutador)

Esta página se actualiza cada segundo

Código Arduino Uno:

int led = 13; // Pin 13
   
void setup()
{
    pinMode(led, OUTPUT); // Set pin 13 as digital out
   
    // Start up serial connection
    Serial.begin(115200); // baud rate
    Serial.flush();
}
   
void loop()
{
    String input = "";
   
    // Read any serial input
    while (Serial.available() > 0)
    {
        input += (char) Serial.read(); // Read in one char at a time
        delay(5); // Delay for 5 ms so the next char has time to be received
    }
   
    if (input == "1")
    {
        digitalWrite(led, HIGH); // on
        Serial.print("encendido");
    }
    else if (input == "0")
    {
        digitalWrite(led, LOW); // off
        Serial.println("apagado");
    }
   
        int sensorValue = analogRead(A0);
        float voltage = sensorValue * (5.0 / 1023.0);
        Serial.println(voltage);
        delay(100);
}

Resultados:


-----

--- 




jueves, 19 de marzo de 2015

SISTEMA GNU/LINUX COMO FIREWALL




En GNU/Linux existen muchas distros listas para aplicar funcionalidades de firewalll con bonitas interfaces de usuario, es más, desde la distro de un sistema embebido (openWRT, Raspbian, etc) tiene por defecto (aunque no es obligatorio) el modulo del kernel que le permite esta funcionalidad.


Sin embargo es necesario estudiar el diagrama de flujo de los paquetes del protocolo IP y entender como se aplica en la capa 3 (OSI) los conceptos del firewall y sus  funcionalidades. PAra esto he realizado un manual con muchos ejemplos, diagramas y ejercicios para hacer una primera aproximación de fondo sobre el funcionamiento de un firewall en sistemas GNU/Linux.


Aqui: Ver Manual

miércoles, 11 de marzo de 2015

Convirtiendo una impresora USB en impresora de red gracias a un pequeño router y OpenWRT

Tengo una impresora Kiosera FS-1120D, a la que se le puede instalar una tarjeta Ethernet para tenerla como impresora de red, pero en mi caso no la trae, solamente trae interfaz USB.

Paralelamente he venido jugando con los enrutadores TP-Link MR3020 y con el grandioso firmware OpenWRT La idea es poder imprimir por red desde cualquier lado de una red IP (local o remota).

así:

+ 

=


Esto no es más que la adaptación de otra guia a el router TP-Link MR3020 y en español.

Primero hay que cambiar el firmware del MR3020. Se conecta por la IP de administración del router mediante un navegador web (no vamos a explicar como hacerlo ya que es un procedimiento estandar).
Yo he bajado la imagen para este router compilada por OpenWRT en su version Barrier Breaker que la pueden obtener aqui.

Por la opción de Firmware Upgrade del router es simplemente subir el archivo descargado y esperar unos 3 minutos.
Luego de lo anterior el router es accesible por medio de la IP 192.168.1.1

Accedemos por un navegador Web usando dicha IP, lo primero que encontrarán es que el firmware solicita que sea configurada una clave para acceso como  root. Pongan una que puedan recordar.

Adicionalmente el enrutador debe estar configurado en una dirección IP que tenga salida a internet, es decir, como un computador más. Por ejemplo mi red LAN está en el rango 192.168.30.0/24 por eso le puse una IP estática 192.168.30.101 con gateway 192.168.30.1 (el router local) y DNS de mi preferencia.

Conectar el Router MR3020 con un cable ethernet a nuestra red local, o también pueden habilitar la configuración WiFi para imprimir de forma inalámbrica.

Luego pueden acceder por SSH al router. Yo usé el software  libre PuTTY; obtendrán esta consola:

Ya desde aqui debe introducir los siguientes comandos sin obtener errores:


opkg update
opkg install kmod-usb2
opkg install usbutils

Instalar soporte de impresoras:
opkg install kmod-usb-printer

Instalar en servidor de impresoras p910nd, el cual es un pequeño demonio que no pone los trabajos en cola en el disco, sino que pasa directamente a la impresora.
opkg install p910nd

Con ello se tiene todo lo necesario, ahora a modificar los archivos de configuración.
Con el siguiente comando se debe editar el archivo. Si no sabe usar vi es necesario que busque ejemplos en la internet antes.

# vi /etc/config/p910nd

El archivo debe quedar así:

config p910nd
        option device        /dev/usb/lp0
        option port          0
        option bidirectional 1
        option enabled       1


Ahora se debe configurar el firewall del MR3020 para que acepte peticiones del puerto 9100

Con el siguiente comando se debe editar el archivo.

# vi /etc/config/firewall

Al FINAL del archivo debe agregarse:


#Allow attached network printer
config 'rule'
option 'src' 'lan'
option 'proto' 'tcp'
option 'dest_port' '9100'
option 'target' 'ACCEPT'

OK. Para finalizar se habilita el servidor de impresoras y se reinicia el router:
#/etc/init.d/p910nd enable
# reboot

Para configurar la impresora en un entorno Windows se debe hacer lo siguiente:

1. Instalar por USB la impresora en el equipo, con todos sus drivers archivos conrrespondientes. Hacer prueba de impresión por USB y que funcione todo. Luego desconectar el cable USB.









Ahora hay que ir a la configuración de la impresora que se instaló por USB y cambiar el puerto al TCP/IP recién creado.




Listo!!! Ya pueden hacer pruebas.





lunes, 3 de marzo de 2014

FailOver de 2 WAN con Gateway reversible en RouterOS

Este post mejora el script encontrado en http://wiki.mikrotik.com/wiki/Failover_Scripting  corrigiendo los errores:
- Tener una WAN principal que siempre esté activa si el enlace está activo con salida a internet.
- Tener una WAN secundaria que solo actúa como backup si la WAN principal cae.
- Volver automáticamente a la WAN principal cuando vuelva a tener salida a internet.

Topología:

Se elijen 2 IP para hacer ping (8.8.8.8 y 8.8.4.4), cada una por una interfaz WAN diferenten:


/ip route
add disabled=no distance=2 dst-address=8.8.4.4/32 gateway=172.16.0.1 scope=30 target-scope=10
add disabled=no distance=1 dst-address=8.8.8.8/32 gateway=10.10.0.1 pref-src=0.0.0.0 scope=30 target-scope=10

add disabled=no distance=2 dst-address=0.0.0.0/0 gateway=172.16.0.1 scope=30 target-scope=10


add disabled=no distance=1 dst-address=0.0.0.0/0 gateway=10.10.0.1 pref-src=0.0.0.0 scope=30 target-scope=10

****************
Modifiqué el script para que se comporte con las IPs:
# ------------------- header -------------------
# Script by Tomas Kirnak, version 1.0.7
# If you use this script, or edit and
# re-use it, please keep the header intact.
#
# For more information and details about
# this script please visit the wiki page at
# http://wiki.mikrotik.com/wiki/Failover_Scripting
# ------------------- header -------------------
# ------------- start editing here -------------

#:log warning "HOLA."

:local InterfaceISP1 ether1
:local InterfaceISP2 ether5

:local GatewayISP1 10.10.0.1
:local GatewayISP2 172.16.0.1

:local PingTarget1 8.8.8.8
:local PingTarget2 8.8.4.4

:global PingFailCountISP1
:global PingFailCountISP2

:if ([:typeof $PingFailCountISP1] = "nothing") do={:set PingFailCountISP1 0}
:if ([:typeof $PingFailCountISP2] = "nothing") do={:set PingFailCountISP2 0}

:local PingResult

:set PingResult [ping $PingTarget1 count=1]
#:log warning "HOLA ping."
:put $PingResult
#:log warning $PingResult


:if ( $PingResult=0) do={
#  :log warning "ping fallo"
#  :log warning $PingFailCountISP1
 :if ($PingFailCountISP1 < 5) do={
  :set PingFailCountISP1 ($PingFailCountISP1 + 1)
 
  :if ($PingFailCountISP1 = 3) do={
   :log warning "ISP1 has a problem en route to $PingTarget1 - increasing distance of routes."
   :foreach i in=[/ip route find gateway=$GatewayISP1 && static] do=\
    {/ip route set $i distance=([/ip route get $i distance] + 2)}
   :log warning "Route distance increase finished."
  }
 }
}
:if ($PingResult = 1) do={
 :if ($PingFailCountISP1 > 0) do={
  :set PingFailCountISP1 ($PingFailCountISP1 - 1)
 
  :if ($PingFailCountISP1 = 2) do={
   :log warning "ISP1 can reach $PingTarget1 again - bringing back original distance of routes."
   :foreach i in=[/ip route find gateway=$GatewayISP1 && static] do=\
    {/ip route set $i distance=([/ip route get $i distance] - 2)}
   :log warning "Route distance decrease finished."
  }
 }
}

:set PingResult [ping $PingTarget2 count=1]
#:log warning "haciendo ping 2"
:put $PingResult
#:log warning $PingResult

:if ( $PingResult=0) do={
 :if ($PingFailCountISP2 < 5) do={
  :set PingFailCountISP2 ($PingFailCountISP2 + 1)
 
  :if ($PingFailCountISP2 = 3) do={
   :log warning "ISP2 has a problem en route to $PingTarget2 - increasing distance of routes."
   :foreach i in=[/ip route find gateway=$GatewayISP2 && static] do=\
    {/ip route set $i distance=([/ip route get $i distance] + 2)}
   :log warning "Route distance increase finished."
  }
 }
}
:if ($PingResult = 1) do={
 :if ($PingFailCountISP2 > 0) do={
  :set PingFailCountISP2 ($PingFailCountISP2 - 1)
 
  :if ($PingFailCountISP2 = 2) do={
   :log warning "ISP2 can reach $PingTarget2 again - bringing back original distance of routes."
   :foreach i in=[/ip route find gateway=$GatewayISP2 && static] do=\
    {/ip route set $i distance=([/ip route get $i distance] - 2)}
   :log warning "Route distance decrease finished."
  }
 }
}

lunes, 17 de junio de 2013

Mis Scripts Bash #1 Procesos y cerrar procesos


Script llamado killalot que dado un argumento que puede ser el nombre de un proceso (que puede estar especificado con *) o el PID o el PPID eliminará todos los procesos que cumplan estas características. Si el comando es ejecutado como root se deberá preguntar si se está seguro de la eliminación sobre los procesos de su propiedad. Si el argumento es un texto será los procesos indicados con este texto, si es un número será el proceso con ese PID y si se antepone -p serán los procesos cuyo ppid es el indicado a continuación (solo se admitirá un argumento de este tipo por vez). Si se incluye la opción -i en la lista de parámetros se preguntará siempre si se quiere eliminar el proceso o no. El comando deberá dar un mensaje breve si el proceso ha estado eliminado o no y al final un resumen de cuantos procesos eliminados y cuantos no.

Por ejemplo:
killalot fire* eliminará todos los procesos que comiencen por fire y que sean propiedad del usuario que ejecuta el shell (si lo ejecuta root podrá eliminar todos los procesos que comiencen por fire (de cualquier usuario) pero deberá preguntar por los que el propietario sea root).
killalot -i -p 1234 eliminará todos los procesos que su ppid sea 1234 y preguntará antes de su eliminación.



#!/bin/bash
# Carlos Andres Gomez Ruiz - Estudiante UOC
#GPLv3
echo "Comando para finalización de procesos"
echo
let conf=0
let pid=0
let ppid=0
let coment=0
let confroot=0
let decision=1
function confirmar {
   echo -n "Estas seguro que deseas cerrar el  proceso" $proceso "? (s/n)"
   read confirmacion

case $confirmacion in
  "s")
    decision=1
  ;;
  "n")
   decision=0
  ;;
  *)
    echo "Opcion no válida"; confirmar
  ;;
esac
}
function ident_usua {
   if [ "$usuarioproc" = "root" ] &&  [ "$confroot" -eq 0 ]
    then echo "Este es un proceso del root y no eres root, no puedes cerrarlo."; decision=0
   fi

   if [ "$usuarioproc" = "root" ] &&  [ "$confroot" -eq 1 ]
     then echo "Este proceso pertenece al root, desea eliminarlo? (s/n)";
     read confirmacion

    case $confirmacion in
       "s")
         decision=1
       ;;
       "n")
        decision=0
       ;;
       *)
         echo "Opcion no válida"; confirmar
       ;;
   esac
fi
}

echo -n "Eres el usuario " $(whoami) "y "; if [ "$(id -g)" == 0 ]; then echo -n "SI "; confroot=1; else echo -n "NO "; fi; echo "eres del grupo root."

#identifica si no hay parámetros y sale del programa
if [ "$#" == "0" ]; then echo "No hay parámetros, para ayuda: killalot -h "; exit 0; fi


####Identifica los parámetros
#Identifica si el 1er parametro es un numero o string
if [ "$1" != "-p" ] && [ "$1" != "-i" ] ; then
  if [ "$1" -eq "$1"  2>/dev/null ]
     then pid=1; proceso=$1
     else coment=1; proceso=$1
  fi
fi
#Identifica el parametro i
if [ "$1" = "-i" ]
then  conf=1
  if [ "$2" -eq "$2"  2>/dev/null ]; then  pid=1; proceso=$2
  else coment=1; proceso=$2; fi
elif  [ "$2" = "-i" ] || [ "$3" = "-i" ]
then  conf=1;
fi

#Identifica el parametro p
if [ "$1" = "-p" ]; then  ppid=1; proceso=$2;
elif [ "$2" = "-p" ]; then  ppid=1; proceso=$3;
fi

#Identifica el parametro h
if [ "$1" = "-h" ]; then
   echo "Como usar:"
   echo "killalot [NOMBRE_DEL_PROCESO] -> admite el comodin * ."
   echo "killalot [PID] -> se proporciona el PID de un proceso para finalizarlo."
   echo "killalot -p [PPID] -> si se quiere elimitar todos los procesos que dependen de un PPID."
   echo "killalot -i [PID] -> El argumento i solicitará confirmación antes de eliminar"
   echo
fi

#echo "xxxxxxxppid" $ppid "xxxxxxxxpid" $pid "xxxxxxxxxxxxcoment" $coment "xxxxxxxconf" $conf "xxxxxxxxconfroot" $confroot


##** EJECUCION DE COMANDOS


##Para PID
if [ "$pid" -eq 1 ]; then
   echo "El proceso $proceso a cerrar es "
   printf "PID \t PPID \t USUARIO \t COMENTARIO \n"
   ps -eo pid,ppid,comm,user | gawk -v VAR="$proceso" '$1==VAR {printf $1 "\t" $2 "\t" $4 "\t" $3 "\n"}'
if [ -z "$(ps -eo pid | gawk -v VAR="$proceso" '$1==VAR {print}')" ]
  then  echo "El proceso no coincide con alguno actual."; exit
fi
[ "$conf" -eq 1 ] && confirmar
#verifica que el proceso sea del mismo usuario:
usuarioproc=$(ps -eo pid,user | gawk -v VAR="$proceso" '$1==VAR {print $2}')
ident_usua
if [ "$decision" -eq 1 ]; then  kill $proceso; echo "Proceso" $proceso "eliminado"; fi

fi


##Para filtrar por comentario de un proceso
if [ "$coment" -eq 1 ]; then

   echo "El proceso a cerrar es "
if [ -z "$(ps -eo comm | gawk -v VAR="$proceso" '$1==VAR {print}')" ]
then  echo "El proceso no coincide con alguno actual."; exit
fi


for j in $(ps -eo comm,pid,ppid,user | gawk -v VAR="$proceso" '$1==VAR {print $1"_"$2 "_" $3 "_" $4}')
  do
   printf "COMENTARIO \t PID \t PPID \t USUARIO \n"
   echo $j | gawk -F_ '{printf $1 "\t" $2 "\t" $3 "\t" $4 "\n"}'
   [ "$conf" -eq 1 ] && confirmar
   proceso=$(echo $j| gawk -F_ '{print $2}')
   usuarioproc=$(echo $j| gawk -F_ '{print $4}')
   ident_usua
   if [ "$decision" -eq 1 ]; then  kill $proceso; echo "Proceso" $proceso "eliminado"; fi
done
fi

#Para procesos padres PPID y sus hijos PID
if [ "$ppid" -eq 1 ]; then
   echo "Cerrar los procesos del ppid " $proceso
if [ -z "$(ps -eo ppid | gawk -v VAR="$proceso" '$1==VAR {print}')" ]
then  echo "El proceso padre no coincide con alguno actual."; exit
fi

for j in $( ps -eo ppid,pid,comm,user | gawk -v VAR="$proceso" '$1==VAR {print $1"_"$2 "_" $3 "_" $4}')
     do
     printf "PPID \t PID \t USUARIO \t COMENTARIO \n"
     echo $j | gawk -F_ '{printf $1 "\t" $2 "\t" $4 "\t" $3 "\n"}'
     [ "$conf" -eq 1 ] && confirmar
     proceso=$(echo $j| gawk -F_ '{print $2}')
     usuarioproc=$(echo $j| gawk -F_ '{print $4}')
     ident_usua
     if [ "$decision" -eq 1 ]; then  kill $proceso; echo "Proceso" $proceso "eliminado"; fi
done
fi


[ "$coment" -eq 0 ] && [ "$ppid" -eq 0 ] && [ "$pid" -eq 0 ] && echo "No hay un parámetro válido. Para ayuda: killalot -h"