Esta vez para arreglar un bug, ya que digitalRead() habia dejado de funcionar.
Les recuerdo, para instalar PyArduinoProxy:
$ pip install pyarduinoproxy
y para actualizarlo:
$ pip install --upgrade pyarduinoproxy
jueves, 15 de noviembre de 2012
Nueva versión: PyArduinoProxy v0.0.3
Posteado por
Software and Motorcycles
a las
15:42
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
arduino,
pyarduinoproxy,
python


miércoles, 14 de noviembre de 2012
Nueva versión: PyArduinoProxy v0.0.2
Luego de mucho tiempo, he lanzado PyArduinoProxy v0.0.2. Les cuento brevemente lo que ha cambiado:
- instalación simplificada con pip/virtualenv,
- eliminé fuentes de librerías (CherryPy, Jinja2, SimpleJSON), ahora son instaladas automaticamente via pip/virtualenv,
- agregué soporte para sensores de temperatura/humedad DHT11
- arreglé BUG de JS (expresiones regulares ahora no son 'callables').
Como siempre, cualquier tipo de comentario, sugerencia, etc. es bienvenida!
Posteado por
Software and Motorcycles
a las
21:28
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
arduino,
pyarduinoproxy,
python


viernes, 14 de septiembre de 2012
How to install Cinnamon from GitHub on Ubuntu 12.04
As a first attempt, a ./configure + make + make install wont work, so I want to share what I've done to make it work. Since it's a development version, I won't install to /usr, but to /opt/cinnamon-dev instead...
These are the steps:
$ sudo mkdir /opt/cinnamon-dev
$ sudo chown $(id -nu).$(id -ng) /opt/cinnamon-dev
$ apt-get build-dep muffin cinnamon
$ cd
$ git clone git://github.com/linuxmint/muffin.git
$ cd muffin
$ autoreconf --force --install
$ ./configure --prefix=/opt/cinnamon-dev
$ make
$ make install
$ cd
$ git clone git://github.com/linuxmint/Cinnamon.git
$ cd Cinnamon
$ autoreconf --install --force
$ aclocal
$ intltoolize --force
$ env PKG_CONFIG_PATH=/opt/cinnamon-dev/lib/pkgconfig CFLAGS="-w" ./configure --prefix=/opt/cinnamon-dev
$ make
$ make install
# FAIL!
$ cd files/
$ mkdir -p opt/cinnamon-dev
$ mv usr opt/cinnamon-dev/
$ mv etc/ opt/cinnamon-dev/
$ cd ..
$ make install
# Now works!
These are the steps:
$ sudo mkdir /opt/cinnamon-dev
$ sudo chown $(id -nu).$(id -ng) /opt/cinnamon-dev
$ apt-get build-dep muffin cinnamon
$ cd
$ git clone git://github.com/linuxmint/muffin.git
$ cd muffin
$ autoreconf --force --install
$ ./configure --prefix=/opt/cinnamon-dev
$ make
$ make install
$ cd
$ git clone git://github.com/linuxmint/Cinnamon.git
$ cd Cinnamon
$ autoreconf --install --force
$ aclocal
$ intltoolize --force
$ env PKG_CONFIG_PATH=/opt/cinnamon-dev/lib/pkgconfig CFLAGS="-w" ./configure --prefix=/opt/cinnamon-dev
$ make
$ make install
# FAIL!
$ cd files/
$ mkdir -p opt/cinnamon-dev
$ mv usr opt/cinnamon-dev/
$ mv etc/ opt/cinnamon-dev/
$ cd ..
$ make install
# Now works!
The ugly "moves" after the fails are needed because I think some paths are hardcoded, and the process that copies the files from the "files/" directory ignores the "--prefix" configured.
Posteado por
Software and Motorcycles
a las
22:26
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios


sábado, 25 de agosto de 2012
Mejorando transferencia de ssh/rsync
Buscando la forma de mejorar la transferencia de backups (realizados con rsync, pero sobre un tunel de SSH), encontré que la velocidad de transferencia puede variar mucho dependiendo del cipher usado para crear la conexión con SSH.
En una primera búsqueda encontré unos tests que reproduje en mi ambiente. Las pruebas que hice consiste en copiar un archivo con contenidos aleatorios (generado desde /dev/urandom), de 512MB, sobre una conección Gigabit Ethernet, estando el archivo de origen y el de destino en el directorio /dev/shm (esto nos permite asegurarnos que el acceso a disco no influya en nuestros tests):
Warm up... Copiando con cipher por default...
random 100% 512MB 42.7MB/s 00:12
Copiando con cipher: 3des-cbc
random 100% 512MB 16.5MB/s 00:31
Copiando con cipher: aes128-cbc
random 100% 512MB 85.3MB/s 00:06
Copiando con cipher: aes192-cbc
random 100% 512MB 73.1MB/s 00:07
Copiando con cipher: aes256-cbc
random 100% 512MB 64.0MB/s 00:08
Copiando con cipher: aes128-ctr
random 100% 512MB 42.7MB/s 00:12
Copiando con cipher: aes192-ctr
random 100% 512MB 34.1MB/s 00:15
Copiando con cipher: aes256-ctr
random 100% 512MB 32.0MB/s 00:16
Copiando con cipher: arcfour128
random 100% 512MB 102.4MB/s 00:05
Copiando con cipher: arcfour256
random 100% 512MB 102.4MB/s 00:05
Copiando con cipher: arcfour
random 100% 512MB 102.4MB/s 00:05
Copiando con cipher: blowfish-cbc
random 100% 512MB 56.9MB/s 00:09
Copiando con cipher: cast128-cbc
random 100% 512MB 51.2MB/s 00:10
En una primera búsqueda encontré unos tests que reproduje en mi ambiente. Las pruebas que hice consiste en copiar un archivo con contenidos aleatorios (generado desde /dev/urandom), de 512MB, sobre una conección Gigabit Ethernet, estando el archivo de origen y el de destino en el directorio /dev/shm (esto nos permite asegurarnos que el acceso a disco no influya en nuestros tests):
Warm up... Copiando con cipher por default...
random 100% 512MB 42.7MB/s 00:12
Copiando con cipher: 3des-cbc
random 100% 512MB 16.5MB/s 00:31
Copiando con cipher: aes128-cbc
random 100% 512MB 85.3MB/s 00:06
Copiando con cipher: aes192-cbc
random 100% 512MB 73.1MB/s 00:07
Copiando con cipher: aes256-cbc
random 100% 512MB 64.0MB/s 00:08
Copiando con cipher: aes128-ctr
random 100% 512MB 42.7MB/s 00:12
Copiando con cipher: aes192-ctr
random 100% 512MB 34.1MB/s 00:15
Copiando con cipher: aes256-ctr
random 100% 512MB 32.0MB/s 00:16
Copiando con cipher: arcfour128
random 100% 512MB 102.4MB/s 00:05
Copiando con cipher: arcfour256
random 100% 512MB 102.4MB/s 00:05
Copiando con cipher: arcfour
random 100% 512MB 102.4MB/s 00:05
Copiando con cipher: blowfish-cbc
random 100% 512MB 56.9MB/s 00:09
Copiando con cipher: cast128-cbc
random 100% 512MB 51.2MB/s 00:10
Luego probé copiar a "localhost":
Warm up... Copiando con cipher por default...
random 100% 512MB 56.9MB/s 00:09
Copiando con cipher: 3des-cbc
random 100% 512MB 20.5MB/s 00:25
Copiando con cipher: aes128-cbc
random 100% 512MB 170.7MB/s 00:03
Copiando con cipher: aes192-cbc
random 100% 512MB 170.7MB/s 00:03
Copiando con cipher: aes256-cbc
random 100% 512MB 170.7MB/s 00:03
Copiando con cipher: aes128-ctr
random 100% 512MB 64.0MB/s 00:08
Copiando con cipher: aes192-ctr
random 100% 512MB 51.2MB/s 00:10
Copiando con cipher: aes256-ctr
random 100% 512MB 46.6MB/s 00:11
Copiando con cipher: arcfour128
random 100% 512MB 256.0MB/s 00:02
Copiando con cipher: arcfour256
random 100% 512MB 256.0MB/s 00:02
Copiando con cipher: arcfour
random 100% 512MB 170.7MB/s 00:03
Copiando con cipher: blowfish-cbc
random 100% 512MB 64.0MB/s 00:08
Copiando con cipher: cast128-cbc
random 100% 512MB 56.9MB/s 00:09
El ganador en velocidad, es por mucho arcfour, pero por lo que he visto, no es recomendable usarlo cuando la seguridad es un factor crítico. El cipher aes128 es algo más lerdo, pero la taza de transferencia es de más del doble comparada al cipher por default.
Para usar un cipher específico con rsync + ssh, el comando a usar tendría la forma:
$ rsync -e 'ssh -c arcfour256' ......
El script que usé lo subí a un gist de GitHub.
Posteado por
Software and Motorcycles
a las
2:54
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
linux,
ssh


