Notifica físicamente encendiendo un LED cada vez que alguien se conecte a la PC a través de la red.

Si bien ahora no posee una gran utilidad, es el punto de partida para lograr crear procesos automáticos más interesantes a medida que avanzamos en conocimientos.

 

 

 

 

 

 


Este es un artículo originalmente realizado por Masterl1nk, adaptado por mí para Binarios. Al final del artículo encontrarán los datos completos.

Si tenemos un servidor funcionando en nuestro hogar/trabajo, ahora podremos darle un toque más añadiendo la posibilidad  de notificar a través de un LED cuando un usuario se ha conectado a través de la red.

 

¿Cómo funciona?

En realidad, en Linux, una sesión iniciada remotamente no se diferencia de una sesión iniciada localmente. Incluso, cada vez que iniciamos una terminal (abrimos la consola) sin saberlo iniciamos automáticamente más sesiones paralelas.

Se puede notar simplemente tecleando en la terminal

$ who

el cual devolverá algo como lo que sigue:

cristian@Linux-AMD64:~$ who
cristian tty7         2011-10-03 21:55 (:0)
cristian pts/0        2011-10-03 23:24 (:0.0)

 

Donde vemos el usuario, la tty iniciada y algna terminal abierta (si existe).

Lo bueno es que haciendo uso de los comandos adecuados, podemos tomar automáticamente esta información y hacer con ella cosas como las que proponemos en este artículo.

 

Fundamentos

Ya hablamos del comando who. Éste nos indicará la cantidad de sesiones iniciadas en el sistema, independientemente de terminales o usuarios logueados.

Ahora necesitaremos algo que sea capaz de contarlos. Para ello recurrimos al comando Word Count (contador de palabras), y solicitaremos que cuente la cantidad de líneas que devuelve el comando who.

Podemos probarlo en la terminal ingresando lo siguiente:

$ who | wc -l

Donde el pipe (|) es un separador de sentencias y donde wc -l solicitamos que devuelva sólo el número de líneas.

¿Pero cómo hacer que este proceso se realice de forma automática cada vez que ocurre un login o un logout? Utilizando Bash.


Bash es un programa informático cuya función consiste en interpretar órdenes. Está basado en la shell de Unix y es compatible con POSIX.

A continuación, el script en bash que se ejecutará cuando ocurra un cambio en el número de sesiones en el sistema:

#!/bin/bash 
usuarios=`who | wc -l`
if [[ "$usuarios" > 0 ]]; then
encender
else
apagar
fi

 

Como se ve, el script se encargará de ejecutar el comando endender cuando la cantidad de usuarios sea mayor que cero, y ejecutará el comando apagar cuando éste sea distinto de cero. ¿Pero qué hacen estos comandos? Ahora lo sabremos.

Nos encargaremos de escribir un sencillo programa en C, el cual accederá al puerto paralelo de la PC para encenderlo o apagarlo según corrresponda.

 

encender.c

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/io.h> 
#include <sys/types.h> 
#include <fcntl.h> 
 
#define BASEPORT 0x378 //este es el puerto que corresponde en hexadecimal al LPT1
 
int main() { 
 char c; 
 int n, tem; 
 //permisos para acceder al puerto 
if (ioperm(BASEPORT, 3, 1)) {
 perror("ioperm");
 exit(1);
} 
 
 tem = fcntl(0, F_GETFL, 0); 
 fcntl (0, F_SETFL, (tem | O_NDELAY)); 
 
 //ENCIENDE el led 
 outb(1, BASEPORT); 
 
 
 fcntl(0, F_SETFL, tem); 
 outb(0, BASEPORT); 
 
 //liberar el puerto luego de utilizarlo
if (ioperm(BASEPORT, 3, 0)) {
 perror("ioperm");
 exit(1);
} 
 
 exit(0); 
} 

 

Lo guardamos en un archivo llamado encender.c

Ahora escribimos el otro programa:

 

apagar.c

 

#include <stdio.h> 
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#include <sys/types.h>
#include <fcntl.h>
 
#define BASEPORT 0x378 //Nuevamente este es el hexadecimal correspondiente al LPT1
 
int main() {
char c;
int n, tem;
//permisos para acceder al puerto
if (ioperm(BASEPORT, 3, 1)) {
perror("ioperm");
exit(1);
}
 
tem = fcntl(0, F_GETFL, 0);
fcntl (0, F_SETFL, (tem | O_NDELAY));
 
//APAGAR el led
outb(0, BASEPORT);
 
 
fcntl(0, F_SETFL, tem);
outb(0, BASEPORT);
 
//liberar el puerto
if (ioperm(BASEPORT, 3, 0)) {
perror("ioperm");
exit(1);
}
 
exit(0);
}

A éste lo gardamos como apagar.c

 

Una vez escritos los programas, procederemos a compilarlos de la siguiente manera (debemos tener instalado el compilador de C/C++ llamado gcc):

$ gcc encender.c -o encender

$ gcc apagar.c -o apagar

Así se enerarán dos binarios (programas ejecutables que cumplirán su función). Finalmente movemos estos binarios a /usr/bin y les cambiamos el permiso a nivel root (4755) para que sean ejecutados de forma automática por bash. Ello se logra de la siguiente manera:

 

# cp apagar /usr/sbin/apagar

# chmod 4755 /usr/sbin/apagar

para apagar y encender respectivamente.

 

Finalmente colocar un LED en el puerto paralelo. Éste se ubica de la siguiente forma

+ = pin nº 2
- = cualquier pin entre el 18 al 25

Una guía visual:

 

Video en YouTube donde el sistema funciona perfectamente.

 

 


Licencia . Ver información de licencia & cómo copiar material de esta web aquí.  - Idea de Masterl1nk. Autor: Cristian1604

.