sábado, 31 de agosto de 2013

3 formas de conocer el espacio en disco desde la consola de Linux

1 – Como saber cuanto ocupa una carpeta en Linux.

¿Cuantas veces necesitaste conocer cuanto espacio ocupa un directorio en particular? Desde la consola al ejecutar “du” por “Disk Ussage“:
~ # du /home/dvr/video/movie/
Te devuelve el tamaño en bloques del directorio en cuestión:
48004   /home/dvr/video/movie/
Como al sistema de archivos lo formateé en su momento con un tamaño de bloque de 1024 bytes -Por defecto se usan 4096 bytes si no se especifica un valor diferente para el parámetro en el argumento de la utilidad que formatea-, la cuenta es facil: 48004 bloques de 1024 bytes cada uno suman 49156096 bytes.
Como no podía ser de otra forma, para no tener que andar haciendo cálculos estrambóticos, se le puede pasar a la utilidad como argumento “-h” por “Human Readable”  para que devuelva el resultado en formato entendible por humanos:
~ # du /home/dvr/video/movie/ -h
47M     /home/dvr/video/movie/
Como el comando es recursivo, puede que te interese además agregarle la opción “-s” por “silent” para que cuando tenga que navegar muchos subdirectorios para sacar la cuenta no te llene la pantalla de texto. La otra muy util que tiene de entre tantas opciones disponibles es la posibilidad de producir un “gran total” con la opción “-c“, por ejemplo:
~ # du /home/dvr/video/movie/ -csh
47M     /home/dvr/video/movie/
47M     total

2 – Conocer el espacio utilizado/disponible por partición

Con la salida en modo “bloques” para el comando “df” por “Disk Free“:
~ # df
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda3              9297812   1988296   6837208  23% /
/dev/sdb1               397475    295084     75886  80% /usr/portage
/dev/sdb2             78628740   6382688  72246052   9% /home
O en modo “Human Readable” pasándole el argumento “-h“:
~ # df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             8.9G  1.9G  6.6G  23% /
/dev/sdb1             389M  289M   75M  80% /usr/portage
/dev/sdb2              75G  6.1G   69G   9% /home

3 – Gráficos en la consola

Por ultimo la frutillita del postre, el que uso todo el tiempo, powered by python, “pydf“:

pydf en funcionamiento, mas gráfico imposible (para ser en consola).
Cada quien sabrá como lo instala con el gestor de paquetes de su distribución de cabecera, en Gentoo es tan simple como ejecutar:
~ # emerge pydf

Como seguramente habrá mas aplicaciones que no conozco, ¿Conocen ustedes algo mejorcito que pydf?

Loguear texto arbitrario a Syslog en Linux

Loguear texto arbitrario a Syslog en Linux

Esto viene mas que bien si ya estás aplicando el método que explico en este artículo anterior para centralizar todos los Logs que generan Linux, Windows y otros dispositivos que pudieras tener pululando en tu red en un solo host, para poder después leerlos cómodamente desde una página web.

Para que veas todo el mundo que te rodea en modo texto, de preferencia verde sobre fondo negro
Se puede loguear texto arbitrario a syslog desde cualquier PC corriendo Linux en la red simplemente por medio del comando “logger” (sin las comillas).
La salida de logger va a parar derechito a syslog y es accesible desde /var/log/messages:
~ # logger puto el que lee
~ # tail /var/log/messages

Nov 10 23:30:01 dvr cron[12109]: (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons )
Nov 10 23:40:01 dvr cron[12161]: (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons )
Nov 10 23:46:25 dvr root: puto el que lee
Hasta ahí nada de otro mundo, un comando que por si solo no tiene mucha magia, manda texto al syslog, ¿Y?
Por si solo no resalta en absoluto pero: ¿Qué pasa cuando necesitás loguear a syslog la salida de un comando cualquiera que por defecto va a la pantalla y no a syslog?
¡Bingo! Usando un pipe es cuestión de redireccionar la salida a logger para tenerlo accesible desde /var/log/messages, desde la red en el syslog server y desde la página web para mayor comodidad. Supongamos que quiero loguear la salida de ping a uno de los DNS de google:
~ # ping 8.8.8.8 -c2 | logger
~ # tail /var/log/messages