lunes, 20 de agosto de 2012
Pentaho: primeros pasos con ETL, Kettle, Spoon, PDI
Mis primeros pasos en BI con Pentaho no fueron de lo más fácil. Hay mucha información, es un tema nuevo para mi (estoy aprendiendo a la vez BI y Pentaho), el producto posee una edición Open Source y otra cerrada, y diferentes nombres para cosas parecidas (por ejemplo: Kettle, Spoon, PDI/Pentaho Data Integration).
Así que en este artículo compartiré los pasos que seguí para hacer andar las herramientas necesarias para realizar el proceso de ETL (el artículo de WikiPedia sobre Data Warehouse es una muy buena referencia para un vistazo general).
El mejor tutorial para darlos primeros pasos que encontré es PDI / Pentaho Data Integration / Kettle. Los 4 pasos están muy bien explicados, aunque me topé con algunos inconvenientes, por eso incluyo links a los 4 pasos del turorial, con algunos comentarios:
01. Installing Kettle - Comentarios: lo bajé de aquí: PDI / Kettle 4.3 (la más reciente versión al momento de escribir el artículo). Actualmente, la versión que está disponible es referenciada desde algunas páginas como "Kettle 4.3.0 including Big Data Components", y el archivo se llama "pdi-ce-4.3.0-stable.tar.gz" o "pdi-ce-4.3.0-stable.zip" (dependiendo si se quiera bajar como tar.gz o zip).
02. Spoon Introduction - Comentarios: luego de descomprimirlo y lanzar Spoon, se abrío una instancia de Firefox y una aplicación Java. Entre los links que veo en Firefox, creo que el más relevante es Spoon User Guide.
03. Hello World Example - Comentarios: este paso desarrollamos un ejemplo completo de ETL. Tuve problemas en "Modified JavaScript Value Step", ya que al parecer, la línea que contiene:
name.getString()
no funciona correctamente, pero lo pude arreglar usando:
name.toString()
Al llegar a probar el "pan", para obtener la lista de modificadores aceptados, hay que ejecutar:
./pan.sh
(sin ningún modificador... primero intenté con -h y --help, pero esto no funciona). Hay más información en la página de Pan User Documentation.
En el caso de Linux, para especificar los modificadores del programa se usa "-" en vez de "/":
./pan.sh -norep -file ../ejemplo1/tutorial.ktr
04. Refining Hello World - Comentarios: el igual que con "pan.sh", en Linux, para especificar los modificadores de kitchen.sh se usa "-" en vez de "/". Además, no seguí al pié de la letra las instrucciones; particularmente, prefiero evitar la parametrización a través de "kettle.properties", y en su lugar, utilicé para los paths, la variable ${Internal.Job.Filename.Directory}.
Finalmente, después de renegar un rato, pude ejecutar correctamente el job desde la línea de comando (usando kitchen).
Como resumem, puedo decir que seguir el tutorial me dejó claro varias cosas:
Así que en este artículo compartiré los pasos que seguí para hacer andar las herramientas necesarias para realizar el proceso de ETL (el artículo de WikiPedia sobre Data Warehouse es una muy buena referencia para un vistazo general).
El mejor tutorial para darlos primeros pasos que encontré es PDI / Pentaho Data Integration / Kettle. Los 4 pasos están muy bien explicados, aunque me topé con algunos inconvenientes, por eso incluyo links a los 4 pasos del turorial, con algunos comentarios:
01. Installing Kettle - Comentarios: lo bajé de aquí: PDI / Kettle 4.3 (la más reciente versión al momento de escribir el artículo). Actualmente, la versión que está disponible es referenciada desde algunas páginas como "Kettle 4.3.0 including Big Data Components", y el archivo se llama "pdi-ce-4.3.0-stable.tar.gz" o "pdi-ce-4.3.0-stable.zip" (dependiendo si se quiera bajar como tar.gz o zip).
02. Spoon Introduction - Comentarios: luego de descomprimirlo y lanzar Spoon, se abrío una instancia de Firefox y una aplicación Java. Entre los links que veo en Firefox, creo que el más relevante es Spoon User Guide.
03. Hello World Example - Comentarios: este paso desarrollamos un ejemplo completo de ETL. Tuve problemas en "Modified JavaScript Value Step", ya que al parecer, la línea que contiene:
name.getString()
no funciona correctamente, pero lo pude arreglar usando:
name.toString()
Al llegar a probar el "pan", para obtener la lista de modificadores aceptados, hay que ejecutar:
./pan.sh
(sin ningún modificador... primero intenté con -h y --help, pero esto no funciona). Hay más información en la página de Pan User Documentation.
En el caso de Linux, para especificar los modificadores del programa se usa "-" en vez de "/":
./pan.sh -norep -file ../ejemplo1/tutorial.ktr
04. Refining Hello World - Comentarios: el igual que con "pan.sh", en Linux, para especificar los modificadores de kitchen.sh se usa "-" en vez de "/". Además, no seguí al pié de la letra las instrucciones; particularmente, prefiero evitar la parametrización a través de "kettle.properties", y en su lugar, utilicé para los paths, la variable ${Internal.Job.Filename.Directory}.
Finalmente, después de renegar un rato, pude ejecutar correctamente el job desde la línea de comando (usando kitchen).
Como resumem, puedo decir que seguir el tutorial me dejó claro varias cosas:
- "Big Data components" se refiere al hecho de que pueden leerse y escribirse datos de/a Hadoop, Cassandra, etc., pero es algo que no usaremos inicialmente,
- Spoon es la herramienta gráfica para diseñar procesos de ETL,
- Pan y Kitchen permiten ejecutar los procesos de ETL desde la línea de comando (por lo tanto, sería una forma de automatizar estos procesos desde, por ejemplo, cron, aunque supongo que debe haber algún componente para realizar el scheduling de estas tareas),
- Kettle es lo mismo que PDI, que significa "Pentaho Data Integration", que incluye a todo lo anterior: herramientas visuales, CLI, todas las librerías que implementan las funcionalidades que tan fácilmente se utilizan desde Spoon.
Posteado por
Software and Motorcycles
a las
23:21
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
1 comentarios
Labels:
bi,
pentaho


