2010/07/15

How tout casser chez tout le monde épisode 1

Afin de m'assurer que lorsque je joue avec mes ports, je casse bien tout, càd sur toutes les version supportées : 7.3, 8.0, 8.1 et celles à venir. Pour pouvoir bien vérifier que je mets le dawa aussi bien sur i386 que amd64, je me suis enfin décidé à poser une tinderbox.

La tinderbox officielle de freebsd ne me convient pas. Je la trouve démeusurément complexe pour ne pas dire tordu rapport à mes besoins, Elle a besoin d'une base de données (bon à la rigueur un petit postgresql ne me dérangerai pas plus que ça) mais pour la webui il faut aussi PHP et là faut pas déconner, je n'ai pas envie de me faire chier avec du PHP sur mes machines (comment ça je suis obtu ?).

Je suis donc parti pour me pondre la mienne. Je ferai ici l'état de l'avancée de ma tinderbox maison.

Episode 1 : principe et création des environnements.

Ma tinderbox sera moins automatisée que la tinderbox officielle, il faudra se faire à la main ses jails souches etc.

concepts :

Que va faire le script :

maintenant que les concepts sont présentés passons à l'étape préparation des jails.

ici les jails sont dans /home/jails/tinderboxes celui ci étant un FS ZFS : system/jails/tinderboxes pour être précis. pour créer ces jails nous allons avoir besoin de : lftp et de zsh.

Oui comme je suis une loutre, je ne vais pas me lancer dans une compilation des sources pour créer mes jails, je vais directement partir des sets officiels.

for arch (i386 amd64) {
	for version (7.3-RELEASE 8.0-RELEASE 8.1-RC2)  {
		zfs create system/jails/tinderboxes/${version%-*}-$arch
		cd /home/jails/tinderboxes/${version%-*}-$arch
		export DESTDIR=/home/jails/tinderboxes/${version%-*}-$arch
		/usr/local/bin/lftp -c "open ftp://ftp.free.org/pub/FreeBSD/releases/$arch/$version/; mirror base"
		/usr/local/bin/lftp -c "open ftp://ftp.free.org/pub/FreeBSD/releases/$arch/$version/; mirror src"
		cd base
		yes | ./install.sh
		cd ../src
		./install.sh all
	}
}

J'ai donc maintenant à ma disposition 6 FS contenant chacun des images minimales freebsd il faut maintenant finir la config et les mettre à jours avec freebsd-update

pour chacune des jails il faudra forcer des variables d'environnement pour qu'elles sachent quel est leur version. Pour cela il faut modifier le login.conf de chacune d'entre elles et remplacer :

:setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES:\

par

:setenv=MAIL=/var/mail/$,BLOCKSIZE=K,FTP_PASSIVE_MODE=YES,UNAME_r=7.3-RELEASE,OSVERSION=703000,UNAME_v=FreeBSD 7.3-RELEASE:\

Il faut adapter le 7.3-RELEASE pour chacune des jails.

Pour déterminer la bonne valeure pour OSVERSION, un petit awk à la racine de la jail va pouvoir nous aider :

awk '/\#define __FreeBSD_version/ { print $3 }' usr/include/sys/param.h

Pour les jails i386 il faut rajouter dans la ligne du login.conf

UNAME_m=i386,UNAME_p=i386

Pour que tout ceci soit pris en compte, ne pas oublier :

cap_mkdb login.conf

Toujours pour les jails i386, il ne faut pas oublier de mettre dans etc/make.conf

MACHINE=i386
MACHINE_ARCH=i386

Avant de démarrer les jails on ajoute 2 lignes sur le etc/rc.conf de chacunes d'entres elles afin qu'elles ne démarrent ni sendmail ni cron dont nous n'avons pas besoin. Pour le moment on garde la syslog pour que la jail reste fonctionnelle.

sendmail_enable="NO"
cron_enable="NO"

sur la machine hôte on peut ajouter les lignes nécessaires au démarrage des jails dans le rc.conf :

