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