Jul 30

cookbook: python logging

Reading time: 2 – 3 minutes

Sovint faig molts scripts de sistema usant python com a llenguatge de programació, doncs bé, sobretot quan aquests scripts s’han de llençar usant el ‘crontab’ va molt bé tenir un bon ‘log’ per saber com van les coses. Així doncs, la setmana passada vaig decidir posar-me a fons amb el tema ‘logging’ de python i ara la forma de fer ‘logs’ que uso per defecte en els meus scripts és:

Snippet de codi python que poso als scripts:

import  logging,logging.config
# logging
logging.config.fileConfig('script_logging.ini')
#logger = logging.getLogger('errorpantalla')
logger = logging.getLogger('errorfitxer')
logger.setLevel(logging.INFO)

Després d’importar la llibreria de ‘logging’ es recuperar el fitxer de configuració on estan definits els paràmetres de ‘logging’.  Un cop carregat, descomento una o les dues línies que hi ha a continuació en funció de si vull logs per pantalla o només contra un fitxer. La última línia només indica fins a quin nivell de depuració he de fer mostrar logs.

El fitxer de configuració:

[loggers]
keys=root,errorpantalla,errorfitxer

[handlers]
keys=fitxer,pantalla

[formatters]
keys=form01

[logger_root]
level=DEBUG
propagate=1
channel=
parent=
qualname=(root)
handlers=

[logger_errorpantalla]
level=DEBUG
propagate=1
channel=errorpantalla
parent=(root)
qualname=errorpantalla
handlers=pantalla

[logger_errorfitxer]
level=DEBUG
propagate=1
channel=errorfitxer
parent=(root)
qualname=errorfitxer
handlers=fitxer

[handler_fitxer]
class=handlers.RotatingFileHandler
level=DEBUG
formatter=form01
filename=paht_to_log_file/log_file
mode=a
maxsize=0
backcount=1
args=('paht_to_log_file/log_file', 'a', 0, 1)

[handler_pantalla]
class=StreamHandler
level=DEBUG
formatter=form01
stream=sys.stderr
args=(sys.stderr,)

[formatter_form01]
format=%(asctime)s %(levelname)s %(message)s
datefmt=

A més vaig trobar un petit script, que carrega una GUI per generar les configuracions dels fitxers de configuració dels ‘logs’, realment útil i simple d’usar:

logging configurator for python

Aquesta GUI l’he trobada al paquet: logging-0.4.9.6.tar.gz concretament al directori ‘tests’. Si no voleu buscar tant també podeu descarregar-lo directament: logconf.py.

Jun 17

openssl: certificats autosignats de forma molt simple

Reading time: 2 – 4 minutes

Fins aquest matí cada vegada que necessitava crear-me certificats auto-signats (self-signed certificates) usava llarguíssimes llistes d’opcions amb l’openssl, però avui he descobert (digueu-me lent) que si descarregues el paquet d’OpenSSL i el desempaquetes dins del codi font hi ha un directori que es diu: easy-rsa.

Com es pot observar el nom ja dona moltes pistes, doncs bé, dintre d’aquest hi trobem encara un altre directori anomenat 2.0. Aquí dintre, hi ha un munt d’scripts que ens simplificaran moltíssim la vida a l’hora de crear certificats, com sempre en faig un resum en forma de cookbook.

  • Editar el fitxer vars. Cal modificar el valor de les variables:
  • export KEY_COUNTRY="yourContry"
    export KEY_PROVINCE="yourProvince"
    export KEY_CITY="yourCity"
    export KEY_ORG="myOwnOrg"
    export KEY_EMAIL="user@domain.tld"
  • Després netegem el directori de claus perquè no hi hagi restes d’exemples:
  • ./clean-all
  • Carreguem variables d’entorn del fitxer vars:
  • source ./vars
  • Creem una CA (Certificate Authority):
  • ./pkitool --initca
  • Crear el certificat per un servidor:
  • # ./pkitool --server
    # penseu que a vegades el common_name ha de ser el url_host del servidor, per exemple, en servidors https
    ./pkitool --server nom_servidor
  • Certificats per un client:
  • # ./pkitool
    ./pkitool nom_client
  • Certificat per un client enpaquetat amb PKCS12:
  • # ./pkitool --pkcs12
    ./pkitool --pkcs12 nom_client
  • Generar un fitxer DH (Diffie-Hellman)
  • ./pkitool --build-dh

NOTA: en cas de volgueu protegir les claus privades amb una clau simètrica per evitar que siguin usades per tercers persones podeu fer-ho afegint el paràmetre ‘–pass‘ a les comandes anteriors.

Les claus generades les podeu trobar al directori ‘easy-rsa/2.0/keys‘.

Pels que no tingueu massa per la mà el tema dels certificats posaré quatre notes sobre els fitxers creats:

  • *.csr: Certificate Signing Request, petició de certificat que s’envia a una CA perquè ens el torni signat.
  • *.crt: Certificat signat per una CA
  • *.key: Clau privada del certificat, sovint s’acostuma a protegir amb una clau simètrica
  • ca.crt: Certificat de la CA
  • ca.key: clau privada del certificat de la CA.

