Skip to content

Commit

Permalink
add dynamic report data update
Browse files Browse the repository at this point in the history
  • Loading branch information
VertexC committed Jul 20, 2019
1 parent e42319f commit 448cc4f
Show file tree
Hide file tree
Showing 6 changed files with 182 additions and 49 deletions.
15 changes: 10 additions & 5 deletions mod_report/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,11 +75,16 @@ def dashboard_ajax(action):
'<td>{{ entry.timestamp }}</td><td>{{ entry.message }}' \
'</td></tr>{% else %}<tr><td colspan="4">No entries ' \
'for this timespan</td></tr>{% endfor %}</tbody></table>'
timestamp = datetime.datetime.utcnow() - datetime.timedelta(
days=7)
data = PiPotReport.query.filter(
PiPotReport.timestamp >= timestamp).order_by(
PiPotReport.timestamp.desc()).all()
if form.data_num.data == -1:
timestamp = datetime.datetime.utcnow() - datetime.timedelta(
days=7)
data = PiPotReport.query.filter(
PiPotReport.timestamp >= timestamp).order_by(
PiPotReport.timestamp.desc()).all()
else:
data = PiPotReport.query.filter().order_by(
PiPotReport.timestamp.desc()).limit(form.data_num.data).all()
result['data_num'] = len(data)
template_args = {
'entries': data
}
Expand Down
1 change: 1 addition & 0 deletions mod_report/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ class DashboardForm(Form):
report_type = StringField('Report type', validators=[
DataRequired(message='report type not selected')
])
data_num = IntegerField('Number of data')

