<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.moustik.orgfeed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>moustik.org</title>
  <link>http://www.moustik.org</link>
  <description>Admin sys linux en mode junior</description>
  <language>fr</language>
  <pubDate>Tue, 04 Nov 2008 23:55:18 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Soekris net5501-70 &amp; OpenBSD-4.2</title>
    <link>http://www.moustik.org/2008/03/26/Soekris-net5501-70-OpenBSD-42</link>
    <guid isPermaLink="false">urn:md5:732595c24ad113fd845aab86768b2e3a</guid>
    <pubDate>Wed, 26 Mar 2008 23:06:00 +0100</pubDate>
    <dc:creator>Ludo</dc:creator>
        <category>OpenBSD</category>
        <category>OpenBSD</category>    
    <description>&lt;p&gt;Enfin!!! sans mentir ça fait (trop) longtemps que je voulais un boitier (silencieux et compact) pour ma passerelle et la voilà enfin :) elle n'attend que son OpenBSD. Alors on y va pour une installation en bonne et dûe forme.&lt;/p&gt;    &lt;p&gt;Pour commencer un petit topo sur ce que j'ai comandé au cas où vous seriez intéréssé par ce genre de petites box commandée sur &lt;a href=&quot;https://www.kd85.com/&quot; title=&quot;kd85.com&quot;&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;net5501-70 avec son slot case [10550170]&amp;nbsp;: 251,00 €&lt;/li&gt;
&lt;li&gt;Kit disque dur 2&quot;1/2 pata [14550110]&amp;nbsp;: 9,00 €&lt;/li&gt;
&lt;li&gt;Alimentation 12v, 1.5v cable eu [31201212]&amp;nbsp;: 15,00 €&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;/pre&gt;

&lt;p&gt;J'avais déjà un disque dur 2&quot;1/2 ainsi que cable DB9 null modem.&lt;/p&gt;


&lt;p&gt;Au niveau du prix, cela reste relativement cher même si le silence et la compacité ont un coût certain. Comptez 15,00 € pour le transport et 61,00 € pour les taxes :/ Faites vos comptes... ~ 350 €&lt;/p&gt;


&lt;p&gt;Au niveau livraison, c'est du ultra rapide, commandé le dimanche soir, reçu le mardi midi :)
L'emballage est... avec des puffy dessus, puis au niveau documentation c'est un peu moins ça, pour le moment il n'y a pas de manuel pour la net5501-70, donc on a le manuel de la série net4801 et quelques pages sur les specs de la net5501-70.
On y retrouve également des stickers puffy que je me suis empressé de coller sur la porte de ma concierge :)&lt;/p&gt;


&lt;h3&gt;Prérequis&lt;/h3&gt;


&lt;p&gt;La situation chez moi est la suivante&amp;nbsp;: Seule ma future ex-passerelle possède un port série et seule ma linuxbox possède une interface réseau de libre pour le PXE. Donc on va tout faire depuis l'ancienne passerelle pour l'installation et le boot PXE se fera depuis Linux.&lt;/p&gt;


&lt;h3&gt;Mise en place de tftp sous Linux&lt;/h3&gt;


&lt;p&gt;En l'occurence une gentoo mais après tout on s'en fout ...&lt;/p&gt;


&lt;p&gt;On va commencer par s'installer un server tftp&amp;nbsp;:
Je tiens à préciser quand même que je n'ai pas réussi à faire fonctionner &lt;strong&gt;atftp&lt;/strong&gt; suite à des segfault dans tous les sens dès qu'il devait livrer le &lt;strong&gt;bsd.rd&lt;/strong&gt;, j'ai tenté une réinstallation et quelques modifications de conf mais sans succès! Je laisse quand même la procédure mais le reste de l'opération se fera avec &lt;strong&gt;tftp-hpa&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
# emerge -av atftp
[ebuild  N    ] net-ftp/atftp-0.7-r1  USE=&amp;quot;pcre readline tcpd (-selinux)&amp;quot; 223 kB 
Total: 1 package (1 new), Size of downloads: 223 kB
Would you like to merge these packages? [Yes/No]
&lt;/pre&gt;

&lt;p&gt;On créé notre répertoire où on va stocker les fichiers à délivrer via tftp&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# mkdir /tftproot; chmod 777 /tftproot
&lt;/pre&gt;

&lt;p&gt;On le configure, la configuration par défaut va nous suffir&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# vi /etc/conf.d/atftp
&lt;/pre&gt;
&lt;pre&gt;
# Config file for tftp server
TFTPD_ROOT=&amp;quot;/tftproot&amp;quot;
TFTPD_OPTS=&amp;quot;--daemon --user nobody --group nobody&amp;quot;
&lt;/pre&gt;

&lt;p&gt;On le démarre&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# /etc/init.d/atftp start
&lt;/pre&gt;

&lt;p&gt;On vérifie si ca tourne&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# netstat -nptlu|grep tftp
udp        0      0 0.0.0.0:69              0.0.0.0:*                           27485/in.tftpd
&lt;/pre&gt;

&lt;p&gt;Bon et maintenant avec &lt;strong&gt;tftp-hpa&lt;/strong&gt; avec lequel je n'ai eu aucun problème&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# emerge tftp-hpa
&lt;/pre&gt;

&lt;p&gt;Pour la configuration&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# vi /etc/conf.d/in.tftpd
&lt;/pre&gt;
&lt;pre&gt;
INTFTPD_PATH=&amp;quot;/tftproot/&amp;quot;
INTFTPD_OPTS=&amp;quot;-R 4096:32767 -s ${INTFTPD_PATH}&amp;quot;
&lt;/pre&gt;
&lt;pre&gt;
# /etc/init.d/in.tftpd start
&lt;/pre&gt;

&lt;h3&gt;Mise en place d'un serveur dhcp&lt;/h3&gt;

&lt;p&gt;On installe&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# emerge dhcp
&lt;/pre&gt;

&lt;p&gt;On le configure&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# vi /etc/dhcp/dhcpd.conf
&lt;/pre&gt;
&lt;pre&gt;
log-facility local7;
allow booting;
allow bootp;
ddns-update-style none;
subnet 172.12.12.0 netmask 255.255.255.0 {
        range 172.12.12.10 172.12.12.12;
        filename &amp;quot;pxeboot&amp;quot;;
        default-lease-time 600;
        max-lease-time 7200;
        next-server 172.12.12.2;
}
&lt;/pre&gt;

&lt;p&gt;Attention à ne pas oublier la dernière ligne ( &lt;strong&gt;next-server 172.12.12.2;&lt;/strong&gt; ) qui est l'IP de votre serveur dhcp, sans ce paramètre vous obtiendrez une erreur 60 des plus obscure.&lt;/p&gt;


&lt;p&gt;Bon là on relance dhcpd et on peut déjà voir si la soekris en bootant trouve le serveur&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# tail -f /var/log/messages
Mar 26 01:10:30 tuxic dhcpd: DHCPDISCOVER from 00:00:24:c9:59:2c via eth1
Mar 26 01:10:31 tuxic dhcpd: DHCPOFFER on 172.12.12.10 to 00:00:24:c9:59:2c via eth1
Mar 26 01:10:31 tuxic dhcpd: DHCPREQUEST for 172.12.12.10 (172.12.12.2) from 00:00:24:c9:59:2c via eth1
Mar 26 01:10:31 tuxic dhcpd: DHCPACK on 172.12.12.10 to 00:00:24:c9:59:2c via eth1
&lt;/pre&gt;

&lt;p&gt;Bon c'est déjà ca de fait, reste maintenant à offrir un bootloader&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# cd /tftproot
# wget ftp://ftp3.usa.openbsd.org/pub/OpenBSD/4.2/i386/pxeboot
# wget  ftp://ftp3.usa.openbsd.org/pub/OpenBSD/4.2/i386/bsd.rd
&lt;/pre&gt;

&lt;p&gt;On créé le fichier boot.conf pour passer des paramètres au boot&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# mkdir etc; vi etc/boot.conf
&lt;/pre&gt;
&lt;pre&gt;
set tty com0
stty com0 19200
boot bsd.rd
&lt;/pre&gt;

&lt;h3&gt;Côté Soekris&lt;/h3&gt;

&lt;p&gt;Bon, on va s'occuper maitenant de la soekris à proprement parler. Donc depuis la box OpenBSD, branchement série effectué entre la soekris et l'OpenBSD box (après plusieurs essais infructueux suite à la non activation du port série dans le bios de la tour et des conflits d'IRQ réglés à l'arrache suite à l'activation du port série), j'arrive enfin à me connecter à la soekris :)&lt;/p&gt;
&lt;pre&gt;
# cu -l tty00 -s 19200
&lt;/pre&gt;

&lt;p&gt;On doit arriver à quelque chose comme ca&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
comBIOS ver. 1.32i 20071005  Copyright (C) 2000-2007 Soekris Engi
net5501
0512 Mbyte Memory                        CPU Geode LX 500 Mhz 
Pri Mas  ST940815A                       LBA Xlt 1024-255-63  390
Slot   Vend Dev  ClassRev Cmd  Stat CL LT HT  Base1    Base2   In
-----------------------------------------------------------------
0:01:2 1022 2082 10100000 0006 0220 08 00 00 A0000000 00000000 10
0:06:0 1106 3053 02000096 0117 0210 08 40 00 0000E101 A0004000 11
0:07:0 1106 3053 02000096 0117 0210 08 40 00 0000E201 A0004100 05
0:08:0 1106 3053 02000096 0117 0210 08 40 00 0000E301 A0004200 09
0:09:0 1106 3053 02000096 0117 0210 08 40 00 0000E401 A0004300 12
0:20:0 1022 2090 06010003 0009 02A0 08 40 80 00006001 00006101 
0:20:2 1022 209A 01018001 0005 02A0 08 00 00 00000000 00000000 
0:21:0 1022 2094 0C031002 0006 0230 08 00 80 A0005000 00000000 15
0:21:1 1022 2095 0C032002 0006 0230 08 00 00 A0006000 00000000 15

 1 Seconds to automatic boot.   Press Ctrl-P for entering Monitor
Using drive 0, partition 3.
Loading...
probing: pc0 com0 com1 pci mem[639K 511M a20=on] 
disk: hd0+
... 
&lt;/pre&gt;

&lt;p&gt;A ce niveau là, la soekris accroche une ip et commence à télécharger les fichiers et l'installation peut commencer :)&lt;/p&gt;


&lt;h3&gt;Installation d'OpenBSD&lt;/h3&gt;

&lt;p&gt;J'avais déjà fait un post sur le sujet, je vais le refaire en version plus complète.&lt;/p&gt;
&lt;pre&gt;
erase ^?, werase ^W, kill ^U, intr ^C, status ^T
(I)nstall, (U)pgrade or (S)hell? I
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Choisir le keymap :&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
Welcome to the OpenBSD/i386 4.2 install program.

This program will help you install OpenBSD. At any prompt except password
prompts you can escape to a shell by typing '!'. Default answers are shown
in []'s and are selected by pressing RETURN.  At any time you can exit this
program by pressing Control-C, but exiting during an install can leave your
system in an inconsistent state.

Terminal type? [vt220]
kbd(8) mapping? ('L' for list) [none] L
Major tables: be br cf de dk es fr hu it jp la lt lv nl no pl pt ru sf sg si sv tr ua uk us
kbd(8) mapping? ('L' for list) [none] fr
kbd: keyboard mapping set to fr
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;On confirme notre installation !!&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
IS YOUR DATA BACKED UP? As with anything that modifies disk contents, this
program can cause SIGNIFICANT data loss.

It is often helpful to have the installation notes handy. For complex disk
configurations, relevant disk hardware manuals and a calculator are useful.

Proceed with install? [no] yes
Cool! Let's get to it.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;On commence par le partitionnement du disque :&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
You will now initialize the disk(s) that OpenBSD will use. To enable all
available security features you should configure the disk(s) to allow the
creation of separate filesystems for /, /tmp, /var, /usr, and /home.

Available disks are: wd0.
Which one is the root disk? (or 'done') [wd0]

Do you want to use *all* of wd0 for OpenBSD? [no] yes
Putting all of wd0 into an active OpenBSD MBR partition (type 'A6')...done.

You will now create an OpenBSD disklabel inside the OpenBSD MBR
partition. The disklabel defines how OpenBSD splits up the MBR partition
into OpenBSD partitions in which filesystems and swap space are created.

The offsets used in the disklabel are ABSOLUTE, i.e. relative to the
start of the disk, NOT the start of the OpenBSD MBR partition.

# Inside MBR partition 3: type A6 start 63 size 78140097
Treating sectors 63-78140160 as the OpenBSD portion of the disk.
You can use the 'b' command to change this.

Initial label editor (enter '?' for help at any prompt)
&amp;gt; a
partition: [a]
offset: [63]
size: [78140097] 1024M
Rounding to cylinder: 2104452
FS type: [4.2BSD]
mount point: [none] /
&amp;gt; a
partition: [b]
offset: [2104515]
size: [76035645] 512m^H
Invalid entry
size: [76035645] 512M
Rounding to cylinder: 1060290
FS type: [swap]
&amp;gt; a
partition: [d]
offset: [3164805]
size: [74975355] 512M
Rounding to cylinder: 1060290
FS type: [4.2BSD]
mount point: [none] /tmp
&amp;gt; a
partition: [e]
offset: [4225095]
size: [73915065] 4096M
Rounding to cylinder: 8401995
FS type: [4.2BSD]
mount point: [none] /var
&amp;gt; a
partition: [f]
offset: [12627090]
size: [65513070] 8192M
Rounding to cylinder: 16787925
FS type: [4.2BSD]
mount point: [none] /usr
&amp;gt; a
partition: [g]
offset: [29415015]
size: [48725145]
FS type: [4.2BSD]
mount point: [none] /home
&amp;gt; q
Write new label?: [y]
Mount point for wd0d (size=530145k)? (or 'none' or 'done') [/tmp] done
No more disks to initialize.

OpenBSD filesystems:
wd0a /
wd0d /tmp
wd0e /var
wd0f /usr
wd0g /home
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;On fixe notre configuration :&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
The next step *DESTROYS* all existing data on these partitions!
Are you really sure that you're ready to proceed? [no] yes
/dev/rwd0a: 1027.6MB in 2104452 sectors of 512 bytes
6 cylinder groups of 202.47MB, 12958 blocks, 25984 inodes each
newfs: reduced number of fragments per cylinder group from 66264 to 66000 to enlarge last cylinder group
/dev/rwd0d: 517.7MB in 1060288 sectors of 512 bytes
5 cylinder groups of 128.91MB, 8250 blocks, 16512 inodes each
/dev/rwd0e: 4102.5MB in 8401992 sectors of 512 bytes
21 cylinder groups of 202.47MB, 12958 blocks, 25984 inodes each
/dev/rwd0f: 8197.2MB in 16787924 sectors of 512 bytes
41 cylinder groups of 202.47MB, 12958 blocks, 25984 inodes each
/dev/rwd0g: 23791.6MB in 48725144 sectors of 512 bytes
118 cylinder groups of 202.47MB, 12958 blocks, 25984 inodes each
/dev/wd0a on /mnt type ffs (rw, asynchronous, local, ctime=Tue Aug 28 17:07:36 2007)
/dev/wd0g on /mnt/home type ffs (rw, asynchronous, local, nodev, nosuid, ctime=Tue Aug 28 17:07:37 2007)
/dev/wd0d on /mnt/tmp type ffs (rw, asynchronous, local, nodev, nosuid, ctime=Tue Aug 28 17:07:37 2007)
/dev/wd0f on /mnt/usr type ffs (rw, asynchronous, local, nodev, ctime=Tue Aug 28 17:07:37 2007)
/dev/wd0e on /mnt/var type ffs (rw, asynchronous, local, nodev, nosuid, ctime=Tue Aug 28 17:07:37 2007)
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;On donne un nom :&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
System hostname? (short form, e.g. 'foo') tuxic
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;On configure maintenant le réseau&lt;/strong&gt;
Dans mon cas, je suis derrière une freebox en mode bridge, c'est donc la soekris qui recevra l'ip publique. Je créé 3 sous réseaux (LAN, DMZ1, DMZ2).&lt;/p&gt;
&lt;pre&gt;
Configure the network? [yes]
Available interfaces are: vr0 vr1 vr2 vr3.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;interface vr0&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
Which one do you wish to initialize? (or 'done') [vr0]
Symbolic (host) name for vr0? [tuxic]
The media options for vr0 are currently
        media: Ethernet autoselect (100baseTX full-duplex)
