]>
git.ipfire.org Git - ipfire.org.git/blob - webapp/handlers_fireinfo.py
bc3d102f59a93f8d45a081a978d3fdb95e8e8dd1
3 from __future__
import division
14 from handlers_base
import *
16 class FireinfoBaseHandler(BaseHandler
):
17 def cut_string(self
, s
, limit
=15):
23 def render(self
, *args
, **kwargs
):
25 "cut_string" : self
.cut_string
,
28 return BaseHandler
.render(self
, *args
, **kwargs
)
32 return self
.get_argument_date("when", None)
35 MIN_PROFILE_VERSION
= 0
36 MAX_PROFILE_VERSION
= 0
39 def __getattr__(self
, key
):
43 raise AttributeError, key
45 def __setattr__(self
, key
, val
):
49 class FireinfoProfileSendHandler(FireinfoBaseHandler
):
50 def check_xsrf_cookie(self
):
51 # This cookie is not required here.
55 # Create an empty profile.
56 self
.profile
= Profile()
58 def __check_attributes(self
, profile
):
60 Check for attributes that must be provided,
67 for attr
in attributes
:
68 if not profile
.has_key(attr
):
69 raise tornado
.web
.HTTPError(400, "Profile lacks '%s' attribute: %s" % (attr
, profile
))
71 def __check_valid_ids(self
, profile
):
73 Check if IDs contain valid data.
75 for id in ("public_id", "private_id"):
76 if re
.match(r
"^([a-f0-9]{40})$", "%s" % profile
[id]) is None:
77 raise tornado
.web
.HTTPError(400, "ID '%s' has wrong format: %s" % (id, profile
))
79 def __check_equal_ids(self
, profile
):
81 Check if public_id and private_id are equal.
83 if profile
.public_id
== profile
.private_id
:
84 raise tornado
.web
.HTTPError(400, "Public and private IDs are equal: %s" % profile
)
86 def __check_matching_ids(self
, profile
):
88 Check if a profile with the given public_id is already in the
89 database. If so we need to check if the private_id matches.
91 p
= self
.profiles
.find_one({ "public_id" : profile
["public_id"]})
96 if p
.private_id
!= profile
.private_id
:
97 raise tornado
.web
.HTTPError(400, "Mismatch of private_id: %s" % profile
)
99 def __check_profile_version(self
, profile
):
101 Check if this version of the server software does support the
104 version
= profile
.profile_version
106 if version
< MIN_PROFILE_VERSION
or version
> MAX_PROFILE_VERSION
:
107 raise tornado
.web
.HTTPError(400,
108 "Profile version is not supported: %s" % version
)
110 def check_profile_blob(self
, profile
):
112 This method checks if the blob is sane.
115 self
.__check
_attributes
,
116 self
.__check
_valid
_ids
,
117 self
.__check
_equal
_ids
,
118 self
.__check
_profile
_version
,
119 # These checks require at least one database query and should be done
121 self
.__check
_matching
_ids
,
127 # If we got here, everything is okay and we can go on...
129 def get_profile_blob(self
):
130 profile
= self
.get_argument("profile", None)
132 # Send "400 bad request" if no profile was provided
134 raise tornado
.web
.HTTPError(400, "No profile received")
136 # Try to decode the profile.
138 return simplejson
.loads(profile
)
139 except simplejson
.decoder
.JSONDecodeError
, e
:
140 raise tornado
.web
.HTTPError(400, "Profile could not be decoded: %s" % e
)
142 # The GET method is only allowed in debugging mode.
143 def get(self
, public_id
):
144 if not self
.application
.settings
["debug"]:
145 raise tornado
.web
.HTTPError(405)
147 return self
.post(public_id
)
149 def post(self
, public_id
):
150 profile_blob
= self
.get_profile_blob()
151 #self.check_profile_blob(profile_blob)
154 location
= self
.get_remote_location()
156 location
= location
.country
158 # Handle the profile.
159 with self
.db
.transaction():
161 self
.fireinfo
.handle_profile(public_id
, profile_blob
, location
=location
)
163 except backend
.fireinfo
.ProfileParserError
:
164 raise tornado
.web
.HTTPError(400)
166 self
.finish("Your profile was successfully saved to the database.")
169 class FireinfoIndexHandler(FireinfoBaseHandler
):
170 def _profile_not_found(self
, profile_id
):
172 self
.render("fireinfo/profile-notfound.html", profile_id
=profile_id
)
175 self
.render("fireinfo/index.html")
178 profile_id
= self
.get_argument("profile_id", None)
180 raise tornado
.web
.HTTPError(400, "No profile ID was given.")
182 if not self
.fireinfo
.profile_exists(profile_id
):
183 self
._profile
_not
_found
(profile_id
)
186 self
.redirect("/profile/%s" % profile_id
)
189 class FireinfoProfileDetailHandler(FireinfoIndexHandler
):
190 def get(self
, profile_id
):
191 profile
= self
.fireinfo
.get_profile(profile_id
, when
=self
.when
)
193 if not profile
or not profile
.is_showable():
194 self
._profile
_not
_found
(profile_id
)
197 self
.render("fireinfo/profile-detail.html", profile
=profile
)
200 class FireinfoRandomProfileHandler(FireinfoBaseHandler
):
202 profile_id
= self
.fireinfo
.get_random_profile(when
=self
.when
)
203 if profile_id
is None:
204 raise tornado
.web
.HTTPError(404)
206 self
.redirect("/profile/%s" % profile_id
)
209 class FireinfoDeviceDriverDetail(FireinfoBaseHandler
):
210 def get(self
, driver
):
211 self
.render("fireinfo/driver.html", driver
=driver
,
212 driver_map
=self
.fireinfo
.get_driver_map(driver
, when
=self
.when
))
215 class FireinfoDeviceVendorsHandler(FireinfoBaseHandler
):
217 vendors
= self
.fireinfo
.get_vendor_list(when
=self
.when
)
219 self
.render("fireinfo/vendors.html", vendors
=vendors
)
222 class FireinfoStatsHandler(FireinfoBaseHandler
):
224 self
.render("fireinfo/stats.html")
227 class FireinfoStatsProcessorsHandler(FireinfoBaseHandler
):
229 avg
, stddev
, min, max = self
.fireinfo
.get_cpu_clock_speeds(when
=self
.when
)
230 arch_map
= self
.fireinfo
.get_arch_map(when
=self
.when
)
233 "arch_map" : arch_map
,
234 "cpu_vendors" : self
.fireinfo
.get_cpu_vendors_map(when
=self
.when
),
235 "clock_speed_avg" : avg
,
236 "clock_speed_stddev" : stddev
,
237 "clock_speed_min" : min,
238 "clock_speed_max" : max,
241 return self
.render("fireinfo/stats-cpus.html", **data
)
244 class FireinfoStatsProcessorDetailHandler(FireinfoBaseHandler
):
245 def get(self
, platform
):
246 assert platform
in ("arm", "x86")
248 flags
= self
.fireinfo
.get_common_cpu_flags_by_platform(platform
, when
=self
.when
)
250 return self
.render("fireinfo/stats-cpus-detail.html",
251 platform
=platform
, flags
=flags
)
254 class FireinfoStatsMemoryHandler(FireinfoBaseHandler
):
256 avg
, stddev
, min, max = self
.fireinfo
.get_memory_amounts(when
=self
.when
)
257 amounts
= self
.fireinfo
.get_common_memory_amounts(when
=self
.when
)
261 "mem_stddev" : stddev
,
267 return self
.render("fireinfo/stats-memory.html", **data
)
270 class FireinfoStatsReleasesHandler(FireinfoBaseHandler
):
273 "releases" : self
.fireinfo
.get_releases_map(when
=self
.when
),
274 "kernels" : self
.fireinfo
.get_kernels_map(when
=self
.when
),
276 return self
.render("fireinfo/stats-oses.html", **data
)
279 class FireinfoStatsVirtualHandler(FireinfoBaseHandler
):
282 "hypervisors" : self
.fireinfo
.get_hypervisor_map(when
=self
.when
),
283 "virtual" : self
.fireinfo
.get_virtual_ratio(when
=self
.when
),
286 return self
.render("fireinfo/stats-virtual.html", **data
)
289 class FireinfoStatsGeoHandler(FireinfoBaseHandler
):
291 return self
.render("fireinfo/stats-geo.html",
292 geo_locations
= self
.fireinfo
.get_geo_location_map(when
=self
.when
))
295 class FireinfoStatsLanguagesHandler(FireinfoBaseHandler
):
297 return self
.render("fireinfo/stats-languages.html",
298 languages
= self
.fireinfo
.get_language_map(when
=self
.when
))
301 class FireinfoStatsNetworkingHandler(FireinfoBaseHandler
):
303 network
=self
.fireinfo
.get_network_zones_map(when
=self
.when
)
305 return self
.render("fireinfo/stats-network.html", network
=network
)
308 class FireinfoDeviceVendorHandler(FireinfoBaseHandler
):
309 def get(self
, subsystem
, vendor_id
):
310 devices
= self
.fireinfo
.get_devices_by_vendor(subsystem
, vendor_id
,
313 vendor_name
= self
.fireinfo
.get_vendor_string(subsystem
, vendor_id
)
315 self
.render("fireinfo/vendor-detail.html", vendor_name
=vendor_name
,
319 class FireinfoDeviceVendorCompatHandler(FireinfoBaseHandler
):
320 def get(self
, subsystem
, vendor_id
):
321 self
.redirect("/device/%s/%s" % (subsystem
, vendor_id
))
324 class FireinfoDeviceModelHandler(FireinfoBaseHandler
):
325 def get(self
, subsystem
, vendor
, model
):
326 percentage
= self
.fireinfo
.get_device_percentage(subsystem
, vendor
,
327 model
, when
=self
.when
)
330 profiles
= self
.fireinfo
.get_device_in_profile(subsystem
, vendor
,
331 model
, when
=self
.when
)
333 vendor_name
= self
.fireinfo
.get_vendor_string(subsystem
, vendor
)
334 model_name
= self
.fireinfo
.get_model_string(subsystem
, vendor
, model
)
336 self
.render("fireinfo/model-detail.html", profiles
=profiles
,
337 vendor_id
=vendor
, vendor_name
=vendor_name
,
338 model_id
=model
, model_name
=model_name
,
339 percentage
=percentage
, subsystem
=subsystem
)
342 class FireinfoDeviceModelCompatHandler(FireinfoBaseHandler
):
343 def get(self
, subsystem
, vendor_id
, model_id
):
344 self
.redirect("/device/%s/%s/%s" % (subsystem
, vendor_id
, model_id
))
347 class AdminFireinfoHandler(FireinfoBaseHandler
):
349 profiles_with_data
, profiles_all
= self
.fireinfo
.get_active_profiles(when
=self
.when
)
352 "archive_size" : self
.fireinfo
.get_archive_size(when
=self
.when
),
353 "total_updates" : self
.fireinfo
.get_total_updates_count(when
=self
.when
),
354 "profiles_with_data" : profiles_with_data
,
355 "profiles_all" : profiles_all
,
358 self
.render("fireinfo/stats-admin.html", **data
)