viernes, 26 de agosto de 2011

Breve historia de Steve Jobs

Pese a que no soy un fan de Apple, o de Steve Jobs, hay que reconocer que fue emprendedor con temple y un gran visionario de negocios. Y aparte de su monopolio, y la dudosa privacidad del usuario en sus sistemas, hay que darle mención especial por su mejor invento :

Yeahhh, el ipod cigarrera


Aquí coloco un video chino muy raro que trata, de una manera no muy biográficamente correcta, de contar la historia de Jobs :


lunes, 8 de agosto de 2011

Respaldo de equipos Cisco usando Perl (Por Telnet)

Saludos Sres,

En este breve blog, les ensare como usar Perl para acceder a los routers Cisco, y guardar la configuracion en un archivo de texto.

Antes que todo, para poder hacer esta tarea desde Perl, es necesario instalar el modulo de perl Net::Telnet::Cisco. Para instalarlo, ejecutamos la siguiente linea:

perl -MCPAN -e 'install Net::Telnet::Cisco'.

Una vez hecho esto, estamos listos para poder hacer respaldos de nuestros dispositivos haciendo uso de nuestro programa en Perl.


####SCRIPT####


#!/usr/local/bin/perl -w
use Net::Telnet::Cisco;

########
# Main #
########

#Nombre del archivo donde se va a guardar la configuracion del router
my $file_name= "192.168.58.51";

#Creamos nuestro objeto!, '192.168.58.51' es la direccion del router a donde vamos a acceder
my $session = Net::Telnet::Cisco->new(Host => '192.168.58.51');

#Nos conectamos a neustro router, "themadfaceblog" es el nombre de usuario del router, "blogspot" es la clave de ese usuario.
$session->login('themadfaceblog', 'blogspot');

#Entramos al modo privilegiado, "password0101010101010" es la clave para entrar al modo privilegiado.

if ($session->enable("password0101010101010") ) {
my @output = $session->cmd('show run');

#Abrimos un archivo e imprimimos la configuracion del router en ese archivo

open FH, ">$file_name" or die "can't open '$file_name': $!";
foreach ( @output )
{
print FH $_;
}
close FH;

#En caso de que no podemos entrar al modo de configuracion privilegiada, dinos la razon por la cual no se pudo
} else {
warn "Can't enable: " . $session->errmsg;
}


####FIN SCRIPT####




Para ejecutar este script, lo hacemos de la siguiente manera

themad@face:~/perl$ chmod +x script.pl
themad@face:~/perl$ ./scrip.pl


Luego, para leer la configuracion de nuestro router
themad@face:~/perl$ less 192.168.58.51
Building configuration...

Current configuration : 71536 bytes
!
version 12.3
service timestamps debug datetime localtime
service timestamps log datetime localtime
service password-encryption
!
hostname THEMADFACE
!
boot-start-marker
boot system flash disk2:c7200-spservicesk9-mz.122-33.SRD2.bin
boot-end-marker
!
...
...
...


:)

Espero que les haya sido util,

Si tienen algun problema con sus Scripts, no duden en escribirnos, que con todo el gusto del mundo los ayudaremos!


Hasta la proxima! >:)

lunes, 1 de agosto de 2011

Clonacion de discos duros y particiones con el comando dd en linux!

El comando dd puede que muchos no lo conozcan pero esta por default en muchas versiones de linux (comprobado en debian, ubuntu y slax) y te permite de una manera muy cómoda clonar particiones y discos duros completos!! Sin perdida!!

Lo primero que tenemos que tener en cuenta es : Los discos duros que van a ser manipulados tienen que estar desmontados! Muy importante ya que aunque no estén usando ninguna aplicación visible en el momento de la copia, existen logs, registros horarios, demonios, etc que modifican el disco duro y podrían dejar la imagen de clonación con errores.

Evítese esto!

Una de las ventajas de linux es que cualquier disco duro, partición, carpeta, etc es un archivo mas. Que quiero decir con esto? que es bastante mas fácil y practico editar y mantener todo un sistema de archivos siguiendo esta filosofía. Por ejemplo si queremos copiar un disco duro a otro el comando es tan corto como:

dd if=/dev/sba of=/dev/sdb bs=1M

Donde dd = es el comando de clonación de discos
if=RUTA es la ruta de donde se va a leer la información
of=RUTA es la ruta hacia donde se va a escribir la información
bs=1M es el tamaño del bloque que va a ser leído y escrito. Como norma general se usa 1 mb pero puede ser mayor o menor dependiendo de tus necesidades.

Aquí tienen la documentación de DD directo de GNU.org http://www.gnu.org/software/coreutils/manual/html_node/dd-invocation.html

