2241099a655f0c55b98b12a374e13c1ec6a15294
[auf-refer.git] / auf-refer
1 #!/usr/bin/python
2 # -*- coding: utf-8 -*-
3 """Outil de copie et mise à jour des référentiels AuF.
4
5 Copyright ©2009  Agence universitaire de la Francophonie
6 Licence : GPL version 3
7 Auteur : Progfou <jean-christophe.andre@auf.org>
8
9 Dépendances Debian : python >= 2.5
10 """
11
12 RUN_USER = 'auf-refer'
13
14 __all__ = ( 'RUN_USER' )
15
16 USAGE = """Usages (nécessite parfois "root", par exemple via "sudo") :
17   auf-refer [-f] -a <ref> - copie un nouveau référentiel
18   auf-refer -r <ref>      - supprime un référentiel
19   auf-refer -p <ref>      - affiche le chemin d'accès à un référentiel
20   auf-refer -c <ref>      - affiche le contenu d'un référentiel
21   auf-refer [-f] -u       - met à jour les référentiels
22   auf-refer -l            - liste les référentiels copiés
23   auf-refer [-f] -L       - liste les référentiels disponibles
24   auf-refer [-f] -A       - copie tous les référentiels disponibles
25
26 L'option -f permet de forcer le rechargement à travers un proxy/cache.
27 """
28
29 from sys import argv, exit, stderr
30 from getopt import getopt, GetoptError
31 from pwd import getpwnam
32 from os import getuid, setgid, setuid
33 import aufrefer
34
35 if __name__ == '__main__':
36     # interdiction formelle de tourner sous 'root'
37     if getuid() == 0:
38         try:
39             pw = getpwnam(RUN_USER)
40         except KeyError:
41             raise RuntimeError, "L'utilisateur '%s' n'existe pas." % RUN_USER
42         try:
43             setgid(pw.pw_gid)
44             setuid(pw.pw_uid)
45         except OSError:
46             raise RuntimeError, \
47                 "Impossible de basculer vers l'utilisateur '%s'.\n" \
48                 "Réessayez avec 'sudo' !" % RUN_USER
49
50     try:
51         opts, args = getopt(argv[1:], 'hfa:r:p:c:ulLA', ['help', 'force',
52             'add=', 'remove=', 'path=', 'content=', 'update', 'list',
53             'list-available', 'add-available'])
54     except GetoptError:
55         print USAGE
56         exit(1)
57
58     force = False
59     for opt, arg in opts:
60         if opt in ('-h', '--help'):
61             print USAGE
62             exit(0)
63         elif opt in ('-f', '--force'):
64             force = True
65         else:
66             try:
67                 if opt in ('-a', '--add'):
68                     aufrefer.add(arg, force=force)
69                 elif opt in ('-r', '--remove'):
70                     aufrefer.remove(arg)
71                 elif opt in ('-p', '--path'):
72                     print aufrefer.path(arg)
73                 elif opt in ('-c', '--content'):
74                     f = file(aufrefer.path(arg), 'rb')
75                     stdout.write(f.read())
76                     f.close()
77                 elif opt in ('-u', '--update'):
78                     aufrefer.update(force=force)
79                 elif opt in ('-l', '--list'):
80                     for referentiel in aufrefer.list():
81                         print referentiel
82                 elif opt in ('-L', '--list-available'):
83                     list = aufrefer.list_available(force=force)
84                     for referentiel in sorted(list):
85                         print "%-16s : %s" % (referentiel, list[referentiel])
86                 elif opt in ('-A', '--add-available'):
87                     aufrefer.add_available(force=force)
88             except RuntimeError, e:
89                 print >>stderr, e
90
91     if not opts:
92         print USAGE
93     exit(0)
94