Senzill, oi? diria que ja no teniu excusa per gestionar-vos vosaltres mateixos les claus SSL. Si ús calen d’altres funcions al directori esmentat hi ha molts altres scripts i el propi ‘pkitool‘, té força altres opcions molt interessants i igual de simples d’usar.

Jun 16

openssl: canvi de clau privada d’un PKCS12

Reading time: 1 – 2 minutes

Pels que ús soni de res el PKCS12 la wikipedia és un bon lloc per coneixer de que va, una definició xapussera de què conté un PKCS12 seria:

  • Cert de la CA (Certificate Authority)
  • Cert del client
  • Clau privada del client

Això permet poder configurar ràpidament clients que han d’usar certificats ja que només tenim un fitxer que posar a la configuració.

A continuació enganxo un petit cookbook que explica com canviar o treure la clau simètrica que protegeix la clau privada del certificat client:

#extreiem private key d'un p12
openssl pkcs12 -in client.p12 -nocerts -out client_private_key.pem
#extreiem client certificate d'una p12
openssl pkcs12 -in client.p12 -clcerts -nokeys -out client_cert.pem
#extreiem CA d'una p12
openssl pkcs12 -in client.p12 -cacerts -nokeys -out ca_cert.pem
#treiem password d'una clau
openssl rsa -in client_private_key.pem -out client_private_key.nopass.pem
#canvi pass d'una clau
openssl rsa -in client_private_key.pem -des3 -out client_private_key.novaclau.pem
#creem una p12 a partir dels seus fitxers arrel
openssl pkcs12 -export -out client.nou.p12 -in client_cert.pem -inkey client_private_key.novaclau.pem -certfile ca_cert.pem -name "nova clau" -out client.nou.p12
Feb 01

HTC Kaiser i Artermis en WinXP virtualizat (VMWare Workstation 6)

Reading time: 3 – 5 minutes

El sistema operatiu de treball o sistema operatiu de l’equip host que uso habitualment com ja sabeu és un Linux, concretament una Gentoo. Doncs bé, al instal·lar un WinXP com a sistema guest en una màquina virtual d’VMWare malgrat molts dels dispositius USB del meu portàtil es reconeixen directament. Per exemple, la webcam, lector d’empremta digital o modem 3G intern. Això no passa al connectar algún dels dos smartphones que tinc el HTC Kaiser o l’Artemis el VMWare em donava l’error: VMWare Workstation was unable to claim the device (No such file or directory).

error.png

Després de molt buscar per forums i d’altres similars vaig trobar un simple hack que em soluciona el problema (perdoneu però no recordo l’enllaç perquè era un comentari d’un forum). El motiu exacte de perquè això passa no l’acabo de tenir clar però l’enginy funciona. De forma que l’activesync o el pocket controller pro reconeixen perfectament el telèfon i em permeten controlar-lo i sincronitzar-lo des del WinXP virtual. Que per altre banda, tal com vaig comentar en l’article sobre com arrancar el WinXP de l’altre partició mentre estem en Linux em permet no haver de mantenir dos instal·lacions de WinXP en parl·lel sinó que la versió virtual i la que corre sobre el host son la mateixa.

Bé doncs, anem al gra el que heu de fer és localitzar on teniu connectat el vostre dispositiu. Fent un lsusb podeu veure algo semblant a:

# lsusb
...
Bus 005 Device 004: ID 0bb4:0b0b High Tech Computer Corp.
...

Ara ja sabem que es troba en el Bus 5 però encara no sabem en quin port ni a quina PCI esta connectat aquest bus. Desocbrim ID de la PCI on és el Busc 5:

# find /sys/devices/ -name "usb5"
/sys/devices/pci0000:00/0000:00:1d.0/usb5

Ja sabem la PCI i bus USB on és connectat el dispositiu, ara només cal saber en quin port usa. Per fer això el que farem és buscar el idProduct i l’idVendor del HTC Kaiser, això ho obtenim del lsusb són els números en hexadecimal separats per uns dos punts. Així doncs, el meu idProduct: 0b0b i el idVendor: 0bb4. Amb aquestes dades el que faig és posar-nos en el directori del bus que hem localitzat i llenço una búsqueda sobre els fitxers que contenen aquestes dades per localitzar en quin port del bus tenim connectat el dispositiu:

# cd /sys/devices/pci0000:00/0000:00:1d.0/usb5
# grep -ri 0b0b $(find . -name "idProduct")
./5-1/idProduct:0b0b
# grep -ri 0bb4 $(find . -name "idVendor")
./5-1/idVendor:0bb4

