» Catégorie : c0ding

Développement, OpenSource, Rants & Raves, bref quelques idées sur la programmation OSS et le reste...

Migration Proxmox vers VMWare ESX(i)

Etats des lieux

J'avais "un peu" testé proxmox, mais dans le milieu du travail avec des OS autres que Linux (vous savez ceux qui ont des numéro d'années dedans avec des couleurs chamarrées), c'est loin d'être la panacée :

  • Drivers Virtio qui fonctionnent comme ils ont envies
  • BSOD (oui... !)
  • Lenteur IO (même sous Linux)
  • Des OOM Killer qui tue tout quand "par hasard" il y a trop de mémoire alloué (enfin quand il reste moins de 2Go)
  • Performance réseau de merde...

Bref, au prix d'un ESX Essential à 600Euros, on peux considérer que des heures perdues pour une solution pas encore aboutie, n'est pas économiquement viable.

Migration vers ESXi

Il y a le VMWare Converter, mais des fois il se prends des pains quand il n'as pas prévu des choses... Principalement KVM (Promox) -> ESXi.

Il se viande sur les drivers virtio (oula /dev/vda pas bien.... il faut /dev/sda).

Donc il faut créer sa procédure pour migrer de la solution libre à la solution proprio, qui elle marche...

Préparation

Ce qui est étonnant, c'est que les Windows, n'ont pas besoin de préparation... Juste arrêter la VM.

Pour les Linux il y a pour l'instant (je completerais au fur et a mesure) des choses a préparer.

Ubuntu

Si le noyau generic a été installé, et que /boot/inird-generic existe, vous avez de la chance, il ne restera que a vérifier que vous avez laissé les UUID au boot OU que vous avez fait un label a la partition root (utile plus tard).

Vous pouvez aussi ajouter les modules VMWare : https://help.ubuntu.com/community/VMware/Tools, http://packages.vmware.com/tools/esx/5.0latest/index.html

Debian

Debian c'est bien mais ils customizent l'initramfs... avec seulement les drivers utilisés... Bref l'OS est donc très intimement lié au hardware : #FAIL.

Il faut donc corriger la chose, en root dans /etc/initramfs-tools/modules, ajouter

piix
ata_piix
mptspi
e1000

Puis recréer les initramfs :

update-initramfs -k all -u

Rebooter, normalement la machine doit marcher. Après vous pouvez ajouter les modules VMWare comme sur ubuntu (les versions opensource).

Backuper en utilisant l'interface de proxmox la VM soit en TGZ. soi en .lzo

Sur la machine proxmox en root

Trouver de la place, et partager en NFS cette place (pour le monter en NFS client sur le ESXi).

Puis :

cd /mnt/space
mkdir tmp 
cd tmp
tar xvf ../dump/vzdump-qemu-<idvm>-<date>...tar

Si vous avez utilisé lzo :

cd /mnt/space/tmp/
lzop -d < ../dump/vzdump-qemu-<idvm>-<date>...tar.lzo | tar xvf -

Convertion en vmdk

Dans le répertoire précédent :

qemu-img convert -p -o compat6 -f raw vm-disk-virtio0.raw -O vmdk nom-vm.vmdk

Attendre que les 100% soient arrivés... (ça peux être loooong).

Sur l'ESXi

Aller en root via SSH dessus :

cd /vmfs/volumes/datatstore1/
mkdir nom-vm
cd nom-vm
vmkfstools -i /vmfs/volumes/promox-nfs/tmp/nom-vm.vmdk -d thin vm.vmdk

Attendre les 100%, comme tout à l'heure...

Modifier le type de disques.

Pour avoir un peu plus de performance, passer le controleur du .vmdk en scsi :

 
vi vm.vmdk 

et changer :

ddb.adapterType = "ide"

en

ddb.adapterType = "lsilogic"

Sur l'interface "lourde" vCenter

Créer une nouvelle VM avec paramètre personnalisé, ayant les mêmes caractéristiques (cpu / nm de socket / os / mémoire), en précisant que le (ou les disks) existent déjà sur le "datastore1" en sélectionnant les .vmdk en question.

Booter

Windows

Ajouter via la menu console, les outils Windows VMWare... et configurer correctement la carte réseau

Linux

Booter, si tout vas bien, un coup d'update-grub en root, permet de finaliser l'installation. Autrement utiliser la commande "e" du grub pour lui faire booter le root sur le bon device (exemple root=/dev/sda1 au lieu de root=/dev/vda1, on peux aussi utiliser les labels : root=LABEL=ROOT).

Une fois arrivé au système, updater le grub :

update-grub

Ou si vous êtes sous Debian :

update-grub
update-initramfs -k all -u

Migration finie

Votre machine est donc migré, vous pouvez tuer celle qui est sur promox et reprendre une activité normale.

Des petites remarques :)

(Ajout du 31 Mai 2013)

Si vous migrez des VM Windows 2003, 2008, Win 7, ou XP, vous pouvez avoir un BSOD lors du boot. En effet, notre ami de chez Bilou, ne charge pas tous les drivers au boot et donc a part prier, vous ne pouvez rien faire.

Dans ce cas, bootez avec le Fameux Hiren's Boot CD qui vous permet de lancer un mini Windows XP avec l'utilitaire 'fix_hdr' qui permet de charger les bon drivers dans le Windows.

Il est aussi possible que certains Windows 2003 aient du mal en LSI Logic ou BusLogic afin d'éviter de perdre du temps : restez en IDE. Lent mais efficace.

Comment faire un filer chatoyant pour la maison avec Nexenta Core Platform ?

Disques durs...

Introduction (car il en faut des fois)