Do you want to change the media options? [no]
IPv4 address for vr0? (or 'none' or 'dhcp') dhcp
Issuing hostname-associated DHCP request for vr0.
DHCPDISCOVER on vr0 to 255.255.255.255 port 67 interval 1
DHCPOFFER from 172.12.12.2
DHCPREQUEST on vr0 to 255.255.255.255 port 67
DHCPACK from 172.12.12.2
bound to 172.12.12.10 -- renewal in 300 seconds.
IPv6 address for vr0? (or 'rtsol' or 'none') [none] rtsol
Available interfaces are: vr1 vr2 vr3.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;interface vr1&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
Which one do you wish to initialize? (or 'done') [vr1]
Symbolic (host) name for vr1? [tuxic] LAN
The media options for vr1 are currently
        media: Ethernet autoselect (none)
Do you want to change the media options? [no]
IPv4 address for vr1? (or 'none' or 'dhcp') 10.0.0.1
Netmask? [255.255.255.0]
IPv6 address for vr1? (or 'rtsol' or 'none') [none]
Available interfaces are: vr2 vr3.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;interface vr2&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
Which one do you wish to initialize? (or 'done') [vr2]
Symbolic (host) name for vr2? [tuxic] DMZ1
The media options for vr2 are currently
        media: Ethernet autoselect (none)
Do you want to change the media options? [no]
IPv4 address for vr2? (or 'none' or 'dhcp') 172.12.12.1
Netmask? [255.255.255.0]
IPv6 address for vr2? (or 'rtsol' or 'none') [none]
Available interfaces are: vr3.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;interface vr3&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
Which one do you wish to initialize? (or 'done') [vr3]
Symbolic (host) name for vr3? [tuxic] DMZ2
The media options for vr3 are currently
        media: Ethernet autoselect (none)
Do you want to change the media options? [no]
IPv4 address for vr3? (or 'none' or 'dhcp') none
IPv6 address for vr3? (or 'rtsol' or 'none') [none]
Available interfaces are: vr3.
Which one do you wish to initialize? (or 'done') [vr3] done
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;On va passer à l'installation du système à proprement parler.&lt;/strong&gt;
Dans ma configuration je suis connecté au net via eth0 et eth1 sert de PXE à la soekris. Pour offrir le réseau j'ai utilisé un proxy http (tinyproxy en l'occurence) pour que la soekris puisse accéder au net.&lt;/p&gt;
&lt;pre&gt;
Location of sets? (disk ftp http or 'done') [disk] http
HTTP/FTP proxy URL? (e.g. 'http://proxy:8080', or 'none') [none] http://172.12.12.2:8888
Display the list of known http servers? [no] no
Server? (IP address, hostname or 'done') [spargel.kd85.com/pub] spargel.kd85.com/ftp
Server directory? [pub/OpenBSD/4.2/i386]

Select sets by entering a set name, a file name pattern or 'all'. De-select
sets by prepending a '-' to the set name, file name pattern or 'all'. Selected
sets are labelled '[X]'.

      [X] bsd
      [X] bsd.rd
      [ ] bsd.mp
      [X] base42.tgz
      [X] etc42.tgz
      [X] misc42.tgz
      [X] comp42.tgz
      [X] man42.tgz
      [X] game42.tgz
      [ ] xbase42.tgz
      [ ] xetc42.tgz
      [ ] xshare42.tgz
      [ ] xfont42.tgz
      [ ] xserv42.tgz
Set name? (or 'done') [bsd] done
Location of sets? (disk ftp http or 'done') [disk] done
&lt;/pre&gt;

&lt;p&gt;A vous de sélectionner les sets qui vous conviennent. Par exemple pour supprimer le set game42.tgz, taper&amp;nbsp;: -game42.tgz&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;ssh/ntp/etc.&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
Start sshd(8) by default? [yes]
NTP server? (or 'none' or 'default') [none]
Do you expect to run the X Window System? [no]
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Définir la console par défaut&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
Change the default console to com0? [no] yes
Saving configuration files...done.
Generating initial host.random file...done.
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Définir le timezone&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;
What timezone are you in? ('?' for list) [Canada/Mountain] Europe/Paris
Setting local timezone to 'Europe/Paris'...done.
Making all device nodes...done.
Installing boot block...
boot: /mnt/boot
proto: /usr/mdec/biosboot
device: /dev/rwd0c
/usr/mdec/biosboot: entry point 0
proto bootblock size 512
/mnt/boot is 3 blocks x 16384 bytes
fs block shift 2; part offset 63; inode block 104, offset 11816
using MBR partition 3: type 166 (0xa6) offset 63 (0x3f)
done.

CONGRATULATIONS! Your OpenBSD install has been successfully completed!
To boot the new system, enter halt at the command prompt. Once the
system has halted, reset the machine and boot from the disk.
&lt;/pre&gt;

&lt;p&gt;Voilà c'est terminé pour l'installation.&lt;/p&gt;


&lt;p&gt;Quelques petits détails supplémentaires si vous rencontrez des problèmes au boot.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Si vous avez répondu no à la question Change the default console to com0? votre soekris ne pas booter, car la console par défaut ne sera pas bonne (je ne maitrise pas du tout ce point laors je ne peux vraiment expliquer clairement le pourquoi du comment), cela dit lors de mon installation j'avais répondu no et empéchait le système de booter. Dans ce cas lors du prompt de la soekris taper&amp;nbsp;:&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
boot&amp;gt; set tty com0
&lt;/pre&gt;


&lt;p&gt;Et là votre système va booter correctement et pour fixer de manière définitive ce paramètre&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# vi /etc/boot.conf
&lt;/pre&gt;
&lt;pre&gt;
set tty com0
stty com0 57600
&lt;/pre&gt;

&lt;p&gt;Voilà pour un tour d'horizon de cette installation. Tout reste à faire, pf/nat et autres configurations :)&lt;/p&gt;


&lt;p&gt;Pour finir, l'extinction définitive de mon ancienne passerelle fut un grand moment, je ne soupsonnais même plus que le niveau sonore était a ce point élevé :D&lt;/p&gt;</description>
    
    
    
          <comments>http://www.moustik.org/2008/03/26/Soekris-net5501-70-OpenBSD-42#comment-form</comments>
      <wfw:comment>http://www.moustik.org/2008/03/26/Soekris-net5501-70-OpenBSD-42#comment-form</wfw:comment>
      <wfw:commentRss>http://www.moustik.org/feed/rss2/comments/21</wfw:commentRss>
      </item>
    
  <item>
    <title>Postfix-2.4.5 &amp; dovecot-1.0.4 &amp; MySQL-5.0.45</title>
    <link>http://www.moustik.org/2008/03/21/Postfix-245-dovecot-104-MySQL-545</link>
    <guid isPermaLink="false">urn:md5:a84addc560697a6fcf075dae0aab3bb9</guid>
    <pubDate>Fri, 21 Mar 2008 23:51:00 +0100</pubDate>
    <dc:creator>Ludo</dc:creator>
        <category>Linux</category>
        <category>dovecot</category><category>postfix</category>    
    <description>&lt;p&gt;Un post sur l'installation d'un serveur mail basée sous postfix (smtp), dovecot (pop/imap) le tout sur une base MySQL et PostfixAdmin (interface web)&lt;/p&gt;    &lt;p&gt;Bon, comme vous avez pu le remarquer, il existe une pléthore de documentations pour installer un serveur mail, en voilà une de plus :) basée sur des infos glanées à droite, à gauche...&lt;/p&gt;


&lt;p&gt;Une chose dans le duo postfix/dovecot est que postfix
supporte le SASL au travers de dovecot, donc ca simplifie les choses, plus
besoin de gérer l'authentification via SASL de manière indépendante.&lt;/p&gt;


&lt;h2&gt;&lt;strong&gt;1/ Installation des prérequis&lt;/strong&gt;&lt;/h2&gt;


&lt;p&gt;Comme d'hab, j'annote pas les dépendances :)&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Installation de openssl-0.9.8e&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# cd ~/work/
# wget http://www.openssl.org/source/openssl-0.9.8e.tar.gz
# tar xvzf openssl-0.9.8e.tar.gz
# ./config --prefix=/applis/openssl-0.9.8e shared
# make &amp;amp;&amp;amp; make install
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Installation de httpd-2.2.6&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# cd ~/work/
# wget http://apache.crihan.fr/dist/httpd/httpd-2.2.6.tar.gz
# tar xvzf httpd-2.2.6.tar.gz
# cd httpd-2.2.6/
./configure --prefix=/applis/apache-2.2.6 \
--enable-modules=all \
--enable-mods-shared=all
# make &amp;amp;&amp;amp; make install
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Installation de MySQL-5.0.45&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# cd ~/work/
# wget http://dev.mysql.com/get/Downloads/MySQL-5.0/mysql-5.0.45.tar.gz/from/ftp://ftp.inria.fr/pub/MySQL/
# tar xvzf mysql-5.0.45.tar.gz
# cd mysql-5.0.45
./configure --prefix=/applis/mysql-5.0.45 \
--localstatedir=/var/db/mysql \
--with-unix-socket-path=/var/tmp/mysql.sock
# make &amp;amp;&amp;amp; make install
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Installation de dovecot 1.0.4&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# cd ~/work/
# wget http://www.dovecot.org/releases/1.0/dovecot-1.0.4.tar.gz
# tar xvzf dovecot-1.0.4.tar.gz
# cd dovecot-1.0.4
&lt;/pre&gt;



&lt;p&gt;Nous devons indiquer au makefile explicitement où trouver les librairies et
header d'openssl. Normalement, vous devez renseigner votre fichier
/etc/ld.so.conf pour lui indiquer les lib de vos applis installées et le
makefile doit se renseigner correctement.&lt;/p&gt;

&lt;pre&gt;
LDFLAGS='-L/applis/openssl-0.9.8e/lib -L/applis/mysql-5.0.45/lib/mysql' \
CPPFLAGS='-I/applis/openssl-0.9.8e/include -I/applis/mysql-5.0.45/include/mysql' \
./configure --prefix=/applis/dovecot-1.0.4 \
--disable-ipv6 \
--without-pam \
--without-ldap \
--without-sqlite \
--with-sql \
--with-mysql \
--with-gssapi \
--with-ssl=openssl
# make &amp;amp;&amp;amp; make install
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Installation de pcre-7.3&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# cd ~/work/
# wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-7.3.tar.bz2
# tar xvjf pcre-7.3.tar.bz2
# cd pcre-7.3
./configure --prefix=/applis/pcre-7.3 \
--enable-unicode-properties
# make &amp;amp;&amp;amp; make install
&lt;/pre&gt;


&lt;h2&gt;&lt;strong&gt;2/ Installation de Postfix&lt;/strong&gt;&lt;/h2&gt;


&lt;p&gt;Pour installer postfix, nous avons besoin de berkeleydb, nous utiliserons la version du sytème (4.4):&lt;/p&gt;

&lt;pre&gt;
# apt-get install libgd-4.4 libgd-4.4-dev
&lt;/pre&gt;


&lt;p&gt;Ensuite mettez à jour votre système pour trouver les bonnes lib das applis que nous venons d'installer&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# vi /etc/ld.so.conf
&lt;/pre&gt;

&lt;pre&gt;
/applis/dovecot-1.0.4/lib/dovecot
/applis/pcre-7.3/lib
/applis/mysql-5.0.45/lib/mysql
/applis/openssl-0.9.8e/lib
&lt;/pre&gt;


&lt;p&gt;Mettre à jour le système&lt;/p&gt;

&lt;pre&gt;
# ldconfig
&lt;/pre&gt;


&lt;p&gt;Vous pouvez vérifier de visu&lt;/p&gt;

&lt;pre&gt;
# ldconfig -p
&lt;/pre&gt;


&lt;p&gt;On installe&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# cd ~/work/
# wget ftp://ftp.doc.cs.univ-paris8.fr/mirrors/ftp.porcupine.org/mirrors/postfix-release/official/postfix-2.4.5.tar.gz
# tar xvjf postfix-2.4.5.tar.gz
# cd postfix-2.4.5
&lt;/pre&gt;


&lt;p&gt;Pour la configuration de postfix, nous surchargeons le makefile de postfix en spécifiant à postfix où trouver nos librairies et header&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# make tidy
# make makefiles \
'CCARGS=-DDEF_CONFIG_DIR=\&amp;quot;/applis/postfix-2.4.5/etc\&amp;quot; \
-DHAS_MYSQL -I/applis/mysql-5.0.45/include/mysql \
-DHAS_PCRE -I/applis/pcre-7.3/include \
-DUSE_SSL -I/applis/openssl-0.9.8e/include \
-DUSE_SASL_AUTH -DDEF_SASL_SERVER=\&amp;quot;dovecot\&amp;quot;' \
'AUXLIBS=-L/applis/mysql-5.0.45/lib/mysql -lmysqlclient -lz -lm \
-L/applis/pcre-7.3/lib -lpcre \
-L/applis/openssl-0.9.8e/lib -lssl -lcrypto'
# make
&lt;/pre&gt;


&lt;p&gt;Au moment du make install, une série de question va être posée sur les emplacements souhaités des fichiers de conf et autres binaires&lt;/p&gt;

&lt;pre&gt;
# make install
# install_root: [/]
# tempdir: [/root/work/postfix-2.4.5]
# config_directory: [/applis/postfix-2.4.5/etc]
# daemon_directory: [/applis/postfix-2.4.5/libexec]
# command_directory: [/applis/postfix-2.4.5/sbin]
# queue_directory: [/var/postfix/spool]
# sendmail_path: [/applis/postfix-2.4.5/sbin/sendmail]
# newaliases_path: [/applis/postfix-2.4.5/bin/newaliases]
# mailq_path: [/applis/postfix-2.4.5/bin/mailq]
# mail_owner: [postfix]
# setgid_group: [postdrop]
# html_directory: [no]
# manpage_directory: [/applis/postfix-2.4.5/man]
# readme_directory: [no]
&lt;/pre&gt;


