jueves, 6 de agosto de 2015

Backup con Netcat desde una máquina fantasma

En la actualidad existe diferentes herramientas de informática para llevar a cabo el proceso de copias de seguridad, sin embargo existen algunas con opciones poco conocidas por los usuarios y que son gran utilidad, este es el caso del Netcat con el que podemos por ejemplo hacer
copia de archivos de una máquina Linux a otra (o simplemente hacer respaldo/copia de seguridad de un escritorio a un servidor).

Suponiendo quiere una copia de seguridad de un servidor o de escritorio a otro equipo o incluso crear una imagen de un archivo, procederíamos así:

En el equipo destino:

** Arracamos nuestra distribución de linux en modo de rescate con acceso a redes

Hacemos que el netcat escuche por el puerto 30 - # nc -l -p | dd of = /dev/sda (asumiendo que el disco duro está identificado como sda y no como hda):

# nc -l -p 30 | dd of = /dev/sda

En el pc de origen:

Volcamos el contenido del disco para el PC de destino - # dd if = /dev/sda | nc

# dd if = /dev/sda | nc 192.168.0.20 30

Comprobamos que el tráfico es fluido, en el origen par ir a otra terminal (ALT/F2) y volcar los datos TCP en la NIC (asumiendo es eth0):

# tcpdump -TNLI eth0 puerto 30

Si lo que desea es una imagen como copia de seguridad podría variar la línea así:

# nc -l -p 30 | dd of = mybackup.img

Recuerde que para hacer imagenes de disco se debe contar con al menos el mismo espacio en el disco destino.

Espero que esta información haya sido de utilidad y les sirva para mantener actualizado sus datos.


lunes, 22 de junio de 2015

Enviar archivos por sftp con Python

Esta es una breve modificación a uno de los scripts creados con anterioridad y que consiste en enviar un archivo por  sftp.   La necesidad en concreto consistía en comparar ambos servidores local y remoto y validar qué archivo faltaba en el remoto que estuviera en el local para proceder a enviarlo y mantener el remoto actualizado.

Este script se guarda con el nombre que quieras, le das permiso de ejecución y lo agregas en un crontab.

  
    
import pysftp
import os

# Cambiar por la ruta donde se generan los archivos (Amsterdam)
servidor_local = os.listdir(r'C:\proyecto\archivos') 

#print servidor_local

# Cambiar por una ruta en Amsterdam, puede ser /tmp/res
os.remove(r"c:\proyecto\res\archivos.txt") 

for archivos in servidor_local:
    # Cambiar por '/tmp/res/archivos.txt','a'
    local = open(r"c:\proyecto\res\archivos.txt",'a') 
    print 'Archivo local: '+archivos
    local.write(str(archivos)+'\n')
    local.close()

# Cambiar por /tmp/res/remoto.txt
os.remove(r"c:\proyecto\res\remoto.txt") 
with pysftp.Connection('servidor_remoto.com', username='usuario', password='clave') as sftp:
    # Cambiar por la ruta donde quedan los archivos en el servidor remoto
    with sftp.cd('/tmp'): 
        f = sftp.listdir()
        for files in f:
            # '/tmp/res/remoto','a'
            remoto = open(r"c:\proyecto\res\remoto.txt",'a') 
            print 'Archivos remotos: '+str(f)
            remoto.write(str(files)+'\n')
            remoto.close()

# Comparo archivo local con remoto
# /tmp/res/pendiente.txt=0:
os.remove(r"c:\proyecto\res\pendiente.txt") 
        print i,' Existe \n'
    else:
        pendiente = open(r"c:\proyecto\res\pendiente.txt",'a')
        print 'Archivo pendient: '+i
        pendiente.write(str(i)+'\n')
        directorio = os.chdir(r"C:\proyecto\archivos")
        print 'Directorio actual: '+os.getcwd()
        subir=i.split("\n",1)
        # Envio el archivo faltante
        ith pysftp.Connection('servidor_remoto.com', username='usuario', password='clave') as sftp:
            sftp.cd('/tmp')
            sftp.put(str(subir[0]))
        pendiente.close()
   
 

jueves, 4 de junio de 2015

Comparar y enviar por ftp con Python

Aunque por razones laborales me encuentro casi de lleno en la administración de bases de datos, en algunas ocasiones mis compañeros de infraestructura se encuentran con algunas situaciones las cuales pueden ser resueltas de forma "fácil y divertida" usando Python y aquí es donde entro a sugerir y ayudar con algunas cosas de mi antigua área de infraestructura.

Para este caso la situación es esta:
Cada día se generan en un directorio archivos con consolidados de transacciones que deben ser enviados a un servidor externo por ftp. En el directorio permanencen almacenados los archivos generados durante un mes y cada mes se va borrando el más antiguo.

