]> git.ipfire.org Git - people/jschlag/pbs.git/blob - web/__init__.py
Redesign the displayed job list on the main page.
[people/jschlag/pbs.git] / web / __init__.py
1 #!/usr/bin/python
2
3 import logging
4 import os.path
5 import tornado.httpserver
6 import tornado.locale
7 import tornado.options
8 import tornado.web
9
10 from handlers import *
11 from ui_modules import *
12
13 BASEDIR = os.path.join(os.path.dirname(__file__), "..", "data")
14
15 # Enable logging
16 tornado.options.parse_command_line()
17
18 class Application(tornado.web.Application):
19 def __init__(self):
20 self.__pakfire = None
21
22 settings = dict(
23 debug = True,
24 gzip = True,
25 login_url = "/login",
26 template_path = os.path.join(BASEDIR, "templates"),
27 ui_modules = {
28 "Text" : TextModule,
29 "Modal" : ModalModule,
30
31 "Footer" : FooterModule,
32
33 # Logging
34 "Log" : LogModule,
35 "LogEntry" : LogEntryModule,
36 "LogEntryComment" : LogEntryCommentModule,
37
38 # Builders
39 "BuildersLoad" : BuildersLoadModule,
40
41 "BuildHeadline" : BuildHeadlineModule,
42 "BuildStateWarnings" : BuildStateWarningsModule,
43
44 "BugsTable" : BugsTableModule,
45 "BuildLog" : BuildLogModule,
46 "BuildOffset" : BuildOffsetModule,
47 "BuildTable" : BuildTableModule,
48
49 # Changelog
50 "Changelog" : ChangelogModule,
51 "ChangelogEntry" : ChangelogEntryModule,
52
53 # Jobs
54 "JobsList" : JobsListModule,
55
56 # Packages
57 "PackagesDependencyTable" : PackagesDependencyTableModule,
58
59 "CommitsTable" : CommitsTableModule,
60 "JobsBoxes" : JobsBoxesModule,
61 "JobState" : JobStateModule,
62 "JobsTable" : JobsTableModule,
63 "CommentsTable" : CommentsTableModule,
64 "FilesTable" : FilesTableModule,
65 "LogTable" : LogTableModule,
66 "LogFilesTable" : LogFilesTableModule,
67 "Maintainer" : MaintainerModule,
68 "PackagesTable" : PackagesTableModule,
69 "PackageTable2" : PackageTable2Module,
70 "PackageHeader" : PackageHeaderModule,
71 "PackageFilesTable" : PackageFilesTableModule,
72 "RepositoryTable" : RepositoryTableModule,
73 "RepoActionsTable" : RepoActionsTableModule,
74 "SourceTable" : SourceTableModule,
75 "UpdatesTable" : UpdatesTableModule,
76 "UsersTable" : UsersTableModule,
77 "WatchersSidebarTable" : WatchersSidebarTableModule,
78
79 "SelectLocale" : SelectLocaleModule,
80 "SelectTimezone" : SelectTimezoneModule,
81 },
82 xsrf_cookies = True,
83 )
84
85 # Load translations.
86 tornado.locale.load_gettext_translations(
87 os.path.join(BASEDIR, "translations"), "pakfire")
88
89 tornado.web.Application.__init__(self, **settings)
90
91 self.settings["static_path"] = static_path = os.path.join(BASEDIR, "static")
92 static_handlers = [
93 (r"/static/(.*)", tornado.web.StaticFileHandler, dict(path = static_path)),
94 (r"/(favicon\.ico)", tornado.web.StaticFileHandler, dict(path = static_path)),
95 (r"/(robots\.txt)", tornado.web.StaticFileHandler, dict(path = static_path)),
96 ]
97
98 self.add_handlers(r".*", [
99 # Entry site that lead the user to index
100 (r"/", IndexHandler),
101
102 # Handle all the users logins/logouts/registers and stuff.
103 (r"/login", LoginHandler),
104 (r"/logout", LogoutHandler),
105 (r"/register", RegisterHandler),
106 (r"/password-recovery", PasswordRecoveryHandler),
107
108 # User profiles
109 (r"/users", UsersHandler),
110 (r"/users/comments", UsersCommentsHandler),
111 (r"/user/impersonate", UserImpersonateHandler),
112 (r"/user/(\w+)/passwd", UserPasswdHandler),
113 (r"/user/(\w+)/delete", UserDeleteHandler),
114 (r"/user/(\w+)/edit", UserEditHandler),
115 (r"/user/(\w+)/activate", ActivationHandler),
116 (r"/user/(\w+)", UserHandler),
117 (r"/profile", UserHandler),
118 (r"/profile/builds", UsersBuildsHandler),
119
120 # Packages
121 (r"/packages", PackageListHandler),
122 (r"/package/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", PackageDetailHandler),
123 (r"/package/([\w\-\+]+)/properties", PackagePropertiesHandler),
124 (r"/package/([\w\-\+]+)", PackageNameHandler),
125 (r"/package/([\w\-\+]+)/changelog", PackageChangelogHandler),
126 (r"/package/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/download(.*)", PackageFileDownloadHandler),
127 (r"/package/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/view(.*)", PackageFileViewHandler),
128
129 # Files
130 (r"/file/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", FileDetailHandler),
131
132 # Builds
133 (r"/builds", BuildsHandler),
134 (r"/builds/filter", BuildFilterHandler),
135 (r"/builds/queue", BuildQueueHandler),
136 (r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", BuildDetailHandler),
137 (r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/bugs", BuildBugsHandler),
138 (r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/manage", BuildManageHandler),
139 (r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/comment", BuildDetailCommentHandler),
140 (r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/priority", BuildPriorityHandler),
141 (r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/state", BuildStateHandler),
142 (r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/watch", BuildWatchersAddHandler),
143 (r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/watchers", BuildWatchersHandler),
144 (r"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/delete", BuildDeleteHandler),
145
146 # Jobs
147 (r"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", JobDetailHandler),
148 (r"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/abort", JobAbortHandler),
149 (r"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/buildroot", JobBuildrootHandler),
150 (r"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/schedule", JobScheduleHandler),
151
152 # Builders
153 (r"/builders", BuilderListHandler),
154 (r"/builder/new", BuilderNewHandler),
155 (r"/builder/([A-Za-z0-9\-\.]+)/enable", BuilderEnableHander),
156 (r"/builder/([A-Za-z0-9\-\.]+)/disable", BuilderDisableHander),
157 (r"/builder/([A-Za-z0-9\-\.]+)/delete", BuilderDeleteHandler),
158 (r"/builder/([A-Za-z0-9\-\.]+)/edit", BuilderEditHandler),
159 (r"/builder/([A-Za-z0-9\-\.]+)/renew", BuilderRenewPassphraseHandler),
160 (r"/builder/([A-Za-z0-9\-\.]+)", BuilderDetailHandler),
161
162 # Distributions
163 (r"/distros", DistributionListHandler),
164 (r"/distro/([A-Za-z0-9\-\.]+)", DistributionDetailHandler),
165
166 # XXX THOSE URLS ARE DEPRECATED
167 (r"/distribution/delete/([A-Za-z0-9\-\.]+)", DistributionDetailHandler),
168 (r"/distribution/edit/([A-Za-z0-9\-\.]+)", DistributionEditHandler),
169
170 (r"/distro/([A-Za-z0-9\-\.]+)/repo/([A-Za-z0-9\-]+)",
171 RepositoryDetailHandler),
172 (r"/distro/([A-Za-z0-9\-\.]+)/repo/([A-Za-z0-9\-]+)\.repo",
173 RepositoryConfHandler),
174 (r"/distro/([A-Za-z0-9\-\.]+)/repo/([A-Za-z0-9\-]+)/mirrorlist",
175 RepositoryMirrorlistHandler),
176 (r"/distro/([A-Za-z0-9\-\.]+)/repo/([A-Za-z0-9\-]+)/edit",
177 RepositoryEditHandler),
178
179 (r"/distro/([A-Za-z0-9\-\.]+)/source/([A-Za-z0-9\-\.]+)",
180 DistroSourceDetailHandler),
181 (r"/distro/([A-Za-z0-9\-\.]+)/source/([A-Za-z0-9\-\.]+)/commits",
182 DistroSourceCommitsHandler),
183 (r"/distro/([A-Za-z0-9\-\.]+)/source/([A-Za-z0-9\-\.]+)/([\w]{40})",
184 DistroSourceCommitDetailHandler),
185 (r"/distro/([A-Za-z0-9\-\.]+)/source/([A-Za-z0-9\-\.]+)/([\w]{40})/reset",
186 DistroSourceCommitResetHandler),
187
188 (r"/distro/([A-Za-z0-9\-\.]+)/update/create",
189 DistroUpdateCreateHandler),
190 (r"/distro/([A-Za-z0-9\-\.]+)/update/(\d+)/(\d+)",
191 DistroUpdateDetailHandler),
192
193 # Updates
194 (r"/updates", UpdatesHandler),
195
196 # Mirrors
197 (r"/mirrors", MirrorListHandler),
198 (r"/mirror/new", MirrorNewHandler),
199 (r"/mirror/([A-Za-z0-9\-\.]+)/delete", MirrorDeleteHandler),
200 (r"/mirror/([A-Za-z0-9\-\.]+)/edit", MirrorEditHandler),
201 (r"/mirror/([A-Za-z0-9\-\.]+)", MirrorDetailHandler),
202
203 # Key management
204 (r"/keys", KeysListHandler),
205 (r"/key/import", KeysImportHandler),
206 (r"/key/([A-Z0-9]+)", KeysDownloadHandler),
207 (r"/key/([A-Z0-9]+)/delete", KeysDeleteHandler),
208
209 # Statistics
210 (r"/statistics", StatisticsMainHandler),
211
212 # Documents
213 (r"/documents", DocsIndexHandler),
214 (r"/documents/builds", DocsBuildsHandler),
215 (r"/documents/users", DocsUsersHandler),
216 (r"/documents/what-is-the-pakfire-build-service", DocsWhatsthisHandler),
217
218 # Search
219 (r"/search", SearchHandler),
220
221 # Uploads
222 (r"/uploads", UploadsHandler),
223
224 # Log
225 (r"/log", LogHandler),
226
227 ] + static_handlers + [
228
229 # Everything else is catched by the 404 handler.
230 (r"/.*", Error404Handler),
231 ])
232
233 logging.info("Successfully initialied application")
234
235 @property
236 def pakfire(self):
237 if self.__pakfire is None:
238 config_file = os.path.join(BASEDIR, "..", "pbs.conf")
239
240 self.__pakfire = backend.Pakfire(config_file=config_file)
241
242 return self.__pakfire
243
244 def __del__(self):
245 logging.info("Shutting down application")
246
247 @property
248 def ioloop(self):
249 return tornado.ioloop.IOLoop.instance()
250
251 def shutdown(self, *args):
252 logging.debug("Caught shutdown signal")
253 self.ioloop.stop()
254
255 def run(self, port=80):
256 logging.debug("Going to background")
257
258 http_server = tornado.httpserver.HTTPServer(self, xheaders=True)
259
260 # If we are not running in debug mode, we can actually run multiple
261 # frontends to get best performance out of our service.
262 if not self.settings["debug"]:
263 http_server.bind(port)
264 http_server.start(num_processes=4)
265 else:
266 http_server.listen(port)
267
268 # All requests should be done after 60 seconds or they will be killed.
269 self.ioloop.set_blocking_log_threshold(60)
270
271 self.ioloop.start()
272
273 def reload(self):
274 logging.debug("Caught reload signal")