"La Gaceta de Linux...¡haciendo de Linux algo un poco más adorable!"


[picture of mechanic]

El mecánico de fin de semana

Por Thomas Adam

Traducción al español por Daniel Guerrero
el día 17 de Junio 2002, para La Gaceta de Linux



Bienvenido a la edición de mayo

[ ** Esta edición es dedicada a una querida amiga mía llamada Natalie Wakelin, con quien estoy en deuda por ayudarme recientemente. Ella ha sido una gran y verdadera amiga para mi, y puede que ella no entienda una palabra que este documento "técnico" pueda ofrecer - Se lo dedico a ella de todas maneras. Gracias Natalie!! :-) ** ]


Qué canción las sirenas canten
o qué nombre Aquiles tome
cuando se hizo entre las mujeres,
aunque las preguntas desafiantes
no están más allá de toda conjetura
--Sir Thomas Browne
Tomado de: "Los Asesinatos de la Rue Morgue" -- Edgar Allan Poe

Si, si, ya se. No puedes parar de dar palmadas y aplaudir. Estoy de vuelta :-) En serio, Sólo puedo disculparme por las vacaciones que "El mecánico de fin de semana" ha tomado en los dos meses anteriores. He hecho un gran salto en el mundo de la libertad y la vida universitaria, y la he encontrado más díficil de ajustarme de lo que había anticipado originalmente!!

Pero ese es el porque...

Para los ojos agudos de ustedes, la cita en la parte superior de esta columna resume la habilidad del usuario Linux en general. En efecto, no importa que extraño pueda parecer un problema para estar dentro de linux, no está realmente más allá de la posibilidad de que no pueda ser resuelto usando Linux. He encontrado eso por mi mismo recientemente ;-)

Aparte del trabajo de la universidad, he estado ayudando activamente con problemas en: Hants LUG, tanto en persona como por lista de correo. Acualmente ha sido muy excitante. ¡También he aprendido mucho!

Bien, es suficiente preámbulo para un mes. Disfruta este ejemplar, ¿No lo harás?


Una corta introducción: Squid


¿Qué es Squid?

Aquellos de ustedes que hayan leido la edición de Septiembre recordarán que escribí un artículo acerca del uso de Apache. Tuve una buena respuesta de eso (gracias a todos los que mandaron sus comentarios). Pienso que es una buena idea hacer un tutoral de squid.

Para aquellos de ustedes que no lo conozcan, Squid (aparte de ser una criatura de mar) es un programa proxy de internet de Linux. El ¿porqué fue llamado squid? Aparentemente porque (cita: "todos los buenos nombres ya han sido tomados")

Squid, trabaja canalizando solicitudes de internet a través de una computadora (llamada servidor proxy).

Más aún, squid ofrece la habilidad para filtrar ciertas páginas web, tanto para habilitar o deshabilitar su vista. La habilidad para hacer esto es a través de ACLs (Access Control Lists, Listas de Control de Acceso). Mas sobre esto después.


Instalación

Instalar squid debe ser sólo seguir las instrucciones. Squid está suministrado por todas las distribuciones importantes (RedHat, SuSE, Caldera, Debian, etc) así que debe ser fácilmente accesible desde tus CD's de distribución

Para aquellos que tengan una distribución de Linux que soporte el formato RPM, puedes checarlo para ver si lo tienes instalado, usando el siguiente comando:

rpm -qa | grep -i squid

Si está instalado, entonces debe encontrar que: "squid2-2.2.STABLE5-190" (o similar) es regresado. Si no obtienes respuesta entonces instala squid desde tu CD de distribución

Si squid no está en tu CD de distribución, o estás usando una versión de Linux (como Debian y Slackware) que no soporta el formato RPM, entonces descarga la fuente en formato .tgz (tar.gz) de: http://www.squid-cache.org/download.

Para instalar squid desde las fuentes copia los archivos tar a "/temp" y ejecuta los siguientes comandos:

1. Si no eres el usuario "root", haz su, o inicia una sesión como root
2. cd /tmp
3. tar xzvf ./nombre_de_squid.tar.gz -- [o posiblemente .tgz]
4. Ahora corre:

./configure

5. Después de esto, no deberías tener errores. Entonces puedes simplemente teclear:

make && make install

para compilar e instalar los archivos.

Típicamente, de una instalación estándar RPM, estos directorios serán utilizados