Nov 10 23:40:01 dvr cron[12161]: (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons )
Nov 10 23:46:25 dvr root: puto el que lee
Nov 10 23:50:01 dvr cron[12220]: (root) CMD (test -x /usr/sbin/run-crons && /usr/sbin/run-crons )
Nov 10 23:56:17 dvr logger: PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
Nov 10 23:56:17 dvr logger: 64 bytes from 8.8.8.8: icmp_req=1 ttl=47 time=178 ms
Nov 10 23:56:18 dvr logger: 64 bytes from 8.8.8.8: icmp_req=2 ttl=47 time=178 ms
Nov 10 23:56:18 dvr logger:
Nov 10 23:56:18 dvr logger: --- 8.8.8.8 ping statistics ---

Nov 10 23:56:18 dvr logger: 2 packets transmitted, 2 received, 0% packet loss, time 1001ms

Nov 10 23:56:18 dvr logger: rtt min/avg/max/mdev = 178.639/178.658/178.677/0.019 ms
Te cambia la vida, ¿No?
A ver cuantos miles de usos le encontrás a esto.

Recibir logs remotos usando Syslog

Recibir logs remotos usando Syslog

Al que como yo se encuentre en un punto en donde se le vuelve tedioso ir servidor por servidor, dispositivo por dispositivo revisando los archivos de bitácora (logs) de cada uno, esto le resultará de utilidad.
syslog es un estándar de facto para el envío de mensajes de registro en una red informática IP. Por syslog se conoce tanto al protocolo de red como a la aplicación o biblioteca que envía los mensajes de registro.
Un mensaje de registro suele tener información sobre la seguridad del sistema, aunque puede contener cualquier información. Junto con cada mensaje se incluye la fecha y hora del envío.

Recibir los logs de otros servidores en un servidor Linux:

En mi caso, mi servidor central corre Syslog-NG, pretendo recibir en este servidor todos los logs que generan otros servidores corriendo Linux y Windows, cámaras de seguridad, routers y puntos de acceso inalámbricos que controlo.

Syslog puede enviar información sobre TCP o UDP indistintamente. Por convención se usa el puerto 514 UDP. La mayoría de los dispositivos del tipo access points wireless o cámaras de seguridad no permiten especificar puerto o protocolo así que lo mejor es crear una regla en el firewall que reenvíe todo el tráfico del puerto 514 UDP que es la configuración por defecto a nuestro Syslog server:
iptables -A PREROUTING -t nat -i eth0 -p udp –dport 514 -j DNAT –to 192.168.1.150
Una vez hecho esto, habilitar Syslog-NG para que reciba tráfico por UDP editando el archivo /etc/syslog-ng/syslog-ng.conf:
source src {
unix-stream(“/dev/log” max-connections(256));
internal();
file(“/proc/kmsg”);
udp();
};
Con eso ya tenemos suficiente como para recibir todos los logs de otros servidores y dispositivos en la red o desde internet en nuestro servidor central syslog.

Consultando los Logs:

Todos estos logs se pueden consultar en diferido usando:
less /var/log/messages
O verlos en tiempo real desde una consola:
tail -f /var/log/messages
O traerlos desde tty12 a la tty1 para una cómoda visualización nuevamente editando /etc/syslog-ng/syslog-ng.conf:
# By default messages are logged to tty12…
destination console_all { file(“/dev/tty1“); };

Trayendo logs remotos hasta nuestro servidor syslog:

El paso siguiente es traer todos los logs remotos a nuestro servidor central para poder administrarlos con mas comodidad. A continuación algunos ejemplos para diferentes escenarios.

Windows:

En el caso de servidores que corren windows, bastará con instalar NTsyslog (requiere .NET 2.0 y windows installer 3.0) y configurarlo para que envíe los logs hasta nuestro syslogserver usando el número de IP o el nombre de dominio del mismo.

Linux:

Cuando el servidor remoto corre syslog-ng, agregar en el archivo de configuración:
destination remote { udp(“mi.servidor.com” port(514)); };
Cuando el servidor remoto corre rsyslog o similares, agregar en /etc/rsyslog.conf:
*.*     @mi.servidor.com

