12 de diciembre de 2008

Echando a andar snmptrapd en mi Slackware Linux

Ahora que por fin calleron vacciones (y pagadas), me puse a meterle la mano al snmotrapd. ¡Por fin!

Para ello fue necesario meterle la mano al archivo de configuración de snmptrapd:

/etc/snmp/snmptrapd.conf

Primero ponemos una configuración bastante simple que es:

snmpTrapdAddr 127.0.0.1
pidFile /var/run/snmptrapd.pid
disableAuthorization yes
logOption f /var/log/snmptrapd.log
outputOption n
printEventNumbers yes

A continuación explicaré brevemente lo que significa cada entrada del archivo:

- snmpTrapdAddr: Define una lista de direcciónes IP que estarán a la escucha de traps. En este caso se utiliza la interfaz local, es decir, sólo se van a recibir traps desde localhost.
- pidFile: Donde va a quedar el archivo de PID.
- disableAuthorization: Deshabilita cualquier tipo de control de acceso y acepta todas las notificaciones entrantes.
- logOption: En este caso se especifica que la bitácora se guardará en un archivo (f) y posteriormente se escribe la ruta del mismo. En este caso, lamentablemente no acepta cosas como logOption f /var/log/snmptrapd.log.`date %Y` que por ejemplo haría que apareciera el año como última extensión, por lo tanto quizás sea buena idea manipularlo con el logrotate.
-outputOption: Especifica cómo se guardarán los OIDs de las notificaciones entrantes, es decir, da formato a los datos que se guardarán en las bitácoras.
- printEventNumbers: Escribe en formato numérico los eventos relacionados con M2M-MIB

Y en el archivo de inicio del sistema /etc/rc.d/rc.snmptrapd se pone una línea más o menos como la siguiente para llevar a cabo el inicio del servicio:

/usr/sbin/snmptrapd -C -a -A -c /etc/snmp/snmptrapd.conf

Básicamente las opciones significan:

-a: Ignorar traps de authenticationFailure
-A: Mantener el archivo de bitácora en lugar de sobreescribirlo.
-c: Obtener la configuración de un archivo.
-C: No leer más archivos de configuración que el que se especificó con la opción -c

Poteriormente agregaré el soporte para el formateo de las traps y notificaciones entrantes.

Saludos!

11 de diciembre de 2008

Echando a andar snmpd en mi Slackware Linux

Por diversos motivos, me vi en la necesidad de echar a volar un par de servicios de snmp en mi linux box, de entrada el snmpd, que es un agente de snmp; y por otro lado, snmptrapd que es un demonio que se encarga de recibir y procesar los traps de snmp enviados por otros equipos, es digamos, la base para construír un sistema de gestión de fallas de elementos de red.

Veamos, ¿qué es snmp?
Según la wikipeadia:
El Protocolo Simple de Administración de Red o SNMP es un protocolo de la capa de aplicación que facilita el intercambio de información de administración entre dispositivos de red. Es parte de la familia de protocolos TCP/IP. SNMP permite a los administradores supervisar el desempeño de la red, buscar y resolver sus problemas, y planear su crecimiento.
Lea el artículo completo aquí: http://es.wikipedia.org/wiki/SNMP

Coninuemos. Para este proyecto utilicé Slackware 12.1.0, el cual ya contiene dentro de sus paquetes el net-snmp-5.4 lo que agiliza las cosas pues ya no es necesario bajarlo. Si este no es su caso, puede obtener las fuentes de: http://www.net-snmp.org

Ok, de entrada vamos a configurar el agente de snmp (snmpd), para esto, me guié del artículo Cómo configurar SNMP escrito por Joel Barrios Dueñas.
Les aconsejo también tener a la mano la página manual de este archivo, pueden consultarla en: http://www.net-snmp.org/docs/man/snmpd.conf.html

Ahora, armados con nuestros manuales de referencia vamos al archivo de configuración, localizado en /etc/snmp/snmpd.conf.

Primero que nada debemos crear una política de acceso, de seguridad pues.
En general podríamos usar solamente las directivas rocommunity y rwcommunity, pero, son muy básicas y solamente van a servirnos para definir las comunidades para lectura/escritura y sólo lectura. Si deseamos generar reglas de acceso un poco más refinadas podríamos utilizar listas de control de acceso:
com2sec localHost 127.0.0.1/32   private
com2sec redLocal 192.168.1.0/24 public
En este caso, creamos dos ACLs, definidas por rangos de ip's, la primera se llama localHost y se refiere al ip 127.0.0.1 y la segunda se llama redLocal y se refiere a la red 192.168.1.0/24
Así mismo, indico que a localHost se le asigna la comunidad "private", y a redLocal se le asigna la comunidad "public".

Posteriormente asigno un grupo RWGroup y un ACL a un acceso, ya sea v1, v2c o usm. v1 es para SNMP v1, v2c para SNMP v2c y usm, en realidad no tengo una idea clara. Aunque asumo que es algo como "Unespecified Security Model".
#Se asigna local al grupo de lectura escritura
group RWGroup v1 localHost
group RWGroup v2c localHost
group RWGroup usm localHost

Lo mismo aplica para el bloque de abajo, en el que asignamos la ACL redLocal al grupo ROGroup, para los accesos v1, v2 y usm.

#Se asigna miredlocal al grupo de solo lectura
group ROGroup v1 redLocal
group ROGroup v2c redLocal
group ROGroup usm redLocal
Después se asignan los permisos para las ramas que se desean ver:

## name   incl/excl subtree   mask(optional)
view all included .1 80

En este caso, creamos una vista llamada "all", a la cual se le indica que tendrá incluída la subrama .1 (que es básicamente la raíz de cualquier OID de SNMP, lo que sinifica que podremos ver todo el árbol), después de esto viene la máscara, que según entiendo da a entender que todo se podrá observar.

Posteriormente asignamos permisos a los grupos:
## group         context  sec.model sec.level prefix read   write notif
access ROGroup "" any noauth exact all none none
access RWGroup "" any noauth exact all all all
Aquí, todo parece claro, ¿cierto?

Finalmente, unas cuantas directivas de configuración

agentaddress 127.0.0.1
sysLocation MiCasita
sysContact AlfredoCampos (alfredo.campos en gmail.com)
sysDescr La PCera Linuxista del Alfredo
trapcommunity public
transink 127.0.0.1
Prometo describirlas con un poco más de calma.

Ahora, el archivo de inicio del servicio.
Como cualquier linuxero podría saberlo, éste se encuentra en /etc/rc.d/rc.snmpd y sólo comentaré que la línea para hacer que esto funcioe es:

/usr/sbin/snmpd -C -a -A -c /etc/snmp/snmpd.conf

¿Cómo sé que funciona?

Bueno, podemos ejecutar el siguiente comando:

snmpwalk -v1 127.0.0.1 -c private .1
Con lo cual podremos observar una lista bastante grande de los datos del árbol de SNMP disponibles para su linuxbox.

Al menos funciona y el demonio se levanta sin mayores complicaciones, claro que falta ponerle opciones paa que guarde un log y algunas monerías más. Eso lo haré próximamente.

¡Saludos!

20 de noviembre de 2008

Cómo modificar la zona horaria en Solaris

Para realizar este proceso es necesario editar el archivo /etc/default/init

Buscaremos una línea que inicia con TZ, que, en realidad es la asignación de una variable de ambiente que podría lucír así:

TZ=US/Eastern

Si quisieramos cambiar esta zona (Esta de Estados Unidos, Florida, NY, etc), habría que modificar por algo como:

TZ="America/Mexico_City"

Y reiniciamos el servidor.

Ahora, suponiendo que sólo queramos modificar la zona horaria para nuestra sesión, entónces se necesario sobreescribir el valor de esta variable de ambiente. Veamos el siguiente ejemplo:

> echo $TZ
America/Mexico_City
> date
Fri Dec 5 11:09:38 CST 2008
> setenv TZ "US/Eastern"
> date
Fri Dec 5 12:09:57 EST 2008
> echo $TZ
US/Eastern

En realidad lo único que sucedió fue que ocurrió un ajuste en el tiempo, pero la hora del sistema en sí nunca se modificó. Es decir, si en este momento son las 11:09 CST, entónces en Florida son las 12:09 EST.

Lo mismo sucedería si cambiáramos la zona horaria y quisiéramos tener nuestro reloj puesto a GMT o UTC, veamos:

> echo $TZ
America/Mexico_City
> date
Fri Dec 5 11:15:57 CST 2008
> export TZ="UTC"
> date
Fri Dec 5 17:16:18 UTC 2008

Ahora, lo mismo que en el primer ejemplo, si en la Cd de México son las 11:15 CST, la hora UTC sería las 17:16. Recuerden que la zona horaria del centro de México es GMT-6 (UTC-6).

En sí, es muy importante recordar que la hora como tal no cambia, sólo se ajusta a la zona horaria. Para cambiar la hora y fecha (mas no la zona horaria), utilícese date.

Saludos!

Comandos para monitorear el desempeño en Solaris

1. sar (System Activity Reporter)

sar
-d => display activity for all block device
-g/p => paging activities
-m => message & semaphore activities
-u => CPU utilization
-v => Reports status of process, i-node, file tables


2. iostat (Input/Output Statistics) en Solaris

Esta herramienta reporta de manera iterativa la actividad de E/S de terminales, discos y cintas, así como el uso del CPU.

La sintáxis típica del comando es algo como lo siguiente:

> iostat 1 5

Esto significa que cada intervalo de 1 segundo y por 5 veces, el comando nos mostrará


tty sd21 sd23 sd24 sd25 cpu
tin tout kps tps serv kps tps serv kps tps serv kps tps serv us sy wt id
0 76 0 0 0 3 0 17 192 3 75 17 3 7 3 3 22 72
0 693 0 0 0 0 0 0 0 0 0 17 4 6 0 3 48 48
0 670 0 0 0 0 0 0 8 2 5 17 4 8 1 4 24 70
0 670 0 0 0 0 0 0 9 2 12 17 4 11 2 5 24 68
0 670 0 0 0 0 0 0 384 3 7 8 2 9 8 8 40 44