/usr/bin
/etc
/etc/squid (posiblemente -- usado para RH 5.0)
/var/squid/log/
[/usr/local/etc] <-- quizas con un vínculo simbólico a "/etc"

Si estás compilando de la fuente, entonces muchos archivos acabarán en:

/etc
/etc/squid (posiblemente -- usado para RH 5.0)
/usr/local/bin
/var
[/usr/local/etc] <-- quizas con un vínculo simbólico a "/etc"

Basta decir, aunque realmente no importe, pero a menos que hayas solicitado otro modo, estos serán los directorios donde terminarán los archivos.

Ahora que tienes squid instalado, vamos a la siguiente sección... configuración


Configuración

Así que, has instalado squid, y te preguntas..."¿Esto es todo?" ha -- si tan sólo esto fuera cierto, amable lector. No... hay muchas cosas que resta hacer antes de que tengamos un buen servidor proxy viejo.

Nuestros esfuerzos ahora se concentrarán en un archivo /etc/squid.conf. Este es el archivo que contiene todas las configuraciones para squid. Debido a que vamos a editar este archivo, siempre encuentro que es una buena idea mantener una copia del archivo original. Así, que pienso que puede ser una buena idea si ejecutas este comando:

cp /etc/squid.conf /etc/squid.conf.orig

Entonces ejecuta tu editor favorito, y empecemos a editar squid.conf

Actualmente tratando de usar este archivo para ejecutar squid "fuera de la caja" es imposible. Hay un número de cosas que debes de configurar antes de que puedas tener un servidor proxy arriba-y-corriendo. A primera vista, este archivo es bastante largo, pero los desarrolladores han sido amables, debido a que la mayor parte del archivo consiste de comentarios sobre cada opción que está disponible.

La primera cosa, es decirle a squid la dirección IP de la máquina que está operando y qué puerto tiene que escuchar. En squid.conf, debes encontrar una línea comentada que se parece a esto:

#http_port 3128

Quita el comentario a esta línea, borrando el simbolo del gato(#). Ahora, por defecto, el puerto 3128 es escogido. Como sea, debes querer decirle a squid que escuche en un puerto diferente, ¡entonces cámbialo!. De esta manera, en mi máquina, he especificado:

http_port 10.1.100.1:8080

Que obliga a squid a escuchar en la dirección IP de arriba en el puerto 8080. De lo que tienes que tener cuidado es estar seguro que ninguna otra aplicación esté tratando de usar el mismo puerto (como Apache), que es un error muy común que mucha gente hace.

Ahora, mientras avanzamos a través de este archivo de configuración, la siguiente opción importante de configuración que debemos cambiar es cache_mem, Esta opción le dice a squid cuánta memoria debe usarse para cosas como almacenamiento cache.

Sólo le he quitado el comentario a esta línea -- y dejé el default a 8 MB

Más abajo de esta opción están algunas opciones que dicen a squid cúal es la "marca de agua" del mayor/menor cache. Este es simplemente un porcentaje de espacio en disco, que dice que cuando se obtenga entre el 90/95% entonces squid debe empezar a borrar algunos de sus elementos en la cache.

#cache_swap_low  90
#cache_swap_high 95

Simplemente he quitado el comentario a esas líneas, pero he cambiado sus valores. La razón, es porque tengo un disco duro de 60 GB, uno porciento son cientos de mega bytes, así que he cambiado los valores a:

cache_swap_low  97
cache_swap_high 98

Correcto... tan lejos y tan bien. Hemos dicho a squid en cuál IP y puerto escuchar, también cúanta memoria debe usar y además el porcentaje de espacio en disco que debe alcanzar antes de que empiece a borrar sus propios elementos de la cache. ¡¡Grandioso!!, si no lo has hecho, guarda el archivo.

La siguiente y penúltima opción que cambié fue una de las más importantes, debido a que ésta determina el lugar y el tamaño de los directorios de cache. Hay una etiqueta que se parece a:

cache_dir /var/squid/cache 100 16 256

Lo que dice es que para la ruta "/var/squid/cache" cada directorio padre contendrá 100 MB. Habrá 16 directorios padres y dentro de ellos habrá 256 subdirectorios.

El último elemento importante que tomaré en este archivo, antes de movernos a filtrado, es el uso de registros de acceso. Justo abajo de la opción que hemos acabado de configurar para el cache_dir, están opciones para permitir el registro. Típicamente tienes la opción de registrar lo siguiente:

Cada uno de los registros de arriba tienen sus propias ventajas/desventajas en la ejecución del servidor proxy. Típicamente, los únicos registros que conservo son los registros de acceso y el de cache. La razón es simplemente porque el registro de almacenamiento y el de intercambio no me interesan :-).

