summaryrefslogtreecommitdiffstats
path: root/dash/pages/satellites.py
blob: 37a1f61c3b6e35e899edb4c5473a30396ebcd84d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/env python3

import dash_core_components as dcc
import dash_html_components as html
import dash_table as dtbl
import dash_bootstrap_components as dbc
from dash.dependencies import Input, Output

import datetime as dt
from prettytime import prettytime

import db
from app import app

def layout():
    return dbc.Container(fluid=True, children=[
        dbc.Row([
            dbc.Col([
                html.Div(className='table-responsive-lg', children=[dtbl.DataTable(
                    id='satellites-table',
                    columns=[
                        {'id': 'ip', 'name': 'IP', 'type': 'text'},
                        {'id': 'date', 'name': 'Last Report', 'type': 'text'},
                        {'id': 'version', 'name': 'Version', 'type': 'text'},
                        {'id': 'numReports', 'name': '#Reports'},
                        {'id': 'cpuCount', 'name': '#CPUs'},
                        {'id': 'cpuModel', 'name': 'CPU Model'},
                        {'id': 'uptime', 'name': 'Uptime'},
                        {'id': 'memPercent', 'name': 'Mem Usage'},
                        {'id': 'swapPercent', 'name': 'Swap Usage'}
                    ],
                    style_cell_conditional=[
                        {
                            'if': {'column_type': 'text'},
                            'textAlign': 'left'
                        }
                    ],
                    sort_action='custom'
                )])
            ])
        ])
    ])


@app.callback(
    Output('satellites-table', 'data'),
    [Input('satellites-table', "sort_by")])
def load_table(sort):
    dbcon = db.getConnection()
    cursor = dbcon.cursor()

    sortstr = "ORDER BY r.date DESC"
    if sort != None and len(sort) > 0:
        mappings = {
                'ip': 'r.ip',
                'date': 'r.date',
                'version': 'r.version',
                'numReports': 'n.numReports',
                'cpuCount': 's.cpuCount',
                'cpuModel': 's.cpuModel',
                'uptime': 's.uptime',
                'memPercent': 'memPercent',
                'swapPercent': 'swapPercent'
        }
        sortstr =  'ORDER BY ' + mappings[sort[0]['column_id']] + ' '
        sortstr += 'ASC' if sort[0]['direction'] == 'asc' else ' DESC'

    cursor.execute("""
        SELECT
            r.ip, r.version, r.date, s.cpuCount, s.cpuModel, s.uptime, n.numReports,
            ROUND(100 - s.memFree / s.memTotal * 100, 1) as memPercent,
            ROUND(s.swapUsed / s.swapTotal * 100, 1) as swapPercent
        FROM reports_newest r
        LEFT OUTER JOIN server s ON r.id = s.report
        LEFT OUTER JOIN (SELECT ip, COUNT(date) AS numReports FROM reports GROUP BY ip) n ON r.ip = n.ip
    """ + sortstr)

    data = cursor.fetchall()

    for record in data:
        record['uptime'] = prettytime(record['uptime'])
        record['date'] = prettytime((dt.date.today() - record['date']).total_seconds())

    db.closeConnection(dbcon)
    return data