Esto es, se nos muestra infomación dividida por 6 bloques de columnas, el primer bloque (tty), concentra dos datos tin y tout, aquí lo que se muestra son los caracteres de entrada y de salida.
Las siguientes cuatro columnas (sd21 a sd25), se refieren a estadísticas de 5 discos duros.
Cada uno de estos discos tiene tres columnas que significan:
  • kps: Bloques por segundo.
  • tps: Transacciones por segundo.
  • serv: Tiempo de servicio promedio, en mlisegundos.
Finalmente, viene una columna especial para el cpu:
  • us: En modo usuario.
  • sy: En modo de sustema.
  • wt: En espera de E/S.
  • id: En modo idle.
Antes de seguir adelante debo mencionarles que la primera línea corresponde a los valores acumulados desde el inicio del servidor hasta el momento de la siguiente iteración.
Las líneas siguientes se refieren a los datos obtenidos desde el momento de la última iteración hasta un segundo después (para efectos del ejemplo, aunque puede elejirse cualquier otro valor).

Sobre este comando, exíste una variante en la cual podemos ver estadísticas extendidas

> iostat -xtc

Una salida típica de este comando sería:

extended device statistics tty cpu
device r/s w/s kr/s kw/s wait actv svc_t %w %b tin tout us sy wt id
sd21 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0 0 0 0 0 0 100
sd22 0.0 0.0 0.4 0.4 0.0 0.0 49.5 0 0
sd23 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0 0
En donde cada columna significa:
  • r/s: Lecturas por segundo.
  • w/s: Escrituas por segundo.
  • Kr/s: Kb leídos por segundo.
  • Kw/s: Kb escritos por segundo.
  • wait: Número promedio de transacciones en espera de servicios (Longitud de la cola)
  • actv: Número promedio de transacciones activamente servidas.
  • svc_t: Tiempo promedio de servicio.
  • %w: Porcentaje de tiempo en que la cola no está vacía.
  • %b: Porcentaje de tiempo en que el procesador está ocupado.
En general este comando nos da información bastante útil respecto al uso que están teniendo los discos del sistema. Ahora, que lo que estaría más interesante sería saber qué procesos están haciendo uso de ellos. De alguna forma también nos puede auxiliar el comando ps, ya que entre sus variadas opciones nos puede mostrar datos sobre el uso de la memoria swap. Aunque esto es sólamente una parte muy pequeña del uso sobre el discu duro pues aún nos faltaría averiguar qué archivos tiene abiertos, en dónde está escribiendo o leyendo, etc.

3. lsof (LiSt of Opened Files)

Para tener una idea de qué procesos tienen abiertos archivos reulares, directorios, sockets (Unix e Internet), archivos especiales de bloques, etc; podemos servirnos del comando lsof, que aunque no es nativo de SunOS, se puede incorporar bajando el paquete de http://www.sunfreeware.com/ En donde se encuentra disponible para solaris 6, 8, 9 y 10.

La sintáxis típica es

> lsof


4. vmstat (Virtual Memory Statistics)

Reporta estadísticas del uso de la memoria virtual sobre los hilos del kernel, discos, memoria virtual, traps y actividad del CPU.

La sintáxis simple es:

> vmstat

Y su salida es:
 kthr      memory            page            disk          faults      cpu
r b w swap free re mf pi po fr de sr s3 -- -- -- in sy cs us sy id
0 0 0 3557544 166696 553 1866 6 3 3 0 0 8 0 0 0 397 10621 2212 9 12 78
En este caso

  • kthr: Reporta el número de hilos del kernel en cualquiera de los siguientes estados:
  1. r: El número de hilos en la cola de ejecución
  2. b: El número de hilos bloqueados, en espera de recursos de E/S.
  3. w: El número de procesos ligeros (LWPs) en swap, esperando por ecursos para finalizar.
  • Report the number of kernel threads in each

memory Report on usage of virtual and real memory.

swap available swap space (Kbytes)

free size of the free list (Kbytes)

page Report information about page faults and
paging activity. The information on each of
the following activities is given in units
per second.

re page reclaims - but see the -S
option for how this field is modi-
fied.
mf minor faults - but see the -S
option for how this field is modi-
fied.
pi kilobytes paged in

po kilobytes paged out

fr kilobytes freed

de anticipated short-term memory
shortfall (Kbytes)

sr pages scanned by clock algorithm

When executed in a zone and if the pools
facility is active, all of the above (except
for "de") only report activity on the pro-
cessors in the processor set of the zone's
pool.

disk Report the number of disk operations per
second. There are slots for up to four
disks, labeled with a single letter and
number. The letter indicates the type of
disk (s = SCSI, i = IPI, and so forth); the
number is the logical unit number.

faults Report the trap/interrupt rates (per
second).

in interrupts
sy system calls

cs CPU context switches

When executed in a zone and if the pools
facility is active, all of the above only
report actitivity on the processors in the
processor set of the zone's pool.

cpu Give a breakdown of percentage usage of CPU
time. On MP systems, this is an average
across all processors.

us user time

sy system time

id idle time


> vmstat 2 5
 kthr      memory            page            disk          faults      cpu
r b w swap free re mf pi po fr de sr s3 -- -- -- in sy cs us sy id
0 0 0 3557544 166696 553 1866 6 3 3 0 0 8 0 0 0 397 10621 2212 9 12 78
2 0 0 3437616 159800 2128 5211 0 0 0 0 0 0 0 0 0 438 13856 2318 35 19 46
5 0 0 3437616 159792 2324 5604 0 0 0 0 0 1 0 0 0 425 14711 2391 39 20 41
0 0 0 3439064 161616 200 552 0 4 4 0 0 2 0 0 0 362 7254 2126 9 6 86
0 0 0 3439064 161616 7 80 0 0 0 0 0 0 0 0 0 352 6649 2099 6 4 90
Aún con lo que hemos visto hay otra opción interesante para este comando que es el switch -p

> vmstat -p 2 3

Cuya salida sería como esta:

memory page executable anonymous filesystem
swap free re mf fr de sr epi epo epf api apo apf fpi fpo fpf
3555664 166616 553 1867 3 0 0 3 0 0 0 0 0 3 3 3
3439168 157080 7 93 0 0 0 0 0 0 0 0 0 0 0 0
3439160 157072 7 80 0 0 0 0 0 0 0 0 0 0 0 0

Como se observa, se agregan nuevas columnas, esto debido a que el modificador -p hace que vmstat reporte también la actividad de la paginación. Las columnas nuevas significan:

epi Executable page-ins.

epo Executable page-outs.

epf Executable page-frees.

api Anonymous page-ins.

apo Anonymous page-outs.

apf Anonymous page-frees.
fpi File system page-ins.

fpo File system page-outs.

fpf File system page-frees.


Debe decirse que en equipos multiprocesadores, vmstat presenta estadísticas promedio de los procesadores. A fin de tener los datos específicos de cada uno de ellos es necesario usar mpstat, herramienta que se describe a continuación.

5. mpstat (Multi Processor Statistics)

Este comando devuelve reportes estadísticos de cada uno de los procesadores o bien, por grupo de procesadores.

La sintáxis común es:

> mpstat

Y su salida es:

CPU minf mjf xcal intr ithr csw icsw migr smtx srw syscl usr sys wt idl
0 1028 0 177 353 243 1083 30 366 62 0 5631 10 13 0 77
1 839 0 205 44 14 1129 29 365 51 0 4990 9 12 0 79
Esto significa básicamente que en el sistema tenemos instalados dos procesadores, y si revisamos las cuatro últimas columnas encontraremos algo interesante, ahí se describe el porcentaje que el procesador ha dedicado a procesos de usuario (usr), procesos de sistema (sys), así como el porcentaje de tiempo que ha pasado esperando por E/S (wt) y finalmente el porcantaje de tiempo que el procesador ha estado inactivo (idl).

El resto de las columnas son:
  • minf: Fallas menores
  • mjf: Fallas mallores
  • xcal: Llamadas cruzadas interprocesadores.
  • intr: Interrupciones.
  • ithr: Interrupciones como hilos.
  • csw: Cambios de contexto
  • icsw: Cambios involuntario de contexto
  • migr: Migración de hilos (a otros procesadores)
  • smtx: Spins en mutexes (bloqueo no adquirido en el primerintento)
  • srw: Spins en bloqueos de lectura/escritura (bloqueo no adquirido en el primerintento)
  • syscl: Llamadas al sistema
  • set: Grupo de procesadores al que se pertenece
  • usr: Porcentaje de tiempo en procesos de usuario.
  • sys: Porcentaje de tiempo en procesos de sistema.
  • wt: El tiempo de espera de E/S no se calcula ya como porcentaje de tiempo de CPU, por lo tanto siempre va a regresar 0 su medición.
  • idl: Porcentaje de tiempo sin utilizar.

6. Comandos proc (Processes Commands)

Este conjunto de comandos toma información sobre
  • pflags:
  • pcred
  • pldd
  • psig
  • pstack
  • pfiles
  • pstop
  • prun
  • pwait
  • ptime


19 de noviembre de 2008

Algunas consultas útiles de SQL para Oracle

Debido a mis actividades laborales, trabajo con frecuencia con la base de datos Oracle. Nunca falla que hay problemas con los rollback segments o bien hay que agregar datafiles o incluso hay que buscar qué proceso del sitema operativo se quedó colgado para eliminarlo y poder desmontar la base de datos, ver los tamaños de los índices o incluso algo tan simple como volcar la salida de na consulta a un archivo para su posterior revisión. He recopilado algunas de estas consultas y comandos que quizás les puedan ser de utilidad. Debo aclarar que no oy experto en Oracle por lo que estas consultas están sujetas a mejoras.

1. Volcado de la salida de una consulta hacia un archivo

set lines 100 pages 250
col SEGMENT_NAME format a25
col owner format a7
spool /tmp/datos.txt

