]> git.decadent.org.uk Git - dak.git/blob - dak/dak.py
Adjust to deal with the new Debian supplementaryGid
[dak.git] / dak / dak.py
1 #!/usr/bin/env python
2
3 """
4 Wrapper to launch dak functionality
5
6 G{importgraph}
7
8 """
9 # Copyright (C) 2005, 2006 Anthony Towns <ajt@debian.org>
10 # Copyright (C) 2006 James Troup <james@nocrew.org>
11
12 # This program is free software; you can redistribute it and/or modify
13 # it under the terms of the GNU General Public License as published by
14 # the Free Software Foundation; either version 2 of the License, or
15 # (at your option) any later version.
16
17 # This program is distributed in the hope that it will be useful,
18 # but WITHOUT ANY WARRANTY; without even the implied warranty of
19 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 # GNU General Public License for more details.
21
22 # You should have received a copy of the GNU General Public License
23 # along with this program; if not, write to the Free Software
24 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
25
26 ################################################################################
27
28 # well I don't know where you're from but in AMERICA, there's a little
29 # thing called "abstinent until proven guilty."
30 #  -- http://harrietmiers.blogspot.com/2005/10/wow-i-feel-loved.html
31
32 # (if James had a blog, I bet I could find a funny quote in it to use!)
33
34 ################################################################################
35
36 import os
37 import sys
38 import traceback
39 import daklib.utils
40
41 from daklib.daklog import Logger
42 from daklib.config import Config
43 from daklib.dak_exceptions import CantOpenError
44
45 ################################################################################
46
47 def init():
48     """Setup the list of modules and brief explanation of what they
49     do."""
50
51     functionality = [
52         ("ls",
53          "Show which suites packages are in"),
54         ("override",
55          "Query/change the overrides"),
56         ("check-archive",
57          "Archive sanity checks"),
58         ("queue-report",
59          "Produce a report on NEW and BYHAND packages"),
60         ("show-new",
61          "Output html for packages in NEW"),
62         ("show-deferred",
63          "Output html and symlinks for packages in DEFERRED"),
64         ("graph",
65          "Output graphs of number of packages in various queues"),
66
67         ("rm",
68          "Remove packages from suites"),
69
70         ("process-new",
71          "Process NEW and BYHAND packages"),
72         ("process-upload",
73          "Process packages in queue/unchecked"),
74         ("process-commands",
75          "Process command files (*.dak-commands)"),
76         ("process-policy",
77          "Process packages in policy queues from COMMENTS files"),
78
79         ("dominate",
80          "Remove obsolete source and binary associations from suites"),
81         ("export",
82          "Export uploads from policy queues"),
83         ("export-suite",
84          "export a suite to a flat directory structure"),
85         ("make-pkg-file-mapping",
86          "Generate package <-> file mapping"),
87         ("generate-releases",
88          "Generate Release files"),
89         ("generate-packages-sources2",
90          "Generate Packages/Sources files"),
91         ("contents",
92          "Generate content files"),
93         ("metadata",
94          "Load data for packages/sources files"),
95         ("generate-index-diffs",
96          "Generate .diff/Index files"),
97         ("clean-suites",
98          "Clean unused/superseded packages from the archive"),
99         ("manage-build-queues",
100          "Clean and update metadata for build queues"),
101         ("clean-queues",
102          "Clean cruft from incoming"),
103
104         ("transitions",
105          "Manage the release transition file"),
106         ("check-overrides",
107          "Override cruft checks"),
108         ("control-overrides",
109          "Manipulate/list override entries in bulk"),
110         ("control-suite",
111          "Manipulate suites in bulk"),
112         ("update-suite",
113          "Update suite with packages from a different suite"),
114         ("cruft-report",
115          "Check for obsolete or duplicated packages"),
116         ("auto-decruft",
117          "Clean cruft without reverse dependencies automatically"),
118         ("examine-package",
119          "Show information useful for NEW processing"),
120         ("import",
121          "Import existing source and binary packages"),
122         ("import-repository",
123          "Import packages from another repository"),
124         ("import-keyring",
125          "Populate fingerprint/uid table based on a new/updated keyring"),
126         ("import-users-from-passwd",
127          "Sync PostgreSQL users with passwd file"),
128         ("acl",
129          "Manage upload ACLs"),
130         ("admin",
131          "Perform administration on the dak database"),
132         ("update-db",
133          "Updates databae schema to latest revision"),
134         ("init-dirs",
135          "Initial setup of the archive"),
136         ("make-maintainers",
137          "Generates Maintainers file for BTS etc"),
138         ("make-overrides",
139          "Generates override files"),
140         ("new-security-install",
141          "New way to install a security upload into the archive"),
142         ("stats",
143          "Generate statistics"),
144         ("bts-categorize",
145          "Categorize uncategorized bugs filed against ftp.debian.org"),
146         ("add-user",
147          "Add a user to the archive"),
148         ("make-changelog",
149          "Generate changelog between two suites"),
150         ("copy-installer",
151          "Copies the installer from one suite to another"),
152         ("override-disparity",
153          "Generate a list of override disparities"),
154         ("external-overrides",
155          "Modify external overrides"),
156         ]
157     return functionality
158
159 ################################################################################
160
161 def usage(functionality, exit_code=0):
162     """Print a usage message and exit with 'exit_code'."""
163
164     print """Usage: dak COMMAND [...]
165 Run DAK commands.  (Will also work if invoked as COMMAND.)
166
167 Available commands:"""
168     for (command, description) in functionality:
169         print "  %-23s %s" % (command, description)
170     sys.exit(exit_code)
171
172 ################################################################################
173
174 def main():
175     """Launch dak functionality."""
176
177
178     try:
179         logger = Logger('dak top-level', print_starting=False)
180     except CantOpenError:
181         logger = None
182
183     functionality = init()
184     modules = [ command for (command, _) in functionality ]
185
186     if len(sys.argv) == 0:
187         daklib.utils.fubar("err, argc == 0? how is that possible?")
188     elif (len(sys.argv) == 1
189           or (len(sys.argv) == 2 and
190               (sys.argv[1] == "--help" or sys.argv[1] == "-h"))):
191         usage(functionality)
192
193     # First see if we were invoked with/as the name of a module
194     cmdname = sys.argv[0]
195     cmdname = cmdname[cmdname.rfind("/")+1:]
196     if cmdname in modules:
197         pass
198     # Otherwise the argument is the module
199     else:
200         cmdname = sys.argv[1]
201         sys.argv = [sys.argv[0] + " " + sys.argv[1]] + sys.argv[2:]
202         if cmdname not in modules:
203             match = []
204             for name in modules:
205                 if name.startswith(cmdname):
206                     match.append(name)
207             if len(match) == 1:
208                 cmdname = match[0]
209             elif len(match) > 1:
210                 daklib.utils.warn("ambiguous command '%s' - could be %s" \
211                            % (cmdname, ", ".join(match)))
212                 usage(functionality, 1)
213             else:
214                 daklib.utils.warn("unknown command '%s'" % (cmdname))
215                 usage(functionality, 1)
216
217     # Invoke the module
218     module = __import__(cmdname.replace("-","_"))
219
220     try:
221         module.main()
222     except KeyboardInterrupt:
223         msg = 'KeyboardInterrupt caught; exiting'
224         print msg
225         if logger:
226             logger.log([msg])
227         sys.exit(1)
228     except SystemExit:
229         pass
230     except:
231         if logger:
232             for line in traceback.format_exc().split('\n')[:-1]:
233                 logger.log(['exception', line])
234         raise
235
236 ################################################################################
237
238 if __name__ == "__main__":
239     os.environ['LANG'] = 'C'
240     os.environ['LC_ALL'] = 'C'
241     main()