Com podem veure en els dos casos els fitxers que contenen aquesta informació són al directori 5-1, o sigui, que tenim connectat el nostre telèfon a /sys/devices/pci0000:00/0000:00:1d.0/usb5/5-1/. Directori on hi trobarem el fitxer bConfigurationValue que és completament buit. Doncs bé, l’únic que hem de fer és posar-hi un 1, per exemple així:

# echo 1 > /sys/devices/pci0000:00/0000:00:1d.0/usb5/5-1/bConfigurationValue

Després ens assegurem que tenim associat el dispositiu a la màquina virtual i veurem que el missatge d’error desapareix i el WinXP detecta el nou hardware connectat.

active-usb.png

Finalment aquí tenim l’enllaç funcionant:

connected.png
Nov 07

Cookbook: upgrade ubuntu edgy a dapper i FAQ d’ubuntu

Reading time: < 1 minute

Notes per un lamer com jo per saber fer un upgrade de la versió d’ubuntu dapper a la edgy que és l’última. Però és que necessito la nota perquè mai recordo com es fa:

  • A l’arxiu /etc/apt/source.list canviar les entrades de dapper per edgy
  • apt-get update com a root
  • apt-get dist-upgrade també com a root

També aprofito per referenciar un FAQ d’ubuntu que té molt bona pinta i que té resoltes coses tan interessants com obrir PDF dins del firefox en linux. Cosa que jo estava convençut que no es podia fer, digueu-me incult.

May 16

I love symfony

Reading time: 2 – 2 minutes

symfony.gif

Porto dos dies enganxat al Zend Studio programant en PHP5, concretament amb el framework anomenat symfony. Doncs bé no tinc cap ganes de posar-me a escriure un article tècnic sobre aquests dos aplicatius i menys a entrar en detall en la potencia d’ambdues eines juntes. Però si que volia deixar constància que això no té res que veure amb la programació de PHP que feia fa uns anys amb el PHP3. Això si que és un plaer, classes, object factories, ADO amb Abstract Factory Design, debugger, SOAP… i un llarg etcetera que no s’acaba mai.

Realment si quan heu de programar us agrada tenir eines com deu mana al vostre abast, jo diria que aquest és el duo perfecte. Si a més podeu tenir un servidor amb apache2 i el Zend Studio Server instal·lat, un control de versions amb subversion, una gestió de tasques amb taskspro i un sistema de tiqueting i roadmap amb trac jo diria que ja no es pot demanar gran cosa més.

L’últim comentari al tema abans de plegar per avui, la curva d’aprenentage del symfony és força llarga, a més interioritzar el model MVC i la implmentació basada en mojavi que en fa symfony costa lo seu. Però després passes a una nova dimenció, m’ha costat arribari però ara em declaro un enamorat del symfony.

Apr 24

cookbook: importar projecte de symfony al subversion

Reading time: 2 – 2 minutes

Petit cookbook de com hem d’importar un projecte que estiguem programant amb el framework symfony. Primer creem el directori del repositori on volem pujar el projecte, anem al directori del projecte. Borrem els directoris log i cache del qual no ens interessa mantenir un control de versions. I després importem el projecte.

svn mkdir -m "NOTA: Creem directori on hi posarem projecte" http://exemple.com/svn/repos/projecte/dev
cd directori_projecte_symfony
rm -rf log
rm -rf cache
svn import -m "NOTA: importem primera versio del projecte" . http://exemple.com/svn/repos/projecte/dev

Ara movem el directori actual del projecte i en creem un de nou, que ja tindrà control de versions. Fem un checkout (co) de la versió que em importat abans i defenim que els directoris log i cache no s’importaràn mai quan fem un commit (ci). Després creem els directoris en qüestió i els assignem un propietari igual al del procés d’apache perquè aquest el pugui escriure-hi mentre esta execucutant el nostre projecte symfony.

mv directori_projecte_symfony directori_projecte_symfony.bak
mkdir directori_projecte_symfony_amb_svn
cd directori_projecte_symfony_amb_svn
svn co http://exemple.com/svn/repos/projecte/dev .
svn propedit svn:ignore .
log
cache
mkdir log
mkdir cache
chown apache:apache log
chown apache:apache cache
May 20

Batut energètic

Reading time: 1 – 2 minutes

Aquest segur q no ús la espereu, però en un dia com avui ja no tinc ganes d pensar més en informàtica, més aviat tinc ganes de: UN BATUT ENERGÈTIC!!! hi hi hi! doncs si nois, aquest és un link cap a la ‘Cuina per Solters‘ el programa de TV3 q ensenya a cuinar als negats com jo… no no! no sóc un adicte del programa ni tan sols el veig quasi mai per no dir q només l’he vist un cop, però el cop q el vaig veure feien un programa q parlava d com fer un batut per dies com el d’avui: q entre el canvi d temps i l’esgotament psico-fisic no tens ganes d fotre res després d’una bona dutxa com la meva… ara és l’hora d mirar aquest càpitol del programa i currar-se un batut q no ús deixarà indiferents.

Si voleu la recepta en PDF cliqueu aquí.