14 febrero 2016

Como configurar un certificado SSL para un servidor web implementado sobre Flask

En esta entrada vamos a configurar un certificado SSL para un servidor web implementado sobre Flask
Primero tenemos que crear el certificado SSL de acuerdo a lo explicado en esta otra entrada.
Una vez lo tenemos, añadimos estas constantes en el fichero de configuración config.py
SERVER_KEY = '/home/aneolf/.ssl/localhost.key'
SERVER_CERTIFICATE = '/home/aneolf/.ssl/localhost.crt'
Suponiendo que dichas claves se han guardado en el directorio .ssl del home del usuario. A continuación, en el fichero de arranque del servidor
from config import SERVER_KEY, SERVER_CERTIFICATE

if __name__ == "__main__":
    context = (SERVER_CERTIFICATE, SERVER_KEY)
    app.run(
        host='0.0.0.0',
        port=80,
        ssl_context=context,
        threaded=True,
        debug=True,
        )
Con esto veremos que cada vez que arrancamos el servidor, nos pide que introduzcamos la contraseña PEM de la clave, para evitarlo abriremos una terminal, cambiaremos el directorio de trabajo a donde esté guardado el certificado y haremos lo siguiente:
cp localhost.key localhost.key.org
openssl rsa -in localhost.key.org -out localhost.key
[enter the passphrase]
Introduciremos la contraseña que pusimos en la clave cuando la creamos y listo. A partir de este momento, cada vez que reiniciemos el servidor ya no necesitaremos introducir nuevamente la contraseña.

Como generar una clave SSL, un fichero CSR y un certificado auto firmado para un sitio web

Si desea convertir su sitio web de HTTP a HTTPS, es necesario obtener un certificado SSL de una organización válida como Verisign o Thawte. También puede generar un certificado SSL auto firmado para fines de prueba.
En este artículo, vamos a repasar cómo generar el archivo de clave privada (server.key), el certificado de archivo de solicitud de firma (server.csr) y el archivo de certificado de servidor web (server.crt) que se debe utilizar en un servidor web.

Convención de nombres de los archivos Key, CSR y CRT

Me gusta nombrar los archivos con el nombre de dominio de la URL HTTPS que va a usar este certificado. Esto hace que sea más fácil de identificar y mantener.
En lugar de server.key, utilizo www.thegeekstuff.com.key
En lugar de server.csr, utilizo www.thegeekstuff.com.csr
En lugar de server.crt, utilizo www.thegeekstuff.com.crt


1. Generar clave secreta en el servidor que ejecuta el servidor web

En primer lugar, generar una clave privada en el servidor Linux que se ejecuta el servidor web con el comando openssl como se muestra a continuación.
# openssl genrsa -des3 -out www.thegeekstuff.com.key 1024
Generating RSA private key, 1024 bit long modulus
.......................................++++++
...................................................++++++
e is 73547 (0x01001)
Enter pass phrase for www.thegeekstuff.com.key:
Verifying - Enter pass phrase for www.thegeekstuff.com.key:
# ls -ltr www.thegeekstuff.*
-rw-r--r-- 1 root root 963 Jun 13 20:26 www.thegeekstuff.com.key
La clave privada generada se parece a lo siguiente.
# cat www.thegeekstuff.com.key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-EDE3-CBC,485B3C6371C9916E

ymehJu/RowzrclMcixAyxdbfzQphfUAk9oK9kK2
jadfoiyqthakLKNqw9z1MoaqkPyqeHevUm26no
AJKIETHKJADFS2BGb0n61/Ksk8isp7evLM4+QY
KAQETKjdiahteksMJOjXLq+vf5Ra299fZPON7yr
-----END RSA PRIVATE KEY-----

2. Generar una solicitud de firma de certificado (CSR)