select (columnaA"@@"columnaB) from miTabla;
spool off;

Primero modificamos el formato de la salida, despues indico que quiero que los datos se vayan hacia el archivo /tmp/datos.txt, ejecuto mi consulta agregando como separador de campos una doble arroba, para manipularlos facilmente y finalmente termino el proceso de volcado. Cabe mencionar que pueden mandar tantas consultas como necesiten.

2. Revisión del tamaño de los datafiles

select * from dba_data_files;

Mediante esta consulta podrán ver el tamaño que tienen disponible sus datafiles y darse una idea de si necesitan incrementarlos o crear alguno nuevo.

3. Revisión del tamaño de los tablespace_names

select TABLESPACE_NAME, sum(BYTES) BYTES from dba_data_files group by TABLESPACE_NAME ;

Con esta consulta ppodrán ver el tamaño en bytes de sus tablespace names.

4. Revisión de todos los procesos del SO que actualmente acceden a la BdD

select ADDR, PID, SPID, USERNAME, SERIAL#, TERMINAL, PROGRAM, BACKGROUND, LATCHWAIT, LATCHSPIN from v$process;

La salida de esta consulta indica los procesos del sistema operativo que están accediendo a la base de datos. Con esto, se podrán dar cuenta qué proceso se quedó colgado, o quién está usando mucha memoria.

5. Revisión de un proceso particular del SO en la BdD

SELECT b.sid SID,b.serial# "Serial#", c.spid "srvPID", b.osuser, b.username, b.status, b.client_info,b.program,b.LOGON_TIME,d.sql_text,b.machine FROM v$session b, v$process c, v$sqlarea dWHERE b.paddr = c.addr and b.sql_hash_value=d.hash_value and b.sql_address=d.addressand c.sPID = &OSPID

Esta consulta lo ayudará a determinar específicamente si un proceso en particular del OS está acediendo a la base de datos.

6. Consulta de los índices asociados a una tabla en particular

select * from all_indexes where table_name = 'miTabla';

Mediante esta consulta podráns saber los nombres de los índices asociados a una tabla en particular.

7. Consulta de la columna asociada a un índice en particular.

select * from all_ind_columns where index_name = 'miIndice';

Devuelve el nombre de la columna que está indexada por un índice en particular.

8. Creación de un índice para una columna.

CREATE INDEX miIndice ON miTabla(columnaA) tablespace INDX;

9. Creación de un índice para varias columnas.

CREATE INDEX miIndice ON miTabla(columnaA,ColumnaB,..,ColumnaZ) tablespace INDX;

10. Eliminación de un índice.

DROP INDEX miBase.miIndice;

11. Alteración del tamaño de los maxextents para un índice.

ALTER INDEX miBase.miIndice STORAGE (maxextents unlimited); (Para hacerlo ilimitado)
ALTER INDEX miBase.miIndice STORAGE (maxextents 8192); (Para darle un tamaño de 8Mb)

12. Alteración del tamaño de los maxextents para una tabla.

ALTER TABLE miBase.miTabla STORAGE (maxextents unlimited); (Para hacerlo ilimitado)
ALTER TABLE miBase.miTabla STORAGE (maxextents 8192); (Para darle un tamaño de 8Mb)

13. Cálculo del tamaño del tablespace SYSTEM

select TOTAL_BLOCKS from dba_free_space_coalesced where tablespace_name = 'SYSTEM';

Muy útil para saber si se les anda llenando este espacio de tablas.

14. Alteración del tamaño de un datafile.

alter database datafile '/u02/oradata/miSID/system01.dbf' resize 5120M;

15. Agregación de un datafile.

alter tablespace system add datafile '/u02/oradata/miSID/system02.dbf' size 1024M;

Por el momento es lo que tengo, ojalá les sean de utilidad.

16. Revisión del estado de los rollback_segments
select segment_name,tablespace_name,status from dba_rollback_segs;

17. Creación de un Rollback segment

CREATE ROLLBACK SEGMENT rollbacksegment_name TABLESPACE SYSTEM storage (initial 10k next 10k minextents 2);

Y después hay que traerlo online.

alter rollback_segment rollbacksegment_name online;

18. Cambiar el tamaño de un rollback segment

ALTER ROLLBACK SEGMENT rollbacksegment_name STORAGE (MAXEXTENTS 12288);

Monitoreo de procesos con top/watch hecho en casa.

Yo, al igual que muchos otros administradores de sistemas allá afuera, estoy muy acostumbrado a monitorear el uso de los recursos de los sistemas usando el comando top. Precisamente en relación con mi post anterior, resulta que durante varios momentos del proceso de jumpstart me vi en la necesidad de entrar al servidor nuevo y obvio, de revisar los procesos que se ejecutaban en ese momento. De pronto, lo impensable: ¡No había top instalado!.

El siguiente comando, ejecutado en un shell bash hará el truco. Aunque quizás no tendrán la opción de ordenar la salida, pero al menos les ayudará en su tarea:

> while [ 1 ] ; do clear ; ps -ea -o pid,pcpu,pmem,rss,vsz,osz,s,args head -25 ; sleep 1 ; done

Quizás así lo vean un poco confuso, por lo que lo pondré como si fuera un shell script:

0: #!/bin/bash
1: while [ 1 ] ; do
2: clear
3: ps -ea -o pid,pcpu,pmem,rss,vsz,osz,s,args head -25
4: sleep 1
5: done


Ahora, en la línea 0 se declara la ruta del intérprete de comandos, en la línea 1, se define un ciclo while infinito, resulta clara esta afirmación puesto que la instrucción while(1) siempre va a ser verdadera.
En la línea 2 se manda a limpiar la pantalla, en la línea 3 se muestran las primeras 25 líneas de la salida del comando ps. La línea 4 detiene por 1 segundo la ejecución del script y finalmente, en la línea 5 se cierra el ciclo.

En realidad, este esquema les puede servir para automatizar el despliegue de comando, al estilo de lo que hace watch. Para el que no sepa, watch ejecuta un comando cíclicamente ad infinitum.

Por ejemplo, si estuviésemos instalando un software muy grande y nos interesa monitorear el espacio de los filesystems. La sintaxis sería:

> watch -n 1 "df -h" (En Linux)

o bien

> watch -n 1 "df -F ufs -h" (En solaris 9 o superior)

En nuestro home-made watch quedaría como:

0: #!/bin/bash
1: while [ 1 ] ; do
2: clear
3: df -F ufs -h
4: sleep 1
5: done


Ojalá esto les pueda ayudar.

13 de noviembre de 2008

3 días Jumpstarteando un servidor

Sí, aunque usted no lo crea, llevo ya 3 días ejecutando jumpstart sobre un servidor de un cliente de la empresa. La empresa ha sido ardua, como se lo imaginarán. Eso sí, como todo en la vida, deja enseñanzas, sobre todo el cómo se ejecuta este procedimiento.

Al menos hasta ahora he aprendido bastante sobre el archivo de perfil de hardware y sobre la menara de ejecutar los procesos que quedaron "colgados" en sesiones anteriores.

Ahora, veamos brevemente qué es esto del jumpstart: Es un proceso mediante el cual podemos instalar uno o muchos sistemas con sólo un perfil. También se pueden definir varios perfiles a la ves para instalar múltiples estaciones de trabajo al mismo tiempo. Para ver más información sobre esto del jumpstart puede consultar: http://docs.sun.com/app/docs/doc/817-0491/6mg9nutco?l=en&a=view&q=Jumpstart

Veamos ahora lo que es un archivo de perfil. Se divide principalmente en dos secciones: La de opciones de los paquetes a instalar (lenguajes entre otras cosas), así como el tipo de instalación y finalmente la sección en la que se define el particionamiento de los discos duros.

Ahora, la primera sección tiene típicamente dos columnas, la del profile keywords y la de profile values. Los keywords son básicamente los nombres de opciones, los values, pues sus valores asignados.

Aquí un ejemplo de la primera sección:

profile keywordsprofile value
-------------------------------------------
install_typeinitial_install
system_typeserver
clusterSUNWCXall
geoN_Amerca
geoW_Europe
geoE_Europe
geoN_Europe
geoS_Europe
packageNSCPcom delete
partitioningexplicit


  • install_type: Define si es que el sistema operativo a instalar se va a sobreescribir, si se va a actualizar, o bien, si se va a hacer una instalación nueva. En algunos casos, también podría indicar si se va a utilizar una imagen flash.
  • system_type: Indica el tipo de sistema en el que se va a instalar el solaris.
  • cluster: Define el tipo de software que se va a instalar.
  • geo: Indica los paquetes de lozalización que se van a instalar. En pocas palabras, los lenguajes.
  • package: Sirve para agregar o quitar paquetes de software.
  • partitioning: Define el esquema de particionamiento que se va a utilizar durante la instalación. De no agregar esta opción, se utiliará el esquema por defecto.
En pocas palabras, el ejemplo de arriba indica que se va a hacer una nueva instalación para un servidor. Se va a instalar todo el software de la distribución (all), excepto el paquete de software de Netscape. En cuanto a los lenguajes, se van a instalar los de Europa (Norte, Sur, Este y Oeste) y el de Norte América. Finalmente se va a hacer un particionamiento explícito, es decir, que viene definido abajo.

otro ejemplo podría ser:

profile keywordsprofile value
-------------------------------------------
install_typeflash_install
archive_locationnfs 148.228.20.1:/opt/jstart2/jumpstart/Flash/Sun4u-JS-Sol9-FlarImage
partitioningexplicit



En este caso, se le indica a la máquina que la instalación se hará a partir de una imagen flash, que se llama Sun4u-JS-So9-FlarImage que se obtendrá por medio de NFS desde 148.228.20.1 en el directorio /opt/jstart2/jumpstart/Flash/. Nuevamente, el particionamiento es explícito.

Cabe mencionar que cuando se usa una instalación flash no es posible utilizar la opción geo. La voz de la experiencia.

  • archive_location: Indica la localización de la imagen flash en el servidor del jumpstart.


