releasing version 1.1.0
authorProgfou <jean-christophe.andre@auf.org>
Mon, 10 Aug 2009 06:16:36 +0000 (13:16 +0700)
committerProgfou <jean-christophe.andre@auf.org>
Mon, 10 Aug 2009 06:37:56 +0000 (13:37 +0700)
* apache.conf : ajout support de la compression des données envoyées.
* aufrefer : ajout support du Content-Encoding "gzip" en plus de "x-gzip".
* aufrefer : ajout méthode "path" pour obtenir le chemin d'un référentiel.
* aufrefer : ajout méthode "get" pour extraire le contenu d'un référentiel.
* auf-refer : ajout options -p et -c correspondantes.
* auf-refer.8 : mise à jour en conséquence et détails complémentaires.
* correction d'un bogue dans la gestion des messages des exceptions.

MANIFEST
MANIFEST.in
apache.conf
auf-refer
auf-refer.8 [new file with mode: 0644]
aufrefer.py [changed mode: 0755->0644]
debian/auf-refer.8 [deleted file]
debian/changelog
debian/manpages
setup.py [changed mode: 0644->0755]

index 7032bea..ae5026b 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -3,15 +3,15 @@ Makefile
 README
 apache.conf
 auf-refer
+auf-refer.8
 auf-refer.conf
+auf-refer.cron
 aufrefer.py
 setup.py
-debian/auf-refer.8
 debian/changelog
 debian/compat
 debian/control
 debian/copyright
-debian/cron.d
 debian/dirs
 debian/lintian-overrides
 debian/manpages
index 77adb19..559d628 100644 (file)
@@ -1,6 +1,6 @@
 include *.txt
 recursive-include examples *.txt *.py
 prune examples/sample?/build
-include auf-refer *.conf README
+include auf-refer* *.conf README
 include Makefile MANIFEST.in
 recursive-include debian *
index 79e299e..67ba90c 100644 (file)
@@ -3,10 +3,15 @@ Alias /auf-refer/ /var/lib/auf-refer/
   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
+  #Allow from 10.0.0.0/255.0.0.0
   Options Indexes
+  # required module, to enable with "sudo a2enmod mime"
   <IfModule mod_mime.c>
     AddType application/json .json
     AddCharset UTF-8 .json
+    # recommended module, to enable with "sudo a2enmod deflate"
+    <IfModule mod_deflate.c>
+      SetOutputFilter DEFLATE
+    </IfModule>
   </IfModule>
 </Location>
index 73200ba..2241099 100755 (executable)
--- a/auf-refer
+++ b/auf-refer
@@ -6,7 +6,7 @@ Copyright ©2009  Agence universitaire de la Francophonie
 Licence : GPL version 3
 Auteur : Progfou <jean-christophe.andre@auf.org>
 
-Dépendances Debian : python >= 2.5, python-simplejson
+Dépendances Debian : python >= 2.5
 """
 
 RUN_USER = 'auf-refer'
@@ -16,6 +16,8 @@ __all__ = ( 'RUN_USER' )
 USAGE = """Usages (nécessite parfois "root", par exemple via "sudo") :
   auf-refer [-f] -a <ref> - copie un nouveau référentiel
   auf-refer -r <ref>      - supprime un référentiel
+  auf-refer -p <ref>      - affiche le chemin d'accès à un référentiel
+  auf-refer -c <ref>      - affiche le contenu d'un référentiel
   auf-refer [-f] -u       - met à jour les référentiels
   auf-refer -l            - liste les référentiels copiés
   auf-refer [-f] -L       - liste les référentiels disponibles
@@ -36,18 +38,18 @@ if __name__ == '__main__':
         try:
             pw = getpwnam(RUN_USER)
         except KeyError:
-            raise RuntimeError, u"L'utilisateur '%s' n'existe pas." % RUN_USER
+            raise RuntimeError, "L'utilisateur '%s' n'existe pas." % RUN_USER
         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' !" % RUN_USER