&lt;p&gt;Pour finaliser l'installation, il faut les utilisateurs/groupes de postfix&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# groupadd postdrop
# groupadd postfix
# useradd -c &amp;quot;Postfix user&amp;quot; -d /dev/null -s /bin/false -g postfix
&lt;/pre&gt;


&lt;p&gt;Pour avoir les pages de man&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# vi /etc/manpath.config
&lt;/pre&gt;

&lt;pre&gt;
MANDATORY_MANPATH     /applis/postfix-2.4.5/man
MANPATH_MAP     /applis/postfix-2.4.5/bin        /applis/postfix-2.4.5/man
MANPATH_MAP     /applis/postfix-2.4.5/sbin       /applis/postfix-2.4.5/man
&lt;/pre&gt;


&lt;p&gt;Ajouter dans le fichier /etc/profile ples lignes suivantes afin que les binaires soient dans le PATH&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# vi /etc/profile
&lt;/pre&gt;

&lt;pre&gt;
for a in /applis/*/bin /applis/*/sbin
do
PATH=$PATH:$a
done
&lt;/pre&gt;

&lt;pre&gt;
# source /etc/profile
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Script d'init&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
#!/bin/sh -e
# Start or stop Postfix
#
# LaMont Jones 
# based on sendmail's init.d script

PATH=/applis/postfix-2.4.5/bin:/applis/postfix-2.4.5/sbin:/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/applis/postfix-2.4.5/sbin/postfix
PIDFILE=/var/run/postfix.pid
NAME=Postfix

test -x $DAEMON -a -f /applis/postfix-2.4.5/etc/main.cf || exit 0

case &amp;quot;$1&amp;quot; in
start)
echo -n &amp;quot;Starting mail transport agent: Postfix&amp;quot;
# Make sure that the chroot environment is set up correctly.
oldumask=$(umask)
umask 022
cd $(postconf -h queue_directory)
FILES=&amp;quot;etc/localtime etc/services etc/resolv.conf etc/hosts 
    etc/nsswitch.conf usr/lib/zoneinfo/localtime&amp;quot;
for file in $FILES; do 
    [ -d ${file%/} ] || mkdir -p ${file%/}
    if [ -f /${file} ]; then cp /${file} ${file}; fi
    if [ -f  ${file} ]; then chmod a+rX ${file}; fi
done
rm -f lib/libnss_so
tar cf - /lib/libnss_so 2&amp;gt;/dev/null |tar xf -
umask $oldumask
/applis/postfix-2.4.5/sbin/postfix start 2&amp;gt;&amp;amp;1 |
	(grep -v 'starting the Postfix' 1&amp;gt;&amp;amp;2 || /bin/true)
echo &amp;quot;.&amp;quot;
;;
stop)
echo -n &amp;quot;Stopping mail transport agent: Postfix&amp;quot;
/applis/postfix-2.4.5/sbin/postfix stop 2&amp;gt;&amp;amp;1 |
	(grep -v 'stopping the Postfix' 1&amp;gt;&amp;amp;2 || /bin/true)
echo &amp;quot;.&amp;quot;
;;
restart)
$0 stop
$0 start
;;
force-reload|reload)
echo -n &amp;quot;Reloading Postfix configuration...&amp;quot;
/applis/postfix-2.4.5/sbin/postfix reload 2&amp;gt;&amp;amp;1 |
	(grep -v 'refreshing the Postfix' 1&amp;gt;&amp;amp;2 || /bin/true)
echo &amp;quot;done.&amp;quot;
;;
flush)
/applis/postfix-2.4.5/sbin/postfix flush
;;
check)
/applis/postfix-2.4.5/sbin/postfix check
;;
*)
echo &amp;quot;Usage: /etc/init.d/postfix {start|stop|restart|reload|flush|check|force-reload}&amp;quot;
exit 1
;;
esac
exit 0
&lt;/pre&gt;

&lt;pre&gt;
# chmod +x /etc./init.d/postfix
&lt;/pre&gt;


&lt;p&gt;Vérifiez votre fichier main.cf afin qu'il corresponde bien à vos attentes même si celui-ci est préconfiguré au moment du make install.
Pour finaliser cette première d'installation de postfix&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# postfix set-permissions
# postalias /etc/aliases
&lt;/pre&gt;

&lt;p&gt;et pour finir&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# /etc/init.d/postfix start
&lt;/pre&gt;

&lt;p&gt;Devrait donner lors d'un netstat&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# netstat -nptl|grep :25
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN     22476/master
&lt;/pre&gt;


&lt;p&gt;Nous allons faire un test pour vérifier que tout est en ordre&amp;nbsp;:
En local ou d'une machine distante&amp;nbsp;:
Ici d'une machine distante&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# telnet 10.0.0.14 25
Trying 10.0.0.14...
Connected to 10.0.0.14.
Escape character is '^]'.
220 mx1.moustik.org ESMTP Postfix
EHLO mx1.moustik.org
250-mx1.moustik.org
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM:&amp;lt;n.sarkozy@plop.gouv.fr&amp;gt;
250 2.1.0 Ok
RCPT TO:&amp;lt;c.bruni@plop.gouv.fr&amp;gt;
250 2.1.5 Ok
DATA
354 End data with &amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;.&amp;lt;CR&amp;gt;&amp;lt;LF&amp;gt;
plop!
.
250 2.0.0 Ok: queued as 4BF7331D0039
quit
221 2.0.0 Bye
Connection closed by foreign host.
&lt;/pre&gt;

&lt;p&gt;Les journaux côté du serveur&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
mx1 postfix/smtpd[20875]: warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
mx1 postfix/smtpd[20875]: connect from ns16104.ovh.net[3.21.80.67]
mx1 postfix/smtpd[20875]: 4BF7331D0039: client=ns16104.ovh.net[3.21.80.67]
mx1 postfix/cleanup[20971]: 4BF7331D0039: message-id=&amp;lt;20070908123125.4BF7331D0039@mx1.moustik.org&amp;gt;
mx1 postfix/qmgr[22478]: 4BF7331D0039: from=&amp;lt;n.sarkozy@plop.gouv.fr&amp;gt;, size=382, nrcpt=1 (queue active)
mx1 postfix/smtp[20972]: 4BF7331D0039: to=&amp;lt;c.bruni@plop.gouv.fr&amp;gt;, relay=gmail-smtp-in.l.google.com[66.249.93.114]:25,
delay=47, delays=46/0/0.1/1.1, dsn=2.0.0, status=sent (250 2.0.0 OK 1189254735 n34si2274258ugc)
mx1 postfix/qmgr[22478]: 4BF7331D0039: removed
mx1 postfix/smtpd[20875]: disconnect from ns16104.ovh.net[10.0.0.14]
&lt;/pre&gt;

&lt;p&gt;Attention, notre serveur dans l'état actuel est en openrelay ce qui signifie que tout le monde peut s'en servir pour envoyer des mails, ce qui fait que très vite celui-ci va être blacklisté, il ne faut PAS le laisser avec une configuration aussi permissive. Nous allons utiliser l'authentification via SASL pour authoriser ou pas notre serveur à relayer.&lt;/p&gt;


&lt;h2&gt;&lt;strong&gt;3/ Support du virtuel&lt;/strong&gt;&lt;/h2&gt;


&lt;p&gt;Le but de l'installation est de supporter plusieurs domaines. Nous allons donc configurer postfix pour le support virtuel.
Nous allons utiliser mysql pour stocker nos domaines et comptes virtuels.&lt;/p&gt;


&lt;p&gt;Nous créons d'abord le compte et le groupe vmail&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# groupadd vmail
# useradd -c &amp;quot;Vmail user&amp;quot; -d /dev/null -s /bin/false -g vmail
# groupmod -g 5000 vmail
# usermod -u 5000 -g 5000 vmail
&lt;/pre&gt;


&lt;p&gt;Nous devons modifier la configuration de postfix pour obtenir ce support, nous allons en profiter pour la remanier un peu&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# vi /applis/postfix-2.4.5/etc/main.cf
&lt;/pre&gt;

&lt;pre&gt;
# ==========================================================
# Declarations et restrictions sur le serveur smtp
# ==========================================================

myhostname = mx1.moustik.org
mydomain = moustik.org
myorigin = $mydomain
mydestination = $myhostname, localhost.$mydomain, localhost

# ==========================================================
# Definition des repertoires
# ==========================================================

queue_directory = /var/postfix/spool
command_directory = /applis/postfix-2.4.5/sbin
daemon_directory = /applis/postfix-2.4.5/libexec
sendmail_path = /applis/postfix-2.4.5/sbin/sendmail
newaliases_path = /applis/postfix-2.4.5/bin/newaliases
mailq_path = /applis/postfix-2.4.5/bin/mailq

# ==========================================================
# Definition des droits
# ==========================================================

mail_owner = postfix
setgid_group = postdrop

# ==========================================================
# Alias systeme
# ==========================================================

alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases

# ==========================================================
# Directives diverses (non indispensables)
# ==========================================================

smtpd_banner = $myhostname ESMTP $mail_name (Windows NT server)
biff = no
unknown_local_recipient_reject_code = 550
debug_peer_level = 2
html_directory = no
manpage_directory = /applis/postfix-2.4.5/man
sample_directory = /applis/postfix-2.4.5/etc
readme_directory = no

# ===========================================================
# Support pour le virtuel au travers de MySQL
# ===========================================================

virtual_alias_maps = mysql:/applis/postfix-2.4.5/etc/mysql_virtual_alias_maps.cf
virtual_mailbox_domains = mysql:/applis/postfix-2.4.5/etc/mysql_virtual_domains_maps.cf
virtual_mailbox_base = /var/vmail/spool/
virtual_mailbox_maps = mysql:/applis/postfix-2.4.5/etc/mysql_virtual_mailbox_maps.cf
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_minimum_uid = 5000

# ===========================================================
# Support pour les quotas de boite mail au travers de MySQL
# ===========================================================

virtual_create_maildirsize = yes
virtual_mailbox_extended = yes
virtual_mailbox_limit_maps = mysql:/applis/postfix-2.4.5/etc/mysql_virtual_mailbox_limit_maps.cf
virtual_mailbox_limit_override = yes
virtual_maildir_limit_message = Trop plein...
virtual_overquota_bounce = yes

# ===========================================================
# Directive pour déclarer un domaine comme MX secondaire ou pas
# ===========================================================

relay_domains = mysql:/applis/postfix-2.4.5/etc/mysql_relay_domains_maps.cf
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;les fichiers de configuration de postfix pour mysql&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# vi /applis/postfix-2.4.5/etc/mysql_relay_domains_maps.cf
&lt;/pre&gt;

&lt;pre&gt;
user = USER
password = PASSWD
hosts = 127.0.0.1
dbname = DB
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '1'
&lt;/pre&gt;

&lt;pre&gt;
# vi /applis/postfix-2.4.5/etc/mysql_virtual_alias_maps.cf
&lt;/pre&gt;

&lt;pre&gt;
user = USER
password = PASSWD
hosts = 127.0.0.1
dbname = DB
query = SELECT goto FROM alias WHERE address='%s' AND active = 1
&lt;/pre&gt;

&lt;pre&gt;
# vi /applis/postfix-2.4.5/etc/mysql_virtual_domains_maps.cf
&lt;/pre&gt;

&lt;pre&gt;
user = USER
password = PASSWD
hosts = 127.0.0.1
dbname = DB
#query = SELECT domain FROM domain WHERE domain='%s'
#optional query to use when relaying for backup MX
query = SELECT domain FROM domain WHERE domain='%s' and backupmx = '0' and active = '1'
&lt;/pre&gt;

&lt;pre&gt;
# vi /applis/postfix-2.4.5/etc/mysql_virtual_mailbox_limit_maps.cf
&lt;/pre&gt;

&lt;pre&gt;
user = USER
password = PASSWD
hosts = 127.0.0.1
dbname = DB
query = SELECT quota FROM mailbox WHERE username='%s'
&lt;/pre&gt;

&lt;pre&gt;
# vi /applis/postfix-2.4.5/etc/mysql_virtual_mailbox_maps.cf
&lt;/pre&gt;

&lt;pre&gt;
user = USER
password = PASSWD
hosts = 127.0.0.1
dbname = DB
query = SELECT maildir FROM mailbox WHERE username='%s' AND active = 1
&lt;/pre&gt;


&lt;h2&gt;&lt;strong&gt;4/ Création de la base de donnée&lt;/strong&gt;&lt;/h2&gt;

&lt;pre&gt;
# mysql
mysql&amp;gt; CREATE DATABASE postfix;
mysql&amp;gt; GRANT ALL PRIVILEGES ON postfix.* TO postfixadmin@'localhost' identified by 'xxx';
mysql&amp;gt; FLUSH PRIVILEGES;
&lt;/pre&gt;


&lt;p&gt;Injecter ensuite le dump dans la base postfix&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# mysql postfix &amp;lt; dump.sql
&lt;/pre&gt;

