Version 2.0.1 : V_2_0 jessie trusty wheezy
authorProgfou <jean-christophe.andre@auf.org>
Mon, 7 Sep 2015 05:49:19 +0000 (01:49 -0400)
committerProgfou <jean-christophe.andre@auf.org>
Mon, 7 Sep 2015 05:49:19 +0000 (01:49 -0400)
  * bascule vers Python 3 (code + dépendances)
  * bascule vers http://refer.auf/data

25 files changed:
IDEAS.txt
README
auf-refer
auf-refer-photos
auf-refer.8
auf-refer.conf
aufrefer.py [deleted file]
aufrefer/__init__.py [new file with mode: 0644]
debian/auf-refer.cron.d [new file with mode: 0644]
debian/auf-refer.dirs [new file with mode: 0644]
debian/auf-refer.lintian-overrides [new file with mode: 0644]
debian/auf-refer.manpages [new file with mode: 0644]
debian/auf-refer.postinst [new file with mode: 0644]
debian/auf-refer.postrm [new file with mode: 0644]
debian/changelog
debian/compat
debian/control
debian/cron.d [deleted file]
debian/dirs [deleted file]
debian/lintian-overrides [deleted file]
debian/manpages [deleted file]
debian/postinst [deleted file]
debian/postrm [deleted file]
debian/rules
setup.py

index 3240534..4c59e22 100644 (file)
--- a/IDEAS.txt
+++ b/IDEAS.txt
@@ -9,7 +9,7 @@
 - ajouter un paramètre optionnel [<url>] pour l'ajout d'un référentiel
 - enregistrer l'URL d'origine et le nom donné au référentiel dans
   BASE_DIR + referentiel + '.META' :
-    URL=http://intranet.auf/auf-refer/spip-regions.json
+    URL=http://refer.auf/data/spip-regions.json
     MIMETYPE=application/json
     NAME=regions
     DESCRIPTION=Référentiels SPIP : liste des régions.
diff --git a/README b/README
index 78ee23c..d2794ca 100644 (file)
--- a/README
+++ b/README
@@ -1,5 +1,5 @@
 Pré-requis : avoir accès à un site web servant les référentiels AuF.
-Par défaut il faut avoir accès à http://intranet.auf/ et donc au RPV.
+Par défaut il faut avoir accès à http://refer.auf/ et donc au RPV.
 Mais ce paquet peut aussi servir à mettre en place un tel site web.
 
 Ce paquet effectuera une copie puis une mise à jour automatique des
index c3d609e..d03dceb 100755 (executable)
--- a/auf-refer
+++ b/auf-refer
@@ -1,12 +1,10 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 """Outil de copie et mise à jour des référentiels AuF.
 
-Copyright ©2009-2011  Agence universitaire de la Francophonie
+Copyright ©2009-2015  Agence universitaire de la Francophonie
 Licence : GPL version 3
 Auteur : Progfou <jean-christophe.andre@auf.org>
-
-Dépendances Debian : python >= 2.5
 """
 from sys import argv, exit, stdout, stderr
 from getopt import getopt, GetoptError
@@ -16,7 +14,7 @@ import aufrefer
 
 RUN_USER = 'auf-refer'
 