+                "Impossible de basculer vers l'utilisateur '%s'.\n" \
+                "Réessayez avec 'sudo' !" % RUN_USER
 
     try:
-        opts, args = getopt(argv[1:], 'hfa:r:ulLA', ['help', 'force',
-            'add=', 'remove=', 'update', 'list',
+        opts, args = getopt(argv[1:], 'hfa:r:p:c:ulLA', ['help', 'force',
+            'add=', 'remove=', 'path=', 'content=', 'update', 'list',
             'list-available', 'add-available'])
     except GetoptError:
         print USAGE
@@ -66,6 +68,12 @@ if __name__ == '__main__':
                     aufrefer.add(arg, force=force)
                 elif opt in ('-r', '--remove'):
                     aufrefer.remove(arg)
+                elif opt in ('-p', '--path'):
+                    print aufrefer.path(arg)
+                elif opt in ('-c', '--content'):
+                    f = file(aufrefer.path(arg), 'rb')
+                    stdout.write(f.read())
+                    f.close()
                 elif opt in ('-u', '--update'):
                     aufrefer.update(force=force)
                 elif opt in ('-l', '--list'):
@@ -77,8 +85,8 @@ if __name__ == '__main__':
                         print "%-16s : %s" % (referentiel, list[referentiel])
                 elif opt in ('-A', '--add-available'):
                     aufrefer.add_available(force=force)
-            except RuntimeError, msg:
-                print >>stderr, u'%s' % msg
+            except RuntimeError, e:
+                print >>stderr, e
 
     if not opts:
         print USAGE
diff --git a/auf-refer.8 b/auf-refer.8
new file mode 100644 (file)
index 0000000..5869fe5
--- /dev/null
@@ -0,0 +1,75 @@
+.TH AUF-REFER 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-refer \- outil de copie et mise à jour des réferentiels AuF
+.SH SYNOPSIS
+\fBauf-refer\fP [\fB-f\fP] \fB-a\fP \fIreferentiel\fP
+.br
+\fBauf-refer\fP \fB-r\fP | \fB-p\fP | \fB-c\fP \fIreferentiel\fP
+.br
+\fBauf-refer\fP \fB-h\fP | \fB-l\fP
+.br
+\fBauf-refer\fP [\fB-f\fP] \fB-u\fP | \fB-L\fP | \fB-A\fP
+.SH DESCRIPTION
+Cette page de manuel documente brièvement la commande \fBauf-refer\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 \-L, \-\-list-available
+Liste les référentiels disponibles. Cette liste est obtenue depuis un référentiel spécial (par défaut \fBauf-refer.json\fP, voir plus bas). L'option \fB-f\fP permet de forcer le chargement à travers un proxy/cache.
+.TP
+.B \-A, \-\-add-available
+Copie tous les référentiels disponibles. Il seront 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 \-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 \-l, \-\-list
+Liste les référentiel copiés.
+.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 \-r, \-\-remove
+Supprime un référentiel.
+.TP
+.B \-p, \-\-path
+Affiche le chemin d'accès au fichier d'un référentiel.
+.TP
+.B \-c, \-\-content
+Affiche le contenu d'un référentiel.
+.SH FILES
+.TP
+.B /etc/auf-refer/auf-refer.conf
+Fichier de configuration de cet outil.
+.br
+On y trouve en particulier les options suivantes :
+.TP
+.B DIR_BASE
+Répertoire de base pour l'enregistrement des copies des référentiels. Par défaut cette option est positionnée sur \fB/var/lib/auf-refer\fP.
+.TP
+.B URL_BASE
+URL de base pour la source des copies des référentiels. Par défaut cette option est positionnée sur \fBhttp://intranet.auf/auf-refer\fP.
+.TP
+.B AVAILABLE_LIST
+Nom du référentiel contenant la liste des référentiels disponibles. Par défaut cette option est positionnée sur \fBauf-refer.json\fP.
+.SH AUTHOR
+L'outil auf-refer a été écrit par Progfou <jean-christophe.andre@auf.org> pour l'Agence universitaire de la Francophonie.
+.PP
+Cette page de manuel a été écrite par Progfou <jean-christophe.andre@auf.org>,
+pour le projet Debian (mais peut être utilisée par d'autres).
old mode 100755 (executable)
new mode 100644 (file)
index 70babad..0fd7676
@@ -35,9 +35,12 @@ from cStringIO import StringIO
 from gzip import GzipFile
 from simplejson import loads
 
-def update_referentiel(referentiel, force=False):
+def path(referentiel):
+    return join(DIR_BASE, referentiel)
+
+def _update(referentiel, force=False):
     headers = {}
-    headers['Accept-Encoding'] = 'x-gzip'
+    headers['Accept-Encoding'] = 'gzip,x-gzip'
     if force:
         headers['Pragma'] = 'no-cache'
     filename = join(DIR_BASE, referentiel)
@@ -49,10 +52,10 @@ def update_referentiel(referentiel, force=False):
         # fichier vide à date très ancienne pour déclencher la synchro
         try:
             file(filename, 'a').close()
-        except IOError, msg:
+        except IOError, e:
             raise RuntimeError, \
-                u"La création du référentiel '%s' a été refusée :\n  %s" \
-                                                    % (referentiel, msg)
+                "La création du référentiel '%s' a été refusée :\n  %s" \
+                                                        % (referentiel, e)
         utime(filename, (0, 0))
     url = URL_BASE + '/' + referentiel
     req = Request(url, None, headers)
@@ -62,33 +65,33 @@ def update_referentiel(referentiel, force=False):
         if e.code == 304:
             return
         raise RuntimeError, \
-            u"L'URL suivante renvoie un code d'erreur %s :\n  %s" \
+            "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
+        raise RuntimeError, "L'URL suivante est inaccessible :\n  %s" % url
     i = u.info()
     if referentiel.endswith('.json') and i.type != 'application/json':
         u.close()
         raise RuntimeError, \
-            u"Le type des données chargées n'est pas JSON mais '%s'.\n" \
-            u"URL concernée : %s" % (i.type, url)
+            "Le type des données chargées n'est pas JSON mais '%s'.\n" \
+            "URL concernée : %s" % (i.type, url)
     data = u.read()
-    if i.get('content-encoding') == 'x-gzip':
+    if i.get('content-encoding') in ('gzip','x-gzip'):
         data = GzipFile('', 'r', 0, StringIO(data)).read()
     u.close()
     if referentiel.endswith('.json'):
         try:
             loads(data, encoding='utf-8')
         except ValueError:
-            raise RuntimeError, u"Les données ne sont pas au format JSON.\n" \
-                                u"URL concernée : %s" % url
+            raise RuntimeError, "Les données ne sont pas au format JSON.\n" \
+                                "URL concernée : %s" % url
     # si on est arrivé jusqu'ici c'est que tout va bien... on enregistre !
     try:
         f = file(filename, 'wb')
-    except IOError, msg:
+    except IOError, e:
         raise RuntimeError, \
-            u"L'écriture du référentiel '%s' a été refusée :\n  %s" \
-                                                    % (referentiel, msg)
+            "L'écriture du référentiel '%s' a été refusée :\n  %s" \
+                                                        % (referentiel, e)
     f.write(data)
     f.close()
     # on fixe la date donnée par le serveur, le cas échéant
@@ -97,58 +100,66 @@ def update_referentiel(referentiel, force=False):
         mtime = timegm(mtime)
         utime(filename, (mtime, mtime))
 
+def get(referentiel, force=False):
+    filename = join(DIR_BASE, referentiel)
+    if not exists(filename):
+        _update(referentiel, force)
+    try:
+        f = open(filename, 'rb')
+    except IOError:
+        raise RuntimeError, "Le référentiel '%s' est indisponible." \
+                                                            % referentiel
+    data = f.read()
+    f.close()
+    if referentiel.endswith('.json'):
+        try:
+            data = loads(data, encoding='utf-8')
+        except ValueError:
+            raise RuntimeError, \
+                "Les données du référentiel '%s' ne sont pas au format JSON.\n" \
+                "Le fichier est peut-être corrompu, essayez de forcer une mise à jour." % referentiel
+    # XXX: voir comment faire : data.last_modified = gmtime(getmtime(filename))
+    return data
+
 def add(referentiel, force=False):
-    if referentiel in listdir(DIR_BASE):
+    filename = join(DIR_BASE, referentiel)
+    if exists(filename):
         raise RuntimeError, \
-            u"Le référentiel '%s' avait déjà été ajouté." % referentiel
-    update_referentiel(referentiel, force)
+            "Le référentiel '%s' avait déjà été ajouté." % referentiel
+    _update(referentiel, force)
 
 def remove(referentiel):
-    if not referentiel in listdir(DIR_BASE):
-        raise RuntimeError, u"Le référentiel '%s' est absent." % referentiel
+    filename = join(DIR_BASE, referentiel)
+    if not exists(filename):
+        raise RuntimeError, "Le référentiel '%s' est absent." % referentiel
     try:
-        unlink(join(DIR_BASE, referentiel))
-    except (IOError, OSError), msg:
+        unlink(filename)
+    except (IOError, OSError), e:
         raise RuntimeError, \
-            u"La suppression du référentiel '%s' a été refusée :\n  %s" \
-                                                    % (referentiel, msg)
+            "La suppression du référentiel '%s' a été refusée :\n  %s" \
+                                                        % (referentiel, e)
 
 def update(referentiel=False, force=False):
     if referentiel:
-        update_referentiel(referentiel, force)
+        _update(referentiel, force)
         return
     error_messages = []
     for referentiel in listdir(DIR_BASE):
         try:
-            update_referentiel(referentiel, force)
-        except Exception, msg:
-            error_messages.append(unicode(msg))
+            _update(referentiel, force)
+        except Exception, e:
+            error_messages.append(str(e))
     if error_messages:
-        raise RuntimeError, u'\n'.join(error_messages)
+        raise RuntimeError, '\n'.join(error_messages)
 
 def list():
     return listdir(DIR_BASE)
 
 def list_available(force=False):
-    filename = join(DIR_BASE, AVAILABLE_LIST)
-    if not exists(filename):
-        update_referentiel(AVAILABLE_LIST, force)
-    try:
-        f = open(filename, 'rb')
-    except IOError:
-        raise RuntimeError, u"La liste des référentiels est indisponible."
-    try:
-        referentiels = loads(f.read(), encoding='utf-8')
-    except ValueError:
-        raise RuntimeError, \
-            u"La liste des référentiels n'est pas au format JSON.\n" \
-            u"Essayez de forcer une mise à jour."
-    f.close()
-    return referentiels
+    return get(AVAILABLE_LIST, force)
 
 def add_available(force=False):
-    referentiels = list_available(force)
-    referentiels = set(referentiels) - set(listdir(DIR_BASE))
-    for referentiel in referentiels:
-        update_referentiel(referentiel, force)
+    missing = set(list_available(force)) - set(listdir(DIR_BASE))
+    for referentiel in missing:
+        _update(referentiel, force)
 
diff --git a/debian/auf-refer.8 b/debian/auf-refer.8
deleted file mode 100644 (file)
index 1f37cc8..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-.TH AUF-REFER 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-refer \- outil de copie et mise à jour des réferentiels AuF
-.SH SYNOPSIS
-\fBauf-refer\fP [\fB-f\fP] \fB-a\fP \fIreferentiel\fP
-.br
-\fBauf-refer\fP \fB-r\fP \fIreferentiel\fP
-.br
-\fBauf-refer\fP \fB-h\fP | \fB-l\fP
-.br
-\fBauf-refer\fP [\fB-f\fP] \fB-u\fP | \fB-L\fP | \fB-A\fP
-.SH DESCRIPTION
-Cette page de manuel documente brièvement la commande \fBauf-refer\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 \-L, \-\-list-available
-Liste les référentiels disponibles. Cette liste est obtenue depuis un référentiel spécial nommé \fBauf-refer.json\fP. L'option \fB-f\fP permet de forcer le chargement à travers un proxy/cache.
-.TP
-.B \-A, \-\-add-available
-Copie tous les référentiels disponibles. Il seront 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 \-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 \-l, \-\-list
-Liste les référentiel copiés.
-.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 \-r, \-\-remove
-Supprime un référentiel.
-.SH FILES
-.TP
-.B /etc/auf-refer/auf-refer.conf
-Fichier de configuration de cet outil.
-.br
-On y trouvera en particulier l'option suivante :
-.TP
-.B URL_BASE
-URL de base pour la copie des référentiels. Par défaut cette URL est positionnée sur \fBhttp://intranet.auf/auf-refer\fP.
-.SH AUTHOR
-L'outil auf-refer 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).
index 90964d8..ab68a90 100644 (file)
@@ -1,3 +1,15 @@
+auf-refer (1.1.0) jaunty; urgency=low
+
+  * apache.conf : ajout support de la compression des données envoyées.
+  * aufrefer : ajout support du Content-Encoding "gzip" en plus de "x-gzip".
+  * aufrefer : ajout méthode "path" pour obtenir le chemin d'un référentiel.
+  * aufrefer : ajout méthode "get" pour extraire le contenu d'un référentiel.
+  * auf-refer : ajout options -p et -c correspondantes.
+  * auf-refer.8 : mise à jour en conséquence et détails complémentaires.
+  * correction d'un bogue dans la gestion des messages des exceptions.
+
+ -- Progfou <jean-christophe.andre@auf.org>  Mon, 10 Aug 2009 13:14:00 +0700
+
 auf-refer (1.0.0) jaunty; urgency=low
 
   * Réécriture complète dans l'optique d'un module réutilisable.
index 5a64f3f..be719e0 100644 (file)
@@ -1 +1 @@
-debian/auf-refer.8
+auf-refer.8
old mode 100644 (file)
new mode 100755 (executable)
index 2f9eb78..1460914
--- a/setup.py
+++ b/setup.py
@@ -4,19 +4,19 @@
 from distutils.core import setup
 
 setup(name='auf-refer',
-    version='1.0.0',
+    version='1.1.0',
     author='Progfou',
     author_email='jean-christophe.andre@auf.org',
     url='http://git.auf.org/?p=auf-refer.git',
     description='AuF utility to optimize access to reference data',
-    long_description='Ce paquet fournit un outil permettant de copier puis de mettre régulièrement à jour une sélection des référentiels AuF.',
+    long_description=u'Ce paquet fournit un outil permettant de copier puis de mettre régulièrement à jour une sélection des référentiels AuF.',
     license='LGPL',
-    download_url='git://git.auf.org/auf-refer.git',
+    #download_url='git://git.auf.org/auf-refer.git',
     classifiers=[
         'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)',
         'License :: OSI Approved :: GNU General Public License (GPL)',
         'Programming Language :: Python',
-        'Topic :: Database :: Database Front-Ends',
+        'Topic :: Database :: Front-Ends',
         'Natural Language :: French',
     ],
     requires=['simplejson'],
@@ -24,6 +24,7 @@ setup(name='auf-refer',
     data_files=[
         ('/etc/auf-refer',['auf-refer.conf','apache.conf']),
         ('/usr/sbin',['auf-refer']),
+        ('/usr/share/man/man8',['auf-refer.8']),
         ],
     )