releasing version 1.3
authorProgfou <jean-christophe.andre@auf.org>
Fri, 28 Oct 2011 18:14:49 +0000 (01:14 +0700)
committerProgfou <jean-christophe.andre@auf.org>
Fri, 28 Oct 2011 18:15:05 +0000 (01:15 +0700)
 * aufrefer.py : séparation des fonctions de chargement et mise à jour
 * auf-refer-photos : nouvel outil de copie des photos des personnels AuF

.gitignore [new file with mode: 0644]
auf-refer
auf-refer-photos [new file with mode: 0755]
aufrefer.py
debian/changelog
debian/dirs
debian/postinst
debian/postrm
setup.py

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..0d20b64
--- /dev/null
@@ -0,0 +1 @@
+*.pyc
index 19c172a..c3d609e 100755 (executable)
--- a/auf-refer
+++ b/auf-refer
@@ -8,6 +8,11 @@ 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
+from pwd import getpwnam
+from os import getuid, setgid, setuid
+import aufrefer
 
 RUN_USER = 'auf-refer'
 
@@ -26,12 +31,6 @@ USAGE = """Usages (nécessite parfois "root", par exemple via "sudo") :
 L'option -f permet de forcer le rechargement à travers un proxy/cache.
 """
 
-from sys import argv, exit, stdout, stderr
-from getopt import getopt, GetoptError
-from pwd import getpwnam
-from os import getuid, setgid, setuid
-import aufrefer
-
 if __name__ == '__main__':
     # interdiction formelle de tourner sous 'root'
     if getuid() == 0:
