mirror of https://github.com/CIRCL/AIL-framework
				
				
				
			chg: [fontawesome] v6.6.0 migration
							parent
							
								
									055bc1a1b2
								
							
						
					
					
						commit
						721b076559
					
				|  | @ -1 +0,0 @@ | |||
| <li id='page-index'><a href="{{ url_for('dashboard.index') }}"><i class="fa fa-dashboard fa-fw"></i> Dashboard</a></li> | ||||
|  | @ -1,17 +0,0 @@ | |||
|                           <div class="input-group custom-search-form"> | ||||
|                               <form action="{{ url_for('searches.search') }}" id="form-search" method=POST> | ||||
|                                 <input type="text" name="query" class="form-control" placeholder="Search Paste"> | ||||
|                                 <input type="hidden" name="index_name" class="form-control" value="0" placeholder="Index Name"> | ||||
|                                 <span class="input-group-btn"> | ||||
|                                 <button class="btn btn-default" type="submit"> | ||||
|                                     <i class="fa fa-search"></i> | ||||
|                                 </button> | ||||
|                                 <img id="loading-gif" src="{{url_for('static', filename='image/loading.gif') }}" height="26" width="26" style="margin: 4px; visibility: hidden;"> | ||||
|                               </form> | ||||
|                           </span> | ||||
|                           </div> | ||||
|                           <script> | ||||
|                               $("#form-search").submit(function( event ) { | ||||
|                                   $("#loading-gif").css("visibility", "visible"); | ||||
|                               }); | ||||
|                           </script> | ||||
|  | @ -1,528 +0,0 @@ | |||
| #!/usr/bin/env python3 | ||||
| # -*-coding:UTF-8 -* | ||||
| 
 | ||||
| """ | ||||
|     Flask functions and routes for the rest api | ||||
| """ | ||||
| 
 | ||||
| # import os | ||||
| # import re | ||||
| # import sys | ||||
| # import uuid | ||||
| # import json | ||||
| 
 | ||||
| # sys.path.append(os.environ['AIL_BIN']) | ||||
| # ################################## | ||||
| # # Import Project packages | ||||
| # ################################## | ||||
| # from lib.ConfigLoader import ConfigLoader | ||||
| # from lib import Users | ||||
| # from lib.objects import Items | ||||
| # from lib import Tag | ||||
| # | ||||
| # from packages import Import_helper | ||||
| # | ||||
| # from importer.FeederImporter import api_add_json_feeder_to_queue | ||||
| # | ||||
| # | ||||
| # from flask import jsonify, request, Blueprint, redirect, url_for, Response | ||||
| # | ||||
| # from functools import wraps | ||||
| 
 | ||||
| # ============ VARIABLES ============ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| # ============ DECORATOR ============ | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| # ============= ROUTES ============== | ||||
| 
 | ||||
| # @restApi.route("/api", methods=['GET']) | ||||
| # @login_required | ||||
| # def api(): | ||||
| #     return 'api doc' | ||||
| 
 | ||||
| 
 | ||||
| ''' | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| # POST | ||||
| # | ||||
| # { | ||||
| #   "id": item_id,      mandatory | ||||
| #   "content": true, | ||||
| # | ||||
| # | ||||
| # } | ||||
| # | ||||
| # response: { | ||||
| #               "id": "item_id", | ||||
| #               "tags": [], | ||||
| #           } | ||||
| # | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| @restApi.route("api/v1/get/item", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_item_id(): | ||||
|     data = request.get_json() | ||||
|     res = Items.api_get_item(data) | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| # GET | ||||
| # | ||||
| # { | ||||
| #   "id": item_id,      mandatory | ||||
| # } | ||||
| # | ||||
| # response: { | ||||
| #               "id": "item_id", | ||||
| #               "date": "date", | ||||
| #               "tags": [], | ||||
| #           } | ||||
| # | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| @restApi.route("api/v1/get/item/tag", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_item_tag(): | ||||
|     data = request.get_json() | ||||
|     item_id = data.get('id', None) | ||||
|     req_data = {'id': item_id, 'date': False, 'tags': True} | ||||
|     res = Item.get_item(req_data) | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| # POST | ||||
| # | ||||
| # { | ||||
| #   "id": item_id,      mandatory | ||||
| #   "tags": [tags to add], | ||||
| #   "galaxy": [galaxy to add], | ||||
| # } | ||||
| # | ||||
| # response: { | ||||
| #               "id": "item_id", | ||||
| #               "tags": [tags added], | ||||
| #           } | ||||
| # | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| @restApi.route("api/v1/add/item/tag", methods=['POST']) | ||||
| @token_required('analyst') | ||||
| def add_item_tags(): | ||||
| 
 | ||||
|     data = request.get_json() | ||||
|     if not data: | ||||
|         return Response(json.dumps({'status': 'error', 'reason': 'Malformed JSON'}, indent=2, sort_keys=True), mimetype='application/json'), 400 | ||||
| 
 | ||||
|     object_id = data.get('id', None) | ||||
|     tags = data.get('tags', []) | ||||
|     galaxy = data.get('galaxy', []) | ||||
| 
 | ||||
|     # res = Tag.api_add_obj_tags(tags=tags, galaxy_tags=galaxy, object_id=object_id, object_type="item") | ||||
|     res = {'error': 'disabled endpoint'}, 500 | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| # DELETE | ||||
| # | ||||
| # { | ||||
| #   "id": item_id,      mandatory | ||||
| #   "tags": [tags to delete], | ||||
| # } | ||||
| # | ||||
| # response: { | ||||
| #               "id": "item_id", | ||||
| #               "tags": [tags deleted], | ||||
| #           } | ||||
| # | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| @restApi.route("api/v1/delete/item/tag", methods=['DELETE']) | ||||
| @token_required('analyst') | ||||
| def delete_item_tags(): | ||||
| 
 | ||||
|     data = request.get_json() | ||||
|     if not data: | ||||
|         return Response(json.dumps({'status': 'error', 'reason': 'Malformed JSON'}, indent=2, sort_keys=True), mimetype='application/json'), 400 | ||||
| 
 | ||||
|     object_id = data.get('id', None) | ||||
|     tags = data.get('tags', []) | ||||
| 
 | ||||
|     res = Tag.api_delete_obj_tags(tags=tags, object_id=object_id, object_type="item") | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| # GET | ||||
| # | ||||
| # { | ||||
| #   "id": item_id,      mandatory | ||||
| # } | ||||
| # | ||||
| # response: { | ||||
| #               "id": "item_id", | ||||
| #               "content": "item content" | ||||
| #           } | ||||
| # | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| @restApi.route("api/v1/get/item/content", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_item_content(): | ||||
|     data = request.get_json() | ||||
|     item_id = data.get('id', None) | ||||
|     req_data = {'id': item_id, 'date': False, 'content': True, 'tags': False} | ||||
|     res = Item.get_item(req_data) | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| 
 | ||||
| @restApi.route("api/v1/get/item/content/utf8/base64", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_item_content_encoded_text(): | ||||
|     data = request.get_json() | ||||
|     item_id = data.get('id', None) | ||||
|     req_data = {'id': item_id} | ||||
|     res = Item.api_get_item_content_base64_utf8(req_data) | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| 
 | ||||
| @restApi.route("api/v1/get/items/sources", methods=['GET']) | ||||
| @token_required('read_only') | ||||
| def get_item_sources(): | ||||
|     res = Item.api_get_items_sources() | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| ''' | ||||
| 
 | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| # # # # # # # # # # # # # #        TAGS       # # # # # # # # # # # # # # # # # | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| ''' | ||||