Es el registro de acceso el que registra todas las peticiones que los usuarios hacen (i.e. que sitio de internet visita un usuario particular). Mientras estaba en la escuela, este archivo fue invaluable determinando cúal usuario estaba tratando de entrar a sitios censurados. Le recomiendo a todos los administradores de sistemas que tienen o están por configurar un servidor proxy de internet que habiliten esta característica -- es muy útil.

Así que, hice lo siguiente (quité el comentario a las siguientes etiquetas):

cache_access_log /var/squid/logs/access.log
cache_log /var/squid/logs/cache.log

Recomiendo que dejes los nombres de los registros como están.

Obviamente, sólo he cubierto las opciones más básicas dentro del archivo squid.conf. Hay mucho más opciones para situaciones particulares. Cada opción está muy bien comentada, así que si deseas ver que hace una opción particular, no debe ser muy difícil.


Filtrando (Control de Acceso)

Esta sección seguirá usando "/etc/squid.conf" pero debo describir las opciones de configuración para el control de acceso con un poco más de detalle.

El control de acceso da al administrador del sistema una manera de controlar cuales clientes pueden actualmente conectarse al servidor proxy, ya sea por dirección IP, por puerto, etc. Esto puede ser útil para computadoras que están en una configuración de red grande.

Típicamente las ACL (Access Control Lists, Listas de Control de Acceso) pueden tener las siguientes propiedades en ellas:

Todos los controles de acceso tienen el siguiente formato:

acl   acl_nombre_configuracion   tipo_de_la_configuracion_acl valores_pasados_a_acl

Así en el archivo de configuración, encuentra la línea:

http_access deny all

Y arriba de ella, agrega las siguientes líneas

acl weekendmechnetwork 10.1.100.1/255.255.255.0
http_access allow weekendmechnetwork

Puedes cambiar el nombre de la acl de "weekendmechnetwork" al nombre que escojas. Lo que esto hace, es que dice que para el nombre "weekendmechnetwork", usa la dirección IP especificada 10.1.100.1 (el servidor proxy), con una máscara de red de 255.255.255.0. Así, "weekendmechnetwork" es el nombre asignado a los clientes en la red.

La línea "http_access allow weekendmechnetwork" dice que la regla es válida, y así puede ser analizada por squid mismo.

La siguiente cosa que debemos hacer, es permitir a clientes seleccionados accesar a internet. Esto es útil para redes donde no todas las máquinas deben conectarse a internet.

Debajo de lo que hemos agregado, podemos especificar algo como:

acl clientes_validos src 192.168.1.2 192.168.1.3 192.168.1.4
http_access allow clientes_validos
http_access deny !clientes_validos

Lo que esto dice es que para el nombre ACL "clientes_validos" con las direcciones IP fuente listadas, permita el acceso a "clientes_validos"(http_access allow clientes_validos), y deshabilite cualquier otro IP que no esté listado(http_access deny !clientes_validos).

Si quieres permitir que todas las máquinas tengan acceso a internet, entonces debes especificar:

http_access allow all

Pero, podemos extender más a las ACL's, diciendo a squid que ciertas ACL's sólo están activas en ciertos periodos, por ejemplo:

1.   acl clienteA src 192.168.1.1
2.   acl clienteB src 192.168.1.2
3.   acl clienteC src 192.168.1.3
4.   acl mañana time 08:00-12:00
5.   acl almuerzo time 12:30-13:30
6.   acl tarde time 15:00-21:00
7.   http_access allow clienteA mañana
8.   http_access allow clienteB tarde
9.   http_access allow clienteA almuerzo
10.  http_access allow clienteC tarde
11.  http_access deny all
[ ** Nota: Omite los números de líneas cuando insertes lo de arriba, se las he agregado para hacer más facil la explicación -- Thomas Adam ** ]

