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