miércoles, 18 de mayo de 2016

Código fuente inventario y facturación

0 comentarios
Amigos, gracias por visitar mi web e interesarse por mis proyectos de Python.

En este link podrán encontrar los archivos de facturación e inventario solicitados:

http://sh.st/PIWZy

Espero los disfruten y les sirva.

jueves, 6 de agosto de 2015

Backup con Netcat desde una máquina fantasma

0 comentarios
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

0 comentarios
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

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

#print servidor_local

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

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

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

# Comparo archivo local con remoto
os.remove(r"c:\proyecto\res\pendiente.txt") # /tmp/res/pendiente.txt  <- archivo="" archivos.txt="" archivos="" c:="" comparar:="" comparar="" crear="" es:="" este="" f_local="open(r" f_remoto="open(r" for="" full.find="" full="f_remoto.read()" i="" if="" in="" omparar="" print="" proyecto="" que="" r="" remoto.txt="" res="" str="" tienes="" tmp="" vacio="">=0:
        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

0 comentarios
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

0 comentarios
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

0 comentarios
 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




miércoles, 27 de agosto de 2014

Can't open /dev/mapper/ exclusively - not removing. Mounted filesystem?

0 comentarios
Por elevado/distraido presente dos discos desde la SAN (para mi caso un IBM StoreWize 7000) de 20Gb cada uno cuando realmente debía ser solo de 2Gb, a un par de servidores Linux que van destinados para montar Oracle RAC; es decir, me sobre en el espacio asignado.

Como estos discos ya habían sido pasados por el fdisk y mapeados en ambas máquinas no me funciona el hecho de solo reducir el tamaño desde el almacenamiento ya que el fdisk le dice al sistema dónde inicia y termina cada uno los sectores de los discos en cuestión.

Se podría pensar... mmm entonces un pvresize, y de hecho pvresize nos permite "reducir" el tamaño del disco "a nivel de sistema operativo" actualizando los sectores con la siguiente instrucción:


#pvresize --setphysicalvolumesize 2G /dev/mapper/disco1
#pvresize --setphysicalvolumesize 2G /dev/mapper/disco2

Y los discos quedan "a nivel de sistema operativo" de 2G; pero si consultas el almacenamiento sigues viendo los dos discos de... 20Gb cada uno y el objetivo es recuperar esas 18Gb (bueno 36Gb si sumamos los dos discos) que luego podemos utilizar para otras cosas.

Se intentó con el comando pvremove pero me arrojaba el mensaje:

Can't open /dev/mapper/ exclusively - not removing. Mounted filesystem?

Por más que lo intentaba no lograba removerlo hasta que intené con otros comandos.

Hice un fdisk del disco para ver toda su información a nivel de sectores, heads, etc  y note que me aparecía otra ruta mapeada asociada al disco principal.  Ejemplo:

#fdisk /dev/mapper/mpathb

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Orden (m para obtener ayuda): p

Disco /dev/mapper/mpathb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cilindros of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x3cd70bd4

          Disposit. Inicio    Comienzo      Fin      Bloques  Id  Sistema
/dev/mapper/mpathbp1               1        2610    20964793+  8e  Linux LVM

mmm, entonces pensé que quizás esta era la razón por la que no se dejaba remover el disco así que trate de eliminar primero este dispositivo con (inocentemente) con el pvremove, pero me apareció el siguiente mensaje del sistema operativo burlándose de mi:

#pvremove /dev/mapper/mpathbp1

No physical volume label read from /dev/mapper/mpathbp1
  Physical Volume /dev/mapper/mpathbp1 not found

Entonces recorde el comando dmsetup que tiene que ver con el mapeador de dispositivos y que tiene un parámetro para remover así que...

#dmsetup remove /dev/mapper/mpathbp1
#dmsetup remove /dev/mapper/mpathb
#pvdisplay /dev/mapper/mpathb
Failed to read physical volume "/dev/mapper/mpathb"

Eureka.  Solucionado; ya no existe el disco.  Ahora si puedo generar los discos con el tamaño adecuado y presentarlos nuevamente a los servidores.

En mi caso, cuando fui a validar en el otro nodo si ya había desaparecido del listado de los pv el disco se quedo pegado al ejecutar el comando:

#pvdisplay

No me dio más de otra que reiniciar la máquina desde el manager y esperar a que volviera a la vida.  Debe haber algún procedimiento por pulir y creería que es el borrar el /dev/mapper/mpathbp1 desde dicho nodo y luego el otro desde el nodo contrario.

Queda ese tema por validar, aunque confieso que no he mirado los logs del sistema para que me cuenten qué sucedió pero de que me funcionó, me funcionó!