Líneas 1-3 configurar los nombres de la ACL que identificarán a las máquinas.
Líneas 4-6 configurar los nombres de la ACL para los límites específicos de tiempo (formato de 24-horas).
Línea 7 dice que permita al clienteA (y sólo al clienteA) acceder durante las horas de la "mañana".
Línea 8 dice que permita al clienteB ((y sólo al clienteB) acceder durante las horas de la "tarde".
Línea 9 dice que permita al clienteA (y sólo al clienteA) acceder durante las horas del "almuerzo".
Línea 10 dice que permita al clienteC (y sólo al clienteCs) acceder durante las horas de la "tarde".
Line 11 dice que si cualquier otro cliente intenta conectarse -- lo deshabilite.

Pero podemos también hacer uso de la extensión de las ACL's, diciendo a Squid que concuerden ciertas expresiones regulares (regex) en la expresión URL, y en efecto dirigir la solicitud en el bin (o con mayor exactitud -- "&>/dev/null" :-))

Para hacer esto, podemos especificar un nuevo nombre ACL que contendrá el patrón particular. Por ejemplo

1.  acl sitios_desagradables url_regex -i sexo
2.  http_access deny sitios_desagradables
3.  http_access allow cientes_validos
4.  http-access deny all
[ ** Recuerda -- ¡¡no uses los número de líneas de arriba!! ** ]

Línea 1 dice que la palabra "sexo" está asociada con el nombre de la ACL "sitios_desagradables" la cláusula url_regex dice que la ACL es de ese tipo -- i.e. que cheque las palabras contenidas en la URL. La -i dice que debe ignorar la sensitividad al caso.
Línea 2 dice que deniegue a cualquier cliente que acceda al sitio que contenga algo de la ACL "sitios_desagradables".
Línea 3 dice que permita el acceso de los "cientes_validos".
Línea 4 dice que rechace cualquier otra petición.

Así, que supongo que te estás preguntando... "¿Cómo puedo especificar más de una expresión regular?". Bueno, la respuesta es simple... puedes ponerlas en un archivo separado. Por ejemplo, supón que quieres filtrar las siguientes palabras, y denegar el acceso a ellas, si aparecen en la URL:

sexo
pornografia
adolescentes

Puedes agregarla a un archivo (una palabra por línea), en:

/etc/squid/malas_palabras.regex

Entonces, en "/etc/squid.conf" puedes especificar:

acl sitios_malos url_regex -i "/etc/squid/malas_palabras.regex"
http_access deny sitios_malos
http_access allow clientes_validos
http-access deny all

¡¡Que probablemente te haga la vida más fácil!! :-). Esto significa que puedes agregar palabras a la lista cuando las necesites.

También hay un camino más fácil de filtrar ambos, expresiones regulares y nombres de dominio, usando un programa llamado SquidGuard. Más de esto después.....


Inicializando Squid

Ahora llegamos a la parte más importante -- corriendo actualmente squid. Desafortunadamente, si esta es la primera vez que inicializas squid, entonces hay unas cuantas opciones que debes pasárselas.

Típicamente, las opciones más comunes que pueden ser pasadas a squid, pueden ser listadas en la siguiente tabla.

Bandera Explicación
-z Esto crea los directorios de intercambio que squid necesita. Esto debe ser usado sólo una vez cuando corres squid por primera vez, o si tus directorios de cache fueron borrados.
-f Esta opción te permite especificar un archivo alternativo a usar, en lugar del archivo por defecto "/etc/squid/conf". De cualquier manera, esta opción debe ser usada rara vez.
-k reconfigure Esta opción le dice a squid que vuelva a cargar su archivo de configuración, sin detener el demonio de squid.
-k rotate Esta opción le dice a squid que alterne sus registros, y empiece unos nuevos. Esta opción es muy útil en un cron job.
-k shutdown Detiene la ejecución de Squid.
-k check Checa para asegurarse que el demonio de squid está cargado y corriendo.
-k parse Lo mismo que "-k reconfigure".

El listado total, de cualquier manera, para las opciones disponibles es el siguiente:

Uso: squid [-dhsvzCDFNRVYX] [-f archivo_de_configuración] [-[au] puerto] [-k señal]
       -a puerto   Especifica el número del puerto HTTP(por defecto: 3128).
       -d nivel    Escribe información para depuración a stderr también.
       -f archivo  Usa el archivo de configuración dado, en vez de
                   /etc/squid/squid.conf
       -h          Imprime el mensaje de ayuda.
       -k reconfigure|rotate|shutdown|interrupt|kill|debug|check|parse
                   Analiza el archivo de configuración, entonces manda una señal a la copia 
                   corriendo (excepto -k parse) y sale.
       -s          Habilita escribir el registro a syslog.
       -u puerto   Especifica el número del puerto ICP (por defect: 3130), lo deshabilita con 0.
       -v          Imprime la versión.
       -z          Crea los directorios de intercambio.
       -C          No captura las señales de terminación.
       -D          Deshabilita las pruebas iniciales de DNS.
       -F          Reconstrucción rápida en primer plano del almacenamiento.
       -N          No usar modo demonio.
       -R          No poner REUSEADDR en el puerto.
       -V          Acelerador httpd en host virtual.
       -X          Forzar a depuración total.
       -Y          Sólo regresa UDP_HIT o UDP_MISS durante la recarga rápida.

Si estás ejecutando squid por primera vez, entonces inicia como usuario "root" y escribe lo siguiente:

squid -z

Esto creará la cache.

Entonces puedes ejecutar el comando:

squid

Eso es todo -- tienes por ti mismo un servidor proxy ejecutándose. ¡¡Bien hecho!!


Una corta introducción: SquidGuard


¿Qué es SquidGuard?

SquidGuard es un "programa redirigido" externo por donde squid actualmente direcciona las peticiones desde si al demonio externo de SquidGuard. El trabajo de SquidGuard es permitir un mayor control de filtrado del que hace Squid.

Aunque, debe ser señalado que para llevar a cabo el filtrado, el uso de SquidGuard no es necesario para filtros simples.


Instalación

SquidGuard está disponible desde (bastante gracioso) http://www.squidguard.org/download. Este sitio es muy informativo y tiene mucha información útil sobre cómo configurar SquidGuard.

Así como Squid, SquidGuard está disponible en ambos formatos rpm y .tgz.

Si tu distribución soporta el formato RPM entonces puedes instalarlo de la siguiente manera:

su - -c "rpm -i ./SquidGuard-1.2.1.noarch.rpm"

Si tu distribución no soporta el formato RPM, entonces puedes descargar las fuentes y compilarlo, de la siguiente manera:

tar xzvf ./SquidGuard-1.2.1.tgz
./configure
make && make install

Los archivos deberían estar instalados en "/usr/local/squidguard/"


Configuración

Antes de que podamos empezar a editar el archivo "/etc/squidguard.conf" principal, debemos hacer un pequeño cambio en nuestro viejo amigo "/etc/squidguard.conf". En el archivo, localiza la etiqueta:

#redirect_program none

Quita el comentario, y reemplaza la palabra "none" con la ruta al archivo principal de SquidGuard. Si no sabes dónde está el archivo principal, puedes teclear el siguiente comando:

whereis squidGuard

Después inserta la ruta y el nombre de archivo apropiado. Así, debe ahora parecerse a:

redirect_program /usr/local/bin/squidGuard

Guarda el archivo, y entonces escribe lo siguiente:

squid -k reconfigure

Lo que volverá a cargar el archivo de configuración.

Está bien, que la diversión empiece. Habiéndole dicho a squid que usaremos un programa de redirección para filtrar solicitudes mandadas a él, ahora debemos definir reglas que concuerden con eso.

El archivo de configuración principal es "/etc/squidguard". Desde afuera, este archivo se parece a lo siguiente:

-------------------

(version en texto)

logdir /var/squidGuard/logs
dbhome /var/squidGuard/db

src grownups {
    ip	   10.0.0.0/24	  # rango 10.0.0.0  - 10.0.0.255
			  # Además
    user   foo bar	  # Identificar a foo o bar
}

src kids {
    ip	   10.0.0.0/22	  # rango 10.0.0.0 - 10.0.3.255
}

dest blacklist {
    domainlist blacklist/domains
    urllist    blacklist/urls
}

acl {
    grownups {
	pass all
    }

    kids {
	pass !blacklist all
    }

    default {
	pass none
	redirect http://localhost/cgi/blocked?clientaddr=%a&clientname=%n&clientuser=%i&clientgroup=%s&targetgroup=%t&url=%u
    }
}

-------------------

Lo que haremos, es tomar el archivo de configuración en secciones, y explicar lo que cada parte hace.

logdir /var/squidGuard/logs
dbhome /var/squidGuard/db

La primera línea configura el directorio donde el archivo de registro aparecerá, y lo crea si éste no existe.

La segunda línea configura donde se guardarán la(s) base(s) de datos de sitios prohibidos, expresiones, etc.

