Mortuux

Diario de un estudiante geek. Informática, tecnología, programación, redes, sistemas operativos, bases de datos…

Archivos mensuales: marzo 2011

Bash script que busca hosts en tu red, sincroniza carpetas y después apaga los hosts.

En clase nos pidieron hacer un script que buscase hosts en tu red para después apagarlos, o que incluso antes de apagarse sincronizasen unas carpetas.

He tratado de automatizarlo todo lo que he podido, en mi red funciona perfectamente, y el único requerimiento previo es que todos los hosts tengan instalado un servidor SSH. Este script esta pensado para hosts Linux, pero con algunos pequeños cambios se podría adaptar para Windows también.

El código es el siguiente:

#!/bin/bash

# Find online hosts on your network, backup a directory and halt them

# Copyright (C) <2011> <Adrian Espinosa>

#

# This program is free software: you can redistribute it and/or modify

# it under the terms of the GNU General Public License as published by

# the Free Software Foundation, either version 3 of the License, or

# (at your option) any later version.

#

# This program is distributed in the hope that it will be useful,

# but WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

# GNU General Public License for more details.

#

# You should have received a copy of the GNU General Public License

# along with this program. If not, see <http://www.gnu.org/licenses/&gt;.

# If you don’t want to write every password, you should add the hosts keys to your machine.

clear

f=`echo networkscanned_$(date +%Y%m%d)`

me=`echo $(whoami)`

DIR=”put_here_your_dir_to_sync”

DEST=”put_here_your_destination”

if [ $UID -ne 0 ]

then

echo “Sorry, you have to run this script as root”

else

net=`ip route show | grep / | cut -d ” ” -f1`

echo “Please, wait while your network is scanned”

completescan=`nmap -sP $net | grep “is up” | cut -d ” ” -f2`

clear

echo “$completescan” > $f

gateway=`ip route show | grep via | cut -d ” ” -f3`

cat $f | egrep -v `echo $gateway$` > /tmp/net

cat /tmp/net > $f

rm -rf /tmp/net

ownip=`ip route show | grep src | cut -d ” ” -f12`

cat $f | grep -v $ownip > /tmp/net

cat /tmp/net > $f

rm -rf /tmp/net

echo “Starting synchronization”

for host in $(cat $f)

do

echo “Syncing with $host”

rsync –progress -avhe ssh $me@$host:$DIR $DEST &> backup.log

ssh $me@$host “shutdown -h now” &> backup.log

done

echo “Done. You may check backup.log to see if there are any errors”

rm -rf $f

exit 0

fi # END

Hay que ser root para ejecutarlo y básicamente lo que hace es lo siguiente

  • Si NO eres root
    • Sale del programa
  • Si eres root
    • Detecta tu red y máscara
    • Escanea con nmap y recoge sólo la IP de los hosts y la guarda en fichero
    • Detecta cuál es tu ip y tu gateway y los elimina del fichero anterior
    • Recorre el fichero leyendo cada hosts y haciendo las correspondientes operaciones

.

Este script lo he probado en Debian, y como digo funciona correctamente. En ubuntu hay que hacer unos pequeños cambios que podéis encontrar en mi github, también está publicado este script.

Evitar los atributos en XML.

Algunos de los problemas de (ab)usar de los atributos en XML son:

  • Los atributos no pueden contener valores múltiples. (Los elementos sí)
  • Los atributos no pueden contener estructuras en árbol. (Los elementos sí)
  • Los atributos no se pueden extender fácilmente (para futuros cambios)

Los atributos son difíciles de leer y mantener. Para datos es mejor utilizar elementos. Usa atributos para información que no sea relevante para los datos.

dia=”10″ mes=”01″ anio=”2008″
para=”Marcos” de=”Adrian” asunto=”Recordatorio”
contenido=”No te olvides de mi cumpleaños eh :P”>
</nota>

El código anterior es complicado de leer, y ya que estamos no es para nada bonito. La forma más correcta sería:

<nota>

<fecha>

<dia>10</dia>

<mes>01</mes>

<anio>2008</anio>

</fecha>

<para>Marcos</para>

<de>Adrian</de>

