Version 0.2 de auf-referentiels :
authorProgfou <jean-christophe.andre@auf.org>
Thu, 25 Jun 2009 02:52:03 +0000 (09:52 +0700)
committerProgfou <jean-christophe.andre@auf.org>
Thu, 25 Jun 2009 03:26:04 +0000 (10:26 +0700)
  * Utilisation d'un compte (et groupe) dédié : auf-referentiels
  * Création de postinst/postrm et adaptation du cron.d en conséquence.
  * Ajout du choix de l'URL de base via debconf et changement de la
    valeur par défaut pour http://intranet.auf/auf-referentiels/
  * Création de fichiers de configuration pour Apache 2.x et Nginx.
  * Création d'une page de manuel et mise à jour du README.

16 files changed:
Makefile
README
apache.conf [new file with mode: 0644]
auf-referentiels
debian/auf-referentiels.8 [new file with mode: 0644]
debian/auf-referentiels.dirs [deleted file]
debian/changelog
debian/config [new file with mode: 0644]
debian/control
debian/cron.d
debian/dirs [new file with mode: 0644]
debian/lintian-overrides [new file with mode: 0644]
debian/manpages [new file with mode: 0644]
debian/postinst [new file with mode: 0644]
debian/postrm [new file with mode: 0644]
debian/templates [new file with mode: 0644]

index 6ce7fa8..2eb248f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -9,6 +9,8 @@ install:
        install -m 0755 -d $(DESTDIR)/usr/sbin
        install -m 0755 auf-referentiels $(DESTDIR)/usr/sbin/
        install -m 0755 -d $(DESTDIR)/usr/share/auf-referentiels
+       install -m 0755 -d $(DESTDIR)/etc/apache2/conf.d
+       install -m 0644 apache.conf $(DESTDIR)/etc/apache2/conf.d/auf-referentiels.conf
 
 clean:
 
diff --git a/README b/README
index 6ac31ec..dfa764f 100644 (file)
--- a/README
+++ b/README
@@ -1,17 +1,17 @@
-Pré-requis :
-- avoir accès au RPV, en particulier à http://intranet.auf/
+Pré-requis : avoir accès à un serveur web servant les référentiels AuF.
+Par défaut il faut avoir accès à http://intranet.auf/ et donc au RPV.
+Mais ce paquet peut aussi servir à mettre en place un tel serveur web.
 
 Ce paquet effectuera une copie puis une mise à jour automatique des
 référentiels AuF sélectionnés.
 
-La sélection des référentiels se fait dans "/etc/auf-referentiels.conf".
-
+La sélection des référentiels se fait avec la commande "auf-referentiels".
 La copie sera déposée dans "/usr/share/auf-referentiels/" au format JSON.
 
 La mise à jour sera effectuée automatiquement chaque jour à 7h et à 13h.
-On peut aussi la forcer manuellement avec "sudo update-auf-referentiels".
+On peut aussi la forcer manuellement avec "sudo auf-referentiels -u".
 
 Le processus de mise à jour est optimisé pour ne faire un téléchargement
 que s'il y a eu des changements depuis le téléchargement précédent.
 