Comme ma timecapsule a lâchement cramé récemment à cause de la chaleur, en fait ça fait la seconde fois que l'alim crame, celle que j'avais mise marchais mais n'as pas supportée les 35°C dans l'appart donc.... je récupère le disque de 1To que j'avais mis dans la timecapsule et je vais l'utiliser pour autre chose (et après analyse post mortem, c'est pas l'alim qui a cramé, mais .. la carte mère de la timecapsule.... il me reste donc le disk de 1To, déjà changé, et la carte wifi nimo.... qui peux marcher sur OpenWRT en passant, a condition d'être zen aussi !).

Donc un filer c'est quoi ?

  1. de l'espace disque
  2. de la sécurité (bon on peux faire sans sécu aussi)
  3. de la performance

Dans mon cas j'ai besoin aussi des protocoles suivants :

  • NFS
  • AFP (Apple)
  • DAAP (iTunes pour mes zolis MP3 de mes CD)
  • Bonjour aka MDNS

J'aimerais aussi éviter d'avoir 3000 fois la même donnée sur les disques alors on vas utiliser le ZFS dedup. Donc il me reste plus que OpenSolaris. Le ZFS dedup n'étant dispo que sur les version de Dev ultra experimentales de FreeBSD on va éviter de tout perdre...

Open Solaris ou encore merci Oracle

La distribution OpenSolaris avec du dedup étant encore "un developper preview" et vu qu'elle prends trop de place a mon goût (pas besoin de Gnome ou autre pour avoir un serveur de fichier), et vu que nos amis "Oracle" a décidé que OpenSolaris deviendrai ClosedSolaris, donc il ne reste plus que Nexenta Core Platform 3.0. A télécharger sur : http://www.nexenta.org/

Le hardware

DOM Alors j'ai récupéré une vielle carte mère AMD64, collé 3Go de DDR1 (sisi ca existe) et un DOM de 4Go pour l'OS... (voir photo la à gauche !)

Une carte LSI JBOD type AOC-USAS-L8i, qui peux accessoirement faire du RAID, mais là on s'en fout car la carte passe en mode propriétaire et deviens incompatible avec Solaris (open ou pas). On peux la trouver sur ebay en fouillant :p

Un "Mobile Rack CSE-M35T-1" de supermicro, sur lequel j'ai mis un régul de vitesse pour éviter l'effet "avion" dans le salon.

Deux cables : CBL-0118L-02 (supermicro !!!) pour connecter les disk SAS vers le Mobile Rack.

Je passe sur le montage, c'est pas le but.

Installation de Nexenta Core Platform 3.0

Bon l'install étant en mode texte, suffit juste d'installer le minimum et après effectuer des détails de base afin de ne pas se faire casser les pieds avec des trucs qui ne servent pas à nos besoins.

Ip en statique

Configuration de l'IP en static. Contrairement a OpenSolaris ou on est obligé de virer "nwam", sur NCP on est resté dans les bonnes anciennes méthodes :

echo "192.168.1.1/24" > /etc/hostname.nge0 
echo "192.168.1.254" > /etc/defaultrouter
rm /etc/dhcp.nge0

Evidement il faut remplacer "nge0" par le nom de l'interface que vous avez sur cette machine.

Ne pas oublier de modifer /etc/resolv.conf après le reboot pour y ajouter les serveurs DNS car, lors du passage DHCP vers IP Fixe, le dns installé via DHCP est supprimé de ce fichier.

Normalement /etc/nsswitch.conf a bien aussi les lignes suivantes :

hosts:     files dns mdns
ipnodes:   files dns mdns

Un bon reboot et on a un truc propre a l'emploi.

Désactivation des services inutiles

NCP installe pas mal de services inutiles... On les désactive

svcadm disable svc:/network/iscsi/initiator:default
svcadm disable svc:/system/fcoe_initiator:default

Création du pool de disks..

Laissé comme un exercice... Hein ? Faut pas déconner non plus ?

NFS

Bah pareil... Sauf qu'il ne faut pas oublier de mettre les bon attributs a sharenfs :)

filer/smb  sharenfs              root=@192.168.0.0/23,sec=none,rw=@192.168.0.0/23,root_mapping=0

AFP, ou Netatalk.

Sur Nexenta Core Platform il y a un port de netatalk, il ne fonctionne pas alors c'est pas la peine de le charger, il vas surtout tomber dans dépendances foireuses... Donc nous allons donc compiler le port et le coller dans /usr/local, car au moins il risque pas de foutre la zone dans le système.

Il faut installer les dépendances suivantes sur NCP :

apt-get install sunwopenssl-include sunwopenssl-libraries libdb-dev

Un fois installé "y a plus qu'à" compiler le bidule :

./configure --prefix=/usr/local --with-pam=/usr/lib/security
make
make install

Les fichiers de conf sont dans /usr/local/etc/netatalk.

C'est par la que se situe les points délicats

netatalk.conf

Configuration de netatalk, on utilise que le partage de fichiers, tout le reste est inutile :

# Netatalk configuration
# Change this to increase the maximum number of clients that can connect:
AFPD_MAX_CLIENTS=20

# Change this to set the machine's atalk name and zone.
# NOTE: if your zone has spaces in it, you're better off specifying
#       it in afpd.conf
#ATALK_ZONE=@zone
ATALK_NAME=`echo ${HOSTNAME}|cut -d. -f1`

# specify the Mac and unix charsets to be used
ATALK_MAC_CHARSET='MAC_ROMAN'
ATALK_UNIX_CHARSET='LOCALE'

# specify the UAMs to enable
# available options: uams_guest.so, uams_clrtxt.so, uams_randnum.so, 
#                            uams_dhx.so, uams_dhx2.so
# AFPD_UAMLIST="-U uams_dhx.so,uams_dhx2.so"
# Change this to set the id of the guest user
AFPD_GUEST=nobody

# Set which daemons to run.
# If you need legacy AppleTalk, run atalkd.
# papd, timelord and a2boot are dependent upon atalkd.
# If you use "AFP over TCP" server only, run only cnid_metad and afpd.
ATALKD_RUN=no
PAPD_RUN=no
TIMELORD_RUN=no
A2BOOT_RUN=no
CNID_METAD_RUN=yes
AFPD_RUN=yes

# Control whether the daemons are started in the background.
# If it is dissatisfied that atalkd starts slowly, set "yes".
ATALK_BGROUND=no

# export the charsets, read form ENV by apps
export ATALK_MAC_CHARSET
export ATALK_UNIX_CHARSET

# config for cnid_metad. Default log config:
# CNID_CONFIG="-l log_note"

afpd.conf

- -tcp -noddp -uamlist uams_cleartxt.so,uams_dhx.so,uams_dhx2.so -nosavepassword
#- -transall -uamlist uams_dhx.so,uams_dhx2.so -nosavepassword

Ceci permet d'utiliser les MDP de Solaris sur Netatalk, donc ne pas oublier de créer un user ayant le même user que celui de votre mac pour qu'on puisse s'identifier. Si vous mettez un gecos, le serveur netalk fera la correspondance correcte...

AppleVolumes.default

Les volumes a exporter en AFP

# [...]
/stuff/smb "Fichiers" allow:@staff cnidscheme:dbd options:usedots,invisibledots,upriv perm:0770
/filer/tmp "Temporaire" allow:@staff cnidscheme:dbd options:usedots,invisibledots,upriv perm:0770
/filer/sav "Sauvegardes" allow:kiwi cnidscheme:dbd options:usedots,invisibledots,upriv perm:0770
/filer/archives "Archives" allow:kiwi cnidscheme:dbd options:usedots,invisibledots,upriv perm:0770
/filer/miaomiao "Miaomiao" allow:miaomiao cnidscheme:dbd options:usedots,invisibledots,upriv perm:0770
/filer/timemachine/mina "TimeMachine Mina" allow:kiwi cnidscheme:dbd options:usedots,invisibledots,upriv perm:0770
/filer/timemachine/taya "TimeMachine Taya" allow:kiwi cnidscheme:dbd options:usedots,invisibledots,upriv perm:0770
/filer/timemachine/miaomiao "TimeMachine Miaomiao" allow:miaomiao cnidscheme:dbd options:usedots,invisibledots,upriv perm:0770

Ce qui fait les volumes suivants :

  • Fichiers
  • Temporaire
  • Sauvegardes
  • Archives
  • Miaomiao
  • TimeMachine Mina
  • TimeMachine Taya
  • TimeMachine Miaomiao

Exporter avec mdns les volumes...

Créez un fichier /var/svc/manifest/site/dnssd-afp.xml avec le contenu :

<?xml version="1.0"?>
<!DOCTYPE service_bundle SYSTEM "/usr/share/lib/xml/dtd/service_bundle.dtd.1">
<service_bundle type="manifest" name="dnssd-afp">
  <service
     name="site/dnssd-afp"
     type="service"
     version="1">

    <single_instance/>

    <dependency
       name="filesystem-local"
       grouping="require_all"
       restart_on="none"
       type="service">
      <service_fmri value="svc:/system/filesystem/local:default"/>
    </dependency>

   <dependency
       name="dns-multicast"
       grouping="require_all"
       restart_on="none"
       type="service">
      <service_fmri value="svc:/network/dns/multicast:default"/>
    </dependency>

    <exec_method
       type="method"
       name="start"
       exec="/lib/svc/method/dnssd-afp"
       timeout_seconds="60">
      <method_context>
        <method_credential user="root" group="root"/>
      </method_context>
    </exec_method>

    <exec_method
       type="method"
       name="stop"
       exec=":kill"
       timeout_seconds="60">
    </exec_method>

    <instance name="default" enabled="false" />

    <stability value="Unstable" />

    <template>
      <common_name>
        <loctext xml:lang="C">
          dns-sd registration of afp daemon
        </loctext>
      </common_name>
      <documentation>
        <manpage title="dns-sd" section="1M" manpath="/usr/man"/>
      </documentation>
    </template>
  </service>
</service_bundle>

Puis dans le fichier /lib/svc/method/, créez le fichier dnssd-afp :

#!/sbin/sh
#
# Registers the AFP daemon with dns-sd.
#
/usr/bin/dns-sd -R filer _afpovertcp._tcp local 548 &
/usr/bin/dns-sd -R filer _device-info._tcp. local 548 model=Xserve &
# Sleep to ensure service has enough time to start up,
# otherwise SMF will timeout waiting for it to be ready.
sleep 5

Ne pas oublier de chmod 755 dnssd-afp; chown root:root dnssd-afp.

Importer le service :

pfexec svccfg -v import /var/svc/manifest/site/dnssd-afp.xml

Executer le service :

pfexec svcadm enable dnssd-afp

Et vous pouvez voir si le service tourne :

 svcs dnssd-afp
STATE          STIME    FMRI
online         Aug_22   svc:/site/dnssd-afp:default

Normalement votre serveur de fichier doit donc apparaitre assez rapidement sur la barre à gauche de votre finder.

MT-DAAPT ou le partage iTunes.

Bon... Normalement on prenant la version SVN de mt-daapd on arrivais à faire des choses. Vu que Apple a changé la version du protocole avec la version 10 de iTunes, on vas donc ... pas aborder cette section pour l'instant. On verra plus tard quand un fix ou un autre fork de mt-daapd/firefly existeras.

Et time machine ?

Et bien vous avez vu dans les partage j'ai prévu des exports time machine...

On peux faire accepter a OS X de prendre un partage AFP non Timecapsule de la façon suivante, sur un shell sur le Mac :

defaults write com.apple.systempreferences TMShowUnsupportedNetworkVolumes 1

Monter le volume sur votre finder, puis jouer avec Panneau de configuration et choisir le volume Timemachine.

Et *hop* :)