<asunto>Recordatorio</asunto>

<contenido>No te olvides de mi cumpleaños eh:P</contenido>

</nota>

 

Un uso que podemos dar a los atributos en XML es para metadatos, es decir, datos sobre los datos. Por ejemplo:

<nota id=”200″>

<fecha>

<dia>10</dia>

<mes>01</mes>

<anio>2008</anio>

</fecha>

<para>Marcos</para>

<de>Adrian</de>

<asunto>Recordatorio</asunto>

<contenido>No te olvides de mi cumpleaños eh:P</contenido>

</nota>

Esta nota tiene un id “200”, y otra nota cualquiera tendrá otro id diferente, para así diferenciar las posibles notas que haya.

Obteniendo información desde /proc con procinfo.

En  /proc podemos encontrar toda una fuente de información sobre nuestro sistema, y para facilitarnos la tarea, tenemos el comando procinfo, su instalación es muy sencilla:

# apt-get install procinfo

Luego lo ejecutamos con

# procinfo

Y nos mostrará la información del sistema.

Memory: Muestra el total de ram libre y ocupada. También muestra el swap

Bootup: Hora de inicio del sistema.

Load average: Media de ‘jobs’ corriendo, seguido por el número de procesos ejecutables y el número total de procesos, seguido por el PID de el último proceso ejecutado.

User: Cantidad de tiempo empleada en correr ‘jobs’ en el espacio del usuario

Nice: Cantidad de tiempo empleada en ejecutar ‘niced jobs’ en el espacio del usuario

System: Cantidad de tiempo empleada ejecutada en el espacio del kernel

Idle: Cantidad de tiempo sin hacer nada

Uptime: Tiempo que ha estado el sistema activo

Page in: Número de bloques del disco paginados en el núcleo del disco.

Page out: Número de bloques del disco paginados fuera del disco.

Swap in: Número de páginas de memoria paginadas a el swap

Swap out: Número de páginas de memoria paginadas fuera del swap

Interrupts: Número de interrupciones servidas desde que se inició el sistema.

La información completa la puedes encontrar en el respectivo manual del comando.

Drizzle. Fork de MySQL

Como bien indica el título Drizzle es un fork de MySQL, concretamente de la versión 6.0.

Desde entonces ha habido muchos cambios, como los siguientes:

Uso

  • No hay un servidor embebido. El servidor Drizzle no se puede cargar como librería compartida
  • Drizzle está optimizado para entornos concurrentes masivos
  • Diseñado para sistemas POSIX modernos
  • Windows, HP-UX e IRIX no son soportados
  • Drizzle no utiliza timezones. Todo es UTC

Instalación

  • No hay scripts/mysql_install_db o similar. Drizzle se basa en una instalación conocida como “just works” (simplemente funciona)
  • Drizzle puede escuchar en el puerto Drizzle (4427) y/o en el puerto MySQL (3306) y entender los respectivos protocolos

Procedimientos Almacenados

Drizzle actualmente no tiene ningún plugin que implemente procedimientos almacenados. La implementación en MySQL no era óptima

Comandos eliminados

  • ALTER TABLE UPGRADE
  • REPAIR TABLE
  • CREATE FUNCTION
  • CONVERT
  • SET NAMES
  • Borrado y actualizado multi-tabla

Funciones eliminadas

  • crypt()
  • bit_length()
  • bit_count()

Palabras clave eliminadas

  • CIPHER
  • CLIENTE
  • CODE
  • CONTRIBUTORS
  • CPU
  • DEFINER
  • DES_KEY_FILE
  • ENGINES
  • EVERY
  • IO
  • IPC
  • ISSUER

Objetos eliminados

  • No hay requerimiento de un schema mysql
  • No hay SET datatype, hay que usar ENUM
  • No hay comando SET NAMES, UTF-8 por defecto
  • No hay CHARACTER o CHARACTER SET, todo está por defecto en UTF-8
  • No hay TIME, DATETIME o INT
  • No hay TINYINT, SMALLINT o MEDIUMINT. Las operaciones de enteros han sido optimizadas para 32 y 64 bits
  • No hay TINYBLOB, MEDIUMBLOB o LONGBLOB. Hay un BLOB optimizado
  • No hay TINYTEXT, MEDIUMTEXT o LONGTEXT. Usar TEXT o BLOB
  • No hay UNSIGNED
  • No hay tipos de datos espaciales (GEOMETRY, POINT, LINESTRING, POLYGON)

 

