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