&lt;pre&gt;
CREATE TABLE admin (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY  (username),
KEY username (username)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Admins';

CREATE TABLE alias (
address varchar(255) NOT NULL default '',
goto text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY  (address),
KEY address (address)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Aliases';

CREATE TABLE domain (
domain varchar(255) NOT NULL default '',
description varchar(255) NOT NULL default '',
aliases int(10) NOT NULL default '0',
mailboxes int(10) NOT NULL default '0',
maxquota int(10) NOT NULL default '0',
transport varchar(255) default NULL,
backupmx tinyint(1) NOT NULL default '0',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY  (domain),
KEY domain (domain)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Domains';

CREATE TABLE domain_admins (
username varchar(255) NOT NULL default '',
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
KEY username (username)
) TYPE=MyISAM COMMENT='Postfix Admin - Domain Admins';

CREATE TABLE log (
timestamp datetime NOT NULL default '0000-00-00 00:00:00',
username varchar(255) NOT NULL default '',
domain varchar(255) NOT NULL default '',
action varchar(255) NOT NULL default '',
data varchar(255) NOT NULL default '',
KEY timestamp (timestamp)
) TYPE=MyISAM COMMENT='Postfix Admin - Log';

CREATE TABLE mailbox (
username varchar(255) NOT NULL default '',
password varchar(255) NOT NULL default '',
name varchar(255) NOT NULL default '',
maildir varchar(255) NOT NULL default '',
quota int(10) NOT NULL default '0',
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
modified datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY  (username),
KEY username (username)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Mailboxes';

CREATE TABLE vacation (
email varchar(255) NOT NULL default '',
subject varchar(255) NOT NULL default '',
body text NOT NULL,
cache text NOT NULL,
domain varchar(255) NOT NULL default '',
created datetime NOT NULL default '0000-00-00 00:00:00',
active tinyint(1) NOT NULL default '1',
PRIMARY KEY  (email),
KEY email (email)
) TYPE=MyISAM COMMENT='Postfix Admin - Virtual Vacation';
&lt;/pre&gt;


&lt;h2&gt;&lt;strong&gt;5/ SASL&lt;/strong&gt;&lt;/h2&gt;


&lt;p&gt;Pour le support SASL, nous passerons par dovecot&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# vi /applis/postfix-2.4.5/etc/main.cf
&lt;/pre&gt;

&lt;pre&gt;
# ===============================================
# Support SASL au travers de dovecot
# ===============================================

smtpd_sasl_type = dovecot
smtpd_sasl_path = /var/postfix/spool/private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
      permit_mynetworks,
      permit_sasl_authenticated,
      reject_unauth_destination
&lt;/pre&gt;


&lt;h2&gt;&lt;strong&gt;6/ Installation de dovecot&lt;/strong&gt;&lt;/h2&gt;


&lt;p&gt;Dovecot est un serveur pop/imap rapide, stable et sécure :) Sa configuration est assez aisée. Postfix depuis sa version 2.3 supporte l'authentification à travers dovecot, alors qu'avant nous devions utiliser cyrus-sasl (par exemple) comme couche d'authentification pour le relay, ici tout se fera au travers de dovecot, ce qui va simplifier les choses :)&lt;/p&gt;


&lt;p&gt;Donc pour ce qui est de l'installation, nous avons déjà fait&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# cd ~/work/
# wget http://www.dovecot.org/releases/1.0/dovecot-1.0.4.tar.gz
# tar xvzf dovecot-1.0.4.tar.gz
# cd dovecot-1.0.4
&lt;/pre&gt;


&lt;p&gt;On créé le groupe et le compte utilisateur dovecot&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# groupadd dovecot
# useradd -d /dev/null -s /bin/false -g dovecot dovecot
&lt;/pre&gt;


&lt;p&gt;On configure dovecot avec une approche minimalistique pour le moment :)&lt;/p&gt;

&lt;pre&gt;
# vi /applis/devecot-1.0.4/etc/dovecot.conf
&lt;/pre&gt;

&lt;pre&gt;
protocols = imap pop3
disable_plaintext_auth = no
ssl_disable = yes
default_mail_env = /var/vmail/spool
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot.info.log
log_timestamp = &amp;quot;%b %d %H:%M:%S &amp;quot;
mail_extra_groups = postfix
verbose_proctitle = yes
first_valid_uid = 1002
first_valid_gid = 106
protocol imap {
	imap_client_workarounds = delay-newmail outlook-idle netscape-eoh tb-extra-mailbox-sep
}
protocol pop3 {
	pop3_uidl_format = %08Xu%08Xv
}
protocol lda {
	postmaster_address = postmaster@moustik.org
}
auth_verbose = yes
auth_debug = yes
auth_debug_passwords = yes
auth default {
	mechanisms = plain
	user = root
	passdb passwd-file {
	args = /applis/dovecot-1.0.4/etc/dovecot.passdb
	}
	userdb passwd-file {
	args = /applis/dovecot-1.0.4/etc/dovecot.passdb
	}
}
&lt;/pre&gt;

&lt;pre&gt;
# touch /applis/dovecot-1.0.4/etc/dovecot.passdb
&lt;/pre&gt;


&lt;p&gt;On démarre dovecot&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# /etc/init.d/dovecot start
# netstat -nptl|grep dovecot
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN     29595/dovecot       
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN     29595/dovecot
&lt;/pre&gt;


&lt;h2&gt;&lt;strong&gt;7/ Ajout du support MySQL pour dovecot&lt;/strong&gt;&lt;/h2&gt;


&lt;p&gt;Nous créons le fichier&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# vi /applis/dovecot-1.0.4/etc/dovecot-sql.conf
&lt;/pre&gt;

&lt;pre&gt;
driver = mysql
# Currently supported schemes include PLAIN, PLAIN-MD5, DIGEST-MD5, and CRYPT.
default_pass_scheme = CRYPT
# Database options
connect = host=127.0.0.1 dbname=DB user=USER password=PASSWD
password_query = SELECT password FROM mailbox WHERE username = '%u' AND active = '1'
user_query = SELECT maildir, 5000 AS uid, 5000 AS gid FROM mailbox WHERE username = '%u' AND active = '1'
&lt;/pre&gt;


&lt;p&gt;On ajoute au fichier de configuration de dovecot le support mysql&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
auth default {
	mechanisms = plain login
	passdb sql {
		args = /applis/dovecot-1.0.4/etc/dovecot-sql.conf
	}
	userdb sql {
		args = /applis/dovecot-1.0.4/etc/dovecot-sql.conf
	}
}
&lt;/pre&gt;


&lt;h2&gt;&lt;strong&gt;8/ On ajoute le support SASL dans la conf de dovecot&lt;/strong&gt;&lt;/h2&gt;

&lt;pre&gt;
auth default {
	mechanisms = plain login
	passdb sql {
		args = /applis/dovecot-1.0.4/etc/dovecot-sql.conf
	}
	userdb sql {
		args = /applis/dovecot-1.0.4/etc/dovecot-sql.conf
	}

	socket listen {
		client {
		        path = /var/postfix/spool/private/auth
		        mode = 0660
		        user = postfix
		        group = postfix
		}
	}
}
&lt;/pre&gt;


&lt;p&gt;Ajout du SSL pour le pop3 et l'imap&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# cd /applis/dovecot-1.0.4/etc/
# mkdir -p ssl/private ssl/public
# openssl req -new -x509 -nodes -out public/dovecot.pem -keyout private/dovecot.pem -days 3650
&lt;/pre&gt;


&lt;p&gt;Modifier le fichier de configuration de dovecot&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
protocols = imap imaps pop3 pop3s
ssl_disable = no
ssl_cert_file = /applis/dovecot-1.0.4/etc/ssl/public/dovecot.pem
ssl_key_file = /applis/dovecot-1.0.4/etc/ssl/private/dovecot.pem
ssl_parameters_regenerate = 24
&lt;/pre&gt;


&lt;p&gt;Regénerez les paramètres SSL pour dovecot&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# cd /applis/dovecot-1.0.4/
# /applis/dovecot-1.0.4/libexec/dovecot/ssl-build-param \
var/run/dovecot/login/ssl-parameters.dat
&lt;/pre&gt;


&lt;h2&gt;&lt;strong&gt;9/ Postfixadmin&lt;/strong&gt;&lt;/h2&gt;


&lt;p&gt;Postfixadmin est une petite appli en php/mysql pour gérer les domaines et les comptes mail.&lt;/p&gt;

&lt;pre&gt;
# cd /var/www/
# wget http://surfnet.dl.sourceforge.net/sourceforge/postfixadmin/postfixadmin-2.1.0.tgz
# cd /var/www/
# tar xvjf postfixadmin-2.1.0.tgz
# cd postfixadmin-2.1.0/
# cp config.inc.php.sample config.inc.php
# vi config.inc.php
&lt;/pre&gt;


&lt;p&gt;Changer les lignes suivantes&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
// Mailboxes
// If you want to store the mailboxes per domain set this to 'YES'.
// Example: /usr/local/virtual/domain.tld/username@domain.tld
$CONF['domain_path'] = 'YES';
// If you don't want to have the domain in your mailbox set this to 'NO'.
// Example: /usr/local/virtual/domain.tld/username
$CONF['domain_in_mailbox'] = 'YES';
&lt;/pre&gt;


&lt;p&gt;On ajoute un vhost à httpd&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;VirtualHost *:8000&amp;gt;
        DocumentRoot /var/www/postfixadmin-2.1.0
        ServerName mail.plop.org
        ServerAdmin admin@plop.org
        DirectoryIndex index.html index.php
        CustomLog /var/logs/httpd/postfixadmin.log combined
        ErrorLog /var/logs/httpd/postfixadmin_error.log
        LogLevel warn

        &amp;lt;Directory &amp;quot;/var/www/postfixadmin-2.1.0&amp;quot;&amp;gt;
                Options Indexes FollowSymLinks
                AllowOverride AuthConfig
                Order Deny,Allow
                Allow from all
        &amp;lt;/Directory&amp;gt;
&amp;lt;/VirtualHost&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Vérifier les droits sur les les répertoires maildir&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# chown -R vmail: /var/vmail/
&lt;/pre&gt;


&lt;p&gt;Attention également à vos runlevels, il faut démarrer dovecot avant postfix à cause de sa dépendance vis à vis de SASL, et démarrer MySQL avant dovecot et postfix.&lt;/p&gt;


&lt;p&gt;A ce stade là, vous avez (normalement) un serveur smtp/imap(s)/pop3(s)/mysql multi-domaine avec un interface web pour gérer les comptes. Ca devrait être bon :)&lt;/p&gt;</description>
    
    
    
          <comments>http://www.moustik.org/2008/03/21/Postfix-245-dovecot-104-MySQL-545#comment-form</comments>
      <wfw:comment>http://www.moustik.org/2008/03/21/Postfix-245-dovecot-104-MySQL-545#comment-form</wfw:comment>
      <wfw:commentRss>http://www.moustik.org/feed/rss2/comments/19</wfw:commentRss>
      </item>
    
  <item>
    <title>aterm et fluxbox</title>
    <link>http://www.moustik.org/2008/03/12/aterm-et-fluxbox</link>
    <guid isPermaLink="false">urn:md5:5bac59002749b617b54dc33df4ba35ab</guid>
    <pubDate>Wed, 12 Mar 2008 20:37:00 +0100</pubDate>
    <dc:creator>Ludo</dc:creator>
        <category>Linux</category>
        <category>fluxbox</category>    
    <description>&lt;p&gt;Aterm, c'est un peu devenu mon compagnon de tous les jours et avec son grand pote fluxbox, ces deux là me donnent entière satisfaction. Alors un petit post pour leur faire plaisir :)&lt;/p&gt;    &lt;p&gt;aterm est un term léger qui gère en plus la transparence. Avec peu d'effort on peut totalement le dépouiller à sa guise.&lt;/p&gt;


&lt;p&gt;Quelques options&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
*+/-tr : arrêt/marche transparence
*+/-sbtr : arrêt/marche transparence de la barre de scrolling
*-sh &amp;lt;0-100&amp;gt; : Correspond au shading
*+/-sb : non affichage/affichage de la side bar
*-sl &amp;lt;nb&amp;gt; : nombre de lignes gardées dans le buffer
*-bg &amp;lt;couleur&amp;gt; : couleur de fond
*-fg &amp;lt;couleur&amp;gt; : couleur avant plan (font)
&lt;/pre&gt;


&lt;p&gt;Il en existe une multitude&amp;nbsp;: cf. man aterm
Voici un exemple pour mon term d'irssi&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# aterm -name atermirssi -tr +sb -si -sk -bg black -sh 30 -e irssi ~/.startirssi
&lt;/pre&gt;


&lt;p&gt;Exemple pour lancer quatre aterm sur un bureau au démarrage de fluxbox.&lt;/p&gt;


&lt;p&gt;Dans le fichier ~/.fluxbox/startup&lt;/p&gt;

&lt;pre&gt;
aterm -name aterm1 -tr +sb -sr -si -sk -bg black -sh 30 &amp;amp;
aterm -name aterm2 -tr +sb -sr -si -sk -bg black -sh 30 &amp;amp;
aterm -name aterm3 -tr +sb -sr -si -sk -bg black -sh 30 &amp;amp;
aterm -name aterm4 -tr +sb -sr -si -sk -bg black -sh 30 &amp;amp;
&lt;/pre&gt;


&lt;p&gt;Pour les placer au bon endroit au bon bureau, dans ~/.fluxbox/apps&lt;/p&gt;

&lt;pre&gt;
[app] (aterm1)
    [Workspace]   {8}
    [Dimensions]  {825 510}
    [Position]    (UPPERLEFT)     {10 10}
    [Deco]        {NONE}
[end]
[app] (aterm2)
    [Workspace]   {8}
    [Dimensions]  {825 510}
    [Position]    (UPPERLEFT)     {845 10}
    [Deco]        {NONE}
[end]
[app] (aterm3)
    [Workspace]   {8}
    [Dimensions]  {825 510}
    [Position]    (UPPERLEFT)     {10 530}
    [Deco]        {NONE}
[end]
[app] (aterm4)
    [Workspace]   {8}
    [Dimensions]  {825 510}
    [Position]    (UPPERLEFT)     {845 530}
    [Deco]        {NONE}
[end]
&lt;/pre&gt;


&lt;p&gt;Ce qui fait 4 terms sur le bureau 9 placés comme je veux :-)
A noter que lorsque [Deco] vaut none, fluxbox supprime tout de la fenetre (bordure et barre de titre), ce qui fait que le term est totalement dépouillé.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.moustik.org/2008/03/12/aterm-et-fluxbox#comment-form</comments>
      <wfw:comment>http://www.moustik.org/2008/03/12/aterm-et-fluxbox#comment-form</wfw:comment>
      <wfw:commentRss>http://www.moustik.org/feed/rss2/comments/18</wfw:commentRss>
      </item>
    
  <item>
    <title>Tableau de conditions et tests sous bash</title>
    <link>http://www.moustik.org/2008/03/09/Tableau-de-conditions-et-tests-sous-bash</link>
    <guid isPermaLink="false">urn:md5:66d4bed0353c835ff9348fd5ab8ed56f</guid>
    <pubDate>Sun, 09 Mar 2008 20:49:00 +0100</pubDate>
    <dc:creator>Ludo</dc:creator>
        <category>bash</category>
        <category>bash</category>    
    <description>&lt;p&gt;Petit post rapide, enfin plutôt un pense-bête sur les conditions et tests en Bash. Souvent je cherche à droite , à gauche sur des conditions que je n'utilise jamais ou très rarement, alors voilà une liste exhaustive. Puis comme c'est dimanche et que je glandouille devant ma machine :)&lt;/p&gt;    &lt;p&gt;Souvent en tant que débutant que je suis, je galère quand je fais mes propres scripts tout crades pour trouver des infos sur toutes les conditions et tests qu'offre bash, alors voilà un petit tableau qui me fait gagner du temps.&lt;/p&gt;
