|
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!!
|