ka.da

Accueil | Tags | Archives

Keyword - programmation

Fil des billets - Fil des commentaires

Mercurial : partage de dépôts différents en http et https + push par https

J'ai commencé à regarder du côté des SCM[1] (marre de la gestion CPOLD ;-) il y a quelque temps déjà, et m'était tout d'abord arrêté sur Subversion [2] étant novice en la matière. Il s'est vite révélé peu adapté à ma pratique : "développement" sur plusieurs machines pas toujours online, et pas de serveur dédié toujours en ligne pour stocker mes dépôts. Depuis peu, ce dernier problème s'est réglé (merci Gandi Hébergement[3]) mais pour autant, j'ai abandonné Subversion pour Mercurial, un gestionnaire de code source distribué.

Je ne vais pas entrer ici dans les détails sur les caractéristiques d'un gestionnaire de code source distribué, ses avantages, ou même sur une présentation détaillée sur Mercurial et son mode de fonctionnement (je vous laisse visiter le site officiel pour cela). Je vais uniquement présenter des détails sur la configuration que j'ai mise en place afin de parvenir à partager aisément des dépôts différents via http et https, ainsi que comment faire pour autoriser la mise à jour de ceux-ci via https.


présentation des dépôts Mercurial sur le web


Imaginons que vos dépôts soient stockés dans /mercurial et que vous vouliez pouvoir donner un accès en lecture sur le web, à l'adresse http://hg.domain.tld. Nous allons configurer Apache et Mercurial pour ce faire.

Tout d'abord, nous allons créer un emplacement pour les fichiers web et le script CGI en Python pour Mercurial. Prenons /var/www/domain.tld/hg. Créons à cet endroit un répertoire hgweb dans lequel nous allons placer le script hgwebdir.cgi que vous pouvez trouver sur votre système (sous Debian /usr/share/doc/mercurial/examples/hgwebdir.cgi) ou sur le site de Mercurial. Éditez ce fichier pour avoir à la fin :

def make_web_app():
    return hgwebdir("/etc/mercurial/hgweb.config")

Nous allons ensuite créer le fichier /etc/mercurial/hgweb.config avec un contenu comme suit :

[paths]
depot1  =  /mercurial/depot1
depot2  =  /mercurial/depot2

On peut également utiliser la directive [collections] pour partager une hiérarchie de dépôts mais nous partons du principe que l'on veut contrôler précisément ce que l'on partage.

À partir de là, il nous reste à configurer Apache. Créez un fichier /etc/apache2/sites-available/hg.domain.tld afin de déclarez votre VirtualHost. Voici en exemple mon fichier

NameVirtualHost *:80