viernes, 10 de agosto de 2012
Modificando el último commit con git rebase
Algunas veces, luego de hacer un commit, vemos que olvidamos algún pequeño detalle, y por cuestiones de "prolijidad", hubiéramos querido incluirlo en el commit recién realizado.
Generalmente, en estos casos utilizo git reset --soft HEAD^ para recuperar el commit anterior, pero siempre me pareció que debería haber alguna forma mejor. Utilizando rebase, el proceso es mucho más fácil, ya que evitamos, por ejemplo, re-ingresar el mensaje de commit, con la posibilidad de modificarlo si hace falta.
Generalmente, en estos casos utilizo git reset --soft HEAD^ para recuperar el commit anterior, pero siempre me pareció que debería haber alguna forma mejor. Utilizando rebase, el proceso es mucho más fácil, ya que evitamos, por ejemplo, re-ingresar el mensaje de commit, con la posibilidad de modificarlo si hace falta.
Los comandos a utilizar son:
$ git rebase --interactive HEAD^
Ahora git presentará un editor, donde mostrará una línea con el commit a editar, por ejemplo:
$ git rebase --interactive HEAD^
Ahora git presentará un editor, donde mostrará una línea con el commit a editar, por ejemplo:
pick 9245320 Cambios en home: agregue nombre de usuario logueado
Hay que cambiar esta línea, reemplazando "pick" por "edit".
edit 9245320 Cambios en home: agregue nombre de usuario logueado
Luego aparecerá:
Stopped at 9245320... Cambios en home: agregue nombre de usuario logueado
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
$ git add <archivos modificados>
$ git rebase --continue
Este último comando nos presentará el editor de texto con el mensaje de commit original, el que podremos modificar si hace falta.
Stopped at 9245320... Cambios en home: agregue nombre de usuario logueado
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
$ git add <archivos modificados>
$ git rebase --continue
Posteado por
Software and Motorcycles
a las
13:56
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
git


viernes, 20 de julio de 2012
South: 'assertsynced' para asegurar que todas las migraciones están aplicadas
El uso de South con aplicaciones Django es un estándar en los desarrollos en los que participo. Pero hace tiempo me surgió la necesidad de saber si hay migraciones sin aplicar.
Es fácil conocer 'visualmente' la situación, pero el problema es cuando hace falta saberlo desde un script. Por ejemplo: al momento de realizar deploys, y en los scripts de arranque de los sistemas.
Sobre todo en este último caso, la aplicación no debería iniciarse si hay migraciones pendientes de aplicar. Finalmente me tomé un tiempo y cree assertsynced. Este es un comando de Django, basado en la implementación de migrate de South.
Está disponible aquí.
Es fácil conocer 'visualmente' la situación, pero el problema es cuando hace falta saberlo desde un script. Por ejemplo: al momento de realizar deploys, y en los scripts de arranque de los sistemas.
Sobre todo en este último caso, la aplicación no debería iniciarse si hay migraciones pendientes de aplicar. Finalmente me tomé un tiempo y cree assertsynced. Este es un comando de Django, basado en la implementación de migrate de South.
Está disponible aquí.
Posteado por
Software and Motorcycles
a las
15:36
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
django,
python,
south


CentOS: como chequear si un paquete está instalado
Una forma de revisar si un paquete está instalado en CentOS es utilizando el comando "repoquery", ya sea con el nombre del paquete específico o con comodines:
$ repoquery --info --pkgnarrow=installed bind-chroot
También:
$ repoquery --info --pkgnarrow=installed '*bind*'
Si repoquery no está instalado, hay que ejecutar:
$ sudo yum install yum-utils
Posteado por
Software and Motorcycles
a las
15:25
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
centos,
yum


viernes, 6 de julio de 2012
Cassandra en CentOS 6
Hace tiempo están disponibles los RPMs para instalar Cassandra en CentOS, pero el procedimiento indicado implica bajar el RPM de Cassandra e instalarlo manualmente. Esto no es complicado, pero SI es complicado automatizar la instalación de la última versión disponible.
Pero esto tiene solución. El repositorio puede ser registrado en CentOS, bajando el siguiente snippet y guardándolo en /etc/yum.repos.d/riptano.repo.
--
--
Luego, para instalar Cassandra 1.x:
$ yum install --assumeyes apache-cassandra11
$ chkconfig --add cassandra
$ chkconfig cassandra on
$ service cassandra start
Pero esto tiene solución. El repositorio puede ser registrado en CentOS, bajando el siguiente snippet y guardándolo en /etc/yum.repos.d/riptano.repo.
--
--
Luego, para instalar Cassandra 1.x:
$ yum install --assumeyes apache-cassandra11
$ chkconfig --add cassandra
$ chkconfig cassandra on
$ service cassandra start
Posteado por
Software and Motorcycles
a las
14:51
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
cassandra,
centos,
yum