src grownups {
    ip	   10.0.0.0/24	  # rango 10.0.0.0  - 10.0.0.255
			  # Además
    user   foo bar	  # Identificar a foo o bar
}

El bloque de código de arriba, configura varias cosas. Primero, src "grownups" es definido especificando un rango de direcciones IP, y diciendo cuáles usuarios son miembros de este bloque. Por amor a la conveniencia, los términos genéricos "foo" y "bar" son usados aquí como un ejemplo.

Debes también notar que la etiqueta user sólo puede ser usada si un servidor ident está corriendo en el servidor que direcciona la solicitud al servidor proxy squid, de otra manera será nulo.

src kids {
    ip	   10.0.0.0/22	  # rango 10.0.0.0 - 10.0.3.255
}

Esta sección de sentencias configura otro bloque, esta vez llamado "kids" que es determinado por un rango de direcciones IP, pero sin usuarios.

Puedes pensar de grownups y kids como nombres ACL similares a aquellos encontrados en "/etc/squid.conf".

dest blacklist {
    domainlist blacklist/domains
    urllist    blacklist/urls
    expression blacklist/expressions
}

Esta sección de código es significante debido a que define una lista dest para procesos específicos de filtrado. Por procesos, hay tres maneras principales que SquidGuard aplica a su proceso de filtrado:

1. domainlist -- lista dominios, y sólo esos, una línea a la vez, por ejemplo:

nasa.gov.org
squid-cache.org
cam.ac.uk

2. urllist -- actualmente especificando paginas web específicas (y omitiendo el "www."), ejemplo:

linuxgazette.com/current
cam.ac.uk/~users

3. expression -- palabras regex (expresiones regulares) que deben ser censuradas dentro de la URL, así:

sex
busty
porn

El último bloque de código:-

acl {
    grownups {
	pass all
    }

    kids {
	pass !blacklist all
    }

    default {
	pass none
	redirect http://localhost/cgi/blocked?clientaddr=%a&clientname=%n&clientuser=%i&clientgroup=%s&targetgroup=%t&url=%u
    }
}

Diremos que para el bloque acl, y para la sección "grownups", pasaremos todas las solicitudes a ellos -- i.e. permitiremos aquellas URL's /expresiones, etc, que están contenidos dentro de las listas negras (blacklist) dest.

Entonces, diremos que para la sección "kids", pasaremos todas las solicitudes, excepto aquellas contenidas dentro de la lista negra dest. A este punto, si una URL concuerda con la lista negra dest, entonces será dirigida a la sección default.

La sección default dice que si se encuentran solicitudes que no vienen ni de " grownups" o "kids" entonces no permitirá el acceso al sitio web, y te redireccionará a otra pagina web, que comúnmente es una pagina de error.

Las variables pasadas con esta sentencia de redirección, especifican el tipo de solicitud, etc, para que pueden ser procesadas por un script cgi para producir un mensaje de error personalizado, por ejemplo.

Se debe notar que para que el filtrado se realice, la siguiente sentencia debe estar presente:

default {
  pass none
}

Ya sea con o sin la cláusula redirect.

Hay opciones más avanzadas de configuración que pueden ser usadas dentro de este archivo. Puedes encontrar ejemplos en http://www.squidguard.org/configuration.

Así se termina el tutorial para Squid y SquidGuard. Mayor información puede ser encontrada en todas las direcciones incrustadas en este documento, y en mi sitio web, que se encuentra en la siguiente dirección:

www.squidproxyapps.org.uk

Archivos clave: Un conveniente script BASH de respaldo

Está bien, está bien, se que están pensando "No, otro script de respaldo". Bien, se ha hablado un poco de esto recientemente en la lista de correo de TAG (The Answer Gang), así que, pienso que saltaré en el vagón del grupo.....

Este script es en realidad un tanto simple -- usa un archivo de configuración (texto plano) que lista todos los archivos (y directorios) que quieres respaldar, entonces lo pone en un gzipped tarball, en un lugar específicado.

Aquellos de ustedes que son familiares con el script del shell BASH, deben encontrar esto un poco extraño, de todas maneras, espero que mis comentarios de línea ayuden a aquellos que estén tratando de aprender el shell

-------------------

(Versión en texto)