<VirtualHost *:80>
    ServerAdmin webmaster@hg.domain.tld

    ServerName hg.domain.tld  

    DocumentRoot /var/www/domain.tld/hg

    <Directory /var/www/domain.tld/hg/>
        Options FollowSymLinks +ExecCGI
        AddHandler cgi-script .cgi
        DirectoryIndex hgweb/hgwebdir.cgi
        AllowOverride None

        RewriteEngine on
        RewriteBase /hgweb
        RewriteRule ^$ hgwebdir.cgi  [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule (.*) hgwebdir.cgi/$1  [QSA,L]
    </Directory>

    LogLevel warn
    ErrorLog /var/log/apache2/hg.domain.tld-error.log
.   CustomLog /var/log/apache2/hg.domain.tld-access.log combined
    
    ServerSignature Off
</VirtualHost>

Notez ici les règles de réécriture qui permettent de faire disparaître hgwebdir.cgi de vos URL. C'est ce qui m'a pris le plus de temps à trouver avant de tomber sur cette doc.

Activez votre nouveau "site" ainsi que les modules Apache dont vous aurez besoin

# a2ensite hg.domain.tld
# a2enmod mod_python
# a2enmod rewrite
# /etc/init.d/apache2 restart

Vous pouvez maintenant aller voir http://hg.domain.tld et parcourir vos dépôts Mercurial depot1 et depot2


partager des dépôts différents par https


Tout ça, c'est très bien, mais on aimerait également pouvoir avoir accès à certains dépôts que l'on ne veut pas donner en lecture à tout internet : des dépôts privés en somme. Nous allons donc partager ceux-ci sur un site sécurisé avec authentification.

Nous allons donc retourner dans notre répertoire /var/www/domain.tld/hg/hgweb, copier hgwebdir.cgi en hgwebdirssl.cgi et éditez ce fichier pour avoir :

def make_web_app():
    return hgwebdir("/etc/mercurial/hgwebssl.config")

Créons le fichier /etc/mercurial/hgwebssl.config avec :

[paths]
depot1  =  /mercurial/depot1
depot2  =  /mercurial/depot2
depot_prive3 = /mercurial/depot3
depot_prive4 = /mercurial/depot4

Et retournons éditer /etc/apache2/sites-available/hg.domain.tld pour y ajouter :

# en haut du fichier
NameVirtualHost *:443

# à la fin du fichier
<VirtualHost *:443>
    ServerAdmin webmaster@hg.domain.tld

    ServerName hg.domain.tld

    DocumentRoot /var/www/domain.tld/hg

    SSLEngine on
    SSLCertificateFile /etc/apache2/ssl/hg.domain.tld.pem
    SSLCertificateKeyFile /etc/apache2/ssl/hg.domain.tld.key

    <Directory /var/www/domain.tld/hg/>
        Options FollowSymLinks +ExecCGI
        AddHandler cgi-script .cgi
        DirectoryIndex hgweb/hgwebdirssl.cgi
        AllowOverride None

        RewriteEngine on
        RewriteBase /hgweb
        RewriteRule ^$ hgwebdirssl.cgi  [L]
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule (.*) hgwebdirssl.cgi/$1  [QSA,L]

        AuthUserFile /etc/mercurial/hgweb.htpasswd
        AuthGroupFile /dev/null
        AuthName "hg.domain.tld Mercurial repository"
        AuthType Basic
#       <LimitExcept GET OPTIONS>
                Require valid-user
#       </LimitExcept>
    </Directory>

    ErrorLog /var/log/apache2/hg.domain.tld-error.log

    LogLevel warn

    CustomLog /var/log/apache2/hg.domain.tld-access.log combined
    ServerSignature Off

</VirtualHost>

On retrouve ici les directives rewrite que nous avons utilisé dans la première partie, à la différence qu'elles pointent vers le CGI spécifique à notre configuration SSL, et quelques directives spécifiques justement à https/SSL. Bien évidemment, il vous faudra créer un fichier de mots de passe (nommé ici hgweb.htpasswd) avec :

# htpasswd -c /etc/mercurial/hgweb.htpasswd hguser

pour autoriser l'utilisateur hguser.

Notez les directives <LimitExcept GET OPTIONS> qui, si elles sont décommentées, permettent à tout le monde de visualiser les dépôts tout en demandant une authentification pour interagir via les commandes de Mercurial (clone, pull, push...).

Rechargez la configuration d'Apache et regardez la différence entre http://hg.domain.tld et https://hg.domain.tld


autoriser la mise à jour des dépôts via https


Pour autoriser le push via https, une fois le travail ci-dessus effectué, il suffit d'éditer la configuration des dépôts en modifiant le fichier .hg/hgrc de chaque projet. Éditez-le ou créez-le et insérez les lignes suivantes :

[web]
allow_push = hguser


utilisation


Voilà c'est fait, vous pouvez maintenant interagir très simplement avec vos dépôts Mercurial. Pour cloner un dépôt public

$ hg clone http://hg.domain.tld/depot1

Pour cloner un dépôt privé

$ hg clone https://hguser@hg.domain.tld/depot_prive3

Pour mettre à jour (push) ce même dépôt

$ hg push https://hguser@hg.domain.tld/depot_prive3

J'ajouterais que le plus dur est de gérer finement les droits d'accès aux divers fichiers nécessaires au bon fonctionnement de cette configuration. Pour faire simple, comme d'habitude, laissez le minimum de droits sur les fichiers de configuration (appartenance à l'utilisateur www-data et lecture pour lui), et pour les dépôts j'ai choisi la solution un groupe devel pour mon utilisateur principal ainsi que www-data et les droits pour ce groupe.

Notes

[1] définition en français et en anglais

[2] cf cet article

[3] je sais que je n'ai pas parlé de cette nouvelle offre très intéressante de Gandi le registrar bien connu (pour sa qualité de service, son support et son engagement) alors allez voir le bar de gandi

petit script Python pour récupérer des listes de voisins last.fm

