sábado, 27 de septiembre de 2008

Eliminar archivos logs antiguos en Linux

Una tarea común de mantenimiento en los sistemas operativos Linux (y que es extensivo a la mayoría de los sistemas operativos basados o clones de Unix) es la de limpieza de archivos de logs. Tanto el sistema operativo, como algún motor de base de datos y unos cuantos procesos propios pueden generar grandes cantidades de archivos de logs. Al largo plazo, es menester quitar estos archivos pues nos ocupan espacio, ya son obsoletos y nos suelen complicar las búsqueda.
Por tal motivo, basado en la publicación original “Listar/Eliminar archivos por fechas en Linux” veamos como podemos desde el shell hacer búsquedas de archivos antiguos y eliminarlos. Está de más decir, que los comandos que a continuación se mencionan son candidatos a formar parte de un shell script y que probablemente sea ejecutado por el cron.

Bien, basta de palabras y veamos algunos ejemplos prácticos:

Buscar archivos actualizados hasta tres días atrás en el directorio actual:

cd /var/log
find -name \*.log -mtime +3

Buscar archivos actualizados hasta tres días atrás en el directorio actual y eliminarlos:
find . -name \*.log -mtime +3 -exec rm {} \;

Buscar los archivos actualizados hasta un día atrás y mostrar su ruta completa:
find /var/log/[a-z]* \*.log -mtime +1

Lo mismo que en el segundo caso, si queremos eliminar los archivos devueltos por el comando anterior:
find /var/log/[a-z]* \*.log -mtime +1 -exec rm {} \;

Además, podemos afinar algo más la búsqueda utilizando el argumento -mmin en vez de -mtime:

* -mtime n, busca archivos modificados n*24 horas atrás (n días atrás)
* -mmin n, para archivos modificado n minutos atrás.

PD: Esta linea se puede utilizar para eliminar respaldos antiguos si tenemos programado un cron de backup de una Base de datos u otros archivos como tgz. etc,

find *.tgz -mtime +6 -exec rm {} \; (eliminarias los que tienen una semana de antiguedad)


