]> git.ipfire.org Git - ipfire.org.git/blame - src/web/__init__.py
Make big header slightly lighter
[ipfire.org.git] / src / web / __init__.py
CommitLineData
81675874 1#/usr/bin/python
2
feb02477 3import logging
401827c2 4import itertools
81675874 5import os.path
c01ad253 6import phonenumbers
81675874 7import tornado.locale
a49b5422 8import tornado.options
81675874 9import tornado.web
10
a95c2f97 11import ipfire
feb02477 12
11347e46 13from .handlers import *
81675874 14
08df6527 15from . import auth
12e5de7e 16from . import blog
e77cd04c 17from . import download
f5b01fc2 18from . import location
5613b94b 19from . import newsletter
03706893 20from . import people
df6180a5 21from . import ui_modules
12e5de7e 22
81675874 23class Application(tornado.web.Application):
3e7c6ccd
MT
24 def __init__(self, config, **kwargs):
25 # Initialize backend
a95c2f97 26 self.backend = ipfire.Backend(config)
a6dc0bad 27
9ed02e3b
MT
28 settings = {
29 # Do not compress responses
30 "gzip" : False,
31
32 # Enable XSRF cookies
33 "xsrf_cookies" : True,
34
35 # Login
36 "login_url" : "/login",
37
38 # Setup directory structure
39 "static_path" : self.backend.config.get("global", "static_dir"),
40 "template_path" : self.backend.config.get("global", "templates_dir"),
41
42 # UI Modules
43 "ui_methods" : {
c01ad253
MT
44 "format_month_name" : self.format_month_name,
45 "format_phone_number" : self.format_phone_number,
46 "grouper" : grouper,
cc3b928d 47 },
9ed02e3b 48 "ui_modules" : {
f5b01fc2 49 # Blog
7e64f6a3
MT
50 "BlogHistoryNavigation": blog.HistoryNavigationModule,
51 "BlogList" : blog.ListModule,
f91dfcc7 52 "BlogPost" : blog.PostModule,
8a897d25 53 "BlogPosts" : blog.PostsModule,
f91dfcc7 54
f5b01fc2 55 # Location
df6180a5 56 "Map" : ui_modules.MapModule,
f5b01fc2 57
917434b8 58 # Talk
dbb0c109
MT
59 "AccountsList" : people.AccountsListModule,
60 "CDR" : people.CDRModule,
61 "Channels" : people.ChannelsModule,
62 "Registrations" : people.RegistrationsModule,
917434b8 63
f91dfcc7 64 # Old modules
df6180a5
MT
65 "LanguageName" : ui_modules.LanguageNameModule,
66
67 "MirrorItem" : ui_modules.MirrorItemModule,
68 "MirrorsTable" : ui_modules.MirrorsTableModule,
69 "NetBootMenuConfig" : ui_modules.NetBootMenuConfigModule,
70 "NetBootMenuHeader" : ui_modules.NetBootMenuHeaderModule,
71 "NetBootMenuSeparator" : ui_modules.NetBootMenuSeparatorModule,
72 "ProgressBar" : ui_modules.ProgressBarModule,
df6180a5
MT
73 "FireinfoDeviceTable" : ui_modules.FireinfoDeviceTableModule,
74 "FireinfoDeviceAndGroupsTable" : ui_modules.FireinfoDeviceAndGroupsTableModule,
75 "FireinfoGeoTable" : ui_modules.FireinfoGeoTableModule,
81675874 76 },
3403dc5e
MT
77
78 # Call this when a page wasn't found
79 "default_handler_class" : NotFoundHandler,
9ed02e3b 80 }
9068dba1 81 settings.update(kwargs)
5cf160e0 82
ae0228e1
MT
83 tornado.web.Application.__init__(self, **settings)
84
66862195 85 authentication_handlers = [
08df6527
MT
86 (r"/login", auth.LoginHandler),
87 (r"/logout", auth.LogoutHandler),
66862195
MT
88 ]
89
d4dc517c 90 self.add_handlers(r"(dev|www)\.ipfire\.(at|org)", [
940227cb
MT
91 # Entry site that lead the user to index
92 (r"/", IndexHandler),
940227cb 93
81675874 94 # Download sites
60b0917c 95 (r"/downloads", tornado.web.RedirectHandler, { "url" : "/download" }),
e77cd04c
MT
96 (r"/download", download.IndexHandler),
97 (r"/download/([0-9a-z\-\.]+)", download.ReleaseHandler),
940227cb 98
e64ce07e
MT
99 # Donate
100 (r"/donate", DonateHandler),
101 (r"/donation", tornado.web.RedirectHandler, { "url" : "/donate" }),
8d48f4ef 102
5613b94b
MT
103 # Newsletter
104 (r"/newsletter/subscribe", newsletter.SubscribeHandler),
105
de683d7c 106 # RSS feed
f0714277 107 (r"/news.rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
7f9dbcc0
MT
108
109 # Redirect news articles to blog
110 (r"/news/(.*)", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/posts/{1}" }),
de683d7c 111
45592df5 112 # Static Pages
45592df5
MT
113 (r"/features", StaticHandler, { "template" : "features.html" }),
114 (r"/get-involved", StaticHandler, { "template" : "get-involved.html" }),
115 (r"/get-started", StaticHandler, { "template" : "get-started.html" }),
116 (r"/get-support", StaticHandler, { "template" : "get-support.html" }),
117 (r"/hardware", StaticHandler, { "template" : "hardware.html" }),
118 (r"/legal", StaticHandler, { "template" : "legal.html" }),
119
14cd4fa8
MT
120 # Handle old pages that have moved elsewhere
121 (r"/imprint", tornado.web.RedirectHandler, { "url" : "/legal" }),
3808b871 122 (r"/(de|en)/(.*)", LangCompatHandler),
37ed7c3c
MT
123
124 # Export arbitrary error pages
125 (r"/error/([45][0-9]{2})", ErrorHandler),
940227cb
MT
126 ])
127
12e5de7e
MT
128 # blog.ipfire.org
129 self.add_handlers(r"blog(\.dev)?\.ipfire\.org", [
8a897d25 130 (r"/", blog.IndexHandler),
cfc0823a 131 (r"/authors/(\w+)", blog.AuthorHandler),
541c952b 132 (r"/compose", blog.ComposeHandler),
0b342a05 133 (r"/drafts", blog.DraftsHandler),
d17a2624
MT
134 (r"/post/([0-9a-z\-\._]+)", blog.PostHandler),
135 (r"/post/([0-9a-z\-\._]+)/edit", blog.EditHandler),
136 (r"/post/([0-9a-z\-\._]+)/publish", blog.PublishHandler),
e6b18dce 137 (r"/search", blog.SearchHandler),
8d7487d2 138 (r"/tags/([0-9a-z\-\.]+)", blog.TagHandler),
7e64f6a3 139 (r"/years/([0-9]+)", blog.YearHandler),
f0714277
MT
140
141 # RSS Feed
142 (r"/feed.xml", blog.FeedHandler),
08df6527 143 ] + authentication_handlers)
12e5de7e 144
940227cb 145 # downloads.ipfire.org
80594ae3 146 self.add_handlers(r"downloads?(\.dev)?\.ipfire\.org", [
ed8116c7
MT
147 (r"/", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org/" }),
148 (r"/(.*)", download.FileHandler),
54af860e 149 ])
940227cb
MT
150
151 # mirrors.ipfire.org
8fceca0a 152 self.add_handlers(r"mirrors(\.dev)?\.ipfire\.org", [
940227cb 153 (r"/", MirrorIndexHandler),
9068dba1 154 (r"/mirror/(.*)", MirrorItemHandler),
3808b871 155 ])
940227cb 156
d0d074e0 157 # planet.ipfire.org
7cad1818 158 self.add_handlers(r"planet(\.dev)?\.ipfire\.org", [
3d4ce901
MT
159 (r"/", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/" }),
160 (r"/post/([A-Za-z0-9_-]+)", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/posts/{1}" }),
161 (r"/user/([a-z0-9_-]+)", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/authors/{1}" }),
bcc3ed4d
MT
162
163 # RSS
f0714277 164 (r"/rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
3d4ce901 165 (r"/user/([a-z0-9_-]+)/rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/authors/{1}.rss" }),
f0714277 166 (r"/news.rss", tornado.web.RedirectHandler, { "url" : "https://blog.ipfire.org/feed.xml" }),
3808b871 167 ])
d0d074e0 168
66862195 169 # fireinfo.ipfire.org
8fceca0a 170 self.add_handlers(r"fireinfo(\.dev)?\.ipfire\.org", [
66862195
MT
171 (r"/", FireinfoIndexHandler),
172 (r"/device/driver/(.*)", FireinfoDeviceDriverDetail),
173 (r"/device/vendors", FireinfoDeviceVendorsHandler),
174 (r"/device/(pci|usb)/([0-9a-f]{4})", FireinfoDeviceVendorHandler),
175 (r"/device/(pci|usb)/([0-9a-f]{4})/([0-9a-f]{4})", FireinfoDeviceModelHandler),
176
177 # Show profiles
178 (r"/profile/random", FireinfoRandomProfileHandler),
179 (r"/profile/([a-z0-9]{40})", FireinfoProfileDetailHandler),
91a446f0 180
30852a9e 181 # Send profiles.
66862195
MT
182 (r"/send/([a-z0-9]+)", FireinfoProfileSendHandler),
183
184 # Stats handlers
185 (r"/statistics", FireinfoStatsHandler),
186 (r"/statistics/processors", FireinfoStatsProcessorsHandler),
187 (r"/statistics/processors/(arm|x86)", FireinfoStatsProcessorDetailHandler),
188 (r"/statistics/geo-locations", FireinfoStatsGeoHandler),
189 (r"/statistics/languages", FireinfoStatsLanguagesHandler),
190 (r"/statistics/memory", FireinfoStatsMemoryHandler),
191 (r"/statistics/networking", FireinfoStatsNetworkingHandler),
192 (r"/statistics/releases", FireinfoStatsReleasesHandler),
193 (r"/statistics/virtualization", FireinfoStatsVirtualHandler),
194
195 # Compat handlers
196 (r"/stats", tornado.web.RedirectHandler, { "url" : "/statistics" }),
197 (r"/stats/cpus", tornado.web.RedirectHandler, { "url" : "/statistics/processors" }),
198 (r"/stats/geo", tornado.web.RedirectHandler, { "url" : "/statistics/geo-locations" }),
199 (r"/stats/network", tornado.web.RedirectHandler, { "url" : "/statistics/networking" }),
200 (r"/stats/oses", tornado.web.RedirectHandler, { "url" : "/statistics/releases" }),
201 (r"/stats/virtual", tornado.web.RedirectHandler, { "url" : "/statistics/virtualization" }),
202 (r"/vendor/(pci|usb)/([0-9a-f]{4})", FireinfoDeviceVendorCompatHandler),
203 (r"/model/(pci|usb)/([0-9a-f]{4})/([0-9a-f]{4})", FireinfoDeviceModelCompatHandler),
3808b871 204 ])
5cf160e0 205
c37ec602 206 # i-use.ipfire.org
8fceca0a 207 self.add_handlers(r"i-use(\.dev)?\.ipfire\.org", [
c37ec602
MT
208 (r"/profile/([a-f0-9]{40})/([0-9]+).png", IUseImage),
209 ])
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", [
ba43a892 214 (r"/", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org/download" }),
8e2e1261
MT
215
216 # Configurations
37b5c0cf 217 (r"/premenu.cfg", PremenuCfgHandler),
8e2e1261
MT
218 (r"/menu.gpxe", MenuGPXEHandler),
219 (r"/menu.cfg", MenuCfgHandler),
8e2e1261
MT
220
221 # Static files
37b5c0cf 222 (r"/(boot\.png|pxelinux\.0|menu\.c32|vesamenu\.c32)",
8e2e1261
MT
223 tornado.web.StaticFileHandler, { "path" : BOOT_STATIC_PATH }),
224 ])
225
60024cc8 226 # nopaste.ipfire.org
8fceca0a 227 self.add_handlers(r"nopaste(\.dev)?\.ipfire\.org", [
66862195
MT
228 (r"/", NopasteCreateHandler),
229 (r"/raw/(.*)", NopasteRawHandler),
230 (r"/view/(.*)", NopasteViewHandler),
3808b871 231 ] + authentication_handlers)
60024cc8 232
f5b01fc2
MT
233 # location.ipfire.org
234 self.add_handlers(r"location(\.dev)?\.ipfire\.org", [
235 (r"/", location.IndexHandler),
236 (r"/lookup/(.+)", location.LookupHandler),
237 ])
238
9068dba1 239 # geoip.ipfire.org
8fceca0a 240 self.add_handlers(r"geoip(\.dev)?\.ipfire\.org", [
f5b01fc2 241 (r"/", tornado.web.RedirectHandler, { "url" : "https://location.ipfire.org/" }),
3808b871 242 ])
9068dba1 243
66862195
MT
244 # talk.ipfire.org
245 self.add_handlers(r"talk(\.dev)?\.ipfire\.org", [
786e9ca8
MT
246 (r"/", tornado.web.RedirectHandler, { "url" : "https://people.ipfire.org/" }),
247 ])
66862195 248
03706893
MT
249 # people.ipfire.org
250 self.add_handlers(r"people(\.dev)?\.ipfire\.org", [
786e9ca8
MT
251 (r"/", people.IndexHandler),
252 (r"/search", people.SearchHandler),
253 (r"/users", people.UsersHandler),
254 (r"/users/(\w+)", people.UserHandler),
03706893 255 (r"/users/(\w+)\.jpg", people.AvatarHandler),
bdaf6b46 256 (r"/users/(\w+)/calls(?:/(\d{4}-\d{2}-\d{2}))?", people.CallsHandler),
786e9ca8
MT
257 (r"/users/(\w+)/registrations", people.RegistrationsHandler),
258 ] + authentication_handlers)
2cd9af74 259
ae0228e1 260 # ipfire.org
45592df5 261 self.add_handlers(r"ipfire\.org", [
ba43a892 262 (r".*", tornado.web.RedirectHandler, { "url" : "https://www.ipfire.org" })
5cf160e0 263 ])
3add293a 264
feb02477
MT
265 logging.info("Successfully initialied application")
266
cc3b928d
MT
267 def format_month_name(self, handler, month):
268 _ = handler.locale.translate
269
270 if month == 1:
271 return _("January")
272 elif month == 2:
273 return _("February")
274 elif month == 3:
275 return _("March")
276 elif month == 4:
277 return _("April")
278 elif month == 5:
279 return _("May")
280 elif month == 6:
281 return _("June")
282 elif month == 7:
283 return _("July")
284 elif month == 8:
285 return _("August")
286 elif month == 9:
287 return _("September")
288 elif month == 10:
289 return _("October")
290 elif month == 11:
291 return _("November")
292 elif month == 12:
293 return _("December")
294
295 return month
401827c2 296
c01ad253
MT
297 def format_phone_number(self, handler, s):
298 number = phonenumbers.parse(s, None)
299
300 return phonenumbers.format_number(number, phonenumbers.PhoneNumberFormat.INTERNATIONAL)
301
401827c2
MT
302
303def grouper(handler, iterator, n):
304 """
305 Returns groups of n from the iterator
306 """
307 i = iter(iterator)
308
309 while True:
310 ret = list(itertools.islice(i, 0, n))
311 if not ret:
312 break
313
314 yield ret