Percentile graphs

This commit is contained in:
relikd
2020-09-21 11:55:39 +02:00
parent 562048455b
commit a1b3198900
5 changed files with 263 additions and 116 deletions

View File

@@ -4,18 +4,9 @@ import sys
import time
import math
import common_lib as mylib
import bundle_download
import index_app_names
def seconds_to_time(seconds):
seconds = int(seconds)
minutes, seconds = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)
return '{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds)
def round_num(num):
return format(num, '.1f') # .rstrip('0').rstrip('.')
import index_meta
def gen_dotgraph(sorted_arr):
@@ -59,8 +50,7 @@ def gen_pie_chart(parts, classes, stroke=0.6):
def gen_radial_graph(percent):
return '<div class="pie-chart">{}</div>'.format(
gen_pie_chart([1 - percent, percent], ['cs0', 'cs1']))
return gen_pie_chart([1 - percent, percent], ['cs0', 'cs1'])
def gen_dom_tags(sorted_arr, isSub, onlyTrackers=False):
@@ -81,45 +71,82 @@ def gen_dom_tags(sorted_arr, isSub, onlyTrackers=False):
def gen_html(bundle_id, obj):
def round_num(num):
return format(num, '.1f') # .rstrip('0').rstrip('.')
def as_pm(value):
return round_num(value) + '/min'
def as_percent(value):
return round_num(value * 100) + '%'
def as_date(value):
return '<time datetime="{}">{} UTC</time>'.format(
time.strftime('%Y-%m-%d %H:%M', time.gmtime(value)),
time.strftime('%Y-%m-%d, %H:%M', time.gmtime(value))
)
def seconds_to_time(seconds):
seconds = int(seconds)
minutes, seconds = divmod(seconds, 60)
hours, minutes = divmod(minutes, 60)
return '{:02d}:{:02d}:{:02d}'.format(hours, minutes, seconds)
def stat(col, title, rank, value, optional=None, fmt=str, fmt2=None):
# percent = int(rank[0] / max_rank * 100)
r = rank[0] / max_rank
detail = fmt2(value) if fmt2 else fmt(value)
if optional:
x = fmt(optional) if fmt2 else optional
detail += '<i class="snd mg_lr">({})</i>'.format(x)
return f'''
<div class="col{col}">
<h4>{title}</h4>
<div class="percentile {'g' if r < 0.5 else 'b'}"><div style="left: {as_percent(r)}"></div></div>
<b class="mg_lr">{detail}</b>
<p class="snd">
Rank:&nbsp;<b>{rank[0]}</b>,
best:&nbsp;<i>{fmt(rank[1])}</i>,
worst:&nbsp;<i>{fmt(rank[2])}</i></p>
</div>'''
name = index_app_names.get_name(bundle_id)
gernes = bundle_download.get_genres(bundle_id)
rank, max_rank = index_meta.get_rank(bundle_id)
obj['tracker'] = list(filter(lambda x: x[2], obj['subdom']))
return mylib.template_with_base(f'''
<h2 class="title">{name}</h2>
<p class="subtitle snd"><i class="mg_lr">Bundle-id:</i>{ bundle_id }</p>
<div id="meta">
<div class="icons">
<img src="icon.png" width="100" height="100">
{ gen_radial_graph(obj['tracker_percent']) }
<img class="app-icon" src="icon.png" alt="app-icon" width="100" height="100">
</div>
<table>
<tr><td>Last update:</td><td><time datetime="{
time.strftime('%Y-%m-%d %H:%M', time.gmtime(obj['last_date']))
}">{
time.strftime('%Y-%m-%d, %H:%M', time.gmtime(obj['last_date']))
}</time></td></tr>
<tr><td>Number of recordings:</td><td>{ obj['sum_rec'] }</td></tr>
<tr><td>Total number of requests:</td><td>{
obj['sum_logs'] }<i class="snd mg_lr">({
round_num(obj['sum_logs_pm'])} / min)</i></td></tr>
<tr><td>Average number of requests:</td><td>{
round_num(obj['avg_logs'])}<i class="snd mg_lr">({
round_num(obj['avg_logs_pm'])} / min)</i></td></tr>
<tr><td>Average recording time:</td><td>{
seconds_to_time(obj['avg_time']) }</td></tr>
<tr><td>Cumulative recording time:</td><td>{
seconds_to_time(obj['sum_time']) }</td></tr>
<tr><td>App Categories:</td><td>{
', '.join([name for i, name in gernes])
}</td></tr>
<tr><td>Last Update:</td><td>{as_date(obj['last_date'])}</td></tr>
</table>
</div>
<div id="stats">
{ stat(1, 'Number of recordings:', rank['sum_rec'], obj['sum_rec']) }
{ stat(1, 'Average recording time:', rank['avg_time'], obj['avg_time'], fmt=seconds_to_time) }
{ stat(2, 'Cumulative recording time:', rank['sum_time'], obj['sum_time'], fmt=seconds_to_time) }
{ stat(1, 'Average number of requests:', rank['avg_logs_pm'], obj['avg_logs'], obj['avg_logs_pm'], fmt=as_pm, fmt2=round_num) }
{ stat(2, 'Total number of requests:', rank['sum_logs_pm'], obj['sum_logs'], obj['sum_logs_pm'], fmt=as_pm, fmt2=str) }
{ stat(1, 'Number of domains:', rank['pardom'], len(obj['pardom'])) }
{ stat(2, 'Number of subdomains:', rank['subdom'], len(obj['subdom'])) }
{ stat(3, 'Tracker percentage:', rank['tracker_percent'], obj['tracker_percent'], fmt=as_percent) }
</div>
<h3>Connections</h3>
<div>
<h4>Potential Trackers ({ len(obj['tracker']) }):</h4>
{ gen_dom_tags(obj['tracker'], isSub=True, onlyTrackers=True) }
<p></p>
<h4>Domains ({ len(obj['pardom']) }):</h4>
{ gen_dotgraph(obj['pardom']) }
{ gen_dom_tags(obj['pardom'], isSub=False) }
<h4>Subdomains ({ len(obj['subdom']) }):</h4>
{ gen_dotgraph(obj['subdom']) }
{ gen_dom_tags(obj['subdom'], isSub=True) }