fuente (http://www.luchoedu.org/)


¿Que son las transacciones SQL ?

Son un conjunto de instrucciones SQL que tienen la cualidad de ejecutarse como una sola unidad, es decir o se ejecutan todas o no se ejecuta ninguna.

A las tablas capaces de soportar transacciones se les conoce como ACID (Atomicidad, Consistencia, Aislamiento , Durabilidad) en inglés (Atomicity, Consistency, Isolation & Durability)

  1. Atomicidad :=> Algo que no puede dividirse, osea todas las consultas son tratadas como una sola y estas solo se ejecutan cuando todas son correctas en el caso de existir un error no se ejecuta nada.

  2. Consistencia :=> Esto esta ligado a la integridad referencial, es decir solo se pueden escribir datos validos respetando los tipos de datos declarados y la integridad referencial.

  3. Aislamiento :=> Cada transacción es ejecutada independientemente de otra transacción o mejor dicho una tras otra, luego de que estas transacciones son ejecutadas (exitosas o incorrectas) los cambios son visibles para el resto de los usuarios.

  4. Durabilidad :=> Cuando se completa una transacción con éxito los cambios se vuelven permanentes.

Ejemplo

Veamos con el siguiente ejemplo cuan importante puede ser una transacción.

Supongamos que dos vendedores de una tienda consultan las disponibilidad de televisores LCD y solo hay uno es stock (como estos están de moda) para realizar una venta y solo queda un televisor en Stock.

Primero solo con SQL

Vendedor 1 : SELECT stock FROM televisores;

Vendedor 2 : SELECT stock FROM televisores;

Vendedor 1 : UPDATE televisores SET stock = stock -1;

Vendedor 2 : UPDATE televisores SET stock = stock -1;

Primero al hacer los SELECT cada vendedor vera en su pantalla que hay disponible 1 televisor.

El vendedor 1 venderá el televisor dejando el stock en 0, luego el vendedor 2 que no sabe que el televisor ya ha sido vendido venderá el televisor (pensando que hay stock) y el stock sera -1 ya que el último ha sido vendido por el vendedor 1.

Si fuese la vida real habrá un cliente que deberá esperar mas de lo normal para que llegue su televisor.


Ahora los mismo con Transacciones

Vendedor 1 : START TRANSACTION;

Vendedor 1 : SELECT stock FROM televisores;

Vendedor 1 : UPDATE televisores SET stock = stock -1;

Vendedor 1 : COMMIT; (ejecuta)


Vendedor 2 : START TRANSACTION;

Vendedor 2 : SELECT stock FROM televisores;

Vendedor 2 : ROLLBACK; (sale de la transacción sin hacer nada mas)

Vendedor 2 : Avisa a cliente que no hay disponibilidad y pregunta si quiere comprarlo y esperar unos días hasta que nuevamente exista stock.


Como hemos visto las operaciones se hicieron ordenadamente permitiendo la consistencia de los datos una vez que el primer vendedor termino la operación el vendedor 2 realizo sus consultas.


Ejemplo 2 (Algo Mas trabajado)

Este ejemplo muestra como realizar operaciones en una transacción tenemos 1 una tabla llamada departamentos con la siguiente estructura y registros


CREATE TABLE `departamentos` (
`CODIGODEP` INTEGER(11) NOT NULL DEFAULT '0',
`NOMBREDEP` VARCHAR(100) ,
`PRESUPUESTO` INTEGER(11) ,
PRIMARY KEY (`CODIGODEP`)
)ENGINE=InnoDB

INSERT INTO `departamentos` (`CODIGODEP`, `NOMBREDEP`, `PRESUPUESTO`) VALUES
(1, 'Informatica', 300000),
(2, 'Personal', 200000),
(11, 'Calidad', 150000),
(13, 'Seguridad', 450000),
(56, 'Recursos Humanos', 900000),
(77, 'Administracion', 1500000);

y ahora crearemos una nueva tabla departamentos2 y asignaremos el 30% del dinero del presupuesto de cada departamento a la tabla departamentos2 , es decir en presupuesto de departamentos restaremos el 30% de su presupuesto y los asignaremos a los departamentos de de la tabla departamentos2. (las estructuras serán iguales e incuso mantendremos los mismos códigos de y nombres de los departamentos)


CREATE TABLE `departamentos2` (
`CODIGODEP` INTEGER(11) NOT NULL DEFAULT '0',
`NOMBREDEP` VARCHAR(100) ,
`PRESUPUESTO` INTEGER(11) ,
PRIMARY KEY (`CODIGODEP`)
)ENGINE=InnoDB

y ahora las transacciones


START TRANSACTION;
insert into `departamentos2`
select codigodep, nombredep, presupuesto * 0.30 from `departamentos`;
update departamentos set presupuesto = presupuesto - (presupuesto * 0.30);
COMMIT;


El resultado ha sido una tabla de posee todos los registros de departamentos 1 y los presupuestos de ambas tablas han sido modificados correctamente sumando y restando respectivamente un 30%.


Con esto evitamos que algún otro usuario este modificando la tabla departamentos cuando realizamos la operación

Jlara

viernes, 26 de septiembre de 2008

Instalar Java Development Kit (JDK) y Java Runtime Environment (JRE) en Ubuntu Linux

En este pequeño tutorial explicare como instalar el JRE correcto en esta versión de Linux, ya que cuando vamos a descargar los archivos desde la página de Sun hay tantos que aveces no sabemos cual se debe instalar.

Instalación probada en ubuntu 7.10 desktop, Ubuntu 8.04 desktop y server.

Paquetes necesarios:

  1. => sun-java6-bin : Sun Java Runtime Environment (JRE) 6
  2. => sun-java6-demo : Sun Java Development Kit (JDK) 6 demos
  3. => sun-java6-jdk : Sun Java Development Kit (JDK) 6
  4. => sun-java6-jre : Sun Java Runtime Environment (JRE) 6
Instalar Sun Java 6

Abra un intérprete de comandos (terminal) y escriba lo siguiente para instalar JDK y JRE:

$ sudo apt-get install sun-java6-bin sun-java6-jre sun-java6-jdk

Aqui aparecerá un mensaje donde indicara todas las dependencias de paquetes a instalar, presionamos S para aceptar.

Instalación por defecto la versión Java

Ubuntu Linux viene con update-java-alternatives utilidad para las actualizaciones de todas las alternativas que pertenecen a un kit de desarrollo para el lenguaje Java. Para seleccionar, JVM de Sun a lo dispuesto escriba:

$ sudo update-java-alternatives -s java-6-sun

También es necesario editar un archivo llamado /etc/jvm . Este archivo define por defecto el orden de búsqueda de sistema para jvm (java virtual machine) . Cada lista de JVM en el directorio JAVA_HOME debe estar en este archivo. La JVM por defecto del sistema es el primero disponible de arriba a abajo. Abrir /etc/jvm

$ sudo vi /etc/jvm

Asegúrate de añadir /usr/lib/jvm/java-6-sun en la parte superior de la lista JVM.

El archivo debe decir lo siguiente:

/usr/lib/jvm/java-6-sun
/usr/lib/jvm/java-gcj
/usr/lib/jvm/ia32-java-1.5.0-sun
/usr/lib/jvm/java-1.5.0-sun
/usr

Guardar y cierrar el archivo. (Esc :wq)

Configuración de la variable de entorno

También es necesario configurar y JAVA_HOME variable PATH (en todo el sistema) de configuración . Abre tu $ HOME / .bash_profile o /etc/profile :

$ vi $HOME/.bash_profile

Agregar siguiente línea:

export JAVA_HOME=/usr/lib/jvm/java-6-sun
export PATH=$PATH:$JAVA_HOME/bin


Guardar y cierrar el archivo. (Esc :wq)

Prueba tu nuevo JDK

Escriba el siguiente comando para mostrar la versión:

$ java -version

Debe mostrar un mensaje como este:
java version "1.6.0_03"
Java(TM) SE Runtime Environment (build 1.6.0_03-b05)
Java HotSpot(TM) Server VM (build 1.6.0_03-b05, mixed mode)

(Si ves esto felicidades ya tienes todo lo necesario instalado)
Primer programa (Java Hola Mundo)

$ vi holaMundo.java

Escriba el siguiente código:

public class holaMundo{
public static void main(String[] args) {
System.out.println("Hola, Mundo!");
}
}

Guardar y cerrar el archivo. holaMundo.java compilar y ejecutar el programa escribiendo dos instrucciones:

$ javac holaMundo.java
$ java holaMundo


Salida:

Hola, Mundo!





Personalizando nuestra consola con Linux Logo

Linux logo es un pequeño script que permite ver el logo de la distribuccion Linux (solo lo he usado con Debian) en la pantalla inicial de Linux.

Por lo general utilizo debian para la instalación de servidores sin entorno grafico por lo que me resultó interesante tener esta aplicación cada vez que accedo al equipo.


Instalación:

apt-get install linuxlogo (También se puede utilizar aptitude).

Una vez instalado editamos como superusuario el siguiente fichero etc/inittab y nos dirigimos a la siguiente linea 1:2345:respawn:/sbin/getty 38400 tty1 donde tty1 es la primera terminal virtual (ejemplo presionando Alt + F2 se abrira la tty 2).

Modificamos la linea quedando de esta menera:

1:2345:respawn:/sbin/getty -f /etc/issue.linuxlogo 38400 tty1 (Se puede hacer lo mismo con cada terminal para que en todas nos aparezca el logo)

Ahora reiniciamos :

/etc/init.d/linuxlogo restart

Ahora cada vez que entremos al equipo nos aparecera el Logo.

Si queremos verlo también por putty para los que se conectan ssh desde windows a Linux

linux_logo > /etc/motd

Existen logos para todas las distribucciones de linux (si lo instalan en redhat, fedora, centos o cuaquier deribado deben utilizar yum en lugar de apt)


Jlara

Redes sociales e información pública

Este post, aunque ya se ha hablado mucho sobre este tema, va a tratar sobre ese gran contenedor de información que es Internet y las redes sociales.

Ahora bien, ¿qué pasa con la información de Internet?, generalmente el usuario da por buena cualquier información que encuentre sobre un tema determinado. Podría ser cierto, pero... ¿nos podemos fiar?, si somos un poco paranoicos…

¿Qué pasa con las redes sociales?

Si intentamos darnos de alta en una red social, sólo nos piden nombre y apellidos (cosa muy fácil de mentir) y una dirección de correo electrónico (siempre se pueden crear cuantas anónimas o con nombres falsos), y una fecha de nacimiento. Con estos datos, yo mismo podría hacerme pasar por cualquier persona y difundir datos falsos, despectivos o incluso incriminatorios de una persona pública o de una empresa. Porque… ¿por qué no hacerme pasar por George Bush o Vladímir Putin?, o por ejemplo podría hacerme pasar por un ingeniero del CERN (que ahora está muy de moda) y lanzar rumores sobre el funcionamiento del mismo o incluso por qué no, del fin del mundo?

¿Cuánto daño puede hacer una información falsa en Internet?,

Depende, ya que influyen muchos factores: repetición, medio de publicación, etc. Por eso se hace cada vez más necesario el poder conocer y cuantificar la mayor cantidad de información que esté “circulando” por la red, para poder detectar y mitigar en la medida de lo posible estos riesgos.

José María Arce Guillén S21sec labs

Linux también tiene virus


En los últimos años ha crecido el malware diseñado para Linux, infectando gran cantidad de ordenadores y servidores con este sistema operativo.

Aunque Linux es utilizado por una minoría en comparación con el número de usuarios de Windows, al igual que está pasando Mac OS X, ambos sistemas operativos cada vez tienen más popularidad entre los usuarios. Por este motivo, los cibercriminales están creando malware desarrollado para que afecte específicamente a los equipos Apple u ordenadores con Linux.

Como destaca Sophos en su Informe de Seguridad de julio de 2008 sobre cibercrimen, el problema del malware contra Apple es actualmente muy pequeño si se compara con el lanzado contra Windows, pero esto no significa que no haya riesgo. Desde la aparición del primer malware contra Mac OS X a finales de 2007 -generado por motivos económicos- ha habido varias tentativas por parte de los hackers para infectar y robar desde ordenadores Mac.

El mismo informe señala que desde hace 6 años el malware RST-B, diseñado para Linux, ha infectado un gran número de ordenadores y servidores que usan este sistema operativo. Según los datos de SophosLabs, el nivel más alto de infección de Linux/RST-B con ordenadores comprometidos está en EE.UU, seguido de China y Alemania.

Pese a que Linux se presenta en varias distribuciones, el kernel o núcleo sobre el que se desarrollan las diferentes versiones es siempre el mismo, y por esta razón los virus creados para Linux se ejecutan en cualquier distribución pero pueden no tener el mismo efecto.

(fuente vnunet.es)


Transacciones y bloqueo de Tablas MySQL

Por defecto, MySQL se ejecuta con el modo autocommit activado. Esto significa que en cuanto ejecute un comando que actualice (modifique) una tabla, MySQL almacena la actualización en disco.

Esta modalidad de autocommit solo puede ser desactivada si se esta trabajando con tablas InnoDB (Que además son las únicas que soportan la integridad referencial en Mysql).

Para desactivar momentáneamente el autocomit ejecutamos el comando:

SET AUTOCOMMIT=0;

Luego de deshabilitar el autocommit (set autocommit = 0;) obligadamente tendremos que utilizar
obligadamente COMMIT para guardar o ROLLBACK para deshacer.

Si quiere deshabilitar el modo autocommit para una serie única de comandos, puede usar el comando
START TRANSACTION


Ejemplo:

Creare una nueva tabla en la Base de datos Empresa
:

CREATE TABLE `departamentos2` (
`CODIGODEP` INTEGER(11) NOT NULL DEFAULT '0',
`NOMBREDEP` VARCHAR(100),
`PRESUPUESTO` INTEGER(11) DEFAULT NULL,
PRIMARY KEY (`CODIGODEP`)

)ENGINE=InnoDB

y Ahora insertare registros de la tabla departamentos a departamentos2 mediante una transacción


START TRANSACTION;
SELECT @A := presupuesto
FROM departamentos
WHERE codigodep =11;
INSERT INTO departamentos2( codigodep, nombredep, presupuesto )
VALUES ( 11, 'prueba', @A );
COMMIT;

En el ejemplo anterior guarde el presupuesto del departamento 11 en la variable @A y luego asigne ese presupuesto en la tabla departamentos2

Ahora un ejemplo donde replicare todos los datos de un departamento en la tabla departamentos2

START TRANSACTION;
SELECT @A := presupuesto, @B := codigodep, @C := nombredep
FROM departamentos
WHERE codigodep =33;
INSERT INTO departamentos2( codigodep, nombredep, presupuesto )
VALUES (
@B , @C , @A
);
COMMIT ;


En el ejemplo anterior se copio todo un departamento al la tabla departamentos 2....

Se puede sumar los presupuestos y asignarlos así:

START TRANSACTION;
SELECT @A:=PRESUPUESTO FROM departamentos WHERE codigodep=11;
UPDATE departamentos2 SET PRESUPUESTO = PRESUPUESTO + @A WHERE codigodep=33;
COMMIT;


En este último ejemplo actualizo el presupuesto del departamento 33 de la tabla
departamentos2 sumandole todo el presupuesto de la departamento 11 de la tabla
departamentos

Al realizar una transacción SQL se debe tener en cuenta que la tabla se bloquea
quedando solo habilitada a lo que estamos realizando nosotros