jail_73i386_rootdir=/home/jails/tinderboxes/7.3-i386
jail_73i386_hostname="tinder73i386"
jail_73i386_ip="192.168.1.51"
jail_73i386_interface="nfe0"
jail_73i386_devfs_enable="YES"
jail_73i386_devfs_ruleset="devfsrules_jail"
jail_73i386_flags="-n tinder73i386"

faire de même pour chacune des jails.

une fois les jails démarrées, il faut effectuer les mises à jours, toujours aider de zsh :

for arch (i386 amd64) {
	for version (73 80 81) {
		jexec -U root tinder${version}${arch} /usr/sbin/freebsd-update fetch install
	}
}

Le -U root est important pour que login.conf soit pris en compte.

Un fois les mises à jours faites il est possible d'actualiser les fichiers login.conf afin de refléter les nouvelle version 7.3-RELEASE-p1 par exemple, mais ce n'est pas obligatoire.

maintenant il faut arrêter toutes les jails et faire un snapshot zfs qui nous servira de référence et permettera de repartir de bases propres :

zfs snapshot system/jails/tinderboxes/7.3-amd64@propre

recommencer l'opération pour toutes les jails.

Ceci est la fin du premier épisode (je sais ça a un air de déjà vue avec un post précédent, mais la suite sera différente :))

2010/06/17

One-liner again

Je voulais pouvoir récupérer la liste complète des ports outdated de FreeBSD, pour ça nous disposons de portscout mais ce dernier ne présente que la liste par mainteneur, or je voulais la liste complète... mais portscout propose un flux rss qui, si il est appelé sans le paramètre ?m=, liste tous les ports outdated (attention le fichier est gros).

J'ai donc pris quelques armes :

le résultat :

