Generador de ruido

NoiseMe he preparado un pequeño script para generar distintos tipos de “ruido”.

Me he basado en esta entrada del blog the unreasonable man.

Es un script muy tonto, pero hace su trabajo.

#!/bin/sh

NOISE='white'         # Opciones: white, tpdf, pink, brown
DURATION='00:20:00'

if [ -n "$1" ]; then
  NOISE=$1
fi

nohup play \
      --no-show-progress \
      --channels 2 \
      --rate 48k \
      --type s16 \
      - \
      synth ${DURATION} ${NOISE}noise create \
      band -n 1200 200 \
      tremolo 20 .1 \
      < /dev/zero \
      2> /dev/null &

Cuando lo ejecutas genera veinte minutos de ruido. Por defecto, si no le pasas ningún parámetro, genera ruido blanco. Se puede invocar con un parámetro (white, tpdf, pink o brown) que define el tipo de ruido que quieres generar.

Lo utilizo para generar bloques de 20 minutos de aislamiento y concentración (o al menos eso intento).

Como usar svnsync para sincronizar dos repositorios Subversion

Código fuenteEl objetivo es crear un “mirror” local de un repositorio Subversion remoto.

El repositorio original, del que queremos hacer la réplica, es svnsource y está ubicado en la URL remota http://server1.ejemplo.com/svn/svnsource.

El nuevo repositorio que queremos que sea una réplica de svnsource lo vamos a denominar svntarget y estará ubicado en el servidor sobre el que estamos trabajando en el directorio /srv/svn/svntarget.

Paso 1. Creación del repositorio svntarget.

El repositorio destino no puede existir previamente (si existe debemos borrarlo) así que el primer paso es crear un nuevo repositorio vacío.

sqcman@sqclab:~$ svnadmin create --fs-type fsfs /srv/svn/svntarget

Paso 2. Ajustar los permisos del repositorio svntarget.

El programa svnsync debe poder modificar todas las propiedades del repositorio destino. Para ello deberemos crear un hook previo a modificaciones en las propiedades del repositorio (pre-revprop-change) que no ponga ninguna limitación.

sqcman@sqclab:~$ echo '#!/bin/sh' > /srv/svn/ecs/hooks/pre-revprop-change
sqcman@sqclab:~$ chmod 755 /srv/svn/ecs/hooks/pre-revprop-change

Paso 3. Inicializar el repositorio svntarget.

