7 import tornado
.httpserver
12 from .. import Backend
13 from ..constants
import *
14 from ..decorators
import *
16 from .handlers
import *
18 from . import handlers_api
20 from . import ui_modules
23 tornado
.options
.define("debug", default
=False, help="Run in debug mode", type=bool)
24 tornado
.options
.parse_command_line()
26 class Application(tornado
.web
.Application
):
27 def __init__(self
, **_settings
):
29 debug
= tornado
.options
.options
.debug
,
32 template_path
= TEMPLATESDIR
,
33 static_path
= STATICDIR
,
35 "Text" : ui_modules
.TextModule
,
36 "Modal" : ui_modules
.ModalModule
,
38 "Footer" : ui_modules
.FooterModule
,
41 "Log" : ui_modules
.LogModule
,
42 "LogEntry" : ui_modules
.LogEntryModule
,
43 "LogEntryComment" : ui_modules
.LogEntryCommentModule
,
45 "BuildHeadline" : ui_modules
.BuildHeadlineModule
,
46 "BuildStateWarnings" : ui_modules
.BuildStateWarningsModule
,
48 "BugsTable" : ui_modules
.BugsTableModule
,
49 "BuildLog" : ui_modules
.BuildLogModule
,
50 "BuildOffset" : ui_modules
.BuildOffsetModule
,
51 "BuildTable" : ui_modules
.BuildTableModule
,
54 "Changelog" : ui_modules
.ChangelogModule
,
55 "ChangelogEntry" : ui_modules
.ChangelogEntryModule
,
58 "JobsList" : ui_modules
.JobsListModule
,
59 "JobsStatus" : ui_modules
.JobsStatusModule
,
62 "PackagesDependencyTable" : ui_modules
.PackagesDependencyTableModule
,
64 "CommitMessage" : ui_modules
.CommitMessageModule
,
65 "CommitsTable" : ui_modules
.CommitsTableModule
,
66 "JobsBoxes" : ui_modules
.JobsBoxesModule
,
67 "JobState" : ui_modules
.JobStateModule
,
68 "JobsTable" : ui_modules
.JobsTableModule
,
69 "CommentsTable" : ui_modules
.CommentsTableModule
,
70 "FilesTable" : ui_modules
.FilesTableModule
,
71 "LogTable" : ui_modules
.LogTableModule
,
72 "LogFilesTable" : ui_modules
.LogFilesTableModule
,
73 "Maintainer" : ui_modules
.MaintainerModule
,
74 "PackagesTable" : ui_modules
.PackagesTableModule
,
75 "PackageTable2" : ui_modules
.PackageTable2Module
,
76 "PackageHeader" : ui_modules
.PackageHeaderModule
,
77 "PackageFilesTable" : ui_modules
.PackageFilesTableModule
,
78 "RepositoryTable" : ui_modules
.RepositoryTableModule
,
79 "RepoActionsTable" : ui_modules
.RepoActionsTableModule
,
80 "SourceTable" : ui_modules
.SourceTableModule
,
81 "UpdatesTable" : ui_modules
.UpdatesTableModule
,
82 "UsersTable" : ui_modules
.UsersTableModule
,
83 "WatchersSidebarTable" : ui_modules
.WatchersSidebarTableModule
,
85 "HeadingDate" : ui_modules
.HeadingDateModule
,
87 "SelectLocale" : ui_modules
.SelectLocaleModule
,
88 "SelectTimezone" : ui_modules
.SelectTimezoneModule
,
91 "format_time" : self
.format_time
,
95 settings
.update(_settings
)
98 tornado
.locale
.load_gettext_translations(LOCALEDIR
, PACKAGE_NAME
)
100 tornado
.web
.Application
.__init
__(self
, [
101 # Entry site that lead the user to index
102 (r
"/", IndexHandler
),
104 # Handle all the users logins/logouts/registers and stuff.
105 (r
"/login", LoginHandler
),
106 (r
"/logout", LogoutHandler
),
107 (r
"/register", RegisterHandler
),
108 (r
"/password-recovery", PasswordRecoveryHandler
),
111 (r
"/users", UsersHandler
),
112 (r
"/user/impersonate", UserImpersonateHandler
),
113 (r
"/user/(\w+)/passwd", UserPasswdHandler
),
114 (r
"/user/(\w+)/delete", UserDeleteHandler
),
115 (r
"/user/(\w+)/edit", UserEditHandler
),
116 (r
"/user/(\w+)/activate", ActivationHandler
),
117 (r
"/user/(\w+)", UserHandler
),
118 (r
"/profile", UserHandler
),
119 (r
"/profile/builds", UsersBuildsHandler
),
122 (r
"/packages", PackageListHandler
),
123 (r
"/package/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", PackageDetailHandler
),
124 (r
"/package/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/download(.*)", PackageFileDownloadHandler
),
125 (r
"/package/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/view(.*)", PackageFileViewHandler
),
126 (r
"/package/([\w\-\+]+)", PackageNameHandler
),
127 (r
"/package/([\w\-\+]+)/builds/scratch", PackageScratchBuildsHandler
),
128 (r
"/package/([\w\-\+]+)/builds/times", PackageBuildsTimesHandler
),
129 (r
"/package/([\w\-\+]+)/changelog", PackageChangelogHandler
),
130 (r
"/package/([\w\-\+]+)/properties", PackagePropertiesHandler
),
133 (r
"/file/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", FileDetailHandler
),
136 (r
"/builds", BuildsHandler
),
137 (r
"/builds/filter", BuildFilterHandler
),
138 (r
"/builds/queue", BuildQueueHandler
),
139 (r
"/builds/comments", BuildsCommentsHandler
),
140 (r
"/builds/comments/(\w+)", BuildsCommentsHandler
),
141 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", BuildDetailHandler
),
142 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/bugs", BuildBugsHandler
),
143 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/manage", BuildManageHandler
),
144 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/comment", BuildDetailCommentHandler
),
145 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/priority", BuildPriorityHandler
),
146 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/state", BuildStateHandler
),
147 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/watch", BuildWatchersAddHandler
),
148 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/watchers", BuildWatchersHandler
),
149 (r
"/build/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/delete", BuildDeleteHandler
),
152 (r
"/jobs", JobsIndexHandler
),
153 (r
"/jobs/filter", JobsFilterHandler
),
154 (r
"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", JobDetailHandler
),
155 (r
"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/abort", JobAbortHandler
),
156 (r
"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/buildroot", JobBuildrootHandler
),
157 (r
"/job/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/schedule", JobScheduleHandler
),
160 (r
"/builders", BuilderListHandler
),
161 (r
"/builder/new", BuilderNewHandler
),
162 (r
"/builder/([A-Za-z0-9\-\.]+)/enable", BuilderEnableHander
),
163 (r
"/builder/([A-Za-z0-9\-\.]+)/disable", BuilderDisableHander
),
164 (r
"/builder/([A-Za-z0-9\-\.]+)/delete", BuilderDeleteHandler
),
165 (r
"/builder/([A-Za-z0-9\-\.]+)/edit", BuilderEditHandler
),
166 (r
"/builder/([A-Za-z0-9\-\.]+)/renew", BuilderRenewPassphraseHandler
),
167 (r
"/builder/([A-Za-z0-9\-\.]+)", BuilderDetailHandler
),
170 (r
"/distros", DistributionListHandler
),
171 (r
"/distro/([A-Za-z0-9\-\.]+)", DistributionDetailHandler
),
173 # XXX THOSE URLS ARE DEPRECATED
174 (r
"/distribution/delete/([A-Za-z0-9\-\.]+)", DistributionDetailHandler
),
175 (r
"/distribution/edit/([A-Za-z0-9\-\.]+)", DistributionEditHandler
),
177 (r
"/distro/([A-Za-z0-9\-\.]+)/repo/([A-Za-z0-9\-]+)",
178 RepositoryDetailHandler
),
179 (r
"/distro/([A-Za-z0-9\-\.]+)/repo/([A-Za-z0-9\-]+)\.repo",
180 RepositoryConfHandler
),
181 (r
"/distro/([A-Za-z0-9\-\.]+)/repo/([A-Za-z0-9\-]+)/mirrorlist",
182 RepositoryMirrorlistHandler
),
183 (r
"/distro/([A-Za-z0-9\-\.]+)/repo/([A-Za-z0-9\-]+)/edit",
184 RepositoryEditHandler
),
186 (r
"/distro/([A-Za-z0-9\-\.]+)/source/([A-Za-z0-9\-\.]+)",
187 DistroSourceDetailHandler
),
188 (r
"/distro/([A-Za-z0-9\-\.]+)/source/([A-Za-z0-9\-\.]+)/commits",
189 DistroSourceCommitsHandler
),
190 (r
"/distro/([A-Za-z0-9\-\.]+)/source/([A-Za-z0-9\-\.]+)/([\w]{40})",
191 DistroSourceCommitDetailHandler
),
192 (r
"/distro/([A-Za-z0-9\-\.]+)/source/([A-Za-z0-9\-\.]+)/([\w]{40})/reset",
193 DistroSourceCommitResetHandler
),
195 (r
"/distro/([A-Za-z0-9\-\.]+)/update/create",
196 DistroUpdateCreateHandler
),
197 (r
"/distro/([A-Za-z0-9\-\.]+)/update/(\d+)/(\d+)",
198 DistroUpdateDetailHandler
),
201 (r
"/updates", UpdatesHandler
),
204 (r
"/mirrors", mirrors
.MirrorListHandler
),
205 (r
"/mirror/new", mirrors
.MirrorNewHandler
),
206 (r
"/mirror/([\w\-\.]+)/delete", mirrors
.MirrorDeleteHandler
),
207 (r
"/mirror/([\w\-\.]+)/edit", mirrors
.MirrorEditHandler
),
208 (r
"/mirror/([\w\-\.]+)", mirrors
.MirrorDetailHandler
),
211 (r
"/keys", KeysListHandler
),
212 (r
"/key/import", KeysImportHandler
),
213 (r
"/key/([A-Z0-9]+)", KeysDownloadHandler
),
214 (r
"/key/([A-Z0-9]+)/delete", KeysDeleteHandler
),
217 (r
"/statistics", StatisticsMainHandler
),
220 (r
"/documents", DocsIndexHandler
),
221 (r
"/documents/builds", DocsBuildsHandler
),
222 (r
"/documents/users", DocsUsersHandler
),
223 (r
"/documents/what-is-the-pakfire-build-service", DocsWhatsthisHandler
),
226 (r
"/search", SearchHandler
),
229 (r
"/uploads", UploadsHandler
),
232 (r
"/log", LogHandler
),
235 (r
"/sessions", SessionsHandler
),
238 (r
"/api/packages/autocomplete", handlers_api
.ApiPackagesAutocomplete
),
241 logging
.info("Successfully initialied application")
251 logging
.info("Shutting down application")
255 return tornado
.ioloop
.IOLoop
.instance()
257 def shutdown(self
, *args
):
258 logging
.debug("Caught shutdown signal")
261 def run(self
, port
=7001):
262 logging
.debug("Going to background")
264 http_server
= tornado
.httpserver
.HTTPServer(self
, xheaders
=True)
266 # If we are not running in debug mode, we can actually run multiple
267 # frontends to get best performance out of our service.
268 if self
.settings
.get("debug", False):
269 http_server
.listen(port
)
271 cpu_count
= multiprocessing
.cpu_count()
273 http_server
.bind(port
)
274 http_server
.start(num_processes
=cpu_count
)
276 # All requests should be done after 60 seconds or they will be killed.
277 self
.ioloop
.set_blocking_log_threshold(60)
282 logging
.debug("Caught reload signal")
286 def format_time(self
, handler
, s
, shorter
=False):
287 _
= handler
.locale
.translate
289 hrs
, s
= divmod(s
, 3600)
290 min, s
= divmod(s
, 60)
295 if shorter
and not hrs
:
296 return _("%(min)d min") % { "min" : min }
298 return _("%(hrs)d:%(min)02d hrs") % {"hrs" : hrs
, "min" : min}
300 def format_time_short(self
, handler
, s
):
301 _
= handler
.locale
.translate
305 return _("%dh") % hrs
309 return _("%dm") % min