| @restApi.route("api/v1/get/tag/metadata", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_tag_metadata(): | ||||
|     data = request.get_json() | ||||
|     tag = data.get('tag', None) | ||||
|     if not Tag.is_tag_in_all_tag(tag): | ||||
|         return Response(json.dumps({'status': 'error', 'reason':'Tag not found'}, indent=2, sort_keys=True), mimetype='application/json'), 404 | ||||
|     metadata = Tag.get_tag_metadata(tag) | ||||
|     return Response(json.dumps(metadata, indent=2, sort_keys=True), mimetype='application/json'), 200 | ||||
| 
 | ||||
| @restApi.route("api/v1/get/tag/all", methods=['GET']) | ||||
| @token_required('read_only') | ||||
| def get_all_tags(): | ||||
|     res = {'tags': Tag.get_all_tags()} | ||||
|     return Response(json.dumps(res, indent=2, sort_keys=True), mimetype='application/json'), 200 | ||||
| ''' | ||||
| 
 | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # TODO | ||||
| # # # # # # # # # # # # # #        TRACKER      # # # # # # # # # # # # # # # # # TODO | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # TODO | ||||
| ''' | ||||
| @restApi.route("api/v1/add/tracker", methods=['POST']) | ||||
| @token_required('analyst') | ||||
| def add_tracker_term(): | ||||
|     data = request.get_json() | ||||
|     user_token = get_auth_from_header() | ||||
|     user_id = Users.get_token_user(user_token) | ||||
|     res = Tracker.api_add_tracker(data, user_id) | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| @restApi.route("api/v1/delete/tracker", methods=['DELETE']) | ||||
| @token_required('analyst') | ||||
| def delete_tracker_term(): | ||||
|     data = request.get_json() | ||||
|     user_token = get_auth_from_header() | ||||
|     user_id = Users.get_token_user(user_token) | ||||
|     res = Term.parse_tracked_term_to_delete(data, user_id) | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| @restApi.route("api/v1/get/tracker/item", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_tracker_term_item(): | ||||
|     data = request.get_json() | ||||
|     user_token = get_auth_from_header() | ||||
|     user_id = Users.get_token_user(user_token) | ||||
|     res = Term.parse_get_tracker_term_item(data, user_id) | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| 
 | ||||
| @restApi.route("api/v1/get/tracker/yara/content", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_default_yara_rule_content(): | ||||
|     data = request.get_json() | ||||
|     rule_name = data.get('rule_name', None) | ||||
|     rule_name = escape(rule_name) | ||||
|     req_data = {'rule_name': rule_name} | ||||
|     res = Tracker.get_yara_rule_content_restapi(req_data) | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| @restApi.route("api/v1/get/tracker/metadata", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_tracker_metadata_api(): | ||||
|     data = request.get_json() | ||||
|     tracker_uuid = data.get('tracker_uuid', None) | ||||
|     req_data = {'tracker_uuid': tracker_uuid} | ||||
|      | ||||
|     tracker_uuid = request_dict.get('tracker_uuid', None) | ||||
|     if not request_dict: | ||||
|         return {'status': 'error', 'reason': 'Malformed JSON'}, 400 | ||||
|     if not tracker_uuid: | ||||
|         return {'status': 'error', 'reason': 'Mandatory parameter(s) not provided'}, 400 | ||||
|     if not is_valid_uuid_v4(tracker_uuid): | ||||
|         return {"status": "error", "reason": "Invalid Tracker UUID"}, 400 | ||||
|     if not r_serv_tracker.exists(f'tracker:{tracker_uuid}'): | ||||
|         return {'status': 'error', 'reason': 'Tracker not found'}, 404 | ||||
|          | ||||
|     res = Tracker.get_tracker_metadata_api(req_data) | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=False), mimetype='application/json'), res[1] | ||||
|      | ||||
| ''' | ||||
| 
 | ||||
| ''' | ||||
| 
 | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| # # # # # # # # # # # #        CRYPTOCURRENCY       # # # # # # # # # # # # # # | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| @restApi.route("api/v1/get/cryptocurrency/bitcoin/metadata", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_cryptocurrency_bitcoin_metadata(): | ||||
|     data = request.get_json() | ||||
|     crypto_address = data.get('bitcoin', None) | ||||
|     req_data = {'bitcoin': crypto_address, 'metadata': True} | ||||
|     raise Exception('TO MIGRATE') | ||||
|     res = 0 | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| @restApi.route("api/v1/get/cryptocurrency/bitcoin/item", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_cryptocurrency_bitcoin_item(): | ||||
|     data = request.get_json() | ||||
|     bitcoin_address = data.get('bitcoin', None) | ||||
|     req_data = {'bitcoin': bitcoin_address, 'items': True} | ||||
|     raise Exception('TO MIGRATE') | ||||
|     res = 0 | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| # # # # # # # # # # # # # # #       PGP       # # # # # # # # # # # # # # # # # | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| @restApi.route("api/v1/get/pgp/key/metadata", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_pgp_key_metadata(): | ||||
|     data = request.get_json() | ||||
|     pgp_field = data.get('key', None) | ||||
|     req_data = {'key': pgp_field, 'metadata': True} | ||||
|     raise Exception('TO MIGRATE') | ||||
|     res = 0 | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| @restApi.route("api/v1/get/pgp/mail/metadata", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_pgp_mail_metadata(): | ||||
|     data = request.get_json() | ||||
|     pgp_field = data.get('mail', None) | ||||
|     req_data = {'mail': pgp_field, 'metadata': True} | ||||
|     raise Exception('TO MIGRATE') | ||||
|     res = 0 | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| @restApi.route("api/v1/get/pgp/name/metadata", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_pgp_name_metadata(): | ||||
|     data = request.get_json() | ||||
|     pgp_field = data.get('name', None) | ||||
|     req_data = {'name': pgp_field, 'metadata': True} | ||||
|     raise Exception('TO MIGRATE') | ||||
|     res = 0 | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| @restApi.route("api/v1/get/pgp/key/item", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_pgp_key_item(): | ||||
|     data = request.get_json() | ||||
|     pgp_field = data.get('key', None) | ||||
|     req_data = {'key': pgp_field, 'items': True} | ||||
|     res = 0 | ||||
|     raise Exception('TO MIGRATE') | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| @restApi.route("api/v1/get/pgp/mail/item", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_pgp_mail_item(): | ||||
|     data = request.get_json() | ||||
|     pgp_mail = data.get('mail', None) | ||||
|     req_data = {'mail': pgp_mail, 'items': True} | ||||
|     raise Exception('TO MIGRATE') | ||||
|     res = 0 | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| @restApi.route("api/v1/get/pgp/name/item", methods=['POST']) | ||||
| @token_required('read_only') | ||||
| def get_pgp_name_item(): | ||||
|     data = request.get_json() | ||||
|     pgp_name = data.get('name', None) | ||||
|     req_data = {'name': pgp_name, 'items': True} | ||||
|     raise Exception('TO MIGRATE') | ||||
|     res = 0 | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| @restApi.route("api/v1/get/item/cryptocurrency/key", methods=['POST']) | ||||
| @token_required('analyst') | ||||
| def get_item_cryptocurrency_bitcoin(): | ||||
|     data = request.get_json() | ||||
|     item_id = data.get('id', None) | ||||
|     req_data = {'id': item_id, 'date': False, 'tags': False, 'pgp': {'key': True}} | ||||
|     res = Item.get_item(req_data) | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| @restApi.route("api/v1/get/item/pgp/mail", methods=['POST']) | ||||
| @token_required('analyst') | ||||
| def get_item_cryptocurrency_bitcoin(): | ||||
|     data = request.get_json() | ||||
|     item_id = data.get('id', None) | ||||
|     req_data = {'id': item_id, 'date': False, 'tags': False, 'pgp': {'mail': True}} | ||||
|     res = Item.get_item(req_data) | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| 
 | ||||
| @restApi.route("api/v1/get/item/pgp/name", methods=['POST']) | ||||
| @token_required('analyst') | ||||
| def get_item_cryptocurrency_bitcoin(): | ||||
|     data = request.get_json() | ||||
|     item_id = data.get('id', None) | ||||
|     req_data = {'id': item_id, 'date': False, 'tags': False, 'pgp': {'name': True}} | ||||
|     res = Item.get_item(req_data) | ||||
|     return Response(json.dumps(res[0], indent=2, sort_keys=True), mimetype='application/json'), res[1] | ||||
| ''' | ||||
| 
 | ||||
| 
 | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| # # # # # # # # # # # # # #        DOMAIN       # # # # # # # # # # # # # # # # | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| ''' | ||||
| @restApi.route("api/v1/get/domain/status/minimal", methods=['POST']) | ||||
| @token_required('analyst') | ||||
| def get_domain_status_minimal(): | ||||
|     data = request.get_json() | ||||
|     domain = data.get('domain', None) | ||||
|     # error handler | ||||
|     # TODO TO MIGRATE | ||||
|     raise Exception('TO MIGRATE') | ||||
|     # res = Domain.api_verify_if_domain_exist(domain) | ||||
|     if res: | ||||
|         return create_json_response(res[0], res[1]) | ||||
|     # TODO TO MIGRATE | ||||
|     raise Exception('TO MIGRATE') | ||||
|     # res = Domain.api_get_domain_up_range(domain) | ||||
|     res[0]['domain'] = domain | ||||
|     return create_json_response(res[0], res[1]) | ||||
| ''' | ||||
| 
 | ||||
| # @restApi.route("api/v1/get/crawled/domain/list", methods=['POST']) | ||||
| # @token_required('analyst') | ||||
| # def get_crawled_domain_list(): | ||||
| #     data = request.get_json() | ||||
| #     res = get_mandatory_fields(data, ['date_from', 'date_to']) | ||||
| #     if res: | ||||
| #         return create_json_response(res[0], res[1]) | ||||
| # | ||||
| #     date_from = data.get('date_from', None) | ||||
| #     date_to = data.get('date_to', None) | ||||
| #     domain_type = data.get('domain_type', None) | ||||
| #     domain_status = 'UP' | ||||
| #     # TODO TO MIGRATE | ||||
| #     raise Exception('TO MIGRATE') | ||||
| #     # res = Domain.api_get_domains_by_status_daterange(date_from, date_to, domain_type) | ||||
| #     dict_res = res[0] | ||||
| #     dict_res['date_from'] = date_from | ||||
| #     dict_res['date_to'] = date_to | ||||
| #     dict_res['domain_status'] = domain_status | ||||
| #     dict_res['domain_type'] = domain_type | ||||
| #     return create_json_response(dict_res, res[1]) | ||||
| 
 | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| # # # # # # # # # # # # #        IMPORT     # # # # # # # # # # # # # # # # # # | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| 
 | ||||
| 
 | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| # | ||||
| # POST JSON FORMAT | ||||
| # | ||||
| # { | ||||
| #   "type": "text",         (default value) | ||||
| #   "tags": [],             (default value) | ||||
| #   "default_tags": True,    (default value) | ||||
| #   "galaxy" [],            (default value) | ||||
| #   "text": "",             mandatory if type = text | ||||
| # } | ||||
| # | ||||
| # response: {"uuid": "uuid"} | ||||
| # | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| ''' | ||||
| @restApi.route("api/v1/import/item", methods=['POST']) | ||||
| @token_required('analyst') | ||||
| def import_item(): | ||||
| 
 | ||||
|     data = request.get_json() | ||||
|     if not data: | ||||
|         return create_json_response({'status': 'error', 'reason': 'Malformed JSON'}, 400) | ||||
| 
 | ||||
|     # unpack json | ||||
|     text_to_import = data.get('text', None) | ||||
|     if not text_to_import: | ||||
|         return create_json_response({'status': 'error', 'reason': 'No text supplied'}, 400) | ||||
| 
 | ||||
|     tags = data.get('tags', []) | ||||
|     if not type(tags) is list: | ||||
|         tags = [] | ||||
|     galaxy = data.get('galaxy', []) | ||||
|     if not type(galaxy) is list: | ||||
|         galaxy = [] | ||||
| 
 | ||||
|     if not Tag.is_valid_tags_taxonomies_galaxy(tags, galaxy): | ||||
|         return create_json_response({'status': 'error', 'reason': 'Tags or Galaxy not enabled'}, 400) | ||||
| 
 | ||||
|     default_tags = data.get('default_tags', True) | ||||
|     if default_tags: | ||||
|         tags.append('infoleak:submission="manual"') | ||||
| 
 | ||||
|     if sys.getsizeof(text_to_import) > 900000: | ||||
|         return create_json_response({'status': 'error', 'reason': 'Size exceeds default'}, 413) | ||||
| 
 | ||||
|     import_uuid = str(uuid.uuid4()) | ||||
|     Import_helper.create_import_queue(tags, galaxy, text_to_import, import_uuid) | ||||
| 
 | ||||
|     return Response(json.dumps({'uuid': import_uuid}, indent=2, sort_keys=True), mimetype='application/json') | ||||
| 
 | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| # GET | ||||
| # | ||||
| # { | ||||
| #   "uuid": "uuid",      mandatory | ||||
| # } | ||||
| # | ||||
| # response: { | ||||
| #               "status": "in queue"/"in progress"/"imported", | ||||
| #               "items": [all item id] | ||||
| #           } | ||||
| # | ||||
| # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # | ||||
| @restApi.route("api/v1/get/import/item", methods=['POST']) | ||||
| @token_required('analyst') | ||||
| def import_item_uuid(): | ||||
|     data = request.get_json() | ||||
|     import_uuid = data.get('uuid', None) | ||||
| 
 | ||||
|     # Verify uuid | ||||
|     if not is_valid_uuid_v4(import_uuid): | ||||
|         return Response(json.dumps({'status': 'error', 'reason': 'Invalid uuid'}), mimetype='application/json'), 400 | ||||
| 
 | ||||
|     data = Import_helper.check_import_status(import_uuid) | ||||
|     if data: | ||||
|         return Response(json.dumps(data[0]), mimetype='application/json'), data[1] | ||||
| 
 | ||||
|     return Response(json.dumps({'status': 'error', 'reason': 'Invalid response'}), mimetype='application/json'), 400 | ||||
| ''' | ||||
|  | @ -1,35 +0,0 @@ | |||
| <!DOCTYPE html> | ||||
| 
 | ||||
| <html> | ||||
| <head> | ||||
| 	<title>AIL-Framework</title> | ||||
| 	<link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png')}}"> | ||||
| 	<!-- Core CSS --> | ||||
| 	<link href="{{ url_for('static', filename='css/bootstrap4.min.css') }}" rel="stylesheet"> | ||||
| 	<link href="{{ url_for('static', filename='css/font-awesome.min.css') }}" rel="stylesheet"> | ||||
| 
 | ||||
| 	<!-- JS --> | ||||
| 	<script src="{{ url_for('static', filename='js/jquery.js')}}"></script> | ||||
| 	<script src="{{ url_for('static', filename='js/bootstrap4.min.js')}}"></script> | ||||
| 
 | ||||
| 
 | ||||
| </head> | ||||
| 
 | ||||
| <body> | ||||
| 
 | ||||
| 	{% include 'nav_bar.html' %} | ||||
| 
 | ||||
| 	<div class="container-fluid"> | ||||
| 		<div class="row"> | ||||
| 
 | ||||
| 			{% include 'crawler/menu_sidebar.html' %} | ||||
| 
 | ||||
| 			<div class="col-12 col-lg-10" id="core_content"> | ||||
| 
 | ||||
| 
 | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 
 | ||||
| 
 | ||||
| </body> | ||||
|  | @ -1,249 +0,0 @@ | |||
| #!/usr/bin/env python3 | ||||
| # -*-coding:UTF-8 -* | ||||
| 
 | ||||
| 
 | ||||
| # import os | ||||
| # import sys | ||||
| # import datetime | ||||
| # import flask | ||||
| # from flask import Flask, render_template, jsonify, request, Blueprint | ||||
| # | ||||
| # from Role_Manager import login_admin, login_user_no_api | ||||
| # from flask_login import login_required | ||||
| # | ||||
| # from whoosh import index | ||||
| # from whoosh.fields import Schema, TEXT, ID | ||||
| # from whoosh.qparser import QueryParser | ||||
| # | ||||
| # sys.path.append(os.environ['AIL_BIN']) | ||||
| # ################################## | ||||
| # # Import Project packages | ||||
| # ################################## | ||||
| # from lib.objects.Items import Item | ||||
| # | ||||
| # import time | ||||
| # | ||||
| # # ============ VARIABLES ============ | ||||
| # import Flask_config | ||||
| # | ||||
| # app = Flask_config.app | ||||
| # config_loader = Flask_config.config_loader | ||||
| # baseUrl = Flask_config.baseUrl | ||||
| # max_preview_char = Flask_config.max_preview_char | ||||
| # max_preview_modal = Flask_config.max_preview_modal | ||||
| # bootstrap_label = Flask_config.bootstrap_label | ||||
| # PASTES_FOLDER = Flask_config.PASTES_FOLDER | ||||
| # | ||||
| # baseindexpath = os.path.join(os.environ['AIL_HOME'], config_loader.get_config_str("Indexer", "path")) | ||||
| # indexRegister_path = os.path.join(os.environ['AIL_HOME'], config_loader.get_config_str("Indexer", "register")) | ||||
| # | ||||
| # searches = Blueprint('searches', __name__, template_folder='templates') | ||||
| # | ||||
| # # ============ FUNCTIONS ============ | ||||
| # def get_current_index(): | ||||
| #     with open(indexRegister_path, "r") as f: | ||||
| #         allIndex = f.read() | ||||
| #         allIndex = allIndex.split() # format [time1\ntime2] | ||||
| #         allIndex.sort() | ||||
| #         try: | ||||
| #             indexname = allIndex[-1].strip('\n\r') | ||||
| #         except IndexError as e: | ||||
| #             indexname = "no-index" | ||||
| #         indexpath = os.path.join(baseindexpath, indexname) | ||||
| #     return indexpath | ||||
| # | ||||
| # def get_index_list(selected_index=""): | ||||
| #     temp = [] | ||||
| #     index_list = [] | ||||
| #     for dirs in os.listdir(baseindexpath): | ||||
| #         if os.path.isdir(os.path.join(baseindexpath, dirs)): | ||||
| #             value = dirs | ||||
| #             name = to_iso_date(dirs) + " - " + \ | ||||
| #                     str(get_dir_size(dirs) / (1000*1000)) + " Mb " #+ \ | ||||
| #                     #"(" + str(get_item_count(dirs))''' + " Items" + ")" | ||||
| #             flag = dirs==selected_index.split('/')[-1] | ||||
| #             if dirs == "old_index": | ||||
| #                 temp = [value, name, flag] | ||||
| #             else: | ||||
| #                 index_list.append([value, name, flag]) | ||||
| # | ||||
| #     index_list.sort(reverse=True, key=lambda x: x[0]) | ||||
| #     if len(temp) != 0: | ||||
| #         index_list.append(temp) | ||||
| # | ||||
| #     return index_list | ||||
| # | ||||
| # def get_dir_size(directory): | ||||
| #     cur_sum = 0 | ||||
| #     for directory, subdirs, files in os.walk(os.path.join(baseindexpath,directory)): | ||||
| #         try: | ||||
| #             cur_sum += sum(os.path.getsize(os.path.join(directory, name)) for name in files) | ||||
| #         except OSError as e: #File disappeared | ||||
| #             pass | ||||
| #     return cur_sum | ||||
| # | ||||
| # def get_item_count(dirs): | ||||
| #     ix = index.open_dir(os.path.join(baseindexpath, dirs)) | ||||
| #     return ix.doc_count_all() | ||||
| # | ||||
| # def to_iso_date(timestamp): | ||||
| #     if timestamp == "old_index": | ||||
| #         return "old_index" | ||||
| #     return str(datetime.datetime.fromtimestamp(int(timestamp))).split()[0] | ||||
| # | ||||
| # | ||||
| # # ============ ROUTES ============ | ||||
| # | ||||
| # @searches.route("/search", methods=['POST']) | ||||
| # @login_required | ||||
| # @login_user_no_api | ||||
| # def search(): | ||||
| #     query = request.form['query'] | ||||
| #     q = [] | ||||
| #     q.append(query) | ||||
| #     r = [] #complete path | ||||
| #     c = [] #preview of the paste content | ||||
| #     paste_date = [] | ||||
| #     paste_size = [] | ||||
| #     paste_tags = [] | ||||
| #     index_name = request.form['index_name'] | ||||
| #     num_elem_to_get = 50 | ||||
| # | ||||
| #     # select correct index | ||||
| #     if index_name is None or index_name == "0": | ||||
| #         selected_index = get_current_index() | ||||
| #     else: | ||||
| #         selected_index = os.path.join(baseindexpath, index_name) | ||||
| # | ||||
| #     ''' temporary disabled | ||||
| #     # # TODO: search by filename/item id | ||||
| #     ''' | ||||
| # | ||||
| #     # Search full line | ||||
| #     schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT) | ||||
| # | ||||
| #     ix = index.open_dir(selected_index) | ||||
| #     with ix.searcher() as searcher: | ||||
| #         query = QueryParser("content", ix.schema).parse("".join(q)) | ||||
| #         results = searcher.search_page(query, 1, pagelen=num_elem_to_get) | ||||
| #         for x in results: | ||||
| #             r.append(x.items()[0][1].replace(PASTES_FOLDER, '', 1)) | ||||
| #             path = x.items()[0][1].replace(PASTES_FOLDER, '', 1) | ||||
| #             item = Item(path) | ||||
| #             content = item.get_content() | ||||
| #             content_range = max_preview_char if len(content)>max_preview_char else len(content)-1 | ||||
| #             c.append(content[0:content_range]) | ||||
| #             curr_date = item.get_date(separator=True) | ||||
| #             paste_date.append(curr_date) | ||||
| #             paste_size.append(item.get_size()) | ||||
| #             p_tags = item.get_tags() | ||||
| #             l_tags = [] | ||||
| #             for tag in p_tags: | ||||
| #                 complete_tag = tag | ||||
| #                 tag = tag.split('=') | ||||
| #                 if len(tag) > 1: | ||||
| #                     if tag[1] != '': | ||||
| #                         tag = tag[1][1:-1] | ||||
| #                     # no value | ||||
| #                     else: | ||||
| #                         tag = tag[0][1:-1] | ||||
| #                 # use for custom tags | ||||
| #                 else: | ||||
| #                     tag = tag[0] | ||||
| # | ||||
| #                 l_tags.append( (tag, complete_tag) ) | ||||
| # | ||||
| #             paste_tags.append(l_tags) | ||||
| #         results = searcher.search(query) | ||||
| #         num_res = len(results) | ||||
| # | ||||
| #     index_list = get_index_list() | ||||
| # | ||||
| #     index_min = 1 | ||||
| #     index_max = len(index_list) | ||||
| # | ||||
| #     return render_template("search.html", r=r, c=c, | ||||
| #             query=request.form['query'], paste_date=paste_date, | ||||
| #             paste_size=paste_size, char_to_display=max_preview_modal, | ||||
| #             num_res=num_res, index_min=index_min, index_max=index_max, | ||||
| #             bootstrap_label=bootstrap_label, | ||||
| #             paste_tags=paste_tags, | ||||
| #             index_list=index_list | ||||
| #            ) | ||||
| # | ||||
| # | ||||
| # @searches.route("/get_more_search_result", methods=['POST']) | ||||
| # @login_required | ||||
| # @login_user_no_api | ||||
| # def get_more_search_result(): | ||||
| #     query = request.form['query'] | ||||
| #     q = [] | ||||
| #     q.append(query) | ||||
| #     page_offset = int(request.form['page_offset']) | ||||
| #     index_name = request.form['index_name'] | ||||
| #     num_elem_to_get = 50 | ||||
| # | ||||
| #     # select correct index | ||||
| #     if index_name is None or index_name == "0": | ||||
| #         selected_index = get_current_index() | ||||
| #     else: | ||||
| #         selected_index = os.path.join(baseindexpath, index_name) | ||||
| # | ||||
| #     path_array = [] | ||||
| #     preview_array = [] | ||||
| #     date_array = [] | ||||
| #     size_array = [] | ||||
| #     list_tags = [] | ||||
| # | ||||
| #     schema = Schema(title=TEXT(stored=True), path=ID(stored=True), content=TEXT) | ||||
| # | ||||
| #     ix = index.open_dir(selected_index) | ||||
| #     with ix.searcher() as searcher: | ||||
| #         query = QueryParser("content", ix.schema).parse(" ".join(q)) | ||||
| #         results = searcher.search_page(query, page_offset, num_elem_to_get) | ||||
| #         for x in results: | ||||
| #             path = x.items()[0][1] | ||||
| #             path = path.replace(PASTES_FOLDER, '', 1) | ||||
| #             path_array.append(path) | ||||
| #             item = Item(path) | ||||
| #             content = item.get_content() | ||||
| #             content_range = max_preview_char if len(content)>max_preview_char else len(content)-1 | ||||
| #             preview_array.append(content[0:content_range]) | ||||
| #             curr_date = item.get_date(separator=True) | ||||
| #             date_array.append(curr_date) | ||||
| #             size_array.append(item.get_size()) | ||||
| #             p_tags = item.get_tags() | ||||
| #             l_tags = [] | ||||
| #             for tag in p_tags: | ||||
| #                 complete_tag = tag | ||||
| #                 tag = tag.split('=') | ||||
| #                 if len(tag) > 1: | ||||
| #                     if tag[1] != '': | ||||
| #                         tag = tag[1][1:-1] | ||||
| #                     # no value | ||||
| #                     else: | ||||
| #                         tag = tag[0][1:-1] | ||||
| #                 # use for custom tags | ||||
| #                 else: | ||||
| #                     tag = tag[0] | ||||
| # | ||||
| #                 l_tags.append( (tag, complete_tag) ) | ||||
| #             list_tags.append(l_tags) | ||||
| # | ||||
| #         to_return = {} | ||||
| #         to_return["path_array"] = path_array | ||||
| #         to_return["preview_array"] = preview_array | ||||
| #         to_return["date_array"] = date_array | ||||
| #         to_return["size_array"] = size_array | ||||
| #         to_return["list_tags"] = list_tags | ||||
| #         to_return["bootstrap_label"] = bootstrap_label | ||||
| #         if len(path_array) < num_elem_to_get: #pagelength | ||||
| #             to_return["moreData"] = False | ||||
| #         else: | ||||
| #             to_return["moreData"] = True | ||||
| # | ||||
| #     return jsonify(to_return) | ||||
| # | ||||
| # | ||||
| # # ========= REGISTRATION ========= | ||||
| # app.register_blueprint(searches, url_prefix=baseUrl) | ||||
|  | @ -1,329 +0,0 @@ | |||
| <!DOCTYPE html> | ||||
| <html> | ||||
| 
 | ||||
| <head> | ||||
|   <meta charset="utf-8"> | ||||
|   <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
| 
 | ||||
|   <title>Search - AIL</title> | ||||
|   <link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}"> | ||||
| 
 | ||||
|   <!-- Core CSS --> | ||||
|   <link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet"> | ||||
|   <link href="{{ url_for('static', filename='font-awesome/css/font-awesome.css') }}" rel="stylesheet"> | ||||
|   <link href="{{ url_for('static', filename='css/dygraph_gallery.css') }}" rel="stylesheet" type="text/css" /> | ||||
|   <link href="{{ url_for('static', filename='css/dataTables.bootstrap.css') }}" rel="stylesheet" type="text/css" /> | ||||
|   <!-- JS --> | ||||
|   <script type="text/javascript" src="{{ url_for('static', filename='js/dygraph-combined.js') }}"></script> | ||||
|   <script language="javascript" src="{{ url_for('static', filename='js/jquery.js')}}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/jquery.dataTables.min.js') }}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/dataTables.bootstrap.js') }}"></script> | ||||
|   <!-- Custom style --> | ||||
|   <style> | ||||
|       .tooltip-inner { | ||||
|          text-align: left; | ||||
|          height: 200%; | ||||
|          max-width: 500px; | ||||
|          max-height: 500px; | ||||
|          font-size: 13px; | ||||
|       } | ||||
|       pre { | ||||
|          white-space:pre-wrap; | ||||
|          word-wrap:break-word; | ||||
|       } | ||||
| 
 | ||||
|   </style> | ||||
| 
 | ||||
| </head> | ||||
| <body> | ||||
| 
 | ||||
|    {% include 'navbar.html' %} | ||||
| 
 | ||||
|       <!-- Modal --> | ||||
|       <div id="mymodal" class="modal fade" role="dialog"> | ||||
|         <div class="modal-dialog modal-lg"> | ||||
| 
 | ||||
|           <!-- Modal content--> | ||||
|           <div id="mymodalcontent" class="modal-content"> | ||||
|             <div id="mymodalbody" class="modal-body" max-width="850px"> | ||||
|               <p>Loading paste information...</p> | ||||
|               <img id="loading-gif-modal" src="{{url_for('static', filename='image/loading.gif') }}" height="26" width="26" style="margin: 4px;"> | ||||
|             </div> | ||||
|             <div class="modal-footer"> | ||||
|               <a id="button_show_path" target="_blank" href=""><button type="button" class="btn btn-info">Show saved paste</button></a> | ||||
|               <button type="button" class="btn btn-default" data-dismiss="modal" >Close</button> | ||||
|             </div> | ||||
|           </div> | ||||
|         </div> | ||||
|       </div> | ||||
| 
 | ||||
| 
 | ||||
|         <div id="page-wrapper"> | ||||
|             <!-- /.row --> | ||||
|             <div class="row"> </div> | ||||
|             <div class="row"> | ||||
|                 <div class="col-lg-12"> | ||||
|                     </br> | ||||
|                     <div class="panel panel-default"> | ||||
|                         <div class="panel-heading"> | ||||
|                             <i class="glyphicon glyphicon-search"></i> <b id="numberOfRes">{{ r|length }}</b> Results for "<strong>{{ query }}</strong>" | ||||
|                             <div class="pull-right"> | ||||
| 
 | ||||
|                             </div> | ||||
|                         </div> | ||||
|                         <!-- /.panel-heading --> | ||||
|                           <div class="panel-body"> | ||||
|                               <div class="row"> | ||||
|                               <div class="col-md-12"> | ||||
|                                   <strong style="">Index: </strong> | ||||
|                                   <select class="form-control" id="index_name" style="display: inline-block; margin-bottom: 5px; width: 30%"> | ||||
|                                       {% for indexElem in index_list %} | ||||
|                                       <option {% if indexElem[2] %} selected="selected" {% endif %}  value="{{ indexElem[0] }}" >{{ indexElem[1] }}</option> | ||||
|                                       {% endfor %} | ||||
|                                   </select> | ||||
|                               </div> | ||||
|                               </div> | ||||
|                           <table class="table table-striped table-bordered table-hover" id="myTable"> | ||||
|                               <thead> | ||||
|                                    <tr> | ||||
|                                       <th>#</th> | ||||
|                                       <th style="max-width: 800px;">Path</th> | ||||
|                                       <th>Date</th> | ||||
|                                       <th>Size (Kb)</th> | ||||
|                                       <th>Action</th> | ||||
|                                    </tr> | ||||
|                               </thead> | ||||
|                               <tbody id="table_body"> | ||||
|                           {% for path in r %} | ||||
|                                 <tr> | ||||
|                                   <td> {{ loop.index0 }}</td> | ||||
|                                   <td><a target="_blank" href="{{ url_for('objects_item.showItem') }}?id={{path}}">{{ path }}</a> | ||||
|                                     <div> | ||||
|                                       {% for tag in paste_tags[loop.index0] %} | ||||
|                                       <a href="{{ url_for('tags_ui.get_obj_by_tags') }}?object_type=item<ags={{ tag[1] }}"> | ||||
|                                         <span class="label label-{{ bootstrap_label[loop.index0 % 5] }} pull-left">{{ tag[0] }}</span> | ||||
|                                       </a> | ||||
|                                       {%  endfor %} | ||||
|                                     </div> | ||||
|                                   </td> | ||||
|                                   <td>{{ paste_date[loop.index0] }}</td> | ||||
|                                   <td>{{ paste_size[loop.index0] }}</td> | ||||
|                                   <td><p><span class="glyphicon glyphicon-info-sign" data-toggle="tooltip" data-placement="left" title="{{ c[loop.index0] }} "></span> <button type="button" class="btn-link" data-num="{{ loop.index0 + 1 }}" data-toggle="modal" data-target="#mymodal" data-url="{{ url_for('objects_item.showItem') }}?id={{ path }}" data-path="{{ path }}"><span class="fa fa-search-plus"></span></button></p></td> | ||||
|                                 </tr> | ||||
|                           {% endfor %} | ||||
|                               </tbody> | ||||
|                           </table> | ||||
|                           <div id="div_stil_data"> | ||||
|                               <button id="load_more_json_button1" type="button" class="btn btn-default" onclick="add_entries();" style="display: none">Load 50 entries</button> | ||||
|                               <strong> Totalling {{ num_res }} results related to paste content </strong> | ||||
|                           </div> | ||||
|                         </div> | ||||
|                         <!-- /.panel-body --> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             <!-- /.row --> | ||||
|         </div> | ||||
|         <!-- /#page-wrapper --> | ||||
|     </div> | ||||
|     <script src="{{ url_for('static', filename='js/bootstrap4.min.js') }}"></script> | ||||
| </br> | ||||
| </body> | ||||
| 
 | ||||
| <!-- enable tooltip and dataTable --> | ||||
| <script> | ||||
|     var search_table; | ||||
|     var last_clicked_paste; | ||||
|     var can_change_modal_content = true; | ||||
|     var page_offset; | ||||
|     var offset; | ||||
|     var all_loaded; | ||||
|     var init_num_of_elements_in_table; | ||||
|     var query; | ||||
|     var pagelen = 50; | ||||
| 
 | ||||
|     $(document).ready(function(){ | ||||
|         $('[data-toggle="tooltip"]').tooltip(); | ||||
| 
 | ||||
|         $("#button_show_path").hide(); | ||||
|         search_table = $('#myTable').DataTable(); | ||||
| 
 | ||||
|         query = "{{ query }}"; | ||||
|         offset = 0; | ||||
|         page_offset = 2; //page 1 already loaded | ||||
|         all_loaded = false; | ||||
|         init_num_of_elements_in_table = parseInt("{{ r|length }}"); // Comes from the file search | ||||
| 
 | ||||
| 
 | ||||
|         if (init_num_of_elements_in_table == pagelen) { | ||||
|             $("#load_more_json_button1").show(); | ||||
|         } | ||||
| 
 | ||||
|         $('#index_name').on('change', function() { | ||||
|             var form = document.createElement('form'); | ||||
|             form.setAttribute("method", 'post'); | ||||
|             form.setAttribute("action", "{{ url_for('searches.search') }}"); | ||||
| 
 | ||||
|             var input1 = document.createElement('input'); | ||||
|             input1.setAttribute("type", "hidden"); | ||||
|             input1.setAttribute("name", "index_name"); | ||||
|             input1.setAttribute("value", this.value); | ||||
|             form.appendChild(input1); | ||||
| 
 | ||||
|             var input2 = document.createElement('input'); | ||||
|             input2.setAttribute("type", "hidden"); | ||||
|             input2.setAttribute("name", "query"); | ||||
|             input2.setAttribute("value", "{{ query }}"); | ||||
|             form.appendChild(input2); | ||||
| 
 | ||||
|             document.body.appendChild(form); | ||||
|             form.submit(); | ||||
|         }) | ||||
| 
 | ||||
|     }); | ||||
| 
 | ||||
| </script> | ||||
| 
 | ||||
| <script> | ||||
| 
 | ||||
| // Loop to recover all the data from  get_more_search_results | ||||
| // And add it dynamically top the dataTable | ||||
|     function add_entries() { //Used to disable the button before going to the big loop | ||||
|         $("#load_more_json_button1").attr('disabled','disabled'); | ||||
|         setTimeout(function() { load_search_50_data();}, 50); | ||||
|     } | ||||
| 
 | ||||
|     function load_search_50_data() { | ||||
|         var options = { query: query, page_offset: page_offset, index_name: $("#index_name").val() }; | ||||
|         $.post( "{{ url_for('searches.get_more_search_result') }}", options).done(function( data ) { | ||||
| 
 | ||||
|             for(i=0; i<data.path_array.length; i++) { | ||||
|                 var curr_preview = data.preview_array[i].replace(/\"/g, "\'"); | ||||
|                 var tag = "" | ||||
|                 for(j=0; j<data.list_tags[i].length; j++) { | ||||
|                   tag = tag + "<a href=\"{{ url_for('tags_ui.get_obj_by_tags') }}?object_type=item<ags=" + data.list_tags[i][j][1] + ">" | ||||
|                         + "<span class=\"label label-" + data.bootstrap_label[j % 5] + " pull-left\">" + data.list_tags[i][j][0] | ||||
|                         + "</span>" + "</a>" | ||||
|                 } | ||||
|                 search_table.row.add( [ | ||||
|                     init_num_of_elements_in_table+((offset))+i+1, | ||||
|                    "<a target=\"_blank\" href=\"{{ url_for('objects_item.showItem') }}?id="+data.path_array[i]+"&num="+i+"\"> "+ data.path_array[i] +"</a>" | ||||
|                    + "<div>" + tag + "</div>", | ||||
|                     data.date_array[i], | ||||
|                     data.size_array[i], | ||||
|                     "<p><span class=\"glyphicon glyphicon-info-sign\" data-toggle=\"tooltip\" data-placement=\"left\" title=\""+curr_preview+"\"></span> <button type=\"button\" class=\"btn-link\" data-num=\""+i+"\" data-toggle=\"modal\" data-target=\"#mymodal\" data-url=\"{{ url_for('objects_item.showItem') }}?id="+data.path_array[i]+"&num="+i+"\" data-path=\""+data.path_array[i]+"\"><span class=\"fa fa-search-plus\"></span></button></p>" | ||||
|                 ] ).draw( false ); | ||||
|             } | ||||
|             offset = offset + data.path_array.length; | ||||
|             page_offset = page_offset+1; | ||||
|             $("#numberOfRes").text(parseInt($("#numberOfRes").text()) + data.path_array.length); | ||||
|             if (data.moreData == true) { | ||||
|                 //continue | ||||
|             } else { | ||||
|                 all_loaded = true; | ||||
|                 $("#load_more_json_button1").hide(); | ||||
|             } | ||||
|             $("#load_more_json_button1").removeAttr('disabled'); | ||||
|             return data.path_array.length; | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
| </script> | ||||
| 
 | ||||
| <!-- Dynamically update the modal --> | ||||
| <script type="text/javascript"> | ||||
|     // static data | ||||
|     var alert_message = '<div class="alert alert-info alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">×</button><strong>No more data.</strong> Full paste displayed.</div>'; | ||||
|     var complete_paste = null; | ||||
|     var char_to_display = {{ char_to_display }}; | ||||
|     var start_index = 0; | ||||
| 
 | ||||
|     // When the modal goes out, refresh it to normal content | ||||
|     $("#mymodal").on('hidden.bs.modal', function () { | ||||
|         can_change_modal_content = true; | ||||
|         $("#mymodalbody").html("<p>Loading paste information...</p>"); | ||||
|         var loading_gif = "<img id='loading-gif-modal' class='img-center' src=\"{{url_for('static', filename='image/loading.gif') }}\" height='26' width='26' style='margin: 4px;'>"; | ||||
|         $("#mymodalbody").append(loading_gif); // Show the loading GIF | ||||
|         $("#button_show_path").attr('href', ''); | ||||
|         $("#button_show_path").hide(); | ||||
|         complete_paste = null; | ||||
|         start_index = 0; | ||||
|     }); | ||||
| 
 | ||||
|    // Update the paste preview in the modal | ||||
|    function update_preview() { | ||||
|        if (start_index + char_to_display > complete_paste.length-1){ // end of paste reached | ||||
|            var final_index = complete_paste.length-1; | ||||
|            var flag_stop = true; | ||||
|        } else { | ||||
|            var final_index = start_index + char_to_display; | ||||
|        } | ||||
| 
 | ||||
|        if (final_index != start_index){ // still have data to display | ||||
|            // Append the new content using text() and not append (XSS) | ||||
|            $("#mymodalbody").find("#paste-holder").text($("#mymodalbody").find("#paste-holder").text() + complete_paste.substring(start_index+1, final_index+1)); | ||||
|            start_index = final_index; | ||||
|            if (flag_stop) | ||||
|                nothing_to_display(); | ||||
|        } else { | ||||
|           nothing_to_display(); | ||||
|       } | ||||
|    } | ||||
|    // Update the modal when there is no more data | ||||
|    function nothing_to_display() { | ||||
|        var new_content = $(alert_message).hide(); | ||||
|        $("#mymodalbody").find("#panel-body").append(new_content); | ||||
|        new_content.show('fast'); | ||||
|        $("#load-more-button").hide(); | ||||
|    } | ||||
| 
 | ||||
| 
 | ||||
|    $('#myTable').on( 'draw.dt', function () { | ||||
|        // Bind tooltip each time we draw a new page | ||||
|        $('[data-toggle="tooltip"]').tooltip(); | ||||
|        // On click, get html content from url and update the corresponding modal | ||||
|        $("[data-toggle='modal']").off('click.openmodal').on("click.openmodal", function (event) { | ||||
|            var modal=$(this); | ||||
|            var url = " {{ url_for('objects_item.item_preview')  }}?id=" + $(this).attr('data-path'); | ||||
|            last_clicked_paste =  $(this).attr('data-num'); | ||||
|            $.get(url, function (data) { | ||||
| 
 | ||||
|                // verify that the reveived data is really the current clicked paste. Otherwise, ignore it. | ||||
|                var received_num = parseInt(data.split("|num|")[1]); | ||||
|                if (received_num == last_clicked_paste && can_change_modal_content) { | ||||
|                    can_change_modal_content = false; | ||||
| 
 | ||||
|                    // clear data by removing html, body, head tags. prevent dark modal background stack bug. | ||||
|                    var cleared_data = data.split("<body>")[1].split("</body>")[0]; | ||||
|                    $("#mymodalbody").html(cleared_data); | ||||
|                    setTimeout(function() { $('#tableDup').DataTable(); }, 150); | ||||
| 
 | ||||
|                    var button = $('<button type="button" id="load-more-button" class="btn btn-info btn-xs center-block" data-url="' + $(modal).attr('data-path') +'" data-toggle="tooltip" data-placement="bottom" title="Load more content"><span class="glyphicon glyphicon-download"></span></button>'); | ||||
|                    button.tooltip(); | ||||
|                    $("#mymodalbody").children(".panel-default").append(button); | ||||
| 
 | ||||
|                    $("#button_show_path").attr('href', $(modal).attr('data-url')); | ||||
|                    $("#button_show_path").show('fast'); | ||||
|                    $("#loading-gif-modal").css("visibility", "hidden"); // Hide the loading GIF | ||||
|                    if ($("[data-initsize]").attr('data-initsize') < char_to_display) { // All the content is displayed | ||||
|                        nothing_to_display(); | ||||
|                    } | ||||
|                    // On click, donwload all paste's content | ||||
|                    $("#load-more-button").off('click.download').on("click.download", function (event) { | ||||
|                        if (complete_paste == null) { //Donwload only once | ||||
|                            $.get("{{ url_for('objects_item.item_content_more') }}"+"?id="+$(modal).attr('data-path'), function(data, status){ | ||||
|                                complete_paste = data; | ||||
|                                update_preview(); | ||||
|                            }); | ||||
|                        } else { | ||||
|                            update_preview(); | ||||
|                        } | ||||
|                    }); | ||||
|                } else if (can_change_modal_content) { | ||||
|                    $("#mymodalbody").html("Ignoring previous not finished query of paste #" + received_num); | ||||
|                } | ||||
|            }); | ||||
|        }); | ||||
|    } ); | ||||
| 
 | ||||
| </script> | ||||
| </html> | ||||
|  | @ -1,160 +0,0 @@ | |||
| #!/usr/bin/env python3 | ||||
| # -*-coding:UTF-8 -* | ||||
| 
 | ||||
| # ''' | ||||
| #     Flask functions and routes for the trending modules page | ||||
| # ''' | ||||
| # import os | ||||
| # import sys | ||||
| # import datetime | ||||
| # import calendar | ||||
| # import flask | ||||
| # from flask import Flask, render_template, jsonify, request, Blueprint | ||||
| # | ||||
| # from Role_Manager import login_admin, login_read_only | ||||
| # from flask_login import login_required | ||||
| # | ||||
| # sys.path.append(os.environ['AIL_BIN']) | ||||
| # ################################## | ||||
| # # Import Project packages | ||||
| # ################################## | ||||
| # from packages.Date import Date | ||||
| # | ||||
| # # ============ VARIABLES ============ | ||||
| # import Flask_config | ||||
| # | ||||
| # app = Flask_config.app | ||||
| # baseUrl = Flask_config.baseUrl | ||||
| # r_serv_charts = Flask_config.r_serv_charts | ||||
| # r_serv_sentiment = Flask_config.r_serv_sentiment | ||||
| # | ||||
| # sentiments = Blueprint('sentiments', __name__, template_folder='templates') | ||||
| # | ||||
| # # ============ FUNCTIONS ============ | ||||
| # | ||||
| # def get_date_range(num_day): | ||||
| #     curr_date = datetime.date.today() | ||||
| #     date = Date(str(curr_date.year)+str(curr_date.month).zfill(2)+str(curr_date.day).zfill(2)) | ||||
| #     date_list = [] | ||||
| # | ||||
| #     for i in range(0, num_day+1): | ||||
| #         date_list.append(date.substract_day(i)) | ||||
| #     return date_list | ||||
| # | ||||
| # | ||||
| # # ============ ROUTES ============ | ||||
| # | ||||
| # @sentiments.route("/sentiment_analysis_trending/") | ||||
| # @login_required | ||||
| # @login_read_only | ||||
| # def sentiment_analysis_trending(): | ||||
| #     return render_template("sentiment_analysis_trending.html") | ||||
| # | ||||
| # | ||||
| # @sentiments.route("/sentiment_analysis_getplotdata/", methods=['GET']) | ||||
| # @login_required | ||||
| # @login_read_only | ||||
| # def sentiment_analysis_getplotdata(): | ||||
| #     # Get the top providers based on number of pastes | ||||
| #     oneHour = 60*60 | ||||
| #     sevenDays = oneHour*24*7 | ||||
| #     dateStart = datetime.datetime.now() | ||||
| #     dateStart = dateStart.replace(minute=0, second=0, microsecond=0) | ||||
| #     dateStart_timestamp = calendar.timegm(dateStart.timetuple()) | ||||
| # | ||||
| #     getAllProviders = request.args.get('getProviders') | ||||
| #     provider = request.args.get('provider') | ||||
| #     allProvider = request.args.get('all') | ||||
| #     if getAllProviders == 'True': | ||||
| #         if allProvider == "True": | ||||
| #             range_providers = r_serv_charts.smembers('all_provider_set') | ||||
| # | ||||
| #             return jsonify(list(range_providers)) | ||||
| #         else: | ||||
| #             range_providers = r_serv_charts.zrevrangebyscore('providers_set_'+ get_date_range(0)[0], '+inf', '-inf', start=0, num=8) | ||||
| #             # if empty, get yesterday top providers | ||||
| #             range_providers = r_serv_charts.zrevrangebyscore('providers_set_'+ get_date_range(1)[1], '+inf', '-inf', start=0, num=8) if range_providers == [] else range_providers | ||||
| # | ||||
| # | ||||
| #             # if still empty, takes from all providers | ||||
| #             if range_providers == []: | ||||
| #                 print('today provider empty') | ||||
| #                 range_providers = r_serv_charts.smembers('all_provider_set') | ||||
| # | ||||
| #             return jsonify(list(range_providers)) | ||||
| # | ||||
| #     elif provider is not None: | ||||
| #         to_return = {} | ||||
| # | ||||
| #         cur_provider_name = provider + '_' | ||||
| #         list_date = {} | ||||
| #         for cur_timestamp in range(int(dateStart_timestamp), int(dateStart_timestamp)-sevenDays-oneHour, -oneHour): | ||||
| #             cur_set_name = cur_provider_name + str(cur_timestamp) | ||||
| # | ||||
| #             list_value = [] | ||||
| #             for cur_id in r_serv_sentiment.smembers(cur_set_name): | ||||
| #                 cur_value = (r_serv_sentiment.get(cur_id)) | ||||
| #                 list_value.append(cur_value) | ||||
| #             list_date[cur_timestamp] = list_value | ||||
| #         to_return[provider] = list_date | ||||
| # | ||||
| #         return jsonify(to_return) | ||||
| #     return "Bad request" | ||||
| # | ||||
| # | ||||
| # | ||||
| # @sentiments.route("/sentiment_analysis_plot_tool/") | ||||
| # @login_required | ||||
| # @login_read_only | ||||
| # def sentiment_analysis_plot_tool(): | ||||
| #     return render_template("sentiment_analysis_plot_tool.html") | ||||
| # | ||||
| # | ||||
| # | ||||
| # @sentiments.route("/sentiment_analysis_plot_tool_getdata/", methods=['GET']) | ||||
| # @login_required | ||||
| # @login_read_only | ||||
| # def sentiment_analysis_plot_tool_getdata(): | ||||
| #     getProviders = request.args.get('getProviders') | ||||
| # | ||||
| #     if getProviders == 'True': | ||||
| #         providers = [] | ||||
| #         for cur_provider in r_serv_charts.smembers('all_provider_set'): | ||||
| #             providers.append(cur_provider) | ||||
| #         return jsonify(providers) | ||||
| # | ||||
| #     else: | ||||
| #         query = request.args.get('query') | ||||
| #         query = query.split(',') | ||||
| #         Qdate = request.args.get('Qdate') | ||||
| # | ||||
| #         date1 = (Qdate.split('-')[0]).split('/') | ||||
| #         date1 = datetime.date(int(date1[2]), int(date1[0]), int(date1[1])) | ||||
| # | ||||
| #         date2 = (Qdate.split('-')[1]).split('/') | ||||
| #         date2 = datetime.date(int(date2[2]), int(date2[0]), int(date2[1])) | ||||
| # | ||||
| #         timestamp1 = calendar.timegm(date1.timetuple()) | ||||
| #         timestamp2 = calendar.timegm(date2.timetuple()) | ||||
| # | ||||
| #         oneHour = 60*60 | ||||
| #         oneDay = oneHour*24 | ||||
| # | ||||
| #         to_return = {} | ||||
| #         for cur_provider in query: | ||||
| #             list_date = {} | ||||
| #             cur_provider_name = cur_provider + '_' | ||||
| #             for cur_timestamp in range(int(timestamp1), int(timestamp2)+oneDay, oneHour): | ||||
| #                 cur_set_name = cur_provider_name + str(cur_timestamp) | ||||
| # | ||||
| #                 list_value = [] | ||||
| #                 for cur_id in r_serv_sentiment.smembers(cur_set_name): | ||||
| #                     cur_value = (r_serv_sentiment.get(cur_id)) | ||||
| #                     list_value.append(cur_value) | ||||
| #                 list_date[cur_timestamp] = list_value | ||||
| #             to_return[cur_provider] = list_date | ||||
| # | ||||
| #         return jsonify(to_return) | ||||
| # | ||||
| # # ========= REGISTRATION ========= | ||||
| # app.register_blueprint(sentiments, url_prefix=baseUrl) | ||||
|  | @ -1,7 +0,0 @@ | |||
| {#<li id='page-sentiment'><a class="dropdown-toggle" data-toggle="dropdown" href="{{ url_for('sentiments.sentiment_analysis_trending') }}"><i class="fa fa-heart"></i> Sentiment Analysis#} | ||||
| {#    <span class="caret"></span></a>#} | ||||
| {#    <ul class="dropdown-menu">#} | ||||
| {#      <li><a href="{{ url_for('sentiments.sentiment_analysis_trending') }}"><i class="fa fa-bar-chart-o"> </i> Sentiment trending</a></li>#} | ||||
| {#      <li><a href="{{ url_for('sentiments.sentiment_analysis_plot_tool') }}"><i class="fa fa-wrench"> </i> Sentiment plot Tool</a></li>#} | ||||
| {#    </ul>#} | ||||
| {#</li>#} | ||||
|  | @ -1,134 +0,0 @@ | |||
| <!DOCTYPE html> | ||||
| <html> | ||||
| 
 | ||||
| <head> | ||||
|   <meta charset="utf-8"> | ||||
|   <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
| 
 | ||||
|   <title>Sentiment Plot Tool - AIL</title> | ||||
|   <link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}"> | ||||
| 
 | ||||
|   <!-- Core CSS --> | ||||
|   <link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet"> | ||||
|   <link href="{{ url_for('static', filename='font-awesome/css/font-awesome.css') }}" rel="stylesheet"> | ||||
|   <link href="{{ url_for('static', filename='css/dataTables.bootstrap.css') }}" rel="stylesheet" type="text/css" /> | ||||
|   <link href="{{ url_for('static', filename='css/jquery-ui.min.css') }}" rel="stylesheet" type="text/css" /> | ||||
|   <script language="javascript" src="{{ url_for('static', filename='js/jquery.js')}}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/bootstrap4.min.js') }}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/jquery.dataTables.min.js') }}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/dataTables.bootstrap.js') }}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/jquery-ui.min.js') }}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/jquery.flot.js') }}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/jquery.flot.time.js') }}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/jquery.flot.stack.js') }}"></script> | ||||
| 
 | ||||
|   <style> | ||||
|       .sparkLineStats ul { | ||||
|           padding-left:0; | ||||
|           list-style:none | ||||
|       } | ||||
|   </style> | ||||
| </head> | ||||
| <body> | ||||
| 
 | ||||
|    {% include 'navbar.html' %} | ||||
| 
 | ||||
| <div id="page-wrapper"> | ||||
|   <div class="row"> | ||||
|       <div class="col-lg-12"> | ||||
|           <h1 class="page-header" data-page="page-sentiment" >Sentiment analysis: Plot tool</h1> | ||||
|       </div> | ||||
|       <!-- /.col-lg-12 --> | ||||
|   </div> | ||||
|     <!-- /.row --> | ||||
|     <div class="row"> | ||||
| 
 | ||||
|     <!-- Panel OPTIONS --> | ||||
|     <div class="row"> | ||||
|         <div class="col-lg-12"> | ||||
|             <div class="row"> | ||||
|                 <div class="col-lg-12"> | ||||
|                     <div id="panel-today" class="panel panel-default"> | ||||
|                         <div class="panel-heading"> | ||||
|                             <strong>Select options</strong> | ||||
|                         </div> | ||||
|                         <div class="panel-body"> | ||||
|                             <div class="row"> | ||||
|                             <!-- left column --> | ||||
|                             <div class="col-lg-9"> | ||||
|                                 <!-- providers charts --> | ||||
|                                 <div class="col-lg-6"> | ||||
|                                    <div class="sparkLineStats"> | ||||
|                                        <ul id="providerList1"> | ||||
|                                        </ul> | ||||
|                                    </div> | ||||
|                                 </div> | ||||
|                                 <div class="col-lg-6"> | ||||
|                                    <div class="sparkLineStats"> | ||||
|                                        <ul id="providerList2"> | ||||
|                                        </ul> | ||||
|                                    </div> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                             <!-- right column --> | ||||
|                             <div class="col-lg-3"> | ||||
|                                  <div aria-disabled="false" class="slider sliderRange sliderBlue ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all" style="margin-bottom: 5px;"></div> | ||||
|                                  <strong>Date:</strong> <input type="text" id="amount" readonly style="border:0; color:#f6931f; font-weight:bold;"> | ||||
|                             </div> | ||||
|                             </div> | ||||
|                             <!-- /.row --> | ||||
|                             <div class="row"> | ||||
|                                 <button id="plot_btn" class="btn btn-info" style="margin-right: 8px; margin-left: 8px;float: right;">Plot!</button> | ||||
|                                 <label style="float: right;"><input id="checkbox_stacked" type="checkbox" checked=true> Stacked graph?</label> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                         <!-- /.panel-body --> | ||||
|                     </div> | ||||
|                 </div> | ||||
|                 <!-- /.panel --> | ||||
|             </div> | ||||
|             <!-- /.panel --> | ||||
|         </div> | ||||
|     </div> | ||||
| 
 | ||||
|     <!-- Panel PLOT --> | ||||
|     <div class="row"> | ||||
|         <div class="col-lg-12"> | ||||
|             <div class="row"> | ||||
|                 <div class="col-lg-12"> | ||||
|                     <div id="panel-today" class="panel panel-default"> | ||||
|                         <div class="panel-heading"> | ||||
|                             <strong>Graph</strong> | ||||
|                         </div> | ||||
|                         <div class="panel-body"> | ||||
|                             <div id="graph" style="height: 300px;"></div> | ||||
|                         </div> | ||||
|                         <!-- /.panel-body --> | ||||
|                     </div> | ||||
|                 </div> | ||||
|                 <!-- /.panel --> | ||||
|             </div> | ||||
|             <!-- /.panel --> | ||||
|         </div> | ||||
|     </div> | ||||
| 
 | ||||
| 
 | ||||
|     <!-- /.row --> | ||||
|     </div> | ||||
| <!-- /#page-wrapper --> | ||||
| </div> | ||||
| 
 | ||||
| 
 | ||||
| <!-- import graph function --> | ||||
| <script> | ||||
|     $(document).ready(function(){ | ||||
|         activePage = $('h1.page-header').attr('data-page'); | ||||
|         $("#"+activePage).addClass("active"); | ||||
|    }); | ||||
| </script> | ||||
| <script src="{{ url_for('static', filename='js/sentiment_plot.js') }}" | ||||
|     data-url_sentiment_analysis="{{ url_for('sentiments.sentiment_analysis_plot_tool_getdata') }}"> | ||||
| </script> | ||||
| 
 | ||||
| </body> | ||||
| </html> | ||||
|  | @ -1,251 +0,0 @@ | |||
| <!DOCTYPE html> | ||||
| <html> | ||||
| 
 | ||||
| <head> | ||||
|   <meta charset="utf-8"> | ||||
|   <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
| 
 | ||||
|   <title>Sentiment Trending - AIL</title> | ||||
|   <link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}"> | ||||
| 
 | ||||
|   <!-- Core CSS --> | ||||
|   <link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet"> | ||||
|   <link href="{{ url_for('static', filename='font-awesome/css/font-awesome.css') }}" rel="stylesheet"> | ||||
|   <script language="javascript" src="{{ url_for('static', filename='js/jquery.js')}}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/bootstrap4.min.js') }}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/FlexGauge.js') }}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/jquery.sparkline.min.js') }}"></script> | ||||
|   <script src="{{ url_for('static', filename='js/jquery.canvasjs.min.js') }}"></script> | ||||
| 
 | ||||
|   <style> | ||||
| 
 | ||||
|       .moodtable_worst { | ||||
|           background: rgba(255, 0, 0, 0.47); | ||||
|           font-size: small; | ||||
|       } | ||||
| 
 | ||||
|       .moodtable_best { | ||||
|           background: rgba(132, 255, 0, 0.5); | ||||
|           font-size: small; | ||||
|       } | ||||
| 
 | ||||
|       .jqstooltip{ | ||||
|           box-sizing: content-box; | ||||
|       } | ||||
| 
 | ||||
|       strong { | ||||
|           font-size: 16px; | ||||
|       } | ||||
| 
 | ||||
|       .table { | ||||
|           margin-bottom: 0px; | ||||
|       } | ||||
| 
 | ||||
|       .sparkLineStats ul { | ||||
|           padding-left:0; | ||||
|           list-style:none | ||||
|       } | ||||
| 
 | ||||
|       .sparkLineStats { | ||||
|           position: relative; | ||||
|           margin-bottom: -4px; | ||||
|       } | ||||
| 
 | ||||
|       .sparkLineStats ul li { | ||||
|           margin-bottom: 8px; | ||||
|           line-height: 90px; | ||||
|           font-size: 12px; | ||||
|       } | ||||
| 
 | ||||
|       .sparkLineStats ul li div { | ||||
|           float: left; | ||||
|       } | ||||
| 
 | ||||
|       .sparkLineStats ul li div:first-child { | ||||
|           margin-right: 5px; | ||||
|       } | ||||
| 
 | ||||
|       .panelInside { | ||||
|           padding: 5px; | ||||
|       } | ||||
| 
 | ||||
|       .fg-dial-label { | ||||
|           font-size: 100%; | ||||
|           font-weight: bold; | ||||
|           left: 0; | ||||
|           position: relative; | ||||
|           text-align: center; | ||||
|           top: -60px; | ||||
|           margin-bottom: -10px; | ||||
|           width: 100%; | ||||
|       } | ||||
|   </style> | ||||
| 
 | ||||
| </head> | ||||
| <body> | ||||
| 
 | ||||
|    {% include 'navbar.html' %} | ||||
| 
 | ||||
| <div id="page-wrapper"> | ||||
|   <div class="row"> | ||||
|       <div class="col-lg-12"> | ||||
|           <h1 class="page-header" data-page="page-sentiment" >Sentiment analysis: Trending</h1> | ||||
|       </div> | ||||
|       <!-- /.col-lg-12 --> | ||||
|   </div> | ||||
|     <!-- /.row --> | ||||
|     <div class="row"> | ||||
|         <button id="LoadAll" class="btn btn-info" style="margin: 5px;"><span class="glyphicon glyphicon-download"> </span> Load data from all providers </button> | ||||
| 
 | ||||
|     <!-- Pannel TODAY --> | ||||
|     <div class="row"> | ||||
|         <div class="col-lg-12"> | ||||
|             <div class="row"> | ||||
|                 <div class="col-lg-12"> | ||||
|                     <div id="panel-today" class="panel panel-default"> | ||||
|                         <div class="panel-heading"> | ||||
|                             <strong data-toggle="tooltip" data-placement="right" title="Providers displayed are in the top list in Module Statistics">Today's mood</strong> | ||||
|                         </div> | ||||
|                         <div class="panel-body"> | ||||
|                             <!-- left column --> | ||||
|                             <div class="col-lg-9" style="padding-left: 0px;"> | ||||
|                                 <!-- providers charts --> | ||||
|                                 <div class="col-lg-6"> | ||||
|                                    <div id="today_divl" class="sparkLineStats"> | ||||
| 
 | ||||
|                                    </div> | ||||
|                                 </div> | ||||
|                                 <div class="col-lg-6"> | ||||
|                                    <div id="today_divr" class="sparkLineStats"> | ||||
| 
 | ||||
|                                    </div> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                             <!-- right column --> | ||||
|                             <div class="col-lg-3"> | ||||
|                                 <div class="well text-center" style="padding: 0px;"> | ||||
|                                     <strong data-toggle="tooltip" data-placement="top" title="Percentage is computed over the last hour max value">Mood value</strong> | ||||
|                                     <div id="gauge_today_last_hour"></div> | ||||
|                                     <strong data-toggle="tooltip" data-placement="top" title="Average of the sentiments' intensity">Compound by mood</strong> | ||||
|                                     <div id="bar_today_last_hour" style="height: 70px; width: 100%;"></div> | ||||
|                                 </div> | ||||
|                                 <div class="well text-center" style="padding: 0px;"> | ||||
|                                     <strong data-toggle="tooltip" data-placement="top" title="Percentage is computed over the today max value">Mood value</strong> | ||||
|                                     <div id="gauge_today_last_days"></div> | ||||
|                                     <strong data-toggle="tooltip" data-placement="top" title="Average of the of sentiments' intensity">Compound by mood</strong> | ||||
|                                     <div id="bar_today_last_days" style="height: 70px; width: 100%;"></div> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                             <!-- /.row --> | ||||
|                         </div> | ||||
|                         <!-- /.panel-body --> | ||||
|                     </div> | ||||
|                 </div> | ||||
|                 <!-- /.panel --> | ||||
|             </div> | ||||
|             <!-- /.panel --> | ||||
|         </div> | ||||
|     </div> | ||||
| 
 | ||||
|     <!-- Pannel WEEK --> | ||||
|     <div class="row"> | ||||
|         <div class="col-lg-12"> | ||||
|             <div class="row"> | ||||
|                 <div class="col-lg-12"> | ||||
|                     <div id="panel-week" class="panel panel-default"> | ||||
|                         <div class="panel-heading"> | ||||
|                             <strong>Week's mood</strong> | ||||
|                         </div> | ||||
|                         <div class="panel-body"> | ||||
|                             <!-- left column --> | ||||
|                             <div class="col-lg-9" style="padding-left: 0px;"> | ||||
|                                 <!-- providers charts --> | ||||
|                                 <div class="col-lg-6"> | ||||
|                                    <div id="week_divl" class="sparkLineStats"> | ||||
| 
 | ||||
|                                    </div> | ||||
|                                 </div> | ||||
|                                 <div class="col-lg-6"> | ||||
|                                    <div id="week_divr" class="sparkLineStats"> | ||||
| 
 | ||||
|                                    </div> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                             <!-- right column --> | ||||
|                             <div class="col-lg-3"> | ||||
|                                 <div class="well text-center" style="padding: 0px;"> | ||||
|                                     <strong data-toggle="tooltip" data-placement="top" title="Percentage is computed over the week max value">Mood value</strong> | ||||
|                                     <div id="gauge_week"></div> | ||||
|                                 </div> | ||||
|                                 <div class="well text-center" style="padding: 0px;"> | ||||
|                                     <table class="table table-striped table-bordered table-hover" id="myTable"> | ||||
|                                         <thead> | ||||
|                                              <tr> | ||||
|                                                 <th>Worst mood</th> | ||||
|                                                 <th>Best mood</th> | ||||
|                                              </tr> | ||||
|                                         </thead> | ||||
|                                         <tbody> | ||||
|                                           <tr> | ||||
|                                               <td class="worst1 moodtable_worst">no data</td> | ||||
|                                               <td class="best1 moodtable_best">no data</td> | ||||
|                                           </tr> | ||||
|                                           <tr> | ||||
|                                               <td class="worst2 moodtable_worst">no data</td> | ||||
|                                               <td class="best2 moodtable_best">no data</td> | ||||
|                                           </tr> | ||||
|                                           <tr> | ||||
|                                               <td class="worst3 moodtable_worst">no data</td> | ||||
|                                               <td class="best3 moodtable_best">no data</td> | ||||
|                                           </tr> | ||||
|                                           <tr> | ||||
|                                               <td class="worst4 moodtable_worst">no data</td> | ||||
|                                               <td class="best4 moodtable_best">no data</td> | ||||
|                                           </tr> | ||||
|                                           <tr> | ||||
|                                               <td class="worst5 moodtable_worst">no data</td> | ||||
|                                               <td class="best5 moodtable_best">no data</td> | ||||
|                                           </tr> | ||||
|                                         </tbody> | ||||
|                                     </table> | ||||
|                                 </div> | ||||
|                             </div> | ||||
|                             <!-- /.row --> | ||||
|                         </div> | ||||
|                         <!-- /.panel-body --> | ||||
|                     </div> | ||||
|                 </div> | ||||
|                 <!-- /.panel --> | ||||
|             </div> | ||||
|             <!-- /.panel --> | ||||
|         </div> | ||||
|     </div> | ||||
| 
 | ||||
| 
 | ||||
|     <!-- /.row --> | ||||
|     </div> | ||||
| <!-- /#page-wrapper --> | ||||
| </div> | ||||
| 
 | ||||
| 
 | ||||
| <!-- import graph function --> | ||||
| <script src="{{ url_for('static', filename='js/sentiment_trending.js') }}" | ||||
|     data-url_sentiment_analysis_getplotdata="{{ url_for('sentiments.sentiment_analysis_getplotdata') }}"> | ||||
| </script> | ||||
| <script> | ||||
|     $("#LoadAll").hide(); | ||||
| 
 | ||||
|     $(document).ready(function(){ | ||||
|         activePage = $('h1.page-header').attr('data-page'); | ||||
|         $("#"+activePage).addClass("active"); | ||||
|         $('[data-toggle="tooltip"]').tooltip(); | ||||
| 
 | ||||
|         $("#LoadAll").on("click", function(){ draw_page("True"); }); | ||||
|         draw_page("False"); | ||||
|         // Reload every 30min | ||||
|         setTimeout(function(){ location.reload(); }, 30*60*1000); | ||||
|    }); | ||||
| </script> | ||||
| 
 | ||||
| </body> | ||||
| </html> | ||||
|  | @ -1,99 +0,0 @@ | |||
| #!/usr/bin/env python3 | ||||
| # -*-coding:UTF-8 -* | ||||
| 
 | ||||
| ''' | ||||
|     Flask functions and routes for the trending charts page | ||||
| ''' | ||||
| # import os | ||||
| # import sys | ||||
| # import datetime | ||||
| # import flask | ||||
| # from flask import Flask, render_template, jsonify, request, Blueprint | ||||
| # | ||||
| # from Role_Manager import login_admin, login_read_only | ||||
| # from flask_login import login_required | ||||
| # | ||||
| # sys.path.append(os.environ['AIL_BIN']) | ||||
| # ################################## | ||||
| # # Import Project packages | ||||
| # ################################## | ||||
| # from packages.Date import Date | ||||
| # | ||||
| # # ============ VARIABLES ============ | ||||
| # import Flask_config | ||||
| # | ||||
| # app = Flask_config.app | ||||
| # config_loader = Flask_config.config_loader | ||||
| # baseUrl = Flask_config.baseUrl | ||||
| # r_serv_charts = Flask_config.r_serv_charts | ||||
| # | ||||
| # trendings = Blueprint('trendings', __name__, template_folder='templates') | ||||
| # | ||||
| # # ============ FUNCTIONS ============ | ||||
| # | ||||
| # def get_date_range(num_day): | ||||
| #     curr_date = datetime.date.today() | ||||
| #     date = Date(str(curr_date.year)+str(curr_date.month).zfill(2)+str(curr_date.day).zfill(2)) | ||||
| #     date_list = [] | ||||
| # | ||||
| #     for i in range(0, num_day+1): | ||||
| #         date_list.append(date.substract_day(i)) | ||||
| # | ||||
| #     return date_list | ||||
| # | ||||
| # | ||||
| # # ============ ROUTES ============ | ||||
| # | ||||
| # @trendings.route("/_progressionCharts", methods=['GET']) | ||||
| # @login_required | ||||
| # @login_read_only | ||||
| # def progressionCharts(): | ||||
| #     attribute_name = request.args.get('attributeName') | ||||
| #     trending_name = request.args.get('trendingName') | ||||
| #     bar_requested = True if request.args.get('bar') == "true" else False | ||||
| # | ||||
| #     if (bar_requested): | ||||
| #         num_day = int(request.args.get('days')) | ||||
| #         bar_values = [] | ||||
| # | ||||
| #         date_range = get_date_range(num_day) | ||||
| #         # Retreive all data from the last num_day | ||||
| #         for date in date_range: | ||||
| # | ||||
| #             curr_value = r_serv_charts.hget(attribute_name, date) | ||||
| #             bar_values.append([date[0:4]+'/'+date[4:6]+'/'+date[6:8], int(curr_value if curr_value is not None else 0)]) | ||||
| #         bar_values.insert(0, attribute_name) | ||||
| #         return jsonify(bar_values) | ||||
| # | ||||
| #     else: | ||||
| #         redis_progression_name = "z_top_progression_" + trending_name | ||||
| #         keyw_value = r_serv_charts.zrevrangebyscore(redis_progression_name, '+inf', '-inf', withscores=True, start=0, num=10) | ||||
| # | ||||
| #         return jsonify(keyw_value) | ||||
| # | ||||
| # @trendings.route("/wordstrending/") | ||||
| # @login_required | ||||
| # @login_read_only | ||||
| # def wordstrending(): | ||||
| #     default_display = config_loader.get_config_str("Flask", "default_display") | ||||
| #     return render_template("Wordstrending.html", default_display = default_display) | ||||
| # | ||||
| # | ||||
| # @trendings.route("/protocolstrending/") | ||||
| # @login_required | ||||
| # @login_read_only | ||||
| # def protocolstrending(): | ||||
| #     default_display = config_loader.get_config_str("Flask", "default_display") | ||||
| #     return render_template("Protocolstrending.html", default_display = default_display) | ||||
| # | ||||
| # | ||||
| # @trendings.route("/trending/") | ||||
| # @login_required | ||||
| # @login_read_only | ||||
| # def trending(): | ||||
| #     default_display = config_loader.get_config_str("Flask", "default_display") | ||||
| #     return render_template("Trending.html", default_display = default_display) | ||||
| # | ||||
| # | ||||
| # # ========= REGISTRATION ========= | ||||
| # app.register_blueprint(trendings, url_prefix=baseUrl) | ||||
|  | @ -1,154 +0,0 @@ | |||
| 	<!DOCTYPE html> | ||||
| 	<html> | ||||
| 
 | ||||
| 	<head> | ||||
| 	  <meta charset="utf-8"> | ||||
| 	  <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
| 
 | ||||
|           <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" /> | ||||
|           <meta http-equiv="Pragma" content="no-cache" /> | ||||
|           <meta http-equiv="Expires" content="0" /> | ||||
| 
 | ||||
| 	  <title>Trending Charts - AIL</title> | ||||
| 		<link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}"> | ||||
| 
 | ||||
| 	  <!-- Core CSS --> | ||||
| 	  <link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet"> | ||||
| 	  <link href="{{ url_for('static', filename='font-awesome/css/font-awesome.css') }}" rel="stylesheet"> | ||||
| 	  <link href="{{ url_for('static', filename='css/dygraph_gallery.css') }}" rel="stylesheet" type="text/css" /> | ||||
| 	  <!-- JS --> | ||||
| 	  <script type="text/javascript" src="{{ url_for('static', filename='js/dygraph-combined.js') }}"></script> | ||||
| 	  <script language="javascript" src="{{ url_for('static', filename='js/jquery.js')}}"></script> | ||||
|           <script src="{{ url_for('static', filename='js/jquery.flot.js') }}"></script> | ||||
|           <script src="{{ url_for('static', filename='js/jquery.flot.pie.js') }}"></script> | ||||
|           <script src="{{ url_for('static', filename='js/jquery.flot.time.js') }}"></script> | ||||
|           <script> | ||||
|               var default_display = {{ default_display }}; | ||||
|               var current_displayed_graph; | ||||
|           </script> | ||||
| 
 | ||||
| 	</head> | ||||
| 	<body> | ||||
| 
 | ||||
|             {% include 'navbar.html' %} | ||||
| 
 | ||||
|         <div id="page-wrapper"> | ||||
|           <div class="row"> | ||||
|               <div class="col-lg-12"> | ||||
|                   <h1 class="page-header" data-page="page-trendingchart">Trending charts</h1> | ||||
|               </div> | ||||
|               <!-- /.col-lg-12 --> | ||||
|           </div> | ||||
|             <!-- /.row --> | ||||
|             <div class="row"> | ||||
| 
 | ||||
|             <!-- /.nav-tabs --> | ||||
|             <ul class="nav nav-tabs"> | ||||
|                 <li class="active"><a data-toggle="tab" href="#tld-tab"  data-attribute-name="tld" data-pannel="TldTrending" data-path="../static//csv/tldstrendingdata.csv">Top level domains</a></li> | ||||
|                 <li><a data-toggle="tab" href="#domain-tab" data-attribute-name="domain" data-pannel="DomainTrending" data-path="../static//csv/domainstrendingdata.csv">Domains</a></li> | ||||
|                 <li><a data-toggle="tab" href="#protocol-tab" data-attribute-name="scheme" data-pannel="ProtocolTrending" data-path="../static//csv/protocolstrendingdata.csv">Protocols</a></li> | ||||
|                 <li><a data-toggle="tab" href="#words-tab" data-pannel="WordTrending" data-path="../static//csv/wordstrendingdata.csv">Words</a></li> | ||||
|             </ul> | ||||
|             </br> | ||||
| 
 | ||||
| <script> | ||||
| var chart_1_num_day = 5; | ||||
| var chart_2_num_day = 15; | ||||
| </script> | ||||
| 
 | ||||
| <script type="text/javascript" src="{{ url_for('static', filename='js/trendingchart.js')}}" | ||||
| 		data-url_progressionCharts="{{ url_for('trendings.progressionCharts') }}"> | ||||
| </script> | ||||
| 
 | ||||
|             <div class="tab-content"> | ||||
|                 <div class="col-lg-12 tab-pane fade in active" id="tld-tab" > | ||||
|                      {% include 'trending_graphs/Tldstrending.html' %} | ||||
|                 </div> | ||||
|                 <div class="col-lg-12 tab-pane fade" id="domain-tab"> | ||||
|                      {% include 'trending_graphs/Domainstrending.html' %} | ||||
|                 </div> | ||||
|                 <div class="col-lg-12 tab-pane fade" id="protocol-tab"> | ||||
|                      {% include 'trending_graphs/Protocolstrending.html' %} | ||||
|                 </div> | ||||
|                 <div class="col-lg-12 tab-pane fade" id="words-tab"> | ||||
|                      {% include 'trending_graphs/Wordstrending.html' %} | ||||
|                 </div> | ||||
|             </div> <!-- tab-content --> | ||||
|             <!-- /.row --> | ||||
|         </div> | ||||
|         <!-- /#page-wrapper --> | ||||
| 
 | ||||
|         <!-- import graph function --> | ||||
|         <script src="{{ url_for('static', filename='js/plot-graph.js') }}"></script> | ||||
| 
 | ||||
|         <script type="text/javascript"> | ||||
|             var refresh_interval = 1000*60*2;   //number of miliseconds between each call | ||||
|             var launched_refresher = [];    //Avoid launching mutliple refresher | ||||
|             var active_tab_name = "tld";    //Avoid a redraw of the graph is the tab is not active | ||||
|             function refresh_top_chart(attr_name, immediate){ | ||||
|                 if (immediate){ | ||||
|                     plot_top_graph(attr_name, true); | ||||
|                     binder(active_tab_name); | ||||
|                 } | ||||
|                 setTimeout(function() { | ||||
|                     $("[flash-"+attr_name+"]").css('color', '#fece00'); | ||||
|                     setTimeout(function() { $("[flash-"+attr_name+"]").css('color', 'black'); }, 1000); | ||||
|                     refresh_top_chart(attr_name, false); | ||||
|                     if (active_tab_name == attr_name) | ||||
|                         plot_top_graph(attr_name, false); | ||||
|                 }, refresh_interval); | ||||
|             } | ||||
|         </script> | ||||
| 
 | ||||
|         <!-- instanciate and plot graphs --> | ||||
|         <script type="text/javascript"> | ||||
|             // Create, plot and set the limit of displayed headers | ||||
|             function create_and_plot(pannel, path){ | ||||
|                 //var graph_domain = new Graph($(event.target).attr('data-pannel'), $(event.target).attr('data-path')); | ||||
|                 $.get(path, function(myContentFile) { | ||||
|                     var lines = myContentFile.split("\r\n"); | ||||
|                     var header_size = lines[0].split(',').length-1; | ||||
|                     current_displayed_graph = new Graph(pannel, path, header_size); | ||||
|                     setTimeout(function() { current_displayed_graph.set_Visibility(default_display)}, 300); | ||||
|                 }, 'text'); | ||||
| 
 | ||||
|             } | ||||
| 
 | ||||
|             // When a pannel is shown, create_and_plot. | ||||
|             $('.nav-tabs a').on('shown.bs.tab', function(event){ | ||||
|                 create_and_plot($(event.target).attr('data-pannel'), $(event.target).attr('data-path')); | ||||
|                 active_tab_name = $(event.target).attr('data-attribute-name') | ||||
|                 //Top progression chart | ||||
|                 if(launched_refresher.indexOf($(event.target).attr('data-attribute-name')) == -1){ | ||||
|                     launched_refresher.push($(event.target).attr('data-attribute-name')); | ||||
|                     refresh_top_chart($(event.target).attr('data-attribute-name'), true); | ||||
|                 } | ||||
|             }); | ||||
|         </script> | ||||
| 
 | ||||
|         <script> | ||||
|             $(document).ready(function(){ | ||||
|                 activePage = $('h1.page-header').attr('data-page'); | ||||
|                 $("#"+activePage).addClass("active"); | ||||
| 
 | ||||
|                 $("[align]").css({padding: "2px", width: 'auto', 'background': "rgba(102, 102, 102, 0.15)" , 'border': "3px solid rgb(102, 102, 102)"}) | ||||
| 
 | ||||
|                 // Create the graph when the page has just loaded | ||||
|                 create_and_plot("TldTrending", '../static//csv/tldstrendingdata.csv') | ||||
|                 //Top progression chart | ||||
|                 refresh_top_chart("tld", true); | ||||
|             }); | ||||
| 
 | ||||
|             // Used when we modify the number of displayed curves | ||||
|             function take_top(new_display){ | ||||
|                 current_displayed_graph.set_Visibility_andHide(new_display, default_display); | ||||
|                 default_display = new_display; | ||||
|             } | ||||
| 
 | ||||
|         </script> | ||||
| 
 | ||||
|     </div> | ||||
|     <script src="{{ url_for('static', filename='js/bootstrap4.min.js') }}"></script> | ||||
| </body> | ||||
| 
 | ||||
| </html> | ||||
|  | @ -1,82 +0,0 @@ | |||
| <div class="row"> | ||||
|     <div class="col-lg-12"> | ||||
|         <div class="row"> | ||||
|             <div class="col-lg-6"> | ||||
|                 <div class="panel panel-default"> | ||||
|                     <div class="panel-heading"> | ||||
|                         <i id="flash-domain" class="glyphicon glyphicon-flash " flash-domain=""></i> Top Progression for the last 5 days | ||||
|                     </div> | ||||
|                     <div class="panel-body"> | ||||
|                         <div class="col-lg-12"> | ||||
|                             <div class="flot-chart-content pull-right" id='tooltip_graph1-domain' align="right">No bar hovered</div> | ||||
|                         </div> | ||||
|                         <div class="row"> | ||||
|                             <div class="flot-chart-content col-lg-3" id="flot-pie-chart1-domain" style="height:250px; width:48%;"></div> | ||||
|                             <div class="flot-chart-content col-lg-3" id="flot-bar-chart1-domain" style="height:250px; width:48%; margin: 5px;"><div class="alert alert-info">Click on a part</div></div> | ||||
|                         </div> | ||||
|                         <!-- /.row --> | ||||
|                     </div> | ||||
|                     <!-- /.panel-body --> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <!-- /.panel --> | ||||
|             <div class="col-lg-6"> | ||||
|                 <div class="panel panel-default"> | ||||
|                     <div class="panel-heading"> | ||||
|                         <i id="flash-domain" class="glyphicon glyphicon-flash " flash-domain=""></i> Top Progression for the last 15 days | ||||
|                     </div> | ||||
|                     <div class="panel-body"> | ||||
|                         <div class="col-lg-12"> | ||||
|                             <div class="flot-chart-content pull-right" id='tooltip_graph2-domain' align="right">No bar hovered</div> | ||||
|                         </div> | ||||
|                         <div class=""> | ||||
|                             <div class="flot-chart-content col-lg-3" id="flot-bar-chart2-domain" style="height:250px; width:100%; margin:5px;"><div class="alert alert-info">Click on a part</div></div> | ||||
|                         </div> | ||||
|                         <!-- /.row --> | ||||
|                     </div> | ||||
|                    <!-- /.panel-body --> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|         <!-- /.panel --> | ||||
|     </div> | ||||
| </div> | ||||
| 
 | ||||
| 
 | ||||
| <div class="panel panel-default"> | ||||
|     <div class="panel-heading"> | ||||
|         <i class="fa fa-bar-chart-o fa-fw"></i> Top Domain Trending  | ||||
|         <div class="pull-right"> | ||||
|             <div class="btn-group"> | ||||
|                 <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown"> | ||||
|                     Actions | ||||
|                     <span class="caret"></span> | ||||
|                 </button> | ||||
|                 <ul class="dropdown-menu pull-right" role="menu"> | ||||
|                     <li><a href="#" id="linear">Linear Scale</a> | ||||
|                     </li> | ||||
|                     <li><a href="#" id="log">Log Scale</a> | ||||
|                     </li> | ||||
|                     <li><a href="#" id="unzoom" onclick="unzoomGraph()">Unzoom</a> | ||||
|                     </li> | ||||
|                     <li class="divider"></li> | ||||
|                     <li><a href="#" id="edit_graph">Edit graph words</a> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="btn-group btn-group-xs pull-right" style="margin-right: 5px;"> | ||||
|             <button type="button" class="btn btn-primary" onclick="take_top(5);">5</button> | ||||
|             <button type="button" class="btn btn-primary" onclick="take_top(10);">10</button> | ||||
|             <button type="button" class="btn btn-primary" onclick="take_top(15);">15</button> | ||||
|         </div> | ||||
| 
 | ||||
|     </div> | ||||
|     <!-- /.panel-heading --> | ||||
|       <div class="panel-body"> | ||||
|          <!-- <div id="DomainTrending" style="width:100%;"></div> --> | ||||
|           <div id="DomainTrending" style="width:100%; height:800px;"></div> | ||||
|       </div> | ||||
|     <!-- /.panel-body --> | ||||
| </div> | ||||
|  | @ -1,96 +0,0 @@ | |||
| <div class="row"> | ||||
|     <div class="col-lg-12"> | ||||
|         <div class="row"> | ||||
|             <div class="col-lg-12"> | ||||
|                 <div id="panel-credential" class="panel panel-green"> | ||||
|                     <div class="panel-heading"> | ||||
|                         <i id="flash-tld" class="fa fa-unlock" flash=""></i> <strong>  Credential</strong> - most posted domain | ||||
|                         <b id="day-credential" class="pull-right">Today</b>  | ||||
|                     </div> | ||||
|                     <div class="panel-body"> | ||||
|                         <div class="col-lg-12"> | ||||
|                             <div class="flot-chart-content pull-right" id='tooltip_graph-credential' align="right">No bar hovered</div> | ||||
|                         </div> | ||||
|                         <div class="row"> | ||||
|                             <div class="flot-chart-content col-lg-6" id="flot-pie-chart-credential" style="height:250px; width:33%;"></div> | ||||
|                             <div class="flot-chart-content col-lg-6" id="flot-bar-chart-credential" style="height:250px; width:66%; margin-top: 5px;"><div class="alert alert-info">Click on a part</div></div> | ||||
|                         </div> | ||||
|                         <!-- /.row --> | ||||
|                     </div> | ||||
|                     <!-- /.panel-body --> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <!-- /.panel --> | ||||
|         </div> | ||||
|         <!-- /.panel --> | ||||
|     </div> | ||||
| </div> | ||||
| 
 | ||||
| <div class="row"> | ||||
|     <div class="col-lg-12"> | ||||
|         <div class="row"> | ||||
|             <div class="col-lg-12"> | ||||
|                 <div id="panel-mail" class="panel panel-green"> | ||||
|                     <div class="panel-heading"> | ||||
|                         <i id="flash-mail" class="fa fa-envelope" flash=""></i><strong>  Mail</strong> - most posted domain (max 1 per paste) | ||||
|                         <b id="day-mail" class="pull-right">Today</b>  | ||||
|                     </div> | ||||
|                     <div class="panel-body"> | ||||
|                         <div class="col-lg-12"> | ||||
|                             <div class="flot-chart-content pull-right" id='tooltip_graph-mail' align="right">No bar hovered</div> | ||||
|                         </div> | ||||
|                         <div class="row"> | ||||
|                             <div class="flot-chart-content col-lg-6" id="flot-pie-chart-mail" style="height:250px; width:33%;"></div> | ||||
|                             <div class="flot-chart-content col-lg-6" id="flot-bar-chart-mail" style="height:250px; width:66%; margin-top: 5px;"><div class="alert alert-info">Click on a part</div></div> | ||||
|                         </div> | ||||
|                         <!-- /.row --> | ||||
|                     </div> | ||||
|                     <!-- /.panel-body --> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <!-- /.panel --> | ||||
|         </div> | ||||
|         <!-- /.panel --> | ||||
|     </div> | ||||
| </div> | ||||
| 
 | ||||
| <div class="row"> | ||||
|     <div class="col-lg-12"> | ||||
|         <div class="row"> | ||||
|             <div class="col-lg-12"> | ||||
|                 <div class="panel panel-green"> | ||||
|                     <div class="panel-heading"> | ||||
|                         <i id="flash-size" class="glyphicon glyphicon-transfer" flash=""></i><strong>  Provider</strong>  | ||||
|                         <b class="pull-right">Today</b>  | ||||
|                     </div> | ||||
|                     <div class="panel-body"> | ||||
|                         <div class=""> | ||||
|                             <div class="col-lg-12"> | ||||
|                                 <h4 class="col-lg-3">Average paste size by provider </h4> | ||||
|                                 <div class="flot-chart-content pull-right" id='tooltip_graph-size' align="right">No bar hovered</div> | ||||
|                             </div> | ||||
|                             <div class="row"> | ||||
|                                 <div class="flot-chart-content col-lg-6" id="flot-pie-chart-size" style="height:250px; width:33%;"></div> | ||||
|                                 <div class="flot-chart-content col-lg-6" id="flot-bar-chart-size" style="height:250px; width:66%;"><div class="alert alert-info">Click on a part</div></div> | ||||
|                             </div> | ||||
| 
 | ||||
|                             <div class="col-lg-12"> | ||||
|                                 <h4 class="col-lg-3">Number of paste by provider </h4> | ||||
|                                 <div class="flot-chart-content pull-right" id='tooltip_graph-num' align="right">No bar hovered</div> | ||||
|                             </div> | ||||
|                             <div class="row"> | ||||
|                                 <div class="flot-chart-content col-lg-6" id="flot-pie-chart-num" style="height:250px; width:33%;"></div> | ||||
|                                 <div class="flot-chart-content col-lg-6" id="flot-bar-chart-num" style="height:250px; width:66%;"><div class="alert alert-info">Click on a part</div></div> | ||||
|                             </div> | ||||
| 
 | ||||
|                         </div> | ||||
|                         <!-- /.row --> | ||||
|                     </div> | ||||
|                     <!-- /.panel-body --> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <!-- /.panel --> | ||||
|         </div> | ||||
|         <!-- /.panel --> | ||||
|     </div> | ||||
| </div> | ||||
|  | @ -1,82 +0,0 @@ | |||
| <div class="row"> | ||||
|     <div class="col-lg-12"> | ||||
|         <div class="row"> | ||||
|             <div class="col-lg-6"> | ||||
|                 <div class="panel panel-default"> | ||||
|                     <div class="panel-heading"> | ||||
|                         <i id="flash-scheme" class="glyphicon glyphicon-flash " flash-scheme=""></i> Top Progression for the last 5 days | ||||
|                     </div> | ||||
|                     <div class="panel-body"> | ||||
|                         <div class="col-lg-12"> | ||||
|                             <div class="flot-chart-content pull-right" id='tooltip_graph1-scheme' align="right">No bar hovered</div> | ||||
|                         </div> | ||||
|                         <div class="row"> | ||||
|                             <div class="flot-chart-content col-lg-3" id="flot-pie-chart1-scheme" style="height:250px; width:48%;"></div> | ||||
|                             <div class="flot-chart-content col-lg-3" id="flot-bar-chart1-scheme" style="height:250px; width:48%; margin:5px;"><div class="alert alert-info">Click on a part</div></div> | ||||
|                         </div> | ||||
|                         <!-- /.row --> | ||||
|                     </div> | ||||
|                     <!-- /.panel-body --> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <!-- /.panel --> | ||||
|             <div class="col-lg-6"> | ||||
|                 <div class="panel panel-default"> | ||||
|                     <div class="panel-heading"> | ||||
|                         <i id="flash-scheme" class="glyphicon glyphicon-flash " flash-scheme=""></i> Top Progression for the last 15 days | ||||
|                     </div> | ||||
|                     <div class="panel-body"> | ||||
|                         <div class="col-lg-12"> | ||||
|                             <div class="flot-chart-content pull-right" id='tooltip_graph2-scheme' align="right">No bar hovered</div> | ||||
|                         </div> | ||||
|                         <div class=""> | ||||
|                             <div class="flot-chart-content col-lg-3" id="flot-bar-chart2-scheme" style="height:250px; width:100%; margin:5px;"><div class="alert alert-info">Click on a part</div></div> | ||||
|                         </div> | ||||
|                         <!-- /.row --> | ||||
|                     </div> | ||||
|                    <!-- /.panel-body --> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|         <!-- /.panel --> | ||||
|     </div> | ||||
| </div> | ||||
| 
 | ||||
| 
 | ||||
| <div class="panel panel-default"> | ||||
|     <div class="panel-heading"> | ||||
|         <i class="fa fa-bar-chart-o fa-fw"></i> Protocols Trend | ||||
|         <div class="pull-right"> | ||||
|             <div class="btn-group"> | ||||
|                 <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown"> | ||||
|                     Actions | ||||
|                     <span class="caret"></span> | ||||
|                 </button> | ||||
|                 <ul class="dropdown-menu pull-right" role="menu"> | ||||
|                     <li><a href="#" id="linear">Linear Scale</a> | ||||
|                     </li> | ||||
|                     <li><a href="#" id="log">Log Scale</a> | ||||
|                     </li> | ||||
|                     <li><a href="#" id="unzoom" onclick="unzoomGraph()">Unzoom</a> | ||||
|                     </li> | ||||
|                     <li class="divider"></li> | ||||
|                     <li><a href="#" id="edit_graph">Edit graph words</a> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="btn-group btn-group-xs pull-right" style="margin-right: 5px;"> | ||||
|             <button type="button" class="btn btn-primary" onclick="take_top(5);">5</button> | ||||
|             <button type="button" class="btn btn-primary" onclick="take_top(10);">10</button> | ||||
|             <button type="button" class="btn btn-primary" onclick="take_top(15);">15</button> | ||||
|         </div> | ||||
| 
 | ||||
|     </div> | ||||
|     <!-- /.panel-heading --> | ||||
|       <div class="panel-body"> | ||||
|          <!-- <div id="ProtocolsTrending" style="width:100%;"></div> --> | ||||
|           <div id="ProtocolTrending" style="width:100%; height:800px;"></div> | ||||
|       </div> | ||||
|     <!-- /.panel-body --> | ||||
| </div> | ||||
|  | @ -1,84 +0,0 @@ | |||
| <div class="row"> | ||||
|     <div class="col-lg-12"> | ||||
|         <div class="row"> | ||||
|             <div class="col-lg-6"> | ||||
|                 <div class="panel panel-default"> | ||||
|                     <div class="panel-heading"> | ||||
|                         <i id="flash-tld" class="glyphicon glyphicon-flash " flash-tld=""></i> Top Progression for the last 5 days | ||||
|                     </div> | ||||
|                     <div class="panel-body"> | ||||
|                         <div class="col-lg-12"> | ||||
|                             <div class="flot-chart-content pull-right" id='tooltip_graph1-tld' align="right">No bar hovered</div> | ||||
|                         </div> | ||||
|                         <div class="row"> | ||||
|                             <div class="flot-chart-content col-lg-3" id="flot-pie-chart1-tld" style="height:250px; width:48%;"></div> | ||||
|                             <div class="flot-chart-content col-lg-3" id="flot-bar-chart1-tld" style="height:250px; width:48%; margin-top: 5px;"><div class="alert alert-info">Click on a part</div></div> | ||||
|                         </div> | ||||
|                        <div class=""> | ||||
|                         </div> | ||||
|                         <!-- /.row --> | ||||
|                     </div> | ||||
|                     <!-- /.panel-body --> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <!-- /.panel --> | ||||
|             <div class="col-lg-6"> | ||||
|                 <div class="panel panel-default"> | ||||
|                     <div class="panel-heading"> | ||||
|                         <i class="glyphicon glyphicon-flash " flash-tld=""></i> Top Progression for the last 15 days | ||||
|                     </div> | ||||
|                     <div id="flash-tld" class="panel-body"> | ||||
|                         <div class="col-lg-12"> | ||||
|                             <div class="flot-chart-content pull-right" id='tooltip_graph2-tld' align="right">No bar hovered</div> | ||||
|                         </div> | ||||
|                         <div class=""> | ||||
|                             <div class="flot-chart-content col-lg-3" id="flot-bar-chart2-tld" style="height:250px; width:100%; margin-top: 5px;"><div class="alert alert-info">Click on a part</div></div> | ||||
|                         </div> | ||||
|                         <!-- /.row --> | ||||
|                     </div> | ||||
|                    <!-- /.panel-body --> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|         <!-- /.panel --> | ||||
|     </div> | ||||
| </div> | ||||
| 
 | ||||
| 
 | ||||
| <div class="panel panel-default"> | ||||
|     <div class="panel-heading"> | ||||
|         <i class="fa fa-bar-chart-o fa-fw"></i> Top Level Domain Trending | ||||
| 
 | ||||
|         <div class="pull-right"> | ||||
|             <div class="btn-group"> | ||||
|                 <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown"> | ||||
|                     Actions | ||||
|                     <span class="caret"></span> | ||||
|                 </button> | ||||
|                 <ul class="dropdown-menu pull-right" role="menu"> | ||||
|                     <li><a href="#" id="linear">Linear Scale</a> | ||||
|                     </li> | ||||
|                     <li><a href="#" id="log">Log Scale</a> | ||||
|                     </li> | ||||
|                     <li><a href="#" id="unzoom" onclick="unzoomGraph()">Unzoom</a> | ||||
|                     </li> | ||||
|                     <li class="divider"></li> | ||||
|                     <li><a href="#" id="edit_graph">Edit graph words</a> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|         </div>  | ||||
|        <div class="btn-group btn-group-xs pull-right" style="margin-right: 5px;"> | ||||
|             <button type="button" class="btn btn-primary" onclick="take_top(5);">5</button> | ||||
|             <button type="button" class="btn btn-primary" onclick="take_top(10);">10</button> | ||||
|             <button type="button" class="btn btn-primary" onclick="take_top(15);">15</button> | ||||
|         </div> | ||||
| 
 | ||||
|     </div> | ||||
|     <!-- /.panel-heading --> | ||||
|       <div class="panel-body"> | ||||
|          <!-- <div id="TldsTrending" style="width:100%;"></div> --> | ||||
|           <div id="TldTrending" style="width:100%; height:800px;"></div> | ||||
|       </div> | ||||
|     <!-- /.panel-body --> | ||||
| </div> | ||||
|  | @ -1,37 +0,0 @@ | |||
| <div class="panel panel-default"> | ||||
|     <div class="panel-heading"> | ||||
|         <i class="fa fa-bar-chart-o fa-fw"></i> Words Trend | ||||
|         <div class="pull-right"> | ||||
|             <div class="btn-group"> | ||||
|                 <button type="button" class="btn btn-default btn-xs dropdown-toggle" data-toggle="dropdown"> | ||||
|                     Actions | ||||
|                     <span class="caret"></span> | ||||
|                 </button> | ||||
|                 <ul class="dropdown-menu pull-right" role="menu"> | ||||
|                     <li><a href="#" id="linear">Linear Scale</a> | ||||
|                     </li> | ||||
|                     <li><a href="#" id="log">Log Scale</a> | ||||
|                     </li> | ||||
|                     <li><a href="#" id="unzoom" onclick="unzoomGraph()">Unzoom</a> | ||||
|                     </li> | ||||
|                     <li class="divider"></li> | ||||
|                     <li><a href="#" id="edit_graph">Edit graph words</a> | ||||
|                     </li> | ||||
|                 </ul> | ||||
|             </div> | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="btn-group btn-group-xs pull-right" style="margin-right: 5px;"> | ||||
|             <button type="button" class="btn btn-primary" onclick="take_top(5);">5</button> | ||||
|             <button type="button" class="btn btn-primary" onclick="take_top(10);">10</button> | ||||
|             <button type="button" class="btn btn-primary" onclick="take_top(15);">15</button> | ||||
|         </div> | ||||
| 
 | ||||
|     </div> | ||||
|     <!-- /.panel-heading --> | ||||
|       <div class="panel-body"> | ||||
|          <!-- <div id="WordTrending" style="width:100%;"></div> --> | ||||
|           <div id="WordTrending" style="width:100%; height:800px;"></div> | ||||
|       </div> | ||||
|     <!-- /.panel-body --> | ||||
| </div> | ||||
|  | @ -1,143 +0,0 @@ | |||
| #!/usr/bin/env python3 | ||||
| # -*-coding:UTF-8 -* | ||||
| 
 | ||||
| ''' | ||||
|     Flask functions and routes for the trending modules page | ||||
| ''' | ||||
| # import os | ||||
| # import sys | ||||
| # import datetime | ||||
| # import flask | ||||
| # from flask import Flask, render_template, jsonify, request, Blueprint | ||||
| # | ||||
| # from Role_Manager import login_admin, login_read_only | ||||
| # from flask_login import login_required | ||||
| # | ||||
| # sys.path.append(os.environ['AIL_BIN']) | ||||
| # ################################## | ||||
| # # Import Project packages | ||||
| # ################################## | ||||
| # from packages.Date import Date | ||||
| # | ||||
| # # ============ VARIABLES ============ | ||||
| # import Flask_config | ||||
| # | ||||
| # app = Flask_config.app | ||||
| # baseUrl = Flask_config.baseUrl | ||||
| # r_serv_charts = Flask_config.r_serv_charts | ||||
| # | ||||
| # trendingmodules = Blueprint('trendingmodules', __name__, template_folder='templates') | ||||
| # | ||||
| # # ============ FUNCTIONS ============ | ||||
| # | ||||
| # # Iterate over elements in the module provided and return the today data or the last data | ||||
| # # return format: [('passed_days', num_of_passed_days), ('elem_name1', elem_value1), ('elem_name2', elem_value2)]] | ||||
| # def get_top_relevant_data(server, module_name): | ||||
| #     days = 0 | ||||
| #     for date in get_date_range(15): | ||||
| #         redis_progression_name_set = 'top_'+ module_name +'_set_' + date | ||||
| #         member_set = server.zrevrangebyscore(redis_progression_name_set, '+inf', '-inf', withscores=True) | ||||
| # | ||||
| #         if len(member_set) == 0: #No data for this date | ||||
| #             days += 1 | ||||
| #         else: | ||||
| #             member_set.insert(0, ("passed_days", days)) | ||||
| #             return member_set | ||||
| # | ||||
| # | ||||
| # def get_date_range(num_day): | ||||
| #     curr_date = datetime.date.today() | ||||
| #     date = Date(str(curr_date.year)+str(curr_date.month).zfill(2)+str(curr_date.day).zfill(2)) | ||||
| #     date_list = [] | ||||
| # | ||||
| #     for i in range(0, num_day+1): | ||||
| #         date_list.append(date.substract_day(i)) | ||||
| #     return date_list | ||||
| # | ||||
| # # ============ ROUTES ============ | ||||
| # | ||||
| # @trendingmodules.route("/_moduleCharts", methods=['GET']) | ||||
| # @login_required | ||||
| # @login_read_only | ||||
| # def modulesCharts(): | ||||
| #     keyword_name = request.args.get('keywordName') | ||||
| #     module_name = request.args.get('moduleName') | ||||
| #     bar_requested = True if request.args.get('bar') == "true" else False | ||||
| # | ||||
| #     if (bar_requested): | ||||
| #         num_day = int(request.args.get('days')) | ||||
| #         bar_values = [] | ||||
| # | ||||
| #         date_range = get_date_range(num_day) | ||||
| #         # Retreive all data from the last num_day | ||||
| #         for date in date_range: | ||||
| #             curr_value = r_serv_charts.hget(date, module_name+'-'+keyword_name) | ||||
| #             bar_values.append([date[0:4]+'/'+date[4:6]+'/'+date[6:8], int(curr_value if curr_value is not None else 0)]) | ||||
| #         bar_values.insert(0, keyword_name) | ||||
| #         return jsonify(bar_values) | ||||
| # | ||||
| #     else: | ||||
| #         member_set = get_top_relevant_data(r_serv_charts, module_name) | ||||
| #         member_set = member_set if member_set is not None else [] | ||||
| #         if len(member_set) == 0: | ||||
| #             member_set.append(("No relevant data", int(100))) | ||||
| #         return jsonify(member_set) | ||||
| # | ||||
| # | ||||
| # @trendingmodules.route("/_providersChart", methods=['GET']) | ||||
| # @login_required | ||||
| # @login_read_only | ||||
| # def providersChart(): | ||||
| #     keyword_name = request.args.get('keywordName') | ||||
| #     module_name = request.args.get('moduleName') | ||||
| #     bar_requested = True if request.args.get('bar') == "true" else False | ||||
| # | ||||
| #     if (bar_requested): | ||||
| #         num_day = int(request.args.get('days')) | ||||
| #         bar_values = [] | ||||
| # | ||||
| #         date_range = get_date_range(num_day) | ||||
| #         # Retreive all data from the last num_day | ||||
| #         for date in date_range: | ||||
| #             curr_value_size = ( r_serv_charts.hget(keyword_name+'_'+'size', date) ) | ||||
| #             if curr_value_size is not None: | ||||
| #                 curr_value_size = curr_value_size | ||||
| # | ||||
| #             curr_value_num = r_serv_charts.hget(keyword_name+'_'+'num', date) | ||||
| # | ||||
| #             curr_value_size_avg = r_serv_charts.hget(keyword_name+'_'+'avg', date) | ||||
| #             if curr_value_size_avg is not None: | ||||
| #                 curr_value_size_avg = curr_value_size_avg | ||||
| # | ||||
| # | ||||
| #             if module_name == "size": | ||||
| #                 curr_value = float(curr_value_size_avg if curr_value_size_avg is not None else 0) | ||||
| #             else: | ||||
| #                 curr_value = float(curr_value_num if curr_value_num is not None else 0.0) | ||||
| # | ||||
| #             bar_values.append([date[0:4]+'/'+date[4:6]+'/'+date[6:8], curr_value]) | ||||
| #         bar_values.insert(0, keyword_name) | ||||
| #         return jsonify(bar_values) | ||||
| # | ||||
| #     else: | ||||
| #         #redis_provider_name_set = 'top_size_set' if module_name == "size" else 'providers_set' | ||||
| #         redis_provider_name_set = 'top_avg_size_set_' if module_name == "size" else 'providers_set_' | ||||
| #         redis_provider_name_set = redis_provider_name_set + get_date_range(0)[0] | ||||
| # | ||||
| #         member_set = r_serv_charts.zrevrangebyscore(redis_provider_name_set, '+inf', '-inf', withscores=True, start=0, num=8) | ||||
| # | ||||
| #         # Member set is a list of (value, score) pairs | ||||
| #         if len(member_set) == 0: | ||||
| #             member_set.append(("No relevant data", float(100))) | ||||
| #         return jsonify(member_set) | ||||
| # | ||||
| # | ||||
| # @trendingmodules.route("/moduletrending/") | ||||
| # @login_required | ||||
| # @login_read_only | ||||
| # def moduletrending(): | ||||
| #     return render_template("Moduletrending.html") | ||||
| # | ||||
| # | ||||
| # # ========= REGISTRATION ========= | ||||
| # app.register_blueprint(trendingmodules, url_prefix=baseUrl) | ||||
|  | @ -1,73 +0,0 @@ | |||
| 	<!DOCTYPE html> | ||||
| 	<html> | ||||
| 
 | ||||
| 	<head> | ||||
| 	  <meta charset="utf-8"> | ||||
| 	  <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
| 
 | ||||
| 	  <title>Modules Statistics - AIL</title> | ||||
| 		<link rel="icon" href="{{ url_for('static', filename='image/ail-icon.png') }}"> | ||||
| 
 | ||||
| 	  <!-- Core CSS --> | ||||
| 	  <link href="{{ url_for('static', filename='css/bootstrap.min.css') }}" rel="stylesheet"> | ||||
| 	  <link href="{{ url_for('static', filename='font-awesome/css/font-awesome.css') }}" rel="stylesheet"> | ||||
| 	  <link href="{{ url_for('static', filename='css/dygraph_gallery.css') }}" rel="stylesheet" type="text/css" /> | ||||
| 	  <!-- JS --> | ||||
| 	  <script type="text/javascript" src="{{ url_for('static', filename='js/dygraph-combined.js') }}"></script> | ||||
| 	  <script language="javascript" src="{{ url_for('static', filename='js/jquery.js')}}"></script> | ||||
|           <script src="{{ url_for('static', filename='js/jquery.flot.js') }}"></script> | ||||
|           <script src="{{ url_for('static', filename='js/jquery.flot.pie.js') }}"></script> | ||||
|           <script src="{{ url_for('static', filename='js/jquery.flot.time.js') }}"></script> | ||||
| 
 | ||||
| 	</head> | ||||
| 	<body> | ||||
| 
 | ||||
|             {% include 'navbar.html' %} | ||||
| 
 | ||||
|         <div id="page-wrapper"> | ||||
|            </br> | ||||
|            {% include 'trending_graphs/Moduletrending.html' %} | ||||
|         </div> | ||||
|         <!-- /#page-wrapper --> | ||||
| 
 | ||||
|         <script> | ||||
|             var chart_1_num_day = 5; | ||||
|             var chart_2_num_day = 15; | ||||
|         </script> | ||||
| 
 | ||||
|         <script src="{{ url_for('static', filename='js/moduleTrending.js') }}" | ||||
| 						data-url_providersChart="{{ url_for('trendingmodules.providersChart') }}" | ||||
| 						data-url_moduleCharts="{{ url_for('trendingmodules.modulesCharts') }}"> | ||||
| 				</script> | ||||
|         <script> | ||||
|             $(document).ready(function(){ | ||||
|                 activePage = "page-modulestats" | ||||
|                 $("#"+activePage).addClass("active"); | ||||
| 
 | ||||
|                 $("[align]").css({padding: "2px", width: 'auto', 'background': "rgba(102, 102, 102, 0.15)" , 'border': "3px solid rgb(102, 102, 102)"}) | ||||
| 
 | ||||
|                refreshPlot(true); | ||||
|             }); | ||||
| 
 | ||||
|             function refreshPlot(init){ | ||||
|                 refreshAnimation(); | ||||
| 
 | ||||
|                 plot_top_graph("credential", init); | ||||
|                 plot_top_graph("mail", init); | ||||
|                 plot_top_graph("size", init); | ||||
|                 plot_top_graph("num", init); | ||||
| 
 | ||||
|                 setTimeout(function(){ refreshPlot(false); }, 10000); | ||||
|             } | ||||
| 
 | ||||
|             function refreshAnimation(){ | ||||
|                 $("[flash]").css('color', '#fece00'); | ||||
|                 setTimeout(function() { $("[flash]").css('color', 'black'); }, 1000); | ||||
|             } | ||||
|         </script> | ||||
| 
 | ||||
|     </div> | ||||
|     <script src="{{ url_for('static', filename='js/bootstrap4.min.js') }}"></script> | ||||
| </body> | ||||
| 
 | ||||
| </html> | ||||
|  | @ -1,3 +0,0 @@ | |||
| {# | ||||
| <li id='page-modulestats'><a href="{{ url_for('trendingmodules.moduletrending') }}"><i class="glyphicon glyphicon-stats"></i> Modules statistics</a></li> | ||||
| #} | ||||
|  | @ -1,42 +0,0 @@ | |||
| <!DOCTYPE html> | ||||
| <html> | ||||
| 
 | ||||
| 	<head> | ||||
| 	  <meta charset="utf-8"> | ||||
| 	  <meta name="viewport" content="width=device-width, initial-scale=1.0"> | ||||
| 
 | ||||
| 	  <title>Analysis Information Leak framework Dashboard</title> | ||||
| 
 | ||||
| 	  <!-- Core CSS --> | ||||
| 	  <link href="{{ url_for('static', filename='css/bootstrap4.min.css') }}" rel="stylesheet"> | ||||
| 	  <link href="{{ url_for('static', filename='font-awesome/css/font-awesome.css') }}" rel="stylesheet"> | ||||
| 	  <!-- JS --> | ||||
|       <script src="{{ url_for('static', filename='js/bootstrap4.min.js') }}"></script> | ||||
| 	  <script language="javascript" src="{{ url_for('static', filename='js/jquery.js')}}"></script> | ||||
| 
 | ||||
| 	</head> | ||||
| 	<body> | ||||
| 
 | ||||
|             {% include 'navbar.html' %} | ||||
| 
 | ||||
|             <div id="page-wrapper"> | ||||
| 				<div class="row"> | ||||
| 				  <div class="col-lg-12"> | ||||
| 				  <h1 class="page-header" data-page="page-termsfrequency" >MODULENAME</h1> | ||||
| 				  </div> | ||||
| 				  <!-- /.col-lg-12 --> | ||||
| 				</div> | ||||
| 				<!-- /.row --> | ||||
| 
 | ||||
|             </div> | ||||
|             <!-- /#page-wrapper --> | ||||
| 
 | ||||
|             <script> | ||||
|                 $(document).ready(function(){ | ||||
|                     activePage = "page-MODULENAME" | ||||
|                     $("#"+activePage).addClass("active"); | ||||
|                 }); | ||||
|             </script> | ||||
|         </body> | ||||
| 
 | ||||
| </html> | ||||
|  | @ -1,19 +0,0 @@ | |||
| <div id="wrapper"> | ||||
|   <div class="navbar navbar-inverse navbar-static-top nav"> | ||||
|    {% include 'header.html' %} | ||||
|    <!-- /.navbar-top-links --> | ||||
|        <div class="navbar-default sidebar" role="navigation"> | ||||
|            <div class="sidebar-collapse"> | ||||
|                <ul class="nav" id="side-menu"> | ||||
|                    <li class="sidebar-search"> | ||||
|                        {% include 'searchbox.html' %} | ||||
|                    </li> | ||||
|               </ul> | ||||
|                <!-- /#side-menu --> | ||||
|            </div> | ||||
|            <!-- /.sidebar-collapse --> | ||||
|         <a  href="{{ url_for('dashboard.index') }}"><img src="{{ url_for('static', filename='image/ail-project.png') }}" style="width:200px;"/></a> | ||||
|        </div> | ||||
|        <!-- /.navbar-static-side --> | ||||
|   </div> | ||||
| </div> | ||||
|  | @ -8,7 +8,7 @@ git submodule update | |||
| wget -q http://dygraphs.com/dygraph-combined.js -O ./static/js/dygraph-combined.js | ||||
| 
 | ||||
| BOOTSTRAP_VERSION='4.2.1' | ||||
| FONT_AWESOME_VERSION='5.7.1' | ||||
| FONT_AWESOME_VERSION='6.6.0' | ||||
| 
 | ||||
| D3_JS_VERSION='5.16.0' | ||||
| wget https://d3js.org/d3.v7.min.js -O ./static/js/d3.v7.min.js | ||||
|  | @ -17,8 +17,7 @@ rm -rf temp | |||
| mkdir temp | ||||
| 
 | ||||
| wget https://github.com/twbs/bootstrap/releases/download/v${BOOTSTRAP_VERSION}/bootstrap-${BOOTSTRAP_VERSION}-dist.zip -O temp/bootstrap${BOOTSTRAP_VERSION}.zip | ||||
| wget https://github.com/FortAwesome/Font-Awesome/archive/v4.7.0.zip -O temp/FONT_AWESOME_4.7.0.zip | ||||
| wget https://github.com/FortAwesome/Font-Awesome/archive/5.7.1.zip -O temp/FONT_AWESOME_${FONT_AWESOME_VERSION}.zip | ||||
| wget https://github.com/FortAwesome/Font-Awesome/archive/${FONT_AWESOME_VERSION}.zip -O temp/FONT_AWESOME_${FONT_AWESOME_VERSION}.zip | ||||
| wget https://github.com/d3/d3/releases/download/v${D3_JS_VERSION}/d3.zip -O  temp/d3_${D3_JS_VERSION}.zip | ||||
| 
 | ||||
| # dateRangePicker | ||||
|  | @ -26,8 +25,7 @@ wget https://github.com/moment/moment/archive/2.24.0.zip -O temp/moment.zip | |||
| wget https://github.com/longbill/jquery-date-range-picker/archive/v0.20.0.zip -O temp/daterangepicker.zip | ||||
| 
 | ||||
| unzip -qq temp/bootstrap${BOOTSTRAP_VERSION}.zip -d temp/ | ||||
| unzip -qq temp/FONT_AWESOME_4.7.0.zip -d temp/ | ||||
| unzip -qq temp/FONT_AWESOME_${FONT_AWESOME_VERSION}.zip -d temp/ | ||||
| unzip temp/FONT_AWESOME_${FONT_AWESOME_VERSION}.zip -d temp/ | ||||
| unzip -qq temp/d3_${D3_JS_VERSION}.zip -d temp/ | ||||
| 
 | ||||
| unzip -qq temp/moment.zip -d temp/ | ||||
|  | @ -38,8 +36,6 @@ mv temp/bootstrap-${BOOTSTRAP_VERSION}-dist/js/bootstrap.min.js.map ./static/js/ | |||
| mv temp/bootstrap-${BOOTSTRAP_VERSION}-dist/css/bootstrap.min.css ./static/css/bootstrap4.min.css | ||||
| mv temp/bootstrap-${BOOTSTRAP_VERSION}-dist/css/bootstrap.min.css.map ./static/css/bootstrap4.min.css.map | ||||
| 
 | ||||
| mv temp/Font-Awesome-4.7.0 temp/font-awesome | ||||
| 
 | ||||
| rm -rf ./static/webfonts/ | ||||
| mv temp/Font-Awesome-${FONT_AWESOME_VERSION}/css/all.min.css ./static/css/font-awesome.min.css | ||||
| mv temp/Font-Awesome-${FONT_AWESOME_VERSION}/webfonts ./static/webfonts | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 terrtia
						terrtia