martes, 12 de junio de 2012
Servicios IPv6 y firewalls
Hace tiempo las distintas distribuciones de Linux poseen soporte para IPv6, lo que incluye generar interfaces de red con direcciones IPv6 y servicios escuchando en dichas direcciones.
Por ejemplo, usando netstat podemos revisar los servicios TCP y UDP escuchando en IPv6:
$ sudo netstat -6nlptu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::139 :::* LISTEN 1140/smbd
tcp6 0 0 fe80::bc47:21ff:fe67:53 :::* LISTEN 1509/dnsmasq
tcp6 0 0 :::22 :::* LISTEN 1142/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1219/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 2275/exim4
tcp6 0 0 :::445 :::* LISTEN 1140/smbd
tcp6 0 0 :::12865 :::* LISTEN 2305/netserver
udp6 0 0 fe80::bc47:21ff:fe67:53 :::* 1509/dnsmasq
udp6 0 0 :::55594 :::* 1188/avahi-daemon:
udp6 0 0 :::5353 :::* 1188/avahi-daemon:
Esto puede resultar en un gran problema de seguridad si no fue tenido en cuenta al configurar los firewalls, sobre todo si hablamos de servidores conectados a internet.
Una forma de revisar si las reglas firewall para IPv6 están siendo cargadas es:
$ sudo chkconfig --list ip6tables
ip6tables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
En este caso vemos que el servicio está activado. Si no fuera así, puede activarse con:
$ sudo chkconfig ip6tables on
El siguiente paso es revisar qué reglas de firewall hay configuradas para IPv6:
$ sudo ip6tables -n -L -v
$ sudo ip6tables -P INPUT DROP
$ sudo ip6tables -P FORWARD DROP
Por ejemplo, usando netstat podemos revisar los servicios TCP y UDP escuchando en IPv6:
$ sudo netstat -6nlptu
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::139 :::* LISTEN 1140/smbd
tcp6 0 0 fe80::bc47:21ff:fe67:53 :::* LISTEN 1509/dnsmasq
tcp6 0 0 :::22 :::* LISTEN 1142/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1219/cupsd
tcp6 0 0 ::1:25 :::* LISTEN 2275/exim4
tcp6 0 0 :::445 :::* LISTEN 1140/smbd
tcp6 0 0 :::12865 :::* LISTEN 2305/netserver
udp6 0 0 fe80::bc47:21ff:fe67:53 :::* 1509/dnsmasq
udp6 0 0 :::55594 :::* 1188/avahi-daemon:
udp6 0 0 :::5353 :::* 1188/avahi-daemon:
Otra forma sería realizar un escaneo de puertos. Por ejemplo:
$ sudo nmap -6 -P0 ::1
Starting Nmap 5.21 ( http://nmap.org ) at 2012-06-12 10:26 ART
Nmap scan report for ip6-localhost (::1)
Host is up (0.00026s latency).
Not shown: 995 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
139/tcp open netbios-ssn
445/tcp open microsoft-ds
631/tcp open ipp
Nmap done: 1 IP address (1 host up) scanned in 0.09 seconds
Esto puede resultar en un gran problema de seguridad si no fue tenido en cuenta al configurar los firewalls, sobre todo si hablamos de servidores conectados a internet.
Una forma de revisar si las reglas firewall para IPv6 están siendo cargadas es:
$ sudo chkconfig --list ip6tables
ip6tables 0:off 1:off 2:on 3:on 4:on 5:on 6:off
En este caso vemos que el servicio está activado. Si no fuera así, puede activarse con:
$ sudo chkconfig ip6tables on
El siguiente paso es revisar qué reglas de firewall hay configuradas para IPv6:
$ sudo ip6tables -n -L -v
Si las reglas cargadas son correctas y proveen una protección para el equipo, aquí terminó nuestro trabajo (aunque sería bueno reiniciar el servidor para asegurarnos que todo quedó correctamente configurado). Además, si el equipo es un servidor, y hay otros administradores, puede ser que haya reglas cargadas, sean correctas, pero hayan sido cargadas "a mano", y se pierdan al reiniciar el equipo.
Si no hay reglas cargadas, una forma rápida de realizar una configuración "de emergencia" para que el kernel ignore todos los paquetes IPv6 que lleguen es:
$ sudo ip6tables -P INPUT DROP
$ sudo ip6tables -P FORWARD DROP
Esta configuración eliminará todos los paquetes, inclusive las conexiones creadas localmente (lo que pude causar problemas... para realizar una correcta configuración, hay que aprender a usar iptables!) y los paquetes de respuesta de conexiones IPv6 creadas a otros equipos...
Estas modificaciones que introdujimos al firewall se perderán al reiniciar el equipo. Para guardarlas, de manera que se apliquen automáticamente al arrancar el equipo, debemos ejecutar:
$ sudo service ip6tables save
$ sudo service ip6tables restart
$ sudo service ip6tables save
$ sudo service ip6tables restart
Posteado por
Software and Motorcycles
a las
10:52
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
iptables,
ipv6,
linux


Aceleración de consultas de DNS reverso
Las consultas de DNS reveso (Reverse DNS lookup) pueden hacer que cualquier proceso que las utilice (por ejemplo, servidores SMTP) se torne lerdo en responder, sobre todo si se realizan consultas por IPs privadas, y los DNS no están configurados con las zonas reversas correspondientes.
Para solucionarlo, una opción es desactivar las consultas reversas, pero éstas pueden proveer información útil (generalmente son realizadas para loguear el nombre asociado a los IP que crea la conexión), sobre todo cuando las conexiones son originadas en Internet. Además, esta solución implica modificar cada uno de los servicios en cada servidor.
La solución correcta es crear una zona en nuestros DNSs que respondan a estas consultas. En el caso de Bind, y suponiendo que nuestra lan utiliza las direcciones 192.168.*.*, esto se puede lograr de la siguiente manera:
En /etc/named.conf, agregar las siguientes líneas:
zone "168.192.in-addr.arpa" {
type master;
file "/etc/named.192.168.reverse";
};
El contenido del archivo /etc/named.192.168.reverse debe ser parecido a:
$TTL 2d
$ORIGIN 168.192.IN-ADDR.ARPA.
@ IN SOA ns1.example.com. hostmaster.example.com. (
200001011 ; serial number
3h ; refresh
15m ; update retry
3w ; expiry
3h ; nx = nxdomain ttl
)
IN NS ns1.example.com.
IN NS ns2.example.com.
(digo "parecido a" porque habría que ajustar "ns1.example.com", "hostmaster.example.com" y los NS).
Para solucionarlo, una opción es desactivar las consultas reversas, pero éstas pueden proveer información útil (generalmente son realizadas para loguear el nombre asociado a los IP que crea la conexión), sobre todo cuando las conexiones son originadas en Internet. Además, esta solución implica modificar cada uno de los servicios en cada servidor.
La solución correcta es crear una zona en nuestros DNSs que respondan a estas consultas. En el caso de Bind, y suponiendo que nuestra lan utiliza las direcciones 192.168.*.*, esto se puede lograr de la siguiente manera:
En /etc/named.conf, agregar las siguientes líneas:
zone "168.192.in-addr.arpa" {
type master;
file "/etc/named.192.168.reverse";
};
El contenido del archivo /etc/named.192.168.reverse debe ser parecido a:
$TTL 2d
$ORIGIN 168.192.IN-ADDR.ARPA.
@ IN SOA ns1.example.com. hostmaster.example.com. (
200001011 ; serial number
3h ; refresh
15m ; update retry
3w ; expiry
3h ; nx = nxdomain ttl
)
IN NS ns1.example.com.
IN NS ns2.example.com.
(digo "parecido a" porque habría que ajustar "ns1.example.com", "hostmaster.example.com" y los NS).
Posteado por
Software and Motorcycles
a las
10:16
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
dns,
linux


viernes, 8 de junio de 2012
PIL + Virtualenv en Ubuntu Precise Pangolin
Al instalar PIL en un virtualenv, el proceso terminó con:
*** TKINTER support not available
*** JPEG support not available
*** ZLIB (PNG/ZIP) support not available
*** FREETYPE2 support not available
*** LITTLECMS support not available
*** TKINTER support not available
*** JPEG support not available
*** ZLIB (PNG/ZIP) support not available
*** FREETYPE2 support not available
*** LITTLECMS support not available
lo que indica que PIL fue compilado SIN soporte para JPG, aunque todas las librerías necesarias (libz, libjpeg, etc) estaban instaladas, incluyendo los correspondientes paquetes de desarrollo (*-dev).
En busca de soluciones, encontré algunos posts que sugerían crear links de las librerias (libxxxxx.so) en /usr/lib, solución que me pareció poco "elegante". Hasta que encontré una solución diferente, donde tambien hace falta crear links, pero esta vez en el directorio "lib" de virtualenv.
Básicamente, hay que ejecutar:
$ cd virtualenv/lib
$ ln -s /usr/lib/x86_64-linux-gnu/libfreetype.* .
$ ln -s /usr/lib/x86_64-linux-gnu/libjpeg.* .
$ ln -s /usr/lib/x86_64-linux-gnu/libz.* .
Posteado por
Software and Motorcycles
a las
8:28
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
python,
virtualenv


lunes, 28 de mayo de 2012
Actualización de mi fork de fabric
Actualicé mi humilde fork de fabric :-D Hace tiempo salió la versión 1.4 de Fabric, pero la facultad y el trabajo no me dieron tiempo de ponerme al día.
Para instalarlo usando pip, simplemente hay que ejecutar:
pip install -e git+https://github.com/hgdeoro/fabric@1.4#egg=fabric
Para instalarlo usando pip, simplemente hay que ejecutar:
pip install -e git+https://github.com/hgdeoro/fabric@1.4#egg=fabric
Posteado por
Software and Motorcycles
a las
18:38
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
fabric,
pip,
python


domingo, 27 de mayo de 2012
Caché para pip
Al trabajar con varios proyectos Python usando virtualenv, es comun bajar una y otra vez las mismas librerías/dependencias (Django, South, PIL, psycopg2, etc).
Para optimizar la instalación de estos paquetes, se puede configurar pip para que utilice cierto directorio como cache. Para lograrlo, hay que crear el archivo ~/.pip/pip.conf, con el siguiente contenido:
[install]
download-cache = /var/cache/pip-cache
Obviamente necesitamos permisos de escritura en ese directorio. Una forma de crearlo seria:
$ sudo mkdir /var/cache/pip-cache
$ sudo chown USUARIO /var/cache/pip-cache
Para optimizar la instalación de estos paquetes, se puede configurar pip para que utilice cierto directorio como cache. Para lograrlo, hay que crear el archivo ~/.pip/pip.conf, con el siguiente contenido:
[install]
download-cache = /var/cache/pip-cache
Obviamente necesitamos permisos de escritura en ese directorio. Una forma de crearlo seria:
$ sudo mkdir /var/cache/pip-cache
$ sudo chown USUARIO /var/cache/pip-cache
Posteado por
Software and Motorcycles
a las
13:13
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
python,
virtualenv


martes, 13 de marzo de 2012
Hoy descubrí: fuser
El comando lista los procesos que poseen un archivo, socket o filesystem. Su funcionalidad es parecida a lsof, pero tiene más opciones. Por ejemplo, para ver los procesos que poseen archivos abiertos en el filesystem del dispositivo "/dev/mapper/seguro":
$ fuser -v -m /dev/mapper/seguro
USER PID ACCESS COMMAND
/dev/dm-5: root kernel swap /dev/sda6
root kernel mount /dev
horacio 2472 f.... startkde
horacio 2524 f.... unclutter
horacio 2950 F.... pulseaudio
horacio 3037 F.... gvfs-fuse-daemo
(...)
horacio 3047 F.... gvfs-gphoto2-vo
horacio 3063 F.... gvfs-afc-volume
horacio 3761 f.... chromium-browse
horacio 7684 F.... java
$ fuser -v -m /dev/mapper/seguro
USER PID ACCESS COMMAND
/dev/dm-5: root kernel swap /dev/sda6
root kernel mount /dev
horacio 2472 f.... startkde
horacio 2524 f.... unclutter
horacio 2950 F.... pulseaudio
horacio 3037 F.... gvfs-fuse-daemo
(...)
horacio 3047 F.... gvfs-gphoto2-vo
horacio 3063 F.... gvfs-afc-volume
horacio 3761 f.... chromium-browse
horacio 7684 F.... java
Posteado por
Software and Motorcycles
a las
12:24
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
hoy_descubri,
linux


jueves, 16 de febrero de 2012
Hoy descubrí: cómo obtener runlevel en Solaris
Encontré que el comando "runlevel" no existe en Solaris, pero luego de investigar un poco encontré que hay que usar "who -r".
$ who -r
. run-level 3 Mar 27 23:10 3 0 S
Este comando sí funciona en Linux (al menos en Ubuntu), así que, una manera portable (al menos Linux/Solaris) de obtener el runlevel en un script sería:
$ who -r | awk '{ print $2 }'
2
$ who -r
. run-level 3 Mar 27 23:10 3 0 S
Este comando sí funciona en Linux (al menos en Ubuntu), así que, una manera portable (al menos Linux/Solaris) de obtener el runlevel en un script sería:
$ who -r | awk '{ print $2 }'
2
Posteado por
Software and Motorcycles
a las
0:54
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
hoy_descubri,
solaris


Un primer acercamiento a ZeroMQ (con Python)
Estoy aprendiendo a usar ZeroMQ (con Python + pyzqm)y encontré que emular el funcionamiento normal de sockets TCP/IP puede ser algo complicado para un primer acercamiento a la librería.
La implementación del servidor es bastante intuitiva:
Con esta segunda implementación, el cliente no bloquea si el servidor está caído.
La implementación del servidor es bastante intuitiva:
- hacemos bind,
- esperamos recibir peticiones,
- para cada petición devolvemos una respuesta.
-
-
La implementación del cliente es la que cambia bastante. Si intentamos enviar un mensaje usando sockets TCP/IP y no se puede establecer conexión con el servidor, del lado del cliente detectamos este problema... Por lo tanto, el envío se realiza correctamente, o se produce algún error de conexión (incluyendo la posibilidad de utilizar timeouts).
Pero con ZeroMQ, si el servidor NO está ejecutándose y el cliente envía un mensaje, el cliente se bloquea hasta que se pueda contactar el servidor y realizar el envío.
-
-
Para evitar que el cliente se bloquee, no hay posibilidad de usar un "timeout", pero podemos implementar algo parecido usando Poll().
-
-
Con esta segunda implementación, el cliente no bloquea si el servidor está caído.
Posteado por
Software and Motorcycles
a las
0:43
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
python,
zeromq


jueves, 9 de febrero de 2012
Hoy descubrí: vipw y vigr
La idea es muy sencilla: permite editar /etc/passwd y /etc/group (o sus correspondientes 'shadows') luego de obtener un LOCK, y así evitar que varias personas los editen a la vez (aunque yo siempre prefiero usar comandos para alterar dichos archivos (usermod, chsh, etc) y no editarlos directamente).
Posteado por
Software and Motorcycles
a las
18:15
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
hoy_descubri


miércoles, 8 de febrero de 2012
Implementé encabezados de Fabric en colores
He realizado unos cambios en Fabric para que utilice colores en los mensajes que escribe. Esto facilita mucho la visualización al ejecutar tareas que generan mucha salida por consola.
Así es la salida original de Fabric:
Al colorear los mensajes de Fabric, el resultado es mucho más fácil de leer:
Esto se encuentra en mi fork de Fabric, en https://github.com/hgdeoro/fabric/tree/1.3-hgdeoro (para versión estable) o https://github.com/hgdeoro/fabric/tree/colorized_headers.
Posteado por
Software and Motorcycles
a las
11:55
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios


martes, 7 de febrero de 2012
Mejora a Logging por default en Django
La configuración por default de LOGGING de Django hace que no se muestren por consola los mensajes de logging generados, sólo muestra los requests, y hacer que se vean nuestros mensajes es bastante fácil, sólo hay que agregar a LOGGING (en settings.py) las líneas en negritas:
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler'
},
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler'
},
},
'loggers': {
'': {
'handlers': ['console'],
'level': 'INFO',
'propagate': True,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
(esto funcionará en Django >= 1.3)
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'mail_admins': {
'level': 'ERROR',
'class': 'django.utils.log.AdminEmailHandler'
},
'console': {
'level': 'INFO',
'class': 'logging.StreamHandler'
},
},
'loggers': {
'': {
'handlers': ['console'],
'level': 'INFO',
'propagate': True,
},
'django.request': {
'handlers': ['mail_admins'],
'level': 'ERROR',
'propagate': True,
},
}
}
(esto funcionará en Django >= 1.3)
Posteado por
Software and Motorcycles
a las
22:46
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
django,
python