Ahora, un ejemplo de cómo se hace la definición de las particiones:

# filesysslicesizefilesystem
#-------------------------------------------
filesysc0t9d0s04096/
filesysc0t9d0s12048swap
filesysc0t9d0s36144/var
filesysc0t9d0s44096/usr
filesysc0t9d0s5free/opt
filesysc0t10d0s02048swap
filesysc0t10d0s115216/u01
filesysc0t11d0s02048swap
filesysc0t11d0s115216/u02
filesysc0t12d0s02048swap
filesysc0t12d0s115216/u03
filesysc0t13d0s02048swap
filesysc0t13d0s115216/u04
filesysc0t14d0s02048swap
filesysc0t14d0s115216/u05


Aquí podemos sacar varias cosas:

  1. Se stán utilizando 6 discos duros, que van desde c0t9d0 hasta c0t14d0, cada uno con una capacidad de 18 Gb.
  2. El primer disco tiene 5 particiones, mientras que los 5 restantes tienen sólo 2.
  3. Todos los discos duros deben tener un espacio para swap.
  4. El amaño de las particiones viene dado en Mb, excepto quinta la partición del primer disco, cuyo tamaño viene como free, lo que indica que se utilizará todo el espacio disponible después de crear las particiones que tienen un tamaño explícito.
  5. Nunca se utiliza la partición número 2, puesto que indica regularmente el disco entero. Si la llegan a usar, hay grandes probabilidades de que tengan errores. En mi experiencia, si usan la partición 2, cuando intenten crear una arcivo dentro de ésta, les va a marcar un error de MAXSYMLINKS reached. Como si se hubera alcanzado el límite máximo de ligas simbólicas posibles dentro de un sistema de archivos. ¿A que no sabían esto eh?
  6. A diferencia de linux, en donde la nomenclatura de las perticiones es del estilo de hda1, sda3, etc; la nomenclatura en Solaris es del tipo cWtXdYsZ. Donde W es el número de la controladora (HBA), X es el número de target, que es básicamente una dirección de hardware, única asignada a cada unidad, ya sea un disco, cdrom o una cinta. Y es la dirección del disco dentro de la controladora y finalmente Z es el número de slice o de partición.

Puede consultar más información sobre la convención de nombrado de particiones de Solaris en: http://docs.sun.com/app/docs/doc/801-7038/6i1cfovsu?a=view

Finalmete, pueden encontrar mucha más información sobre los keywords y sus valores en la siguiente dirección: http://docs.sun.com/app/docs/doc/817-5506/6mkv6kiat?a=view

12 de noviembre de 2008

La falta de ética y la socidad mexicana

¿Y como para qué hablar sobre ética y moral en la sociedad mexicana en un blog que está principalmente dedicado a la tecnología, UNIX y sus amigos?

Resulta que en uno de esos viajes de Puebla al DF, leí un artículo publicado en el Diario Síntesis, titulado: Alarma falta de ética en la sociedad Mexicana: académico de la UMAD.

De lo que se trata básicamente es de que en la sociedad mexicana los niveles de ética son muy bajos tanto en hombres como en mujeres, sin distingo de edad, estudios e incluso nivel socio eonómico. Y supongo que nos hemos tomado con más de un ejemplo a diario.

Ahora, antes de continuar, aunque este artículo no pretende de ninguna manera ser una lección sobre lo que es ética y lo que es moral, me permito reproducir integramente un estracto tomado de Wikipedia en donde se aclara la diferencia entre estos dos términos.

"(La Ética) Tiene como objeto de estudio la moral y la acción humana. Su estudio se remonta a los orígenes de la filosofía moral en Grecia y su desarrollo histórico ha sido diverso. Una doctrina ética elabora y verifica afirmaciones o juicios. Esta sentencia ética, juicio moral o declaración normativa es una afirmación que contendrá términos tales como 'malo', 'bueno', 'correcto', 'incorrecto', 'obligatorio', 'permitido', etc, referido a una acción o decisión. Cuando se emplean sentencias éticas se está valorando moralmente a personas, situaciones, cosas o acciones. De este modo, se están estableciendo juicios morales cuando, por ejemplo, se dice: "Ese político es corrupto", "Ese hombre es impresentable", "Su presencia es loable", etc. En estas declaraciones aparecen los términos 'corrupto', 'impresentable' y 'loable' que implican valoraciones de tipo moral.
La ética estudia la moral y determina qué es lo bueno y, desde este punto de vista, cómo se debe actuar. Es decir, es la teoría o la ciencia del comportamiento moral."