Otros dispositivos:

Dependerá del caso pero la gran mayoría de equipamiento de red de calidad permite el reenvío de logs a otros dispositivos, solo es cuestión de acceder a la página web de administración de los mismos y configurarlos según corresponda.
Por último, la frutillita del postre, acceder a estos logs usando un cliente web usando phpsyslogng, (requiere Apache/PHP/MySQL), eso lo dejo para la próxima entrada, que por hoy se me acabó el tiempo:

Video vigilancia automatizada con detección de movimiento en Linux.

Video vigilancia automatizada con detección de movimiento en Linux.

Este (mini)artículo no es mas que una actualización del artículo anterior: [HowTo] Sistema de vigilancia casero basado en Linux usando una webcam
.
En las pruebas que he ido haciendo hasta el momento, después de 15 días de funcionamiento sostenido:
~ # uptime
  
22:59:32 up 15 days,  7:47,  1 user,  load average: 0.31, 0.39, 0.36
Se porta como si recién hubiera arrancado:
~ # free -m
             total       used       free     shared    buffers     cached
Mem:           228        206         21          0         73         90
-/+ buffers/cache:         42        185
Swap:          517          2        515
Hoy cumple exactamente 31 días de grabación de corrido, en estos 31 días, como únicamente graba –y toma instantáneas- a 640×480 si detecta movimiento, me ha generado un total de 154579 archivos entre fotografías y videos, 7Gb de información:
~ # du -sh /home/dvr/video/
7.3G    /home/dvr/video/
Así que con un disco de 80Gb que tiene supera ampliamente mis estimaciones iniciales, tengo para grabar sin tener que borrar nada apróximadamente 10 meses de corrido, mejor que cualquier DVR comprada con disco de 320Gb.
Para ser gratis y casero, nada mal ¿Eh?

Sistema de videovigilancia casero usando una webcam.

Sistema de videovigilancia casero usando una webcam.