&lt;TABLE BORDER=&quot;0&quot;&gt;
&lt;TR bgcolor=&quot;#3F4040&quot;&gt;&lt;TH&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/TH&gt;&lt;TH&gt;&lt;/TH&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-a fichier&lt;/TD&gt;&lt;TD&gt;le fichier indiqué existe&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-e fichier&lt;/TD&gt;&lt;TD&gt;le fichier indiqué existe&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-b fichier&lt;/TD&gt;&lt;TD&gt;le fichier indiqué est un noeud spécial qui décrit un périphérique en mode bloc&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-c fichier&lt;/TD&gt;&lt;TD&gt;le fichier indiqué est un noeud spécial qui décrit un périphérique en mode caractère&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-d répertoire&lt;/TD&gt;&lt;TD&gt;le répertoire indiqué existe&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-f fichier&lt;/TD&gt;&lt;TD&gt;Le fichier indiqué est un fichier régulier&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-g fichier&lt;/TD&gt;&lt;TD&gt;Le bit Set-GID du fichier indiqué est positionné&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-h fichier&lt;/TD&gt;&lt;TD&gt;Le fichier indiqué est un lien symbolique&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-L fichier&lt;/TD&gt;&lt;TD&gt;Le fichier indiqué est un lien symbolique&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-G fichier&lt;/TD&gt;&lt;TD&gt;Le fichier indiqué appartient au même groupe que le GID effectif du processus invoquant la commande test&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-k fichier&lt;/TD&gt;&lt;TD&gt;Le bit sticky du fichier indiqué est positionné&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-n fichier&lt;/TD&gt;&lt;TD&gt;La longueur de la chaine est non nulle&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-N fichier&lt;/TD&gt;&lt;TD&gt;Le fichier a été modifié depuis son dernier acces en lecture&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-O fichier&lt;/TD&gt;&lt;TD&gt;Le fichier indiqué appartient au même utilisateur que l'UID effectif du processus invoquant la commande test&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-p fichier&lt;/TD&gt;&lt;TD&gt;Le fichier indiqué est un tube (file FIFO)&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-r fichier&lt;/TD&gt;&lt;TD&gt;Le fichier indiqué est lisible&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-s fichier&lt;/TD&gt;&lt;TD&gt;La taille du fichier indiqué est non nulle&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-S fichier&lt;/TD&gt;&lt;TD&gt;Le fichier indiqué est une socket&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-t descripteur&lt;/TD&gt;&lt;TD&gt;Le descripteur de fichier correspond à un terminal&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-u fichier&lt;/TD&gt;&lt;TD&gt;Le bit Set-UID du fichier indiqué est positionné&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-w fichier&lt;/TD&gt;&lt;TD&gt;On peut écrire dans le fichier indiqué&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-x fichier&lt;/TD&gt;&lt;TD&gt;Le fichier indiqué est executable&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;-z fichier&lt;/TD&gt;&lt;TD&gt;La longueur de la chaine indiquée est nulle&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine&lt;/TD&gt;&lt;TD&gt;La chaine est non nulle&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 = chaine2&lt;/TD&gt;&lt;TD&gt;Les deux chaines sont identiques&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 != chaine2&lt;/TD&gt;&lt;TD&gt;Les deux chaines sont identiques&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 &lt; chaine2&lt;/TD&gt;&lt;TD&gt;Les deux chaines sont identiques&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 &gt; chaine2&lt;/TD&gt;&lt;TD&gt;Les deux chaines sont identiques&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 -eq chaine2&lt;/TD&gt;&lt;TD&gt;Les deux chaines sont identiques&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 -ge chaine2&lt;/TD&gt;&lt;TD&gt;La première valeur est supérieure ou égale à la seconde&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 -gt chaine2&lt;/TD&gt;&lt;TD&gt;La première valeur est strictement supérieure à la seconde&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 -le chaine2&lt;/TD&gt;&lt;TD&gt;La première valeur est inférieure ou égale à la seconde&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 -lt chaine2&lt;/TD&gt;&lt;TD&gt;La première valeur est strictement inférieure à la seconde&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 -ne chaine2&lt;/TD&gt;&lt;TD&gt;Les deux valeurs arithmétiques sont différentes&lt;/TR&gt;&lt;/TD&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 -ef chaine2&lt;/TD&gt;&lt;TD&gt;Le fichier1 est le même que le fichier2. Il peut s'agir de deux noms (liens physiques) différents dans le système de fichiers correspondant au même contenu sous-jacent. La comparaison concerne le numéro de périphérique de support et le numéro d'i-noeud.&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 -nt chaine2&lt;/TD&gt;&lt;TD&gt;La date de dernière modification du fichier1 est plus récente que celle du fichier2&lt;/TD&gt;&lt;/TR&gt;
&lt;TR bgcolor=&quot;#F4F4F3&quot;&gt;&lt;TD&gt;chaine1 -ot chaine2&lt;/TD&gt;&lt;TD&gt;La date de dernière modification du fichier1 est plus ancienne que celle du fichier2&lt;/TD&gt;&lt;/TR&gt;
&lt;/TABLE&gt;
  </description>
    
    
    
          <comments>http://www.moustik.org/2008/03/09/Tableau-de-conditions-et-tests-sous-bash#comment-form</comments>
      <wfw:comment>http://www.moustik.org/2008/03/09/Tableau-de-conditions-et-tests-sous-bash#comment-form</wfw:comment>
      <wfw:commentRss>http://www.moustik.org/feed/rss2/comments/17</wfw:commentRss>
      </item>
    
  <item>
    <title>Lighttpd-1.4.18 &amp; PHP-5.2.5 en FastCGI</title>
    <link>http://www.moustik.org/2008/03/09/Lighttpd-1418-PHP-en-FastCGI</link>
    <guid isPermaLink="false">urn:md5:dccbb439973e29abf503ab313cd73bcd</guid>
    <pubDate>Sun, 09 Mar 2008 01:53:00 +0100</pubDate>
    <dc:creator>Ludo</dc:creator>
        <category>Linux</category>
            
    <description>&lt;p&gt;Ca fait longtemps que je n'ai pas posté le moindre petit truc, alors voilà un petit article sur une installation de lighttpd avec le support de PHP-5.2.5 en mode Fast-CGI et tout ca sur une debian etch :p&lt;/p&gt;    &lt;p&gt;J'entends beaucoup parler de lighttpd, sur le fait qu'il soit léger et performant, Jusque maintenant je n'utilise exclusivement Apache pour mes serveurs http.
Donc une procédure d'installation et quelques explications pour arriver à un serveur ouèbe avec support PHP fonctionnel.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;1/ Installation de lighttpd&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;On commence comme d'habitude par récupérer les sources, j'ai inclue le support de mysql et OpenSSL, que j'ai déjà construit sur mon système, a vous d'adapter le configure en fonction de votre système. Idem pour les dépendances, c'est à vous de jouer.&lt;/p&gt;

&lt;pre&gt;
# cd ~/work
# wget http://www.lighttpd.net/download/lighttpd-1.4.18.tar.bz2
# tar xvjf ~/lighttpd-1.4.18.tar.bz2
# cd lighttpd-1.4.18/
&lt;/pre&gt;

&lt;pre&gt;
./configure --prefix=/applis/lighttpd-1.4.18 \
--enable-lfs \
--disable-ipv6 \
--with-mysql=/applis/mysql/bin/mysql_config \
--with-attr \
--with-openssl=/applis/openssl \
--with-openssl-includes=/applis/openssl/include \
--with-pcre \
--with-memcache
&lt;/pre&gt;


&lt;p&gt;On installe&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# make &amp;amp;&amp;amp; make install
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;2/ Configuration de lighttpd :&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Par habitude, je place toujours mes fichiers de configurations dans etc du répertoire de l'applicatif et non dans /etc, à vous de voir et d'adapter les fichiers de conf. en fonction.&lt;/p&gt;

&lt;pre&gt;
# vi /applis/lighttpd-1.4.18/etc/lighttpd.conf
&lt;/pre&gt;


&lt;p&gt;Ce qui donne pour un lighttpd relativement minimaliste et limité ne fonctionnalitées&lt;/p&gt;

&lt;pre&gt;
# =====================================
# Main configuration
# =====================================

server.port = 8080
server.bind = &amp;quot;0.0.0.0&amp;quot;
server.pid-file = &amp;quot;/var/run/lighttpd.pid&amp;quot;
server.username = &amp;quot;httpd&amp;quot;
server.groupname = &amp;quot;httpd&amp;quot;
static-file.exclude-extensions = ( &amp;quot;.fcgi&amp;quot;, &amp;quot;.rb&amp;quot;, &amp;quot;~&amp;quot;, &amp;quot;.inc&amp;quot; )
index-file.names = ( &amp;quot;index.html&amp;quot;)
server.tag = &amp;quot;httpd&amp;quot;
url.access-deny = ( &amp;quot;~&amp;quot;, &amp;quot;.inc&amp;quot;, &amp;quot;.bak&amp;quot;, &amp;quot;.swap&amp;quot;, &amp;quot;.old&amp;quot; )
dir-listing.activate = &amp;quot;disable&amp;quot;
compress.filetype = ( &amp;quot;text/plain&amp;quot;, &amp;quot;text/html&amp;quot;, &amp;quot;text/css&amp;quot;, &amp;quot;text/javascript&amp;quot; )
compress.cache-dir = &amp;quot;/tmp/lighttpd&amp;quot;
server.document-root = &amp;quot;/var/web/park&amp;quot;

# =====================================
# Modules
# =====================================

server.modules = (
        &amp;quot;mod_access&amp;quot;,
        &amp;quot;mod_accesslog&amp;quot;,
        &amp;quot;mod_compress&amp;quot;
)

# =====================================
# Logs
# =====================================

accesslog.filename = &amp;quot;/var/log/lighttpd/access.log&amp;quot;
server.errorlog = &amp;quot;/var/log/lighttpd/error.log&amp;quot;

# =====================================
# Type mime
# =====================================

mimetype.assign = (
        &amp;quot;.css&amp;quot; =&amp;gt;  &amp;quot;text/css&amp;quot;,
        &amp;quot;.gif&amp;quot; =&amp;gt;  &amp;quot;image/gif&amp;quot;,
        &amp;quot;.htm&amp;quot; =&amp;gt;  &amp;quot;text/html&amp;quot;,
        &amp;quot;.html&amp;quot; =&amp;gt;  &amp;quot;text/html&amp;quot;,
        &amp;quot;.jpeg&amp;quot; =&amp;gt;  &amp;quot;image/jpeg&amp;quot;,
        &amp;quot;.jpg&amp;quot; =&amp;gt;  &amp;quot;image/jpeg&amp;quot;,
        &amp;quot;.js&amp;quot; =&amp;gt;  &amp;quot;text/javascript&amp;quot;,
        &amp;quot;.png&amp;quot; =&amp;gt;  &amp;quot;image/png&amp;quot;,
        &amp;quot;.swf&amp;quot; =&amp;gt;  &amp;quot;application/x-shockwave-flash&amp;quot;,
        &amp;quot;.txt&amp;quot; =&amp;gt;  &amp;quot;text/plain&amp;quot;
)
&lt;/pre&gt;


&lt;p&gt;Comme prévu, la configuration n'est pas très fournie mais suffit déjà à fournir du contenu statique, alors quelques explications sommaires&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On bind sur le port 8080&lt;/li&gt;
&lt;li&gt;On écoute sur toutes les interfaces&lt;/li&gt;
&lt;li&gt;On fait tourner lighttpd sous le compte httpd:httpd&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Pour les créer&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# groupadd httpd
# useradd -c &amp;quot;httpd user&amp;quot; -d /dev/null -s /bin/false -g httpd httpd
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;On interdit le traitement par lighttpd des .fcgi, etc.&lt;/li&gt;
&lt;li&gt;On interdit le listage des répertoires (si pas de document d'index)&lt;/li&gt;
&lt;li&gt;l'index sera index.html&lt;/li&gt;
&lt;li&gt;On interdit aux visiteurs l'accès à certains fichiers qui pourraient trainer sur le server ( .swp, .bak, etc.)&lt;/li&gt;
&lt;li&gt;On précise quels type de fichiers on souhaite compresser et où les fichiers compressés seront stockés.&lt;/li&gt;
&lt;li&gt;le server.document-root est le répertoire par défaut pour les fichiers&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;En ce qui concerne les modules, on est au minimum pour supporter ce fichier de conf,&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;On précise où journaliser l'activité des pages servies.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;On précise le type mime des fichiers que l'on va servir aux navigateurs,&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Et c'est tout :) Bien sur on est loin de tout ce que peut faire lighttpd mais cette conf est un bon début simple, compréhensible et légé. on en verra un peu plus après.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;3/ Support de PHP&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Pour le PHP, on n'est pas comme sous apache avec la possibilité d'ajouter le support sous forme de module, il va falloir passer par les CGI, en l'occurence ici, on sera en FastCGI, une des petites différences entre les deux ( en gros ) est que FastCGI va garder les scripts en mémoire évitant ainsi au serveur de les recharger et recompiler comme peut le faire CGI, on y gagne en performance, donc on se prive pas. Il faut juste savoir que vous avez plusieurs possibilités, le site officiel explique toutes façons de faire.&lt;/p&gt;


&lt;p&gt;On va donc construire php avec le support du FastCGI&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# cd ~/work
# wget http://fr2.php.net/get/php-5.2.5.tar.bz2/from/fr.php.net/mirror
# tar xvjf php-5.2.5.tar.bz2
# cd php-5.2.5
&lt;/pre&gt;


&lt;p&gt;En passant on ajoute le support pour MySQL et OpenSSL préalablement installés sur mon système, à adapter donc&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
./configure --prefix=/applis/php-5.2.5 \
--enable-fastcgi \
--enable-discard-path \
--enable-force-cgi-redirect \
--with-mysql=/applis/mysql \
--with-mysql-sock=/tmp/mysql.sock \
--with-mysqli=/applis/mysql/bin/mysql_config \
--enable-mbstring \
--enable-bcmath \
--with-gd=/applis/gd \
--with-zlib
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;4/ Support de PHP dans lighttpd&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Maintenant, on va ajouter le support, donc on remet la tête dans la configuration de lighttpd et on y ajoute/modifie&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;On commence par ajouter le support du mod_fastcgi&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
server.modules = (
        &amp;quot;mod_access&amp;quot;,
        &amp;quot;mod_accesslog&amp;quot;,
        &amp;quot;mod_compress&amp;quot;,
        &amp;quot;mod_fastcgi&amp;quot;
)
&lt;/pre&gt;


&lt;p&gt;On ajoute les directives pour supporter le PHP à proprement parler&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
fastcgi.server = ( &amp;quot;.php&amp;quot; =&amp;gt;
        ((
                &amp;quot;bin-path&amp;quot; =&amp;gt; &amp;quot;/applis/php-5.2.5-fcgi/bin/php-cgi&amp;quot;,
                &amp;quot;socket&amp;quot; =&amp;gt; &amp;quot;/var/tmp/php.socket&amp;quot;,
                &amp;quot;max-procs&amp;quot; =&amp;gt; 2,
                &amp;quot;idle-timeout&amp;quot; =&amp;gt; 10,
                &amp;quot;bin-environment&amp;quot; =&amp;gt; (
                        &amp;quot;PHP_FCGI_CHILDREN&amp;quot; =&amp;gt; &amp;quot;16&amp;quot;,
                        &amp;quot;PHP_FCGI_MAX_REQUESTS&amp;quot; =&amp;gt; &amp;quot;10000&amp;quot;
                ),
                &amp;quot;bin-copy-environment&amp;quot; =&amp;gt; (
                        &amp;quot;PATH&amp;quot;, &amp;quot;SHELL&amp;quot;, &amp;quot;USER&amp;quot;
                ),
                &amp;quot;broken-scriptfilename&amp;quot; =&amp;gt; &amp;quot;enable&amp;quot;
        ))
)
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;max-procs&lt;/strong&gt;&amp;nbsp;: Nombre maximal de process lancés&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP_FCGI_CHILDREN&lt;/strong&gt;&amp;nbsp;: Nombre maximal d'enfants par process&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PHP_FCGI_MAX_REQUESTS&lt;/strong&gt;&amp;nbsp;: Nombre maximal de requêtes traitées par le serveur CGI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modifier également la directive &lt;strong&gt;index-file.names&lt;/strong&gt; histoire de pouvoir servir des sites avec index.php comme index, ca peut servir :)&lt;/p&gt;

&lt;pre&gt;
index-file.names = ( &amp;quot;index.html&amp;quot;, &amp;quot;index.php&amp;quot;)
&lt;/pre&gt;


&lt;p&gt;On se créé une page de test&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# echo &amp;quot;&amp;lt;?php phpinfo() ?&amp;gt;&amp;quot; &amp;gt; /var/web/park/info.php
# pkill -HUP lighttpd
&lt;/pre&gt;


&lt;p&gt;Vous pouvez vérifier avec votre browser si tout va bien.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;5/ Script d'init&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Bon un petit script d'init écrit maison, vous pouvez l'enrichir de tests parce qu'il reste assez sommaire en l'état actuel&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
#!/bin/sh
PATH=/applis/*/bin:/applis/*/sbin:/sbin:/bin:/usr/sbin:/usr/bin

[[ ! -f /applis/lighttpd/etc/lighttpd.conf ]] &amp;amp;&amp;amp; echo -e &amp;quot;Pas de fichier de configuration&amp;quot;
[[ ! -x /applis/lighttpd/sbin/lighttpd ]] &amp;amp;&amp;amp; echo -e &amp;quot;Lighttpd non executable&amp;quot;

LIGHTTPD_CONF=&amp;quot;/applis/lighttpd/etc/lighttpd.conf&amp;quot;
LIGHTTPD=&amp;quot;/applis/lighttpd/sbin/lighttpd&amp;quot;
LIGHTTPD_PID=&amp;quot;/var/run/lighttpd.pid&amp;quot;

case &amp;quot;$1&amp;quot; in
        start)
                echo -e &amp;quot;Start de lighttpd... &amp;quot;
                start-stop-daemon --start --quiet --exec &amp;quot;${LIGHTTPD}&amp;quot; \
                --pidfile &amp;quot;${LIGHTTPD_PID} &amp;quot; -- -f &amp;quot;${LIGHTTPD_CONF}&amp;quot;
                ;;

        stop)
                echo -e &amp;quot;Arret de lighttpd... &amp;quot;
                start-stop-daemon --stop --quiet --pidfile &amp;quot;${LIGHTTPD_PID}&amp;quot;
                ;;

        reload)
                echo -e &amp;quot;Reload de lighttpd...&amp;quot;
                start-stop-daemon --stop --oknodo --quiet --pidfile &amp;quot;${LIGHTTPD_PID}&amp;quot; \
                --signal HUP
                ;;

        graceful)
                echo -e &amp;quot;Graceful restart de lighttpd...&amp;quot;
                start-stop-daemon --stop --oknodo --quiet --pidfile &amp;quot;${LIGHTTPD_PID}&amp;quot; \
                --signal INT
                ;;

        restart)
                echo -e &amp;quot;Restart de lighttpd...&amp;quot;
                start-stop-daemon --stop --quiet --pidfile &amp;quot;${LIGHTTPD_PID}&amp;quot;
                sleep 1
                start-stop-daemon --start --quiet --exec &amp;quot;${LIGHTTPD}&amp;quot; \
                --pidfile &amp;quot;${LIGHTTPD_PID} &amp;quot; -- -f &amp;quot;${LIGHTTPD_CONF}&amp;quot;
                ;;

        *)
                echo -e &amp;quot; Usage :&amp;quot;
                echo -e &amp;quot; start : start du serveur lighttpd&amp;quot;
                echo -e &amp;quot; stop : arret du serveur lighttpd&amp;quot;
                echo -e &amp;quot; reload : rachargement de lighttpd&amp;quot;
                echo -e &amp;quot; graceful : redemarrage graceful de lighttpd&amp;quot;
                exit 1
                ;;
