]> git.ipfire.org Git - people/shoehn/ipfire.org.git/blame - webapp/__init__.py
planet: Add a view counter for the posts
[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,
53 "PlanetEntry" : PlanetEntryModule,
fa7e1a0a 54 "PlanetSearchBox" : PlanetSearchBoxModule,
66862195 55 "ProgressBar" : ProgressBarModule,
9068dba1
MT
56 "ReleaseItem" : ReleaseItemModule,
57 "SidebarBanner" : SidebarBannerModule,
58 "SidebarRelease" : SidebarReleaseModule,
66862195
MT
59 "FireinfoDeviceTable" : FireinfoDeviceTableModule,
60 "FireinfoDeviceAndGroupsTable" : FireinfoDeviceAndGroupsTableModule,
61 "FireinfoGeoTable" : FireinfoGeoTableModule,
62 "TalkCallLog" : TalkCallLogModule,
63 "TalkOngoingCalls" : TalkOngoingCallsModule,
9068dba1
MT
64 "TrackerPeerList" : TrackerPeerListModule,
65 "Wish" : WishModule,
66 "Wishlist" : WishlistModule,
e64ce07e 67 "WishlistItems" : WishlistItemsModule,
81675874 68 },
69 xsrf_cookies = True,
70 )
9068dba1 71 settings.update(kwargs)
5cf160e0 72
ae0228e1
MT
73 tornado.web.Application.__init__(self, **settings)
74
75 self.settings["static_path"] = static_path = os.path.join(BASEDIR, "static")
76 static_handlers = [
77 (r"/static/(.*)", tornado.web.StaticFileHandler, dict(path = static_path)),
78 (r"/(favicon\.ico)", tornado.web.StaticFileHandler, dict(path = static_path)),
79 (r"/(robots\.txt)", tornado.web.StaticFileHandler, dict(path = static_path)),
80 ]
81
66862195
MT
82 authentication_handlers = [
83 (r"/login", LoginHandler),
84 (r"/logout", LogoutHandler),
85 ]
86
d4dc517c 87 self.add_handlers(r"(dev|www)\.ipfire\.(at|org)", [
940227cb
MT
88 # Entry site that lead the user to index
89 (r"/", IndexHandler),
90 (r"/index\.?(s?html?)?", RootHandler),
91
92 # Handle news items
940227cb 93 (r"/news", NewsIndexHandler),
7771acea 94 (r"/news/year/([0-9]*)", NewsYearHandler),
940227cb 95 (r"/news/(.*)", NewsItemHandler),
940227cb 96
81675874 97 # Download sites
7fb1ab3c
MT
98 (r"/download", tornado.web.RedirectHandler, { "url" : "http://downloads.ipfire.org/latest" }),
99 (r"/downloads", tornado.web.RedirectHandler, { "url" : "http://downloads.ipfire.org/latest" }),
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
2cd9af74
MT
259 # accounts.ipfire.org
260 self.add_handlers(r"accounts(\.dev)?\.ipfire\.org", [
261 (r"/avatar/(\w+)\.jpg", AccountsAvatarHandler),
262 ] + static_handlers)
263
d0d074e0 264 # admin.ipfire.org
7cad1818 265 self.add_handlers(r"admin(\.dev)?\.ipfire\.org", [
d0d074e0 266 (r"/", AdminIndexHandler),
d0d074e0
MT
267 # Accounts
268 (r"/accounts", AdminAccountsHandler),
940227cb
MT
269 #(r"/accounts/delete/([0-9]+)", AdminAccountsDeleteHandler),
270 #(r"/accounts/edit/([0-9]+)", AdminAccountsEditHandler),
d0d074e0
MT
271 # Planet
272 (r"/planet", AdminPlanetHandler),
273 (r"/planet/compose", AdminPlanetComposeHandler),
67ab72b8
MT
274 (r"/planet/edit/(.*)", AdminPlanetEditHandler),
275 (r"/planet/publish/(.*)", AdminPlanetPublishHandler),
940227cb
MT
276 # Mirrors
277 (r"/mirrors", AdminMirrorsHandler),
278 (r"/mirrors/create", AdminMirrorsCreateHandler),
279 (r"/mirrors/delete/([0-9]+)", AdminMirrorsDeleteHandler),
280 (r"/mirrors/edit/([0-9]+)", AdminMirrorsEditHandler),
281 (r"/mirrors/details/([0-9]+)", AdminMirrorsDetailsHandler),
282 (r"/mirrors/update", AdminMirrorsUpdateHandler),
71e1ece7 283 # Fireinfo
66862195 284 (r"/fireinfo", AdminFireinfoHandler),
60024cc8
MT
285 # Downloads
286 (r"/downloads", AdminDownloadsHandler),
287 (r"/downloads/mirrors", AdminDownloadsMirrorsHandler),
d0d074e0
MT
288 # API
289 (r"/api/planet/render", AdminApiPlanetRenderMarkupHandler)
66862195 290 ] + authentication_handlers + static_handlers)
d0d074e0 291
ae0228e1 292 # ipfire.org
3add293a 293 self.add_handlers(r".*", [
ae0228e1 294 (r".*", tornado.web.RedirectHandler, { "url" : "http://www.ipfire.org" })
5cf160e0 295 ])
3add293a 296
feb02477
MT
297 logging.info("Successfully initialied application")
298
299 self.__running = True
300
3add293a 301 def __del__(self):
feb02477
MT
302 logging.info("Shutting down application")
303
a6dc0bad
MT
304 @property
305 def backend(self):
306 if self.__backend is None:
9068dba1
MT
307 configfile = self.settings.get("configfile", None)
308 if not configfile:
309 raise RuntimeException("Could not find configuration file")
310
2cd9af74
MT
311 self.__backend = backend.Backend(configfile=configfile,
312 debug=self.settings.get("debug", False))
a6dc0bad
MT
313
314 return self.__backend
315
feb02477
MT
316 @property
317 def ioloop(self):
318 return tornado.ioloop.IOLoop.instance()
319
940227cb 320 def shutdown(self, *args):
feb02477
MT
321 logging.debug("Caught shutdown signal")
322 self.ioloop.stop()
323
324 self.__running = False
325
326 def run(self, port=8001):
327 logging.debug("Going to background")
328
329 http_server = tornado.httpserver.HTTPServer(self, xheaders=True)
feb02477 330
cef37a4a
MT
331 num_processes = multiprocessing.cpu_count() / 2
332
940227cb
MT
333 # If we are not running in debug mode, we can actually run multiple
334 # frontends to get best performance out of our service.
335 if not self.settings["debug"]:
336 http_server.bind(port)
cef37a4a 337 http_server.start(num_processes=num_processes)
940227cb
MT
338 else:
339 http_server.listen(port)
de683d7c
MT
340
341 # All requests should be done after 30 seconds or they will be killed.
342 self.ioloop.set_blocking_log_threshold(30)
feb02477 343
940227cb 344 self.ioloop.start()
feb02477
MT
345
346 def reload(self):
347 logging.debug("Caught reload signal")
cc3b928d
MT
348
349 def format_month_name(self, handler, month):
350 _ = handler.locale.translate
351
352 if month == 1:
353 return _("January")
354 elif month == 2:
355 return _("February")
356 elif month == 3:
357 return _("March")
358 elif month == 4:
359 return _("April")
360 elif month == 5:
361 return _("May")
362 elif month == 6:
363 return _("June")
364 elif month == 7:
365 return _("July")
366 elif month == 8:
367 return _("August")
368 elif month == 9:
369 return _("September")
370 elif month == 10:
371 return _("October")
372 elif month == 11:
373 return _("November")
374 elif month == 12:
375 return _("December")
376
377 return month