def __init__(self, formdata=_Auto, obj=None, prefix='', csrf_context=None,
secret_key=None, csrf_enabled=None, *args, **kwargs):
Expand Down
11 changes: 10 additions & 1 deletion templates/report/dashboard.html
Original file line number Diff line number Diff line change
Expand Up @@ -96,12 +96,21 @@ <h1>Dashboard for {{ serverName }}</h1>
'deployment': deployment.id,
'service': service.id,
'report_type': report_type,
'csrf_token': $("#csrf_token").val()
'csrf_token': $("#csrf_token").val(),
'data_num': typeof loadData.dataNum == "undefined"? -1 : loadData.dataNum
},
dataType: "json"
}).done(function (data) {
if (data.status === "success") {
ajax.html(data.html).show();
if(typeof loadData.dataNum == "undefined"){
loadData.dataNum = data.data_num
document.getElementById("load_data").value = "show more"
} else if (loadData.dataNum > data.data_num){
alert("There is no more data to load!");
} else {
loadData.dataNum += 5
}
} else {
PiPot.errorHandler.showErrorInElement(ajax, data.errors, 10000);
}
Expand Down
39 changes: 39 additions & 0 deletions tests/authMock.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import os
import sys
from functools import wraps

from flask import request
# Need to append server root path to ensure we can import the necessary files.
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import mod_auth.controllers
import decorators


def login_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
return f(*args, **kwargs)
return decorated_function


def check_access_rights(parent_route=None):
def access_decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
route = parent_route
if route is None:
route = request.endpoint
elif route.startswith("."):
# Relative to current blueprint, so we'll need to adjust
route = request.endpoint[:request.endpoint.rindex('.')] + \
route
return f(*args, **kwargs)
# Return page not allowed
abort(403, request.endpoint)
return decorated_function
return access_decorator


mod_auth.controllers.login_required = login_required
mod_auth.controllers.check_access_rights = check_access_rights
108 changes: 108 additions & 0 deletions tests/testDashboardDataReport.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
import os
import sys
import mock
import unittest
import json
import datetime
from mock import patch

from flask import request, jsonify

import authMock
from database import create_session
from mod_config.models import Service
from mod_honeypot.models import Profile, PiModels, PiPotReport, ProfileService, \
CollectorTypes, Deployment
from tests.testAppBase import TestAppBase


class TestServiceManagement(TestAppBase):

def setUp(self):
super(TestServiceManagement, self).setUp()

def tearDown(self):
super(TestServiceManagement, self).tearDown()

@patch('mod_report.forms.DashboardForm.validate_deployment')
@patch('mod_report.forms.DashboardForm.validate_service')
@patch('mod_report.forms.DashboardForm.validate_report_type')
def testDynamicDataReport(self, validate_report_type, validate_service, validate_deployment):
deployment_id = 1
service_id = 1
report_type = 1
try:
db = create_session(self.app.config['DATABASE_URI'], drop_tables=False)
# create service, profile, delpoyment
service = Service(name='test-service', description="test")
profile = Profile(name='test-profile', description="test")
db.add(service)
db.add(profile)
db.commit()
profile_row = db.query(Profile.id).first()
deployment = Deployment(
name='test-deloyment', profile_id=profile_row.id,
instance_key='test', mac_key='test',
encryption_key='test', rpi_model=PiModels.from_string('one'),
server_ip='test', interface='test',
wlan_config='test', hostname='test',
rootpw='test', debug=True,
collector_type=CollectorTypes.from_string('tcp'))
db.add(deployment)
db.commit()
# create report data
current_time = datetime.datetime.now()
time_before_a_week = current_time - datetime.timedelta(days=8)
data_num_within_a_week = 20
data_num_before_a_week = 10
for i in range(data_num_within_a_week):
report_data = PiPotReport(deployment_id=1, message="test", timestamp=current_time)
db.add(report_data)
db.commit()
for i in range(data_num_before_a_week):
report_data = PiPotReport(deployment_id=1, message="test", timestamp=time_before_a_week)
db.add(report_data)
db.commit()
db.remove()
# request without the number of data specified
data_num = -1
with self.app.test_client() as client:
data = dict(
deployment=deployment_id,
service=service_id,
report_type=report_type,
data_num=data_num
)
response = client.post('/dashboard/load', data=data, follow_redirects=False)
self.assertEqual(response.get_json()['status'], 'success')
self.assertEqual(response.get_json()['data_num'], data_num_within_a_week)
# request with the number of data specified
data_num = min(data_num_within_a_week + 10, data_num_before_a_week + data_num_within_a_week)
with self.app.test_client() as client:
data = dict(
deployment=deployment_id,
service=service_id,
report_type=report_type,
data_num=data_num
)
response = client.post('/dashboard/load', data=data, follow_redirects=False)
self.assertEqual(response.get_json()['status'], 'success')
self.assertEqual(response.get_json()['data_num'], data_num)
data_num = data_num_before_a_week + data_num_within_a_week + 10
with self.app.test_client() as client:
data = dict(
deployment=deployment_id,
service=service_id,
report_type=report_type,
data_num=data_num
)
response = client.post('/dashboard/load', data=data, follow_redirects=False)
self.assertEqual(response.status_code, 200)
self.assertEqual(response.get_json()['status'], 'success')
self.assertEqual(response.get_json()['data_num'], data_num_before_a_week + data_num_within_a_week)
finally:
db.remove()


if __name__ == '__main__':
unittest.main()
57 changes: 14 additions & 43 deletions tests/testServiceManagement.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,43 +8,10 @@
from werkzeug.datastructures import FileStorage

from flask import request, jsonify
# Need to append server root path to ensure we can import the necessary files.
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

import authMock
from database import create_session
import mod_auth.controllers
from mod_config.models import Service
import decorators


def login_required(f):
@wraps(f)
def decorated_function(*args, **kwargs):
return f(*args, **kwargs)
return decorated_function


def check_access_rights(parent_route=None):
def access_decorator(f):
@wraps(f)
def decorated_function(*args, **kwargs):
route = parent_route
if route is None:
route = request.endpoint
elif route.startswith("."):
# Relative to current blueprint, so we'll need to adjust
route = request.endpoint[:request.endpoint.rindex('.')] + \
route
return f(*args, **kwargs)
# Return page not allowed
abort(403, request.endpoint)
return decorated_function
return access_decorator


mod_auth.controllers.login_required = login_required
mod_auth.controllers.check_access_rights = check_access_rights

from tests.testAppBase import TestAppBase

test_dir = os.path.dirname(os.path.abspath(__file__))
Expand Down Expand Up @@ -78,11 +45,13 @@ def add_and_remove_service(self, service_name, service_file_name):
# check service file and folder is removed under temp_path
self.assertFalse(os.path.isdir(os.path.join(service_dir, 'temp', service_name)))
# check database
db = create_session(self.app.config['DATABASE_URI'], drop_tables=False)
service_row = db.query(Service.id, Service.name).first()
service_id = service_row.id
name = service_row.name
db.remove()
try:
db = create_session(self.app.config['DATABASE_URI'], drop_tables=False)
service_row = db.query(Service.id, Service.name).first()
service_id = service_row.id
name = service_row.name
finally:
db.remove()
self.assertEqual(service_name, name)
# delete service file
with self.app.test_client() as client:
Expand All @@ -95,10 +64,12 @@ def add_and_remove_service(self, service_name, service_file_name):
# check service file and folder is removed unser final_path
self.assertFalse(os.path.isfile(os.path.join(service_dir, service_name, service_file_name)))
# check database
db = create_session(self.app.config['DATABASE_URI'], drop_tables=False)
service_row = db.query(Service.id, Service.name).first()
result = (service_row is None)
db.remove()
try:
db = create_session(self.app.config['DATABASE_URI'], drop_tables=False)
service_row = db.query(Service.id, Service.name).first()
result = (service_row is None)
finally:
db.remove()
self.assertTrue(result)

def test_add_and_delete_service_file(self):
Expand Down

0 comments on commit 448cc4f

Please sign in to comment.