Utilizando la clave generada arriba, se debe generar un archivo de solicitud de certificado (CSR) utilizando OpenSSL como se muestra a continuación.
# openssl req -new -key www.thegeekstuff.com.key -out www.thegeekstuff.com.csr
Enter pass phrase for www.thegeekstuff.com.key:
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [GB]:US
State or Province Name (full name) [Berkshire]:California
Locality Name (eg, city) [Newbury]:Los Angeles
Organization Name (eg, company) [My Company Ltd]:The Geek Stuff
Organizational Unit Name (eg, section) []:IT
Common Name (eg, your name or your server's hostname) []: thegeekstuff
Email Address []:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

# ls -ltr www.thegeekstuff.*
-rw-r--r-- 1 root root   963 Jun 13 20:26 www.thegeekstuff.com.key
-rw-r--r-- 1 root root   664 Jun 13 20:35 www.thegeekstuff.com.csr

3. Generar un certificado SSL autofirmado

Con fines de prueba, se puede generar un certificado SSL autofirmado que es válido por 1 año con el comando openssl como se muestra a continuación.
# openssl x509 -req -days 365 -in www.thegeekstuff.com.csr -signkey www.thegeekstuff.com.key -out www.thegeekstuff.com.crt
Signature ok
subject=/C=US/ST=California/L=Los Angeles/O=thegeekstuff/OU=IT/CN=www.thegeekstuff.com
Getting Private key
Enter pass phrase for www.thegeekstuff.com.key:

# ls -l www.thegeekstuff*
-rw-r--r-- 1 root root   963 Jun 13 20:26 www.thegeekstuff.com.key
-rw-r--r-- 1 root root   664 Jun 13 20:35 www.thegeekstuff.com.csr
-rw-r--r-- 1 root root   879 Jun 13 20:43 www.thegeekstuff.com.crt

# cat www.thegeekstuff.com.crt
-----BEGIN CERTIFICATE-----
haidfshoaihsdfAKDJFAISHTEIHkjasdjadf9w0BAQUFADCB
kjadfijadfhWQIOUQERUNcMNasdkjfakljasdBgEFBQcDAQ
kjdghkjhfortoieriqqeurNZXCVMNCMN.MCNaGF3dGUuY29
-----END CERTIFICATE-----
Puede utilizar este método para generar claves SSL y archivos CSR y CRT para servidores web,en la mayoría de los sistemas Linux, Unix, incluyendo Ubuntu, Debian, CentOS, Fedora y Red Hat.

4. Obtener un certificado SSL válido de prueba (Opcional)

En lugar de firmar usted mismo, también puede generar un certificado SSL de prueba válida de Thawte, es decir antes de gastar el dinero en la compra de un certificado, también se puede obtener un certificado SSL de 21 días de prueba totalmente funcional válido de Thawte. Una vez funciona este certificado válido, puede decidir comprarlo a través de Thawte o cualquier otra organización de firma SSL.Este paso es opcional y no es realmente necesario. Con fines de prueba, siempre se puede utilizar el certificado autofirmado que se ha generado a partir de la etapa anterior.Para generarlo, vaya a la página de solicitud de certificado de prueba Thawte y haga lo siguiente:
  • Seleccione "certificados de servidor Web SSL (Todos los servidores)" en el "seleccione su certificado de prueba".
  • No marque el PKCS # 7 casilla de verificación en el marco del "certificado de configurar"
  • Copie y pegue el archivo *.csr que generó más arriba en el cuadro de texto debajo de "solicitud de firma de certificado (CSR)"
  • Haga clic en siguiente en la parte inferior, lo que dará que un certificado de prueba gratuito de 21 días.
Copiar / pegar el certificado de prueba en el archivo www.thegeekstuff.com.crt como se muestra a continuación.
# cat www.thegeekstuff.com.crt
-----BEGIN CERTIFICATE-----
haidfshoaihsdfAKDJFAISHTEIHkjasdjadf9w0BAQUFADCB
kjadfijadfhWQIOUQERUNcMNasdkjfakljasdBgEFBQcDAQ
kjdghkjhfortoieriqqeurNZXCVMNCMN.MCNaGF3dGUuY29
-----END CERTIFICATE-----

Traducido con Google Translate de The Geek Stuff

04 febrero 2016

Análisis de rendimiento de Tryton

Análisis de rendimientode Tryton

En esta entrada vamos a enseñar como se realiza un análisis de rendimiento de una acción de Tryton. Para ello vamos a utilitzar la librería cProfile que nos facilita el propio lenguaje de programación Python.

Lo primero que haremos será declarar la siguiente función al principio del fichero trytond/trytond/protocols/dispatcher.py
import cProfile
def do_cprofile(func):
    def profiled_func(*args, **kwargs):
        profile = cProfile.Profile()
        try:
            profile.enable()
            result = func(*args, **kwargs)
            profile.disable()
            return result
        finally:
             for arg in args:
                print arg
            profile.print_stats()
    return profiled_func
Y justo encima de la función dispatch, añadimos el decorador do_cprofile de esta forma
@do_cprofile
def dispatch(host, port, protocol, database_name, user, session, object_type,
        object_name, method, *args, **kwargs):
    [...]
A continuación arrancamos el servidor Tryton tunelizando la salida estandard a un fichero para poder leerlo posteriormente:
$ ./bin/trytond -c trytond/etc/trytond.conf > /tmp/logs.txt
Una vez arrancado el servidor nos conectamos con el cliente de escritorio y ejecutamos la acción que queremos analizar y finalmente abrimos el fichero donde hemos volcado la salida del análisis para estudiarla.
$ pluma /tmp/logs.txt
 En dicho fichero podremos ver algo como esto:

[1]
::1
56894
JSON-RPC
db_name
1
c428287398bd415da1a8fff1422a69e1
model
product.template
read
[25278]
[u'customer_taxes', u'code', u'list_price', u'width_digits', u'weight', u'taxes_category', u'thumb_filename', u'height', u'review_location', u'magento_attribute_configurables', u'default_uom', u'template_attribute_set', u'direct_stock_supply', u'height_digits', u'category', u'manufacturer_name', u'thumb', u'review_types', u'purchasable', u'review', u'salable', u'forecast_quantity', u'esale_active', u'width', u'height_uom', u'length_uom', u'base_code', u'products', u'magento_product_type', u'technical_description', u'type', u'cost_price', u'weight_digits', u'product_suppliers', u'length_digits', u'review_description', u'sale_uom', u'esale_available', u'unique_variant', u'purchase_uom', u'width_uom', u'supplier_taxes', u'active', u'medicament', u'consumable', u'list_price_supplier', u'default_uom_category', u'manufacturer', u'delivery_time', u'weight_uom', u'account_expense', u'name', u'account_category', u'esale_slug', u'attachments', u'length', u'attribute_set', u'template_attributes', u'shops', u'account_revenue', u'cost_price_method', u'quantity', u'default_uom.rec_name', u'template_attribute_set.rec_name', u'category.rec_name', u'height_uom.rec_name', u'length_uom.rec_name', u'sale_uom.rec_name', u'purchase_uom.rec_name', u'width_uom.rec_name', u'default_uom_category.rec_name', u'manufacturer.rec_name', u'weight_uom.rec_name', u'account_expense.rec_name', u'attribute_set.rec_name', u'account_revenue.rec_name', u'rec_name', u'_timestamp']
{keys: values}
         8055053 function calls (6667984 primitive calls) in 10.650 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
[...]
        2    0.076    0.038   10.435    5.217 move.py:1120(compute_quantities)
[...]
        2    0.000    0.000   10.457    5.228 move.py:50(_get_quantity)
[...]
        2    0.012    0.006   10.456    5.228 product.py:123(products_by_location)
        2    0.000    0.000   10.463    5.231 product.py:14(get_quantity)
        2    0.000    0.000   10.486    5.243 product.py:14(sum_product)
[...]
        2    0.000    0.000   10.462    5.231 product.py:29(get_quantity)
        2    0.000    0.000   10.474    5.237 product.py:34(sum_product)
[...]
        2    0.000    0.000   10.462    5.231 product.py:54(get_quantity)
[...]
        2    0.000    0.000   10.457    5.228 product.py:94(get_quantity)
[...]
En este caso vemos que el método read del modelo product.template se ejecuta 2 veces y cada una de las veces ha tardado unos 5 segundos.

24 enero 2016

Crear un entorno de desarrollo aislado Python con virtualenwrapper

Hoy vamos a preparar un entorno de desarrollo aislado para Python con virtualenvwrapper. Esto ayuda a aislar sus dependencias de otros entornos de desarrollo, especialmente cuando se utiliza con pip, de forma que se pueden tener distintos entornos sin problemas de dependencias. virtualenvwrapper ofrece algunos comandos shell para facilitar el uso de dichos entornos.

Instalación


Para instalarlo, lo primero que hay que hacer es abrir una consola y ejecutar el siguiente comando:
$ sudo aptitude install virtualenvwrapper

Además, necesitaremos instalar una serie de librerías:
$ sudo aptitude install python-pip python-pkg-resources npm libxml2-dev libxslt-dev libsasl2-dev python-dev libldap2-dev libssl-dev libjpeg-dev libmysqlclient-dev postgresql-server-dev-all libffi-dev libsasl2-dev postgresql-9.4 libsqlite3-dev

Configuracion

Una vez instalado, la configuración pasa por añadir al fichero ~/.bashrc un par de líneas de código que definirán una variable de entorno y ejecutaran un script al iniciar una terminal. Para ello abriremos un editor de texto cualquiera
$ nano ~/.bashrc
y añadiremos las siguientes dos líneas al final del fichero:

export WORKON_HOME=$HOME/.virtualenvs
export PROJECT_HOME=$HOME/workspace
source /usr/local/bin/virtualenvwrapper.sh # [1]

[1] Cambia la ruta a virtualenvwrapper.sh para que coincida con la de tu instalación.
WORKON_HOME es el directorio donde virtualenvwrapper va a almacenar los entornos virtuales que crees.

Ayuda

Para ver todos los comandos que proporciona virtualenvwrapper puedes ejecutar dicho comando en una consola:
$ virtualenvwrapper

virtualenvwrapper is a set of extensions to Ian Bicking's virtualenv
tool.  The extensions include wrappers for creating and deleting
virtual environments and otherwise managing your development workflow,
making it easier to work on more than one project at a time without
introducing conflicts in their dependencies.

For more information please refer to the documentation:

    http://virtualenvwrapper.readthedocs.org/en/latest/command_ref.html

Commands available:

  add2virtualenv: add directory to the import path

  allvirtualenv: run a command in all virtualenvs

  cdproject: change directory to the active project

  cdsitepackages: change to the site-packages directory

  cdvirtualenv: change to the $VIRTUAL_ENV directory

  cpvirtualenv: duplicate the named virtualenv to make a new one

  lssitepackages: list contents of the site-packages directory

  lsvirtualenv: list virtualenvs

  mkproject: create a new project directory and its associated virtualenv

  mktmpenv: create a temporary virtualenv

  mkvirtualenv: Create a new virtualenv in $WORKON_HOME

  rmvirtualenv: Remove a virtualenv

  setvirtualenvproject: associate a project directory with a virtualenv

  showvirtualenv: show details of a single virtualenv

  toggleglobalsitepackages: turn access to global site-packages on/off

  virtualenvwrapper: show this help message

  wipeenv: remove all packages installed in the current virtualenv

  workon: list or change working virtualenvs

Creación

Ahora ya puedes crear un nuevo entorno virtual para un proyecto
$ mkproject my_project
Esto, además de crear el nuevo projecto, nos activará el entorno virtual y nos moverá a su directorio de trabajo.

Manejo

Una vez creado el entorno virtual, para activarlo podemos ejecutar:
$ workon my_project
y para desactivarlo se utiliza el mismo comando que el utilizado para virtualenv
$ deactivate

Personalización del PYTHONPATH

Si queremos cambiar el PYTHONPATH utilizado en un virtualenv, podemos añadir la siguiente línea a nuestro archivo ~/.virtualenvs/my_project/bin/activate:
export PYTHONPATH="/the/path/you/want"
Para restablecer el PYTHONPATH original cuando se desactive el entorno virtual, podemos añadir

export OLD_PYTHONPATH="$PYTHONPATH"
Antes de la línea mencionada anteriormente y, añadir la siguiente línea al fichero ~/.virtualenvs/my_project/bin/postdeactivate script.
export PYTHONPATH="$OLD_PYTHONPATH"

Caso real de configuración de ~/.virtualenvs/my_project/bin/activate:


export OLD_PYTHONPATH="$PYTHONPATH"
export PYTHONPATH="$PYTHONHOME/trytond:$PYTHONHOME/proteus"
export OLD_DB_NAME="$DB_NAME"
export DB_NAME="try_tests"
export OLD_TRYTOND_CONFIG="$TRYTOND_CONFIG"
export TRYTOND_CONFIG="$PYTHONHOME/trytond/trytond/etc/trytond.conf"

02 junio 2015

Crear un entorno de desarrollo aislado para Tryton con virtualenvwrapper en Debian (Jessie).

Primero nos tenemos que asegurar que tenemos instalados los siguientes paquetes:
sudo apt-get install python-pip python-pkg-resources npm libxml2-dev libxslt-dev libsasl2-dev python-distutils-extra python-dev libldap2-dev libssl-dev libjpeg-dev postgresql-server-dev-all libffi-dev postgresql-9.4 freetds-dev virtualenvwrapper libmysqlclient-dev libsqlite3-dev
Después debemos crear el entorno virtual con las herramientas que nos proporciona virtualenvwrapper.
cd ~/workspace
mkproject trytond
A continuación tenemos que descargar los siguientes proyectos donde se almacenan las configuraciones de librerías necesarias así como los módulos a instalar del servidor Tryton
hg clone http://bitbucket.org/nantic/tryton-tasks tasks
hg clone http://bitbucket.org/nantic/tryton-config config
hg clone http://bitbucket.org/nantic/nan_tryton_utils utils
Instalamos las librerías de las herramientas de desarrollo (tasks) y del entorno de tryton (config):
cd utils
./script-symlinks.sh
cd ..
pip install -r config/requirements.txt
pip install -r tasks/requirements.txt
touch local.cfg
invoke clone --config config/base.cfg
invoke clone
Miramos que rama tienen los módulos descargados y los actualizamos todos a la misma. Para la rama 3.4 sería:
invoke update branch 3.4
* Puesto que no hay versión 3.4 para los módulos account_stock_landed_cost*, sale_complaint, commission* y sale_promotion, hay que borrarlos.

Desarrollo de aplicaciones web con Flask para Tryton

Para poder desarrollar aplicaciones web utilizando la librería flask_tryton de pypi, tenemos que descargar, descomprimir y desempaquetar la librería en nuestro entorno de desarrollo:
$ wget https://pypi.python.org/packages/source/f/flask_tryton/flask_tryton-0.4.tar.gz
$ tar -xvzf flask_tryton-0.4.tar.gz
$ mv flask_tryton-0.4 flask_tryton
Otra librería que podría interesarnos instalar podría ser flask-restful
$ pip install flask-restful

PYTHONPATH

Finalmente debemos modificar el PYTHONPATH para que apunte a los directorios que contienen trytond, proteus y flask_tryton tal y como se explica en la entrada de creación del entorno virtual con virtualenvwrapper.

Resolución de problemas

Una vez instalado y funcionando el entorno, tras alguna actualización nos podemos encontrar con algunos problemas con el comando invoke. Para solucionarlo se debe instalar una versión inferior a la 0.11:
pip install invoke==0.10
También deberemos ejecutar la clonación de nuevos repositorios desde el directorio config.
workon trytond
cd config
invoke clone -c ./nombre_repositorio.cfg

24 octubre 2011

Forzar resolución en gdm3

Ejecutar el siguiente comando para obtener la línea que se debe añadir a xrandr:



$ gtf 1440 900 60

Donde: 1440 es el número de puntos horizontales.

900 es el número de puntos verticales

Y 60 la tasa de refresco.


Obtendremos algo parecido a esto:

# 1440x900 @ 60.00 Hz (GTF) hsync: 55.92 kHz; pclk: 106.47 MHz
Modeline "1440x900_60.00" 106.47 1440 1520 1672 1904 900 901 904 932 -HSync +Vsync

Crear el nuevo modo con el siguiente comando:

xrandr --newmode "1440x900_60.00" 106.47 1440 1520 1672 1904 900 901 904 932 -HSync +Vsync

Donde, como se puede ver, lo que va después de --newmode está copiado del comando anterior. Ahora debemos ejecutar:

$ xrandr
Screen 0: minimum 64 x 64, current 1440 x 900, maximum 32000 x 32000
VBOX0 connected 1440x900+0+0 0mm x 0mm
1024x768 60.0 + 60.0
1600x1200 60.0
1440x1050 60.0
1280x960 60.0
800x600 60.0
640x480 60.0

Donde podremos ver cual es la salida por defecto, en este caso VBOX0. Y ahora hay que añadir la salida anterior a xrandr:

xrandr --addmode VBOX0 1440x900_60.00

Y finalmente hacer que sea la salida por defecto con:

xrandr --output VBOX0 --mode 1440x900_60.00

27 marzo 2011

Cambiar el usuario y la contraseña del administrador de OpenERP

Para cambiar el nombre del usuario administrador de OpenERP y su contraseña de procederse de la siguiente forma. Abrir una terminal e identificarse como usuario Postgres:
$ sudo su postgres
A continuación hay que entrar en la consola psql
# psql
Y seguidamente conectarse a la base de datos OpenERP cuyo administrador queremos modificar:
# \c nombre_base_datos
Una vez efectuada la conexión se debe dar la siguiente orden:
# update res_users set login='nuevo_admin', password='nueva_contraseña' where login='admin';
Donde nuevo_admin es el nuevo nombre que tendrá el administrador y nueva_contraseña la nueva contraseña. Para comprobar que los cambios se han realizado correctamente sólo queda dar la siguiente orden:
# select * from res_users;

11 septiembre 2010

Instal·lant una versió d'OpenERP en desenvolupament

En aquesta ocasió vaig a explicar com descarregar, instal·lar i provar un programa en estat de desenvolupament com OpenERP, utilitzant el software de control de versions Bazaar allotjat a Launchpad.


El primer que cal fer és instal·lar aquest programa de control de versions. Per fer-ho només cal donar aquesta ordre a la consola:



$ sudo aptitude install bzr

Una vegada instal·lat el programa, anem a la pàgina inicial de launchpad i cerquem el programa que volem provar, en aquest cas OpenERP.



Una vegada trobat el projecte...



Cliquem a sobre de la pestanya Code



I ens sortirà una pàgina on ens dirà l'ordre que tenim que donar per descarregar el projecte



Ara s'ha d'obrir una terminal i escriure aquesta ordre



$ bzr branch lp:openerp

Ens descarregarà dos fitxers que desarà en una carpeta anomenada openerp



Entrem en la carpeta openerp, i comprovem quines opcions d'execució té per baixar la versió que ens interesa executant



$ ./bzr_set.py --help


Veiem que no te gaires opcions. La que ens interessa és -v amb la versió trunk, per tant ordenem



$ ./bzr_set.py -v trunk


Començarà ara a descarregar tot el projecte...


Bé. Aprofitaré el temps per llegir l'arxiu README.txt a veure que diu. Per fer-ho, obriré un altre terminal i a continuació donaré la següent ordre



$ more README.txt

Aquí està el resultat



Vaja!, triga una mica... ¬¬. Tinc que pensar en contractar un servei ADSL més ràpid... M'ho apuntaré per demana'ls-hi als reis d'orient el proper nadal ;-)

Bé, aquest arxiu el que ens diu és que podem modificar les capçaleres del guió per configurar els links de les diferents branques amb les que tenim intenció de treballar, així com afegir els dels mòduls que volem afegir al projecte. Per defecte ens descarregarà el servidor, el client GTK i el client-servidor web, així com els mòduls oficials, els community i els extra. Com que aquests ja em van bé, no em cal tocar res. Menos mal! Amb el que m'ha costat entendre el que diu, i l'estona que porta descarregant, només m'hauria faltat que hagués de tornar a començar de nou. -_-'


Començo a veure alertes en les descàrregues. Suposo que és normal: aquesta és la branca en desenvolupament, i està en estat alfa.



Bé! Ja ha acabat. Ara puc comprovar que, tal com esperava, ha descarregat el servidor, el client GTK i el client-servidor web, a més a més dels mòduls oficial, community i extras. A més, m'ha creat enllaços simbòlics dels mòduls a la carpeta server/bin. Tot correcte. Ja podem començar a provar-ho :-)