- -- Progfou <jean-christophe.andre@auf.org>  Tue, 23 Jun 2009 12:58:21 +0700
+ -- Progfou <jean-christophe.andre@auf.org>  Thu, 25 Jun 2009 05:21:58 +0700
diff --git a/apache.conf b/apache.conf
new file mode 100644 (file)
index 0000000..f437d11
--- /dev/null
@@ -0,0 +1,9 @@
+Alias /auf-referentiels/ /usr/share/auf-referentiels/
+
+<Location /auf-referentiels>
+  Order deny,allow
+  Deny from All
+  Allow from 127.0.0.0/255.0.0.0
+  Allow from 10.0.0.0/255.0.0.0
+  Options Indexes
+</Location>
index 685c8a2..80458cb 100755 (executable)
@@ -9,17 +9,25 @@ Auteur : Progfou <jean-christophe.andre@auf.org>
 Dépendances Debian : python >= 2.5
 """
 
-URL_BASE = 'http://intranet.auf/cgi-bin/auf/'
+PROG_NAME = 'auf-referentiels'
+RUN_USER = 'auf-referentiels'
 DIR_BASE = '/usr/share/auf-referentiels/'
+URL_BASE = 'http://intranet.auf/auf-referentiels/'
 
-__all__ = ( 'URL_BASE', 'DIR_BASE' )
+f = file('/etc/auf-referentiels.conf')
+lines = filter(lambda l: not l.startswith('#'), f.readlines())
+config = dict(map(lambda l: map(lambda s: s.strip(), l.split('=')), lines))
+
+URL_BASE = config.get('URL_BASE', URL_BASE).rstrip('/') + '/'
+
+__all__ = ( 'RUN_USER', 'DIR_BASE', 'URL_BASE' )
 
 USAGE = """Usages (à lancer en tant que "root", par exemple via "sudo") :