Pour ceux qui ne connaissent pas encore Last fm : (présentation rapide) c'est une communauté pour tous ceux qui aiment et écoutent de la musique. Vous vous créez un compte, vous configurez votre lecteur de musique favori avec ce compte, et ensuite ce que vous écoutez apparait sur votre profil last.fm... voilà pour le début, ensuite vous pouvez tagger les morceaux, artistes écoutés, rejoindre ou créer des groupes, écrire des journaux, découvrir de la musique grâce à vos voisins, et grâce aux radios disponibles sur le site....... bref, plein de possibilités mais je vous conseille d'aller lire la FAQ si vous voulez plus d'informations.

Tout ça pour dire que ça fait déjà un an et demi que je m'y suis inscrit, que j'ai déjà "scrobblé" près de 5000 morceaux, que j'ai quelques "amis" et une multitude de voisins, que je suis abonné à 63 groupes exactement mais que c'est en constante évolution[1] et que j'ai voulu essayer de voir si sur un groupe donné, on retrouvait les mêmes voisins parmi les membres. J'ai donc écrit un petit script Python qui, même si il n'est pas parfait (cf TODO) a le mérite de faire ce qu'on lui demande.

#! /usr/bin/python -tt

## TODO ##
# recuperation de la liste des membres d'un groupe
# rendre le script portable en enlevant l'appel a wget

import os
import re

# liste à compléter
membres = ['gal33Za']

for membre in membres:
    os.system('wget http://ws.audioscrobbler.com/1.0/user/%s/neighbours.txt -O voisins-%s'%(membre,membre))

fichiers = ['voisins-'+x for x in membres ]

voisins = {}

for fichier in fichiers:
    f = open(fichier, "r")

    for line in f.readlines():
        v, voisin = line.split(",")
        voisin = voisin[:-1]
       
        if voisin in voisins:
            voisins[voisin] = voisins[voisin] + 1
        else:
            voisins[voisin] = 1
    #endfor
   
    f.close
#endfor


# pour afficher avant tri
#for key, value in voisins.iteritems():
#   print str(value) + " : " + str(key)

### tri de dictionnaire
### cf    http://aspn.activestate.com/ASPN/Python/Cookbook/Recipe/52306

voisinsRanges = sorted(voisins.items(), key=lambda (k,v): (v,k), reverse=True)

for voisin in voisinsRanges:
    nom, nombre = voisin;

    # pour générer une liste simple
    #print str(nom) + " : " + str(nombre)

    # pour générer du BBcode
    print "[url=http://www.last.fm/user/" + str(nom) + "]" + str(nom) + "[/url] : " + str(nombre)
   
    # pour générer du HTML
    #print "<a href=\"http://www.last.fm/user/" + str(nom) + "\">" + str(nom) + "</a> : " + str(nombre)
#endfor

# endscript

ps : je ne sais pas si ça vous a intéressé, mais en tout cas, ça prouve que je ne suis pas mort...

Notes