#!/bin/bash
##############################################################
#keyfiles - archivos de configuración tar/gzip               #
#Versión:   Versión 1.0 (primer borrador)                    #
#Ackn:      basado en una idea de Dave Turnbull              #
#Autor:     Thomas Adam                                      #
#Fecha:     Lunes 28 de mayo 2001, 16:05pm BST               #
#Sitio Web: www.squidproxyapps.org.uk                        #
#Contacto:  thomas@squidproxyapps.org.uk                    #
##############################################################

#Los comentarios aquí dentro son para el beneficio de Dave Turnbull :-).

#Declaración de variables
configfile="/etc/keyfiles.conf"
tmpdir="/tmp"
wrkdir="/var/log/keyfiles"
tarfile=keyfiles-$(date +%d%m%Y).tgz
method=$1           #opciones pasadas a "keyfiles"
submethod=$2        #opciones suministradas a lo largo de "$1"
quiet=0       	    #Se pone en modo verboso(por defecto)

cmd=`basename $0`   #Separa la ruta del nombre de archivo.
optfiles="Usage: $cmd [--default (--quiet)] [--listconffiles] [--restore (--quiet)] [--editconf] [--delold] [--version]"
version="keyfiles: Created by Thomas Adam, Version 1.0 (Tuesday 5 June 2001, 23:42)"

#Maneja el error ...
if [ ! -e $configfile ]; then
  for beepthatbell in 1 2 3 4 5; do
    echo -en "\x07"
    mail -s "[Keyfiles]: $configfile not found" $USER
  done
fi

#Se asegura de que tenemos un directorio de trabajo
[ ! -d $wrkdir ] && mkdir $wrkdir

#Interpreta las opciones enviadas via línea de comando
if [ -z $method ]; then
  echo $optfiles
  exit 0
fi

