From 50b19e8bdf0ecf8f89b95e3e37992afc638c11e7 Mon Sep 17 00:00:00 2001 From: Ravinder Nehra Date: Sat, 29 Jul 2017 14:27:25 +0530 Subject: [PATCH] Improve Web UI (#181) * fix docker freezing * make api server compatible * limit sessions display to 15 on one page and add next & previous buttons * add proper shutdown --- tanner/api/api.py | 2 +- tanner/api/server.py | 4 +++- tanner/tests/test_api_server.py | 2 +- tanner/web/server.py | 34 +++++++++++++++++++++++------- tanner/web/templates/session.html | 10 ++++----- tanner/web/templates/sessions.html | 5 +++++ tanner/web/templates/snare.html | 2 +- 7 files changed, 42 insertions(+), 17 deletions(-) diff --git a/tanner/api/api.py b/tanner/api/api.py index 6f0548c0..11f2adb0 100644 --- a/tanner/api/api.py +++ b/tanner/api/api.py @@ -88,7 +88,7 @@ async def return_sessions(self, filters): return 'Invalid filter : %s' % filter_name if match_count == len(filters): - matching_sessions.append(sess['sess_uuid']) + matching_sessions.append(sess) return matching_sessions diff --git a/tanner/api/server.py b/tanner/api/server.py index cb2439f3..0e05cf5b 100644 --- a/tanner/api/server.py +++ b/tanner/api/server.py @@ -57,7 +57,9 @@ async def handle_sessions(self, request): self.logger.error('Filter error : %s' % e) result = 'Invalid filter definition' else: - result = await self.api.return_sessions(applied_filters) + sessions = await self.api.return_sessions(applied_filters) + sess_uuids = [sess['sess_uuid'] for sess in sessions] + result = sess_uuids response_msg = self._make_response(result) return web.json_response(response_msg) diff --git a/tanner/tests/test_api_server.py b/tanner/tests/test_api_server.py index 896e9f17..c4f56eb4 100644 --- a/tanner/tests/test_api_server.py +++ b/tanner/tests/test_api_server.py @@ -71,7 +71,7 @@ async def test_api_sessions_request(self): async def mock_return_sessions(filters): if type(filters) is dict and filters['peer_ip'] == "127.0.0.1" and \ filters['start_time'] == 1497890400 and filters['user_agent'] == 'ngnix': - return ["f387d46eaeb1454cadf0713a4a55be49", "e85ae767b0bb4b1f91b421b3a28082ef"] + return [{"sess_uuid":"f387d46eaeb1454cadf0713a4a55be49"}, {"sess_uuid":"e85ae767b0bb4b1f91b421b3a28082ef"}] assert_content = {"version": 1, "response": {"message": ["f387d46eaeb1454cadf0713a4a55be49", "e85ae767b0bb4b1f91b421b3a28082ef"]}} self.serv.api.return_sessions = mock_return_sessions diff --git a/tanner/web/server.py b/tanner/web/server.py index efff1715..2bf34f17 100644 --- a/tanner/web/server.py +++ b/tanner/web/server.py @@ -43,6 +43,7 @@ async def handle_snare_stats(self, request): @aiohttp_jinja2.template('sessions.html') async def handle_sessions(self, request): snare_uuid = request.match_info['snare_uuid'] + page_id = int(request.match_info['page_id']) params = request.url.query applied_filters = {'snare_uuid': snare_uuid} try: @@ -57,14 +58,27 @@ async def handle_sessions(self, request): self.logger.error('Filter error : %s' % e) result = 'Invalid filter definition' else: - sess_uuids = await self.api.return_sessions(applied_filters) - sessions = [] - for sess_uuid in sess_uuids: - sess = await self.api.return_session_info(sess_uuid) - sessions.append(sess) - result = sessions + sessions = await self.api.return_sessions(applied_filters) + result = sessions[15*(page_id-1):15*page_id] + next_val = None + pre_val = None + if(page_id*15 <= len(sessions)): + next_val = '/{snare_uuid}/sessions/page/{page_id}'.format(snare_uuid=snare_uuid, + page_id=str(page_id + 1) + ) + if len(applied_filters) > 1: + next_val += '?filters={filters}'.format(filters=params['filters']) + if(page_id > 1): + pre_val = '/{snare_uuid}/sessions/page/{page_id}'.format(snare_uuid=snare_uuid, + page_id=str(page_id - 1) + ) + if len(applied_filters) > 1: + pre_val += '?filters={filters}'.format(filters=params['filters']) + return { - 'sessions' : result + 'sessions' : result, + 'next_val' : next_val, + 'pre_val' : pre_val } @aiohttp_jinja2.template('session.html') @@ -75,19 +89,23 @@ async def handle_session_info(self, request): 'session' : session } + async def on_shutdown(self, app): + self.redis_client.close() + def setup_routes(self, app): app.router.add_get('/', self.handle_index) app.router.add_get('/snares', self.handle_snares) app.router.add_resource('/snare/{snare_uuid}').add_route('GET', self.handle_snare) app.router.add_resource('/snare-stats/{snare_uuid}').add_route('GET', self.handle_snare_stats) app.router.add_resource('/session/{sess_uuid}').add_route('GET', self.handle_session_info) - app.router.add_resource('/{snare_uuid}/sessions').add_route('GET', self.handle_sessions) + app.router.add_resource('/{snare_uuid}/sessions/page/{page_id}').add_route('GET', self.handle_sessions) app.router.add_static('/static/', path='tanner/web/static') def create_app(self, loop): app = web.Application(loop= loop) aiohttp_jinja2.setup(app, loader= jinja2.FileSystemLoader('tanner/web/templates')) + app.on_shutdown.append(self.on_shutdown) self.setup_routes(app) return app diff --git a/tanner/web/templates/session.html b/tanner/web/templates/session.html index d7751bd5..ee0b5386 100644 --- a/tanner/web/templates/session.html +++ b/tanner/web/templates/session.html @@ -14,7 +14,7 @@

SESSION INFO

IP - {{session.peer_ip}} + {{session.peer_ip}} Port @@ -30,11 +30,11 @@

SESSION INFO

Start time - {{session.start_time}} + {{session.start_time}} End time - {{session.end_time}} + {{session.end_time}} Requests/sec @@ -60,7 +60,7 @@

SESSION INFO

Attack types {% for attack in session.attack_types %} - {{attack}}
+ {{attack}}
{% endfor %} @@ -84,7 +84,7 @@

SESSION INFO

Possible Owners {% for owner in session.possible_owners %} - {{owner}}
+ {{owner}}
{% endfor %} diff --git a/tanner/web/templates/sessions.html b/tanner/web/templates/sessions.html index 7efb278b..e20930bd 100644 --- a/tanner/web/templates/sessions.html +++ b/tanner/web/templates/sessions.html @@ -25,6 +25,11 @@

SNARE-SESSIONS

{% endfor %} +
+
+ {% if pre_val %}Previous{% endif %} + {% if next_val %}Next{% endif %} +
{% endblock %} \ No newline at end of file diff --git a/tanner/web/templates/snare.html b/tanner/web/templates/snare.html index a44a259c..6225276c 100644 --- a/tanner/web/templates/snare.html +++ b/tanner/web/templates/snare.html @@ -3,5 +3,5 @@ {% block content %}

{{snare}}

Snare-Stats

-

Sessions

+

Sessions

{% endblock %} \ No newline at end of file