Inicio   defunct.gatopelao.org(Terminales / Xen / freeNX / etc)
agenda(2)  barrufet(5)  debian(1)  linux(1)  network(2)  rediris(3)  statusnet(3)  storage(2)  xen(4)  xmpp(1)  
weblog gatopelao

Fri, 23 Oct 2009

Tuxpaint grpware
My kids' school uses gnu/linux in the classrooms.
The teachers want the children to learn that sharing is not a bad thing.
Tuxpaint is cool.
Tuxpaint-config has an option that causes drawings to be saved as a new drawing.
When teachers encourage students to build upon existing drawings, each drawing
becomes a 'fork' and art evolves in many directions.

So I've put together some scripts that allow children to share drawings on the network.
http://gatopelao.org/downloads/tuxpntgrp/

Projects
-Projects are a way of grouping drawings together under the same theme or subject.
-Teachers can create and delete projects.
-Teachers can copy, move and delete drawings within the projects.
-All projects are available to all students.
-All students can create new drawings.
-All students can open any drawing and build upon it.
-Students cannot modify or delete drawings.
-Students cannot create or delete projects.

These scripts rely on tuxpaint's 'save as new' option. It must be set in the tuxpaint configuration.
If it is not set, modifications to any drawing will simply not be saved.

Drawings are saved on a samba server. Projects are, in reality, samba shares.
There are only use two users, 'teacher' and 'student' on the samba server.
Teachers create and delete projects (via web).
Students easily join projects via a Zentiy dialog. (mount.cifs ~/.tuxpaint/saved)

The fact that all students access the projects using the same username
means a malicious student could fill projects with rubbish.
However, we wanted to at least try an open environment based on trust and respect.
Projects are available to children of the same class, the same age, school wide, etc

The scripts have not been widely tested (yet), but in small groups it has proven to work.

[/barrufet] permanent link


Fri, 16 Oct 2009

etch domU install
Esto es una copia de los viejos apuntes

http://wiki.xensource.com/xenwiki/DebianDomU

1. Create the disk
Un disco de 4GB sería esto:

dd if=/dev/zero of=/vserver/debian-base.xen.img bs=1024k count=4000
mkfs.ext3 /vserver/debian-base.xen.img
mkdir /vserver/mnt
mount -o loop /vserver/debian-base.xen.img /vserver/mnt


2. Install debian testing
debootstrap --arch i386 etch /vserver/mnt http://ftp.rediris.es/debian/
cp -a /lib/modules/2.6.12.6-xen /vserver/mnt/lib/modules

3. Entra en el jail
chroot /vserver/mnt/
apt-get install debian-archive-keyring
vim /etc/apt/sources.list
deb http://security.debian.org etch/updates main

apt-get update
apt-get install udev

vim /etc/hostname #pon tu_hostname
vim /etc/hosts
127.0.0.1 localhost
127.0.1.1 tu_hostname

vim /etc/resolv.conf

4. Red
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
#allow-hotplug eth0
#iface eth0 inet dhcp
auto eth0
iface eth0 inet static
        address 192.168.172.20
        netmask 255.255.255.0
        network 192.168.172.0
        broadcast 192.168.172.255
        gateway 192.168.172.1

5. /etc/fstab
#/etc/fstab: static file system information.
proc /proc proc defaults 0 0
/dev/hda1 / ext3 defaults,errors=remount-ro 0 1
/dev/hda2 none swap sw 0 0

6. instalar algunos paquetes
apt-get install libc6-xen ssh vim iproute locales
y reconfigurar dpkg-reconfigure locales
dpkg-reconfigure locales

7. Sal de Jail
exit

La máquina Virtual necesita swap.
dd if=/dev/zero of=/vserver/1G-swap.img bs=1k seek=1024k count=1
mkswap ./1G-swap.img

Create virtual machine config file
http://blogs.sun.com/shalon/entry/a_summary_of_creation_of
/etc/xen/desktopU
kernel = "/boot/vmlinuz-2.6.12-xen"
ramdisk = "/boot/initrd-xen-3.0.img"
memory = 1250
name = "nombreU"

#hyperthreading virtual cpus
vcpus = 2

disk = ['file:/vserver/nombreU.xen.img,hda1,w','file:/vserver/1G-swap.img,hda2,w']
#disk = ['phy:/dev/hda6,hda1,w','file:/vserver/1G-swap.img,hda2,w']

root = "/dev/hda1 ro"
#vif = ['bridge=xenbr0','bridge=xenbr1']
vif = ['bridge=eth0','bridge=eth1']
#['mac=00:16:3e:70:01:01,bridge=xenbr0','mac=00:16:3e:70:02:01,bridge=xenbr1']
extra = "xencons=tty"