domingo, 5 de febrero de 2012
Mejorando listado de task en Fabric
Cuando al usar Fabric listamos los comandos disponibles con --list, este listado está restringido a un ancho de 75 caracteres. Pero al usar una terminal de 160 caracteres de ancho, es mucho el espacio desperdiciado, y la documentación "ocultada".
Hice unos cambios en Fabric para que, al listar los comandos, utilice todo el ancho disponible. Antes, con una columna de 160 caracteres, el listado se mostraba:
Available commands:
FabricTest Nose-oriented test runner which wipes state.env and provid...
TestParallel
eq_ Shadow of the Nose builtin which presents easier to read m...
server Returns a decorator that runs an SSH server during functio...
Hice unos cambios en Fabric para que, al listar los comandos, utilice todo el ancho disponible. Antes, con una columna de 160 caracteres, el listado se mostraba:
Available commands:
FabricTest Nose-oriented test runner which wipes state.env and provid...
TestParallel
eq_ Shadow of the Nose builtin which presents easier to read m...
server Returns a decorator that runs an SSH server during functio...
Ahora:
Available commands:
FabricTest Nose-oriented test runner which wipes state.env and provides file helpers.
TestParallel
eq_ Shadow of the Nose builtin which presents easier to read multiline output.
server Returns a decorator that runs an SSH server during function execution.
Estos cambios están disponibles en mi fork de Fabric y puede ser instalado ejecutando "pip install -e git+https://github.com/hgdeoro/fabric@1.3-hgdeoro#egg=fabric"
Posteado por
Software and Motorcycles
a las
17:38
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
fabric,
python


