]>
Commit | Line | Data |
---|---|---|
66862195 MT |
1 | #!/usr/bin/python |
2 | ||
a95c2f97 | 3 | import json |
66862195 MT |
4 | import tornado.web |
5 | ||
124a8404 | 6 | from . import base |
96c9bb79 | 7 | from . import ui_modules |
66862195 | 8 | |
da24ac0a | 9 | class BaseHandler(base.BaseHandler): |
66862195 MT |
10 | @property |
11 | def when(self): | |
12 | return self.get_argument_date("when", None) | |
13 | ||
14 | ||
96c9bb79 | 15 | class 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 | 49 | class 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 | 75 | class 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 | 82 | class 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 | 92 | class 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 | |
278a2971 | 98 | self.redirect("/profile/%s" % profile.profile_id) |
66862195 MT |
99 | |
100 | ||
28e09035 | 101 | class 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 | 111 | class 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 | 116 | class 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 | 123 | class 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 | 134 | class 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 | ||
140 | class 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 | ||
164 | class 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 | |
278a2971 MT |
174 | histogram = self.backend.fireinfo.get_profile_histogram() |
175 | ||
176 | self.render("fireinfo/admin.html", with_data=with_data, total=total, | |
177 | histogram=histogram) |