]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame - webapp/__init__.py
donate: Fix PayPal locale
[people/shoehn/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,
64 "TalkOngoingCalls" : TalkOngoingCallsModule,
9068dba1
MT
65 "TrackerPeerList" : TrackerPeerListModule,
66 "Wish" : WishModule,
67 "Wishlist" : WishlistModule,
e64ce07e 68 "WishlistItems" : WishlistItemsModule,
81675874 69 },
70 xsrf_cookies = True,
71 )
9068dba1 72 settings.update(kwargs)
5cf160e0 73
ae0228e1
MT
74 tornado.web.Application.__init__(self, **settings)
75
76 self.settings["static_path"] = static_path = os.path.join(BASEDIR, "static")
77 static_handlers = [
78 (r"/static/(.*)", tornado.web.StaticFileHandler, dict(path = static_path)),
79 (r"/(favicon\.ico)", tornado.web.StaticFileHandler, dict(path = static_path)),
80 (r"/(robots\.txt)", tornado.web.StaticFileHandler, dict(path = static_path)),
81 ]
82
66862195
MT
83 authentication_handlers = [
84 (r"/login", LoginHandler),
85 (r"/logout", LogoutHandler),
86 ]
87
d4dc517c 88 self.add_handlers(r"(dev|www)\.ipfire\.(at|org)", [
940227cb
MT
89 # Entry site that lead the user to index
90 (r"/", IndexHandler),
91 (r"/index\.?(s?html?)?", RootHandler),
92
93 # Handle news items
940227cb 94 (r"/news", NewsIndexHandler),
7771acea 95 (r"/news/year/([0-9]*)", NewsYearHandler),
940227cb 96 (r"/news/(.*)", NewsItemHandler),
940227cb 97
81675874 98 # Download sites
7fb1ab3c
MT
99 (r"/download", tornado.web.RedirectHandler, { "url" : "http://downloads.ipfire.org/latest" }),
100 (r"/downloads", tornado.web.RedirectHandler, { "url" : "http://downloads.ipfire.org/latest" }),
940227cb 101
8d48f4ef
MT
102 # Handle old pages that have moved elsewhere
103 (r"/screenshots", tornado.web.RedirectHandler, { "url" : "/about" }),
60024cc8
MT
104 (r"/about", tornado.web.RedirectHandler, { "url" : "/features" }),
105 (r"/support", tornado.web.RedirectHandler, { "url" : "/getinvolved" }),
c801ee56 106 (r"/features/.*", tornado.web.RedirectHandler, { "url" : "/features" }),
60024cc8 107
e64ce07e
MT
108 # Donate
109 (r"/donate", DonateHandler),
110 (r"/donation", tornado.web.RedirectHandler, { "url" : "/donate" }),
8d48f4ef 111
de683d7c 112 # RSS feed
bcc3ed4d 113 (r"/news.rss", RSSNewsHandler),
de683d7c
MT
114
115 # Redirection for bookmarks, etc.
940227cb
MT
116 (r"/(de|en)/(.*)", LangCompatHandler)
117
118 ] + static_handlers + [
81675874 119 # Always the last rule
940227cb
MT
120 (r"/(.*)", StaticHandler),
121 ])
122
940227cb 123 # downloads.ipfire.org
80594ae3 124 self.add_handlers(r"downloads?(\.dev)?\.ipfire\.org", [
940227cb
MT
125 (r"/", DownloadsIndexHandler),
126 (r"/latest", DownloadsLatestHandler),
9068dba1
MT
127 (r"/release/(\d)", DownloadsReleaseHandler),
128 (r"/release/([\w\.\-]*)", DownloadsReleaseHandler),
940227cb
MT
129 (r"/older", DownloadsOlderHandler),
130 (r"/development", DownloadsDevelopmentHandler),
131 (r"/mirrors", tornado.web.RedirectHandler, { "url" : "http://mirrors.ipfire.org/" }),
132 (r"/source", tornado.web.RedirectHandler, { "url" : "http://source.ipfire.org/" }),
60024cc8 133 (r"/download-splash", DownloadSplashHandler),
54af860e 134 ] + static_handlers + [
edd297c4 135 (r"/(iso|torrent)/(.*)", DownloadCompatHandler),
54af860e
MT
136 (r"/(.*)", DownloadFileHandler),
137 ])
940227cb
MT
138
139 # mirrors.ipfire.org
8fceca0a 140 self.add_handlers(r"mirrors(\.dev)?\.ipfire\.org", [
940227cb 141 (r"/", MirrorIndexHandler),
9068dba1 142 (r"/mirror/(.*)", MirrorItemHandler),
0a003782 143 (r"/lists/pakfire2", MirrorListPakfire2Handler),
940227cb
MT
144 ] + static_handlers)
145
d0d074e0 146 # planet.ipfire.org
7cad1818 147 self.add_handlers(r"planet(\.dev)?\.ipfire\.org", [
940227cb 148 (r"/", PlanetMainHandler),
d88b8f41 149 (r"/hottest", PlanetHotEntriesHandler),
d0d074e0 150 (r"/post/([A-Za-z0-9_-]+)", PlanetPostingHandler),
27066195 151 (r"/user/([a-z0-9_-]+)", PlanetUserHandler),
2bdd073f 152 (r"/search", PlanetSearchHandler),
cc3b928d 153 (r"/year/(\d+)", PlanetYearHandler),
bcc3ed4d
MT
154
155 # RSS
156 (r"/rss", RSSPlanetAllHandler),
157 (r"/user/([a-z0-9_-]+)/rss", RSSPlanetUserHandler),
20ccd136 158 (r"/news.rss", tornado.web.RedirectHandler, { "url" : "/rss" }),
d0d074e0
MT
159 ] + static_handlers)
160
66862195 161 # fireinfo.ipfire.org
8fceca0a 162 self.add_handlers(r"fireinfo(\.dev)?\.ipfire\.org", [
66862195
MT
163 (r"/", FireinfoIndexHandler),
164 (r"/device/driver/(.*)", FireinfoDeviceDriverDetail),
165 (r"/device/vendors", FireinfoDeviceVendorsHandler),
166 (r"/device/(pci|usb)/([0-9a-f]{4})", FireinfoDeviceVendorHandler),
167 (r"/device/(pci|usb)/([0-9a-f]{4})/([0-9a-f]{4})", FireinfoDeviceModelHandler),
168
169 # Show profiles
170 (r"/profile/random", FireinfoRandomProfileHandler),
171 (r"/profile/([a-z0-9]{40})", FireinfoProfileDetailHandler),
91a446f0 172
30852a9e 173 # Send profiles.
66862195
MT
174 (r"/send/([a-z0-9]+)", FireinfoProfileSendHandler),
175
176 # Stats handlers
177 (r"/statistics", FireinfoStatsHandler),
178 (r"/statistics/processors", FireinfoStatsProcessorsHandler),
179 (r"/statistics/processors/(arm|x86)", FireinfoStatsProcessorDetailHandler),
180 (r"/statistics/geo-locations", FireinfoStatsGeoHandler),
181 (r"/statistics/languages", FireinfoStatsLanguagesHandler),
182 (r"/statistics/memory", FireinfoStatsMemoryHandler),
183 (r"/statistics/networking", FireinfoStatsNetworkingHandler),
184 (r"/statistics/releases", FireinfoStatsReleasesHandler),
185 (r"/statistics/virtualization", FireinfoStatsVirtualHandler),
186
187 # Compat handlers
188 (r"/stats", tornado.web.RedirectHandler, { "url" : "/statistics" }),
189 (r"/stats/cpus", tornado.web.RedirectHandler, { "url" : "/statistics/processors" }),
190 (r"/stats/geo", tornado.web.RedirectHandler, { "url" : "/statistics/geo-locations" }),
191 (r"/stats/network", tornado.web.RedirectHandler, { "url" : "/statistics/networking" }),
192 (r"/stats/oses", tornado.web.RedirectHandler, { "url" : "/statistics/releases" }),
193 (r"/stats/virtual", tornado.web.RedirectHandler, { "url" : "/statistics/virtualization" }),
194 (r"/vendor/(pci|usb)/([0-9a-f]{4})", FireinfoDeviceVendorCompatHandler),
195 (r"/model/(pci|usb)/([0-9a-f]{4})/([0-9a-f]{4})", FireinfoDeviceModelCompatHandler),
ae0228e1 196 ] + static_handlers)
5cf160e0 197
c37ec602 198 # i-use.ipfire.org
8fceca0a 199 self.add_handlers(r"i-use(\.dev)?\.ipfire\.org", [
c37ec602
MT
200 (r"/profile/([a-f0-9]{40})/([0-9]+).png", IUseImage),
201 ])
202
5cf160e0 203 # tracker.ipfire.org
8fceca0a 204 self.add_handlers(r"(torrent|tracker)(\.dev)?\.ipfire\.org", [
940227cb 205 (r"/", TrackerIndexHandler),
344a3d62 206 (r"/announce.*", TrackerAnnounceHandler),
e2afbd6a 207 (r"/scrape", TrackerScrapeHandler),
940227cb 208 (r"/torrent/([0-9a-f]+)", TrackerDetailHandler),
fadcfd00
MT
209 (r"/([0-9a-f]{40})", TrackerDetailHandler),
210 (r"/([0-9a-f]{40})/download", TrackerDownloadHandler),
ae0228e1
MT
211 ] + static_handlers)
212
8e2e1261
MT
213 # boot.ipfire.org
214 BOOT_STATIC_PATH = os.path.join(self.settings["static_path"], "netboot")
8fceca0a 215 self.add_handlers(r"boot(\.dev)?\.ipfire\.org", [
8e2e1261
MT
216 (r"/", tornado.web.RedirectHandler, { "url" : "http://www.ipfire.org/download" }),
217
218 # Configurations
219 (r"/menu.gpxe", MenuGPXEHandler),
220 (r"/menu.cfg", MenuCfgHandler),
8e2e1261
MT
221
222 # Static files
e847f85c 223 (r"/(boot\.png|premenu\.cfg|pxelinux\.0|menu\.c32|vesamenu\.c32)",
8e2e1261
MT
224 tornado.web.StaticFileHandler, { "path" : BOOT_STATIC_PATH }),
225 ])
226
60024cc8 227 # nopaste.ipfire.org
8fceca0a 228 self.add_handlers(r"nopaste(\.dev)?\.ipfire\.org", [
66862195
MT
229 (r"/", NopasteCreateHandler),
230 (r"/raw/(.*)", NopasteRawHandler),
231 (r"/view/(.*)", NopasteViewHandler),
232 ] + authentication_handlers + static_handlers)
60024cc8 233
7771acea 234 # wishlist.ipfire.org
e64ce07e 235 self.add_handlers(r"wishlist(\.dev)?\.ipfire\.org", [
7771acea 236 (r"/", WishlistIndexHandler),
1bf8d482 237 (r"/closed", WishlistClosedHandler),
7771acea
MT
238 (r"/wish/(.*)/donate", WishDonateHandler),
239 (r"/wish/(.*)", WishHandler),
240 (r"/terms", WishlistTermsHandler),
241 ] + static_handlers)
242
9068dba1 243 # geoip.ipfire.org
8fceca0a 244 self.add_handlers(r"geoip(\.dev)?\.ipfire\.org", [
9068dba1
MT
245 (r"/", GeoIPHandler),
246 ] + static_handlers)
247
66862195
MT
248 # talk.ipfire.org
249 self.add_handlers(r"talk(\.dev)?\.ipfire\.org", [
250 (r"/", TalkIndexHandler),
251 (r"/call/(\d+)", TalkInitiateCallHandler),
252 (r"/conferences", TalkConferencesHandler),
253 (r"/conferences/(\d+)/invite/(\d+)", TalkConferencesInviteHandler),
254 (r"/diagnosis", TalkDiagnosisHandler),
255 (r"/phonebook/(\w+)", TalkPhonebookAccountHandler),
256 (r"/phonebook", TalkPhonebookHandler),
257 (r"/profile", TalkProfileHandler),
258 (r"/trunks", TalkTrunksHandler),
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