Hay bastantes más cambios, pero con estos nos hacemos una idea de más o menos lo que ha cambiado en este nuevo fork que acaba de publicar su primera versión estable.

 

Podéis ver la lista de cambios completos aquí (inglés): Drizzle differences

 

Sistemas de archivos en Linux

Los sistemas de archivos de GNU/Linux se organizan de forma jerárquica, empezando desde el raíz (/)hacia abajo por una estructura de directorios y subdirectorios.

Los sistemas de archivos no se organizan de igual forma en Linux que en Windows. En éste último se utilizan letras de unidad para cada “partición” en un disco local, en un sistema de archivos de red, cd-rom u otro medio de almacenamiento. En Linux se “encajan” dentro del sistema de archivos (son directorios) através de los “puntos de montaje”.

Para acceder a las particiones actualmente configuradas en nuestro sistema (discos duros exclusivamente) utilizamos el comando fdisk -l.Para saber que particiones se están utilizando en este momento en nuestro sistema utilizamos el comando mount . Este comando nos mostrará tanto las particiones disponibles “montadas” como el lugar donde están montadas (punto de montaje).

Punto de montaje: este término se refiere al directorio que se asocia con una partición de disco o concualquier otro dispositivo de almacenamiento secundario.

 

GNU/Linux trata todos los dispositivos como archivos y tiene archivos reales que representan cada dispositivo. En Linux estos “archivos de dispositivo” se localizan en el directorio /dev. En este directorio podemos encontrar los siguientes “archivos de dispositivo”:

/dev/hda Primera unidad IDE.

/dev/hdb Segunda unidad IDE.

/dev/sda Primera unidad SCSI (también utilizada para pendrive)

/dev/sdb Segunda unidad SCSI

/dev/fd0 Disquetera

/dev/cdrom Unidad de CD-ROM

Las “particiones” se nombran igual que el dispositivo pero seguidas del número de partición. Así si tuvieramos 3 particiones el el segundo disco IDE estas se nombrarían:

/dev/hdb1

/dev/hdb2

/dev/hdb3

 

Un sistema de archivos es una forma de escribir los datos en el disco físico.Los ficheros, en casi todos los sistemas de archivos Linux, son sensibles a mayúsculas, es decir, fichero.txt no es Fichero.txt.

En Linux, cuando el sistema operativo entra a operar en modo kernel para resolver un acceso a discotrabaja con una capa intermedia de abstracción de sistema de ficheros que se denomina VFS (Virtual FileSystem). Cada sistema de archivos conoce cómo convertir una orden para VFS en algo que sea implementable en él. Esto permite a Linux trabajar con una cantidad realmente alta de sistemas de ficheros distintos de forma consistente y homogénea.

fichero /etc/fstab

Nos permite definir las particiones que se “montan” en el inicio de sistema, o las que son posible su montaje por parte de usuarios que no sean root. Cualquier dispositivo que no se encuentre en este fichero sólo podrá ser montado por el usuario root. Es un fichero con formato texto (podemos modificarlo con el editor vi) y la siguiente estructura:

1ª columna: Nombre del dispositivo o partición a montar.

2ª columna: punto de montaje.

3ª columna: sistema de archivos

.4ª columna: opciones de montaje

:rw: lectura y escritura

ro: sólo lectura

sw: partición swap

noexec: impide la ejecución

auto: se montará al inicio del sistema

noauto: no se montará en el inicio del sistema

user: permitirá a un usuario normal montar o desmontar el dispositivo en el punto de montaje indicado en la columna 2.

uid o gid: el usuario o grupo que tendrán control sobre los archivos.

5ª columna: por defecto a 0, tiene relación con los errores producidos en el arranque del montaje.

6ª columna: el número de este campo indica si el sistema de archivos necesita ser comprobado.