esac

exit 0
&lt;/pre&gt;


&lt;p&gt;Le rendre executable&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# chmod +x /etc/init.d/lighttpd
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;6/ Assurer le démarrage/arrêt avec le système :&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# update-rc lighttpd start 70 2 3 4 5 . stop 30 0 6 .
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;7/ VirtualHost&lt;/strong&gt;
Le support des  VirtualHost dans lighttpd est vraiment bien foutu, j'aime beaucoup le principe. En fait il y a deux modules qui permettent la gestion des VirtualHost.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mod_simple_vhost&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Directives simples pour créer un vhost.&lt;/p&gt;

&lt;pre&gt;
simple-vhost.server-root = &amp;quot;/var/web/&amp;quot;
simple-vhost.default-host = &amp;quot;www.toto.org&amp;quot;
simple-vhost.document-root = &amp;quot;/&amp;quot;

$HTTP[&amp;quot;host&amp;quot;] == &amp;quot;www\.toto\.org&amp;quot; {
        server.document-root = &amp;quot;/var/web/www.toto.org/&amp;quot;
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mod_evhost&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Avec le module de vhosts &quot;enhenced&quot;, on peut utiliser des patterns pour faire pointer les requêtes vers des vhosts en fonction du HOST de la requête, c'est une manière très souple de composer les vhosts.... enfin je trouve.&lt;/p&gt;

&lt;pre&gt;
%% =&amp;gt; % sign
%0 =&amp;gt; domain name + tld
%1 =&amp;gt; tld
%2 =&amp;gt; domain name without tld
%3 =&amp;gt; subdomain 1 name
%4 =&amp;gt; subdomain 2 name
&lt;/pre&gt;


&lt;p&gt;Par exemple&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$HTTP[&amp;quot;host&amp;quot;] =~ &amp;quot;users\.example\.org&amp;quot; {
    evhost.path-pattern = &amp;quot;/home/%4/public_html/&amp;quot;
}
&lt;/pre&gt;

&lt;p&gt;Donne&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
http://johndoe.users.example.org/ =&amp;gt; /home/johndoe/public_html/
&lt;/pre&gt;


&lt;p&gt;Ou encore&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
var.basedir = &amp;quot;/var/web&amp;quot;
evhost.path-pattern = var.basedir + &amp;quot;/%2/&amp;quot;
&lt;/pre&gt;

&lt;p&gt;Donne&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
http://www.toto.org/ =&amp;gt; /var/web/toto
&lt;/pre&gt;


&lt;p&gt;Enfin voilà, le principe quoi :)
Une chose importante que je n'ai pas abordé mais qui se voit est surtout le fait de pouvoir utiliser des expressions régulières dans la configuration, chose intéressante qui accroit la souplesse/puissance de la configuration. Je vous laisse découvrir tout ca.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;8/ Configuration globale :&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# =====================================
# Main configuration
# =====================================

server.port = 8080
server.bind = &amp;quot;0.0.0.0&amp;quot;
server.pid-file = &amp;quot;/var/run/lighttpd.pid&amp;quot;
server.username = &amp;quot;apache&amp;quot;
server.groupname = &amp;quot;apache&amp;quot;
static-file.exclude-extensions = ( &amp;quot;.fcgi&amp;quot;, &amp;quot;.rb&amp;quot;, &amp;quot;~&amp;quot;, &amp;quot;.inc&amp;quot; )
index-file.names = ( &amp;quot;index.html&amp;quot;, &amp;quot;index.php&amp;quot;)
server.tag = &amp;quot;Apache 1.3.39&amp;quot;
url.access-deny = ( &amp;quot;~&amp;quot;, &amp;quot;.inc&amp;quot;, &amp;quot;.bak&amp;quot;, &amp;quot;.swap&amp;quot;, &amp;quot;.old&amp;quot; )
dir-listing.activate = &amp;quot;disable&amp;quot;
compress.filetype        = ( &amp;quot;text/plain&amp;quot;, &amp;quot;text/html&amp;quot;, &amp;quot;text/css&amp;quot;, &amp;quot;text/javascript&amp;quot; )
compress.cache-dir = &amp;quot;/tmp/lighttpd&amp;quot;
server.document-root = &amp;quot;/var/web/park&amp;quot;

# =====================================
# Modules
# =====================================

server.modules = (
        &amp;quot;mod_access&amp;quot;,
        &amp;quot;mod_accesslog&amp;quot;,
        &amp;quot;mod_simple_vhost&amp;quot;,
        &amp;quot;mod_compress&amp;quot;,
        &amp;quot;mod_fastcgi&amp;quot;
)

# =====================================
# Logs
# =====================================

accesslog.filename = &amp;quot;/var/log/lighttpd/access.log&amp;quot;
server.errorlog = &amp;quot;/var/log/lighttpd/error.log&amp;quot;

# =====================================
# Type mime
# =====================================

mimetype.assign = (
        &amp;quot;.css&amp;quot;        =&amp;gt;  &amp;quot;text/css&amp;quot;,
        &amp;quot;.gif&amp;quot;        =&amp;gt;  &amp;quot;image/gif&amp;quot;,
        &amp;quot;.htm&amp;quot;        =&amp;gt;  &amp;quot;text/html&amp;quot;,
        &amp;quot;.html&amp;quot;       =&amp;gt;  &amp;quot;text/html&amp;quot;,
        &amp;quot;.jpeg&amp;quot;       =&amp;gt;  &amp;quot;image/jpeg&amp;quot;,
        &amp;quot;.jpg&amp;quot;        =&amp;gt;  &amp;quot;image/jpeg&amp;quot;,
        &amp;quot;.js&amp;quot;         =&amp;gt;  &amp;quot;text/javascript&amp;quot;,
        &amp;quot;.png&amp;quot;        =&amp;gt;  &amp;quot;image/png&amp;quot;,
        &amp;quot;.swf&amp;quot;        =&amp;gt;  &amp;quot;application/x-shockwave-flash&amp;quot;,
        &amp;quot;.txt&amp;quot;        =&amp;gt;  &amp;quot;text/plain&amp;quot;
)

# =====================================
# FastCGI / PHP
# =====================================

fastcgi.server = ( &amp;quot;.php&amp;quot; =&amp;gt;
        ((
                &amp;quot;bin-path&amp;quot; =&amp;gt; &amp;quot;/applis/php-5.2.5/bin/php-cgi&amp;quot;,
                &amp;quot;socket&amp;quot; =&amp;gt; &amp;quot;/var/tmp/php.socket&amp;quot;,
                &amp;quot;max-procs&amp;quot; =&amp;gt; 2,
                &amp;quot;idle-timeout&amp;quot; =&amp;gt; 10,
                &amp;quot;bin-environment&amp;quot; =&amp;gt; (
                        &amp;quot;PHP_FCGI_CHILDREN&amp;quot; =&amp;gt; &amp;quot;16&amp;quot;,
                        &amp;quot;PHP_FCGI_MAX_REQUESTS&amp;quot; =&amp;gt; &amp;quot;10000&amp;quot;
                ),
                &amp;quot;bin-copy-environment&amp;quot; =&amp;gt; (
                        &amp;quot;PATH&amp;quot;, &amp;quot;SHELL&amp;quot;, &amp;quot;USER&amp;quot;
                ),
                &amp;quot;broken-scriptfilename&amp;quot; =&amp;gt; &amp;quot;enable&amp;quot;
        ))
)

# =====================================
# Vhosts
# =====================================

simple-vhost.server-root = &amp;quot;/var/web/&amp;quot;
simple-vhost.default-host = &amp;quot;www.toto.org&amp;quot;
simple-vhost.document-root = &amp;quot;/&amp;quot;

$HTTP[&amp;quot;host&amp;quot;] == &amp;quot;www\.toto\.org&amp;quot; {
        server.document-root = &amp;quot;/var/web/www.toto.org/&amp;quot;

}
&lt;/pre&gt;


&lt;p&gt;Pour finir, voilà pour la petite intro sur lighttpd qui mérite vraiment le détour, consultez la doc officielle pour l'exploiter correctement, car je n'ai fait qu'aborder le minimal de ce que peut faire lighttpd.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.moustik.org/2008/03/09/Lighttpd-1418-PHP-en-FastCGI#comment-form</comments>
      <wfw:comment>http://www.moustik.org/2008/03/09/Lighttpd-1418-PHP-en-FastCGI#comment-form</wfw:comment>
      <wfw:commentRss>http://www.moustik.org/feed/rss2/comments/15</wfw:commentRss>
      </item>
    
  <item>
    <title>Websvn-2.0</title>
    <link>http://www.moustik.org/2008/02/24/Websvn-20</link>
    <guid isPermaLink="false">urn:md5:83f055c5082ab5af32e9534536721ef2</guid>
    <pubDate>Sun, 24 Feb 2008 23:01:00 +0100</pubDate>
    <dc:creator>Ludo</dc:creator>
        <category>Divers</category>
            
    <description>&lt;p&gt;Websvn ou comment rendre votre repository sexy dans un browser. De plus, au delà  il offre quelques fonctionnalitées sympathiques, diff entre les versions, package, flux RSS, etc.&lt;/p&gt;    &lt;p&gt;L'installation est simple, rapide... elle se réfère à un post précédent en ce qui concerne l'installtion du repository&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# cd /var/www
# wget http://websvn.tigris.org/files/documents/1380/39378/websvn-2.0.tar.gz
# tar xvzf websvn-2.0.tar.gz
# cd  websvn-2.0
# mv include/distconfig.php include/config.php
&lt;/pre&gt;

&lt;p&gt;Editez cette ligne dans le fichier include/config.php afin qu'elle corresponde à votre repository&lt;/p&gt;
&lt;pre&gt;
$config-&amp;gt;parentPath('/home/svn/');
&lt;/pre&gt;

&lt;p&gt;Côté configuration apache&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;VirtualHost *:80&amp;gt;
        ServerName websvn.plop.org
        DocumentRoot /var/www/websvn-2.0
        DirectoryIndex index.php
        CustomLog /var/logs/httpd/websvn.plop.org.log combined
        ErrorLog /var/logs/httpd/websvn.plop.org_err.log
        LogLevel warn

        &amp;lt;Directory /var/www/websvn-2.0&amp;gt;
                Options none
                AllowOverride Authconfig
                Order Deny,allow
                allow from all
        &amp;lt;/Directory&amp;gt;
&amp;lt;/virtualhost&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Bon voilà, cela suffit à le rendre fonctionnel, Si vous voulez alle plus loin, il y a d'autres paramètres, tout est expliqué dans le fichier de doc.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.moustik.org/2008/02/24/Websvn-20#comment-form</comments>
      <wfw:comment>http://www.moustik.org/2008/02/24/Websvn-20#comment-form</wfw:comment>
      <wfw:commentRss>http://www.moustik.org/feed/rss2/comments/14</wfw:commentRss>
      </item>
    
  <item>
    <title>Commandes de base sous subversion</title>
    <link>http://www.moustik.org/2008/02/24/Commandes-de-base-sous-subversion</link>
    <guid isPermaLink="false">urn:md5:fd410cdafb00a7812dbae30a2929ad47</guid>
    <pubDate>Sun, 24 Feb 2008 18:29:00 +0100</pubDate>
    <dc:creator>Ludo</dc:creator>
        <category>Linux</category>
            
    <description>&lt;p&gt;Suite au précédent billet sur la mise en place d'un subversion, un autre billet dans la foulée pour montrer quelques commandes de base pour utiliser subversion. Ca ne va pas très loin mais permet déjà de se débrouiller.&lt;/p&gt;    &lt;p&gt;====== Documentation sommaire ======&lt;/p&gt;


&lt;p&gt;Petit tour d'horizon des commandes de base avec subversion:&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Créer un repository&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# cd /home/svn
# svnadmin create cfengine
&lt;/pre&gt;

&lt;p&gt;__
Se synchroniser à un dépot pour rapatrier les fichiers :__&lt;/p&gt;

&lt;pre&gt;
# cd ~/svn
# svn co http://localhost/cfengine .
Checked out revision 0.
&lt;/pre&gt;