Otro título sugerido:
Lo que en Gentoo es facil, en Ubuntu se me complica.
Me he visto en la necesidad de implementar un sistema de videovigilancia para poder monitorear ciertos sectores de mi casa. Como me he cruzado en varias oportunidades con esas DVR de tipo standalone y me ha tocado configurarlas para que salgan a internet he visto que en muchos -si no en todos los- casos estos aparatitos por dentro corren Linux, el típico micro-kernel, busybox, un init a medida, un webserver básico y poca cosa mas.
Ante la disyuntiva “comprar uno de estos DVR vs hacerme uno propio“, de puro chatarrero me decidí por la segunda opción pensando que si un DVR con tan poco hardware puede hacer todo el trabajo, cualquier PC viejita debería darme el mismo resultado.
No es tan así. Un VIA Samuel 2 de 800Mhz (El que se vendía como VIA C3 1500+, básicamente un K6 III de 800Mhz o un Pentium II con esteroides, que ni siquiera es compatible con i686) a duras penas si alcanza para las dos cámaras que le he instalado.
La cuestión es que necesitaba el sistema funcionando, y lo necesitaba inmediatamente -eso fué hace una semana-, así que googleando un poco dí con Zoneminder, un centro de video vigilancia de código abierto con todas las de la ley que no tiene nada que envidiarle a los mejores productos pagos para otras plataformas.
¿Que hace uno cuando necesita un Linux funcionando rápido?
Va por la que debería ser la mas rápida de todas las opciones: Ubuntu
Craso error.
Nuevamente, no es tan así. Necesitaba el sistema implementado de inmediato y ya habían pasado tres días de prueba, google y error. No había conseguido hacer funcionar Zoneminder como debería, me dí cuenta de que por falta de recursos de hardware, puntualmente falta de microprocesador en Ubuntu… Después de limar Ubuntu hasta donde pude, desactivar todo lo que sé que no voy a usar, incluído el entorno gráfico, llegué a un punto en donde perdí conectividad, se rompió la consola de comandos, se rompió la instalación de Xorg, y se rompió al punto donde lo mas rápido era reinstalar que ponerse a reparar…
Como la necesidad tiene cara de hereje, Taringa de por medio, encontré que para windows hay infinidad de programas mucho menos profesionales que Zoneminder pero que en definitiva cumplen la misma función, lo único que necesito: Streaming HTTP de video desde dos Webcams en tiempo real y grabación con detección de movimiento.
Así fué como al cuarto día estaba cometiendo sacrilegio, instalando un Windows XP en la PC para poder grabar video con detección de movimiento.
Dos días mas tarde, todavía estaba peleando contra el crack, el virus que venía en el crack, el overlay que no funcionaba con la placa de video onboard de tan viejo motherboard, el driver de la placa de video a ver si esto mejoraba, al ver que no mejoraba. a cambiar de programa por algún otro que tampoco me convencia y así sucesivamente en un bucle infinito y la cosa se empezaba a poner desesperante.
En medio de todo eso andaba cuando de nuevo gracias a Google dí con un tal Motion.
Llenas las bolas como las tenía me decidí por la que debería haber sido mi primera opción, mi distribución de Linux de preferencia: Gentoo
Obviamente, instalar Gentoo en una PC de estas características lleva su tiempo, casi dos horas hasta tener un sistema autónomo booteable con lo básico para funcionar: El kernel, la red inalámbrica y motion. (De hecho, dos días después, mientras escribo esto, la pobrecita pc todavía está compilando software extra que quiero agregarle).
Una vez compilado el kernel para que tenga soporte para las dos webcams e instalado Motion, en Gentoo al menos, es coser y cantar.
Motion hace exactamente lo que necesito y mas inclusive. Corriendo sobre Gentoo, donde Ubuntu me dejaba sin microprocesador -por tantas pelotudeces que carga en el entorno gráfico y por fuera del mismo-, Gentoo va extra liviano. Con 7 Horas de uptime y mientras corre Motion y compila Samba:
dvr ~ # uptime
00:19:47 up  7:03,  1 user,  load average: 1.61, 1.66, 1.80
dvr ~ # free -m
total       used       free     shared    buffers     cached
Mem:        477480     424776      52704          0      38620     307212
-/+ buffers/cache:      78944     398536
Swap:      1060248        380    1059868
dvr ~ # cat /proc/cpuinfo
processor       : 0
vendor_id       : CentaurHauls
cpu family      : 6
model           : 7
model name      : VIA Samuel 2
stepping        : 3
cpu MHz         : 799.047
cache size      : 64 KB
Por si no se entendió, 134Mb de ram utilizados, nada de Swap todavía, vamos a ver que pasa después de unos cuantos dias.
Tomando un screenshot cada vez que detecta movimiento y filmando además un video en formato mpeg4, después de 24 Hs de funcionamiento continuado me ha generado un total de 164Mb de información:
dvr ~ # du -sh /home/dvr/video/
164M    /home/dvr/video/
Regla de tres simple, tiene un viejo disco de 80Gb nada mas que para almacenar video, a 170Mb de video/fotografías por día promedio, tengo espacio suficiente como para grabar unos 45 días de corrido, un mes y medio. Nada mal para ser que no gasté ni un centavo.
Un poco de información técnica:
Instalar motion en Gentoo es tan simple como ejecutar:
emerge motion
Y esperar a que termine de compilar. La configuración se controla desde el archivo /etc/motion.conf y es autoexplicativa. Usando el viejo truco, he limpiado de comentarios mi archivo de configuración para que vean como me quedó:
dvr ~ # nocomentarios /etc/motion.conf
daemon on
process_id_file /var/run/motion/motion.pid
setup_mode off
videodevice /dev/video0
v4l2_palette 8
input 8
norm 0
frequency 0
rotate 0
width 640
height 480
framerate 24
minimum_frame_time 0
netcam_tolerant_check off
auto_brightness on
brightness 128
contrast 0
saturation 0
hue 0
roundrobin_frames 1
roundrobin_skip 1
switchfilter off
threshold 1500
threshold_tune off
noise_level 32
noise_tune on
despeckle EedDl
smart_mask_speed 0
lightswitch 0
minimum_motion_frames 1
pre_capture 5
post_capture 0
gap 60
max_mpeg_time 0
output_all off
output_normal on
output_motion off
quality 75
ppm off
ffmpeg_cap_new on
ffmpeg_cap_motion off
ffmpeg_timelapse 0
ffmpeg_timelapse_mode daily
ffmpeg_bps 500000
ffmpeg_variable_bitrate 0
ffmpeg_video_codec mpeg4
ffmpeg_deinterlace off
snapshot_interval 0
locate off
text_right %d-%m-%Y\n%T-%q
text_changes off
text_event %Y%m%d%H%M%S
text_double off
target_dir /home/dvr/video
snapshot_filename %v-%Y%m%d%H%M%S-snapshot
jpeg_filename %v-%Y%m%d%H%M%S-%q
movie_filename %v-%Y%m%d%H%M%S
timelapse_filename %Y%m%d-timelapse
webcam_port 8080
webcam_quality 100
webcam_motion off
webcam_maxrate 24
webcam_localhost off
webcam_limit 0
control_port 8081
control_localhost off
control_html_output on
control_authentication usuario:contraseña
track_type 0
track_auto off
track_motorx 0
track_motory 0
track_maxx 0
track_maxy 0
track_iomojo_id 0
track_step_angle_x 10
track_step_angle_y 10
track_move_wait 10
track_speed 255
track_stepsize 40
quiet on
thread /etc/motion1.conf
El archivo /etc/motion1.conf es una copia idéntica del anterior pero tomando video desde /dev/video1 (la segunda webcam).
Las webcams no tienen ninguna ciencia, son las típicas de 640×480 a 30FPS que en windows no necesitan driver ni nada para funcionar. La PC es un CPU sin monitor, ni teclado ni mouse, escondido para que no se vea, conectado a mi red inalámbrica. Tiene dos discos, uno de 10Gb desde donde Bootea y uno de 80Gb para almacenamiento. Tiene también 512Mb de RAM que nunca llegará a utilizar para nada con Gentoo al parecer. Con 128Mb andaría sobrado seguramente.
En definitiva: Si tenés por ahí una webcam y un CPU viejo tirado y necesitás videovigilancia superprofesional: Zoneminder es para sacarse el sombrero. Para uso doméstico, Motion va mas que bien y hasta donde lo he podido probar funciona todo tal y como debería, mejor inclusive que los 6 o 7 programitas diferentes para windows que probé y que supuestamente cumplían la misma función.
¿Lo mejor de todo?
GRATIS
Mi único gasto fueron los cables extensores USB para poder llevar las webcams lejos del CPU en cuestión.
Moraleja: El que no coje, se deja En informática, lo que parece el atajo es en realidad el camino mas largo entre dos puntos.