#Checa la sintaxis de la línea de comandos
check_syntax ()
{
  case $method in
    --default)
    cmd_default
    ;;
    --listconffiles)
    cmd_listconffiles
    ;;
    --restore)
    shift 1
    cmd_restore
    ;;
    --editconf)
    exec $EDITOR $configfile
    exit 0
    ;;
    --delold)
    cd $wrkdir && rm -f ./*.old > /dev/null
    exit 0
    ;;
    --version)
    echo $version
    exit 0
    ;;
    --*|-*|*)
    echo $optfiles
    exit 0
    ;;
  esac
}

#Ahora el trabajo empieza....
#declara la funcion para usar la opción "--default"
cmd_default ()
{

  #tar/gz all files contained within $configfile
  
  if [ $submethod ]; then
    tar -cZPpsf $tmp/$tarfile $(cat $configfile) &>/dev/null 2>&1
  else
    tar -vcZPpsf $tmp/$tarfile $(cat $configfile)
  fi
  
  #If the contents of the directory is empty......
  if test $(ls -1 $wrkdir | grep -c -) = "0"; then
    mv $tmp/$tarfile $wrkdir
    exit 0
  fi
  
  for i in $(ls $wrkdir/*.tgz); do
    mv $i $i.old
  done
 
  mv $tmp/$tarfile $wrkdir 
}

#Lista los archivos contenidos dentro de $configfile
cmd_listconffiles ()
{
  sort -o $configfile $configfile
  cat $configfile 
  exit 0
}

#Restaura los archivos........
cmd_restore ()
{
  cp $wrkdir/keyfiles*.tgz /
  cd /
  
  #Check for quiet flag :-)
  if [ $submethod ]; then
    tar vzxfmp keyfiles*.tgz &>/dev/null 2>&1
    rm -f /keyfiles*.tgz
    exit 0
  else
    tar vzxfmp keyfiles*.tgz
    rm -f /keyfiles*.tgz
    exit 0
  fi
}

#llama a la función principal
check_syntax

-------------------

Es suficiente decir, que los cambios principales que tienes que hacer, son a las siguientes variables:

configfile="/etc/keyfiles.conf"
tmpdir="/tmp"
wrkdir="/var/log/keyfiles"

Como sea, mi script es demasiado inteligente, para checar la presencia de $wrkdir, y si no existe -- lo crea.

También tienes que asegurarte que has puesto los permisos apropiados, así:

chmod 700 /usr/local/bin/keyfiles

El archivo más importante, es el archivo de configuración del script, el mio, se ve como el siguiente:

-------------------

(Versión en texto)

/etc/keyfiles.conf
/etc/rc.config
/home/*/.AnotherLevel/*
/home/*/.fvwm2rc.m4
/home/solent/ada/*
/root/.AnotherLevel/*
/root/.fvwm2rc.m4
/usr/bin/header.sed
/usr/bin/loop4mail
/var/spool/mail/*

-------------------

Debido a que este archivo, es pasado al programa principal tar , entonces el uso de comodines es válido, como en el archivo de arriba.

Se debe notar que cada vez que el archivo corre, el úlimo archivo de respaldo creado, i.e. "keyfiles-DATE.tgz" es renombrado a: "keyfiles-DATE.tgz.old" antes de que el nuevo archivo tome su lugar.

Esto es así ya que si necesitas restaurar el archivo de respaldo alguna vez, mi script sabe cuál archivo usar checando por una extensión ".tgz"

Debido a esta característica, también he incluido una opción "--delold" que borra todos los archivos de respaldo viejos del directorio.

Para usar el programa, teclea:

keyfiles --default

Que empezará el proceso de restauración. Si quieres suprimir la verbosidad, puedes añadir la bandera:

keyfiles --default --quiet

Las otras opciones que el programa toma, son bellamente auto-explicatorias.

Este script de respaldo no significa que sea perfecto, y hay muchos otros buenos disponibles. Cualquier comentario que tengas, ¡¡será apreciado!!


Revisión de programa: Nedit

Tiempo atrás, en los días cuando el fundador ilustre de esta revista especial, John Fisk estaba escribiendo esta columna, otro autor, Larry Ayers la usó para hacer una serie de revisiones de programas. He mencionado brevemente un nuevo programa llamado Nedit, pero nunca lo he revisado.

Así que, lo haré :-)

He estado usando Nedit por cerca de tres años. Hago todo mi trabajo en él -- cuando estoy en X11. Una ventana típica de Nedit, se parece a esta captura de pantalla.

Este programa ofrece una gigantesca selección de características. Probablemente la más popular es la característica de resalte de síntaxis para muchos lenguajes anfitriones, muchos de ellos son:

Si por alguna razón bizarra, tu programa está en un oscuro lenguaje que no está listado arriba entonces puedes especificar tus propios patrones regex.

Nedit también te permite hacer búsquedas complejas y reemplazar métodos usando concordancias de patrones regex sensitivas al caso.

Una típica caja de díalogo de búsqueda / reemplazo, se parece al siguiente:

Permitiéndote hacer búsquedas complejas.

Cada uno de los menús, pueden ser despegados y permanecer como ventanas flotantes. Esto puede ser particularmente útil, si abres y abres un menú particular, y no quieres estar presionando en él cada vez.

Este programa está pre-cargado con opciones, muchas de las cuales estoy seguro son útiles, pero no he sido capaz aún de encontrar un uso para todas ellas. Y por si no fuera suficiente, Nedit te permite escribir macros personalizados así que puedes definir funciones aún más extrañas.

Recomiendo este programa a cualquiera, y como no quiero reinventar el argumento Emacs / Vim, realmente lo consideraría una alternativa viable al sobre-cargado paquete de "X11-Emacs" que ¡¡consume mucha memoria!! :-)

Puedes obtener Nedit de la siguiente dirección:

www.nedit.org

Disfrútalo :-)


Hora de cierre

Bien, eso concluye este mes -- No tenía esperado que ¡¡fuera tan largo!!. Mi año académico está más o menos por terminar, y tengo exámenes al finalizar Mayo. Entonces deberé estar libre para el verano para perseguir todas mis ideas de Linux que se han estado formulando en mi cerebro ( -- eso es lo que quedó después de que Ben Okopnik me lavó el cerebro) :-)

Bien, hasta el próximo mes -- cuídate


Send Your Comments

Cualquier comentario, sugerencia, idea, etc me puede ser enviado haciendo click en la dirección e-mail listada abajo:

mailto:thomas_adam16@yahoo.com


Thomas Adam

Mi nombre es Thomas Adam, tengo 18 años, y actualmente estoy estudiando los niveles-A (=examen de entrada a la universidad). Vivo en una pequeña granja, en el condado de Dorset en Inglaterra. Soy un entusiasta masivo de Linux, y ayudo con documentos proxy de linux mientras estoy en la escuela. He estado usando Linux por cerca de seis años. Cuando no estoy usando Linux, toco el piano y disfruto la caminata y el ciclismo.


Copyright © 2002, Thomas Adam.
Copying license http://www.linuxgazette.com/copying.html
Publicado en el número 78 de Linux Gazette, Mayo 2002