&lt;p&gt;Nous venons de se synchroniser avec le repository (checkout). Généralement, cette opération ne se fait que la première fois.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Créer un nouveau repository&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# touch txt.info
# svn import http://localhost/cfengine -m &amp;quot;1er&amp;quot;
Adding         txt.info

Committed revision 1.
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Pour se synchroniser au repository&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# svn update
A    txt.info
Updated to revision 1.
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Soumettre une nouvelle version&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# echo &amp;quot;wOOt&amp;quot; &amp;gt;&amp;gt; txt.info
# svn commit -m &amp;quot;wOOt upate&amp;quot;
Sending        txt.info
Transmitting file data .
Committed revision 2.
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Récupérer une version antérieure&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# svn update -r 1 txt.info
U    txt.info
Updated to revision 1.
# cat txt.info
#
# svn update
U    txt.info
Updated to revision 2.
# cat txt.info 
wOOt
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Ajouter un fichier&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# svn add plop.txt
A         plop.txt
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Supprimer un fichier&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# svn delete plop.txt
D         plop.txt
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Renommer un fichier&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# svn move txt.info info.txt
A         info.txt
D         txt.info
# svn commit -m &amp;quot;swapname&amp;quot;
Adding         info.txt
Deleting       txt.info
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Remettre un fichier dans l'état de son dernier update&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# svn revert txt.info
Reverted 'txt.info'
&lt;/pre&gt;


&lt;p&gt;Permet d'annuler toutes les modifications faites sur le fichier depuis le dernier update&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Pour obtenir des informations sur le repository&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# svn info
Path: .
URL: http://localhost/cfengine
Repository Root: http://localhost/cfengine
Repository UUID: 835a75e8-51a8-11dc-aee2-235a21debaf3
Revision: 2
Node Kind: directory
Schedule: normal
Last Changed Rev: 2
Last Changed Date: 2007-08-23 21:52:14 +0200 (jeu, 23 aoû 2007)
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Pour obtenir l'historique d'un fichier&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
# svn log info.txt
------------------------------------------------------------------------
r4 | (no author) | 2007-08-23 22:12:51 +0200 (jeu, 23 aoû 2007) | 1 line

swapname
------------------------------------------------------------------------
r2 | (no author) | 2007-08-23 21:52:14 +0200 (jeu, 23 aoû 2007) | 1 line

wOOt upate
------------------------------------------------------------------------
r1 | (no author) | 2007-08-23 21:34:56 +0200 (jeu, 23 aoû 2007) | 1 line

1er
------------------------------------------------------------------------
&lt;/pre&gt;

&lt;p&gt;Voilà déjà de quoi commencer à bosser :)&lt;/p&gt;</description>
    
    
    
          <comments>http://www.moustik.org/2008/02/24/Commandes-de-base-sous-subversion#comment-form</comments>
      <wfw:comment>http://www.moustik.org/2008/02/24/Commandes-de-base-sous-subversion#comment-form</wfw:comment>
      <wfw:commentRss>http://www.moustik.org/feed/rss2/comments/13</wfw:commentRss>
      </item>
    
  <item>
    <title>Subversion-1.4.6 &amp; httpd-2.2.6</title>
    <link>http://www.moustik.org/2008/02/24/Subversion-et-httpd</link>
    <guid isPermaLink="false">urn:md5:8745b6beb9d695e8f5b20218e51afc8b</guid>
    <pubDate>Sun, 24 Feb 2008 15:54:00 +0100</pubDate>
    <dc:creator>Ludo</dc:creator>
        <category>Apache</category>
            
    <description>&lt;p&gt;Un petit billet couvrant l'installation d'un subversion et une authentification au travers d'apache et subversion. Installation se basant sur subversion 1.4.6 et httpd 2.2.6.&lt;/p&gt;    &lt;p&gt;Si vous rencontrez des problèmes de compilation, vérifiez bien vos dépendances, pensez aussi a renseigner votre fichier ld.so.conf en y ajoutant les lib des applis que vous istallez.