Controlar los logs generados por syslog desde una página web

Controlar los logs generados por syslog desde una página web


Usando phpsyslogng se pueden controlar los logs de cualquier PC que corra Linux y Syslog-NG de forma mucho mas visual e intuitiva.
Phpsyslogng provee  además de interesantes gráficos estadísticos y un potente sistema de filtrado por host, aplicación, prioridad y facility.

Para que todo esto funcione es necesario contar con una instalación preexistente de Apache con PHP y MySQL. No voy a entrar en detalles acerca de la instalación y configuración de cada uno de estos servicios por que está fuera del alcance de esta guía.

Instalación:

Usando el gestor de paquetes de su distribución preferida, instalar phpsyslogng. En Gentoo:
echo “app-admin/phpsyslogng mysql” >> /etc/portage/package.use
emerge  phpsyslogng
Opcional, si el servidor Apache está configurado para usar hosts virtuales, se puede instalar solo en uno de estos vhost habilitando la use flag correspondiente.
Una vez instalado, crear la base de datos correspondiente:
mysql> create database syslog;
Query OK, 1 row affected (0.18 sec)
El nombre de la base de datos (syslog) es arbitrario, pero es el que se sugiere por defecto durante la instalación.

Configuración de phpsyslogng:

Para que se rellene la base de datos con las tablas correspondientes basta con apuntar el browser a http://host.dominio.com/phpsyslogng, esto iniciará el asistente para finalizar la configuración en donde se solicitarán el nombre de usuario y contraseña de acceso, parámetros de la base de datos, etc.

Configurando Syslog-NG:

El paso siguiente es configurar Syslog-NG para que pueda convertir los logs a un formato que permita su inserción en la base de datos MySQL, para lo cual basta con editar /etc/syslog-ng/syslog-ng.conf y agregar lo siguiente:
destination d_mysql {
pipe(“/var/log/mysql.pipe”
template(“INSERT INTO logs
(host, facility, priority, level, tag, datetime, program, msg)
VALUES ( ‘$HOST’, ‘$FACILITY’, ‘$PRIORITY’, ‘$LEVEL’, ‘$TAG’, ‘$YEAR-$MON$
‘$PROGRAM’, ‘$MSG’ );\n”) template-escape(yes));
};
log {
source(src);
destination(d_mysql);
};
Como ven, todos los logs se envían al archivo /var/log/mysql.pipe que será el encargado de parsearlos y insertarlos en la base de datos, por lo cual, el próximo paso es generar este archivo.

Creando el pipe /var/log/mysql.pipe

Crear un archivo nuevo de nombre arbitrario y con permisos de ejecución:
touch /usr/bin/syslogasql.sh
chmod +x  /usr/bin/syslogasql.sh
Dentro de ese archivo copiar las siguientes líneas:
if [ ! -e /var/log/mysql.pipe ]
then
mkfifo /var/log/mysql.pipe
fi
while [ -e /var/log/mysql.pipe ]
do
mysql -u aqui_tu_usuario –password=aqui_tu_password syslog < /var/log/mysql.pipe >/dev/null
done
Este archivo ejecutable será el encargado de crear el archivo de tubería que rellene la base de datos con la información obtenida desde los logs del sistema. Tiene que estar en constante ejecución por lo que es conveniente que se ejecute al inicio del sistema. En Gentoo esto se logra agregando el nombre del archivo a /etc/conf.d/local.start:
echo “/usr/bin/syslogasql.sh” >> /etc/conf.d/local.start
Es importante que este archivo no se ejecute antes de que se haya iniciado el servidor MySQL.

¡Y eso es todo!

Mientras syslogasql.sh se mantenga en ejecución, toda la salida de syslog será cargada en la base de datos y podrá ser consultada desde phpsyslogng.

Una vez terminada la instalación, un poco de seguridad:

Borrar el directorio de instalación:
rm -fr /var/www/localhost/htdocs/phpsyslogng/install
Evitar accesos ilegítimos a directorios comprometedores agregando las siguientes directivas al archivo de configuración de Apache:
<Directory “/var/www/phpsyslogng/scripts”>
Deny from all
</Directory>
<Directory “/var/www/phpsyslogng/includes”>
Deny from all
</Directory>
<Directory “/var/www/phpsyslogng/config”>
Deny from all
</Directory>

Reiniciar Linux automáticamente si pierde conexión

Reiniciar Linux automáticamente si pierde conexión


Necesitaba reiniciar una PC en caso de que esta perdiera conectividad, lo que se conoce como “watchdog” – (perro guardián), así que a falta de conocimientos de programación, google de por medio, encontré este escript que transcribo mas abajo, ligeramente adaptado para que cumpla con esta función, ya que el original en realidad envíaba un email avisando del incidente:
#!/bin/sh
### Comprobar conectividad cada 60 segundos
while sleep 60
do
for ip in 192.168.1.100 192.168.1.102 192.168.0.7
do
if ping -c 1 -t 2 $ip >/dev/null
then
echo “$ip da OK”
else
echo “$ip perdió un paquete”
## Esperar 10 segundos y probar de nuevo
sleep 10
if ! ping -c 1 -t 2 $ip >/dev/null
then
echo “$ip perdió dos paquetes, reiniciando…”
reboot
fi
fi
done
done 2>&1
Lo he  guardado como /usr/bin/watchdog y lo he convertido en ejecutable con el comando:
chmod +x /usr/bin/watchdog
Funciona a la perfección. Se podría adaptar para cualquier otro uso, por ejemplo, que en lugar de reiniciar la PC reinicie la conexión de red únicamente, o que registre las desconexiones, etc, etc.
Me lo dejo de ayuda memoria y se los dejo por si le viene bien a alguien.