Puede consultar el artículo completo aquí (http://es.wikipedia.org/wiki/%C3%89tica).

O bien:

"Muchos autores consideran como sinónimos a estos términos. Sin embargo, en el ámbito de la filosofía se considera a la ética como una de sus partes principales. De ahí que podemos decir que una ética propuesta es el conjunto de normas sugeridas por un filósofo, o proveniente de la religión, en tanto que moral vendría a designar el grado de acatamiento que los individuos dispensan a las normas éticas imperantes en el grupo social. En un sentido práctico, ambos términos se hacen indistinguibles y por ello se los considera equivalentes.
El matiz que las delimita está en la observación o aplicación práctica de la norma que entraña el mandato ético. Por ello, la norma ética siempre será teórica, en tanto que la moral o costumbre será su aplicación práctica.
Por otro lado la moral se basa en los valores en lo que la conciencia nos dicta."

Puede consultar el artículo completo aquí: http://es.wikipedia.org/wiki/Moral#Moral_y_.C3.A9tica.

Ahora bien, supongo que todos hemos visto esos comerciales que pasan en la tele, tan famosos los de "¿Tienes el valor o te vale?". En ellos se describe perfectamente lo que sucede día con día en nuestras ciudades, en donde bajo una cantidad enorme de pretextos, nuestros compañeros de al lado (o incluso nosotros mismos) nos convertimos en unos verdaderos cavernícolas. Vaya, podemos hacer una ennumeración bastante somera de casos:
  • Quien se estaciona en el lugar para discapacitados (o como les quieran decir ahora).
  • Quien estando comodamente sentado en el transporte público se hace el desentendido y no cede el lugar a una mujer que va cargando chamaco y bolsas del súper.
  • Quien ocupa tu lugar en el autobús/teatro/etc sin el menor asomo de remordimiento intenta hacerte sentar en donde NO te toca.
  • Quien se estaciona en doble fila en una calle angosta.
  • Quien en la autopista se mete en el acotamiento para "saltarse" la fila de carros antes de la caseta.
  • Quien, aún habiendo espacio suficiente ascelera y te lanza el carro con tal de no dejarte cambiar de carril. Y esto, desde que pones la direccional para avisar con antelación tus satánicas intenciones.

En fin, que al son de "el gandalla no batalla" podemos continua ad infinitum.

¿Y esto a razón de qué? Pienso que tiene muchoque ver con nuestra doble moral. Al principio de mi vida en el DF pensé que se debía en mayor medida a que los recursos son pocos y el espacio es aún menor, pues hay que ser un poco más agresivos para conseguir nuestros fines. Poco a poco me he ido desengañando y me doy cuenta ahora de que es un problema que permea a todos niveles de nuestra sociedad. ¿Usted qué opina querido lector?

1 de octubre de 2008

ps para monitorear activamente los procesos

El comando ps, como casi todo el mundo sabe, sirve para devolver el estado de uno o varios procesos en un momento determinado. Supongo que algunos de nosotros hemos usado en Linux el famoso "ps aux", o su equivalente en Solaris "ps -fea".

Por motivos de trabajo me vi en la necesidad de monitorear procesos que consumían tiempo de procesador e incluso memoria virtual. Afortunadamente me encontré con que exíste la opción -o que permite especificar el formato de salida, es decir, los datos que queremos que aparezcan.

Las opciones que hallé son las siguientes (tomadas de la página manual de ps de Solaris)

user The effective user ID of the process. This will be the textual user ID, if it can be obtained and the field width permits, or a decimal representation otherwise.

ruser The real user ID of the process. This will be the textual user ID, if it can be obtained and the field width permits, or a decimal representation otherwise.

group The effective group ID of the process. This will be the textual group ID, if it can be obtained and the field width permits, or a decimal representation otherwise.

rgroup The real group ID of the process. This will be the textual group ID, if it can be obtained and the field width permits, or a decimal representation otherwise.

pid The decimal value of the process ID.

ppid The decimal value of the parent process ID.

pgid The decimal value of the process group ID.

pcpu The ratio of CPU time used recently to CPU time available in the same period, expressed as a percentage. The meaning of ``recently'' in this context is unspecified. The CPU time vailable is determined in an unspecified manner.

vsz The total size of the process in virtual memory, in kilobytes.

nice The decimal value of the system scheduling priority of the process. See nice(1).

etime In the POSIX locale, the elapsed time since the process was started, in the form:
[[dd-]hh:]mm:ss
where

dd is the number of days
hh is the number of hours
mm is the number of minutes
ss is the number of seconds

time In the POSIX locale, the cumulative CPU time of the process in the form:

[dd-]hh:mm:ss

The dd, hh, mm, and ss fields will be as described in the etime specifier.

tty The name of the controlling terminal of the process (if any) in the same format used by the who(1) command.

comm The name of the command being executed (argv[0] value) as a string.

args The command with all its arguments as a string. The implementation may truncate this value to the field width; it is implementation-dependent whether any further truncation occurs. It is unspecified whether the string represented is a version of the argument list as it was passed to the command when it started, or is a version of the arguments as they may have been modified by the application. Applications cannot depend on being able to modify their argument list and having that modification be reflected in the output of ps. The Solaris implementation limits the string to 80 bytes; the string is the version of the argument list as it was passed to the command when it started.

f Flags (hexadecimal and additive) associated with the process.

s The state of the process.

c Processor utilization for scheduling (obsolete).

uid The effective user ID number of the process as a decimal integer.

ru+id The real user ID number of the process as a decimal integer.

gid The effective group ID number of the process as a decimal integer.

rgid The real group ID number of the process as a decimal integer.

projid The project ID number of the process as a decimal integer.

project The project ID of the process as a textual value if that value can be obtained; otherwise as a decimal integer.

sid The process ID of the session leader.

taskid The task ID of the process.

class The scheduling class of the process.

pri The priority of the process. Higher numbers mean higher priority.

opri The obsolete priority of the process. Lower numbers mean higher priority.

lwp The decimal value of the lwp ID. Requesting this formatting option causes one line to be printed for each lwp in the process.

nlwp The number of lwps in the process.

psr The number of the processor to which the process or lwp is bound.

pset The ID of the processor set to which the process or lwp is bound.

addr The memory address of the process.

osz The total size of the process in virtual memory, in pages.

wchan The address of an event for which the process is sleeping (if -, the process is running).

stime The starting time or date of the process, printed with no blanks.

rss The resident set size of the process, in kilobytes.

pmem The ratio of the process's resident set size to the physical memory on the machine, expressed as a percentage.

fname The first 8 bytes of the base name of the process's executable file.

Ahora, construí un pequeño script que ejecuta

ps -ea -o pid,pcpu,pmem,vsz,osz,rss,etime,s,args | awk '{print $1","$2","$3","$4","$5","$6","$7","$8",\""$9,$10,$11,$12,$13,$14,$15"\""}' > estadoDeMemoria.csv

De manera que obtengo el PID, el porcentaje de uso del procesador, el porcentaje del uso de la memoria, el tamaño de la memoria virtual usada en Kbs, el tamaño de memoria virtual en páginas, el tamaño del segmento residente, el tiempo que lleva de ejecución, el estado del proceso y el comando asociado junto con sus argumentos.
Esto, más crontab y grep devuelven una cantidad considerable de información, sobre todo si lo ejecutamos cada cinco minutos.

Ahora, suponiendo que en cada ejecución se genere un archivo de salida (estadoDeMemoria.csv), podremos también crear un script que parsee las salidas a fin de obtener un concentrado que sólo indique los cambios y los porcentajes de uso por cada rubro.

Ya sé, ya sé, hay productos por ahí que ya hacen eso, pero ¿no es agradable crear tu propio monitor de procesos casero?

¡Saludos!

Lo más básico de la seguridad en GNU/Linux

Hoy precisamente vi el blog de mi amigo José (Cuetzpallin), escribió un artículo muy interesante sobre varios tips de FreeBSD/Linux/Solaris. En uno de los apartados habla sobre los permisos que se pueden imponer a los scripts de shell con limits. En él, hace referencia al archivo de límites de PAM. Eso me llevó a recordar que hace tiempo impartí un curso de Linux en el que entre otras cosas hablé sobre los detalles más básicos del fortalecimiento de un servidor.
Sobre esto, sucede que los administradores nos preocupamos mucho en cuanto al aseguramiento del perímetro del servidor, poniéndole firewalls y cuanta cosa encontramos en la red y olvidamos lo que podríamos hacer si es que alguien logra obtener un shell por medio de una cuenta de usuario. Afortunadamente el propio sistema operativo trae algunas herramientas simples que nos pueden ayudar en nuestra tarea:

1. Archivo /etc/lilo.conf

Este es el archivo de configuración del LInux Loader (Cargador de Linux), de ahí su nombre (LILO).
Página manual: man 5 lilo.conf

Para asegurar que se teclee un password cuando se quiera arrancar un kernel, es necesario usar el keyword:
password=
Si se agrega esta opción es necesario hacer que el archivo sea de lectura sólo por el root.
Esto se logra con un: chmod 600 /etc/lilo.conf

restricted. Indica que se requerirá de un password durante el proceso de inicio del sistema si es que se especifica algún parámetro del kernel en la línea de comandos, como single.

Para que los cambios tengan efecto es necesario re compilar el archivo de inicio con el comando: lilo -v

2. Archivo /etc/inittab

El archivo inittab describe qué procesos se inician durante la inicialización del sistema y la operación normal. Es aquí en donde se distinguen múltiples run levels (niveles de ejecución), cada uno de los que pueden tener sus propios conjuntos de procesos para ser iniciados.
Página manual: man 5 inittab

Hay que buscar una línea parecida a:

ca:ctrlaltdel:/sbin/shutdown –t5 –r now

En la que se especifica cómo responderá el sistema al recibir la combinación de teclas Ctrl.+Alt+Del, la cual típicamente se usa para reiniciar el sistema.

Al final de esta línea se observa el comando que se ejecutará al recibir esta señal. La idea aquí es modificar las opciones del comando shutdown, el cual tiene un modificador (-a), que indica al sistema que deberá buscar en el archivo /etc/shutdown.allow la lista de usuarios con privilegios de reiniciar el sistema mediante esta combinación de teclas (véase man 8 shutdown).

Hay que modificar esta línea para que quede así:
ca:ctrlaltdel:/sbin/shutdown –t5 –a –r now
Crear el archive /etc/shutdown.allow y escriba el nombre de usuario de aquellos usuarios privilegiados, típicamente sólo se le permitirá al root. De tal forma, nadie más podrá reiniciar el sistema con este método.


3. Archivo /etc/fstab

El fstab o tabla de sistemas de archivos (file systems table), controla la manera en la que son tratados los sistemas de archivos, las opciones con las que se montan, el orden y la frecuencia con la que se revisan.
Página manual: man 5 fstab

Un archivo fstab se compone típicamente de 6 columnas de datos, mediante las cuales se definen los sistemas de archivos de una máquina Linux.
En una máquina personal, este archivo suele tener entradas como estas:

/dev/sda2 swap swap defaults 0 0
/dev/sda3 / ext3 defaults 1 1
/dev/sda1 /root ext3 defaults 1 2
/dev/cdrom /mnt/cdrom auto noauto,owner,ro 0 0
/dev/fd0 /mnt/floppy auto noaout,owner 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
proc /proc proc defaults 0 0

La primera columna indica la partición, la segunda es el punto de montaje, la tercera es el sistema de archivos, la cuarta son las opciones con las que se monta (véase también man 8 mount para una lista completa de las opciones de montaje), la quinta columna indica si el sistema de archivos debe ser revisado por el fsck y la última indica el orden en que debe hacerse esta revisión.

Ahora, en el caso de un servidor generalmente se recomienda tener más particiones, por lo que un esquema recomendable podría ser:

/dev/sda2 swap swap defaults 0 0
/dev/sda3 / ext3 defaults 1 1
/dev/sda1 /root ext3 defaults 1 2
/dev/sda4 /boot ext3 ro,nosuid,noexec,nouser 1 3
/dev/sda5 /tmp ext3 nosuid,noexec,nouser 1 4
/dev/sda6 /var/log ext3 nosuid,noexec,nouser 1 5
/dev/sda7 /usr/local ext3 defaults 1 6
/dev/sda8 /home ext3 defaults 0 0
/dev/cdrom /mnt/cdrom auto noauto,owner,ro 0 0
/dev/fd0 /mnt/floppy auto noaout,owner 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
proc /proc proc defaults 0 0

Las razones para poner tantas particiones son varias:

1. Según la definición de la LFH (http://tldp.org/LDP/Linux-Filesystem-Hierarchy/html/index.html), los directorios que se encuentran definidos aquí como particiones (o al menos la mayoría), no son necesarios para la inicialización de un sistema y por lo tanto pueden quedar como particiones independientes.
2. En un sentido más práctico, /root es en donde el administrador puede guardar todos sus archivos sin inundar el resto de la /. Lo mismo sucede con /home. /boot es en donde se guardan todos los archivos necesarios para el proceso de arranque del sistema, entre otras cosas, guarda la imagen del kernel, si bien aún existen dudas sobre si es sabio o no ponerlo como partición independiente, en este esquema se presenta así a fin de ponerle otorgar permisos de sólo lectura (ro), no ejecución de binairios suid (nosuid), no ejecución de programas (noexec), no manipulación de usuarios (nouser). Ya que nadie realmente más que el administrador debería modificar las imágenes del kernel.
Algo similar se aplica para /tmp, pues es esta partición en la que todos los usuarios pueden escribir, lo cual se torna potencialmente peligroso ya que aquí se pueden subir ciertos programas maliciosos mediante los cuales lanzar ataques internos al servidor. Por otro lado, se podría intentar una saturación del espacio libre desde esta partición.
En /var/log se guardan las bitácoras del sistema y no es buena idea que cualquiera puede ejecutar cosas en él. /usr/local es en donde generalmente (al menos en el caso de Slackware) se instalan los servidores de web /usr/local/apache, bases de datos (/usr/local/mysql y /usr/local/pgsql) y en general el software opcional.

En general, cada administrador puede crear el esquema de particionamiento que mejor le acomode, dependiendo sobre todo del propósito que va a tener el sistema que va a instalar.

4. Archivo /etc/login.defs

Este archivo define la configuración para la suite de programas que manejan los passwords del sistema, en este caso hablamos de la suite de shadow.

Página manual: man 5 login.defs

Este archivo típicamente trae entradas como las siguientes:

DIAPLUS_CHECK_ENAB yes
FAILLOG_ENAB yes
LOCK_UNFAIL_ENAB yes
LOG_OK_LOGINS yes
LASTLOG_ENAB yes
MAIL_CHECK_ENAB yes
OBSCURE_CHECKS_ENAB yes
PORTTIME_CHECKS_ENAB yes
QUOTAS_ENAB yes
SYSLOG_SU_ENAB yes
SYSLOG_SG_ENAB yes
CONSOLE /etc/securetty
MOTD_FILE /etc/motd
FTMP_FILE /var/log/btmp
NOLOGINS_FILE /etc/nologin
SU_NAME su
MAILDIR /var/spool/mail

5. Archivo /etc/securetty

El archive securetty contiene una lista con las terminales virtuales desde las cuales el administrador o root, puede entrar al sistema.

Página manual: man 5 securetty

En este archivo se definen todas aquellas terminales virtuales, tanto locales como remotas a través de las cuales un administrator del sistema puede acceder al mismo.

Por ejemplo, en le caso de las terminales locales se listan de la tty1 a la tty6, es decir, el administrator puede alejar cualquiera de las 6 terminales virtuales locales para poder acceder al servidor. Supóngase que queremos que el administrador solamente se conecte por medio de la tercera terminal local virtual (tty3).

Recordemos que para acceder a alguna de las terminales virtuales locales basta teclear la combinación Alt_FX, donde X es el número de la terminal a la que queremos entrar. Para el ejemplo, a fin de acceder a la tercera terminal local virtual deberemos teclear: Alt_F3 en donde veremos un prompt parecido a este:

Welcome to Linux 2.4.33.3 (tty3)
nunki login:

Ahora, para que esto tenga efecto es necesario dejar sin comentar en el archivo la línea referente al tty3. De tal manera, el usuario administrador del sistema no se podrá firmar en el sistema más que por la terminal local mencionada.


6. Archivo /etc/porttime

Este archive contiene una lista de los tty’s, los nombres de usuario y sus respectivas horas a las que tienen permitido entrar al sistema.

Página manual: man 5 porttime

Cada entrada del archivo consiste en tres campos separados por dos puntos (:) en donde el primer campo es una lista de terminales virtuales (separadas por coma), el segundo campo es una lista de nombres de usuario (separados por coma). En ambos casos puede utilizarse el comodín asterisco (*), que significa “todos”. Todos los nombres de usuario o bien, todas las terminales virtuales.
El tercer campo es una lista separada por coma de las horas y días en los cuales se permite el acceso.

Cada una de estas entradas se constuye a partir de cero o más días de la semana. Su, Mo, Tu, We, Th, Fr y Sa, seguidos de un par de horas separadas por un guión. También podemos usar la abreviación Wk (weekdays, o bien, entre semana), para representar los días de lunes a viernes; lo mismo Al que significa “todos los días”. Si no se especifica ningún día de la semana, se asume que se trata de Al.

Una entrada de la forma:

*:curso01:Wk0900-1700

Significa que el usuario curso01 puede acceder al sistema por medio de cualquier Terminal virtual, en cualquier día entre semana (de lunes a viernes), de las 9:00 AM a las 5:00 PM.

En el siguiente ejemplo se permite el acceso a los usuarios root y oper desde /dev/console en cualquier momento:

console:root,oper:Al0000-2400
console:*:

En cambio, la segunda línea especifica que el resto de los usuarios no tendrán acceso al sistema en ningún momento.

Como ejemplo final:

*:curso01:Wk1700-0900,SaSu0000-2400

Se describe una entrada que especifica que el usuario curso01 puede entrar al sistema desde cualquier terminal virtual fuera de horas de oficina (en este caso desde las 5:00 PM a las 9:00AM), así como los fines de semana durante todo el día.


7. Archivo /etc/limits

El archivo limits define las cotas superiores del uso de los recursos del sistema. En pocas palabras, cuánto y de qué pueden usar los usuarios.

Página manual: man 5 limits

Aquí describimos los límites que deseamos imponer a los usuarios en cuanto al uso de los recursos del sistema. Por defecto, el usuario root no tiene ningún tipo de cotas de hecho no exíste una manera de imponer límites a cuentas de usuario de tipo administrador (aquellas cuyo UID sea igual a cero).

Cada línea describe un límite para usuario de la forma:

usuario LIMITES

La cadena LIMITES se construye mediante la concatenación de límites de recursos. Cada límite consiste en una letra identificadora seguida de un límite numérico.

Los identificadores válidos son:

A: Máximo espacio de direcciones en Kb
C: Tamaño máximo de los archivos de volcado de memoria (core), en Kb.
D: Tamaño máximo de datos, en Kb.
F: Tamaño máximo de archivo, en Kb.
M: Tamaño máximo de direcciones bloqueadas en memoria (locked-in-memory), en Kb.
N: Tamaño máximo de archivos abiertos
R: Tamaño máximo de conjunto residente, en Kb.
S: Tamaño máximo del stack, en Kb.
T: Tiempo máximo del CPU (mins)
U: Número máximo de procesos
K: Máscara de creación de archivos, ver man 2 umask
L: Número máximo de logins en el sistema para el usuario.
P: Prioridad de los procesos, véase man 2 setpriority

Por ejemplo, L2D2048N5 es una cadena de límites válida. Para propósitos de facilitar la lectura, las siguientes entradas son equivalentes:

usuario L2D2048N5
usuario L2 D2048 N5

Debe tener en cuenta que cualquier cosa después del nombre del usuario se tomará como una cadena de límites y que no se permiten los comentarios. Así mismo, cualquier cadena con límites inválidos no será considerada.

La entrada por defecto se denota por el nombre de usuario ‘*’. Si se tienen varias reglas por defecto entonces se toma la última.

Por favor, note que estos limites son por login, no son globales ni permanentes.


8. Archivo /etc/nologin

El archivo nologin sirve para denegar de manera amistosa, el acceso de los usuarios al sistema.

Página manual: man 8 nologin

Si existe el archivo /etc/nologin, este comando despliega el contenido al usuario en lugar del mensaje por defecto del sistema.


Claro, exísten muchas otras maneras de asegurar el sistema y me parece que este es un buen inicio.

25 de septiembre de 2008

Una medida a la mexicana contra el fraude telefónico: ¡El REgistro NAcional de CELulares (ReNaCel)!

Para aquellos que no estén enterados de lo que esto significa los invito a leer este artículo en La Jornada en el que se explica brevemente la decisión del senado mexicano.

Básicamente se trata de crear una base de datos con información personal de cada uno de los que compramos un celular, sobre todo de aquellos en modalidad de prepago, ya que a través de ellos se realizan muchos de los fraudes y extorsiones que sufre actualmente el país.

Por esto me hago una pregunta: ¿Es necesario tener otro repositorio en el que se guarden mi registro del IFE, o el número de pasaporte, la CURP, mi RFC y hasta mi huella digital? Y mi respuesta es que no.

Recuerdo que desde hace varios años se ha venido manejando la idea de crear una clave de identificación única, es por ello que se creó la CURP. A partir de la cuál se agiliarían los trámites al evitar presentar miles de copias dedocumentos oficiales. Si hacemos cuentas tenemos tantos números de registro que nisiquiera recordamos:

  1. Número de seguro social
  2. Clave del IFE
  3. CURP
  4. Número de pasaporte
  5. RFC con o sin homoclave
  6. Número del registro civil
  7. Número de cédula profesional
  8. Número de licencia de manejo
¿Se me escapa algún otro?

Ahora, en vista de lo anterior planteo nuevamente mi pregunta ¿para qué crear otra base de datos con información personal?
Me parece que esta es una excelente oportunidad que tiene el gobierno mexicanod e hacer una unificación de todos esos datos que andan por ahí desperdigados en diferentes entidades a fin de crear un punto de concentración único que contuviera infomación personal y de la cual se pudiera derivar la creación de diversos tipos de registros, como los antecedentes penales o las actividades fiscales, etc.

¡Y de paso podría usarse software libre!

23 de septiembre de 2008

Ya viene el expo ciencias nacional 2008 en Puebla.MX!

Aunque ya es demasiado tarde para inscribir proyectos (pues restan a duras penas 3 días para el cierre de la recepción de proyectos), me parece que es un buen evento para visitar. Les dejo el link:

http://www.expociencias.net/

Saludos!

19 de septiembre de 2008

Comandos AT para celulares Nokia

Hace algunos meses, mientras buscaba una forma de instalarle algún tipo de Linux a mi Nokia E65, me encontré con dos cosas: la primera es que al menos hasta ahora no hay alguna distribución que le entre; la segunda me emocionó mucho más: resulta que el celular puede funcionar como un módem para la computadora, lo cual me llevó a pensar que como un módem tradicional podría recibir comandos del tipo AT, sí, ATDT, AT&F, ATDP, etc. ¿Y qué creen? Que así es! Encontré por ejemplo que desde esta línea de comandos se puede hacer que el teléfono marque a un número, estableca varias llamadas a la ves, que mande mensaje de texto, entre otras.

A partir de este punto me puse a investigar el grupo de comandos que podría aceptar y como fruto de esas noches de ociocidad escribí el siguiente tutorial. Espero que les sea de utilidad.

Comandos de la familia ATS
  • ATS0 => Autocontestación. Esta opción sirve para instruír a la terminal para que conteste de manera automática cualquier llamada de voz entrante o no.
Por defecto se encuentras desactivada esta característica.
Dentro de los valores que puede tomar son: 0=> Desactivada y cualquier valor mayor de 0, habilitada.

Ejemplo:




  • ATS1 => Devuelve el número de veces que ha sonado la alarma de llamada de la terminal. En pocas palabras, cuántas veces ha hecho RING.
Este es un registro de sólo lectura y que la propia terminal actualiza.

Ejemplo:



  • ATS2 => Devuelve el caracter de escape. En este caso, lo mismo que para los modems comunes, el caracter de escape. Para este caso lo tenemos definido como 43 decimal (2Bh), lo que significa +.

Y de hecho, en la guía de soporte para los comandos AT y los teléfonos nokia se menciona que “Durante una llamada se puede regresar al intérprete de comandos AT mediante el comando +++ (tres veces símbolo de más). Después de lo cual se pueden seguir introduciendo comandos AT durante el curso de una llamada”.

Cabe mencionar que durante las pruebas que realicé, después de lanzar el comando ATDT para establecer una llamada de voz el teléfono me devuelve el estatus de OK e inmediatamente puedo proseguir enviando comandos AT.



  • ATS3 => Define el caracter que debe usarse como Retorno de Carro (CR)
Por defecto el caracter es el 013 decimal (Dh). Pero como muchas cosas en la vida, podemos cambiar este comportamiento, supongamos que ahora queremos que sea el caracter de apertura de paréntesis: “(“, 28h o 40d



Ahora, para que podamos introducir cualquier comando es necesario escribir un ( al final del comando AT



  • ATS4 => Define el caracter que debe usarse como Alimentación de Línea (LF)
El valor por defecto es 10d ó Ah.
Como en el caso anterior vamos a cambiar el valor por defecto al caracter de cierre de paréntesis “)” que es 29h ó 41d



Como e

Comandos de la familia ATX

Estos comandos

La educacion y el software Libre

Hace poco leí en la red acerca de un video de Richard Stallman (Padre del Proyecto GNU) donde comenta que "las escuelas deberían enseñar software libre".

He aqui parte del audio:
Todo el software debe ser libre porque cada uno merece la libertad, merece poder participar en la comunidad libre. Por lo tanto, las escuelas deben enseñar únicamente el software libre.

Hay cuatro razones para esta conclusión, la más superficial es para economizar: las escuelas no tienen bastante dinero, no deben desperdiciar su dinero pagando permiso para usar software privativo. Esta razón es obvia. Pero algunas empresas de software privativo suelen eliminar esta razón superficial regalando copias gratuitas o casi gratuitas de su software no libre a las escuelas, y lo hacen para hacer adictos a los alumnos.

Es un plan malévolo, es un plan para usar las escuelas como instrumentos de imponer una dependencia permanente a los alumnos.

Si la escuela enseña el uso de este programa privativo, el alumno gradúa con una dependencia. Y después de graduarse no recibe mas ofertas de copias gratuitas, y probablemente trabaja en una empresa. La empresa para la cual trabaja no recibe copias gratuitas. Entonces la empresa usa la escuela para enseñar una dependencia permanente a la sociedad entera.

La escuela debe rechazar su participación en ese plan malévolo, porque la escuela tiene una misión social, de educar a la próxima generación como buenos ciudadanos, de una sociedad capaz, fuerte, independiente, solidaria y libre. Solo se puede hacer enseñando el software libre. Las escuelas deben borrar, eliminar los programas privativos, para instalar software libre.
Naturalmente, todo nuevo usuario de un equipo de computo se acostumbra a lo primero que les enseñan y es lo que utilizan, solo unos cuantos (por no decir muy pocos) se aventuran a probar otras alternativas y seguir aprendiendo que mas es lo que pueden realizar en un equipo de computo.

Es por ello que es una buena idea comenzar desde las escuelas a enseñar el software alternativo en el que podran experimentar, desarrollar, modificar, adecuar a sus necesidades y sobre todo compartir sin restriccion alguna.

Con el software propietario, es necesario contar con una licencia que te ata a no modificar, nisiquiera compartir lo que utilizas en tu equipo de computo, es decir que si tu adquiriste algun programa de diseño, algun procesador de textos, no es posible que lo instales en otro equipo sin que compres nuevamente otra licencia. Con esto estas limitando el desarrollo. Por el contrario el software libre te permite instalarlo cuantas veces lo requieras en los equipos que lo requieras.

Uno de los pretextos que el software privativo da para que no se adquiera y utilice el Software Libre es que no esta completo, que esta lleno de fallas, que no hay un soporte para el o que nisiquiera se acerca en calidad. Esto es totalmente falso.

Hay bastante software bien desarrollado, el soporte que puedes adquirir esta en la red, y no tienes que pagar por el, las fallas que se presentan son corregidas en cuestion de dias incluso de horas, y no tienes que esperar a que la compañia se de cuenta y quiera hacer el cambio para despues cobrarte por el.

Por otro lado, si una escuela comienza a enseñar Software Libre, el alumno que se oriente al desarrollo de aplicaciones, podra adecuar sin problema las existentes, asi como desarrollar nuevas, apoyando con esto al Software Libre y a su vez dando la oportunidad al publico en general de tener software a la medida y de buena calidad.

Es muy cierto que Mexico no figura dentro de los paises con alto desarrollo en lo que a software se refiere, es por ello que el impulsar desde las escuelas el uso del Software Libre ayudara a que Mexico entre en un ambito competitivo. Podemos retomar el proyecto abandonado de las escuelas de software, hacer que los alumnos de las carreras de Informatica, tecnologias de la informacion y afines se orienten al desarrollo de software de calidad para nuestro propio desarrollo para el desarrollo de Mexico.

14 de septiembre de 2008

Tres versiones del 11 de septiembre.

El primero de ellos es el último discurso de Salvador Allende al pueblo de Chile:

Seguramente ésta será la última oportunidad en que pueda dirigirme a ustedes. La Fuerza Aérea ha bombardeado las torres de Radio Postales y Radio Corporación. Mis palabras no tienen amargura sino decepción Que sean ellas el castigo moral para los que han traicionado el juramento que hicieron: soldados de Chile, comandantes en jefe titulares, el almirante Merino, que se ha autodesignado comandante de la Armada, más el señor Mendoza, general rastrero que sólo ayer manifestara su fidelidad y lealtad al Gobierno, y que también se ha autodenominado Director General de carabineros. Ante estos hechos sólo me cabe decir a los trabajadores: ¡Yo no voy a renunciar! Colocado en un tránsito histórico, pagaré con mi vida la lealtad del pueblo. Y les digo que tengo la certeza de que la semilla que hemos entregado a la conciencia digna de miles y miles de chilenos, no podrá ser segada definitivamente. Tienen la fuerza, podrán avasallarnos, pero no se detienen los procesos sociales ni con el crimen ni con la fuerza. La historia es nuestra y la hacen los pueblos.

Trabajadores de mi Patria: quiero agradecerles la lealtad que siempre tuvieron, la confianza que depositaron en un hombre que sólo fue intérprete de grandes anhelos de justicia, que empeñó su palabra en que respetaría la Constitución y la ley, y así lo hizo. En este momento definitivo, el último en que yo pueda dirigirme a ustedes, quiero que aprovechen la lección: el capital foráneo, el imperialismo, unidos a la reacción, creó el clima para que las Fuerzas Armadas rompieran su tradición, la que les enseñara el general Schneider y reafirmara el comandante Araya, víctimas del mismo sector social que hoy estará en sus casas esperando con mano ajena reconquistar el poder para seguir defendiendo sus granjerías y sus privilegios.

Me dirijo, sobre todo, a la modesta mujer de nuestra tierra, a la campesina que creyó en nosotros, a la abuela que trabajó más, a la madre que supo de nuestra preocupación por los niños. Me dirijo a los profesionales de la Patria, a los profesionales patriotas que siguieron trabajando contra la sedición auspiciada por los colegios profesionales, colegios de clases para defender también las ventajas de una sociedad capitalista de unos pocos.

Me dirijo a la juventud, a aquellos que cantaron y entregaron su alegría y su espíritu de lucha. Me dirijo al hombre de Chile, al obrero, al campesino, al intelectual, a aquellos que serán perseguidos, porque en nuestro país el fascismo ya estuvo hace muchas horas presente; en los atentados terroristas, volando los puentes, cortando las vías férreas, destruyendo lo oleoductos y los gaseoductos, frente al silencio de quienes tenían la obligación de proceder. Estaban comprometidos. La historia los juzgará.

Seguramente Radio Magallanes será acallada y el metal tranquilo de mi voz ya no llegará a ustedes. No importa. La seguirán oyendo. Siempre estaré junto a ustedes. Por lo menos mi recuerdo será el de un hombre digno que fue leal con la Patria.

El pueblo debe defenderse, pero no sacrificarse. El pueblo no debe dejarse arrasar ni acribillar, pero tampoco puede humillarse.

Trabajadores de mi Patria, tengo fe en Chile y su destino. Superarán otros hombres este momento gris y amargo en el que la traición pretende imponerse. Sigan ustedes sabiendo que, mucho más temprano que tarde, de nuevo se abrirán las grandes alamedas por donde pase el hombre libre, para construir una sociedad mejor.

¡Viva Chile! ¡Viva el pueblo! ¡Vivan los trabajadores!

Estas son mis últimas palabras y tengo la certeza de que mi sacrificio no será en vano, tengo la certeza de que, por lo menos, será una lección moral que castigará la felonía, la cobardía y la traición.

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

El segundo tiene que ver con un discurso de Hugo Chávez al solidarizarse con el gobierno de Bolivia por la expulsión del embajador norteamericano:

¿Estuvo bien? Yo creo que no, pero qué rico escuchar que alguien (por los motivos que hayan sido y alentado por quién sea), por fin mande al carajo al gobierno norteamericano.

-------------------------------------------------
Finalmente, el tercero tiene que ver con el atentado a las Torres Gemelas en Nueva York:
"Quien siembra vientos, cosecha tempestades".

13 de septiembre de 2008

¿Qué fue de los Grupos de Usuarios de Linux en México?

¿Alguien sabe qué fue de los Grupos de Usuarios de Linux en México?
Recuerdo que a inicios de este siglo había, sobre todo en las universidades, un interés generalizado por el Software Libre y más específicamente en Linux.

Incluso en Puebla, además del GULP, se crearon un par de grupos alternos. ¿Alguien sabe qué fue de todos ellos? Sí, bueno, no hay que pensarle mucho. La mayoría ha muerto.

Veamos, en Puebla el grupo más grande fue el Grupo de Usuarios de Linux en Puebla (GULP), fundado por allá de los años 1996~1997. Tuvo, lo que podríamos llamar su auge, entre 2001 y 2004, años en los que varios de sus integrantes nos dimos a la tarea de divulgar el sistema operativo, sus bondades, así como muchas de las aplicaciones potenciales, ya sea como servidor de web para comercio electrónico, como firewall, como servidor de archivos para alguna red windows, etc. Se escribieron y publicaron alrededor de 25 artículos, que aparecieron tanto en diarios locales como en diferentes páginas de Internet; fuimos invitados a presentar ponencias en congresos nacionales e internacionales, e incluso se participó en alguno que otro congreso en Peru o Argentina a larga distáncia.

El grupo no fue "obscuridad de su casa" puesto que se organizaron de manera consecutiva 4 congresos que versaban principalmente en dos áreas: software libre y seguridad. Pero, como todo lo bueno se termina, esta historia también y poco a poco los grupos dejaron de existír.

Analicemos. Al inicio la idea d ecrear grupos de usuarios era básicamente la de reunir a un grupo de entusiastas que por medio de sus experiencias con el sistema y sus herramienta, fueran capaces de establecer un intercambio altruísta de sus conocimientos, a fin de enriquecer a una comunidad en desarrollo incipiente. Ahora bien, me parece que al menos en Puebla, este trabajo fue aceptablemente hecho en virtud de que se llegó a las comunidades estudiantiles, al menos.
El segundo paso de varios de los grupos, como por ejemplo del de Occidente, era evolucionar y dar origen a empresas formadas por los propios miembros del grupo, que pudieran satisfacer al mercao creado en su primera fase. El cual, al menos teoricamente, debería haber sido grande.
Tristemente, me parece que hasta aquí ya no llegamos, al menos no de manera tan exitosa como otros grupos lo hicieron.

Finalmente, recorrí algunas de las páginas de los grupos de antaño y veo con sorpresa que ya el grupo de linux de México ya no exíste, ni en sus versiones .net.mx ni .org.mx. El grupo de usuarios Linux de Puebla tampoco exíste, ni tampoco uno de los grupos de la BUAP: el GUDOS.
De la misma manera, en el sexenio del tristemete célebre Vicente Fox, se creó por ahí un portal llamado softwarelibre.gob.mx, el que se suponía debía servir como un foro de análisis de la factibilidad de inserción de productos de software libre en el gobierno federal. El cual no tiene actividad desde el 2007. Lo mismo sucedió con el portal software.net.mx

Afortunadamente hay otros que permanecen en activo como:
De verdad les deseo mucha suerte en su tarea evangelizadora!

Salu2 Linuxeros!

10 de septiembre de 2008

¿Comandos de LINUX en Windows?

Sí, aunque usted no lo crea, hay por ahí desde hace ya varios años, una suite de comandos/programas GNU portados hacia la plataforma de Microsoft, la cual ofrece al usuario la idea de estar trabajando en una consola de linux, esto, con sus claras limitaciones.

Esta suite se llama CygWIN y se compone principalmente de dos cosas:

  1. Una librería de Windows que es la que se encarga de hacer la emulación del ambiente de Windows.
  2. Un grupo de herramientas y utilerías que dan al usuario el look & feel de estar trabajando en Linux.

Si alguien desea probarla, pueden descargarlo de la siguiente liga: http://www.cygwin.com/

La instalación es realmente muy simple ya que basta con descargar el archivo setup.exe y ejecutarlo en su sistema operativo. Posteriormente lo ejecutan y les irán apareciendo una serie de cuadros de diálogo.



Seleccionar una fuente de descarga. Install from Internet (downloaded files will be kept for future re-use).

Selección de un directorio raíz. Por lo general se selecciona el que tiene por defecto: C:\cygwin


Seleccione el directorio en el que quiere que se almacenen los paquetes que se van a descargar.

Seleccione el tipo de conexión. Típicamente es la directa a Internet.

Seleccione el sitio desde el cual se descargarán las fuentes.


En la siguiente ventana se verá el proceso de descarga del archivo que contiene la lista de paquetes disponibles.


Selección individual de los paquetes a instalar.


Finalmente, se bajan los paquetes. Este proceso va a tardar dependiendo de la velocidad de la conexión y de los paquetes que se hayan seleccionado.

Finalmente, se sugiere que el usuario cree un ícono en el escritorio y se añada una entrada en el menú de inicio.

Una ves instalado podemos ejecutar el shell y de ahí ejecutar algunos programas de x (si es que se instaló el emulador del servidor). En la figura siguiente pueden ver que tengo corriendo Windowmaker en mi escritorio.

7 de septiembre de 2008

Teoría de las ventanas rotas y el crímen.

Hace poco recibí uno de tantos correos que me reenvian los amigos. Comunmente se trata de lo que podríamos considerar basura (spam). Esta ves me llamó la atención y busqué información al respecto. Afortunadamente encontré algunas referencias interesantes al texto aquí citado, por lo que añadí un poco de información a fin de enriquecer el texto original, escrito (supuestamente) por el Lic. Gerardo López Maldonado, Abogado, Maestro en Ciencias Penale.

Me parece interesante hacer una reflexión sobre el estado que guarda nuestro país, un país en el cual la palabra ha perdido su valor para comunicar a la gente, y que ya no funciona como medio para resolver las diferencias. En fin, que lo disfruten:

En el año del 1969, en la Universidad de Stanford (EEUU), un psicólogo: Prof. Phillip Zimbardo realizó un experimento de psicología social.

Dejó dos autos abandonados en la calle, dos autos idénticos, la misma marca, modelo y hasta color. Uno lo dejó en el Bronx, por entonces una zona pobre y conflictiva de Nueva York y el otro en Palo Alto, una zona rica y tranquila de California. Dos autos idénticos abandonados, dos barrios con poblaciones muy diferentes y un equipo de especialistas en psicología social estudiando las conductas de la gente en cada sitio.

Resultó que el auto abandonado en el Bronx comenzó a ser bandalizado a los 10 minutos. Perdió las llantas, el motor, los espejos, el radio, etc. Todo lo aprovechable se lo llevaron en aproximadamente 3 días. Después de esto, el auto se convirtió en un sitio de "entretenimiento": la gente rompió las ventanas, pintó el auto, etc, hasta convertirlo en una pila de chatarra. En cambio el auto abandonado en Palo Alto se mantuvo intacto por al menos una semana.

Es común atribuir a la pobreza las causas del delito. Atribución en la que coinciden las posiciones ideológicas más conservadoras, (de derecha y de izquierda). Sin embargo, el experimento en cuestión no finalizó ahí, cuando el auto abandonado en el Bronx ya estaba deshecho y el de Palo Alto llevaba una semana impecable, el mismo Zimbardo golpeó el automóvil con un martillo a plana vista de la gente que pasaba alrededor. Poco a poco, los transeúntes tomaron su turno para golpear el auto y en pocas horas el resultado fue el mismo: el vehículo quedó reducido al mismo estado que el del barrio pobre.

En el grupo de Zimbardo se encontraban dos criminólogos: James Q. Wilson and George Kelling, los que dieron origen a esta teoría.

¿Por qué el vidrio roto en el auto abandonado en un vecindario supuestamente seguro es capaz de disparar todo un proceso delictivo?

No se trata de pobreza. Evidentemente es algo que tiene que ver con la psicología humana y con las relaciones sociales. Un vidrio roto en un auto abandonado transmite una idea de que nadie está a cargo, de deterioro, de desinterés, de despreocupación que va rompiendo códigos de convivencia, como de ausencia de ley, de normas, de reglas, como que vale todo y que en general no habrá consecuencias. Cada nuevo ataque que sufre el auto reafirma y multiplica esa idea, hasta que la escalada de actos cada vez peores se vuelve incontenible, desembocando en una violencia irracional.

En experimentos posteriores, los criminólogos James Q. Wilson y George Kelling desarrollaron la 'teoría de las ventanas rotas y crimen', misma que desde un punto de vista criminológico concluye que el delito es mayor en las zonas donde el descuido, la suciedad, el desorden y el maltrato son mayores.

Si se rompe un vidrio de una ventana de un edificio y nadie lo repara, pronto estarán rotos todos los demás. Si una comunidad exhibe signos de deterioro y esto parece no importarle a nadie, entonces allí se generará el delito. Si se cometen 'pequeñas faltas' (estacionarse en lugar prohibido, exceder el límite de velocidad o pasarse una luz roja) y las mismas no son sancionadas, entonces comenzarán faltas mayores y luego delitos cada vez más graves.

Si los parques y otros espacios públicos deteriorados son progresivamente abandonados por la mayoría de la gente (que deja de salir de sus casas por temor a las pandillas), esos mismos espacios abandonados por la gente son progresivamente ocupados por los delincuentes.

La teoría de las ventanas rotas fue aplicada por primera vez a mediados de la década de los 80 en el metro de Nueva York, el cual se había convertido en el punto más peligroso de la ciudad. Se comenzó por combatir las pequeñas transgresiones: graffitis deteriorando el lugar, suciedad de las estaciones, ebriedad entre el público, evasiones del pago del pasaje, pequeños robos y desórdenes. Los resultados fueron evidentes. Comenzando por lo pequeño se logró hacer del metro un lugar seguro.

Posteriormente, en 1994, Rudolph Giuliani, alcalde de Nueva York, basado en la teoría de las ventanas rotas y en la experiencia del metro, impulsó una política de 'tolerancia cero'.
La estrategia consistía en crear comunidades limpias y ordenadas, no permitiendo transgresiones a la ley y a las normas de convivencia urbana.

El resultado práctico fue un enorme abatimiento de todos los índices criminales de la ciudad de Nueva York.

La expresión 'tolerancia cero' suena a una especie de solución autoritaria y represiva, pero su concepto principal es más bien la prevención y promoción de condiciones sociales de seguridad.

No se trata de linchar al delincuente, ni de la prepotencia de la policía, de hecho, respecto de los abusos de autoridad debe también aplicarse la tolerancia cero.

No se trata tampoco de la pena de muerte ni del ojo por ojo, (como algunos políticos oportunistas y pusilánimes de nuestro país han propuesto en estos días), ni siquiera de bajar la edad penal, sino más bien un conjunto de ideas que debidamente aplicadas deberían resultar en un beneficio para cualquier sociedad.

No es tolerancia cero frente a la persona que comete el delito, sino tolerancia cero frente al delito mismo.

Se trata de crear comunidades limpias, ordenadas, respetuosas de la ley y de los códigos básicos de la convivencia social humana, como la que no tenemos ahora.

Quiero ser optimista y pensar que México ya tocó fondo y por fin vamos a despertar como sociedad.

Ojala, por nuestros hijos.