Recuerda desmontar domU antes de botarlo.

[/xen] permanent link


Pensando en un entorno colaborativo.
Tuxpaint guarda todos los dibujos en ~/.tuxpaint/saved.

Limitaciones que tiene un único directorio:

  • El directorio a lo largo del año se llena.
  • El profesor no tiene manera facil de guardar los dibujos en carpetas según temario. Esto podría ser útil si los alumnos están trabajando dos o más temas y el profesor quiere mantener los dibujos según temario.
  • No hay manera de compartir el directorio entre PC's. Estaría bien que alumnos de la misma clase pudieran compartir los dibujos de un temario. Estaría bien si los directorios se pudieran compartir entre clases, aulas, y grupos de alumnos distintos a lo ancho de la red de la escuela.
Doy esta enfoque: Temario(directorio de dibujos) = Proyecto.

Política de permiso sobre dibujos y proyectos.
  • Alumnos no pueden borrar ni modificar los dibujos de los demás.
  • Todos los alumnos pueden abrir cualquier dibujo de cualquier proyecto para modificarlo y guardarlo (como dibujo nuevo).
  • Profesores pueden gestionar proyectos (crear/borrar/etc).
Que necesitamos?
  • Una manera facil para el alumno de seleccionar un proyecto y que se monte en ~/.tuxpaint/saved
  • Una manera facil para el profesor de crear proyectos nuevos.
Observaciones

En el config de tuxpaint podemos decirlo que guarde siempre como dibujo nuevo.
~/.tuxpaintrc
saveover=new
Esto permite que, aunque un alumno abra un dibujo hecho por otro, lo guardará como dibujo nuevo. De este modo se guarda la evolución del temario. Nadie va a perder nada.