feed=(${(f)"$(fetch -q -o - http://portscout.org/rss/rss.cgi)"}) && for item ({1..$(xml sel -t -v "count(//item)" =( print -lr $feed))}) { xml sel -t -v //item[$item]/title =( print -lr $feed) | html2text } > portscout.txt

avec cette ligne je récupère un fichier portscout.txt donc le contenu est :

categorie/port: ancienne_version -> nouvelle_version

tout simplement

UPDATE :

Voici une version plus zshienne (plus besoin de xmlstarlet ni de html2text) en revanche elle est moins souple mais plus rapide :

feed=(${(f)"$(fetch -q -o - http://portscout.org/rss/rss.cgi)"}) && for item ({0..$#feed}) { [[ -z ${feed[$item]:#\<item\>*} ]] && { print ${${${${feed[$item + 1]}/&#x3E;/>}/\<\/title\>/}/\<title\>} } } > portscout.txt

2009/11/25

Convertir l'arbre CVS des ports en git (round 2)

Il y a quelques mois je cherchais tranquillement à convertir l'arbre cvs des ports FreeBSD en arbre git.

Ça avait bien marché, mais il y avait deux inconvénients majeurs :

Et puis hier, gaston me montre ça nonchalamment, puis ça, bon j'y crois pas trop mais je me lance

Récupération du CVSROOT

Créer le fichier de config suivant pour csup

*default host=cvsup.free.org
*default base=/var/db
*default prefix=/usr/portsdev/cvsroot
*default release=cvs
*default delete use-rel-suffix

*default compress

ports-all

Puis récupérer le cvsroot :

$ csup cvsroot-supfile

Installation des pré-requis

Installation des packages

$ make -C /usr/ports/devel/mercurial install clean
$ make -C /usr/ports/lang/ruby18 install clean
$ make -C /usr/ports/textproc/ruby-iconv install clean
$ make -C /usr/ports/devel/ruby-rbtree install clean

Installation de rcsparse

$ hg clone http://ww2.fs.ei.tum.de/~corecode/hg/rcsparse
$ cd rcsparse 
$ ruby extconf.rb
$ make
$ make site-install

Récupération des sources de fromcvs

$ hg clone http://ww2.fs.ei.tum.de/~corecode/hg/fromcvs

Conversion du CVSROOT en git

Préparation du répertoire de destination

$ mkdir /usr/portsdev/freebsd-ports.git
$ cd /usr/portsdev/freebsd-ports.git
$ git init --bare

Conversion

$ cd /usr/portsdev/fromcvs
$ ruby togit.rb /usr/portsdev/cvsroot ports /usr/portsdev/freebsd-ports.git

2h30 (oui seulement 2h30 !!! ) après c'était fait

Le répertoire de destination fait 720Mo.

Repack du rep

$ cd /usr/portsdev/freebsd-ports.git && git repack -a -f -d

Ce coup ci ça ne dure que 5 petites minutes et le répertoire ne fait plus que 410Mo

Mise à jour de l'arbre git

Comme fromcvs fonctionne de manière incrémentale, il faudra juste relancer le csup de temps en temps et relancer la commande togit.rb pour faire très rapidement les mises à jours

Bilan du round 2

fromcvs n'est pas parfait (il n'importe pas encore les tags) en revanche il a été capable de me conserver plus de branches que ce que parsecvs avait fait, en plus il est beaucoup, beaucoup, beaucoup plus rapide :

Pour les ports la conversion passe de 17h30 à 2h30 le repack passant lui de 28h50 à 5min, la taille du repos avant repack de 4go à 710Mo.

Par contre attention togit.rb est un très gros consommateur de RAM : il a bouffé mes 4Go de RAM plus 3Go de SWAP pour convertir les ports !!!

La mise à jour fonctionne parfaitement. Autant dire que je garde cette méthode. J'ai bien essayé de modifier fromcvs afin qu'il puisse importer les tags, mais je n'y suis pas arrivé, le ruby ne m'aime définitivement pas.

2009/10/20

CBlog bientôt une release donc un ports

Une nouvelle fonctionnalité vient de faire son apparition dans CBlog : la possibilité de pouvoir désactiver les commentaires via un simple "Comments: false" dans l'entête d'un message (à la demande de rhaamo - oui il y a au moins deux utilisateurs de CBlog :)).

En fait c'est encore mieux que ça, un nouveau champs Posts.nb.allow_comments est disponible dans le HDF (datafile) du coup vous pouvez faire ce que vous voulez avec dans votre template, il correspond au contenu de l'entête Comments:. Dans le template d'exemple si il est égale à false, il n'affiche pas le formulaire de commentaires.

Il me reste deux fonctionnalités à implémenter pour faire une release 1.0 :

Bien sûr il reste toujours du nettoyage a faire pour rendre plus propre et robuste le code, de la documentation :)

En ce qui concerne CPlanet il n'y a plus que du nettoyage car je ne vois pour le moment aucun besoin de rajouter de fonctionnalitées.

Dans tous les cas dès la release venue, un joli ports FreeBSD fera son entrée.

Toute contribution est la bienvenue, surtout que pour le moment le code n'a été testé que sous FreeBSD.

2009/08/28

Reconstruire les paquets cassés

Voici un petit script ZSH pour rechercher les binaires systèmes qui ne trouvent pas les bibliothèques dont ils dépendent et les reconstruire en utilisant portmaster.

#!/usr/local/bin/zsh

typeset -a torebuild

rep=(/usr/local/bin/**/*(.))
rep+=(/usr/local/lib/**/*.so(.))
rep+=(/usr/local/sbin/**/*(.))

for bin ($rep) {
    file $bin | grep -q "ELF" && {
        ldd =$bin | grep -q "not found" && {
            torebuild+=$(pkg_info -qoW $bin)
        }
    }
}
portmaster -f ${(u)torebuild}

2009/08/27

Convertir l'arbre CVS des ports en git

Voulant pouvoir jouer tranquillement avec les ports via git, je me suis dit que j'allais convertir les CVS des ports en git tout simplement.

Récupération du CVSROOT

