def route_vendor(timespan_days=30): """ A analytics screen to show information about users """ # get data for this time period cnt_total = {} cached_cnt = {} yesterday = datetime.date.today() - datetime.timedelta(days=1) datestr_start = _get_datestr_from_datetime(yesterday - datetime.timedelta(days=timespan_days)) datestr_end = _get_datestr_from_datetime(yesterday) for ug in db.session.query(AnalyticVendor).\ filter(and_(AnalyticVendor.datestr > datestr_start, AnalyticVendor.datestr <= datestr_end)): display_name = ug.vendor.display_name key = str(ug.datestr) + display_name if key not in cached_cnt: cached_cnt[key] = ug.cnt if not display_name in cnt_total: cnt_total[display_name] = ug.cnt continue cnt_total[display_name] += ug.cnt # find most popular user agent strings most_popular = [] for key, value in sorted(iter(cnt_total.items()), key=lambda k_v: (k_v[1], k_v[0]), reverse=True): most_popular.append(key) if len(most_popular) >= 6: break # generate enough for the template datasets = [] palette = [ 'ef4760', # red 'ffd160', # yellow '06c990', # green '2f8ba0', # teal '845f80', # purple 'ee8510', # orange ] idx = 0 for value in most_popular: dataset = {} dataset['label'] = value dataset['color'] = palette[idx % 6] idx += 1 data = [] for i in range(timespan_days): datestr = _get_datestr_from_datetime(yesterday - datetime.timedelta(days=i)) key = str(datestr) + value dataval = 'NaN' if key in cached_cnt: dataval = str(cached_cnt[key]) data.append(dataval) dataset['data'] = '[' + ', '.join(data[::-1]) + ']' datasets.append(dataset) return render_template('analytics-vendor.html', category='analytics', labels_user_agent=_get_chart_labels_days(timespan_days)[::-1], datasets=datasets)
def route_show(firmware_id): """ Show firmware information """ # get details about the firmware fw = db.session.query(Firmware).\ filter(Firmware.firmware_id == firmware_id).\ first() if not fw: flash('No firmware matched!', 'danger') return redirect(url_for('firmware.route_firmware')) # security check if not fw.check_acl('@view'): flash('Permission denied: Insufficient permissions to view firmware', 'danger') return redirect(url_for('firmware.route_firmware')) # get data for the last month or year graph_data = [] graph_labels = None if fw.check_acl('@view-analytics') and not fw.do_not_track: if fw.timestamp.replace( tzinfo=None) > datetime.datetime.today() - datetime.timedelta( days=30): datestr = _get_datestr_from_datetime(datetime.date.today() - datetime.timedelta(days=31)) data = db.session.query(AnalyticFirmware.cnt).\ filter(AnalyticFirmware.firmware_id == fw.firmware_id).\ filter(AnalyticFirmware.datestr > datestr).\ order_by(AnalyticFirmware.datestr.desc()).all() graph_data = [r[0] for r in data] graph_data = graph_data[::-1] graph_labels = _get_chart_labels_days(limit=len(data))[::-1] else: datestr = _get_datestr_from_datetime(datetime.date.today() - datetime.timedelta(days=360)) data = db.session.query(AnalyticFirmware.cnt).\ filter(AnalyticFirmware.firmware_id == fw.firmware_id).\ filter(AnalyticFirmware.datestr > datestr).\ order_by(AnalyticFirmware.datestr.desc()).all() # put in month-sized buckets for _ in range(12): graph_data.append(0) cnt = 0 for res in data: graph_data[int(cnt / 30)] += res[0] cnt += 1 graph_data = graph_data[::-1] graph_labels = _get_chart_labels_months()[::-1] return render_template('firmware-details.html', category='firmware', fw=fw, graph_data=graph_data, graph_labels=graph_labels)
def route_dashboard(): user = db.session.query(User).filter( User.username == '*****@*****.**').first() settings = _get_settings() default_admin_password = False if user and user.verify_password('Pa$$w0rd'): default_admin_password = True # get the 10 most recent firmwares fws = db.session.query(Firmware).\ filter(Firmware.user_id == g.user.user_id).\ join(Remote).filter(Remote.name != 'deleted').\ order_by(Firmware.timestamp.desc()).limit(10).all() download_cnt = 0 devices_cnt = 0 appstream_ids = {} for fw in g.user.vendor.fws: download_cnt += fw.download_cnt for md in fw.mds: appstream_ids[md.appstream_id] = fw devices_cnt = len(appstream_ids) # this is somewhat klunky data = [] datestr = _get_datestr_from_datetime(datetime.date.today() - datetime.timedelta(days=31)) for cnt in db.session.query(AnalyticVendor.cnt).\ filter(AnalyticVendor.vendor_id == g.user.vendor.vendor_id).\ filter(AnalyticVendor.datestr > datestr).\ order_by(AnalyticVendor.datestr): data.append(int(cnt[0])) return render_template( 'dashboard.html', fws_recent=fws, devices_cnt=devices_cnt, download_cnt=download_cnt, labels_days=_get_chart_labels_days(limit=len(data))[::-1], data_days=data, server_warning=settings.get('server_warning', None), category='home', default_admin_password=default_admin_password)
def route_month(): """ A analytics screen to show information about users """ # this is somewhat klunky data = [] now = datetime.date.today() - datetime.timedelta(days=1) for _ in range(30): datestr = _get_datestr_from_datetime(now) analytic = db.session.query(Analytic).\ filter(Analytic.datestr == datestr).\ first() if analytic: data.append(int(analytic.cnt)) else: data.append(0) # back one day now -= datetime.timedelta(days=1) return render_template('analytics-month.html', category='analytics', labels_days=_get_chart_labels_days()[::-1], data_days=data[::-1])
def route_vendor(timespan_days=30, vendor_cnt=6, smoothing=0): """ A analytics screen to show information about users """ # get data for this time period cnt_total = defaultdict(int) cached_cnt = defaultdict(int) yesterday = datetime.date.today() - datetime.timedelta(days=1) datestr_start = _get_datestr_from_datetime(yesterday - datetime.timedelta( days=timespan_days)) datestr_end = _get_datestr_from_datetime(yesterday) print('get data for', datestr_start, datestr_end) for ug in db.session.query(AnalyticVendor)\ .filter(and_(AnalyticVendor.datestr >= datestr_start, AnalyticVendor.datestr <= datestr_end)): display_name = ug.vendor.display_name key = str(ug.datestr) + display_name cached_cnt[key] += ug.cnt cnt_total[display_name] += ug.cnt # find most popular user agent strings most_popular = [] for key, value in sorted(iter(cnt_total.items()), key=lambda k_v: (k_v[1], k_v[0]), reverse=True): most_popular.append(key) if len(most_popular) >= vendor_cnt: break # optionally smooth if not smoothing: smoothing = int(timespan_days / 25) # generate enough for the template datasets = [] palette = [ 'ef4760', # red 'ffd160', # yellow '06c990', # green '2f8ba0', # teal '845f80', # purple 'ee8510', # orange ] idx = 0 for value in sorted(most_popular): dataset = {} dataset['label'] = value dataset['color'] = palette[idx % 6] idx += 1 data = [] for i in range(timespan_days, 0, -1): datestr = _get_datestr_from_datetime(yesterday - datetime.timedelta(days=i)) key = str(datestr) + value dataval = 0 if key in cached_cnt: dataval = cached_cnt[key] data.append(dataval) if smoothing > 1: data = _running_mean(data, smoothing) dataset['data'] = json.dumps(data) datasets.append(dataset) return render_template( 'analytics-vendor.html', category='analytics', labels_user_agent=_get_chart_labels_days(timespan_days)[::-1], datasets=datasets)
def route_reportattrs_kind(kind, timespan_days=90): """ A analytics screen to show information about users """ # get data for this time period cnt_total = {} yesterday = datetime.date.today() - datetime.timedelta(days=1) datestr_start = yesterday - datetime.timedelta(days=timespan_days) cnt_total = {} cached_cnt = {} for report_ts, attr_val in db.session.query(Report.timestamp, ReportAttribute.value)\ .filter(ReportAttribute.key == kind)\ .join(Report)\ .filter(and_(Report.timestamp > datestr_start, Report.timestamp <= yesterday)): key = str(_get_datestr_from_datetime(report_ts)) + attr_val if key not in cached_cnt: cached_cnt[key] = 1 else: cached_cnt[key] += 1 if not attr_val in cnt_total: cnt_total[attr_val] = 1 continue cnt_total[attr_val] += 1 # find most popular user agent strings most_popular = [] for key, value in sorted(iter(cnt_total.items()), key=lambda k_v: (k_v[1], k_v[0]), reverse=True): most_popular.append(key) if len(most_popular) >= 6: break # generate enough for the template datasets = [] palette = [ 'ef4760', # red 'ffd160', # yellow '06c990', # green '2f8ba0', # teal '845f80', # purple 'ee8510', # orange ] idx = 0 for value in most_popular: dataset = {} dataset['label'] = value dataset['color'] = palette[idx % 6] idx += 1 data = [] for i in range(timespan_days): datestr = _get_datestr_from_datetime(yesterday - datetime.timedelta(days=i)) key = str(datestr) + value dataval = 'NaN' if key in cached_cnt: dataval = str(cached_cnt[key]) data.append(dataval) dataset['data'] = '[' + ', '.join(data[::-1]) + ']' datasets.append(dataset) return render_template( 'analytics-reportattrs-kind.html', category='analytics', kind=kind, labels_user_agent=_get_chart_labels_days(timespan_days)[::-1], datasets=datasets)
def route_user_agents(kind='APP', timespan_days=30): """ A analytics screen to show information about users """ # map back to UseragentKind try: kind_enum = UseragentKind[kind] except KeyError as e: flash('Unable to view analytic type: {}'.format(str(e)), 'danger') return redirect(url_for('analytics.route_user_agents')) # get data for this time period cnt_total = {} cached_cnt = {} yesterday = datetime.date.today() - datetime.timedelta(days=1) datestr_start = _get_datestr_from_datetime(yesterday - datetime.timedelta( days=timespan_days)) datestr_end = _get_datestr_from_datetime(yesterday) for ug in db.session.query(Useragent).\ filter(Useragent.kind == kind_enum.value).\ filter(and_(Useragent.datestr > datestr_start, Useragent.datestr <= datestr_end)): user_agent_safe = _user_agent_wildcard(ug.value) if kind == 'FWUPD': splt = user_agent_safe.split('.', 3) if len(splt) == 3: user_agent_safe = '{}.{}.x'.format(splt[0], splt[1]) key = str(ug.datestr) + user_agent_safe if key not in cached_cnt: cached_cnt[key] = ug.cnt else: cached_cnt[key] += ug.cnt if not user_agent_safe in cnt_total: cnt_total[user_agent_safe] = ug.cnt continue cnt_total[user_agent_safe] += ug.cnt # find most popular user agent strings most_popular = [] for key, value in sorted(iter(cnt_total.items()), key=lambda k_v: (k_v[1], k_v[0]), reverse=True): most_popular.append(key) if len(most_popular) >= 6: break # generate enough for the template datasets = [] palette = [ 'ef4760', # red 'ffd160', # yellow '06c990', # green '2f8ba0', # teal '845f80', # purple 'ee8510', # orange ] idx = 0 for value in most_popular: dataset = {} dataset['label'] = value dataset['color'] = palette[idx % 6] idx += 1 data = [] for i in range(timespan_days): datestr = _get_datestr_from_datetime(yesterday - datetime.timedelta(days=i)) key = str(datestr) + value dataval = 'NaN' if key in cached_cnt: dataval = str(cached_cnt[key]) data.append(dataval) dataset['data'] = '[' + ', '.join(data[::-1]) + ']' datasets.append(dataset) return render_template( 'analytics-user-agent.html', category='analytics', kind=kind, labels_user_agent=_get_chart_labels_days(timespan_days)[::-1], datasets=datasets)