Conclusion.

Un bon début, il me reste a ajouter :

  • CIFS car sur Solaris le serveur NFS (qui n'est PAS samba) est un peu tricky
  • L'ajout de napp-it

Une forge sous FreeBSD

Introduction

Comme bapt, j'ai pour mes besoins personnels de mettre en place une forge sur mon OS préféré afin de dégager mon vieux truc sur une jail et quelques wrappers...

Redmine est donc une bonne alternative a tout ce qui trainne et en plus c'est en ruby (balle avec des branches dedans !).

Pas mal de composants sont sur les ports donc nous allons utiliser :

  • redmine : /usr/ports/www/redmine
  • mysql (ou pgsql... a vous de choisir)
  • ruby-mysql : /usr/ports/databases/ruby-mysql
  • thin : le serveur web du coma pour ruby : /usr/ports/www/rubygem-thin
  • le binding image magic : ruby-rmagick : /usr/ports/graphics/ruby-rmagick
  • subversion : /usr/ports/devel/subversion (git me gonflant par manque de doc et le bordel général de ce soft...)
  • apache2.2 : /usr/ports/www/apache22
  • lighttpd : /usr/ports/www/lighttpd
  • mod_perl : /usr/ports/www/mod_perl2 (pour svn pawah)

Pour l'installation des ports, c'est assez simple et je passe donc cette étape.

Après compilation de tous ces packages, il vous reste a configurer redmine, la base mysql, thin et le serveur SVN :p

Configuration de redmine

Il s'agit de prendre en gros ce qu'il y a dans le manuel d'install de redmine.

Créer la base SQL :

En ligne de commande ou via phpmyadmin :p

create database redmine character set utf8;
create user 'redmine'@'localhost' identified by 'my_password';
grant all privileges on redmine.* to 'redmine'@'localhost';

Configurer redmine

Dans /usr/local/www/redmine

cd config
cp database.yml.example database.yml
cp email.yml.example email.yml

Editer les 2 fichiers pour que la configuration soit correspondante a vos paramètres.

Configuration de base de redmine

Session store secret :

RAILS_ENV=production rake config/initializers/session_store.rb

Initialisation de la DB :

RAILS_ENV=production rake db:migrate

Insertion des valeurs par défaut :

RAILS_ENV=production rake redmine:load_default_data

Initialisation des plugins locaux

RAILS_ENV=production rake db:migrate_plugins

1er lancement

ruby script/server webrick -e production

Se connecter sur http://127.0.0.1:3000/ avec comme login admin et password admin. Vérifier que tout est ok puis arreter le server webrick a coup de Ctrl+C.

Configuration du serveur thin.

Thin permet d'avoir un serveur web rapide.

Droits d'accès

Dans notre forge, les accès web seront fait en tant www:www. Comme dans notre test, nous avons accédés a pas mal de pages en tant que root. Il faut changer les droits pour le serveur web thin se pete pas la tete :

cd /usr/local/www && chown -R www:www redmine

Fichier de démarrage

Il reprends le fichier de démarrage de bapt avec les modification FreeBSD :

[kiwi@dev2 /usr/local/etc/rc.d]$ cat thin 
#!/bin/sh
#
# PROVIDE: thin
# REQUIRE: DAEMON
#
# thin_enable="YES"
#

thin_enable=${thin_enable-"NO"}

. /etc/rc.subr

name=thin
rcvar=`set_rcvar`

command=/usr/local/bin/${name}
stop_cmd="/usr/local/bin/thin -c /usr/local/www/redmine -e production stop"
command_args="-c /usr/local/www/redmine -e production -d -u www -g www start"

load_rc_config ${name}
run_rc_command "$1"

Pour l'activer :

# chmod 755 /usr/local/etc/rc.d/thin
# echo "thin_enable=YES" >> /etc/rc.conf
# /usr/local/etc/rc.d/thin start

Le serveur web tourne alors sur le port 3000, vous pouvez donc vous connecter dessus sans soucis. En cas d'un internal error, il faut jeter un coup d'oeil dans /usr/local/www/redmine/log/* afin de voir où est l'erreur... (en général c'est des problèmes de droits...).

Lighttpd

Afin de rendre la chose propre et éviter que thin soit direct sur le net, un coup de lighttpd sera a installer.

La compilation est simple, soit laisser les options par défaut, soit les modifier :)

Fichier de conf (sans les commentaires, histoire de garder de la place) :

server.modules              = (
                                "mod_redirect",
                                "mod_access",
                                "mod_proxy",
                                "mod_accesslog" )

# [...] configuration du reste selon vos envies

server.document-root        = "/usr/local/www/data/"

$SERVER["socket"] == "0.0.0.0:443" {
##### SSL engine
ssl.engine                 = "enable"
ssl.pemfile                = "/usr/local/etc/CA/xxx.pem"
ssl.ca-file                = "/usr/local/etc/CA/ca-bundle.pem"
}
$SERVER["socket"] == ":80" {
  $HTTP["host"] =~ "redmine.oav.net$" {
    url.redirect = ( "^/(.*)" => "https://redmine.oav.net/$1" )
    server.name                 = "redmine.oav.net"
  }
}

$HTTP["host"] == "redmine.oav.net" {
        proxy.server = ( "" =>
                        (
                         ( "host" => "127.0.0.1",
                           "port" => 3000
                         )
                        )
                       )
}

Evidement le reste de la conf de lighttpd est a compléter selon vos envies.

SVN et ses amis...

Introduction

Dans le cas de redmine, on peux couple SVN avec la base d'authentification de redmine afin de n'avoir qu'un seul point d'accès.

Dans mon exemple j'ai voulu avoir accès au module SVN, _que_ via SSL. Subversion aimant apache 2.0 par defaut, il faut donc compiler apache avant SVN

Compilation de apache 2.2

Dans /usr/ports/www/apache22, compiler apache avec les options suivantes :

_OPTIONS_READ=apache-2.2.14_5
WITHOUT_APR_FROM_PORTS=true
WITH_THREADS=true
WITH_MYSQL=true
WITHOUT_PGSQL=true
WITH_SQLITE=true
WITH_IPV6=true
WITH_BDB=true
WITH_AUTH_BASIC=true
WITH_AUTH_DIGEST=true
WITH_AUTHN_FILE=true
WITH_AUTHN_DBD=true
WITH_AUTHN_DBM=true
WITH_AUTHN_ANON=true
WITH_AUTHN_DEFAULT=true
WITH_AUTHN_ALIAS=true
WITH_AUTHZ_HOST=true
WITH_AUTHZ_GROUPFILE=true
WITH_AUTHZ_USER=true
WITH_AUTHZ_DBM=true
WITH_AUTHZ_OWNER=true
WITH_AUTHZ_DEFAULT=true
WITH_CACHE=true
WITH_DISK_CACHE=true
WITH_FILE_CACHE=true
WITHOUT_MEM_CACHE=true
WITH_DAV=true
WITH_DAV_FS=true
WITHOUT_BUCKETEER=true
WITHOUT_CASE_FILTER=true
WITHOUT_CASE_FILTER_IN=true
WITHOUT_EXT_FILTER=true
WITHOUT_LOG_FORENSIC=true
WITHOUT_OPTIONAL_HOOK_EXPORT=true
WITHOUT_OPTIONAL_HOOK_IMPORT=true
WITHOUT_OPTIONAL_FN_IMPORT=true
WITHOUT_OPTIONAL_FN_EXPORT=true
WITHOUT_LDAP=true
WITHOUT_AUTHNZ_LDAP=true
WITH_ACTIONS=true
WITH_ALIAS=true
WITH_ASIS=true
WITH_AUTOINDEX=true
WITH_CERN_META=true
WITH_CGI=true
WITH_CHARSET_LITE=true
WITH_DBD=true
WITHOUT_DEFLATE=true
WITH_DIR=true
WITH_DUMPIO=true
WITH_ENV=true
WITH_EXPIRES=true
WITH_HEADERS=true
WITH_IMAGEMAP=true
WITH_INCLUDE=true
WITH_INFO=true
WITH_LOG_CONFIG=true
WITH_LOGIO=true
WITH_MIME=true
WITH_MIME_MAGIC=true
WITH_NEGOTIATION=true
WITH_REWRITE=true
WITH_SETENVIF=true
WITH_SPELING=true
WITH_STATUS=true
WITH_UNIQUE_ID=true
WITH_USERDIR=true
WITH_USERTRACK=true
WITH_VHOST_ALIAS=true
WITH_FILTER=true
WITH_VERSION=true
WITHOUT_PROXY=true
WITHOUT_PROXY_CONNECT=true
WITHOUT_PATCH_PROXY_CONNECT=true
WITHOUT_PROXY_FTP=true
WITHOUT_PROXY_HTTP=true
WITHOUT_PROXY_AJP=true
WITHOUT_PROXY_BALANCER=true
WITHOUT_PROXY_SCGI=true
WITH_SSL=true
WITHOUT_SUEXEC=true
WITHOUT_CGID=true

Compilation de mod_perl2

Dans ''/usr/ports/www/mod_perl2", compiler avec les options par defaut

Compilation de SVN

Dans /usr/ports/devel, compiler avec les options :

_OPTIONS_READ=subversion-1.6.6_1
WITH_MOD_DAV_SVN=true
WITH_APACHE2_APR=true
WITH_MOD_DONTDOTHAT=true
WITH_NEON=true
WITHOUT_SERF=true
WITHOUT_SASL=true
WITH_BDB=true
WITHOUT_ASVN=true
WITHOUT_MAINTAINER_DEBUG=true
WITHOUT_SVNSERVE_WRAPPER=true
WITHOUT_STATIC=true
WITHOUT_BOOK=true

Quelques modules perl a ajouter

  • p5-DBD-mysql : /usr/ports/database/p5-DBD-mysql
  • p5-Digest-SHA1 : /usr/ports/security/p5-Digest-SHA1

Configuration de redmine pour qu'il accepte l'autocreation des repository SVN

Par rapport a la doc de redmine, il faut donc autoriser ''Enable WS for repository management", qui se trouve dans le compte admin de Redmine dans :

Administration -> Settings -> Repository -> Enable WS for repository management

C'est la seconde case a cocher... j'ai un poil jamais vu cette case... peut-être que mes yeux auto-filtrent(tm)(r)(c) les trucs dont j'ai besoin :)

Créer le répertoire père pour svn et configurer l'autocreate de respository.

mkdir /svn
chown www:www /svn
cd /usr/local/www/redmine && /usr/local/bin/ruby extra/svn/reposman.rb --redmine 127.0.0.1:3000 --svn-dir /svn --owner www --url file:///svn --verbose

Vous pouvez mettre la dernière ligne en crontab ou dans un script shell, type /etc/daily.local par exemple. Normalement lors de l'exécution de la dernière ligne les repository sont automatiquement crées *et* ajouté dans les "dépôts" sur l'interface web...

Il ne reste plus qu'à mettre à dispo les repository en http.

Configuration du Sioux

Remarque

Je voulais mettre Apache derrière un lighttpd, mais il me semble que lighttpd 1.4.x manque quelques fonctions importantes pour le webdav ou sont un poil incomplètes en mod_proxy. Si vous avez des infos et/ou des modifications faites le moi parvenir.

Fichier ''httpd.conf'

Ne garder que les modules suivants et dans l'ordre (il y a peut être quelques modules superflux... merci de me l'indiquer !) :

ServerRoot "/usr/local"
Listen 8080 # port a la con pas utilisé !
#
LoadModule authn_file_module libexec/apache22/mod_authn_file.so
LoadModule authn_dbm_module libexec/apache22/mod_authn_dbm.so
LoadModule authn_anon_module libexec/apache22/mod_authn_anon.so
LoadModule authn_dbd_module libexec/apache22/mod_authn_dbd.so
LoadModule authn_default_module libexec/apache22/mod_authn_default.so
LoadModule authn_alias_module libexec/apache22/mod_authn_alias.so
LoadModule authz_host_module libexec/apache22/mod_authz_host.so
LoadModule authz_groupfile_module libexec/apache22/mod_authz_groupfile.so
LoadModule authz_user_module libexec/apache22/mod_authz_user.so
LoadModule authz_dbm_module libexec/apache22/mod_authz_dbm.so
LoadModule authz_owner_module libexec/apache22/mod_authz_owner.so
LoadModule authz_default_module libexec/apache22/mod_authz_default.so
LoadModule auth_basic_module libexec/apache22/mod_auth_basic.so
LoadModule auth_digest_module libexec/apache22/mod_auth_digest.so
LoadModule log_config_module libexec/apache22/mod_log_config.so
LoadModule logio_module libexec/apache22/mod_logio.so
LoadModule env_module libexec/apache22/mod_env.so
LoadModule mime_magic_module libexec/apache22/mod_mime_magic.so
LoadModule cern_meta_module libexec/apache22/mod_cern_meta.so
LoadModule headers_module libexec/apache22/mod_headers.so
LoadModule usertrack_module libexec/apache22/mod_usertrack.so
LoadModule unique_id_module libexec/apache22/mod_unique_id.so
LoadModule setenvif_module libexec/apache22/mod_setenvif.so
LoadModule ssl_module libexec/apache22/mod_ssl.so
LoadModule mime_module libexec/apache22/mod_mime.so
LoadModule asis_module libexec/apache22/mod_asis.so
LoadModule info_module libexec/apache22/mod_info.so
LoadModule rewrite_module libexec/apache22/mod_rewrite.so
LoadModule perl_module        libexec/apache22/mod_perl.so
LoadModule dav_module         libexec/apache22/mod_dav.so
LoadModule dav_svn_module     libexec/apache22/mod_dav_svn.so

plus loin dans le fichier :

# Server-pool management (MPM specific)
Include etc/apache22/extra/httpd-mpm.conf

#...
# Secure (SSL/TLS) connections
Include etc/apache22/extra/httpd-ssl.conf

dans le répertoire ''/usr/local/etc/apache22/extra :

cp httpd-mpm.conf httpd-mpm.conf.orig
cp httpd-ssl.con httpd-ssl.conf.orig

fichier httpd-mpm.conf

<IfModule mpm_prefork_module>
    StartServers          1
    MinSpareServers       1
    MaxSpareServers      10
    MaxClients          15
    MaxRequestsPerChild   10
</IfModule>

fichier httpd-ssl.conf

 more httpd-ssl.conf
Listen 1443
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl    .crl
SSLPassPhraseDialog  builtin
SSLSessionCache        "shmcb:/var/run/ssl_scache(512000)"
SSLSessionCacheTimeout  300
SSLMutex  "file:/var/run/ssl_mutex"

Créer le fichier /usr/local/etc/apache22/Include/svn.conf

C'est ce fichier qui faire la magie webdav / svn / redmine

PerlRequire /usr/local/etc/apache22/perl/startup.pl
<VirtualHost *:1443>
DocumentRoot "/var/empty"
ServerName svn.oav.net:443
ServerAdmin kiwi@oav.net
ErrorLog "/var/log/httpd-error.log"
TransferLog "/var/log/httpd-access.log"
SSLEngine on
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile "/usr/local/etc/CA/domain.crt"
SSLCertificateKeyFile "/usr/local/etc/CA/domain.key"
SSLCACertificateFile "/usr/local/etc/CA/ca-bundle.pem"
BrowserMatch ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0
PerlLoadModule Apache::Authn::Redmine
        <Location />
            DAV svn
            SVNParentPath /svn

            Order deny,allow
            Deny from all
            Satisfy any
            PerlAccessHandler Apache::Authn::Redmine::access_handler
            PerlAuthenHandler Apache::Authn::Redmine::authen_handler

            AuthType Basic
            Authname "SVN repository"
            Require valid-user
            RedmineDSN "DBI:mysql:database=redmine;host=sql-srv"
            RedmineDbUser "redmine-user"
            RedmineDbPass "redmine-pass"
            # Read only access
            <Limit GET PROPFIND OPTIONS REPORT>
              Require valid-user
              Allow from 111.222.222.333
              # Allow from ip...
              Allow from 127.0.0.1
              Satisfy any
            </Limit>
            # Write Access
            <LimitExcept GET PROPFIND OPTIONS REPORT>
              Require valid-user
            </LimitExcept>
        </Location>
</VirtualHost>

Creer la magie nécessaire a mod_perl

cd /usr/local/etc/apache22
mkdir -p perl/Apache/Authn
cd perl
cp /usr/local/www/redmine/extra/Redmine.pm Apache/Authn

Dans le fichier startup.pl :

use lib qw(/usr/local/etc/apache22/perl);

1;

Démarrez apache2.2 et vous avez votre repository.

TODO

  • Mail on commit
  • Quoi d'autres?

iSCSI Target et (Open)Solaris

En attandant l'article quelques notes :

Comment modifier un Intel Pro 1000 en initiateur iSCSI

(MAJ), depuis OpenSolaris 2009.06, il y a un nouveau Target iSCSI qui est, parait-il, mieux. Il permet de faire de l'iSCSI over RDMA, ce qui doit un poil patatter (RDMA = infinband et au delà !).

To be continued.

Bouygues, iPhone et forfait iPhone...

Il y a quelques temps j'avais essayé le forfait Web & Mail version 1 chez Bouygues et j'avais été plus que déçus.

En effet, le système étais décevant, proxy pour recevoir les mails en pop3, pas d'imap et encore moins d'imap ssl...

Comme mon engagement s'arrêtais au début Avril, j'ai donc patienté quelques jours et j'ai donc un forfait iPhone .... maintenant que Bouygues peut commercialiser les iPhones.

Quelques news :

  1. l'imap SSL fonctionne donc on peux avoir enfin gmail et des messageries avec de l'imap
  2. le port 25 est toujours bloqué... mais 587 n'est pas proxyfié... donc on peux envoyer avec son serveur de mail vers gmail et les messageries normales...

Quelques infos utiles :

L'APN qui marche est "ebouygtel.com".

Au fur et a mesure que je teste le truc, je mettrais à jour mes impressions et découvertes.

Ports bloqués :

  • 2525 / TCP

Ports proxyfiés

  • 25 / TCP

Ports non bloqués ou proxyfiés

  • 587 / TCP (smtp-submit)
  • 993 / TCP (imaps)
  • 443 / TCP (https) - j'ai quand même un doute
  • 22 / TCP (ssh) - c'est récent.

Bouygues Web & Mail et l'iPhone

J'ai un iPhone... Mais je ne voulais pas aller chez Orange, c'est une question de principe :)

Alors Bouygues a sortit un "super" forfait nommé Web & Mail...

Déjà l'arnaque c'est qu'on avais que le Web pendant le premier mois... :(

Le mail est "arrivé" le 2 Avril (heureusement que c'était pas le 1er...) au bout d'un mois d'attente sans qu'on aie une réduction de principe sur le forfait, mais super limité :

  1. On peut faire que du POP3 sans crypto
  2. On peut faire que smtp sans crypto ni identification SMTP Auth

Sans compter les limites a la noix, par exemple mails envoyé max à 300Ko...., pas d'IMAP.. Bref un produit dingue de l'époque pré-stalinienne.

Bref, j'ai l'impression qu'on se fout de la tronche des consommateurs.

J'ai donc essayé de contourner ces limitations a la noix... et j'ai compris pourquoi Bouygues a eu tellement de mal a sortir ce pseudo-service.

Voyons un peu de débug, en mode Wifi

Connection en Imap sur le port 110 :

On voit parfaitement que tout est ok, le protocole IMAP est 100% respecté.

En SMTP :

Aucun problèmes, on tappe bien sur le bon serveur et le protocole est respecté :)


Test en EDGE

IMAP :

On voit parfaitement qu'on passe par un proxy POP3 "transparent" qui intercepte toutes le commandes envoyées et par conséquents vos logins et mot de passes, et évidement tout le contenus de vos mails.

En SMTP :

La c'est encore mieux, le serveur de mail original est entièrement "spoofé" par Bouygues, et envoie les mails au lieu et a la place du serveur officiel de votre boite mail.... Ce qui explique la limitation d'envoi de mail à 300Ko...

Conclusion

Non seulement Bouygues nous roule dans la farine, mais aussi nous espionne, sans compter le point pénible de ce forfait qui nous oblige a changer la configuration de mail sans arrêt quand on passe de Edge au Wifi, rends ce pseudo-forfait comme inutile et pas pratique du tout.
A croire que Orange c'est mieux...

Passerelle SMS

Pour les besoins de ma boite en terme de monitoring, j'avais besoin d'envoyer des SMS de façon indépendante de l'opérateur, de l'état de la connection internet, etc...
Il y a donc pas trop le choix, il faut donc faire une passerelle SMS.

Il y a donc plusieurs choix :

  • Payer une passerelle propriétaire, tournant sur un OS stupide, qui ne peux pas être scriptable... et closed source.
  • Passer par les passerelles SMTP des opérateurs
  • En monter une avec des solutions OpenSource

Le choix fut rude (encore que.... ?), j'ai donc décidé d'en monter une avec des solutions OpenSource.

Matériel nécessaire

  1. Une becane Unix libre (Linux, FreeBSD,...) : j'ai pris un PII 233 sous FreeBSD 6.1
  2. Un téléphone portable pourris qui marche, avec son chargeur, plus cable serie qui va bien.
    J'ai choisi un Nokia 7110 de récupération avec le cable DLR3P
  3. Un logiciel open source Gnokii utilisé pour faire l'interface entre le port série et le Nokia
  4. Un logiciel open source Mail2SMS pour faire l'interface entre les mails vers des SMS. Très utile pour garder que ce qui est nécessaire pour éliminer les parties inutiles d'un mail
  5. Procmail, pour faire les choses proprement avec votre serveur SMTP préféré
  6. Une carte SIM d'un opérateur avec SMS illimités (cherchez bien ! ca existe)

Installation du bouzin

Un fois votre système d'exploitation opensource installé, il reste a installer et configuré gnokii et mail2sms. Utilisant les ports FreeBSD, la partie compilation, installation des binaires et simple, reste la configuration:

[global]
port = /dev/cuad1
model = 7110
initlength = default
connection = dlr3p
use_locking = yes
serial_baudrate = 19200
smsc_timeout = 10
Vous pouvez laisser le reste de la configuration par défaut.

Mail2SMS est un peu tricky a configurer et dépends pas mal de vos besoins. D'après mes tests, certains téléphones ont besoin de \r pour faire un retour à la ligne (car ils sont basés sur des OS aux fenêtres colorées ...) donc :)
##############################################################################
# First-line stuff in replies:
#
options: once body # a few options please
log: On-wrote junk
search: "^(On .* wrote:)"
replace:

##############################################################################
# Quoted lines:
#
options: body prio 2
search: ^ *>.*
log: quote-removal
replace:

##############################################################################
# Initial spaces
#
options: fullbody prio 2 subject
search: "^ +"
log: spaces in the beginning of lines
replace:

##############################################################################
# "re:" parts in subjects
#
options: subject nocase
search: .*(Re|Ang|Sv)(\[.*\]|): *
log: re/ang/sv-stuff in subject lines
replace:

##############################################################################
# Sequences of weird letters only one of them
#
options: fullbody prio 4
search: "([-\.=!+*#;:,~!&]){2,}"
log: multiple weirdo letters
replace: \1

##############################################################################
# Remove space between certain punctuation letters.
#
options: fullbody prio 4
log: non-alnum, space, non-alnum => remove space
search: "([-*!=.,]) ([-*!=.,])"
replace: \1\2

##############################################################################
# Remove space after non-word symbols
#
log: Remove spaces after symbols
options: prio 4
search: "(\W) +"
replace: \1

##############################################################################
# Cut off parentheses from From names.
#
options: from
log: cut off parantheses junk
search: \([^)]*\)
replace:

##############################################################################
# Cut off known domain names from email addresses
#
log: cut off @*.frontec.se domains
search: @(....|)frontec.se
replace: ""

##############################################################################
# URLs don't do any good in SMS messages:
#
options: nocase
log: remove http/ftp-URL
search: (http|ftp)://[a-z0-9.~/-]*
replace: (URL)

##############################################################################
# Output with two extra spaces:
#
output: "F:$from\rS:$subject\rB:$body"

Reste la magie
Créez un compte sms et n'oubliez pas d'inclure l'user dans le groupe gnokii.
Après n'oubliez pas de mettre votre .procmailrc comme celui la :

SHELL=/bin/sh
LOGFILE = $HOME/procmail.log
LOGABSTRACT="all"
VERBOSE="on"

ARG=$1

:0 fw: gnokii.lock
* ARG ?? magicnumber
{
        :0
        * ARG ?? ()\/..........$
        {
                phone = $MATCH

                :0 fW: sendsms.lock
                | /usr/local/bin/mail2sms -o | /usr/local/bin/gnokii --sendsms $phone --long 161
        }
}
Et pour envoyer un sms, vous pouvez donc prendre la syntaxe magique suivante qui vous permet de sélectionner un numéro de tél lors de l'envoi de mail sans pour autant avoir a reconfigurer quoi que ce soit sur le serveur de SMS :
sms+magicnumber.0123456789@nomdehost.com
C'est magique ! :) Amusez vous bien !

Merci Apple, la FNAC et MSS

Le 02 Octobre dernier mon Powerbook a eu l'idée de tomber en panne...
Ca arrive de temps en temps c'est vrai.... Et le fait d'avoir eu une extension de garantie est quelque chose qui vaux le coup... Vu le prix des powerbook, au bout de trois ans qu'il tombe en rade ça énerve... quand on a pas de garantie... Bref....
Hélàs,.... je l'ai acheté d'okaz et avec la garantie Fnac qui se trouve être une véritable merde... (si la FNAC me lit... tans mieux).
Le contrat parle de délais d'enlèvement du matériel, mais il n'y a aucune garantie écrite sur le temps passé a réparer le matériel.... Bref... Si tu as la garantie FNAC, pries que tu aies un ordi en backup sinon tu peux crever le temps de la réparation.

Conclusion : ne JAMAIS prendre la garantie FNAC....

Alors pourquoi merci Apple ?
Simple...
Mes certificats SSL sont sur un flash card pcmcia... formatée Apple... et certains certificats sont arrivés a expiration.

Mail.app qui est une application assez cool vis à vis du mail sur Mac OS X, dans sa mouture version 2.0 ne supporte pas que les certificats expirent... et empêchent l'accès aux serveurs pop3 / imap / smtp over SSL lorsque le certificat a expiré...
Donc les trois FNAC, Apple et MSS (la société de service et de maintenance Fnac) commencent a me tapper sur le système....


Et un conseil, si vous avez un mac... JAMAIS prendre la garantie FNAC... prenez l'Apple Care.... !

iSCSI sur Debian Sarge

Le problème de iSCSI c'est que aucune distribution OpenSource le supporte encore (on se demande pourquoi ?).
La Debian Sarge encore moins et il n'existe aucun packets pour pouvoir mettre en place un Initiator iSCSI (=client iSCSI).
Alors j'ai bossé une journée dessus afin d'avancer un peu.
Il vous faut :

  1. Une debian Sarge installée
  2. Les packets de developpement kernel :
    apt-get install make-kpkg
  3. Les sources du kernel >= a 2.6.10(attention Debian Sarge n'a que la version 2.6.8, quelqu'un a une explication ?)
  4. Le packet linux-iscsi qui se trouve sur : http://linux-iscsi.sourceforge.net/.
    J'ai utilisé la version 2.6 developpement car la 4.0.2 ne se compile pas avec la version 2.6.12.3 du kernel. Donc prendre la version 5.0.0.xx
  5. Du temps... :p

Un fois que vous avez tout ça on peux faire l'installation :p

1- Compiler le kernel et faire un packet debian

    Détarrer le kernel :
    # cd /usr/src
    # bzip2 -dc linux-2.6.12.3.tar.bz2 | tar xvf -
    
    Ajouter la conf par défaut de linux :
    # cd /usr/src/linux-2.6.12.3
    # cp /boot/config.versionpacketdebian .config
    
    Configurer le kernel :
    # cd /usr/src/linux-2.6.12.3
    # make menuconfig
    
    Virez tous les modules dont vous n'avez pas besoin car ca va faire gagner du temps lors de la compilation.
    Un fois que vous avez configuré votre kernel, le compiler. Içi j'utilise l'initrd :
    # cd /usr/src/linux-2.6.12.3
    # make-kpkg --initrd --revision=2.6.12.3_100 kernel_image
    
    Attendez que ca compile (long sur un PIII 1Ghz...) avec quelque cafés et autre junk food... :p
    Installez le nouveau kernel et rebooter :
    # cd /usr/src
    # dpkg -i kernel_image-2.6.12.3*.deb
    
    Si vous avez correctement rebooté sur le nouveau kernel c'est que vous avez réussi l'étape la plus longue :p
    Reste la partie configuration iSCSI :p

2- Compiler et installer l'Initiator iSCSI sur la debian
    WARNING: Comme j'ai utilisé le packet Expérimental, il est fort possible que certains points changent ...

    Récuperez le package 2.6 Kernel Expérimental sur http://sourceforge.net/projects/linux-iscsi et préparez les points suivants :
    # cd /usr/src
    # ln -s linux-2.6.12.3 linux
    # cd /lib/modules/2.6.13.3.*/
    # ln -s /usr/src/linux-2.6.12.3 build
    
    Normalement le dernier lien devrait exister si la machine où vous compilez linix-iscsi est la même que celle où vous avez compilé votre kernel.
    Détarrez le package linux-iscsi-5.0.0 et allez dans le répertoire en tant que root, et lancez la compilation :
    # cd /usr/src/linux-iscsi-5.0.0.3rc6363
    # make
    
    Si aucune erreur s'est produite, alors vous avez 2 modules dans ./kernel et iscsid, iscdiadm dans ./usr.
    Vous pouvez les installer sur votre système (adaptez les paths a votre système) :
    # cp kernel/*.ko /lib/modules/2.6.12.3/kernel/drivers/block/scsi/
    # depmod -a
    
    Si tout est installé comme il faut, un :
    # modprobe iscsi_tcp
    
    Devrait charger correctement les modules, la commande suivante vous permet de vérifier que les deux modules sont bien chargé dans le noyeau:
    # lsmod | grep iscsi
    
    iscsi_tcp devrait apparaitre ainsi que l'autre (dont j'ai oublié le nom).
    Vous pouvez éventuellement l'ajouter aux modules que le système doit charger au démarrage :
    # echo iscsi_tcp >> /etc/modules
    
    Maintenant vous pouvez installer l'user land :
    # cp usr/iscsid /usr/local/sbin/iscsid
    # cp usr/iscsiadm /usr/local/sbin/iscsid
    
    Configurer le initiatorname :
    # echo "InitiatorName=iqn.1987-05.com.cisco:"`hostname` > /etc/initiatorname.iscsi
    

