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