El siguiente paso es utilizar el programa svnsync para inicializar el repositorio destino, svntarget, indicando desde qué repositorio remoto se debe replicar (en nuestro ejemplo http://server1.ejemplo.com/svn/svnsource).

sqcman@sqclab:~$ svnsync init file:///srv/svn/svntarget http://server1.ejemplo.com/svn/svnsource
Copied properties for revision 0.

Cuando ejecutemos este comando nos solicitará, si no tenemos las credenciales ya cacheadas, el usuario y contraseña con el que conectarnos al repositorio remoto.

Paso 4. Ejecutar la primera sincronización.

Ya lo tenemos todo listo para ejecutar por primera vez el proceso de sincronización. Para ello utilizamos de nuevo el programa svnsync con el subcomando sync indicándole el repositorio destino (en nuestro ejemplo file:///srv/svn/svntarget).

sqcman@sqclab:~$ svnsync --non-interactive sync file:///srv/svn/svntarget

Después de la ejecución de este comando dispondremos en local de una copia completa del repositorio origen.

Paso 5. Automatizar la sincronización.

Para asegurar que el repositorio destino se mantenga sincronizado con el repositorio origen es necesario que ejecutemos el proceso de sincronización de forma periódica. Hay distintas alternativas, la más inmediata sería introducir un post-commit en el repositorio origen que dispare el proceso de sincronización en el servidor destino. La otra sería ejecutar periódicamente de forma automática el proceso de sincronización en el servidor destino. Este segundo acercamiento es el que vamos a configurar en este ejemplo utilizando una tarea cron.

Debemos analizar y ajustar convenientemente los permisos del repositorio Subversion destino para asegurarnos de que el usuario que va a ejecutar el proceso de sincronización tenga todos los permisos necesarios sobre el repositorio Subversion destino. En mi caso es el usuario www-data quien va a ejecutar el cron para sincronizar el repositorio.

sqcman@sqclab:~$ sudo chmod -R www-data:www-data /srv/svn/svntarget
sqcman@sqclab:~$ sudo crontab -u www-data -l
...
...
# m h  dom mon dow   command
*/5 * * * * /usr/bin/svnsync --non-interactive sync file:///srv/svn/ecs

Por último podemos hacer un seguimiento y control de la ejecución del cron revisando los logs del sistema.

sqcman@sqclab:~$ grep svnsync /var/log/syslog
Nov 15 11:40:01 sqclab CRON[5920]: (www-data) CMD (/usr/bin/svnsync --non-interactive sync file:///srv/svn/svntarget)

Referencias

How to expand online a LVM partition in Ubuntu

This is something that I have to do several times in the last months. It is a really simple procedure but I always have to look for it in Google because I never remember the exact steps.

Context

  • An Ubuntu 11.04 server with LVM installed and configured.
  • A new hard disk added to the server (usually it is a virtual server and a virtual hard disk). For this tip I am going to assume that the new disk is /dev/sdb
  • I want to expand the root partition adding the space in the new disk.

Procedure

Create a new Physical Volume using the recently added disk…

root@server:~# pvcreate /dev/sdb

It is not necessary to create a partition table in the new disk.

Now we have to add to the Volume Group the new Physical Volume…

root@server:~# vgdisplay
--- Volume group ---
VG Name vg01
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 2
Act PV 2
VG Size 17.75 GiB
PE Size 4.00 MiB
Total PE 4545
Alloc PE / Size 4545 / 17.75 GiB
Free PE / Size 0 / 0
VG UUID D9jl8R-zqxe-7wwn-3Co2-dUhu-Dnwr-aNbKpv
root@server:~# vgextend vg01 /dev/sdb

Next step is expand the Logical Volume

root@server:~# lvextend -l+2567 /dev/vg01/root

We could use the lvdisplay command to find the exact name of the Logical Volume and the total number of free Physical Extends (PE).

Last step is to resize the file system in the disk to use all the space. We could do this online without need to unmount the file system.

root@server:~# resize2fs /dev/vg01/root

You can find this procedure in multiples places in Internet, the last one I have used is this.

Bash script to create a full software development environment

I have create this (first version) script to automatize the creation of all the services related with a new software development project.

The script creates…

  • A new Subversion repository to host the source code of the project.
  • A new MySQL database to store the data of the Trac instance.
  • A new instance of Trac, linked to the just created Subversion repository, to be used like the project’s portal.
  • A configuration file for Apache2 in order to made accesible the Trac repository.

The structure of the new Subversion repository is as follows:

-> branches
-> tags
-> trunk
   -> docs
   -> src

The environment used was the following

  • Ubuntu Server 11.04 64 bits
  • Apache/2.2.17 (installed from the Ubuntu repositories)
  • MySQL Server 5.1.541ub (installed from the Ubuntu repositories)
  • Subversion 1.6.12 (installed from the Ubuntu repositories)
  • Python 2.7.1+ (installed from the Ubuntu repositories)
  • Trac 0.12

TODO

  • Implement checking to ensure that the different elements do not exists before trying to create them (for example the Subversion repository, or the MySQL database).
  • Implement the installation of the Subversion hooks that ensure that the Trac instance keeps in sync with the Subversion repository
#!/bin/bash

# Author: Jorge Tomé Hernando <jorge@jorgetome.info>
# Date: August 2011
# Version: 1.0
#
# Description
# -----------
# This scripts creates all the environment needed to support
# a new software development project.
#
# It creates a new Subversion repository, a new Trac instance
# (and the associated MySQL database) and a configuration file
# for the Apache2 web server.
#
# It also restart the Apache2 server in order to apply the new
# configuration.
#
# It has been developed and tested in an Ubuntu 11.04 environment.

usage()
{
    cat<<EOF
usage:$0 options

This script creates a new support environment for a software
development project including: Subversion repository and
Trac instance.

Options:
-h Shows this message
-p Name of the project
-u User name of the project's administrator
EOF
}

if [[ $EUID -ne 0 ]]; then
    echo "This script must be run as root" 1>&2
    exit 1
fi

PROJECT_NAME=
PROJECT_ADMIN=

while getopts ":hp:u:" opt; do
    case $opt in
        h)
            usage
            exit 1
            ;;
        p)
            PROJECT_NAME=$OPTARG
            ;;
        u)
            PROJECT_ADMIN=$OPTARG
            ;;
        ?)
            usage
            exit
        ;;
    esac