En el taller que hice monté un samba share en ~/.tuxpaint/saved en cada uno de los cuatro PC's que usamos.
La escuela usa LDAP, pero no están dado de alta los alumnos. Hay que montar los shares (en todos los PC's) como guest. En principio podemos hacer que nadie puede borrar nada usando el 'create mode' en la defenición del share.
create mode =555

Sin embargo no logro que el usuario(guest) quien crea el dibujo no lo pueda también borrar. Supongo que esto se debe a que los permisos del sistema sobre los ficheros pesan más que los permisos de Samba.
$ su
# mkdir test
# chmod o+w test/
# ls -l
drwxr-xrwx 2 root root  test
# exit
$ touch test/hello
$ ls -l test/
-rw-r--r-- 1 chris chris hello
$ chmod a-w test/hello
$ rm test/hello
rm: remove write-protected regular empty file `test/hello'? y
ok.

Demuestra que, aunque no tengo permiso para borrar el fichero, puedo borrarlo porque tengo permiso de escritura en el directorio. Parece que Samba no es nuestra solución.

UPDATE 2009/10/20:
Consulté un colega y me recordó el sticky bit.

Creamos el directorio del share.

cd /shares
mkdir tuxpnt_project
chown profe tuxpnt_project
chmod 1707 tuxpnt_project
ls -l
drwx---rwt 2 profe root 4096 test

Y la definición en smb.conf
[tuxpnt_project]
        comment = TuxPaint Project
        path = /shares/tuxpnt_project
        valid users = profe,alumno
        write list = profe,alumno
        browsable = yes
        read only = No
        inherit owner = yes
Ahora sí podemos montar el share en el PC del alumno sin miedo a que vaya borrando dibujos

[/barrufet] permanent link


Tue, 13 Oct 2009

postgresql8.3 y statusnet0.8.1


Instalé statusnet con postgresql y después de probar el funcionamiento del site encuentro que postgresql no está demasiado testeado.

Si el usuario olvida la contraseña, la web tiene un formulario para recuperarla. El usuario entra su nombre o correo-e y la aplicación le manda un correo con un link donde pueda introducir un nuevo contraseña.

El problema es que cuando el usuario dé a ese link, la aplicación dice que el enlace (o la petición) se ha caducado.

En le fichero actions/recoverpassword.php se crea la petición y se guarda el la base de datos. Pero mirando la base de datos encontré que el campo 'modified' tipo TIMESTAMP, está NULL.

En la lista de statusnet dicen que en una basa de datos mysql, los campos de tipo timestamp se llenan automaticamente. Parece que no es lo mismo en postgresql.

Entonces....

# su postgres
$ createlang plpgsql statusnet
$ exit

# vim a_pg_function.sql
CREATE FUNCTION confirm_time_stamp() RETURNS trigger AS $confirm_time_stamp$
    BEGIN
        -- Add time stamp to confirm_address:modify
        NEW.modified := current_timestamp;
        RETURN NEW;
    END;
$confirm_time_stamp$ LANGUAGE plpgsql;
CREATE TRIGGER confirm_time_stamp BEFORE INSERT OR UPDATE ON confirm_address
    FOR EACH ROW EXECUTE PROCEDURE confirm_time_stamp();

# psql -h localhost -U statusnet -d statusnet -f a_pg_function.sql
Ahora puedo recuperar mi contraseña por correo. Pero parece que no está muy testeado el 0.8.1 con postgres. De momento me quedo con mysql.

[/statusnet] permanent link


shaping outgoing traffic

http://linux-ip.net/articles/Traffic-Control-HOWTO/
http://lartc.org/howto/lartc.qdisc.classful.html
http://luxik.cdi.cz/~devik/qos/htb/manual/userg.htm

La situación.
Tengo dos sedes conectados por ADSL. Cada sede tiene 4000 kilobits/s de bajada y 512 kilobits/s de subida. En una sede hay un servidor CUPS y en el otro está una impresora. Trabajos de impresión que se inician desde el servidor CUPS se apoderan de todo el ancho de banda (512kbits/s) de la ADSL dejando a los demás servicios casi inoperativos.

Cada sede tiene un router del ISP y no tengo posibilidad de configurarlos pero el servidor CUPS está detrás de una cortafuegos que administro.

Quiero que las conexiones puerto 9100 que salen por la ADSL solo ocuparán la mitad(256kbits/s = 32kilobytes/s) del caudal disponible de la ADSL. Y que todo lo demás tiene disponible el máximo que da la intefáz de mi cortafuegos (100megabit/s = 12800kilobytes/s).

Bit Byte Calculator

tc, qdisc, htb, y sfq

Egress es el trafico que sale de la interfaz.
Ingress es el trafico que entra en la interfaz.
qdisc: Queueing Discipline. Disciplina de cola.
kbps significa kilobytes
kbit significa kilobits

En HTB, rate significa el ancho de banda garantizado disponible a una clase y ceil significa techo, lo cual indica el ancho de banda máximo que una clase puede consumir. Cualquier ancho de banda usado entre rate y ceil se presta de la clase madre.

Fichero de configuración.

#asignar la packet scheduler HTB al eth0 con la etiqueta 1.
#tráfico por omisión irá a la hija clase 1:10
tc qdisc add dev eth0 root handle 1: htb default 10

#creamos la clase root bajo el qdisc 1:.
tc class add dev eth0 parent 1: classid 1:1 htb rate 12800kbps ceil 12800kbps

#clases hijas prestarán y compartirán caudal entre ellas (funcionalidad de la clase 1:1 HTB).
#son dos clases hijas. 1:10 por omisión, 1:11 cuadal limitado.
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 12700kbps ceil 12800kbps
#aunque la mitad de la subida de la ADSL son 32kbps, lo bajo aún más.
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 20kbps ceil 20kbps

tc qdisc add dev eth0 parent 1:10 sfq
tc qdisc add dev eth0 parent 1:11 sfq

tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 7 fw flowid 1:11
iptables -t mangle -A POSTROUTING -p tcp --dport 9100 -j MARK --set-mark 7

Pruebas
En mi PC detrás del firewall, en la misma red del servidor CUPS pruebo subiendo un fichero de 4gb por el puerto 22 a un servidor(10.100.10.10) al otro lado del firewall.
Asi que marco los paquetes del puerto 22.
iptables -t mangle -A POSTROUTING -p tcp --dport 22 -j MARK --set-mark 7

Creo un fichero en mi PC y lo subo.
# dd if=/dev/zero of=/tmp/foo.4gb bs=1024k count=4000
# scp /tmp/foo.4gb 10.100.10.10:/tmp
foo4.gb      0%   816KB  24KB/s  46:26:03 ETA
Funciona!

Ahora para comprobar, entro en el 10.100.10.10 y cambio la config de ssh para que esucha por el puerto 22022 y pruebo de nuevo.
# scp -P 22022 /tmp/foo.4gb 10.100.10.10:/tmp
foo4.gb      0%   9216KB  3.0MB/s  21:50 ETA
Tráfico que no sea del puerto 22, no está limitado.

[/network] permanent link


Fri, 09 Oct 2009

hard reboot
http://blog.air4web.com/linux-force-reboot.html

This commands will show you how to remotely hard reboot machine. Hard reboot mean that shutdown scripts will not run and machine reboot immediately without syncing hard disk drives, shutdown applications etc.

This commands enable sysrq and after this call fast reboot.

echo 1 > /proc/sys/kernel/sysrq
echo b > /proc/sysrq-trigger

If you want to force shutdown machine try this.
Force shutdown.

echo 1 > /proc/sys/kernel/sysrq
echo o > /proc/sysrq-trigger

[/linux] permanent link


Wed, 07 Oct 2009

Language settings
Al instalar 0.8.1 no hay manera de cambiar el idioma de la aplicación. Me aseguro que tengo instalado los locales.

# dpkg-reconfigure locales

Defino es_ES en config.php como idioma por omisión pero no va.
$config['site']['language'] = 'es_ES.UTF-8';

ni tampoco puedo cambiar el idioma desde la configuración del perfil del usuario.

# vim lib/language.php
//'es' => array('q' => 1, 'lang'=> 'es', 'name'=> 'Spanish', 'direction'=>'ltr'),
'es' => array('q' => 1, 'lang'=> 'es_ES','name'=> 'Spanish', 'direction'=>'ltr'),

Así se resuelve.

[/statusnet] permanent link


Instalar statusnet.0.8.1

http://gitorious.org/statusnet/mainline/blobs/master/README

Packages
# apt-get install git-core
# apt-get install apache2 postgresql
# apt-get install libapache2-mod-php5 php5-cli php-pear php5-pgsql php5-curl php5-gmp php5-gd
# apt-get install postfix

# cd /usr/local/src
# wget http://status.net/statusnet-0.8.1.tar.gz
# cd /var/www
# tar zxvf /usr/local/src/statusnet-0.8.1.tar.gz ./
# ln -s ./statusnet-0.8.1 ./statusnet


Postgresql
# su postgres
$ psql
postgres=# create user statusnet with password '1234';
postgres=# create database statusnet with owner statusnet encoding 'UTF8';
postgres=# \q
$ exit
# vim /etc/postgresql/8.3/main/pg_hba.conf
host    statusnet   statusnet   127.0.0.1/32          md5 sameuser
# /etc/init.d/postgresql-8.3 restart

# su postgres
$ createlang plpgsql statusnet

mysql
CREATE USER 'statusnet'@'localhost' IDENTIFIED BY '1234';
create database statusnet;
grant all on statusnet.* to 'statusnet'@localhost identified by '1234';


Apache
# cd /etc/apache2/sites-enabled/
# mv 000-default 000-default.orig
# vim 000-defualt

<VirtualHost *>
        ServerName ceroacinco
        ServerAlias 192.168.2.22
        DocumentRoot /var/www/statusnet
        <Directory /var/www/statusnet>
                AllowOverride All
                Order allow,deny
                allow from all
        </Directory>
        ErrorLog /var/log/apache2/error.log
        LogLevel warn
        CustomLog /var/log/apache2/access.log combined
</VirtualHost>

# a2enmod rewrite
# a2enmod php5
# /etc/init.d/apache2 restart

Configurar StatusNet

# cd statusnet
# cp htaccess.sample .htaccess

Página de configuración
http://mi_servidor/install.php
Esto de creará config.php

Para ver las librerías que te falten, mira la página..
# mv config.php config.php.bak
http://mi_servidor/install.php?checklibs=true
Esto te dirá que más te hace falta instalar.

Puedes instalar lo que te falta haciendo
# apt-get install  php5-dev
# pear channel-update pear.php.net
# pear install channel://pear.php.net/Validate-0.8.1
# pear install DB_DataObject
# pear install Mail
etc, etc

O también puedes instalar las liberías copiando las desde extlib/ hasta /usr/share/php
# cp extlib/markdown.php /usr/share/php
etc, etc

Ahora mira config.php.sample para saber las opciones de configuración.

Nota: Si quieres borrar la base de datos y empezar de nuevo. Primero borrala desde postgres y despues.
# cd /var/www/statusnet
# psql -h localhost -U statusnet -d statusnet -f db/statusnet_pg.sql

UPDATE 2009/10/14:
Si quieres llevar el servidor mysql en una maquina y apache en otra.

# vim /etc/mysql/my.cnf
#bind-address = 127.0.0.1
#ip de mi servidor mysql
bind-address = 10.20.103.11

# /etc/init.d/mysql restart

Tambien crear usuario que pueda acceder desde el host del apache(10.20.103.10).

CREATE USER 'statusnet'@'%' IDENTIFIED BY '1234';
create database statusnet;
GRANT ALL ON statusnet.* TO statusnet@'10.20.103.10' IDENTIFIED BY '1234';

[/statusnet] permanent link


Encuentro irislibre

Vamos a Murcia para montar aulas con Brutalix y TCOS los días 4 y 5 de noviembre.

http://diascaldum.um.es/taller/index.html
http://hm-irislibre.rediris.es/

Contamos con los desarrolladores de los dos proyectos, Mario y Eduardo, lo cual es un lujo. Esperamos estar montando y probando durante todo el día.

Y todo el mundo puede apuntarse a los talleres!!

[/rediris] permanent link


Crear tu propio .deb repository

# apt-get install reprepro apache2
# mkdir -p /var/www/repository/conf

Primero crea una clave.
# gpg --gen-key

y apunta la clave. ej. ABABABAB

Exportar la clave para que los clientes puedan importarlo.

# gpg --export -a 0xABABABAB > /var/www/repository/mykey.asc

Los clientes harán
# wget http://tu_server/mykey.asc
# apt-key add mykey.asc

# apt-get update

Continuamos..
# vim /var/www/repository/conf/distributions
Origin: yo
Label: gatopelao
Codename: etch
Version: 4.0
Architectures: i386 amd64
Components: main
Description: Repository for things
SignWith: ABABABAB


Configurar Apache
# vim /etc/apache2/sites-enabled/000-default
<VirtualHost *>
        DocumentRoot /var/www/repository/
        ServerName <nombre_de_tu_servidor>
        ErrorLog /var/log/apache2/error.log
        LogLevel warn
        CustomLog /var/log/apache2/access.log combined
        ServerSignature On
        <Directory "/var/www/repository">
                Options Indexes FollowSymLinks MultiViews
                DirectoryIndex index.html
               AllowOverride Options
                Order allow,deny
                allow from all
       </Directory>
       # Hide the conf/ directory for all repositories
       <Directory "/var/www/repository/conf">
               Order deny,allow
               Deny from all
               #Satisfy all
       </Directory>
       # Hide the db/ directory for all repositories
       <Directory "/var/www/repository/db">
              Order deny,allow
               Deny from all
               #Satisfy all
       </Directory>
</VirtualHost>

Importar paquetes
# cd /var/www/repository
# reprepro -Vb . includedeb etch /path/to/my_package.deb

Remove paquetes
# cd /var/www/repository
# reprepro -b . remove etch package_name

[/debian] permanent link


Linkat y tuxpaint

En catalunya hay, me parece, siete escuelas primarias que están en el proceso de migrar a software libre con la distribución Linkat. Tenemos la suerte que la escuela de nuestro barrio es una de ellas ya se ha migrado toda la infraestructura.

Desde hace unos años estoy con la idea de preparar un taller tipo 'Introducción al copyleft'. En julio fui una tarde a la escuela y probamos.

Se trata de usar tuxpaint para formentar el crear, compartir, y modificar.
8 alumnos y 4 PC's. Cada PC monta un cifs://mi_portatil/tuxpaint en el direcotrio donde guarda tuxpaint los dibujos. Cada 10 minutos obligaba los alumnos a guardar sus dibujos y abrir de nuevo. Decía a los alumnos que podrían escoger cualquier dibujo para continuar dibujando encima.

De esta manera esperaba que los alumnos iban a ver que otros podrían aprovecharse de su arte y que no pasaba nada, no era malo, incluso que era gratificante.

Una pareja en uno de los PC's dibujaron un cesped con flores muy bonito y no tardaban los demás alumnos en coger el cesped y usarlo como fondo de sus propios creaciones.

Cuando uno de los niños veía que otra pareja estaba dibujando encima de su cesped, decía "eh, eso es mio!". Se ve que los niños de nueve años ya están condicionados para no compartir. Y yo le decía al crio, "no pasa nada, forma parte del juego". Y lo aceptó, sin más, sin protestar.

Al terminar el taller, muchos de los dibujos tenían ese cesped de fondo. Un arbol que subía desde el cesped también se repetía en varios dibujos. También un arco iris, un pájaro, ...

Ayer fui de nuevo a la escuela para hablar con los profesores. Vamos a hacerlo de nuevo :)

UPDATE 2009/10/14:
tuxpaint drawing

[/barrufet] permanent link


June.2010(2)   May.2010(2)   March.2010(1)   January.2010(1)   December.2009(3)   November.2009(4)   October.2009(11)  
Blog software: Blosxom.com The unofficial Blosxum user group
RSS Feed rss feed