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