-__all__ = ( 'RUN_USER' )
+__all__ = ('RUN_USER')
 
 USAGE = """Usages (nécessite parfois "root", par exemple via "sudo") :
   auf-refer [-f] -a <ref> - copie un nouveau référentiel
@@ -37,27 +35,27 @@ if __name__ == '__main__':
         try:
             pw = getpwnam(RUN_USER)
         except KeyError:
-            raise RuntimeError, "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, \
-                "Impossible de basculer vers l'utilisateur '%s'.\n" \
-                "Réessayez avec 'sudo' !" % RUN_USER
+            raise RuntimeError("Impossible de basculer vers l'utilisateur "
+                               "'%s'.\nRéessayez avec 'sudo' !" % RUN_USER)
 
     try:
-        opts, args = getopt(argv[1:], 'hfa:r:p:c:ulLA', ['help', 'force',
-            'add=', 'remove=', 'path=', 'content=', 'update', 'list',
-            'list-available', 'add-available'])
+        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
+        print(USAGE)
         exit(1)
 
     force = False
     for opt, arg in opts:
         if opt in ('-h', '--help'):
-            print USAGE
+            print(USAGE)
             exit(0)
         elif opt in ('-f', '--force'):
             force = True
@@ -68,7 +66,7 @@ if __name__ == '__main__':
                 elif opt in ('-r', '--remove'):
                     aufrefer.remove(arg)
                 elif opt in ('-p', '--path'):
-                    print aufrefer.path(arg)
+                    print(aufrefer.path(arg))
                 elif opt in ('-c', '--content'):
                     f = file(aufrefer.path(arg), 'rb')
                     stdout.write(f.read())
@@ -77,17 +75,16 @@ if __name__ == '__main__':
                     aufrefer.update(force=force)
                 elif opt in ('-l', '--list'):
                     for referentiel in aufrefer.list_present():
-                        print referentiel
+                        print(referentiel)
                 elif opt in ('-L', '--list-available'):
                     l = aufrefer.list_available(force=force)
                     for referentiel in sorted(l):
-                        print "%-16s : %s" % (referentiel, l[referentiel])
+                        print("%-16s : %s" % (referentiel, l[referentiel]))
                 elif opt in ('-A', '--add-available'):
                     aufrefer.add_available(force=force)
-            except RuntimeError, e:
-                print >>stderr, e
+            except RuntimeError as e:
+                print(e, file=stderr)
 
     if not opts:
-        print USAGE
+        print(USAGE)
     exit(0)
-
index a8a6f63..5a2b0a9 100755 (executable)
@@ -1,18 +1,16 @@
-#!/usr/bin/python
+#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 """Outil de copie et mise à jour des photos des personnels AuF.
 
-Copyright ©2009-2011  Agence universitaire de la Francophonie
+Copyright ©2009-2015  Agence universitaire de la Francophonie
 Licence : GPL version 3
 Auteur : Progfou <jean-christophe.andre@auf.org>
