]> git.ipfire.org Git - ipfire.org.git/blame - webapp/__init__.py
Show SSL protocol (and possibly cipher) in page footer
[ipfire.org.git] / webapp / __init__.py
CommitLineData
81675874 1#/usr/bin/python
2
feb02477 3import logging
e6d36e0a 4import multiprocessing
81675874 5import os.path
8ccd2ff0 6import simplejson
feb02477 7import tornado.httpserver
81675874 8import tornado.locale
81675874 9import tornado.web
10
18e60079
MT
11from tornado.options import options
12
940227cb 13import backend
feb02477 14
8ccd2ff0
MT
15from handlers import *
16from ui_modules import *
81675874 17
18BASEDIR = os.path.join(os.path.dirname(__file__), "..")
19
60024cc8
MT
20# Load translations.
21tornado.locale.load_gettext_translations(os.path.join(BASEDIR, "translations"), "webapp")
81675874 22
23class Application(tornado.web.Application):
9068dba1 24 def __init__(self, **kwargs):
a6dc0bad
MT
25 self.__backend = None
26
81675874 27 settings = dict(
28 cookie_secret = "aXBmaXJlY29va2llc2VjcmV0Cg==",
18e60079 29 debug = options.debug,
81675874 30 gzip = True,
d0d074e0 31 login_url = "/login",
81675874 32 template_path = os.path.join(BASEDIR, "templates"),
cc3b928d
MT
33 ui_methods = {
34 "format_month_name" : self.format_month_name,
35 },
81675874 36 ui_modules = {
9068dba1
MT
37 "Advertisement" : AdvertisementModule,
38 "DonationBox" : DonationBoxModule,
e00c06b9 39 "DonationButton" : DonationButtonModule,
9068dba1 40 "DownloadButton" : DownloadButtonModule,
66862195 41 "LanguageName" : LanguageNameModule,
9068dba1
MT
42 "Map" : MapModule,
43 "Menu" : MenuModule,
44 "MirrorItem" : MirrorItemModule,
45 "MirrorsTable" : MirrorsTableModule,
46 "NetBootMenuConfig" : NetBootMenuConfigModule,
47 "NetBootMenuHeader" : NetBootMenuHeaderModule,
48 "NetBootMenuSeparator" : NetBootMenuSeparatorModule,
49 "NewsItem" : NewsItemModule,
50 "NewsLine" : NewsLineModule,
51 "NewsTable" : NewsTableModule,
52 "NewsYearNavigation" : NewsYearNavigationModule,
d88b8f41 53 "PlanetAuthorBox" : PlanetAuthorBoxModule,
9068dba1 54 "PlanetEntry" : PlanetEntryModule,
fa7e1a0a 55 "PlanetSearchBox" : PlanetSearchBoxModule,
66862195 56 "ProgressBar" : ProgressBarModule,
9068dba1
MT
57 "ReleaseItem" : ReleaseItemModule,
58 "SidebarBanner" : SidebarBannerModule,
59 "SidebarRelease" : SidebarReleaseModule,
66862195
MT
60 "FireinfoDeviceTable" : FireinfoDeviceTableModule,
61 "FireinfoDeviceAndGroupsTable" : FireinfoDeviceAndGroupsTableModule,
62 "FireinfoGeoTable" : FireinfoGeoTableModule,
63 "TalkCallLog" : TalkCallLogModule,
77431b9c 64 "TalkLines" : TalkLinesModule,
66862195 65 "TalkOngoingCalls" : TalkOngoingCallsModule,
9068dba1
MT
66 "TrackerPeerList" : TrackerPeerListModule,
67 "Wish" : WishModule,
68 "Wishlist" : WishlistModule,
e64ce07e 69 "WishlistItems" : WishlistItemsModule,
81675874 70 },
71 xsrf_cookies = True,
72 )
9068dba1 73 settings.update(kwargs)
5cf160e0 74
ae0228e1
MT
75 tornado.web.Application.__init__(self, **settings)
76
77 self.settings["static_path"] = static_path = os.path.join(BASEDIR, "static")
78 static_handlers = [
79 (r"/static/(.*)", tornado.web.StaticFileHandler, dict(path = static_path)),
80 (r"/(favicon\.ico)", tornado.web.StaticFileHandler, dict(path = static_path)),
81 (r"/(robots\.txt)", tornado.web.StaticFileHandler, dict(path = static_path)),
82 ]
83
66862195
MT
84 authentication_handlers = [
85 (r"/login", LoginHandler),
86 (r"/logout", LogoutHandler),
87 ]
88
d4dc517c 89 self.add_handlers(r"(dev|www)\.ipfire\.(at|org)", [
940227cb
MT
90 # Entry site that lead the user to index
91 (r"/", IndexHandler),
92 (r"/index\.?(s?html?)?", RootHandler),
93
94 # Handle news items
940227cb 95 (r"/news", NewsIndexHandler),
7771acea 96 (r"/news/year/([0-9]*)", NewsYearHandler),
940227cb 97 (r"/news/(.*)", NewsItemHandler),
940227cb 98
81675874 99 # Download sites
7fb1ab3c
MT
100 (r"/download", tornado.web.RedirectHandler, { "url" : "http://downloads.ipfire.org/latest" }),
101 (r"/downloads", tornado.web.RedirectHandler, { "url" : "http://downloads.ipfire.org/latest" }),
940227cb 102
8d48f4ef
MT
103 # Handle old pages that have moved elsewhere
104 (r"/screenshots", tornado.web.RedirectHandler, { "url" : "/about" }),
60024cc8
MT
105 (r"/about", tornado.web.RedirectHandler, { "url" : "/features" }),
106 (r"/support", tornado.web.RedirectHandler, { "url" : "/getinvolved" }),
c801ee56 107 (r"/features/.*", tornado.web.RedirectHandler, { "url" : "/features" }),
60024cc8 108
e64ce07e
MT
109 # Donate
110 (r"/donate", DonateHandler),
111 (r"/donation", tornado.web.RedirectHandler, { "url" : "/donate" }),
8d48f4ef 112
de683d7c 113 # RSS feed
bcc3ed4d 114 (r"/news.rss", RSSNewsHandler),
de683d7c
MT
115
116 # Redirection for bookmarks, etc.
940227cb
MT
117 (r"/(de|en)/(.*)", LangCompatHandler)
118
119 ] + static_handlers + [
81675874 120 # Always the last rule
940227cb
MT
121 (r"/(.*)", StaticHandler),
122 ])
123
940227cb 124 # downloads.ipfire.org
80594ae3 125 self.add_handlers(r"downloads?(\.dev)?\.ipfire\.org", [
940227cb
MT
126 (r"/", DownloadsIndexHandler),
127 (r"/latest", DownloadsLatestHandler),
9068dba1
MT
128 (r"/release/(\d)", DownloadsReleaseHandler),
129 (r"/release/([\w\.\-]*)", DownloadsReleaseHandler),
940227cb
MT
130 (r"/older", DownloadsOlderHandler),
131 (r"/development", DownloadsDevelopmentHandler),
132 (r"/mirrors", tornado.web.RedirectHandler, { "url" : "http://mirrors.ipfire.org/" }),
133 (r"/source", tornado.web.RedirectHandler, { "url" : "http://source.ipfire.org/" }),
60024cc8 134 (r"/download-splash", DownloadSplashHandler),
54af860e 135 ] + static_handlers + [
edd297c4 136 (r"/(iso|torrent)/(.*)", DownloadCompatHandler),
54af860e
MT
137 (r"/(.*)", DownloadFileHandler),
138 ])
940227cb
MT
139
140 # mirrors.ipfire.org
8fceca0a 141 self.add_handlers(r"mirrors(\.dev)?\.ipfire\.org", [
940227cb 142 (r"/", MirrorIndexHandler),
9068dba1 143 (r"/mirror/(.*)", MirrorItemHandler),
0a003782 144 (r"/lists/pakfire2", MirrorListPakfire2Handler),
940227cb
MT
145 ] + static_handlers)
146
d0d074e0 147 # planet.ipfire.org
7cad1818 148 self.add_handlers(r"planet(\.dev)?\.ipfire\.org", [
940227cb 149 (r"/", PlanetMainHandler),
d88b8f41 150 (r"/hottest", PlanetHotEntriesHandler),
d0d074e0 151 (r"/post/([A-Za-z0-9_-]+)", PlanetPostingHandler),
27066195 152 (r"/user/([a-z0-9_-]+)", PlanetUserHandler),
2bdd073f 153 (r"/search", PlanetSearchHandler),
cc3b928d 154 (r"/year/(\d+)", PlanetYearHandler),
bcc3ed4d
MT
155
156 # RSS
157 (r"/rss", RSSPlanetAllHandler),
158 (r"/user/([a-z0-9_-]+)/rss", RSSPlanetUserHandler),
20ccd136 159 (r"/news.rss", tornado.web.RedirectHandler, { "url" : "/rss" }),
d0d074e0
MT
160 ] + static_handlers)
161
66862195 162 # fireinfo.ipfire.org
8fceca0a 163 self.add_handlers(r"fireinfo(\.dev)?\.ipfire\.org", [
66862195
MT
164 (r"/", FireinfoIndexHandler),
165 (r"/device/driver/(.*)", FireinfoDeviceDriverDetail),
166 (r"/device/vendors", FireinfoDeviceVendorsHandler),
167 (r"/device/(pci|usb)/([0-9a-f]{4})", FireinfoDeviceVendorHandler),
168 (r"/device/(pci|usb)/([0-9a-f]{4})/([0-9a-f]{4})", FireinfoDeviceModelHandler),
169
170 # Show profiles
171 (r"/profile/random", FireinfoRandomProfileHandler),
172 (r"/profile/([a-z0-9]{40})", FireinfoProfileDetailHandler),
91a446f0 173
30852a9e 174 # Send profiles.
66862195
MT
175 (r"/send/([a-z0-9]+)", FireinfoProfileSendHandler),
176
177 # Stats handlers
178 (r"/statistics", FireinfoStatsHandler),
179 (r"/statistics/processors", FireinfoStatsProcessorsHandler),
180 (r"/statistics/processors/(arm|x86)", FireinfoStatsProcessorDetailHandler),
181 (r"/statistics/geo-locations", FireinfoStatsGeoHandler),
182 (r"/statistics/languages", FireinfoStatsLanguagesHandler),
183 (r"/statistics/memory", FireinfoStatsMemoryHandler),
184 (r"/statistics/networking", FireinfoStatsNetworkingHandler),
185 (r"/statistics/releases", FireinfoStatsReleasesHandler),
186 (r"/statistics/virtualization", FireinfoStatsVirtualHandler),
187
188 # Compat handlers
189 (r"/stats", tornado.web.RedirectHandler, { "url" : "/statistics" }),
190 (r"/stats/cpus", tornado.web.RedirectHandler, { "url" : "/statistics/processors" }),
191 (r"/stats/geo", tornado.web.RedirectHandler, { "url" : "/statistics/geo-locations" }),
192 (r"/stats/network", tornado.web.RedirectHandler, { "url" : "/statistics/networking" }),
193 (r"/stats/oses", tornado.web.RedirectHandler, { "url" : "/statistics/releases" }),
194 (r"/stats/virtual", tornado.web.RedirectHandler, { "url" : "/statistics/virtualization" }),
195 (r"/vendor/(pci|usb)/([0-9a-f]{4})", FireinfoDeviceVendorCompatHandler),
196 (r"/model/(pci|usb)/([0-9a-f]{4})/([0-9a-f]{4})", FireinfoDeviceModelCompatHandler),
ae0228e1 197 ] + static_handlers)
5cf160e0 198
c37ec602 199 # i-use.ipfire.org
8fceca0a 200 self.add_handlers(r"i-use(\.dev)?\.ipfire\.org", [
c37ec602
MT
201 (r"/profile/([a-f0-9]{40})/([0-9]+).png", IUseImage),
202 ])
203
5cf160e0 204 # tracker.ipfire.org
8fceca0a 205 self.add_handlers(r"(torrent|tracker)(\.dev)?\.ipfire\.org", [
940227cb 206 (r"/", TrackerIndexHandler),
344a3d62 207 (r"/announce.*", TrackerAnnounceHandler),
e2afbd6a 208 (r"/scrape", TrackerScrapeHandler),
940227cb 209 (r"/torrent/([0-9a-f]+)", TrackerDetailHandler),
fadcfd00
MT
210 (r"/([0-9a-f]{40})", TrackerDetailHandler),
211 (r"/([0-9a-f]{40})/download", TrackerDownloadHandler),
ae0228e1
MT
212 ] + static_handlers)
213
8e2e1261
MT
214 # boot.ipfire.org
215 BOOT_STATIC_PATH = os.path.join(self.settings["static_path"], "netboot")
8fceca0a 216 self.add_handlers(r"boot(\.dev)?\.ipfire\.org", [
8e2e1261
MT
217 (r"/", tornado.web.RedirectHandler, { "url" : "http://www.ipfire.org/download" }),
218
219 # Configurations
220 (r"/menu.gpxe", MenuGPXEHandler),
221 (r"/menu.cfg", MenuCfgHandler),
8e2e1261
MT
222
223 # Static files
e847f85c 224 (r"/(boot\.png|premenu\.cfg|pxelinux\.0|menu\.c32|vesamenu\.c32)",
8e2e1261
MT
225 tornado.web.StaticFileHandler, { "path" : BOOT_STATIC_PATH }),
226 ])
227
60024cc8 228 # nopaste.ipfire.org
8fceca0a 229 self.add_handlers(r"nopaste(\.dev)?\.ipfire\.org", [
66862195
MT
230 (r"/", NopasteCreateHandler),
231 (r"/raw/(.*)", NopasteRawHandler),
232 (r"/view/(.*)", NopasteViewHandler),
233 ] + authentication_handlers + static_handlers)
60024cc8 234
7771acea 235 # wishlist.ipfire.org
e64ce07e 236 self.add_handlers(r"wishlist(\.dev)?\.ipfire\.org", [
7771acea 237 (r"/", WishlistIndexHandler),
1bf8d482 238 (r"/closed", WishlistClosedHandler),
7771acea
MT
239 (r"/wish/(.*)/donate", WishDonateHandler),
240 (r"/wish/(.*)", WishHandler),
241 (r"/terms", WishlistTermsHandler),
242 ] + static_handlers)
243
9068dba1 244 # geoip.ipfire.org
8fceca0a 245 self.add_handlers(r"geoip(\.dev)?\.ipfire\.org", [
9068dba1
MT
246 (r"/", GeoIPHandler),
247 ] + static_handlers)
248
66862195
MT
249 # talk.ipfire.org
250 self.add_handlers(r"talk(\.dev)?\.ipfire\.org", [
251 (r"/", TalkIndexHandler),
252 (r"/call/(\d+)", TalkInitiateCallHandler),
253 (r"/conferences", TalkConferencesHandler),
254 (r"/conferences/(\d+)/invite/(\d+)", TalkConferencesInviteHandler),
255 (r"/diagnosis", TalkDiagnosisHandler),
256 (r"/phonebook/(\w+)", TalkPhonebookAccountHandler),
257 (r"/phonebook", TalkPhonebookHandler),
258 (r"/profile", TalkProfileHandler),
66862195
MT
259 ] + authentication_handlers + static_handlers)
260
2cd9af74
MT
261 # accounts.ipfire.org
262 self.add_handlers(r"accounts(\.dev)?\.ipfire\.org", [
263 (r"/avatar/(\w+)\.jpg", AccountsAvatarHandler),
264 ] + static_handlers)
265
d0d074e0 266 # admin.ipfire.org
7cad1818 267 self.add_handlers(r"admin(\.dev)?\.ipfire\.org", [
d0d074e0 268 (r"/", AdminIndexHandler),
d0d074e0
MT
269 # Accounts
270 (r"/accounts", AdminAccountsHandler),
940227cb
MT
271 #(r"/accounts/delete/([0-9]+)", AdminAccountsDeleteHandler),
272 #(r"/accounts/edit/([0-9]+)", AdminAccountsEditHandler),
d0d074e0
MT
273 # Planet
274 (r"/planet", AdminPlanetHandler),
275 (r"/planet/compose", AdminPlanetComposeHandler),
67ab72b8
MT
276 (r"/planet/edit/(.*)", AdminPlanetEditHandler),
277 (r"/planet/publish/(.*)", AdminPlanetPublishHandler),
940227cb
MT
278 # Mirrors
279 (r"/mirrors", AdminMirrorsHandler),
280 (r"/mirrors/create", AdminMirrorsCreateHandler),
281 (r"/mirrors/delete/([0-9]+)", AdminMirrorsDeleteHandler),
282 (r"/mirrors/edit/([0-9]+)", AdminMirrorsEditHandler),
283 (r"/mirrors/details/([0-9]+)", AdminMirrorsDetailsHandler),
284 (r"/mirrors/update", AdminMirrorsUpdateHandler),
71e1ece7 285 # Fireinfo
66862195 286 (r"/fireinfo", AdminFireinfoHandler),
60024cc8
MT
287 # Downloads
288 (r"/downloads", AdminDownloadsHandler),
289 (r"/downloads/mirrors", AdminDownloadsMirrorsHandler),
d0d074e0
MT
290 # API
291 (r"/api/planet/render", AdminApiPlanetRenderMarkupHandler)
66862195 292 ] + authentication_handlers + static_handlers)
d0d074e0 293
ae0228e1 294 # ipfire.org
3add293a 295 self.add_handlers(r".*", [
ae0228e1 296 (r".*", tornado.web.RedirectHandler, { "url" : "http://www.ipfire.org" })
5cf160e0 297 ])
3add293a 298
feb02477
MT
299 logging.info("Successfully initialied application")
300
301 self.__running = True
302
3add293a 303 def __del__(self):
feb02477
MT
304 logging.info("Shutting down application")
305
a6dc0bad
MT
306 @property
307 def backend(self):
308 if self.__backend is None:
9068dba1
MT
309 configfile = self.settings.get("configfile", None)
310 if not configfile:
311 raise RuntimeException("Could not find configuration file")
312
2cd9af74
MT
313 self.__backend = backend.Backend(configfile=configfile,
314 debug=self.settings.get("debug", False))
a6dc0bad
MT
315
316 return self.__backend
317
feb02477
MT
318 @property
319 def ioloop(self):
320 return tornado.ioloop.IOLoop.instance()
321
940227cb 322 def shutdown(self, *args):
feb02477
MT
323 logging.debug("Caught shutdown signal")
324 self.ioloop.stop()
325
326 self.__running = False
327
328 def run(self, port=8001):
329 logging.debug("Going to background")
330
331 http_server = tornado.httpserver.HTTPServer(self, xheaders=True)
feb02477 332
cef37a4a
MT
333 num_processes = multiprocessing.cpu_count() / 2
334
940227cb
MT
335 # If we are not running in debug mode, we can actually run multiple
336 # frontends to get best performance out of our service.
337 if not self.settings["debug"]:
338 http_server.bind(port)
cef37a4a 339 http_server.start(num_processes=num_processes)
940227cb
MT
340 else:
341 http_server.listen(port)
de683d7c
MT
342
343 # All requests should be done after 30 seconds or they will be killed.
344 self.ioloop.set_blocking_log_threshold(30)
feb02477 345
940227cb 346 self.ioloop.start()
feb02477
MT
347
348 def reload(self):
349 logging.debug("Caught reload signal")
cc3b928d
MT
350
351 def format_month_name(self, handler, month):
352 _ = handler.locale.translate
353
354 if month == 1:
355 return _("January")
356 elif month == 2:
357 return _("February")
358 elif month == 3:
359 return _("March")
360 elif month == 4:
361 return _("April")
362 elif month == 5:
363 return _("May")
364 elif month == 6:
365 return _("June")
366 elif month == 7:
367 return _("July")
368 elif month == 8:
369 return _("August")
370 elif month == 9:
371 return _("September")
372 elif month == 10:
373 return _("October")
374 elif month == 11:
375 return _("November")
376 elif month == 12:
377 return _("December")
378
379 return month