3. Le système des ports BSD & les packages

La stratégie adoptée par les systèmes xBSD consiste à installer une base minimale (différente pour chacune des flavors xBSD et suffisante pour que le système puisse tourner. Rappelons du reste que chaque flavor xBSD est un système d'exploitation [Operating System] complet (i.e. comprenant un noyau, un interprète de commande, des utilitaires, des applications). Cette approche permet de ne pas avoir d'éléments superflus (installés, mais jamais utilisés) et s'oppose aux approches traditionnelles des systèmes win* ou de certaines distributions Gnu/Linux.

Il est néanmoins nécessaire d'installer des programmes tiers (applications) n'appartenant pas au système de base et puisque l'accès au code source est possible, un moyen de le faire est le suivant :

Aujourd'hui tous les administrateurs ne sont (hélas) pas forcément des programmeurs en mesure de comprendre, maintenir et/ou débugger ces programmes (activité très consommatrice de temps, désormais dévolue aux développeurs), c'est pourquoi la communauté FreeBSD a conçu (dès 1995) un système de gestion/portage des logiciels tiers, destiné à faciliter le travail de l'administrateur dans le cycle : installation ↠ configuration ↠ re/de-installation.

Ce système adopté avec succès par les autres flavors xBSD considèrent ces logiciels tiers de deux points de vue :

A ce jour, la collection des ports [ports collection, ou encore ports tree] est plutôt vaste : 15379 entrées (c.f. « FreeBSD ports [2006-07-31] »).

3.1. Les paquetages [packages]

Avantages :

  • Un paquetage est souvent plus petit que l'archive source qui lui donne naissance.

  • Un paquetage ne requiert aucune compilation ce qui peut être crucial dans le cas de grosses applications telles que xorg, Mozilla, OpenOffice, Gnome... Surtout sur un système lent !

  • Installer un paquetage ne requiert pas de compréhension quant à la compilation sous FreeBSD.

Les paquetages sont gérés par le quadruplet de primitives suivant :

Tableau 2. Primitives de gestion des packages

primitiverôle
pkg_addpour installer un paquetage.
pkg_infopour interroger la base des paquetages installés (/var/db/pkg). Selon les options activées, permet d'obtenir des informations sur le contenu du paquetage, ses dépendances ...
pkg_versionpermet d'établir un résumé des versions des paquetages installés relativement à la version courante de l'arborescence des ports, ce qui permet de connaître les paquetages à jour.
pkg_deleteEnlever un paquetage (avec respect des dépendances).


[Note]Note

L'installation du paquetage (ou du port) portupgrade permet d'enrichir cet ensemble de primitives et de simplifier la gestion des paquetages lors des mises-à-jour.

Un exemple de ce qu'installe un paquetage (wmitime) :

$ more /var/db/pkg/wmitime-0.3/+CONTENTS                                        
@comment PKG_FORMAT_REVISION:1.1 1 
@name wmitime-0.3 2
@comment ORIGIN:x11-clocks/wmitime 3
@cwd /usr/X11R6 4
@pkgdep xpm-3.4k 5
@comment DEPORIGIN:graphics/xpm 
bin/wmitime 6
@comment MD5:27323c1aba7936209161aa9e0e16cd0a 

Ces lignes nous donnent respectivement :

1

Le numéro de révision du paquetage.

2

Le nom du paquetage.

3

La catégorie (classification) du paquetage dans l'arborescence des ports (un paquetage est un port pré-compilé).

4

Le répertoire dans lequel le paquetage est installé.

5

La liste des paquetages dont dépend ce paquetage (ici wmitime dépend de xpm-3.4k, lequel relève de la catégorie graphics/xpm).

6

La liste des programmes installés, ici uniquement wmitime, dans le répertoire bin, relativement à /usr/X11R6 et leur hashage MD5 associés (permettant la vérification d'intégrité).

Installer un paquetage

Il existe plusieurs méthodes pour installer un paquetage, de même qu'il existe plusieurs sources (CDs, serveurs FTP/HTTP). Toutes les méthodes d'installation requièrent des droits étendus (root).

La première consiste à utiliser le frontal sysinstall [/usr/sbin/sysinstall], puis à se rendre dans la section Configure/Packages pour ensuite choisir le média (source des paquetages), les sélectionner et les installer. Cette méthode ne pose aucun problème.

La seconde necéssite à un accès à l'Internet et consiste à se connecter manuellement à un serveur FTP disposant des paquetages, pour les télécharger sur sa machine avant de les installer. Il existe une autre variante (plus simple) qui consiste à utiliser l'option -r de la commande pkg_add :


# setenv PACKAGEROOT ftp://ftp.fr.freebsd.org
# pkg_add -r wmitime                                                            

[Note]Note

Dans ce dernier cas, il est inutile de préciser la version du paquetage, le système se débrouille pour trouver la dernière. De plus il cherchera le paquetage sur le miroir précisé par la variable d'environnement $PACKAGEROOT.

Si vous êtes derrière un firewall, il faudra positionner un certain nombre de variables d'environnement (c.f. fetch (3)) telles que : FTP_PASSIVE_MODE, FTP_PROXY, HTTP_PROXY ...

Gérer un paquetage

La primitive pkg_info (1) permet d'obtenir des renseignements sur les paquetages installés.


$ pkg_info                                                                      
Hermes-1.3.2_1      Fast pixel formats conversion library
ImageMagick-5.5.6_1 Image processing tools (interactive optional--misc/display 
Mesa-3.4.2_2        A graphics library similar to SGI's OpenGL
ORBit-0.5.17        High-performance CORBA ORB with support for the C language
ORBit2-2.6.2        High-performance CORBA ORB with support for the C language
OpenSSH-askpass-1.2.2.2001.02.24 Graphical password applet for entering SSH pass
Sablot-0.97         XML toolkit implementing XSLT 1.0, XPath 1.0 and DOM Level2
XFree86-4.3.0,1     X11/XFree86 core distribution (complete, using mini/meta-po
..
acid-0.9.6b23       Analysis Console for Intrusion Databases (ACID) with Snort
...
docbook-1.2         Meta-port for the different versions of the DocBook DTD
docbook-241_1       V2.4.1 of the DocBook DTD, designed for technical documenta

La primitive pkg_version (1), permet de résumer les versions des paquetages installés, en les comparant aux versions localement disponible dans l'arborescence des ports.


$ pkg_version | less                                                            
apache                              =
autoconf213                         =
calamaris                           =
cvsup-mirror                        =
cvsup-without-gui                   =
db3                                 =
emacs                               =
expat                               =
ezm3                                =
freetype2                           =
gd                                  =
gettext                             =
gmake                               =
jpeg                                =
libiconv                            =
libtool                             =
m4                                  =
mrtg                                =
png                                 =
rsync                               =
squid                               =
squidGuard                          =

Tableau 3. Sémantique des symboles

SymboleSémantique
=La version du paquetage installée correspond à celle trouvée dans l'arborescence des ports.
<La version du paquetage installée est plus vieille que la version courante.
>La version du paquetage installée est plus récente que la version courante ! L'index des ports peut ne pas être à jour.
?La version du paquetage installée n'apparaît pas dans l'index des ports. L'index peut ne pas avoir été trouvé. Localisé dans un autre répertoire que celui par défaut, renseigner alors la variable d'environnement PORTSDIR ...
*Plusieurs versions du même paquetage existent. C'est le cas pour emacs, tcl, tk ...
!Pour une raison inconnue les versions installée(s) et disponible(s) n'ont pu être comparée.


Dépendances entre paquetages

Etant donné un paquetage installé, quels sont les paquetages dont il dépend, i.e. ses sous-dépendances ?


$ pkg_info -r windowmaker-0.92.0_1
Information for windowmaker-0.92.0_1:

Depends on:
Dependency: pkgconfig-0.20
Dependency: expat-2.0.0
Dependency: jpeg-6b_3
Dependency: png-1.2.8_3
Dependency: freetype2-2.1.10_2
Dependency: perl-5.8.7_2
Dependency: fontconfig-2.3.2_2,1
Dependency: libiconv-1.9.2_1
Dependency: xorg-libraries-6.9.0
Dependency: tiff-3.8.0
Dependency: gettext-0.14.5_1
Dependency: wmicons-1.0
Dependency: libungif-4.1.4
Dependency: libXft-2.1.7

L'option -r de la commande pkg_info (1) permet de connaître les sous-dépendances, i.e. les paquetages nécessaires au fonctionnement du paquetage courant.

Un paquetage installé peut à son tour rentrer dans le jeu des dépendances d'autres paquetages. Comment connaître ses sur-dépendances ? Reprenons, notre paquetage windowmaker-0.92.0_1, sur mon système cela donne :


$ pkg_info -r windowmaker-0.92.0_1
Information for windowmaker-0.92.0_1:

Required by:
wdm-1.28_1
wmakerconf-2.11_1
wmglobe-1.3_1

L'option -R de la commande pkg_info (1) permet de connaître les sur-dépendances, i.e. les paquetages dont le fonctionnement est conditionné au fonctionnement du paquetage courant.

3.2. Les ports

Les ports nécessitent un peu plus de travail pour leur installation mais ils présentent aussi des avantages :

  • Les paquetages utilisent des options restrictives leurs permettant de s'exécuter sur n'importe quelle architecture, lesquelles ne tirent pas partie des spécificités de l'architecture cible (par exemple CPU Athlon, ...).

  • Certains logiciels tiers ont des jeux d'options étendus, qui ne sont pas activés dans les paquetages (limitation aux options par défaut), ce qui n'est pas le cas avec un port.

Pour utiliser les ports, il faut au préalable récupérer et installer l'arborescence des ports ports.tgz disponible sur le premier CD de la distribution (répertoire /ports, ou bien sur un serveur FTP. L'installation s'effectue par défaut dans le répertoire /usr/ports.

Installer manuellement l'arborescence des ports (CD) : 

# mount /cdrom                                                                  
# cd /usr
# tar xjvf /cdrom/6.0-RELEASE/ports/ports.tgz
...

La personnalisation de l'environnement de compilation s'effectue dans le fichier /etc/make.conf. En voici un court extrait :

Extrait de /etc/make.conf d'une machine de type Ahtlon 64 bits 

...
#
# (?= allows to buildworld for a different CPUTYPE.)
#
CPUTYPE=athlon64

#NO_CPU_CFLAGS=         # Don't add -march=<cpu> to CFLAGS automatically
#NO_CPU_COPTFLAGS=      # Don't add -march=<cpu> to COPTFLAGS automatically
#
# CFLAGS controls the compiler settings used when compiling C code.
# Note that optimization settings other than -O and -O2 are not recommended
# or supported for compiling the world or the kernel - please revert any
# nonstandard optimization settings to "-O" or -O2 before submitting bug
# reports without patches to the developers.
#
CFLAGS= -O2 -pipe

#
# CXXFLAGS controls the compiler settings used when compiling C++ code.
# Note that CXXFLAGS is initially set to the value of CFLAGS.  If you wish
# to add to CXXFLAGS value, "+=" must be used rather than "=".  Using "="
# alone will remove the often needed contents of CFLAGS from CXXFLAGS.
#
CXXFLAGS+= -fconserve-space

...

#
# wpa_supplicant
#
# Enable this to include 802.1X and EAP support in wpa_supplicant.
# 802.1X with EAP requires openssl but it can be used without to
# do things like dynamic WEP keying.  The default is to build
# wpa_supplicant only with WPA-PSK support.
#
#ENABLE_WPA_SUPPLICANT_EAPOL=true

# added by Corto Inc, 2005-07-23
.include </usr/ports/makefile.mk>

#
ZOPEINSTANCEBASE=/jail/vm1/Zope   # Directory where Zope instance should go
ZOPEINSTANCENAME=""               # Default name for a new Zope instance (none)
#

# added by use.perl 2006-01-19 07:34:03
PERL_VER=5.8.8
PERL_VERSION=5.8.8

La suite de la configuration est placée (arbitrairement) dans le fichier /usr/ports/makefile.mk (c.f. l'extrait précédent). En voici le contenu à titre purement indicatif :

/usr/ports/makefile.mk pour une machine de type Ahtlon 64 bits 

PORTSDIR=/usr/ports
DISTDIR=/opt/pub/FreeBSD/ports/distfiles/
PACKAGES=/opt/pub/FreeBSD/ports/amd64/packages-6.0/

#### CHOME [Reunion]
MASTER_SITES='ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/'
MASTER_SITE_OVERRIDE='ftp://ftp.fr.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/'

FETCH_ENV='HTTP_PROXY=http://proxy.corto.home:8080/ \
        FTP_PROXY=ftp://proxy.corto.home:8080/ \
        FTP_TIMEOUT=10 \
        HTTP_TIMEOUT=10'

#FETCH_CMD='/usr/local/bin/wget ' 

X_WINDOW_SYSTEM=xorg
NO_SUID_XSERVER=YES

Installer un port

Nous supposons que l'arborescence des ports est localisée en /usr/ports et que nous voulons installer le port wget[2]. Nous nous contenterons de la version dediée au protocole IPv4.

  1. Se rendre dans /usr/ports

  2. Rechercher ensuite l'emplacement du port à installer dans l'arborescence (depuis /usr/ports) :

    
    $  grep ^wget INDEX-6
    wget-1.10.2|/usr/ports/ftp/wget|/usr/local|Retrieve files from the Net via HTTP 
    and FTP|/usr/ports/ftp/wget/pkg-descr|sf@FreeBSD.org|ftp www ipv6|gettext-0.14.5_1 
    libiconv-1.9.2_1 perl-5.8.7_2|gettext-0.14.5_1 libiconv-1.9.2_1|
    http://www.gnu.org/software/wget/wget.html|perl-5.8.7_2|perl-5.8.7_2|
    wgetpro-0.1.3|/usr/ports/ftp/wgetpro|/usr/local|Wget with "PRO" features|
    /usr/ports/ftp/wgetpro/pkg-descr|ports@FreeBSD.org|ftp|gettext-0.14.5_1 
    gmake-3.80_2 libiconv-1.9.2_1|gettext-0.14.5_1 libiconv-1.9.2_1||||
    wget4web-1.0|/usr/ports/www/wget4web|/usr/local|WWW interface for console wget|
    /usr/ports/www/wget4web/pkg-descr|sam@brj.pp.ru|www ftp|apache-1.3.34_4 
    expat-2.0.0 perl-5.8.7_2|apache-1.3.34_4 expat-2.0.0 gettext-0.14.5_1 
    libiconv-1.9.2_1 perl-5.8.7_2 wget-1.10.2|http://irodov.nm.ru/wget4web/|||
    
    

    autre méthode de recherche :

    
    $ make search key=^wget
    Port:   wget-1.10.2
    Path:   /usr/ports/ftp/wget
    Info:   Retrieve files from the Net via HTTP and FTP
    Maint:  sf@FreeBSD.org
    B-deps: gettext-0.14.5_1 libiconv-1.9.2_1 perl-5.8.7_2
    R-deps: gettext-0.14.5_1 libiconv-1.9.2_1
    WWW:    http://www.gnu.org/software/wget/wget.html
    
    Port:   wgetpro-0.1.3
    Path:   /usr/ports/ftp/wgetpro
    Info:   Wget with "PRO" features
    Maint:  ports@FreeBSD.org
    B-deps: gettext-0.14.5_1 gmake-3.80_2 libiconv-1.9.2_1
    R-deps: gettext-0.14.5_1 libiconv-1.9.2_1
    WWW:    
    
    Port:   wget4web-1.0
    Path:   /usr/ports/www/wget4web
    Info:   WWW interface for console wget
    Maint:  sam@brj.pp.ru
    B-deps: apache-1.3.34_4 expat-2.0.0 perl-5.8.7_2
    R-deps: apache-1.3.34_4 expat-2.0.0 gettext-0.14.5_1 libiconv-1.9.2_1 perl-5.8.7_2 wget-1.10.2
    WWW:    http://irodov.nm.ru/wget4web/
    
    
    

  3. La requête précédente nous indique l'emplacement : /usr/ports/ftp/wget :

    
    $ cd ftp/wget                                                                   
    
    

  4. Un listage du répertoire nous donne :

    $ ls -l                                                                         
    total 10
    -rw-------  1 pascal  bsd  - 1283 Dec  5 17:33 Makefile1
    -rw-------  1 pascal  bsd  -  191 Jan 25 00:47 distinfo2
    drwxr-xr-x  2 pascal  bsd  -  512 Sep  1 17:50 files3
    -rw-------  1 pascal  bsd  - 1045 Jun 10  2005 pkg-descr4 
    -rw-------  1 pascal  bsd  - 1537 Jun 10  2005 pkg-plist5 
    

    1

    Ce fichier Makefile contient les instructions de base qui permettent de construire ce port. Celui ci dépend évidement d'autres Makefiles situés dans /usr/ports/Mk.

    2

    Ce fichier contient les informations d'intégrité (hashages MD5) pour tous les fichiers sources requis pour la construction du présent port (y compris lui même).

    3

    Ce répertoire contient des fichiers supplémentaires, en particulier des patchs nécessaires à la construction du port sous FreeBSD.

    4

    Ce fichier contient une description détaillée du port (URL de référence, ...) :

    
    $ cat pkg-descr
    GNU wget is a free software package for retrieving files using HTTP,
    HTTPS and FTP, the most widely-used Internet protocols. It is a
    non-interactive command-line tool, so it may easily be called from
    scripts, cron jobs, terminals without X-Windows support, etc.
    
    GNU wget has many features to make retrieving large files or mirroring
    entire web or FTP sites easy, including:
    
     o Can resume aborted downloads, using REST and RANGE
     o Can use filename wild cards and recursively mirror directories
     o NLS-based message files for many different languages
     o Optionally converts absolute links in downloaded documents to
       relative, so that downloaded documents may link to each other locally
     o Supports HTTP and SOCKS proxies
     o Supports HTTP cookies
     o Supports persistent HTTP connections
     o Unattended / background operation
     o Uses local file timestamps to determine whether documents need to
       be re-downloaded when mirroring
     o GNU wget is distributed under the GNU General Public License.
    
    WWW: http://www.gnu.org/software/wget/wget.html
    
    

    5

    Ce fichier décrit la liste des fichiers installés par ce port :

    
    $ cat pkg-plist
    bin/wget
    etc/wgetrc
    %%NLS%%share/locale/bg/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/ca/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/cs/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/da/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/de/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/el/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/en_GB/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/eo/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/es/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/et/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/eu/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/fi/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/fr/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/ga/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/gl/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/he/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/hr/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/hu/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/it/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/ja/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/nl/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/no/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/pl/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/pt_BR/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/ro/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/ru/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/sk/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/sl/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/sr/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/sv/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/tr/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/uk/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/vi/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/zh_CN/LC_MESSAGES/wget.mo
    %%NLS%%share/locale/zh_TW/LC_MESSAGES/wget.mo
    
    

  5. Aucune option particulière n'est requise (sinon on les renseigne, le jeu complet d'option apparaît dans le Makefile spécifique du port), on peut donc lancer le processus de compilation sous l'identité de root :

    
    $ su -
    passwd:
    # cd /usr/ports/ftp/wget
    # make                                                                          
    
    

  6. Une fois la compilation terminée, on lance l'installation :

    
    # make install                                                                  
    
    

  7. on peut éventuellement lancer l'installation en créant un package, l'intérêt est de pouvoir le réinstaller plus tard sans recompilation ou bien encore de l'installer sur une machine d'architecture similaire :

    
    # make package                                                                  
    
    

    Le package obtenu est placé dans un sous répertoire de l'arborescence désignée par la variable d'environnement PACKAGE renseignée dans notre fichier /usr/ports/makefile.mk.

  8. L'installation terminée, il faut faire le ménage, i.e. supprimer les fichiers objets et le/les exécutables obtenus et stockés dans le sous-répertoire work :

    
    # make clean                                                                  
    
    

  9. Une vérification pour savoir si le port est installé (en tant qu'utilisateur standard) :

    
    $ pkg_info | grep ^wget                                                         
    wget-1.10.2         Retrieve files from the Net via HTTP and FTP
    
    

Que se passe-t'il lors de l'installation d'un port ?

Tableau 4. Principe de l'installation d'un port

OpérationSémantique
make fetchtélécharge l'archive source du port depuis un site autorisé et la place dans le $DISTDIR.
make checksumvérifie l'intégrité de l'archive.
make dependsvérifie les dépendances, les ports pré-requis à l'installation du présent port sont-ils déjà installés ?
make extractextrait le code source de l'archive dans un répertoire de travail désigné par $WRKPREFIXDIR, généralement, /usr/ports/<portname>/work/.
make patchapplique les patchs spécifiques à FreeBSD.
make configurevérifie si le programme nécessite un script de configuration, si oui l'exécute.
make buildconstruit l'/les exécutable(s).
make installinstalle le tout et enregistre cette installation dans /var/db/pkg.
make packagealternative à l'option install précédente, installe le port et créé un package (archive au format .tbz) qui peut être installé sur d'autres machines (de même architecture).
make package-recursiveinstalle le port et créé un package (archive au format .tbz) et tous les packages dépendants.
make cleannettoie l'arborescence du code objet et exécutable obtenu (suppresion du sous répertoire work).
make distcleannettoie l'arborescence du code objet et exécutable obtenu (suppresion du sous répertoire work) et du code source (stocké à l'endroit désigné par la variable d'environnement ${DISTDIR}).


Si le port possède des dépendances non installées, le processus s'interrompt pour lancer l'installation des dépendances selon le même schéma que précédemment, puis reprend son cours jusqu'à l'installation.

Invoquer directement la commande make sans argument pour un port est équivalente à la succession : make fetch, make checksum, make fetch, make depends, make extract, make patch, make configure et make build.

Gestion des ports installés

Un port installé est un paquetage, il est donc gérable avec les primitives de gestion des paquetages. Toutefois, il est possible de dé-installer ou ré-installer un port en se plaçant dans son arborescence source et en utilisant les commandes respectives suivantes : make [-f] deinstall, make [-f] reinstall. Ces commandes respectent évidement les dépendances.

Il est possible de contruire explicitement un paquetage [package] à l'issue de la compilation d'un port, ce qui permet de l'installer sans recompilation sur d'autres machines. Pour se faire, au lieu de faire un make install, on exécute un make package. Cela a pour effet d'installer le port sur la machine et de créer un paquetage.

3.3. Eléments de sécurité sur les ports et les packages

Il existe un outils qui permet de vérifier le statut de sécurité des ports/packages : portaudit ($PORTS/security/portaudit). Cet outils fait usage d'une application xml documentnant les problèmes de sécurité dans une collection de packages (telle l'arborescence des ports de FreeBSD) plus connue sous le nom de VuXML [Vulnerability and eXposure Markup Language]. Ce projet disponible aussi pour OpenBSD a vu le jour fin 2003.

Exemple 1. Une mise en œuvre de portaudit