Ahora viene lo interesante, imagínense que tiene un disco duro de 100 GB con Windows y tienes 2 particiones de 60 GB y 40 GB y quieres mover ese disco duro a uno nuevo de 2TB. Bueno al hacer una copia exacta del disco solo estarías utilizado 100 GB de los 2000 Gb del nuevo disco ya que te estas clonando la tabla de particiones también. Para esto también existe solución :
Puedes 1) Clonar los discos y modificar las particiones luego. Esta opción puede ser cómoda pero muchas veces trae problemas ya que al tener 2 particiones juntas sin espacio entre ellas no vas a poder aumentarlas en tamaño (luego pongo una imagen de esto para que se explique mejor). Así que si quieres aumentar la primera partición vas a tener que eliminar la segunda, luego aumentar el tamaño y por ultimo volver a copiar la partición (si te queda espacio).
O 2) Si conoces el total de particiones que vas a crear, puedes alocar ese espacio directamente en el disco duro nuevo (con Gparted), y luego copiar cada partición del disco viejo por separado.
Se hace tan sencillo como copiar un disco completo el comando seria:

dd if=/dev/sda/sda4 of=/dev/sdb/sdb2 bs=1M

Donde sda4 y sdb2 son los nombres de las particiones dentro de los discos duros.

También esta herramienta puede ser usada para backups remotos e inteligentes. Por ejemplo se puede crear una imagen del disco duro y guardarla en un DVD comprimido, o crear un cron que te envié cada semana los viernes a las 12 de la noche un backup actualizado, con los espacios vacíos llenos de cero y comprimido al disco duro de tu casa.

Como escribio este sysadmin en su blog a travez de un script:
http://www.docplanet.org/linux/backing-up-linux-web-server-live-via-ssh/

Los ceros y los espacios no utilizados del disco duro:

Muchas veces necesitas clonar un disco duro de 100 GB pero este disco solo esta utilizando 20 GB. Haciendo el método común, esa imagen de disco pesaría 100GB!! con unos 80GB de espacio no util!. Para ese caso es mejor comprimir esa imagen con gzip o con bzip2 (para los que tienen una maquina poderosa). Y para que esa compresión sea mucho mayor y mas efectiva se recomienda llenar el espacio vacío del disco duro con ceros. Todos los ceros son comprimidos al máximo y van a minimizar enormemente el tamaño de la imagen final. Se puede hacer de 2 maneras : con el comando zerofree llenar de ceros el espacio no alocado de un disco duro (útil si se trabaja directo en una imagen) pero tiene la desventaja de que va a llenar el disco duro en su totalidad. Y el otro método es crear un archivo que tome todo el espacio vacío y lo llene de ceros, para luego eliminarlo. (El espacio sigue lleno de ceros, lo que se elimina es el registro de ese archivo en la tabla de particiones).

dd if=/dev/zero of=archivo_ceros.hola count=1024 bs=1024