done

if [ -z $PROJECT_NAME ] || [ -z $PROJECT_ADMIN ]
then
    usage
    exit 1
fi

# Configuration variables
SVN_HOME=/srv/svn
TRAC_HOME=/srv/trac
DB_PREFIX=trac_
DB_USR=MyUserForTrac
DB_PWD=MyPasswordForTheUserForTrac
DB_HOST=localhost
DB_PORT=3306
APACHE_USR=www-data
APACHE_CONF_DIR=/etc/apache2/projects.d

# Utility variables
PROJECT_DIR=`echo ${PROJECT_NAME,,}`
DB_NAME=${DB_PREFIX}${PROJECT_DIR}
SVN_DIR=${SVN_HOME}/${PROJECT_DIR}
TRAC_DIR=${TRAC_HOME}/${PROJECT_DIR}

# First we create the Subversion repository
svnadmin create --fs-type fsfs ${SVN_DIR}
svn mkdir -m "Initialization of the repository" \
--parents \
file://${SVN_DIR}/trunk/docs \
file://${SVN_DIR}/trunk/src \
file://${SVN_DIR}/branches \
file://${SVN_DIR}/tags

# Second we have to create the MySQL database to support Trac
mysql -u root -p <<QUERY_INPUT
CREATE DATABASE ${DB_NAME};
GRANT ALL PRIVILEGES ON ${DB_NAME}.* TO ${DB_USR}@${DB_HOST} IDENTIFIED BY '${DB_PWD}';
QUERY_INPUT

# Third we have to create the Trac instance
trac-admin ${TRAC_DIR} initenv ${PROJECT_NAME} mysql://${DB_USR}:${DB_PWD}@${DB_HOST}:${DB_PORT}/${DB_NAME}
trac-admin ${TRAC_DIR} repository add ${PROJECT_DIR} ${SVN_DIR} svn
trac-admin ${TRAC_DIR} repository resync ${PROJECT_DIR}
trac-admin ${TRAC_DIR} permission add ${PROJECT_ADMIN} TRAC_ADMIN
trac-admin ${TRAC_DIR} deploy ${TRAC_DIR}/deploy

# Fourth we have to create the Apache2 configuration file
cat > ${APACHE_CONF_DIR}/${PROJECT_DIR}.conf <<EOF
WSGIScriptAlias /trac/${PROJECT_DIR} ${TRAC_DIR}/deploy/cgi-bin/trac.wsgi

<Directory ${TRAC_DIR}/deploy/cgi-bin>
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>http://www.jorgetome.info/bash-script-to-create-a-full-software-development-environment.html  

<Location "/trac/${PROJECT_DIR}/login">
    AuthType Basic
    AuthName "Trac"
    AuthUserFile /srv/trac/.htpasswd
    Require valid-user
</Location>
EOF

# Last we have to adjust the permissions on the directories and
# restart the web server
chown -R ${APACHE_USR}:${APACHE_USR} ${SVN_DIR} ${TRAC_DIR}
apache2ctl restart