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