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