Se necesitaba automatizar ese proceso pero con la condición de que sólo se debía enviar el archivo generado el último día; para ello creamos entonces el siguiente script en Python que se conecta al servidor remoto para listar los archivos que tiene ya cargados; genera el listado del servidor local con los archivos generados desde hace un mes hasta la fecha.

El script revisa/compara el listado y si en el servidor local existe un archivo que no se encuentra en el remoto entonces procede a enviarlo.

Existen diferentes formas de hacer esto, pero para efectos de repasar lectura y escritura de archivos lo hicimos así:

#!/usr/bin/python
# Importa librerias necesarias para trabajarimport pysftp    # Permite conectar remotamenteimport os        # Permite ejecutar comandos de sistema operativo
# Lista archivos localesarchivo_remoto = os.listdir('/consolidados/salida/')

# Almacenamos la lista en un arreglofor archivo in archivo_remoto:
    # Guardamos el resultado en un archivo de texto    local=open('archivo_remoto.txt','w')
    local.write(str(archivo))

with pysftp.Connection('dominioalqueconecta.com', username='usuario', password='clave') as sftp:
    with sftp.cd('/out'):
        archivo_sftp = sftp.listdir()
        remoto=open('archivo_local.txt','w')
        remoto.write(str(archivo_sftp))

# Comparo los archivosf_local=open('archivo_remoto.txt','r')

comparar = f_local.readlines()
for i in comparar:
    f_remoto = open('archivo_local.txt','r')
    full = f_remoto.read()
    if full.find(str(i))>=0:
        print i,' Existe \n'    else:
        print i
        # Envio el archivo faltante        with pysftp.Connection(''dominioalqueconecta.com', username='usuario', password='clave') as sftp:
                with sftp.cd('/out'):
                        sftp.put('/archivos/salida/'+str(i))
    f_remoto.close()
f_local.close()

sftp.close() 
 
Como para mejorarle faltaría el envio de correo indicando el resultado del escript; si envio archivo, que archivo envio, si fallo, cual fue la falla, etc.
 
Espero este código les pueda servir de guía .

jueves, 19 de febrero de 2015

Actualización de Kernel sin reinicio

Si exite algo molesto en el sistema operativo de Bill es que al instalar actualizaciones necesitas reiniciar la máquina y ni qué decir cuando quieres apagar la máquina y este sistema operativo te lleva la contraria y te pone un mensaje de "No apague ni desconecte Windows ...."

También es verdad que algunas actualizaciones de linux que incluyen modificaciones al kernel requieren reinicio de la máquina lo que igualmente no deja de ser molesto; claro que se tiene la pequeña diferencia que puedes evitar eso, seguir trabajo y esperar al apagado de la máquina y con eso tendrías.

Afortunadamente parece que los que usamos Linux ya no tenemos que pasar por esto del reinicio con las actualizaciones del kernel y esto gracias en un principio a SUSE y RED HAT quienes unieron esfuerzos en desarrollar la tecnología para poder parchar el kernel en caliente.  Esta tecnología ya es utilizada con alguna anterioridad por ksplice adoptado y comprado por el amigo Oracle quien lo convirtió (como es su filosofía) en propietario; ksplice es usado en el sistema operativo Oracle Linux Server.

El esfuerzo de SUSE y RED HAT está por ahora implementado para las arquitecturas x86, PowerPC, s390.

Esta maravilla será puesta en marcha con la versión kernel Linux 3.20.

Fuentes:
http://www.theregister.co.uk/2015/02/11/linux_to_get_live_patching_in_320/
http://www.phoronix.com/scan.php?page=search&q=Linux+3.20

martes, 17 de febrero de 2015

Manjaro Linux

 Disfruta la sencillez.

Manjaro es una distribución Linux (basada en Arch Linux) con  Xfce como entorno gráfico por defecto.  Está desarrollado por Roland Singer, Guillaume Benoit y Philip Müller.

El objetivo principal de Manjaro; como reza su lema, es mantener la sencillez para que pueda usar cualquier usuario.  Al ser basado en Arch conserva el sistema conserva el gestor de paquetes denominado Pacman.

Maneja tres tipos de repositorio: unstable, testing y stable.



La última versión estable (al momento de escribir este artículo) de Manajaro fue la publicada el 2015-02-14 Manjaro 0.8.12 released en la que agregan entre otras:
- KDE 4.14.5
- KDE Apps 14.12.2
- NetworkManager 1.0.0 para corregir fallo en actualización
- flashplugin 11.2.202.442
- Firefox con la versión 35.0.1
- Plasma 5.2

Esta distribución actualmente ocupa el puesto número 16 de 100 de las más visitadas/consultadas en la web de distrowatch.

Vamos a darle un pequeño un vistazo a la distro, para lo cual vamos a crear una máquina virtual con 2 procesadores y 2048Mb de RAM.


Fuentes:
http://manjaro-es.org/
https://manjaro.github.io/
http://distrowatch.com/table.php?distribution=manjaro