-  update-auf-referentiels -a <ref> - copie un nouveau référentiel
-  update-auf-referentiels -d <ref> - supprime un référentiel
-  update-auf-referentiels -u       - met à jour les référentiels
-  update-auf-referentiels -l       - liste les référentiels copiés
-  update-auf-referentiels -L       - liste les référentiels disponibles
+  auf-referentiels [-f] -a <ref> - copie un nouveau référentiel
+  auf-referentiels -d <ref>      - supprime un référentiel
+  auf-referentiels [-f] -u       - met à jour les référentiels
+  auf-referentiels -l            - liste les référentiels copiés
+  auf-referentiels -L            - liste les référentiels disponibles
 
 L'option -f permet de forcer le rechargement à travers un proxy/cache.
 """
@@ -28,11 +36,12 @@ TIME_FORMAT = '%a, %d %b %Y %H:%M:%S GMT'
 
 from sys import argv, exit, stderr
 from getopt import getopt, GetoptError
-from os import listdir, utime, unlink
+from pwd import getpwnam
+from os import getuid, setgid, setuid, listdir, utime, unlink
 from os.path import join, exists, getmtime
 from time import gmtime, strftime
 from calendar import timegm
-from urllib2 import Request, urlopen, HTTPError
+from urllib2 import Request, urlopen, HTTPError, URLError
 from cStringIO import StringIO
 from gzip import GzipFile
 from simplejson import loads
@@ -50,9 +59,10 @@ def update_referentiel(referentiel, force=False):
     else:
         # fichier vide à date très ancienne pour déclencher la synchro
         try:
+            switch_user()
             file(filename, 'a').close()
-        except IOError:
-            raise RuntimeError, u"Écriture refusée, réessayez avec 'sudo' !"
+        except IOError, msg:
+            raise RuntimeError, u"Création refusée : %s" % msg
         utime(filename, (0, 0))
     url = URL_BASE + referentiel
     req = Request(url, None, headers)
@@ -61,7 +71,11 @@ def update_referentiel(referentiel, force=False):
     except HTTPError, e:
         if e.code == 304:
             return
-        raise RuntimeError, u"Impossible d'ouvrir l'URL '%s'." % url
+        raise RuntimeError, \
+            u"L'URL suivante renvoie un code d'erreur %s :\n  %s" \
+                                                        % (e.code, url)
+    except URLError:
+        raise RuntimeError, u"L'URL suivante est inaccessible :\n  %s" % url
     i = u.info()
     if referentiel.endswith('.json') and i.type != 'application/json':
         u.close()
@@ -77,9 +91,10 @@ def update_referentiel(referentiel, force=False):
             raise RuntimeError, u"Les données ne sont pas au format JSON."
     # si on est arrivé jusqu'ici c'est que tout va bien... on enregistre !
     try:
+        switch_user()
         f = file(filename, 'wb')
-    except IOError:
-        raise RuntimeError, u"Écriture refusée, réessayez avec 'sudo' !"
+    except IOError, msg:
+        raise RuntimeError, u"Écriture refusée : %s" % msg
     f.write(data)
     f.close()
     # on fixe la date donnée par le serveur, le cas échéant
@@ -88,30 +103,33 @@ def update_referentiel(referentiel, force=False):
         mtime = timegm(mtime)
         utime(filename, (mtime, mtime))
 
-def referentiels_list():
-    referentiels = []
-    for referentiel in listdir(DIR_BASE):
-        if referentiel.endswith('.json'):
-            referentiels.append(referentiel)
-    return referentiels
-
 def add_referentiel(referentiel, force=False):
-    if referentiel in referentiels_list():
+    if referentiel in listdir(DIR_BASE):
         raise RuntimeError, \
             u"Référentiel '%s' déjà ajouté auparavant." % referentiel
     update_referentiel(referentiel, force)
 
 def delete_referentiel(referentiel):
-    if not referentiel in referentiels_list():
+    if not referentiel in listdir(DIR_BASE):
         raise RuntimeError, u"Référentiel '%s' absent." % referentiel
-    unlink(join(DIR_BASE, referentiel))
+    try:
+        switch_user()
+        unlink(join(DIR_BASE, referentiel))
+    except IOError, msg:
+        raise RuntimeError, u"Suppression refusée : %s" % msg
 
 def update_referentiels(force=False):
-    for referentiel in referentiels_list():
-        update_referentiel(referentiel, force)
+    error_messages = []
+    for referentiel in listdir(DIR_BASE):
+        try:
+            update_referentiel(referentiel, force)
+        except Exception, msg:
+            error_messages.append(msg.__str__())
+    if error_messages:
+        raise RuntimeError, u'\n'.join(error_messages)
 
 def list_referentiels():
-    for referentiel in referentiels_list():
+    for referentiel in listdir(DIR_BASE):
         print referentiel
 
 def list_referentiels_available():
@@ -128,7 +146,29 @@ def list_referentiels_available():
     for referentiel in sorted(referentiels):
         print "%-16s : %s" % (referentiel, referentiels[referentiel])
 
+_user_switched = False
+def switch_user(username=RUN_USER):
+    global _user_switched
+    if _user_switched:
+        return
+    try:
+        pw = getpwnam(username)
+    except KeyError:
+        raise RuntimeError, u"L'utilisateur '%s' n'existe pas." % username
+    try:
+        setgid(pw.pw_gid)
+        setuid(pw.pw_uid)
+    except OSError:
+        raise RuntimeError, \
+            u"Impossible de basculer vers l'utilisateur '%s'.\n" \
+            u"Réessayez avec 'sudo' !" % username
+    _user_switched = True
+
 if __name__ == '__main__':
+    # interdiction formelle de tourner sous 'root'
+    if getuid() == 0:
+        switch_user()
+
     try:
         opts, args = getopt(argv[1:], 'hfa:d:ulL', ['help', 'force',
             'add=', 'delete=', 'update', 'list', 'list-available'])
@@ -156,7 +196,7 @@ if __name__ == '__main__':
                 elif opt in ('-L', '--list-available'):
                     list_referentiels_available()
             except RuntimeError, msg:
-                print >>stderr, u'ATTENTION : %s' % msg
+                print >>stderr, u'%s' % msg
 
     if not opts:
         print USAGE
diff --git a/debian/auf-referentiels.8 b/debian/auf-referentiels.8
new file mode 100644 (file)
index 0000000..8d03738
--- /dev/null
@@ -0,0 +1,51 @@
+.TH AUF-REFERENTIELS 8 "25 juin 2009"
+.\"
+.\" Some roff macros, for reference:
+.\" .nh        disable hyphenation
+.\" .hy        enable hyphenation
+.\" .ad l      left justify
+.\" .ad b      justify to both left and right margins
+.\" .nf        disable filling
+.\" .fi        enable filling
+.\" .br        insert line break
+.\" .sp <n>    insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+.SH NAME
+auf-referentiels \- outil de copie et mise à jour des réferentiels AuF
+.SH SYNOPSIS
+\fBauf-referentiels\fP [\fB-f\fP] \fB-a\fP \fIreferentiel\fP
+.br
+\fBauf-referentiels\fP \fB-d\fP \fIreferentiel\fP
+.br
+\fBauf-referentiels\fP [\fB-f\fP] \fB-u\fP
+.br
+\fBauf-referentiels\fP \fB-h\fP | \fB-l\fP | \fB-L\fP
+.SH DESCRIPTION
+Cette page de manuel documente brièvement la commande \fBauf-referentiels\fP.
+.PP
+.SH OPTIONS
+Ce programme suit la syntaxe habituelle d'une ligne de commande GNU,
+avec des options longues commençant par deux tirets (`-').
+.TP
+.B \-h, \-\-help
+Montre un résumé des options.
+.TP
+.B \-a, \-\-add
+Copie un nouveau référentiel. Il sera ensuite mis à jour, soit automatiquement à 7h et 13h (en heure locale), soit manuellement avec l'option \fB-u\fP. L'option \fB-f\fP permet de forcer le chargement à travers un proxy/cache.
+.TP
+.B \-d, \-\-delete
+Supprime un référentiel.
+.TP
+.B \-u, \-\-update
+Met à jour les référentiels immédiatement. L'option \fB-f\fP permet de forcer le chargement à travers un proxy/cache.
+.TP
+.B \-l, \-\-list
+Liste les référentiel copiés.
+.TP
+.B \-L, \-\-list-available
+Liste les référentiel disponibles. Cette liste est obtenue depuis un référentiel spécial nommé \fBreferentiels.json\fP.
+.SH AUTEUR
+L'outil auf-referentiels a été écrit par Progfou <jean-christophe.andre@auf.org>.
+.PP
+Cette page de manuel a été écrite par Progfou <jean-christophe.andre@auf.org>,
+pour le projet Debian (mais peut être utilisé par d'autres).
diff --git a/debian/auf-referentiels.dirs b/debian/auf-referentiels.dirs
deleted file mode 100644 (file)
index cd6d7aa..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-usr/sbin
-usr/share/auf-referentiels
index 73035d3..a350339 100644 (file)
@@ -1,3 +1,14 @@
+auf-referentiels (0.2) jaunty; urgency=low
+
+  * Utilisation d'un compte (et groupe) dédié : auf-referentiels
+  * Création de postinst/postrm et adaptation du cron.d en conséquence.
+  * Ajout du choix de l'URL de base via debconf et changement de la
+    valeur par défaut pour http://intranet.auf/auf-referentiels/
+  * Installation d'un fichier de configuration pour Apache 2.x.
+  * Création d'une page de manuel et mise à jour du README.
+
+ -- Progfou <jean-christophe.andre@auf.org>  Thu, 25 Jun 2009 09:51:44 +0700
+
 auf-referentiels (0.1) jaunty; urgency=low
 
   * L'outil est fonctionnel, allons-y pour un empaquetage Debian.
diff --git a/debian/config b/debian/config
new file mode 100644 (file)
index 0000000..8aafdcd
--- /dev/null
@@ -0,0 +1,38 @@
+#!/bin/sh
+
+set -e
+
+DEFAULT="http://intranet.auf/auf-referentiels"
+
+. /usr/share/debconf/confmodule
+
+priority="medium"
+if [ -x /usr/bin/lsb_release ]; then
+  case "`lsb_release -si`" in
+    Ubuntu)
+      priority="low"
+      ;;
+  esac
+fi
+
+db_get auf-referentiels/url_base || true
+if [ "$RET" = "" ] ; then
+  db_set auf-referentiels/url_base "$DEFAULT"
+fi
+
+db_input $priority auf-referentiels/url_base || true
+db_go
+
+db_get auf-referentiels/url_base || true
+if [ "$RET" = "" ] ; then
+  db_set auf-referentiels/url_base "$DEFAULT"
+  RET="$DEFAULT"
+fi
+
+cat << __EOF__ > /etc/auf-referentiels.conf
+# ATTENTION : ce fichier est géré par debconf, ne l'éditez pas directement !
+# Utilisez plutôt cette commande : dpkg-reconfigure -p low auf-referentiels
+URL_BASE=$RET
+__EOF__
+
+exit 0
index c5cde55..858f42d 100644 (file)
@@ -8,7 +8,7 @@ Homepage: http://git.auf.org/?p=auf-poste-client;a=tree;f=auf-referentiels
 
 Package: auf-referentiels
 Architecture: all
-Depends: python (>= 2.5), python-simplejson
+Depends: ${misc:Depends}, adduser, python (>= 2.5), python-simplejson
 Description: outil de copie et mise à jour des réferentiels AuF
  Ce paquet fournit un outil permettant de copier puis de mettre régulièrement
  à jour une sélection des référentiels AuF.
index 05de4df..6fd4195 100644 (file)
@@ -1 +1 @@
-0 7,13 * * *   root    [ -x /usr/sbin/auf-referentiels ] && /usr/sbin/auf-referentiels -u
+0 7,13 * * *   auf-referentiels        [ -x /usr/sbin/auf-referentiels ] && /usr/sbin/auf-referentiels -u
diff --git a/debian/dirs b/debian/dirs
new file mode 100644 (file)
index 0000000..fb26ab7
--- /dev/null
@@ -0,0 +1,4 @@
+usr/sbin
+usr/share/auf-referentiels
+etc/nginx/conf.d
+etc/apache2/conf.d
diff --git a/debian/lintian-overrides b/debian/lintian-overrides
new file mode 100644 (file)
index 0000000..5d20dd3
--- /dev/null
@@ -0,0 +1,2 @@
+auf-referentiels: maintainer-not-full-name Progfou
+auf-referentiels: unknown-section auf
diff --git a/debian/manpages b/debian/manpages
new file mode 100644 (file)
index 0000000..edb16b9
--- /dev/null
@@ -0,0 +1 @@
+debian/auf-referentiels.8
diff --git a/debian/postinst b/debian/postinst
new file mode 100644 (file)
index 0000000..5f038ce
--- /dev/null
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+set -e
+
+. /usr/share/debconf/confmodule
+
+if ! getent passwd auf-referentiels >/dev/null ; then
+  adduser --disabled-password --quiet --system \
+    --home /usr/share/auf-referentiels --no-create-home \
+    --group auf-referentiels
+fi
+
+if [ -d /usr/share/auf-referentiels ] ; then
+  chown -R auf-referentiels:auf-referentiels /usr/share/auf-referentiels
+  chmod 0755 /usr/share/auf-referentiels
+fi
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/postrm b/debian/postrm
new file mode 100644 (file)
index 0000000..cb650be
--- /dev/null
@@ -0,0 +1,12 @@
+#!/bin/sh
+
+set -e
+
+#DEBHELPER#
+
+if [ "$1" = "purge" ] ; then
+  deluser --quiet --system auf-referentiels --remove-home > /dev/null || true
+  delgroup --quiet --system auf-referentiels --only-if-empty > /dev/null || true
+fi
+
+exit 0
diff --git a/debian/templates b/debian/templates
new file mode 100644 (file)
index 0000000..1e3d06a
--- /dev/null
@@ -0,0 +1,7 @@
+Template: auf-referentiels/url_base
+Type: string
+Default: http://intranet.auf/auf-referentiels
+Description: URL de base des référentiels AuF :
+ Veuillez entrer l'URL de base pour accéder aux référentiels AuF.
+ .
+ Valeur standard (par défaut) : http://intranet.auf/auf-referentiels