Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)
Ejemplo n.º 4
0
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])
Ejemplo n.º 5
0
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)
Ejemplo n.º 6
0
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)
Ejemplo n.º 7
0
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)