-
-Dépendances Debian : python >= 2.5
 """
 from sys import argv, exit, stderr
 from getopt import getopt, GetoptError
 from pwd import getpwnam
 from os import getuid, setgid, setuid
-from urllib2 import HTTPError, URLError
+from urllib.error import HTTPError, URLError
 import aufrefer
 
 RUN_USER = 'auf-refer'
@@ -42,19 +40,19 @@ def update(adels=None, verbose=True, force=False):
                                             force=force, ignore404=True)
             if verbose:
                 if r:
-                    print "Photo récupérée pour %s." % adel
+                    print("Photo récupérée pour %s." % adel)
                 elif r is not None:
-                    print "Photo non disponible pour %s." % adel
+                    print("Photo non disponible pour %s." % adel)
         except RuntimeError:
             if verbose:
-                print "Problème avec la photo pour %s." % adel
+                print("Problème avec la photo pour %s." % adel)
         except KeyboardInterrupt:
-                print "Abandon."
+                print("Abandon.")
                 return
         if adels and adel in adels:
             adels.remove(adel)
     if adels and verbose:
-        print "Adéls ignorées :", ', '.join(adels)
+        print("Adéls ignorées :", ', '.join(adels))
 
 if __name__ == '__main__':
     # interdiction formelle de tourner sous 'root'
@@ -62,29 +60,28 @@ if __name__ == '__main__':
         try:
             pw = getpwnam(RUN_USER)
         except KeyError:
-            raise RuntimeError, "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, \
-                "Impossible de basculer vers l'utilisateur '%s'.\n" \
-                "Réessayez avec 'sudo' !" % RUN_USER
+            raise RuntimeError("Impossible de basculer vers l'utilisateur"
+                               " '%s'.\nRéessayez avec 'sudo' !" % RUN_USER)
 
     try:
         opts, args = getopt(argv[1:], 'hvf', ['help', 'verbose', 'force'])
     except GetoptError:
-        print USAGE
+        print(USAGE)
         exit(1)
     if not args:
-        print USAGE
+        print(USAGE)
         exit(1)
 
     verbose = False
     force = False
     for opt, arg in opts:
         if opt in ('-h', '--help'):
-            print USAGE
+            print(USAGE)
             exit(0)
         elif opt in ('-v', '--verbose'):
             verbose = True
@@ -97,8 +94,8 @@ if __name__ == '__main__':
         adels = args
     try:
         update(adels, verbose=verbose, force=force)
-    except RuntimeError, e:
-        print >>stderr, e
+    except RuntimeError as e:
+        print(e, file=stderr)
         exit(1)
     exit(0)
 
index 5869fe5..eca30b7 100644 (file)
@@ -64,7 +64,7 @@ On y trouve en particulier les options suivantes :
 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.
+URL de base pour la source des copies des référentiels. Par défaut cette option est positionnée sur \fBhttp://refer.auf/data\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.
index 84491ac..aee4b4a 100644 (file)
@@ -1,3 +1,3 @@
 DIR_BASE=/var/lib/auf-refer
-URL_BASE=http://intranet.auf/auf-refer
+URL_BASE=http://refer.auf/data
 AVAILABLE_LIST=auf-refer.json
diff --git a/aufrefer.py b/aufrefer.py
deleted file mode 100644 (file)
index 6d5ff71..0000000
+++ /dev/null
@@ -1,190 +0,0 @@
-#!/usr/bin/python
-# -*- coding: utf-8 -*-
-"""Librairie de copie et mise à jour des référentiels AuF.
-
-Copyright ©2009-2011  Agence universitaire de la Francophonie
-Licence : LGPL version 3
-Auteur : Progfou <jean-christophe.andre@auf.org>
-
-Dépendances Debian : python >= 2.5, python-simplejson
-"""
-from os import listdir, utime, unlink, umask
-from os.path import join, exists, getmtime
-from time import gmtime, strftime
-from calendar import timegm
-from urllib2 import Request, urlopen, HTTPError, URLError
-from cStringIO import StringIO
-from gzip import GzipFile
-from simplejson import loads
-
-CONFIG_FILE = '/etc/auf-refer/auf-refer.conf'
-
-DIR_BASE = '/var/lib/auf-refer'
-URL_BASE = 'http://intranet.auf/auf-refer'
-AVAILABLE_LIST = 'auf-refer.json'
-
-try:
-    lines = filter(lambda l: not l.startswith('#'), file(CONFIG_FILE))
-    config = dict(map(lambda l: map(lambda s: s.strip(), l.split('=')), lines))
-except IOError:
-    print "Fichier de configuration '%s' indisponible." % CONFIG_FILE
-    config = {}
-
-DIR_BASE = config.get('DIR_BASE', DIR_BASE).rstrip('/')
-URL_BASE = config.get('URL_BASE', URL_BASE).rstrip('/')
-AVAILABLE_LIST = config.get('AVAILABLE_LIST', AVAILABLE_LIST)
-
-__all__ = ( 'DIR_BASE', 'URL_BASE', 'AVAILABLE_LIST' )
-
-TIME_FORMAT = '%a, %d %b %Y %H:%M:%S GMT'
-
-def path(referentiel):
-    return join(DIR_BASE, referentiel)
-
-def retrieve(url, filename, force=False, mimetype=None, ignore404=False):
-    headers = {}
-    headers['Accept-Encoding'] = 'gzip,x-gzip'
-    # ajout d'un champ pour forcer le cache au besoin
-    if force:
-        headers['Pragma'] = 'no-cache'
-    # ajout d'un champ indiquant la date du fichier déjà présent
-    if exists(filename):
-        # n'effectuer le chargement qu'en cas de nouvelle version
-        mtime = gmtime(getmtime(filename))
-        headers['If-Modified-Since'] = strftime(TIME_FORMAT, mtime)
-    # requête de données à l'URL demandée
-    req = Request(url, None, headers)
-    try:
-        u = urlopen(req)
-    except HTTPError, e:
-        if e.code == 304:
-            return None
-        if ignore404 and e.code == 404:
-            return False
-        raise RuntimeError, \
-            "L'URL suivante renvoie un code d'erreur %s :\n  %s" \
-                                                        % (e.code, url)
-    except URLError:
-        raise RuntimeError, "L'URL suivante est inaccessible :\n  %s" % url
-    # infos sur les données
-    i = u.info()
-    # vérification du type MIME
-    if mimetype and i.type != mimetype:
-        u.close()
-        raise ValueError, \
-            "Le type de données n'est pas '%s' mais '%s'.\n" \
-            "URL concernée : %s" % (mimetype, i.type, url)
-    data = u.read()
-    # décompression à la volée
-    if i.get('content-encoding') in ('gzip','x-gzip'):
-        data = GzipFile('', 'r', 0, StringIO(data)).read()
-    u.close()
-    # test de validité des données en cas de JSON
-    if mimetype == 'application/json':
-        try:
-            loads(data, encoding='utf-8')
-        except ValueError:
-            raise ValueError, "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:
-        old_umask = umask(022)
-        f = file(filename, 'wb')
-        umask(old_umask)
-    except IOError, e:
-        raise IOError, \
-            "L'écriture du fichier '%s' a été refusée :\n  %s" \
-                                                        % (filename, e)
-    f.write(data)
-    f.close()
-    # on fixe la date indiquée par le serveur, le cas échéant
-    mtime = i.getdate('last-modified')
-    if mtime:
-        mtime = timegm(mtime)
-        utime(filename, (mtime, mtime))
-
-    return True
-
-def _update(referentiel, force=False):
-    url = URL_BASE + '/' + referentiel
-    filename = join(DIR_BASE, referentiel)
-    # vérification de la présence d'une copie
-    if not exists(filename):
-        # fichier vide à date très ancienne pour déclencher la synchro
-        try:
-            file(filename, 'a').close()
-            utime(filename, (0, 0))
-        except IOError, e:
-            raise RuntimeError, \
-                "La création du référentiel '%s' a été refusée :\n  %s" \
-                                                        % (referentiel, e)
-    # type MIME attendu
-    if referentiel.endswith('.json'):
-        mimetype = 'application/json'
-    else:
-        mimetype = None
-    return retrieve(url, filename, mimetype=mimetype, force=force)
-
-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):
-    filename = join(DIR_BASE, referentiel)
-    if exists(filename):
-        raise RuntimeError, \
-            "Le référentiel '%s' avait déjà été ajouté." % referentiel
-    _update(referentiel, force)
-
-def remove(referentiel):
-    filename = join(DIR_BASE, referentiel)
-    if not exists(filename):
-        raise RuntimeError, "Le référentiel '%s' est absent." % referentiel
-    try:
-        unlink(filename)
-    except (IOError, OSError), e:
-        raise RuntimeError, \
-            "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, force)
-        return
-    error_messages = []
-    for referentiel in list_present():
-        try:
-            _update(referentiel, force)
-        except Exception, e:
-            error_messages.append(str(e))
-    if error_messages:
-        raise RuntimeError, '\n'.join(error_messages)
-
-def list_present():
-    return filter(lambda n: not n.startswith('.'), listdir(DIR_BASE))
-
-def list_available(force=False):
-    return get(AVAILABLE_LIST, force)
-
-def add_available(force=False):
-    missing = set(list_available(force)) - set(list_present())
-    for referentiel in missing:
-        _update(referentiel, force)
-
diff --git a/aufrefer/__init__.py b/aufrefer/__init__.py
new file mode 100644 (file)
index 0000000..fbf9132
--- /dev/null
@@ -0,0 +1,199 @@
+# -*- coding: utf-8 -*-
+"""Librairie de copie et mise à jour des référentiels AuF.
+
+Copyright ©2009-2015  Agence universitaire de la Francophonie
+Licence : LGPL version 3
+Auteur : Progfou <jean-christophe.andre@auf.org>
+"""
+__version__ = '2.0.1'
+
+__all__ = ('DIR_BASE', 'URL_BASE', 'AVAILABLE_LIST')
+
+from os import listdir, utime, unlink, umask
+from os.path import join, exists, getmtime
+from time import gmtime, strftime
+from email.utils import parsedate_tz, mktime_tz
+from urllib.request import Request, urlopen
+from urllib.error import HTTPError, URLError
+from gzip import decompress
+import json
+
+CONFIG_FILE = '/etc/auf-refer/auf-refer.conf'
+
+DIR_BASE = '/var/lib/auf-refer'
+URL_BASE = 'http://refer.auf/data'
+AVAILABLE_LIST = 'auf-refer.json'
+
+try:
+    _lines = [l for l in open(CONFIG_FILE) if not l.startswith('#')]
+    CONFIG = dict([[s.strip() for s in l.split('=')] for l in _lines])
+except IOError:
+    print("Fichier de configuration '{}' indisponible.", CONFIG_FILE)
+    CONFIG = {}
+
+DIR_BASE = CONFIG.get('DIR_BASE', DIR_BASE).rstrip('/')
+URL_BASE = CONFIG.get('URL_BASE', URL_BASE).rstrip('/')
+AVAILABLE_LIST = CONFIG.get('AVAILABLE_LIST', AVAILABLE_LIST)
+
+TIME_FORMAT = '%a, %d %b %Y %H:%M:%S GMT'
+
+
+def path(referentiel):
+    '''Return 'referentiel'-'s path.'''
+    return join(DIR_BASE, referentiel)
+
+
+def retrieve(url, filename, force=False, mimetype=None, ignore404=False):
+    '''Retrieve data content at 'url' and save it into 'filename'.'''
+    headers = {}
+    headers['Accept-Encoding'] = 'gzip,x-gzip'
+    # ajout d'un champ pour forcer le cache au besoin
+    if force:
+        headers['Pragma'] = 'no-cache'
+    # ajout d'un champ indiquant la date du fichier déjà présent
+    if exists(filename):
+        # n'effectuer le chargement qu'en cas de nouvelle version
+        mtime = gmtime(getmtime(filename))
+        headers['If-Modified-Since'] = strftime(TIME_FORMAT, mtime)
+    # requête de données à l'URL demandée
+    req = Request(url, None, headers)
+    try:
+        u = urlopen(req)
+    except HTTPError as e:
+        if e.code == 304:
+            return None
+        if ignore404 and e.code == 404:
+            return False
+        raise RuntimeError("L'URL suivante renvoie un code d'erreur %s :\n"
+                           " %s" % (e.code, url))
+    except URLError:
+        raise RuntimeError("L'URL suivante est inaccessible :\n  %s" % url)
+    # infos sur les données
+    i = u.info()
+    content_type = i.get_content_type()
+    # vérification du type MIME
+    if mimetype and content_type != mimetype:
+        u.close()
+        raise ValueError("Le type de données n'est pas '%s' mais '%s'.\n"
+                         "URL concernée : %s" % (mimetype, content_type, url))
+    data = u.read()
+    u.close()
+    # décompression à la volée
+    if i.get('content-encoding') in ('gzip', 'x-gzip'):
+        data = decompress(data)
+    # test de validité des données en cas de JSON
+    if mimetype == 'application/json':
+        try:
+            json.loads(data.decode())
+        except ValueError:
+            raise ValueError("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:
+        old_umask = umask(0o0022)
+        f = open(filename, 'wb')
+        umask(old_umask)
+    except IOError as e:
+        raise IOError("L'écriture du fichier '%s' a été refusée :\n  %s"
+                      % (filename, e))
+    f.write(data)
+    f.close()
+    # on fixe la date indiquée par le serveur, le cas échéant
+    mtime = i.get('last-modified')
+    if mtime:
+        mtime = parsedate_tz(mtime)
+    if mtime:
+        mtime = mktime_tz(mtime)
+        utime(filename, (mtime, mtime))
+
+    return True
+
+
+def _update(referentiel, force=False):
+    url = URL_BASE + '/' + referentiel
+    filename = join(DIR_BASE, referentiel)
+    # vérification de la présence d'une copie
+    if not exists(filename):
+        # fichier vide à date très ancienne pour déclencher la synchro
+        try:
+            open(filename, 'a').close()
+            utime(filename, (0, 0))
+        except IOError as e:
+            raise RuntimeError("La création du référentiel '%s' a été refusée"
+                               " :\n  %s" % (referentiel, e))
+    # type MIME attendu
+    if referentiel.endswith('.json'):
+        mimetype = 'application/json'
+    else:
+        mimetype = None
+    return retrieve(url, filename, mimetype=mimetype, force=force)
+
+
+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 = json.loads(data.decode())
+        except ValueError:
+            raise RuntimeError("Les données du référentiel '%s' ne sont pas "
+                               "au format JSON.\nLe 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):
+    filename = join(DIR_BASE, referentiel)
+    if exists(filename):
+        raise RuntimeError("Le référentiel '%s' avait déjà été ajouté."
+                           % referentiel)
+    _update(referentiel, force)
+
+
+def remove(referentiel):
+    filename = join(DIR_BASE, referentiel)
+    if not exists(filename):
+        raise RuntimeError("Le référentiel '%s' est absent." % referentiel)
+    try:
+        unlink(filename)
+    except (IOError, OSError) as e:
+        raise RuntimeError("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, force)
+        return
+    error_messages = []
+    for referentiel in list_present():
+        try:
+            _update(referentiel, force)
+        except Exception as e:
+            error_messages.append(str(e))
+    if error_messages:
+        raise RuntimeError('\n'.join(error_messages))
+
+
+def list_present():
+    return [n for n in listdir(DIR_BASE) if not n.startswith('.')]
+
+
+def list_available(force=False):
+    return get(AVAILABLE_LIST, force)
+
+
+def add_available(force=False):
+    missing = set(list_available(force)) - set(list_present())
+    for referentiel in missing:
+        _update(referentiel, force)
diff --git a/debian/auf-refer.cron.d b/debian/auf-refer.cron.d
new file mode 100644 (file)
index 0000000..783c3a7
--- /dev/null
@@ -0,0 +1 @@
+0 7,13 * * *   auf-refer       [ -x /usr/sbin/auf-refer ] && /usr/sbin/auf-refer -u
diff --git a/debian/auf-refer.dirs b/debian/auf-refer.dirs
new file mode 100644 (file)
index 0000000..b0ca721
--- /dev/null
@@ -0,0 +1,4 @@
+usr/sbin
+etc/auf-refer
+var/lib/auf-refer
+var/lib/auf-refer-photos
diff --git a/debian/auf-refer.lintian-overrides b/debian/auf-refer.lintian-overrides
new file mode 100644 (file)
index 0000000..91d663d
--- /dev/null
@@ -0,0 +1 @@
+auf-refer: binary-without-manpage usr/sbin/auf-refer-photos
diff --git a/debian/auf-refer.manpages b/debian/auf-refer.manpages
new file mode 100644 (file)
index 0000000..be719e0
--- /dev/null
@@ -0,0 +1 @@
+auf-refer.8
diff --git a/debian/auf-refer.postinst b/debian/auf-refer.postinst
new file mode 100644 (file)
index 0000000..b28509e
--- /dev/null
@@ -0,0 +1,23 @@
+#!/bin/sh
+
+set -e
+
+if ! getent passwd auf-refer >/dev/null ; then
+  adduser --disabled-password --quiet --system \
+    --home /var/lib/auf-refer --no-create-home \
+    --group auf-refer
+fi
+
+if [ -d /var/lib/auf-refer ] ; then
+  chown -R auf-refer:auf-refer /var/lib/auf-refer
+  chmod 0755 /var/lib/auf-refer
+fi
+
+if [ -d /var/lib/auf-refer-photos ] ; then
+  chown -R auf-refer:auf-refer /var/lib/auf-refer-photos
+  chmod 0755 /var/lib/auf-refer-photos
+fi
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/auf-refer.postrm b/debian/auf-refer.postrm
new file mode 100644 (file)
index 0000000..9e57529
--- /dev/null
@@ -0,0 +1,14 @@
+#!/bin/sh
+
+set -e
+
+#DEBHELPER#
+
+if [ "$1" = "purge" ] ; then
+  rm -rf /var/lib/auf-refer
+  rm -rf /var/lib/auf-refer-photos
+  deluser --quiet --system auf-refer
+  delgroup --quiet --system auf-refer
+fi
+
+exit 0
index 854515e..1188e00 100644 (file)
@@ -1,3 +1,10 @@
+auf-refer (2.0.1) unstable; urgency=medium
+
+  * bascule vers Python 3 (code + dépendances)
+  * bascule vers http://refer.auf/data
+
+ -- Progfou <jean-christophe.andre@auf.org>  Sat, 29 Aug 2015 17:16:33 -0400
+
 auf-refer (1.3.1) unstable; urgency=low
 
   * correction de bogues et amélioration de la gestion des erreurs
index 7ed6ff8..45a4fb7 100644 (file)
@@ -1 +1 @@
-5
+8
index 9be1650..d324161 100644 (file)
@@ -1,17 +1,15 @@
 Source: auf-refer
-Section: auf
+Section: misc
 Priority: optional
 Maintainer: Progfou <jean-christophe.andre@auf.org>
-Build-Depends: debhelper (>= 7), python (>= 2.6.6-3~)
-Standards-Version: 3.7.3
+Build-Depends: debhelper (>= 9), dh-python, python3, python3-setuptools
+Standards-Version: 3.9.5
 Homepage: http://git.auf.org/?p=auf-refer
-X-Python-Version: >= 2.5
+X-Python3-Version: >= 3.1
 
 Package: auf-refer
 Architecture: all
-Depends: ${python:Depends}, ${misc:Depends}, adduser, python-simplejson
-Replaces: auf-referentiels
-Conflicts: auf-referentiels
+Depends: ${misc:Depends}, ${python3:Depends}, adduser
 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.
diff --git a/debian/cron.d b/debian/cron.d
deleted file mode 100644 (file)
index 783c3a7..0000000
+++ /dev/null
@@ -1 +0,0 @@
-0 7,13 * * *   auf-refer       [ -x /usr/sbin/auf-refer ] && /usr/sbin/auf-refer -u
diff --git a/debian/dirs b/debian/dirs
deleted file mode 100644 (file)
index b0ca721..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-usr/sbin
-etc/auf-refer
-var/lib/auf-refer
-var/lib/auf-refer-photos
diff --git a/debian/lintian-overrides b/debian/lintian-overrides
deleted file mode 100644 (file)
index 1912100..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-auf-refer source: maintainer-not-full-name Progfou
-auf-refer: maintainer-not-full-name Progfou
-auf-refer: unknown-section auf
diff --git a/debian/manpages b/debian/manpages
deleted file mode 100644 (file)
index be719e0..0000000
+++ /dev/null
@@ -1 +0,0 @@
-auf-refer.8
diff --git a/debian/postinst b/debian/postinst
deleted file mode 100644 (file)
index e5d7fbb..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/sh
-
-set -e
-
-if getent passwd auf-referentiels >/dev/null ; then
-  deluser --quiet --system auf-referentiels
-  delgroup --quiet --system auf-referentiels
-fi
-
-if [ -d /usr/share/auf-referentiels ] ; then
-  mv /usr/share/auf-referentiels /var/lib/auf-refer
-fi
-
-if ! getent passwd auf-refer >/dev/null ; then
-  adduser --disabled-password --quiet --system \
-    --home /var/lib/auf-refer --no-create-home \
-    --group auf-refer
-fi
-
-if [ -d /var/lib/auf-refer ] ; then
-  chown -R auf-refer:auf-refer /var/lib/auf-refer
-  chmod 0755 /var/lib/auf-refer
-fi
-
-if [ -d /var/lib/auf-refer-photos ] ; then
-  chown -R auf-refer:auf-refer /var/lib/auf-refer-photos
-  chmod 0755 /var/lib/auf-refer-photos
-fi
-
-#DEBHELPER#
-
-exit 0
diff --git a/debian/postrm b/debian/postrm
deleted file mode 100644 (file)
index 9e57529..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/sh
-
-set -e
-
-#DEBHELPER#
-
-if [ "$1" = "purge" ] ; then
-  rm -rf /var/lib/auf-refer
-  rm -rf /var/lib/auf-refer-photos
-  deluser --quiet --system auf-refer
-  delgroup --quiet --system auf-refer
-fi
-
-exit 0
index 18bcae9..346c420 100755 (executable)
@@ -1,3 +1,8 @@
 #!/usr/bin/make -f
+export PYBUILD_NAME = aufrefer
+
 %:
-       dh $@ --with python2
+       dh $@ --with python3 --buildsystem pybuild
+
+override_dh_python3:
+       dh_python3 --shebang=/usr/bin/python3
index d104924..1914dfe 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -1,30 +1,33 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # -*- coding: utf-8 -*-
 
-from distutils.core import setup
+#from distutils.core import setup
+from setuptools import setup
 
-setup(name='auf-refer',
-    version='1.3.1',
+setup(
+    name='auf-refer',
+    version='2.0.1',
+    url='http://git.auf.org/?p=auf-refer.git',
+    license='LGPL',
     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.',
-    license='LGPL',
-    download_url='http://git.auf.org/?p=auf-refer.git;a=snapshot;sf=tgz',
+    packages=['aufrefer'],
+    include_package_data=True,
+    #zip_safe=False,
+    platforms='any',
+    install_requires=[],
     classifiers=[
         'License :: OSI Approved :: GNU Library or Lesser General Public License (LGPL)',
-        'License :: OSI Approved :: GNU General Public License (GPL)',
-        'Programming Language :: Python',
+        'Programming Language :: Python :: 3',
         'Topic :: Database :: Front-Ends',
         'Natural Language :: French',
     ],
-    requires=['simplejson'],
-    py_modules=['aufrefer'],
     data_files=[
         ('/etc/auf-refer',['auf-refer.conf','apache.conf']),
         ('/usr/sbin',['auf-refer','auf-refer-photos']),
         ('/usr/share/man/man8',['auf-refer.8']),
-        ],
-    )
-
+    ],
+    #download_url='http://git.auf.org/?p=auf-refer.git;a=snapshot;sf=tgz',
+)