diff --git a/auf-refer-photos b/auf-refer-photos
new file mode 100755 (executable)
index 0000000..645100b
--- /dev/null
@@ -0,0 +1,100 @@
+#!/usr/bin/python
+# -*- coding: utf-8 -*-
+"""Outil de copie et mise à jour des photos des personnels AuF.
+
+Copyright ©2009-2011  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
+import aufrefer
+
+RUN_USER = 'auf-refer'
+
+__all__ = ( 'RUN_USER' )
+
+USAGE = """Usages (nécessite parfois "root", par exemple via "sudo") :
+  auf-refer-photos <adél> - copie la photo correspondante à l'adél
+  auf-refer-photos tout   - copie toutes les photos disponibles"""
+
+PHOTO_URL = 'http://intranet.auf/photos_employes/d-0340-%s-photo.jpg'
+PHOTO_FILENAME = '/var/lib/auf-refer-photos/%s.jpg'
+
+def update(adels=None, verbose=True, force=False):
+    employes = aufrefer.get('datamaster-employe.json')
+    if adels:
+        employes = filter(lambda e: e['courriel'] in adels, employes)
+    for e in employes:
+        adel = e['courriel']
+        url = PHOTO_URL % e['id']
+        filename = PHOTO_FILENAME % adel
+        try:
+            r = aufrefer.retrieve(url, filename, mimetype='image/jpeg', 
+                                                            force=force)
+            if verbose and r:
+                print "Photo récupérée pour %s." % adel
+        except URLError:
+            if verbose:
+                print "Photo non disponible pour %s." % adel
+        except HTTPError:
+            if verbose:
+                print "Problème avec la photo pour %s." % adel
+        except KeyboardInterrupt:
+                print "Abandon."
+                return
+        adels.remove(adel)
+    if verbose:
+        print "Adéls ignorées :", ', '.join(adels)
+
+if __name__ == '__main__':
+    # interdiction formelle de tourner sous 'root'
+    if getuid() == 0:
+        try:
+            pw = getpwnam(RUN_USER)
+        except KeyError:
+            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
+
+    try:
+        opts, args = getopt(argv[1:], 'hvf', ['help', 'verbose', 'force'])
+    except GetoptError:
+        print USAGE
+        exit(1)
+    if not args:
+        print USAGE
+        exit(1)
+
+    verbose = False
+    force = False
+    for opt, arg in opts:
+        if opt in ('-h', '--help'):
+            print USAGE
+            exit(0)
+        elif opt in ('-v', '--verbose'):
+            verbose = True
+        elif opt in ('-f', '--force'):
+            force = True
+
+    if len(args) == 1 and args[0] == 'tout':
+        adels = None
+    else:
+        adels = args
+    try:
+        update(adels, verbose=verbose, force=force)
+    except RuntimeError, e:
+        print >>stderr, e
+        exit(1)
+    exit(0)
+
index dd0f4df..712a6a8 100644 (file)
@@ -8,6 +8,14 @@ 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'
 
@@ -30,60 +38,47 @@ __all__ = ( 'DIR_BASE', 'URL_BASE', 'AVAILABLE_LIST' )
 
 TIME_FORMAT = '%a, %d %b %Y %H:%M:%S GMT'
 
-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
-
 def path(referentiel):
     return join(DIR_BASE, referentiel)
 
-def _update(referentiel, force=False):
+def retrieve(url, filename, force=False, mimetype=None):
     headers = {}
     headers['Accept-Encoding'] = 'gzip,x-gzip'
+    # ajout d'un champ pour forcer le cache au besoin
     if force:
         headers['Pragma'] = 'no-cache'
-    filename = join(DIR_BASE, referentiel)
+    # 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)
-    else:
-        # fichier vide à date très ancienne pour déclencher la synchro
-        try:
-            file(filename, 'a').close()
-        except IOError, e:
-            raise RuntimeError, \
-                "La création du référentiel '%s' a été refusée :\n  %s" \
-                                                        % (referentiel, e)
-        utime(filename, (0, 0))
-    url = URL_BASE + '/' + referentiel
+    # 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
+            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()
-    if referentiel.endswith('.json') and i.type != 'application/json':
+    # vérification du type MIME
+    if mimetype and i.type != mimetype:
         u.close()
         raise RuntimeError, \
-            "Le type des données chargées n'est pas JSON mais '%s'.\n" \
-            "URL concernée : %s" % (i.type, url)
+            "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()
-    if referentiel.endswith('.json'):
+    # test de validité des données en cas de JSON
+    if mimetype == 'application/json':
         try:
             loads(data, encoding='utf-8')
         except ValueError:
@@ -96,16 +91,38 @@ def _update(referentiel, force=False):
         umask(old_umask)
     except IOError, e:
         raise RuntimeError, \
-            "L'écriture du référentiel '%s' a été refusée :\n  %s" \
-                                                        % (referentiel, e)
+            "L'écriture du fichier '%s' a été refusée :\n  %s" \
+                                                        % (filename, e)
     f.write(data)
     f.close()
-    # on fixe la date donnée par le serveur, le cas échéant
+    # 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):
index 71053cd..50e58f8 100644 (file)
@@ -1,4 +1,11 @@
-auf-refer (1.2.1) squeeze; urgency=low
+auf-refer (1.3) unstable; urgency=low
+
+  * aufrefer.py : séparation des fonctions de chargement et mise à jour
+  * auf-refer-photos : nouvel outil de copie des photos des personnels AuF
+
+ -- Progfou <jean-christophe.andre@auf.org>  Sat, 29 Oct 2011 00:47:58 +0700
+
+auf-refer (1.2.1) unstable; urgency=low
 
   * adaptations pour Debian Squeeze (passage à dh, arrivé avec debhelper 7)
 
index b34c28e..b0ca721 100644 (file)
@@ -1,3 +1,4 @@
 usr/sbin
 etc/auf-refer
 var/lib/auf-refer
+var/lib/auf-refer-photos
index a1dfe59..e5d7fbb 100644 (file)
@@ -22,6 +22,11 @@ if [ -d /var/lib/auf-refer ] ; then
   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
index e8009c0..9e57529 100644 (file)
@@ -6,6 +6,7 @@ set -e
 
 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
index 228d870..d068ff2 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -4,7 +4,7 @@
 from distutils.core import setup
 
 setup(name='auf-refer',
-    version='1.2.1',
+    version='1.3',
     author='Progfou',
     author_email='jean-christophe.andre@auf.org',
     url='http://git.auf.org/?p=auf-refer.git',
@@ -23,7 +23,7 @@ setup(name='auf-refer',
     py_modules=['aufrefer'],
     data_files=[
         ('/etc/auf-refer',['auf-refer.conf','apache.conf']),
-        ('/usr/sbin',['auf-refer']),
+        ('/usr/sbin',['auf-refer','auf-refer-photos']),
         ('/usr/share/man/man8',['auf-refer.8']),
         ],
     )