releasing version 1.1.1
[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, stdout, 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