Créer le fichier de config suivant pour csup

*default host=cvsup.free.org
*default base=/var/db
*default prefix=/usr/portsdev
*default release=cvs
*default delete use-rel-suffix

*default compress

ports-all

Puis récupérer le cvsroot :

$ csup cvsroot-supfile

Récupération et construction de parsecvs

Récupérer les sources

$ git clone git://anongit.freedesktop.org/~keithp/parsecvs

Contruire les lib git qui seront nécessaires, sans les installer.

$ make -C /usr/ports/devel/git

Modifier le Makefile de parsecvs pour qu'il ressemble à celui-ci

GCC_WARNINGS1=-Wall -Wpointer-arith -Wstrict-prototypes
GCC_WARNINGS2=-Wmissing-prototypes -Wmissing-declarations
GCC_WARNINGS3=-Wnested-externs -fno-strict-aliasing
GCC_WARNINGS=$(GCC_WARNINGS1) $(GCC_WARNINGS2) $(GCC_WARNINGS3)
GITPATH=/usr/ports/devel/git/work/git-1.6.4
CFLAGS=-O2 -g $(GCC_WARNINGS) -I$(GITPATH) -DSHA1_HEADER='<openssl/sha.h>' -I/usr/local/include
LIBS=-L$(GITPATH) -lgit $(GITPATH)/xdiff/lib.a -lssl -lcrypto -lz -liconv -L/usr/local/lib
YFLAGS=-d -l
LFLAGS=-l

OBJS=gram.o lex.o parsecvs.o cvsutil.o revdir.o \
        revlist.o atom.o revcvs.o git.o gitutil.o rcs2git.o \
        nodehash.o tags.o tree.o

parsecvs: $(OBJS)
        cc $(CFLAGS) -o $@ $(OBJS) $(LIBS)

$(OBJS): cvs.h
lex.o: y.tab.h

lex.o: lex.c

y.tab.h: gram.c

clean:
        rm -f $(OBJS) y.tab.h gram.c lex.c parsecvs
install:
        cp parsecvs edit-change-log ${HOME}/bin

Construction et installation de parsecvs

$ gmake
$ cp parsecvs edit-change-log /usr/local/bin

Conversion du CVSROOT en git

$ cd /usr/portsdev/ports

Si vous utilisez zsh :