Fabric: unsupported operand type(s) for &: 'str' and 'int'
Me ocurrió que upload_template() de Fabric fallaba con el siguiente mensaje de error:
Fatal error: put() encountered an exception while uploading '<StringIO.StringIO instance at 0x7fb4b6e0e368>'
Underlying exception message:
unsupported operand type(s) for &: 'str' and 'int'
Aborting.
Lo que estaba haciendo era bastante simple:
upload_template(
os.path.join('deploy-files', 'nginx', 'nginx-template.conf'),
nginx_config_file_to,
context=context,
use_sudo=True, backup=False, mode='0644')
Pero claro, resulta que el modo debe ser un valor en OCTAL, y no un STRING! Cambiando el modo de string a octal solucionó el problema:
Fatal error: put() encountered an exception while uploading '<StringIO.StringIO instance at 0x7fb4b6e0e368>'
Underlying exception message:
unsupported operand type(s) for &: 'str' and 'int'
Aborting.
upload_template(
os.path.join('deploy-files', 'nginx', 'nginx-template.conf'),
nginx_config_file_to,
context=context,
use_sudo=True, backup=False, mode='0644')
Pero claro, resulta que el modo debe ser un valor en OCTAL, y no un STRING! Cambiando el modo de string a octal solucionó el problema:
upload_template(
os.path.join('deploy-files', 'nginx', 'nginx-template.conf'),
nginx_config_file_to,
context=context,
use_sudo=True, backup=False, mode=0644)
os.path.join('deploy-files', 'nginx', 'nginx-template.conf'),
nginx_config_file_to,
context=context,
use_sudo=True, backup=False, mode=0644)
Es algo simple, pero lo comparto porque no encontré mucha información al buscar dicho mensaje de error en internet.
Posteado por
Software and Motorcycles
a las
0:46
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
fabric,
python


