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