]> git.ipfire.org Git - ipfire.org.git/blame - src/web/fireinfo.py
wiki: Only match usernames when a word starts with @
[ipfire.org.git] / src / web / fireinfo.py
CommitLineData
66862195
MT
1#!/usr/bin/python
2
a95c2f97 3import json
66862195
MT
4import tornado.web
5
124a8404 6from . import base
96c9bb79 7from . import ui_modules
66862195 8
da24ac0a 9class BaseHandler(base.BaseHandler):
66862195
MT
10 @property
11 def when(self):
12 return self.get_argument_date("when", None)
13
14
96c9bb79 15class ProfileSendHandler(BaseHandler):
66862195
MT
16 def check_xsrf_cookie(self):
17 # This cookie is not required here.
18 pass
19
66862195
MT
20 def get_profile_blob(self):
21 profile = self.get_argument("profile", None)
22
23 # Send "400 bad request" if no profile was provided
24 if not profile:
25 raise tornado.web.HTTPError(400, "No profile received")
26
278a2971 27 # Try to decode the profile
66862195 28 try:
a95c2f97 29 return json.loads(profile)
11347e46 30 except json.decoder.JSONDecodeError as e:
66862195
MT
31 raise tornado.web.HTTPError(400, "Profile could not be decoded: %s" % e)
32
66862195
MT
33 def post(self, public_id):
34 profile_blob = self.get_profile_blob()
66862195 35
66862195 36 # Handle the profile.
a69e87a1
MT
37 with self.db.transaction():
38 try:
440aba92 39 self.fireinfo.handle_profile(public_id, profile_blob,
6ffd6ec1
MT
40 country_code=self.current_country_code,
41 asn=self.current_address.asn if self.current_address else None)
66862195 42
278a2971
MT
43 except ValueError as e:
44 raise tornado.web.HTTPError(400, "Could not process profile: %s" % e)
66862195
MT
45
46 self.finish("Your profile was successfully saved to the database.")
47
48
28e09035 49class IndexHandler(base.AnalyticsMixin, BaseHandler):
66862195 50 def get(self):
c4099434 51 data = {
278a2971
MT
52 "when" : self.when,
53
11ee2139
MT
54 # Release
55 "latest_release" : self.backend.releases.get_latest(),
56
84604476 57 # Hardware
5a34028b
MT
58 "arches" : self.fireinfo.get_arch_map(when=self.when),
59 "cpu_vendors" : self.fireinfo.get_cpu_vendors_map(when=self.when),
278a2971
MT
60
61 # Memory
62 "memory_avg" : self.backend.fireinfo.get_average_memory_amount(when=self.when),
84604476 63
11ee2139
MT
64 # Virtualization
65 "hypervisors" : self.fireinfo.get_hypervisor_map(when=self.when),
66 "virtual_ratio" : self.fireinfo.get_virtual_ratio(when=self.when),
574a88c7
MT
67
68 # Location
69 "locations" : self.fireinfo.get_geo_location_map(when=self.when),
c4099434
MT
70 }
71
c4099434 72 self.render("fireinfo/index.html", **data)
66862195 73
66862195 74
28e09035 75class DriverDetail(base.AnalyticsMixin, BaseHandler):
1e3b2aad 76 def get(self, driver):
278a2971
MT
77 devices = self.fireinfo.get_devices_by_driver(driver, when=self.when)
78
79 self.render("fireinfo/driver.html", driver=driver, devices=devices)
1e3b2aad
MT
80
81
28e09035 82class ProfileHandler(base.AnalyticsMixin, BaseHandler):
66862195
MT
83 def get(self, profile_id):
84 profile = self.fireinfo.get_profile(profile_id, when=self.when)
85
86 if not profile or not profile.is_showable():
b84b407f 87 raise tornado.web.HTTPError(404)
66862195 88
b84b407f 89 self.render("fireinfo/profile.html", profile=profile)
66862195
MT
90
91
28e09035 92class RandomProfileHandler(base.AnalyticsMixin, BaseHandler):
66862195 93 def get(self):
278a2971
MT
94 profile = self.fireinfo.get_random_profile(when=self.when)
95 if not profile:
96 raise tornado.web.HTTPError(404, "Could not find a random profile")
66862195 97
ed55cebd 98 self.redirect("/fireinfo/profile/%s" % profile.profile_id)
66862195
MT
99
100
28e09035 101class ReleasesHandler(base.AnalyticsMixin, BaseHandler):
ed2e3c1f
MT
102 def get(self):
103 data = {
104 "releases" : self.fireinfo.get_releases_map(when=self.when),
105 "kernels" : self.fireinfo.get_kernels_map(when=self.when),
106 }
107
ed2e3c1f
MT
108 return self.render("fireinfo/releases.html", **data)
109
110
28e09035 111class ProcessorsHandler(base.AnalyticsMixin, BaseHandler):
66862195 112 def get(self):
278a2971 113 return self.render("fireinfo/processors.html", when=self.when)
66862195
MT
114
115
28e09035 116class VendorsHandler(base.AnalyticsMixin, BaseHandler):
8ab37e0b
MT
117 def get(self):
118 vendors = self.fireinfo.get_vendor_list(when=self.when)
119
120 self.render("fireinfo/vendors.html", vendors=vendors)
121
122
28e09035 123class VendorHandler(base.AnalyticsMixin, BaseHandler):
66862195 124 def get(self, subsystem, vendor_id):
8ab37e0b
MT
125 devices = self.fireinfo.get_devices_by_vendor(subsystem, vendor_id, when=self.when)
126 if not devices:
127 raise tornado.web.HTTPError(404)
66862195
MT
128
129 vendor_name = self.fireinfo.get_vendor_string(subsystem, vendor_id)
130
851a00bc 131 self.render("fireinfo/vendor.html", vendor_name=vendor_name, devices=devices)
66862195
MT
132
133
96c9bb79 134class DeviceTableModule(ui_modules.UIModule):
3697181e 135 def render(self, devices, show_group=True, embedded=False):
96c9bb79 136 return self.render_string("fireinfo/modules/table-devices.html",
3697181e 137 devices=devices, show_group=show_group, embedded=embedded)
96c9bb79
MT
138
139
140class DeviceAndGroupsTableModule(ui_modules.UIModule):
141 def render(self, devices):
142 _ = self.locale.translate
143
144 groups = {}
145
146 for device in devices:
147 if device.cls not in groups:
148 groups[device.cls] = []
149
150 groups[device.cls].append(device)
151
152 # Sort all devices
153 for key in list(groups.keys()):
154 groups[key].sort()
155
156 # Order the groups by their name
157 groups = list(groups.items())
158 groups.sort()
159
160 return self.render_string("fireinfo/modules/table-devices-and-groups.html",
161 groups=groups)
dc96f754
MT
162
163
164class AdminIndexHandler(BaseHandler):
165 @tornado.web.authenticated
166 def prepare(self):
167 if not self.current_user.is_staff():
168 raise tornado.web.HTTPError(401)
169
170 @tornado.web.authenticated
171 def get(self):
dc838425 172 with_data, total = self.backend.fireinfo.get_active_profiles()
dc96f754 173
0450fa54
MT
174 # Fetch the ASN map
175 asn_map = self.backend.fireinfo.get_asn_map()
176
278a2971 177 self.render("fireinfo/admin.html", with_data=with_data, total=total,
eb85fd25 178 asn_map=asn_map)