sábado, 4 de febrero de 2012
Nuevo "list format" para Fabric
He implementado un nuevo "list format" para Fabric. Este nuevo formateador hace que se muestren las distintas "tasks" declaradas, junto a la documentacion completa de las mismas.
Está disponibles en un branch de master (https://github.com/hgdeoro/fabric/tree/new_list_format_fulldoc) en un un branch de 1.3 (https://github.com/hgdeoro/fabric/tree/1.3-hgdeoro).
Por ejemplo, al ejecutar Fabric sobre "tests/test_parallel.py" con los argumentos "--list --list-format=fulldoc", se genera el siguiente listado:
Para instalarlo via pip:
$ pip install -e git+https://github.com/hgdeoro/fabric@1.3-hgdeoro#egg=fabric
Está disponibles en un branch de master (https://github.com/hgdeoro/fabric/tree/new_list_format_fulldoc) en un un branch de 1.3 (https://github.com/hgdeoro/fabric/tree/1.3-hgdeoro).
Por ejemplo, al ejecutar Fabric sobre "tests/test_parallel.py" con los argumentos "--list --list-format=fulldoc", se genera el siguiente listado:
Available commands:
FabricTest
----------
Nose-oriented test runner which wipes state.env and provides file helpers.
TestParallel
------------
eq_
---
Shadow of the Nose builtin which presents easier to read multiline output.
server
------
Returns a decorator that runs an SSH server during function execution.
Direct passthrough to ``serve_responses``.
Para instalarlo via pip:
$ pip install -e git+https://github.com/hgdeoro/fabric@1.3-hgdeoro#egg=fabric
Posteado por
Software and Motorcycles
a las
22:10
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
python


Contribuyendo a proyectos OpenSource via GitHub
Hace tiempo uso GitHub para mis proyectos open source, pero hoy pude usarlo para compartir un pequeño FIX que hice a Fabric, y la verdad es que hace muy sencillo el trabajo.
El fix es algo insignificante (en una clase hay 2 métodos con el mismo nombre). Lo que hice fue renombrarlo el método, y después investigar qué tan fácil sería compartirlo con los autores de Fabric... y resultó muy fácil. Teniendo en cuenta que yo ya había clonado el proyecto (en modo solo-lectura), los pasos que seguí fueron:
El fix es algo insignificante (en una clase hay 2 métodos con el mismo nombre). Lo que hice fue renombrarlo el método, y después investigar qué tan fácil sería compartirlo con los autores de Fabric... y resultó muy fácil. Teniendo en cuenta que yo ya había clonado el proyecto (en modo solo-lectura), los pasos que seguí fueron:
- busqué en la doc. de GitHub cómo hacerlo, y lo encontré inmediatamente: http://help.github.com/send-pull-requests/
- creé un fork del proyecto original
- esto se hace con 1 clic en la interfaz web de GitHub
- cambié el "remote" a mi fork
- git remote set-url origin git@github.com:hgdeoro/fabric.git
- creé un branch
- git branch fix_duplicated_test_method
- realicé el commit con las modificaciones
- hice el push
- git push origin fix_duplicated_test_method:fix_duplicated_test_method
- en la interfaz web de GitHub me cambié al branch fix_duplicated_test_method
- en la interfaz web de GitHub hice clic en "Pull Request" y cargué el mensaje
Posteado por
Software and Motorcycles
a las
20:50
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
git


Samba4 en CentOS 6.2
Siguiendo los pasos de https://wiki.samba.org/index.php/Samba4/HOWTO, con un CentOS 6.2 recién instalado, estos son los pasos que seguí para instalar Samba 4:
Preparacion del entorno
- crear usuario para NO trabajar con root, configurar keys de ssh y sudo
- instalar paquetes básicos
http://download.fedora.redhat.com/pub/epel/6/i386/epel-release-6-5.noarch.rpm
# sudo rpm -i epel-release-6-5.noarch.rpm
# sudo yum install -y man
# sudo rpm -i epel-release-6-5.noarch.rpm
# sudo yum install -y man
# sudo yum install -y gcc patch
# sudo yum install -y autoconf
Compilado de Samba 4
- instalamos git
- instalamos paquetes recomendados
$ yum install gtkhtml setroubleshoot-server setroubleshoot-plugins policycoreutils-python libsemange-python setools-libs-python setools-libs popt-devel libpcap-devel sqlite-devel libidn-devel libxml2-devel libacl-devel libsepol-devel libattr-devel keyutils-libs-devel zlib-devel cyrus-sasl-devel
Al instalarlos con el comando anterior, me apareció:
(...)
No package gtkhtml available.
No package libsemange-python available.
(...)
pero me imagino que no son paquetes esenciales...
- bajamos repositorio Git y compilamos
# cd samba-master
Ahora deberemos "parchear" unos scripts Python que tienen un bug (esto no hará falta cuando los arreglos a estos scripts estén en git). Para parchearlos hay que ejecutar (en una misma línea):
# curl -s https://raw.github.com/gist/1739239/a8a38ef99dae9c5a12bc6939d59161dcc1f2fa5a/use-named-argument-dir-instead-of-prefix.diff | patch -p1
Este comando fallará si los scripts fueron arreglados en el repositorio de Git (al menos los parches ya fueron aceptados :-D https://lists.samba.org/archive/samba-technical/2012-February/081527.html).
Ahora continuamos con el proceso:
# ./configure.developer --prefix=/opt/samba4-3bea5a147b
Nota: '3bea5a147b' es el commit (abreviado) de Git, sirve para identificar exactamente que versión estamos instalado. Se obtiene ejecutando: `git log --oneline | head -n 1 | cut -d " " -f 1`
# make -j2
# sudo mkdir /opt/samba4-3bea5a147b
# sudo chown USUARIO /opt/samba4-3bea5a147b
# make install
El próximo paso sería generar los archivos básicos que necesita Samba para funcionar. Esto se hace con el script "provision", pero al parecer al algún problema con el último comando que ejecutamos ("make install"): éste modifica algunos archivos y hace que se produzca un error al intentar ejecutar "provision". Por lo tanto, antes de ejecutar "provision", debemos volve a ejecutar "make" (https://lists.samba.org/archive/samba-technical/2012-February/081526.html)
El próximo paso sería generar los archivos básicos que necesita Samba para funcionar. Esto se hace con el script "provision", pero al parecer al algún problema con el último comando que ejecutamos ("make install"): éste modifica algunos archivos y hace que se produzca un error al intentar ejecutar "provision". Por lo tanto, antes de ejecutar "provision", debemos volve a ejecutar "make" (https://lists.samba.org/archive/samba-technical/2012-February/081526.html)
# make -j2
--realm=samdom.example.com \
--domain=SAMDOM \
--adminpass=SOMEPASSWORD \
--server-role='domain controller'
# sudo /opt/samba4-3bea5a147b/sbin/samba -i -M single
Aunque Samba ya está andando, queda pendiente su configurar, configuración de DNS, etc.
EDITADO: siguiendo el consejo del HOWTO, hace falta agregar el dominio en /etc/resolv.conf (una linea al estilo de "domain samdom.example.com")
EDITADO: el password seteado con "--adminpass" no debe ser simple, sino el proceso fallará con el error "check_password_restrictions: the password does not meet the complexity criteria!".
EDITADO: siguiendo el consejo del HOWTO, hace falta agregar el dominio en /etc/resolv.conf (una linea al estilo de "domain samdom.example.com")
EDITADO: el password seteado con "--adminpass" no debe ser simple, sino el proceso fallará con el error "check_password_restrictions: the password does not meet the complexity criteria!".
Posteado por
Software and Motorcycles
a las
15:27
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
2
comentarios
Labels:
centos,
samba


Corriendo tests con instancia de PostgreSql en ram
Otra manera de optimizar la ejecución de tests de Django, pero SIN modificar la instalación de PostgreSql del sistema operativo es crear una nueva instancia, corriendo totalmente en ram.
Para crear una nueva instancia usamos initdb:
$ /usr/lib/postgresql/9.1/bin/initdb \
--pgdata=/dev/shm/pgtesting \
-U horacio
Y para lanzar la instancia en segundo plano:
$ /usr/lib/postgresql/9.1/bin/postgres \
-F -i -p 5444 -S $((1024*64)) \
-D /dev/shm/pgtesting \
--unix_socket_directory=/dev/shm/pgtesting \
-r /dev/shm/pgtesting/postgresql.log &
Luego creamos el usuario y BD para la aplicación Django:
psql -h 127.0.0.1 \
-c "create user vindler with password 'x' superuser" postgres
psql -h 127.0.0.1 \
-c "create database vindler owner vindler" postgres
Mejora en tiempos de ejecución de test: 28%
La ejecución de los tests con PostgreSql en disco, con las optimizaciones de mi artículo anterior tardan alrededor de 7 segundos:
Ran 18 tests in 7.071s
5.44user 0.58system 0:10.40elapsed 57%CPU (0avgtext+0avgdata 122880maxresident)k
0inputs+1184outputs (0major+16964minor)pagefaults 0swaps
Ran 18 tests in 6.843s
5.28user 0.65system 0:10.27elapsed 57%CPU (0avgtext+0avgdata 122976maxresident)k
0inputs+1176outputs (0major+16956minor)pagefaults 0swaps
Ran 18 tests in 7.032s
5.42user 0.64system 0:10.42elapsed 58%CPU (0avgtext+0avgdata 124304maxresident)k
0inputs+1168outputs (0major+17122minor)pagefaults 0swaps
Los mismos tests ejecutandose en la nueva instancia de PostgreSql totalmente en ram, tardan alrededor de 5 segundos:
Ran 18 tests in 5.220s
4.41user 0.65system 0:08.38elapsed 60%CPU (0avgtext+0avgdata 117904maxresident)k
8inputs+1176outputs (0major+16524minor)pagefaults 0swaps
Ran 18 tests in 5.047s
4.32user 0.53system 0:08.04elapsed 60%CPU (0avgtext+0avgdata 117888maxresident)k
0inputs+1168outputs (0major+16504minor)pagefaults 0swaps
Ran 18 tests in 4.665s
3.95user 0.64system 0:07.79elapsed 58%CPU (0avgtext+0avgdata 117856maxresident)k
0inputs+1176outputs (0major+16502minor)pagefaults 0swaps
Al ejecutar los tests de stress: 33%
Con PostgreSql en disco:
Ran 1 test in 24.601s
15.21user 2.72system 0:27.98elapsed 64%CPU (0avgtext+0avgdata 130944maxresident)k
0inputs+9616outputs (0major+18298minor)pagefaults 0swaps
Ran 1 test in 24.458s
15.16user 2.51system 0:27.57elapsed 64%CPU (0avgtext+0avgdata 131488maxresident)k
472inputs+9608outputs (0major+18457minor)pagefaults 0swaps
Ran 1 test in 24.552s
15.23user 2.63system 0:27.95elapsed 63%CPU (0avgtext+0avgdata 131088maxresident)k
232inputs+9616outputs (0major+18310minor)pagefaults 0swaps
Para crear una nueva instancia usamos initdb:
$ /usr/lib/postgresql/9.1/bin/initdb \
--pgdata=/dev/shm/pgtesting \
-U horacio
Y para lanzar la instancia en segundo plano:
$ /usr/lib/postgresql/9.1/bin/postgres \
-F -i -p 5444 -S $((1024*64)) \
-D /dev/shm/pgtesting \
--unix_socket_directory=/dev/shm/pgtesting \
-r /dev/shm/pgtesting/postgresql.log &
Luego creamos el usuario y BD para la aplicación Django:
psql -h 127.0.0.1 \
-c "create user vindler with password 'x' superuser" postgres
psql -h 127.0.0.1 \
-c "create database vindler owner vindler" postgres
Mejora en tiempos de ejecución de test: 28%
La ejecución de los tests con PostgreSql en disco, con las optimizaciones de mi artículo anterior tardan alrededor de 7 segundos:
Ran 18 tests in 7.071s
5.44user 0.58system 0:10.40elapsed 57%CPU (0avgtext+0avgdata 122880maxresident)k
0inputs+1184outputs (0major+16964minor)pagefaults 0swaps
Ran 18 tests in 6.843s
5.28user 0.65system 0:10.27elapsed 57%CPU (0avgtext+0avgdata 122976maxresident)k
0inputs+1176outputs (0major+16956minor)pagefaults 0swaps
Ran 18 tests in 7.032s
5.42user 0.64system 0:10.42elapsed 58%CPU (0avgtext+0avgdata 124304maxresident)k
0inputs+1168outputs (0major+17122minor)pagefaults 0swaps
Los mismos tests ejecutandose en la nueva instancia de PostgreSql totalmente en ram, tardan alrededor de 5 segundos:
Ran 18 tests in 5.220s
4.41user 0.65system 0:08.38elapsed 60%CPU (0avgtext+0avgdata 117904maxresident)k
8inputs+1176outputs (0major+16524minor)pagefaults 0swaps
Ran 18 tests in 5.047s
4.32user 0.53system 0:08.04elapsed 60%CPU (0avgtext+0avgdata 117888maxresident)k
0inputs+1168outputs (0major+16504minor)pagefaults 0swaps
Ran 18 tests in 4.665s
3.95user 0.64system 0:07.79elapsed 58%CPU (0avgtext+0avgdata 117856maxresident)k
0inputs+1176outputs (0major+16502minor)pagefaults 0swaps
Al ejecutar los tests de stress: 33%
Con PostgreSql en disco:
Ran 1 test in 24.601s
15.21user 2.72system 0:27.98elapsed 64%CPU (0avgtext+0avgdata 130944maxresident)k
0inputs+9616outputs (0major+18298minor)pagefaults 0swaps
Ran 1 test in 24.458s
15.16user 2.51system 0:27.57elapsed 64%CPU (0avgtext+0avgdata 131488maxresident)k
472inputs+9608outputs (0major+18457minor)pagefaults 0swaps
Ran 1 test in 24.552s
15.23user 2.63system 0:27.95elapsed 63%CPU (0avgtext+0avgdata 131088maxresident)k
232inputs+9616outputs (0major+18310minor)pagefaults 0swaps
Con PostgreSql en ram:
Ran 1 test in 16.082s
11.30user 2.46system 0:19.22elapsed 71%CPU (0avgtext+0avgdata 126080maxresident)k
0inputs+9616outputs (0major+17675minor)pagefaults 0swaps
Ran 1 test in 15.736s
11.25user 2.20system 0:18.82elapsed 71%CPU (0avgtext+0avgdata 126192maxresident)k
0inputs+9608outputs (0major+17684minor)pagefaults 0swaps
Ran 1 test in 15.408s
10.78user 2.27system 0:18.44elapsed 70%CPU (0avgtext+0avgdata 126384maxresident)k
0inputs+9608outputs (0major+17693minor)pagefaults 0swaps
Posteado por
Software and Motorcycles
a las
13:25
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
django,
postgresql,
python,
testing


Acelerando tests de Django con PostgreSql
La ejecucion inicial de los tests toma aproximadamente 15 segundos:
4.54user 0.64system 0:15.25elapsed 34%CPU (0avgtext+0avgdata 123600maxresident)k
4.70user 0.54system 0:14.70elapsed 35%CPU (0avgtext+0avgdata 122992maxresident)k
4.46user 0.65system 0:14.85elapsed 34%CPU (0avgtext+0avgdata 122912maxresident)k
Luego de ajustar los siguientes parametros:
- fsync = off
- synchronous_commit = off
- wal_sync_method = fsync
la ejecución toma aproximadamente 8.5 segundos:
4.22user 0.56system 0:08.62elapsed 55%CPU (0avgtext+0avgdata 123024maxresident)k
4.32user 0.58system 0:08.97elapsed 54%CPU (0avgtext+0avgdata 123008maxresident)k
4.29user 0.50system 0:08.74elapsed 54%CPU (0avgtext+0avgdata 123040maxresident)k
El tiempo se redujo casi a la mitad! Aunque esta configuración no es para nada recomendable para un equipo de producción, creo que vale la pena para ejecutar tests.
4.54user 0.64system 0:15.25elapsed 34%CPU (0avgtext+0avgdata 123600maxresident)k
4.70user 0.54system 0:14.70elapsed 35%CPU (0avgtext+0avgdata 122992maxresident)k
4.46user 0.65system 0:14.85elapsed 34%CPU (0avgtext+0avgdata 122912maxresident)k
Luego de ajustar los siguientes parametros:
- fsync = off
- synchronous_commit = off
- wal_sync_method = fsync
la ejecución toma aproximadamente 8.5 segundos:
4.22user 0.56system 0:08.62elapsed 55%CPU (0avgtext+0avgdata 123024maxresident)k
4.32user 0.58system 0:08.97elapsed 54%CPU (0avgtext+0avgdata 123008maxresident)k
4.29user 0.50system 0:08.74elapsed 54%CPU (0avgtext+0avgdata 123040maxresident)k
El tiempo se redujo casi a la mitad! Aunque esta configuración no es para nada recomendable para un equipo de producción, creo que vale la pena para ejecutar tests.
Posteado por
Software and Motorcycles
a las
11:49
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
django,
python,
testing


jueves, 2 de febrero de 2012
Bajar paquetes y no instalarlos con yum
Suelo usar en Debian/Ubuntu el comando:
# aptitude -yd algun-paquete
que permite bajar el paquete pero NO instalarlo. Pero yum no tiene ninguna opción parecida, aunque encontré que a través de un plugin se puede conseguir la misma de aptitude.
Para instalar dicho plugin:
# yum install yum-downloadonly
# yum --help
(...)
Las instrucciones las encontré en http://www.cyberciti.biz/faq/yum-downloadonly-plugin/
# aptitude -yd algun-paquete
que permite bajar el paquete pero NO instalarlo. Pero yum no tiene ninguna opción parecida, aunque encontré que a través de un plugin se puede conseguir la misma de aptitude.
Para instalar dicho plugin:
# yum install yum-downloadonly
# yum --help
(...)
Plugin Options:
--downloadonly don't update, just download
--downloaddir=DLDIR
specifies an alternate directory to store packages
Y se puede usar, por ejemplo:
# yum install --downloadonly python-devel
Posteado por
Software and Motorcycles
a las
16:25
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
centos,
yum


miércoles, 25 de enero de 2012
Instalando django_openid_auth usando PIP
Hay algunos problemas con la version 0.4 de django_openid_auth (ej: no se puede instalar via pip). El proyecto es open source, por lo tanto es muy facil subirlo a GitHub y compartir estos arreglos :-)
Básicamente bajé el proyecto original (revisión 88) y lo subi a GitHub. Para instalarlo usando PIP hay que ejecutar:
./pip install -e git+http://github.com/hgdeoro/hgdeoro_fork_of_django_openid_auth#egg=django_openid_auth
Actualización
Mucho mejor, instalamos usando PIP, pero un commit en particular (ec68dfc046d1a75b50080ea98c56eda71956ed7a):
pip install -e git+http://github.com/hgdeoro/hgdeoro_fork_of_django_openid_auth@ec68dfc046d1a75b50080ea98c56eda71956ed7a#egg=django_openid_auth
O también un tag en particular (bzr_revno_88):
pip install -e git+http://github.com/hgdeoro/hgdeoro_fork_of_django_openid_auth@bzr_revno_88#egg=django_openid_auth
Básicamente bajé el proyecto original (revisión 88) y lo subi a GitHub. Para instalarlo usando PIP hay que ejecutar:
./pip install -e git+http://github.com/hgdeoro/hgdeoro_fork_of_django_openid_auth#egg=django_openid_auth
Actualización
Mucho mejor, instalamos usando PIP, pero un commit en particular (ec68dfc046d1a75b50080ea98c56eda71956ed7a):
pip install -e git+http://github.com/hgdeoro/hgdeoro_fork_of_django_openid_auth@ec68dfc046d1a75b50080ea98c56eda71956ed7a#egg=django_openid_auth
O también un tag en particular (bzr_revno_88):
pip install -e git+http://github.com/hgdeoro/hgdeoro_fork_of_django_openid_auth@bzr_revno_88#egg=django_openid_auth
Posteado por
Software and Motorcycles
a las
20:22
Enviar por correo electrónicoEscribe un blogCompartir en XCompartir con FacebookCompartir en Pinterest
0
comentarios
Labels:
django,
pip,
python,
virtualenv


Suscribirse a:
Entradas (Atom)