3- Configurer l'iSCSI selon la doc :p

Have fun !

iSCSI sur FreeBSD !!!

Je l'ai rêvé, je l'ai trouvé !
iSCSI sur FreeBSD. :

da0 at iscsi0 bus 0 target 0 lun 0
da0:  Fixed Direct Access SCSI-4 device
da0: 5120MB (10485760 512 byte sectors: 255H 63S/T 652C)


kiwi@freebsd:~$ df -kh
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ad0s1a    989M     59M    851M     6%    /
devfs          1.0K    1.0K      0B   100%    /dev
/dev/ad0s1f     55G     18M     50G     0%    /home
/dev/ad0s1e    9.7G    1.9G    7.0G    21%    /usr
/dev/ad0s1d    4.8G     45M    4.4G     1%    /var
/dev/da0s1d    4.8G    219M    4.2G     5%    /mnt
kiwi@freebsd:~$ uname -a
FreeBSD freebsd.home.oav.net 5.4-RELEASE-p4 FreeBSD 5.4-RELEASE-p4 #0: Mon Jul 18 08:37:12 CEST 2005     root@freebsd.home.oav.net:/usr/obj/usr/src/sys/GENERIC  i386

filer> sysstat -i 5
CPU    NFS   CIFS  iSCSI      Net kB/s     Disk kB/s     iSCSI  kB/s    Cache
                               in   out     read  write      in   out      age
77%      0      0    211    1835    87      137   3955    1711     0     >60
80%      0      0    144    2075    80      166   4937    1953     0     >60
79%      0      0    157    1801    84      149   3855    1689     7     >60
77%      0      0    110    1303    60      179   3126    1221     3     >60

Bon... :-) Je crois qu'on va enfin avoir une alternative a l'utilisation de cartes FCAL relou sur FreeBSD :) /Xavier

Developpeurs de toute la planète? Vous attendez quoi ?

A force de chercher des choses sur le net pour faire avancer mon association 1901, je remarque que même si on arrive de plus en plus a avoir des logiciels qui arrivent a se causer ensemble, on a encore du mal a les faire causer de façon intelligente... Bref y'en a marre, il faut que ça change... !

Lire la suite...