]>
git.ipfire.org Git - pbs.git/blob - src/web/__init__.py
10 from .. import Backend
11 from ..constants
import *
17 from . import builders
19 from . import distributions
24 from . import monitorings
25 from . import packages
31 from .handlers
import *
33 from . import ui_modules
35 class Application(tornado
.web
.Application
):
36 def __init__(self
, **kwargs
):
39 template_path
= TEMPLATESDIR
,
40 static_path
= STATICDIR
,
42 "Highlight" : ui_modules
.HighlightModule
,
43 "Text" : ui_modules
.TextModule
,
46 "BugsList" : bugs
.ListModule
,
49 "BuildsList" : builds
.ListModule
,
50 "BuildWatchers" : builds
.WatchersModule
,
53 "BuildGroupList" : builds
.GroupListModule
,
56 "BuilderStats" : builders
.StatsModule
,
59 "DistrosList" : distributions
.ListModule
,
62 "EventsList" : events
.ListModule
,
63 "EventBuildComment" : events
.BuildCommentModule
,
64 "EventSystemMessage" : events
.SystemMessageModule
,
65 "EventUserMessage" : events
.UserMessageModule
,
68 "JobsList" : jobs
.ListModule
,
69 "JobsLogStream" : jobs
.LogStreamModule
,
70 "JobsQueue" : jobs
.QueueModule
,
73 "MirrorsList" : mirrors
.ListModule
,
76 "MonitoringsReleasesList" : monitorings
.ReleasesListModule
,
79 "PackageInfo" : packages
.InfoModule
,
80 "PackageDependencies": packages
.DependenciesModule
,
83 "ReleasesList" : distributions
.ReleasesListModule
,
86 "ReposList" : repos
.ListModule
,
89 "SourcesList" : sources
.ListModule
,
90 "CommitsList" : sources
.CommitsListModule
,
93 "UsersList" : users
.ListModule
,
94 "UserPushSubscribeButton" : users
.PushSubscribeButton
,
96 "CommitMessage" : ui_modules
.CommitMessageModule
,
97 "LinkToUser" : ui_modules
.LinkToUserModule
,
98 "PackageFilesTable" : ui_modules
.PackageFilesTableModule
,
101 "extract_hostname" : self
.extract_hostname
,
102 "format_time" : self
.format_time
,
103 "group" : self
.group
,
104 "make_url" : self
.make_url
,
108 settings
.update(kwargs
)
111 tornado
.locale
.load_gettext_translations(LOCALEDIR
, PACKAGE_NAME
)
113 tornado
.web
.Application
.__init
__(self
, [
114 # Entry site that lead the user to index
115 (r
"/", IndexHandler
),
118 (r
"/login", auth
.LoginHandler
),
119 (r
"/logout", auth
.LogoutHandler
),
122 (r
"/users", users
.IndexHandler
),
123 (r
"/users/(\w+)", users
.ShowHandler
),
124 (r
"/users/(\w+)/delete", users
.DeleteHandler
),
125 (r
"/users/(\w+)/edit", users
.EditHandler
),
126 (r
"/users/push/subscribe", users
.PushSubscribeHandler
),
129 (r
"/users/(\w+)/repos/create", repos
.CreateCustomHandler
),
130 (r
"/users/(?P<user_slug>\w+)/repos/(?P<distro_slug>[A-Za-z0-9\-\.]+)/(?P<repo_slug>[A-Za-z0-9\-]+)",
132 (r
"/users/(?P<user_slug>\w+)/repos/(?P<distro_slug>[A-Za-z0-9\-\.]+)/(?P<repo_slug>[A-Za-z0-9\-]+)\.repo",
133 repos
.ConfigHandler
),
134 (r
"/users/(?P<user_slug>\w+)/repos/(?P<distro_slug>[A-Za-z0-9\-\.]+)/(?P<repo_slug>[A-Za-z0-9\-]+)/builds",
135 repos
.BuildsHandler
),
136 (r
"/users/(?P<user_slug>\w+)/repos/(?P<distro_slug>[A-Za-z0-9\-\.]+)/(?P<repo_slug>[A-Za-z0-9\-]+)/delete",
137 repos
.DeleteHandler
),
138 (r
"/users/(?P<user_slug>\w+)/repos/(?P<distro_slug>[A-Za-z0-9\-\.]+)/(?P<repo_slug>[A-Za-z0-9\-]+)/edit",
140 (r
"/users/(?P<user_slug>\w+)/repos/(?P<distro_slug>[A-Za-z0-9\-\.]+)/(?P<repo_slug>[A-Za-z0-9\-]+)/mirrorlist",
141 repos
.MirrorlistHandler
),
142 (r
"/users/(?P<user_slug>\w+)/repos/(?P<distro_slug>[A-Za-z0-9\-\.]+)/(?P<repo_slug>[A-Za-z0-9\-]+)/sources/(?P<source_slug>[A-Za-z0-9\-]+)",
143 sources
.ShowHandler
),
144 (r
"/users/(?P<user_slug>\w+)/repos/(?P<distro_slug>[A-Za-z0-9\-\.]+)/(?P<repo_slug>[A-Za-z0-9\-]+)/sources/(?P<source_slug>[A-Za-z0-9\-]+)/commits/(?P<commit_slug>[a-f0-9]{40})",
145 sources
.ShowCommitHandler
),
148 (r
"/packages", packages
.IndexHandler
),
149 (r
"/packages/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", packages
.ShowHandler
),
150 (r
"/packages/([\w\-\+]+)", packages
.NameHandler
),
151 (r
"/packages/([\w\-\+]+)/builds", packages
.NameBuildsHandler
),
152 (r
"/packages/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/download(.*)",
153 packages
.FileDownloadHandler
),
154 (r
"/packages/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/view(.*)",
155 packages
.FileViewHandler
),
158 (r
"/builds", builds
.IndexHandler
),
159 (r
"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", builds
.ShowHandler
),
160 (r
"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/bug", builds
.BugHandler
),
161 (r
"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/clone", builds
.CloneHandler
),
162 (r
"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/comment", builds
.CommentHandler
),
163 (r
"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/delete", builds
.DeleteHandler
),
164 (r
"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/repos/add", builds
.ReposAddHandler
),
165 (r
"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/repos/remove", builds
.ReposRemoveHandler
),
166 (r
"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/watch", builds
.WatchHandler
),
167 (r
"/builds/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/unwatch", builds
.UnwatchHandler
),
169 (r
"/api/v1/builds", builds
.APIv1IndexHandler
),
172 (r
"/builds/groups/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})", builds
.GroupShowHandler
),
175 (r
"/jobs", jobs
.IndexHandler
),
176 (r
"/jobs/queue", jobs
.QueueHandler
),
177 (r
"/jobs/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/abort", jobs
.AbortHandler
),
178 (r
"/jobs/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/log", jobs
.LogHandler
),
179 (r
"/jobs/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/retry", jobs
.RetryHandler
),
180 (r
"/api/v1/jobs/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})",
181 jobs
.APIv1ControlHandler
),
182 (r
"/api/v1/jobs/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/finished",
183 jobs
.APIv1FinishedHandler
),
184 (r
"/api/v1/jobs/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})/log/stream",
185 jobs
.APIv1LogStreamHandler
),
188 (r
"/builders", builders
.IndexHandler
),
189 (r
"/builders/create", builders
.CreateHandler
),
190 (r
"/builders/([A-Za-z0-9\-\.]+)", builders
.ShowHandler
),
191 (r
"/builders/([A-Za-z0-9\-\.]+)/delete", builders
.DeleteHandler
),
192 (r
"/builders/([A-Za-z0-9\-\.]+)/edit", builders
.BuilderEditHandler
),
193 (r
"/builders/([A-Za-z0-9\-\.]+)/start", builders
.StartHandler
),
194 (r
"/builders/([A-Za-z0-9\-\.]+)/stats", builders
.StatsHandler
),
195 (r
"/builders/([A-Za-z0-9\-\.]+)/stop", builders
.StopHandler
),
196 (r
"/api/v1/builders/control", builders
.APIv1ControlHandler
),
199 (r
"/distros", distributions
.IndexHandler
),
200 (r
"/distros/([A-Za-z0-9\-\.]+)", distributions
.ShowHandler
),
201 (r
"/distros/([A-Za-z0-9\-\.]+)/edit", distributions
.EditHandler
),
202 (r
"/distros/(?P<distro_slug>[A-Za-z0-9\-\.]+)/repos/(?P<repo_slug>[A-Za-z0-9\-]+)",
204 (r
"/distros/(?P<distro_slug>[A-Za-z0-9\-\.]+)/repos/(?P<repo_slug>[A-Za-z0-9\-]+)\.repo",
205 repos
.ConfigHandler
),
206 (r
"/distros/(?P<distro_slug>[A-Za-z0-9\-\.]+)/repos/(?P<repo_slug>[A-Za-z0-9\-]+)/builds",
207 repos
.BuildsHandler
),
208 (r
"/distros/(?P<distro_slug>[A-Za-z0-9\-\.]+)/repos/(?P<repo_slug>[A-Za-z0-9\-]+)/delete",
209 repos
.DeleteHandler
),
210 (r
"/distros/(?P<distro_slug>[A-Za-z0-9\-\.]+)/repos/(?P<repo_slug>[A-Za-z0-9\-]+)/edit",
212 (r
"/distros/(?P<distro_slug>[A-Za-z0-9\-\.]+)/repos/(?P<repo_slug>[A-Za-z0-9\-]+)/mirrorlist",
213 repos
.MirrorlistHandler
),
214 (r
"/distros/(?P<distro_slug>[A-Za-z0-9\-\.]+)/repos/(?P<repo_slug>[A-Za-z0-9\-]+)/sources/(?P<source_slug>[A-Za-z0-9\-]+)",
215 sources
.ShowHandler
),
216 (r
"/distros/(?P<distro_slug>[A-Za-z0-9\-\.]+)/repos/(?P<repo_slug>[A-Za-z0-9\-]+)/sources/(?P<source_slug>[A-Za-z0-9\-]+)/commits/(?P<commit_slug>[a-f0-9]{40})",
217 sources
.ShowCommitHandler
),
220 (r
"/distros/([A-Za-z0-9\-\.]+)/monitorings/([\w\-_]+)", monitorings
.ShowHandler
),
221 (r
"/distros/([A-Za-z0-9\-\.]+)/monitorings/([\w\-_]+)/check", monitorings
.CheckHandler
),
222 (r
"/distros/([A-Za-z0-9\-\.]+)/monitorings/([\w\-_]+)/create", monitorings
.CreateHandler
),
223 (r
"/distros/([A-Za-z0-9\-\.]+)/monitorings/([\w\-_]+)/delete", monitorings
.DeleteHandler
),
224 (r
"/distros/([A-Za-z0-9\-\.]+)/monitorings/([\w\-_]+)/edit", monitorings
.EditHandler
),
227 (r
"/distros/([A-Za-z0-9\-\.]+)/releases", distributions
.ReleasesIndexHandler
),
228 (r
"/distros/([A-Za-z0-9\-\.]+)/releases/create", distributions
.ReleasesCreateHandler
),
229 (r
"/distros/([A-Za-z0-9\-\.]+)/releases/([\w\-_]+)", distributions
.ReleasesShowHandler
),
230 (r
"/distros/([A-Za-z0-9\-\.]+)/releases/([\w\-_]+)/delete", distributions
.ReleasesDeleteHandler
),
231 (r
"/distros/([A-Za-z0-9\-\.]+)/releases/([\w\-_]+)/edit", distributions
.ReleasesEditHandler
),
232 (r
"/distros/([A-Za-z0-9\-\.]+)/releases/([\w\-_]+)/publish", distributions
.ReleasesPublishHandler
),
235 (r
"/mirrors", mirrors
.IndexHandler
),
236 (r
"/mirrors/create", mirrors
.CreateHandler
),
237 (r
"/mirrors/([\w\-\.]+)", mirrors
.ShowHandler
),
238 (r
"/mirrors/([\w\-\.]+)/check", mirrors
.CheckHandler
),
239 (r
"/mirrors/([\w\-\.]+)/delete", mirrors
.DeleteHandler
),
240 (r
"/mirrors/([\w\-\.]+)/edit", mirrors
.EditHandler
),
243 (r
"/search", search
.SearchHandler
),
246 (r
"/log", handlers
.LogHandler
),
249 (r
"/api/v1/repos/([\w\d\-]+)", repos
.APIv1IndexHandler
),
250 (r
"/api/v1/repos/([\w\d\-]+)/([\w\d\-]+)", repos
.APIv1ShowHandler
),
253 (r
"/api/v1/uploads", uploads
.APIv1IndexHandler
),
254 (r
"/api/v1/uploads/([\w]{8}-[\w]{4}-[\w]{4}-[\w]{4}-[\w]{12})",
255 uploads
.APIv1DetailHandler
),
256 ], default_handler_class
=errors
.Error404Handler
, **settings
)
259 self
.backend
= Backend("/etc/pakfire/pbs.conf")
261 logging
.info("Successfully initialied application")
263 # Launch some initial tasks
264 self
.backend
.run_task(self
.backend
.users
.generate_vapid_keys
)
265 self
.backend
.run_task(self
.backend
.builders
.autoscale
)
267 # Regularly check the mirrors
268 self
.backend
.run_periodic_task(300, self
.backend
.mirrors
.check
)
270 # Regularly fetch sources
271 self
.backend
.run_periodic_task(300, self
.backend
.sources
.fetch
)
273 # Regularly check for new releases
274 self
.backend
.run_periodic_task(300, self
.backend
.monitorings
.check
)
278 def extract_hostname(self
, handler
, url
):
279 url
= urllib
.parse
.urlparse(url
)
283 def format_time(self
, handler
, s
, shorter
=False):
284 _
= handler
.locale
.translate
286 if isinstance(s
, datetime
.timedelta
):
287 s
= s
.total_seconds()
291 "m" : round(s
/ 60 % 60),
292 "h" : round(s
/ 3600 % 3600),
293 "d" : round(s
/ 86400),
296 # Less than one minute
298 return _("%(s)d s") % args
302 return _("%(m)d:%(s)02d m") % args
306 return _("%(h)d:%(m)02d h") % args
310 return _("%(d)d:%(h)02d d") % args
312 def group(self
, handler
, *args
, **kwargs
):
313 return misc
.group(*args
, **kwargs
)
315 def make_url(self
, handler
, url
, **kwargs
):
316 # Format any query arguments and append them to the URL
319 args
= { k
: kwargs
[k
] for k
in kwargs
if kwargs
[k
] is not None }
321 # Encode into URL format
322 args
= urllib
.parse
.urlencode(args
)
324 url
= "%s?%s" % (url
, args
)