[1] le nombre de groupes existants est énorme et il y en a pour tous les goûts : des musicaux (Post-Rock Instrumental, Godspeed You! Black Emperor, radiohead, Mogwai, Noir Desir, Constellation Records, Indie and Alternative...), des géographiques (France, EU), des "geeks" (Amarok Users, Debian Linux, jabber, Vi (oui, le bon vieux troll vi vs emacs se retrouve également sur last.fm), des "politiques" (I Still Buy CDs, Music fans and Musicians against the RIAA, I don't have an iPod, Shove your DRM up your ass, NO 2 ID, I Hate Football) ou conceptuels dont certains dont le nom seul oblige à s'inscrire (I Don't Mean To Come Off As A Music Snob, I Grew Up In A Small Town and Suprisingly I Listen to Good Music!, Non aux Red Hot en tête de Charts, , The Black Background Users, People who join too many groups) etc, etc, etc

développement Python

J'ai récemment eu envie de me remettre au développement, ayant 2-3 projets dans le coin de ma tête. Et je me suis dit que j'allais me mettre à Python, langage interprété, multiplateforme et libre bien évidemment. C'est un peu le langage à la mode en ce moment[1] et après être tombé sur moults articles en traitant[2] et projets l'utilisant[3], je me suis décidé.
Je me suis également intéressé à la problématique de gestion de version pour gérer un projet informatique, surtout à plusieurs. CVS en est le représentant historique dans le monde du logiciel libre, mais depuis peu une foule de nouveaux outils sont apparus[4], et après un bref passage du côté de Mercurial, je me suis finalement décidé sur Subversion dont l'approche et le mode centralisé sont plus simples à appréhender.

Voici donc une série de ressources que j'ai retenu pour le développement en Python et l'utilisation de Subversion:

Vous en voulez plus ? allez voir l'article Cours pour apprendre Python sur biologeek.org pour plus de liens.

  • les outils ensuite :
    • Eclipse est un IDE écrit en Java et initialement prévu pour ce langage, mais qui à l'aide de nombreux plugins s'adaptent à d'autres langages. Essayez-le et appréciez;
    • Pydev est le plugin pour développer en Python avec Eclipse, et une doc;
    • Subclipse quant à lui est le plugin pour travailler avec Subversion;
    • la société Edgewall met à disposition un très bon outil pour gérer un projet basé sur Subversion, c'est Trac[6], mais elle propose également une Python Sidebar pour avoir dans votre navigateur favori la référence Python directement accessible.

J'ai parcouru ensuite le web de tutoriel en tutoriel pour réussir à installer de façon satisfaisante Subversion + Trac sur ma Debian mais ceux que j'ai trouvé marchaient plus ou moins bien[7] , jusqu'à celui-ci Installer et configurer Apache2, Trac et Subversion sur Ubuntu sur Prendre Un Café. Il concerne Ubuntu mais marche tout aussi bien pour Debian testing/etch.

update : je viens à peine de finir ce billet que je tombe sur un tuto Eclipse pour le développement web, PHP et Python sous Dapper. Pour Debian, j'ai eu des problèmes pour installer un plugin (Pydev il me semble) parce que la dernière version proposée était la 3.1 et qu'il me fallait la 3.2.

Notes

[1] mais j'aurais également pu choisir Ruby pour cette même raison :)

[2] dont Pourquoi programmer en Python ? sur biologeek.org

[3] dont Xen ou tout au moins sont interface d'administration, n'est pas le moindre

[4] voir une liste

[5] apt-get install diveintopython

[6] outil proposant un Wiki, un browser du code, un gestionnaire de tickets,... Il est utilisé par Dotclear notamment

[7] je parle de ceux de destination-linux.org, PrO²jects, xhtml.net, ou le site de Trac. Ils sont peut-être corrects mais je les ai trouvés moins directs que celui de Prendre Un Café...

Java devient open source

Il semblerait que cette fois ça y est, Sun a décidé de rendre Java Open Source. C'est le nouveau PDG Jonathan Schwartz qui vient de l'annoncer mais pour l'instant les détails restent inconnus.
Cela faisait bien longtemps que la communauté open source et les développeurs Java le demandaient afin de contrer l'offre alternative : .Net de Microsoft. Dernièrement, IBM en avait ajouté une couche en demandant également cette libération du code de Java.
Peut-être qu'enfin, on a vu chez Java que cette demande était fondée, et que ça ne pouvait que bénéficier à Java[1] face à des alternatives comme .Net bien sûr, mais également face à la montée en puissance de PHP, Python, et Ruby (avec Ruby on Rails) qui sont les stars open source du moment dans le développement (tout au moins web) (cf par ex. cette article de 01 sur Ruby on Rails)

En tout cas, c'est un 'must' des trolls sur linuxfr.org qui tombe... le fameux "Java, çapuecpaslibre !" :-)

Et en plus, Sun prévoit de supporter Ubuntu sur sa ligne de serveur T1... que de changements..

[via Linox.be ici & ]

Notes

[1] je l'espère en tout cas

marre de l'internet social ? (et autres...)

Si vous aussi vous en avez marre de ce nouvel internet social, de ces communautés qui se forment sur tout et n'importe quoi (les goûts musicaux, l'origine géographique, le navigateur web utilisé, votre pointure, etc.), de ce "web 2.0", de cette idée selon laquelle "l'internet sera social ou ne sera pas"[1], alors dans ce cas, isolatr.com est fait pour vous...

Si vous vous demandez depuis toujours ce que sont ces 'foo', 'bar, 'foobar' et autres 'baz', 'qux', 'quux'..., que l'on croise de temps en temps dans les docs informatiques en langue anglaise, alors allez consulter cette RFC (qu'est-ce qu'une RFC ?)

Si les méthodes Merise, RAD ou Extreme Programming vous sont déjà connues, mais ne vous ont pas satisfaites, vous pouvez toujours essayer la méthodologie de La Rache, bien connue des meilleures universités informatiques.

[via Michael Noll et Alexandre Dulaunoy à l'origine de GooDiff (cf billet précédent)]

Notes

[1] euh, cherchez pas, c'est de moi ! :)