(Donde count va a ser el tamaño total en mb del archivo, sacado de la wiki http://es.wikipedia.org/wiki//dev/zero)
 o
zerofree  -v /dev/sda
o
nice cat /dev/zero > zero.fill;sync;sleep 1;sync;rm -f zero.fill
(Este comando fue sacado de http://www.backuphowto.info/comment/530#comment-530, hecho por anonymous)
Donde nice corre un pequeño sheduler que lee con cat el archivo /dev/zero que provee caracteres nulos con que llenar el archivo zero.fill. Para luego eliminarse automáticamente al terminar. No se recomienda correr ningún otro programa el ejecutar estos comandos ya que podría haber problemas al intentar acceder a un disco que este lleno.

dd if=/dev/sda4 of=/tmp/imagen_de_mi_particion.img bs=1M
gzip /tmp/imagen_de_mi_particion.img
o
bzip2 /tmp/imagen_de_mi_particion.img 

Luego si quisieras volver a escribir esa imagen seria tan simple como:

dd if=/tmp/imagen_de_mi_particion.img of=/dev/sda4 bs=1M


Comprobar que los discos son iguales:

Para comprobar que el disco que clonaste es exactamente igual al origen existen varias maneras, las mas comunes son con hash md5 o con cmp.
El comando cmp te lista las diferencias con precisión de byte entre 2 diferentes archivos. Y como linux trata los discos duros como archivos podemos hacer un:

cmp /dev/sda1 /dev/sda2


Si el comando no arroja ninguna información es que los discos están iguales!


O podemos crear un hash del disco con md5 haciendo de esta manera:
cat /dev/sda | md5

Para luego compararlos.



Errores en la copia?


Puede que mientras estés copiando algo hallan sectores danados del disco duro en cuestión. Y si no quieres detener la clonación por unos pequeños sectores que están en malfuncion puedes correr el dd con el parámetro conv=noerror que no detiene la copia si se encuentra algún error.

 dd if=/dev/sda4 of=/tmp/imagen_de_mi_particion.img bs=1M conv=noerror

Espero que les sirva esta información, saludos! >:D madface 

viernes, 29 de julio de 2011

Incidente sudoers

Que pasa cuando intentas escalar privilegios con sudo y no estas en sudoers? (-:


miércoles, 27 de julio de 2011

Creacion de Grids dentro de un objeto Tab.Panel en ExtJs 4

Para los que no conoscan ExtJs es un framework en JavaScript que permite, entre muchas otras cosas, insertar en tu sitio web elementos dinamicos como tablas (Como en excel, que son llamados grid) con capacidades CRUD dentro de tu base de datos. Capaz de manejar datos en Json con lo que no es necesario la recarga completa de la pagina para mostrar nueva informacion!.

http://en.wikipedia.org/wiki/Ext_JS (:

Aveces el enfoque OO del framework hace un poco difícil la creación de elementos complicados que no se vean normalmente como ejemplos. En este caso tenemos la creación de un grid dentro de un tab, que esta dentro de un formulario. (Como el de la imagen)

Aunque la atencion en los foros de sencha (los creadores de extjs) para este tipo de preguntas es un poco agresiva (http://www.sencha.com/forum/showthread.php?33838-Grid-Tab-Panel ver post #2), muchas veses es bueno pasarse por alla y leer algo del feedback que siempre algo bueno trae.

Para el caso real tenemos un objeto form.panel en el cual dentro de sus items tiene uno de tipo panel (xtype:'tabpanel').

Para añadir un grid hay que crear el objeto afuera dentro de una variable. No es necesario definir explicitamente renderTo ya que lo heredará del tab y se rendeará directamente en el.

    var grid = Ext.create('Ext.grid.Panel', {
        store: store,
        width: 470,
        height: 200,
        frame: true,
        clickstoEdit: 1,
        title: 'Listado de asistencias',
        viewConfig: { forceFit: true },
        columns: [{
            text: 'Mifila1', width: 200, dataIndex: 'serial', sortable: true
            },
            {
            text: 'Mifila2', width: 250, dataIndex: 'created', sortable: true
            }
        ],
        listeners: {
                itemclick : function(grid, rowIndex, e) {
                    //Dont do anything.
                }
        }
       
    });

No nos olvidemos de crear tambien el modelo asi como el store del grid.
Es necesario colocar datos como titulo ya que estos datos son buscados por el padre (en este caso el panel de tab) para crear el titulo de la barra.

La manera de que el grid se genere en una nueva pestanã es llamandolo desde los items del tab como en el ejemplo

xtype:'tabpanel',
            plain:true,
            activeTab: 0,
            autoHeight: true,
            height:300,
            region: 'center',
             viewConfig: { forceFit: true },
            defaults:{autoScroll:true, bodyStyle:'padding:10px'},

            items:[{
                title:'ANAMNESE',
                defaults: {width: 210},
                items: [{
                    xtype: 'combo',
                    store: laser_depTypes,
                    fieldLabel: 'Tipo de depilacion anterior',
                    name: 'laser_typeDep',
                    forceSelection: true,
                    editable: false,
                    displayField: 'name',
                    valueField: 'type',
                    mode: 'local'
                },{
                    xtype: 'combo',
                    store: laser_pelo,
                    fieldLabel: 'Pelo',
                    name: 'laser_pelo',
                    forceSelection: true,
                    editable: false,
                    displayField: 'name',
                    valueField: 'type',
                    mode: 'local'
                }
                ]
            },{
                title: 'EVOLUÇÃO',
                cls: 'x-plain',
                layout: 'fit',
                viewConfig: { forceFit: true },
                items: {
                    xtype: 'htmleditor',
                    name: 'bio2',
                    fieldLabel: 'Evolução'
               }
            },grid]


Espero que esto sea de ayuda a aquellos como yo que estamos empezando en esta herramienta ExtJs!
Proximamente coloco un adjunto con el codigo completo!

viernes, 3 de junio de 2011

Primer post!

Bueno que tal? Este es el primer post en TheMadFace, un portal dedicado a todo lo que tenga que ver con Linux, Seguridad, Programación, redes, telecomunicaciones, ocio, n00bs and cracks, and kill and shit.

Tenemos varios puntos que tratar próximamente, desde la configuración de tu blackberry de venezuela como modem en linux y la creación de una pantalla tactil en retroproyector con bajo presupuesto hasta el escalamiento de privilegios y acceso a informacion protejida en servidores linux y windows.

Dentro de poco, mas información! ;-)