$ print -l **/*,v | parsecvs

Sinon

$ find . -name "*,v" -print | parsecvs

Attention c'est long, très long : 17h30 sur un Q6600 avec 4Go de RAM et un disque SATA 150 en zfs Le facteur principal est la vitesse du disque dur en effet la consommation de RAM et CPU est négligeable comparée à l'utilisation disque.

Une fois cette étape terminée vous disposez d'un répertoire git fonctionnel mais énorme : plus de 4Go

Repack du rep

$ git repack -a -f -d -l

Cette étape est très longue aussi et dépend de la vitesse de votre disque pour beaucoup. Ici ça a pris 28h50

Une fois cette étape finie vous voila avec un répertoire git de 400M ce qui est quand même beaucoup mieux.

Préparation pour les mises à jour

Alors comme cvsps foire prodigieusement souvent via git cvsimport, il faut le lancer de côté :

$ export CVS_RSH=ssh
$ export CVSROOT=anoncvs@anoncvs.fr.FreeBSD.org:/home/ncvs
$ cvsps -x --norc -u -A ports > /tmp/cvsps.out

Mise à jour de l'arbre git

$ git cvsimport -o master -P /tmp/cvsps.out ports

Vous voila avec un git à jour, pour continuer à mettre à jour, recommencer les deux dernières étapes.

En un seul coup pour zsh :

$ git cvsimport -o master -P <(cvsps -x --norc -u -A ports) ports

2009/01/13

du café commerce équitable pour freebsd

Bon alors voila, depuis quelque temps le support des BSD (MacOS X compris) pour openJDK est officialisé au sein de projet bsd-port.

Ne voyant toujours rien venir dans les ports (on est obligé de se farcir du java pas libre et surtout de ce faire chier à dl à la mano tous les trucs qui vont bien pour pouvoir l'installer en acceptant des licences à droite et à gauche), je dis que je vais me le builder moi même depuis les sources.

Il y a deux possibilités d'avoir l'OpenJDK en libre : la version officielle, et la version icedtea.

Je me suis d'abord rabattu sur la version Icedtea, en effet la version 1.8 annonce intégrer le projet bsd-port. Icedtea me semblait plus simple de prime abord car toutes les dépendances sont testées par les autotools, et qu'un presque simple ./configure && make && make install devrait faire l'affaire.

C'est sans compter sur les linuxismes, en effet, il lui faut gawk, md5sum (appelé md5 sur FreeBSD donc il ne le trouve pas) plus plein de choses à droite à gauche. En ayant eu marre de patcher toutes les 5 mins les autotools, de rajouter les 25000 dépendances qui me sont inutiles, j'ai honteusement lâché l'affaire pour me rabattre sur l'OpenJDK officiel. Et là magique simple et rapide pour le faire (pas rapide à compiler par contre) :

Tout d'abord il faut commencer par préparer son environnement, pour cela il faut installer :

Ensuite il faut récupérer les sources pour cela deux manières : celle recommandée mais chiantes (que j'ai moi) passe par mercurial, l'autre passe par un snapshot mercurial :

installer mercurial ajouter le plugin forest :

$ hg clone http://www.bitbucket.org/pmezard/hgforest-crew/
$ cp hgforest-crew/forest.py /laoujaienvie/forest.py

Puis dans le ~/.hgrc, ajouter :

[extensions]
hgext.forest=/laoujaienvie/forest.py

cloner l'aborescence openjdk :

$ hg fclone http://hg.openjdk.java.net/bsd-port/bsd-port

récupérer les plugs icedtea

$ fetch http://www.intricatesoftware.com/distfiles/jdk-7-icedtea-plugs-1.6a.tar.gz

compiler le tout (attention c'est long)

$ gmake \
ALT_BOOTDIR=/usr/local/diablo-jdk1.6.0/ \
ALT_FREETYPE_HEADERS_PATH=/usr/local/include \
ALT_FREETYPE_LIB_PATH=/usr/local/lib \
ALT_BINARY_PLUGS_PATH=/home/build/jdk-7-icedtea-plugs \
ANT_HOME=/usr/local \
NO_DOCS=true \
HOTSPOT_BUILD_JOBS=1 \
OPENWIN_HOME=/usr/local \
OPENWIN_LIB=/usr/local/lib \
X11_PATH=/usr/local

Attention pour tout cela il vous faudra environ 1.2Go d'espace disque.

Une fois toute cette opération terminée vous obtiendrez dans le rép bsd-port/build un joli répertoire bsd-i586 ou un joli répertoire bsd-amd64 suivant votre archi contenant votre jdk libre tout propre.

La seconde méthode consiste à ne pas utiliser mercurial mais à prendre un snapshot depuis l'hgweb

Par exemple, pour la dernière version disponible :

$ fetch http://hg.openjdk.java.net/bsd-port/bsd-port/archive/tip.tar.bz2

Le reste est identique.

Résultat :

$ /home/build/bsd-port/build/bsd-i586/bin/java -version
openjdk version "1.7.0-internal"
OpenJDK Runtime Environment (build 1.g7.0-internal-root_2009_01_12_16_54-b00)
OpenJDK Client VM (build 14.g0-b10, mixed mode)

Voila il ne me reste plus qu'a pondre une joli ports et hop.

A noter que pour la permière compilation il faudra quand même diablo-jdk, mais ensuite votre openjdk pourra compiler les nouvelles version d'openjdk.

PS: En fait ça me fait chier les post en Anglais :)

2008/08/25

ZSH les ports et l'arbre de dépendances

voila un petit script zsh qui permet d'afficher sous la forme d'un arbre l'ensemble des dépendances d'un ports donné, je trouve ça très pratique lorsque l'on crée un nouveau ports pour pouvoir vérifier ces dépendances, ou lorsque l'on est sur le point d'installer un ports pour affiner son installation en voyant qu'elle dépendance installe qu'elle dépendance.

Cerise sur le gâteau, comme ce script fait des appels make pour récupérer la liste des dépendance, il prends en compte les options et les knobs que vous avez pu choisir.

#!/usr/bin/env zsh
PORTSDIR=$(make -V PORTSDIR)
function showdep() {
    local level=$1
    cd $2
    all_dep=(${${=${(f)"$(make -V BUILD_DEPENDS)"}}#*:} ${${=${(f)"$(make -V LIB_DEPENDS)"}}#*:} ${${=${(f)"$(make -V RUN_DEPENDS)"}}#*:})
    for dep (${(ou)all_dep}){
        repeat $level print -n "  "
        print ${dep//${PORTSDIR}\//}
        (( newlevel = level + 1 ))
        showdep $newlevel $dep
    }
}
showdep 0 "."

2008/07/18

libpuzzle : une lib pour comparer les images

Je maintien un ports pour freebsd de la libpuzzle (développée par Frank DENIS aka Jedi/Sector One)

Pour ceux qui ne le connaisse pas c'est un monsieur qu'il est vachement bien, ma conf ZSH d'origine vient de lui, (elle a beaucoup évoluée depuis) il est l'auteur des très bon logiciels suivants :

Revenons en a libpuzzle, j'ai crée ce ports sans trop connaitre la libpuzzle car c'est un dépendance d'un autre programme que j'utilise et maintien : ftwin

Récemment je me suis intéressé de plus près a libpuzzle, il s'agit donc d'une librairie permettant de comparer des images entre elles, afin de déterminée celles qui sont visuellement identiques, même dans des formats différentes. Cette lib a le bon gout de venir avec un petit utilitaire nommé puzzle-diff, qui permet de comparer en ligne de commande 2 images entre elles.

Un exemple d'utilisation sympathique c'est par exemple la détection automatique d'une image de référence dans un flux vidéos, ainsi quand on encode une série de vidéos enregistrées depuis la freebox ou il y a des pubs au début, il suffit d'avoir une image de référence pour le début de la partie intéressante de la vidéos. Le petit script suivant permet ainsi de déterminer le point de départ de l'encodage a faire :

#!/usr/bin/env zsh
FILM=$1
STARTTIME=1
date
while [ : ];do
    mplayer -really-quiet -ss $STARTTIME -vo jpeg -nosound -frames 1 "$FILM" 2>&1 >/dev/null
    [[ $(puzzle-diff 00000001.jpg startref.jpg) -lt 0.1 ]] && break
    (( STARTTIME = STARTTIME + 1 ))
done
echo $STARTTIME

il suffi ensuite de reporter le $STARTTIME dans mencoder de la manière suivante :

# mencoder -ss $STARTTIME ...

2008/07/18

Mutt c'est beau, mutt c'est bien

Dans un poste précédent, j'explique que mutt c'était vraiment bien, et que avec le patch sidebar c'était encore mieux, mais que ce patch ne fonctionnait pas dans la sa dernière version si les "folder" sont lu via un serveur imap.

Et bien comme on me l'a gentiment fait remarqué dans les commentaires il y a peu, le 11 juin 2008 ça a été corrigé

June 11, 2008 Fixes the indenting folder patch -- no more null's being displayed.

Je sais c'est vieux, mais comme le gentil porteur du paquet mutt-devel sous FreeBSD n'a pas incrémenté son PORTREVESION quand il a mis à jour le patch, je n'ai pas pu le voir.

Bref testé et approuvé, plus besoin de manip à la con pour avoir mon beau mutt avec une sidebar et des répertoires incrémentés correctement.

Merci au développeur du patch en question.

Pages : 1 2 3