On commence par Berkeley-BD ( ne pas prendre une version supérieure à 4.5.x (ie 4.6.x)&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# cd ~/work/
# wget http://download.oracle.com/berkeley-db/db-4.5.20.tar.gz
# tar xvzf db-4.5.20.tar.gz
# cd db-4.6.19/build_unix
# sh ../dist/configure --prefix=/applis/db-4.5.20
# make &amp;amp;&amp;amp; make install
&lt;/pre&gt;


&lt;p&gt;Puis installation de neon (neon is an HTTP and WebDAV client library) utilisée lors de l'installation de subversion. Attention, pour cette version de subversion, il faut utiliser la version 0.25.5, les versions  comme les 0.26.x ne fontionneront pas (en tout cas chez moi :) ).&lt;/p&gt;

&lt;pre&gt;
# cd ~/work/
# wget http://www.webdav.org/neon/neon-0.25.5.tar.gz
# tar xvzf neon-0.25.5.tar.gz
# cd neon-0.25.5/
# ./configure --prefix=/applis/neon-0.25.5 \
--enable-shared
&lt;/pre&gt;


&lt;p&gt;Puis apache 2.2.6&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# cd ~/work/
# wget http://apache.crihan.fr/dist/httpd/httpd-2.2.6.tar.gz
# tar xvzf httpd-2.2.6.tar.gz
# cd httpd-2.2.6/
./configure --prefix=/applis/httpd-2.2.6 \
--with-ssl=/applis/openssl \
--enable-modules=all \
--enable-mods-shared=all \
--with-included-apr \
--with-dbm=db45 \
--with-berkeley-db=/applis/db \
--enable-ssl
# make &amp;amp;&amp;amp; make install
&lt;/pre&gt;


&lt;p&gt;Installation de subversion&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# cd ~/work/
# wget http://subversion.tigris.org/downloads/subversion-1.4.6.tar.bz2
# tar xvjf subversion-1.4.6.tar.bz2
# cd subversion-1.4.6/
./configure --prefix=/applis/subversion-2.2.4 \
--with-apxs=/applis/httpd-2.2.6/bin/apxs \
--with-apr=/applis/httpd-2.2.6 \
--with-apr-util=/applis/apache \
--with-berkeley-db=/applis/db-4.5.20 \
--with-neon=/applis/neon-0.25.5 \
--without-jdk \
--without-jikes \
--without-swig \
--without-junit \
--enable-dso
  # make &amp;amp;&amp;amp; make install
&lt;/pre&gt;


&lt;p&gt;On créé le groupe et le user pour subversion&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# groupadd svn
# useradd svn -c &amp;quot;SVN User&amp;quot; -g svn -d /home/svn/ -s /bin/false
&lt;/pre&gt;


&lt;p&gt;Bon a ce niveau là, on a nos applicatifs installés, c'est déjà ca de fait.
Au niveau d'apache, de nouveaux modules sont disponibles, modifier httpd.conf pour les prendre en compte nous nous en servirons.&lt;/p&gt;
&lt;pre&gt;
LoadModule dav_module           modules/mod_dav.so
LoadModule dav_fs_module        modules/mod_dav_fs.so
LoadModule dav_svn_module       modules/mod_dav_svn.so
LoadModule authz_svn_module     modules/mod_authz_svn.so
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Côté subversion&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;On va commencer par créer notre repository&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# mkdir /home/svn
# chown -R svn: /home/svn
# svnadmin create /home/svn/moustik
&lt;/pre&gt;

&lt;p&gt;Pour tester que cela fonctionne niveau subversion, on va faire un checkout et quelques tests bidons du repository en local&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
$ mkdir ~/svn
$ cd ~/svn/
$ svn checkout file:///home/svn/moustik
Checked out revision 0.
&lt;/pre&gt;

&lt;p&gt;On place un fichier “test1.txt” sur le repository&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
$ echo &amp;quot;test1&amp;quot; &amp;gt; test1.txt
$ svn import test1.txt file:///home/svn/cfengine/test1.txt -m &amp;quot;fichier test1.txt&amp;quot;
Adding         test1.txt

Committed revision 1.
&lt;/pre&gt;

&lt;p&gt;On se synchronise par rapoort au svn&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
$ rm test1.txt
$ svn update
A    test1.txt
Updated to revision 1.
&lt;/pre&gt;

&lt;p&gt;On modifie le fichier et on le commit&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
$ echo &amp;quot;modif&amp;quot; &amp;gt;&amp;gt; test1.txt
$ svn commit -m &amp;quot;une modification&amp;quot;
Sending        test1.txt
Transmitting file data .
Committed revision 2.
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Authentification via apache&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
&amp;lt;VirtualHost *:80&amp;gt;
        ServerName svn.plop.org
        DocumentRoot /var/www/svn.moustik.org
        DirectoryIndex index.php
        CustomLog /var/log/httpd/svn.moustik.org.log combined
        ErrorLog /var/log/httpd/svn.moustik.org_err.log
        LogLevel warn

        &amp;lt;Location /svn&amp;gt;
                Order deny,allow
                Allow from all
                DAV svn
                SVNParentPath /home/svn
                AuthType Basic
                Require valid-user
                AuthName &amp;quot;SVN Plop&amp;quot;
                AuthUserFile /home/svn-auth/auth-user.conf
                AuthzSVNAccessFile /home/svn-auth/svn-auth.conf
        &amp;lt;/Location&amp;gt;
&amp;lt;/virtualhost&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Quelques explications sur la configuration du vhost&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Pour la partie authentification, nous avons :&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
AuthType Basic
Require valid-user
AuthName &amp;quot;SVN Plop&amp;quot;
AuthUserFile /home/svn-auth/auth-user.conf
&lt;/pre&gt;


&lt;p&gt;Pour renseigner les login/password pour l'authentification&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# htpasswd -c /home/svn-auth/auth-user.conf toto
New password: 
Re-type new password: 
Adding password for user toto
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Pour la partie permission, nous avons :&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
AuthzSVNAccessFile /home/svn-auth/svn-auth.conf
&lt;/pre&gt;


&lt;p&gt;Un exemple de fichier de configuration&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
[moustik:/]
* = rw

[moustik:/configuration]
ludo = rw
* =
&lt;/pre&gt;

&lt;p&gt;Dans cet exemple&amp;nbsp;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tout le monde à accès à la racine du repository moustik.&lt;/li&gt;
&lt;li&gt;Seul Ludo à accès au répertoire configuration&lt;/li&gt;
&lt;li&gt;A noter qu'il existe d'autres directives comme les groupes, etc.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Vous pouvez tester votre repository&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;Avec un mauvais utilisateur&amp;nbsp;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;svn co http://svn.moustik.org/svn/moustik&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Authentication realm: &amp;lt;http://svn.moustik.org:80&amp;gt; SVN moustik
Password for 'bulk':
Authentication realm: &amp;lt;http://svn.moustik.org:80&amp;gt; SVN moustik
Username: bulk
Password for 'bulk':
Authentication realm: &amp;lt;http://svn.moustik.org:80&amp;gt; SVN moustik
Username: bulk
Password for 'bulk':
svn: PROPFIND request failed on '/svn/moustik'
svn: PROPFIND of '/svn/moustik': authorization failed (http://svn.moustik.org)&lt;/p&gt;


&lt;p&gt;On s'authentifie&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# svn co http://svn.moustik.org/svn/moustik --username ludo
Authentication realm: &amp;lt;http://svn.moustik.org:80&amp;gt; SVN moustik
Password for 'ludo': 
A    moustik/configuration
A    moustik/configuration2
Checked out revision 3.
&lt;/pre&gt;

&lt;p&gt;Voilà de quoi mieux gérer vos fichiers de dev et de conf.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.moustik.org/2008/02/24/Subversion-et-httpd#comment-form</comments>
      <wfw:comment>http://www.moustik.org/2008/02/24/Subversion-et-httpd#comment-form</wfw:comment>
      <wfw:commentRss>http://www.moustik.org/feed/rss2/comments/12</wfw:commentRss>
      </item>
    
  <item>
    <title>Installation awstats 6.7</title>
    <link>http://www.moustik.org/2008/02/23/Installation-awstats-6.7</link>
    <guid isPermaLink="false">urn:md5:0859a820da147399b0cf1940bc3270f2</guid>
    <pubDate>Sat, 23 Feb 2008 23:26:00 +0100</pubDate>
    <dc:creator>Ludo</dc:creator>
        <category>Divers</category>
            
    <description>&lt;p&gt;Bon un petit article sur la mise en place awstats, l'outil bien connu qui nous donne des stats de fréquentations et autres renseignements sur les visiteurs.&lt;/p&gt;    &lt;p&gt;Awstats est un ensemble de script perl alors on commence par vérifier que notre apache possède le mod_perl.&lt;/p&gt;
&lt;pre&gt;
# httpd -t -D DUMP_MODULES
&lt;/pre&gt;

&lt;p&gt;Dans mon cas, je n'ai pas le module, on va commencer par l'installer, ici dans mon cas c'est un httpd 2.2.6 avec perl, libperl en version 5.8.8&lt;/p&gt;
&lt;pre&gt;
# cd ~/work/
# wget http://perl.apache.org/dist/mod_perl-2.0-current.tar.gz
# tar xvzf mod_perl-2.0-current.tar.gz
# cd mod_perl-2.0.3/
# perl Makefile.PL MP_APXS=/applis/httpd/bin/apxs \
&amp;gt; MP_APR_CONFIG=/applis/httpd/bin/apr-1-config
&lt;/pre&gt;

&lt;p&gt;Si vous rencontrez des erreurs pendant la construction, vérifiez qu'il ne vous manque pas de dépendances, pour moi il manquait la libperl-dev.
Si vous obtenez l'erreur suivante&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
&amp;quot;undefined symbol: strlcpy&amp;quot;
&lt;/pre&gt;

&lt;p&gt;Utiliser CPAN pour installer le module Cwd&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# cpan
cpan&amp;gt; install Cwd
&lt;/pre&gt;

&lt;p&gt;On installe&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# make
# make test
# make install
&lt;/pre&gt;

&lt;p&gt;Une fois construit, ajouter dans votre htpd.conf  et relancer apache&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
LoadModule perl_module          modules/mod_perl.so
&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;Partie awstats&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;On installe et on réarrange tout ca&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# cd /applis/
# wget http://kent.dl.sourceforge.net/sourceforge/awstats/awstats-6.7.tar.gz
# tar xvzf awstats-6.7.tar.gz
# ln -sf awstats-6.7 awstats
# cd awstats
# rm -rf docs README.TXT
# mv wwwroot html
# mv html/cgi-bin .
# rm -rf cgi-bin/plugins/example
# mkdir -p lib/awstat
# mkdir etc
&lt;/pre&gt;


&lt;p&gt;Ce qui doit donner une arborescence comme celle là&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
# tree -d
.
|-- cgi-bin
|   |-- lang
|   |   |-- tooltips_f
|   |   |-- tooltips_m
|   |   `-- tooltips_w
|   |-- lib
|   `-- plugins
|-- etc
|-- html
|   |-- classes
|   |   `-- src
|   |-- css
|   |-- icon
|   |   |-- browser
|   |   |-- clock
|   |   |-- cpu
|   |   |-- flags
|   |   |-- mime
|   |   |-- os
|   |   `-- other
|   `-- js
|-- lib
|   `-- awstats
`-- tools
    |-- webmin
    `-- xslt
&lt;/pre&gt;


&lt;p&gt;On va construire le fichier de configuration pour le site, pour cela awstats possède un fichier de configuration type, on va se baser dessus pour faire le notre&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# sed -e '/^#.*/d; /^$/d' &amp;lt; cgi-bin/awstats.model.conf &amp;gt; etc/awstats.www.toto.com.conf
&lt;/pre&gt;

&lt;p&gt;Ce qui nous donne un fichier épuré des commentaires et lignes vides. Dans le fichier de configuration, seules quelques lignes sont à renseigner pour obtenir une conf. fonctionnelle.&lt;/p&gt;

&lt;pre&gt;
LogFile=&amp;quot;/var/logs/httpd/toto.com.log&amp;quot;
LogType=W
LogFormat=1
LogSeparator=&amp;quot; &amp;quot;
SiteDomain=&amp;quot;toto.com&amp;quot;
HostAliases=&amp;quot;www.toto.com&amp;quot;
DNSLookup=2
DirData=&amp;quot;/applis/awstats/lib/awstats&amp;quot;
DirCgi=&amp;quot;/cgi-bin&amp;quot;
DirIcons=&amp;quot;/icon&amp;quot;
[...]
&lt;/pre&gt;

&lt;p&gt;On modifie les droits&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# chown -R httpd: {html,cgi-bin,lib}
&lt;/pre&gt;

&lt;p&gt;Par contre nous allons devoir modifier la fichier awtstats.pl manuellement car notre chemin d'accès est différent de ce qu'attend awstats par défaut.&lt;/p&gt;
&lt;pre&gt;
# vi cgi-bin/awstats.pl
&lt;/pre&gt;

&lt;p&gt;Chercher la ligne (1156) et placer le répertoire qui contiendra vos fichiers de conf awstats pour chaque domaine&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
else { @PossibleConfigDir=(&amp;quot;/applis/awstats/etc/&amp;quot;); }
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Niveau configuration apache&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Configuration du vhost&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
&amp;lt;VirtualHost *:7000&amp;gt;
        ServerName awstats.toto.com
        DocumentRoot /applis/awstats/html
        DirectoryIndex awstats.pl
        CustomLog /var/logs/httpd/awstats.toto.com.log combined
        ErrorLog /var/logs/httpd/err_awstats.toto.com.log

        Alias /awstatsclasses &amp;quot;/applis/awstats/html/classes/&amp;quot;
        Alias /awstatscss &amp;quot;/applis/awstats/html/css/&amp;quot;
        Alias /awstatsicons &amp;quot;/applis/awstats/html/icon/&amp;quot;
        ScriptAlias /awstats/ &amp;quot;/applis/awstats/cgi-bin/&amp;quot;

        &amp;lt;Location /awstats/&amp;gt;
                SetHandler perl-script
                PerlResponseHandler ModPerl::Registry
                PerlOptions +ParseHeaders
                Options +ExecCGI
                Order allow,deny 
                Allow from all
        &amp;lt;/Location&amp;gt;

        &amp;lt;Directory &amp;quot;/applis/awstats/html&amp;quot;&amp;gt;
                Options None
                AllowOverride None
                Order allow,deny
                Allow from all
        &amp;lt;/Directory&amp;gt;
&amp;lt;/VirtualHost&amp;gt;
&lt;/pre&gt;


&lt;p&gt;Pour lancer la génération des stats&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
# perl cgi-bin/awstats.pl -config=awstats.toto.com.conf update
&lt;/pre&gt;

&lt;p&gt;A vous de rajouter cela dans vos crontabs et autres ...&lt;/p&gt;


&lt;p&gt;Pour accéder à l'url de vos statistiques (supposant que le domaine de votre vhost soit awstats.toto.com)&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
http://awstats.toto.com:7000/awstats/awstats.pl?config=www.toto.com
&lt;/pre&gt;

&lt;p&gt;Perso, je déconseillerais de le laisser tel quel sur le net, un .htaccess pour protéger l'accès est indispensable.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.moustik.org/2008/02/23/Installation-awstats-6.7#comment-form</comments>
      <wfw:comment>http://www.moustik.org/2008/02/23/Installation-awstats-6.7#comment-form</wfw:comment>
      <wfw:commentRss>http://www.moustik.org/feed/rss2/comments/11</wfw:commentRss>
      </item>
    
  <item>
    <title>URL et dotclear2</title>
    <link>http://www.moustik.org/2008/02/16/URL-et-dotclear2</link>
    <guid isPermaLink="false">urn:md5:5aec435b49a0e04c45f42d6f3ca102bb</guid>
    <pubDate>Sat, 16 Feb 2008 14:13:00 +0100</pubDate>
    <dc:creator>Ludo</dc:creator>
        <category>Divers</category>
            
    <description>&lt;p&gt;Petit post qui n'a pas grand chose à voir avec l'administration quoiqu'il y a quand même quelques rewrite sous apache. Ces petites modifs ont pour but de mofifier les urls sous dotclear2.&lt;/p&gt;    &lt;p&gt;&lt;strong&gt;1.Côté dotclear&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Nous avons des urls du style&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
http://www.moustik.org/index.php/
&lt;/pre&gt;


&lt;p&gt;Nous voulons supprimer cet inutile (niveau esthétique) /index.php/&lt;/p&gt;


&lt;p&gt;Première chose à faire, modifier dans l'interface d'administration l'URL de base, par ex.&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
http://www.moustik.org
&lt;/pre&gt;


&lt;p&gt;Et aussi passer la &quot;Méthode de lecture d'URL&quot; à PATH_INFO&lt;/p&gt;


&lt;p&gt;Et là le site par en branle... normal. Dotclear s'attend à des urls de type&amp;nbsp;:&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;2.Côté rewrite&amp;nbsp;: supprimer /index.php/&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;
http://www.moustik.org/index.php/...
&lt;/pre&gt;


&lt;p&gt;Et nous on lui envoie du&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
http://www.moustik.org/...
&lt;/pre&gt;


&lt;p&gt;Pour rectifier l'url, on va devoir la réécrire afin de la rendre cohérente pour dotclear. Donc on va transformer&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
http://www.moustik.org/... -&amp;gt; http://www.moustik.org/index.php/...
&lt;/pre&gt;


&lt;p&gt;La rewrite correspondante est celle là&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
RewriteRule (.*)$ /index.php/$1
&lt;/pre&gt;


&lt;p&gt;Quelques explications sur cette ligne&amp;nbsp;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;.*&amp;nbsp;: chaine de caractères composé de 0 à n caractères.&lt;/li&gt;
&lt;li&gt;$&amp;nbsp;: fin de ligne&lt;/li&gt;
&lt;li&gt;()&amp;nbsp;: ouvre un espace mémoire pour stocker ce qu'on lui envoit, on pourra récupérer cette mémoire via la variable $1, $2, $3, etc. (dépend du nombre de mémoires utilisées).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Donc déjà une URL sera transformée comme ceci&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
http://www.moustik.org/toto.html -&amp;gt; http://www.moustik.org/index.php/toto.html
&lt;/pre&gt;


&lt;p&gt;Il y a des effets de bord, les css ne fonctionnent plus car&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
http://www.moustik.org/toto.css -&amp;gt; http://www.moustik.org/index.php/toto.css
&lt;/pre&gt;


&lt;p&gt;Il faut empecher l'écriture d'url sur les css, donc on va interdire le réécriture sur les url se terminant pas css, la règle devient&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
RewriteCond %{REQUEST_URI} !^(.*).css$
RewriteRule (.*)$ /index.php/$1
&lt;/pre&gt;


&lt;p&gt;Idem pour l'interface d'admin, ce qui donne&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
RewriteCond %{REQUEST_URI} !^(.*).css$
RewriteCond %{REQUEST_URI} !^/admin/(.*)$
RewriteRule (.*)$
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;3.Côté rewrite&amp;nbsp;: supprimer /post/&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Dans la continuité, on peut également supprimer de l'url &lt;strong&gt;/post/&lt;/strong&gt; qui compose l'adresse des articles, en gros on veut passer de&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
http://www.moustik.org/post/2008/02/16/Screen -&amp;gt; http://www.moustik.org/2008/02/16/Screen
&lt;/pre&gt;


&lt;p&gt;Modifier le fichier :&lt;strong&gt; inc/prepend.php&lt;/strong&gt;
Remplacer&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
$core-&amp;gt;url-&amp;gt;register('post','post','^post/(.+)$',array('dcUrlHandlers','post'));
&lt;/pre&gt;

&lt;p&gt;par&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
$core-&amp;gt;url-&amp;gt;register('post','','^post/(.+)$',array('dcUrlHandlers','post'));
&lt;/pre&gt;

&lt;p&gt;Et on créé la rewrite correspondante&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
RewriteCond %{REQUEST_URI} ^/([0-9]{4})/(.*)$
RewriteRule (.*)$ /index.php/post/$1 [L]
&lt;/pre&gt;

&lt;p&gt;La condition de cette rewrite est que si l'URI commence par un nombre de quatre chiffres (0000 à 9999), on la réécrit en lui ajoutant &lt;strong&gt;/index.php/post/&lt;/strong&gt; afin que dotclear s'y retrouve. La directive [L] (last) permet de spécifier que si l'URI 'matche' avec la règle, on s'arrète là, aucune autre règle ne sera lu.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;4.Côté dotclear&amp;nbsp;: inc/prepend.php&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Au niveau de dotclear, on doit modifier les urls car il manque des / devant les URI, donc on les rajoute dans dotclear dans le fichier prepend où les urls sont composées&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$ vi inc/prepend.php
&lt;/pre&gt;


&lt;p&gt;Remplacer&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$core-&amp;gt;url-&amp;gt;registerDefault(array('dcUrlHandlers','home'));
$core-&amp;gt;url-&amp;gt;register('lang','','^([a-zA-Z]{2}(?:-[a-z]{2})?(?:/page/[0-9]+)?)$',array('dcUrlHandlers','lang'));
$core-&amp;gt;url-&amp;gt;register('post','post','^post/(.+)$',array('dcUrlHandlers','post'));
$core-&amp;gt;url-&amp;gt;register('category','category','^category/(.+)$',array('dcUrlHandlers','category'));
$core-&amp;gt;url-&amp;gt;register('archive','archive','^archive(/.+)?$',array('dcUrlHandlers','archive'));
$core-&amp;gt;url-&amp;gt;register('feed','feed','^feed/(.+)$',array('dcUrlHandlers','feed'));
$core-&amp;gt;url-&amp;gt;register('trackback','trackback','^trackback/(.+)$',array('dcUrlHandlers','trackback'));
$core-&amp;gt;url-&amp;gt;register('rsd','rsd','^rsd$',array('dcUrlHandlers','rsd'));
$core-&amp;gt;url-&amp;gt;register('xmlrpc','xmlrpc','^xmlrpc/(.+)$',array('dcUrlHandlers','xmlrpc'));
&lt;/pre&gt;


&lt;p&gt;par&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$core-&amp;gt;url-&amp;gt;registerDefault(array('dcUrlHandlers','home'));
$core-&amp;gt;url-&amp;gt;register('lang','','^([a-zA-Z]{2}(?:-[a-z]{2})?(?:/page/[0-9]+)?)$',array('dcUrlHandlers','lang'));
$core-&amp;gt;url-&amp;gt;register('post','','^post/(.+)$',array('dcUrlHandlers','post'));
$core-&amp;gt;url-&amp;gt;register('category','/category','^category/(.+)$',array('dcUrlHandlers','category'));
$core-&amp;gt;url-&amp;gt;register('archive','/archive','^archive(/.+)?$',array('dcUrlHandlers','archive'));
$core-&amp;gt;url-&amp;gt;register('feed','/feed','^feed/(.+)$',array('dcUrlHandlers','feed'));
$core-&amp;gt;url-&amp;gt;register('trackback','/trackback','^trackback/(.+)$',array('dcUrlHandlers','trackback'));
$core-&amp;gt;url-&amp;gt;register('rsd','/rsd','^rsd$',array('dcUrlHandlers','rsd'));
$core-&amp;gt;url-&amp;gt;register('xmlrpc','/xmlrpc','^xmlrpc/(.+)$',array('dcUrlHandlers','xmlrpc'));
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;5.Côté dotclear&amp;nbsp;: plugins/metadata/_prepend.php&lt;/strong&gt;&lt;/p&gt;


&lt;p&gt;Nous avons le même problème pour les tags&lt;/p&gt;

&lt;pre&gt;
vi plugins/metadata/_prepend.php
&lt;/pre&gt;


&lt;p&gt;Remplacer&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$GLOBALS['core']-&amp;gt;url-&amp;gt;register('tag','tag','^tag/(.+)$',array('urlMetadata','tag'));
$GLOBALS['core']-&amp;gt;url-&amp;gt;register('tags','tags','^tags$',array('urlMetadata','tags'));
$GLOBALS['core']-&amp;gt;url-&amp;gt;register('tag_feed','feed/tag','^feed/tag/(.+)$',array('urlMetadata','tagFeed'));
&lt;/pre&gt;


&lt;p&gt;Par&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
$GLOBALS['core']-&amp;gt;url-&amp;gt;register('tag','/tag','^tag/(.+)$',array('urlMetadata','tag'));
$GLOBALS['core']-&amp;gt;url-&amp;gt;register('tags','/tags','^tags$',array('urlMetadata','tags'));
$GLOBALS['core']-&amp;gt;url-&amp;gt;register('tag_feed','/feed/tag','^feed/tag/(.+)$',array('urlMetadata','tagFeed'));
&lt;/pre&gt;


&lt;p&gt;&lt;strong&gt;Pour finir, les règles de réécriture ressemblent à cela&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pas de rewrite appliquées sur les URI se terminant par css&lt;/li&gt;
&lt;li&gt;Pas de rewrite appliquées sur les URI commencant par /admin/&lt;/li&gt;
&lt;li&gt;Pour les URI commencant par un nombre de 0000 à 9999, on prefixe l'URI avec /index.php/post/&lt;/li&gt;
&lt;li&gt;Pour les URI commencant par /category, /archive, /feed, /tag, /tags, /feed, /trackback, /rsd, /xmlrpc, on préfixe l'URI avec /index.php/&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;
RewriteEngine On

RewriteCond %{REQUEST_URI} !^(.*).css$
RewriteCond %{REQUEST_URI} !^/admin/(.*)$
RewriteCond %{REQUEST_URI} ^/([0-9]{4})/(.*)$
RewriteRule (.*)$ /index.php/post/$1 [L]

RewriteCond %{REQUEST_URI} ^/(page|category|archive|feed|tag|tags|feed|trackback|rsd|xmlrpc)(.*)$
RewriteRule (.*)$ /index.php/$1
&lt;/pre&gt;

&lt;p&gt;Voilà ca devrait couvrir les besoins de dotclear.&lt;/p&gt;</description>
    
    
    
          <comments>http://www.moustik.org/2008/02/16/URL-et-dotclear2#comment-form</comments>
      <wfw:comment>http://www.moustik.org/2008/02/16/URL-et-dotclear2#comment-form</wfw:comment>
      <wfw:commentRss>http://www.moustik.org/feed/rss2/comments/10</wfw:commentRss>
      </item>
    
</channel>
</rss>