7 import tornado
.httpserver
12 from .. import Backend
13 from ..constants
import *
14 from ..decorators
import *
19 from . import builders
21 from . import distributions
26 from . import packages
30 from .handlers
import *
32 from . import ui_modules
35 tornado
.options
.define("debug", default
=False, help="Run in debug mode", type=bool)
36 tornado
.options
.parse_command_line()
38 class Application(tornado
.web
.Application
):
39 def __init__(self
, **_settings
):
41 debug
= tornado
.options
.options
.debug
,
44 template_path
= TEMPLATESDIR
,
45 static_path
= STATICDIR
,
47 "Text" : ui_modules
.TextModule
,
48 "Modal" : ui_modules
.ModalModule
,
50 "Footer" : ui_modules
.FooterModule
,
53 "Log" : ui_modules
.LogModule
,
54 "LogEntry" : ui_modules
.LogEntryModule
,
55 "LogEntryComment" : ui_modules
.LogEntryCommentModule
,
57 "BuildHeadline" : ui_modules
.BuildHeadlineModule
,
58 "BuildStateWarnings" : ui_modules
.BuildStateWarningsModule
,
60 "BugsTable" : ui_modules
.BugsTableModule
,
61 "BuildLog" : ui_modules
.BuildLogModule
,
62 "BuildOffset" : ui_modules
.BuildOffsetModule
,
63 "BuildTable" : ui_modules
.BuildTableModule
,
66 "Changelog" : ui_modules
.ChangelogModule
,
67 "ChangelogEntry" : ui_modules
.ChangelogEntryModule
,
70 "JobsList" : ui_modules
.JobsListModule
,
71 "JobsStatus" : ui_modules
.JobsStatusModule
,
74 "PackagesDependencyTable" : ui_modules
.PackagesDependencyTableModule
,
76 "CommitMessage" : ui_modules
.CommitMessageModule
,
77 "CommitsTable" : ui_modules
.CommitsTableModule
,
78 "JobsBoxes" : ui_modules
.JobsBoxesModule
,
79 "JobState" : ui_modules
.JobStateModule
,
80 "JobsTable" : ui_modules
.JobsTableModule
,
81 "CommentsTable" : ui_modules
.CommentsTableModule
,
82 "FilesTable" : ui_modules
.FilesTableModule
,
83 "LogTable" : ui_modules
.LogTableModule
,
84 "LogFilesTable" : ui_modules
.LogFilesTableModule
,
85 "Maintainer" : ui_modules
.MaintainerModule
,
86 "PackagesTable" : ui_modules
.PackagesTableModule
,
87 "PackageTable2" : ui_modules
.PackageTable2Module
,
88 "PackageHeader" : ui_modules
.PackageHeaderModule
,
89 "PackageFilesTable" : ui_modules
.PackageFilesTableModule
,
90 "RepositoryTable" : ui_modules
.RepositoryTableModule
,
91 "RepoActionsTable" : ui_modules
.RepoActionsTableModule
,
92 "SourceTable" : ui_modules
.SourceTableModule
,
93 "UpdatesTable" : ui_modules
.UpdatesTableModule
,
94 "UsersTable" : ui_modules
.UsersTableModule
,
95 "WatchersSidebarTable" : ui_modules
.WatchersSidebarTableModule
,
97 "HeadingDate" : ui_modules
.HeadingDateModule
,
99 "SelectLocale" : ui_modules
.SelectLocaleModule
,
100 "SelectTimezone" : ui_modules
.SelectTimezoneModule
,
103 "format_time" : self
.format_time
,
107 settings
.update(_settings
)
110 tornado
.locale
.load_gettext_translations(LOCALEDIR
, PACKAGE_NAME
)
112 tornado
.web
.Application
.__init
__(self
, [
113 # Entry site that lead the user to index
114 (r
"/", IndexHandler
),
116 # Handle all the users logins/logouts/registers and stuff.
117 (r
"/login", auth
.LoginHandler
),
118 (r
"/logout", auth
.LogoutHandler
),
119 (r
"/register", auth
.RegisterHandler
),
120 (r
"/password-recovery", auth
.PasswordRecoveryHandler
),
123 (r
"/users", users
.UsersHandler
),
124 (r
"/user/(\w+)/impersonate", users
.UserImpersonateHandler
),
125 (r
"/user/(\w+)/passwd", users
.UserPasswdHandler
),
126 (r
"/user/(\w+)/delete", users
.UserDeleteHandler
),
127 (r
"/user/(\w+)/edit", users
.UserEditHandler
),
128 (r
"/user/(\w+)/activate", auth
.ActivationHandler
),
129 (r
"/user/(\w+)", users
.UserHandler
),
130 (r
"/profile", users
.UserHandler
),
131 (r
"/profile/builds", users
.UsersBuildsHandler
),
134 (r
"/packages", packages
.IndexHandler
),
135 (r
"/package/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", packages
.PackageDetailHandler
),
136 (r
"/package/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/download(.*)", packages
.PackageFileDownloadHandler
),
137 (r
"/package/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/view(.*)", packages
.PackageFileViewHandler
),
138 (r
"/package/([\w\-\+]+)", packages
.PackageNameHandler
),
139 (r
"/package/([\w\-\+]+)/builds/scratch", packages
.PackageScratchBuildsHandler
),
140 (r
"/package/([\w\-\+]+)/builds/times", packages
.PackageBuildsTimesHandler
),
141 (r
"/package/([\w\-\+]+)/changelog", packages
.PackageChangelogHandler
),
142 (r
"/package/([\w\-\+]+)/properties", packages
.PackagePropertiesHandler
),
145 (r
"/file/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", FileDetailHandler
),
148 (r
"/builds", builds
.BuildsHandler
),
149 (r
"/builds/filter", builds
.BuildFilterHandler
),
150 (r
"/builds/queue", builds
.BuildQueueHandler
),
151 (r
"/builds/comments", builds
.BuildsCommentsHandler
),
152 (r
"/builds/comments/(\w+)", builds
.BuildsCommentsHandler
),
153 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", builds
.BuildDetailHandler
),
154 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/bugs", builds
.BuildBugsHandler
),
155 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/manage", builds
.BuildManageHandler
),
156 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/comment", builds
.BuildDetailCommentHandler
),
157 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/priority", builds
.BuildPriorityHandler
),
158 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/state", builds
.BuildStateHandler
),
159 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/watch", builds
.BuildWatchersAddHandler
),
160 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/watchers", builds
.BuildWatchersHandler
),
161 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/delete", builds
.BuildDeleteHandler
),
163 (r
"/queue", jobs
.ShowQueueHandler
),
164 (r
"/queue/([\w_]+)", jobs
.ShowQueueHandler
),
167 (r
"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", jobs
.JobDetailHandler
),
168 (r
"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/abort", jobs
.JobAbortHandler
),
169 (r
"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/buildroot", jobs
.JobBuildrootHandler
),
170 (r
"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/schedule", jobs
.JobScheduleHandler
),
173 (r
"/builders", builders
.BuilderListHandler
),
174 (r
"/builder/new", builders
.BuilderNewHandler
),
175 (r
"/builder/([A-Za-z0-9\-\.]+)/enable", builders
.BuilderEnableHander
),
176 (r
"/builder/([A-Za-z0-9\-\.]+)/disable", builders
.BuilderDisableHander
),
177 (r
"/builder/([A-Za-z0-9\-\.]+)/delete", builders
.BuilderDeleteHandler
),
178 (r
"/builder/([A-Za-z0-9\-\.]+)/edit", builders
.BuilderEditHandler
),
179 (r
"/builder/([A-Za-z0-9\-\.]+)/renew", builders
.BuilderRenewPassphraseHandler
),
180 (r
"/builder/([A-Za-z0-9\-\.]+)", builders
.BuilderDetailHandler
),
183 (r
"/distros", distributions
.DistributionListHandler
),
184 (r
"/distro/([A-Za-z0-9\-\.]+)", distributions
.DistributionDetailHandler
),
186 # XXX THOSE URLS ARE DEPRECATED
187 (r
"/distribution/delete/([A-Za-z0-9\-\.]+)", distributions
.DistributionDetailHandler
),
188 (r
"/distribution/edit/([A-Za-z0-9\-\.]+)", distributions
.DistributionEditHandler
),
190 (r
"/distro/([A-Za-z0-9\-\.]+)/repo/([A-Za-z0-9\-]+)",
191 RepositoryDetailHandler
),
192 (r
"/distro/([A-Za-z0-9\-\.]+)/repo/([A-Za-z0-9\-]+)\.repo",
193 RepositoryConfHandler
),
194 (r
"/distro/([A-Za-z0-9\-\.]+)/repo/([A-Za-z0-9\-]+)/mirrorlist",
195 RepositoryMirrorlistHandler
),
196 (r
"/distro/([A-Za-z0-9\-\.]+)/repo/([A-Za-z0-9\-]+)/edit",
197 RepositoryEditHandler
),
199 (r
"/distro/([A-Za-z0-9\-\.]+)/source/([A-Za-z0-9\-\.]+)",
200 distributions
.DistroSourceDetailHandler
),
201 (r
"/distro/([A-Za-z0-9\-\.]+)/source/([A-Za-z0-9\-\.]+)/commits",
202 distributions
.DistroSourceCommitsHandler
),
203 (r
"/distro/([A-Za-z0-9\-\.]+)/source/([A-Za-z0-9\-\.]+)/([\w]{40})",
204 distributions
.DistroSourceCommitDetailHandler
),
205 (r
"/distro/([A-Za-z0-9\-\.]+)/source/([A-Za-z0-9\-\.]+)/([\w]{40})/reset",
206 distributions
.DistroSourceCommitResetHandler
),
208 (r
"/distro/([A-Za-z0-9\-\.]+)/update/create",
209 distributions
.DistroUpdateCreateHandler
),
210 (r
"/distro/([A-Za-z0-9\-\.]+)/update/(\d+)/(\d+)",
211 distributions
.DistroUpdateDetailHandler
),
214 (r
"/updates", updates
.UpdatesHandler
),
217 (r
"/mirrors", mirrors
.MirrorListHandler
),
218 (r
"/mirror/new", mirrors
.MirrorNewHandler
),
219 (r
"/mirror/([\w\-\.]+)/delete", mirrors
.MirrorDeleteHandler
),
220 (r
"/mirror/([\w\-\.]+)/edit", mirrors
.MirrorEditHandler
),
221 (r
"/mirror/([\w\-\.]+)", mirrors
.MirrorDetailHandler
),
224 (r
"/keys", keys
.KeysListHandler
),
225 (r
"/key/import", keys
.KeysImportHandler
),
226 (r
"/key/([A-Z0-9]+)", keys
.KeysDownloadHandler
),
227 (r
"/key/([A-Z0-9]+)/delete", keys
.KeysDeleteHandler
),
230 (r
"/documents", DocsIndexHandler
),
231 (r
"/documents/builds", DocsBuildsHandler
),
232 (r
"/documents/users", DocsUsersHandler
),
233 (r
"/documents/what-is-the-pakfire-build-service", DocsWhatsthisHandler
),
236 (r
"/search", search
.SearchHandler
),
239 (r
"/uploads", UploadsHandler
),
242 (r
"/log", LogHandler
),
245 (r
"/sessions", SessionsHandler
),
248 (r
"/api/packages/autocomplete", api
.ApiPackagesAutocomplete
),
249 ], default_handler_class
=errors
.Error404Handler
, **settings
)
251 logging
.info("Successfully initialied application")
261 logging
.info("Shutting down application")
265 return tornado
.ioloop
.IOLoop
.instance()
267 def shutdown(self
, *args
):
268 logging
.debug("Caught shutdown signal")
271 def run(self
, port
=7001):
272 logging
.debug("Going to background")
274 http_server
= tornado
.httpserver
.HTTPServer(self
, xheaders
=True)
276 # If we are not running in debug mode, we can actually run multiple
277 # frontends to get best performance out of our service.
278 if self
.settings
.get("debug", False):
279 http_server
.listen(port
)
281 cpu_count
= multiprocessing
.cpu_count()
283 http_server
.bind(port
)
284 http_server
.start(num_processes
=cpu_count
)
286 # All requests should be done after 60 seconds or they will be killed.
287 self
.ioloop
.set_blocking_log_threshold(60)
292 logging
.debug("Caught reload signal")
296 def format_time(self
, handler
, s
, shorter
=False):
297 _
= handler
.locale
.translate
299 hrs
, s
= divmod(s
, 3600)
300 min, s
= divmod(s
, 60)
305 if shorter
and not hrs
:
306 return _("%(min)d min") % { "min" : min }
308 return _("%(hrs)d:%(min)02d hrs") % {"hrs" : hrs
, "min" : min}
310 def format_time_short(self
, handler
, s
):
311 _
= handler
.locale
.translate
315 return _("%dh") % hrs
319 return _("%dm") % min