mirror of https://github.com/CIRCL/AIL-framework
chg: [crawle] migrate domains settings
parent
ac484bed71
commit
47da4aa62c
|
@ -466,24 +466,34 @@ def crawler_migration():
|
||||||
# print(domain, port, epoch)
|
# print(domain, port, epoch)
|
||||||
# #crawlers.add_last_crawled_domain(domain_type, domain, port, epoch)
|
# #crawlers.add_last_crawled_domain(domain_type, domain, port, epoch)
|
||||||
|
|
||||||
for cookiejar_uuid in get_all_cookiejar():
|
# for cookiejar_uuid in get_all_cookiejar():
|
||||||
meta = get_cookiejar_metadata(cookiejar_uuid)
|
# meta = get_cookiejar_metadata(cookiejar_uuid)
|
||||||
if meta:
|
# if meta:
|
||||||
# print(meta)
|
# # print(meta)
|
||||||
cookiejar = crawlers.Cookiejar(meta['uuid'])
|
# cookiejar = crawlers.Cookiejar(meta['uuid'])
|
||||||
if not cookiejar.exists():
|
# if not cookiejar.exists():
|
||||||
crawlers.create_cookiejar(meta['user'], description=meta['description'], level=meta['level'],
|
# crawlers.create_cookiejar(meta['user'], description=meta['description'], level=meta['level'],
|
||||||
cookiejar_uuid=meta['uuid'])
|
# cookiejar_uuid=meta['uuid'])
|
||||||
cookiejar._set_date(meta['date'])
|
# cookiejar._set_date(meta['date'])
|
||||||
|
#
|
||||||
for cookie_uuid in get_cookiejar_cookies_uuid(meta['uuid']):
|
# for cookie_uuid in get_cookiejar_cookies_uuid(meta['uuid']):
|
||||||
cookie_dict = get_cookie_dict(cookie_uuid)
|
# cookie_dict = get_cookie_dict(cookie_uuid)
|
||||||
if cookie_dict:
|
# if cookie_dict:
|
||||||
# print(cookie_dict)
|
# # print(cookie_dict)
|
||||||
crawlers.api_create_cookie(meta['user'], cookiejar_uuid, cookie_dict)
|
# crawlers.api_create_cookie(meta['user'], cookiejar_uuid, cookie_dict)
|
||||||
|
|
||||||
# TODO: auto crawler -> to Fix / change
|
# TODO: auto crawler -> to Fix / change
|
||||||
|
|
||||||
|
auto_crawler_web = r_crawler.smembers('auto_crawler_url:regular')
|
||||||
|
auto_crawler_onion = r_crawler.smembers('auto_crawler_url:onion')
|
||||||
|
if auto_crawler_onion or auto_crawler_web:
|
||||||
|
with open('old_auto_crawler_domains.txt', 'w') as f:
|
||||||
|
f.write('OLD Crawler Scheduler:\n\n')
|
||||||
|
for domain in auto_crawler_onion:
|
||||||
|
f.write(f'{domain}\n')
|
||||||
|
for domain in auto_crawler_web:
|
||||||
|
f.write(f'{domain}\n')
|
||||||
|
|
||||||
# TODO: crawlers queues
|
# TODO: crawlers queues
|
||||||
|
|
||||||
###############################
|
###############################
|
||||||
|
@ -919,11 +929,11 @@ if __name__ == '__main__':
|
||||||
# user_migration()
|
# user_migration()
|
||||||
#tags_migration()
|
#tags_migration()
|
||||||
# items_migration()
|
# items_migration()
|
||||||
# crawler_migration()
|
crawler_migration()
|
||||||
# domain_migration() # TO TEST ###########################
|
# domain_migration() # TO TEST ###########################
|
||||||
# decodeds_migration()
|
# decodeds_migration()
|
||||||
# screenshots_migration()
|
# screenshots_migration()
|
||||||
subtypes_obj_migration()
|
# subtypes_obj_migration()
|
||||||
# ail_2_ail_migration()
|
# ail_2_ail_migration()
|
||||||
# trackers_migration()
|
# trackers_migration()
|
||||||
# investigations_migration()
|
# investigations_migration()
|
||||||
|
|
|
@ -91,6 +91,12 @@ def is_valid_onion_domain(domain):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
def is_valid_domain(domain):
|
||||||
|
faup.decode(domain)
|
||||||
|
url_unpack = faup.get()
|
||||||
|
unpack_domain = url_unpack['domain'].lower()
|
||||||
|
return domain == unpack_domain
|
||||||
|
|
||||||
def get_faup():
|
def get_faup():
|
||||||
return faup
|
return faup
|
||||||
|
|
||||||
|
@ -676,6 +682,9 @@ def is_blacklisted_domain(domain):
|
||||||
def blacklist_domain(domain):
|
def blacklist_domain(domain):
|
||||||
return r_crawler.sadd('blacklist:domain', domain)
|
return r_crawler.sadd('blacklist:domain', domain)
|
||||||
|
|
||||||
|
def unblacklist_domain(domain):
|
||||||
|
return r_crawler.srem('blacklist:domain', domain)
|
||||||
|
|
||||||
def load_blacklist():
|
def load_blacklist():
|
||||||
try:
|
try:
|
||||||
with open(os.path.join(os.environ['AIL_BIN'], 'crawlers/blacklist.txt'), 'r') as f:
|
with open(os.path.join(os.environ['AIL_BIN'], 'crawlers/blacklist.txt'), 'r') as f:
|
||||||
|
@ -687,6 +696,22 @@ def load_blacklist():
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
|
|
||||||
|
def api_blacklist_domain(data):
|
||||||
|
domain = str(data.get('domain', '')).lower()
|
||||||
|
if not is_valid_domain(domain):
|
||||||
|
return {'error': 'invalid domain'}, 400
|
||||||
|
if is_blacklisted_domain(domain):
|
||||||
|
return {'error': 'domain already blacklisted'}, 400
|
||||||
|
return blacklist_domain(domain), 200
|
||||||
|
|
||||||
|
def api_unblacklist_domain(data):
|
||||||
|
domain = str(data.get('domain', '')).lower()
|
||||||
|
if not is_valid_domain(domain):
|
||||||
|
return {'error': 'invalid domain'}, 400
|
||||||
|
if not is_blacklisted_domain(domain):
|
||||||
|
return {'error': 'domain not blacklisted'}, 404
|
||||||
|
return unblacklist_domain(domain), 200
|
||||||
|
|
||||||
#### CRAWLER Scheduler ####
|
#### CRAWLER Scheduler ####
|
||||||
|
|
||||||
@unique
|
@unique
|
||||||
|
@ -1667,12 +1692,6 @@ def test_ail_crawlers():
|
||||||
|
|
||||||
# TODO CHECK MIGRATION - Rest API
|
# TODO CHECK MIGRATION - Rest API
|
||||||
|
|
||||||
# def add_auto_crawler_in_queue(domain, domain_type, port, epoch, delta, message):
|
|
||||||
# r_serv_onion.zadd('crawler_auto_queue', int(time.time() + delta) , f'{message};{domain_type}')
|
|
||||||
# # update list, last auto crawled domains
|
|
||||||
# r_serv_onion.lpush('last_auto_crawled', f'{domain}:{port};{epoch}')
|
|
||||||
# r_serv_onion.ltrim('last_auto_crawled', 0, 9)
|
|
||||||
|
|
||||||
# TODO MIGRATE ME
|
# TODO MIGRATE ME
|
||||||
# def api_create_crawler_task(user_id, url, screenshot=True, har=True, depth_limit=1, max_pages=100, auto_crawler=False, crawler_delta=3600, crawler_type=None, cookiejar_uuid=None, user_agent=None):
|
# def api_create_crawler_task(user_id, url, screenshot=True, har=True, depth_limit=1, max_pages=100, auto_crawler=False, crawler_delta=3600, crawler_type=None, cookiejar_uuid=None, user_agent=None):
|
||||||
# # validate url
|
# # validate url
|
||||||
|
|
|
@ -190,6 +190,39 @@ def schedule_delete():
|
||||||
return create_json_response(res[0], res[1])
|
return create_json_response(res[0], res[1])
|
||||||
return redirect(url_for('crawler_splash.scheduler_dashboard'))
|
return redirect(url_for('crawler_splash.scheduler_dashboard'))
|
||||||
|
|
||||||
|
@crawler_splash.route("/crawlers/blacklist", methods=['GET'])
|
||||||
|
@login_required
|
||||||
|
@login_analyst
|
||||||
|
def crawler_blacklist():
|
||||||
|
domain = request.args.get('domain')
|
||||||
|
if domain:
|
||||||
|
res = crawlers.api_blacklist_domain({'domain': domain})
|
||||||
|
if res[1] != 200:
|
||||||
|
if res[0].get('error') == 'domain already blacklisted':
|
||||||
|
error_code = 2
|
||||||
|
else:
|
||||||
|
error_code = 1
|
||||||
|
else:
|
||||||
|
error_code = 0
|
||||||
|
domain = None
|
||||||
|
else:
|
||||||
|
domain = None
|
||||||
|
error_code = None
|
||||||
|
blacklist = crawlers.get_blacklist()
|
||||||
|
return render_template("crawler_blacklist.html", blacklist=blacklist,
|
||||||
|
domain=domain, error_code=error_code,
|
||||||
|
is_manager_connected=crawlers.get_lacus_connection_metadata())
|
||||||
|
|
||||||
|
@crawler_splash.route("/crawlers/blacklist/delete", methods=['GET'])
|
||||||
|
@login_required
|
||||||
|
@login_analyst
|
||||||
|
def crawler_blacklist_delete():
|
||||||
|
domain = request.args.get('domain')
|
||||||
|
res = crawlers.api_unblacklist_domain({'domain': domain})
|
||||||
|
if res[1] != 200:
|
||||||
|
return create_json_response(res[0], res[1])
|
||||||
|
return redirect(url_for('crawler_splash.crawler_blacklist'))
|
||||||
|
|
||||||
|
|
||||||
@crawler_splash.route("/crawlers/last/domains", methods=['GET'])
|
@crawler_splash.route("/crawlers/last/domains", methods=['GET'])
|
||||||
@login_required
|
@login_required
|
||||||
|
|
|
@ -30,9 +30,6 @@ r_cache = config_loader.get_redis_conn("Redis_Cache")
|
||||||
r_serv_log = config_loader.get_redis_conn("Redis_Log")
|
r_serv_log = config_loader.get_redis_conn("Redis_Log")
|
||||||
r_serv_log_submit = config_loader.get_redis_conn("Redis_Log_submit")
|
r_serv_log_submit = config_loader.get_redis_conn("Redis_Log_submit")
|
||||||
|
|
||||||
r_serv_charts = config_loader.get_redis_conn("ARDB_Trending") # -> TODO MIGRATE Stats Graphs
|
|
||||||
r_serv_onion = config_loader.get_redis_conn("ARDB_Onion") # -> TODO MIGRATE AUTO CRAWLER
|
|
||||||
|
|
||||||
# # # # # # #
|
# # # # # # #
|
||||||
r_serv_db = config_loader.get_db_conn("Kvrocks_DB") # TODO remove redis call from blueprint
|
r_serv_db = config_loader.get_db_conn("Kvrocks_DB") # TODO remove redis call from blueprint
|
||||||
r_serv_tags = config_loader.get_db_conn("Kvrocks_Tags") # TODO remove redis call from blueprint
|
r_serv_tags = config_loader.get_db_conn("Kvrocks_Tags") # TODO remove redis call from blueprint
|
||||||
|
|
|
@ -1,292 +0,0 @@
|
||||||
#!/usr/bin/env python3
|
|
||||||
# -*-coding:UTF-8 -*
|
|
||||||
|
|
||||||
'''
|
|
||||||
Flask functions and routes for the trending modules page
|
|
||||||
'''
|
|
||||||
import datetime
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
import time
|
|
||||||
from pyfaup.faup import Faup
|
|
||||||
from flask import Flask, render_template, jsonify, request, send_file, Blueprint, redirect, url_for
|
|
||||||
|
|
||||||
from Role_Manager import login_admin, login_analyst, login_read_only, no_cache
|
|
||||||
from flask_login import login_required
|
|
||||||
|
|
||||||
sys.path.append(os.environ['AIL_BIN'])
|
|
||||||
##################################
|
|
||||||
# Import Project packages
|
|
||||||
##################################
|
|
||||||
from lib import crawlers
|
|
||||||
|
|
||||||
# ============ VARIABLES ============
|
|
||||||
import Flask_config
|
|
||||||
|
|
||||||
app = Flask_config.app
|
|
||||||
baseUrl = Flask_config.baseUrl
|
|
||||||
r_cache = Flask_config.r_cache
|
|
||||||
r_serv_onion = Flask_config.r_serv_onion
|
|
||||||
bootstrap_label = Flask_config.bootstrap_label
|
|
||||||
|
|
||||||
hiddenServices = Blueprint('hiddenServices', __name__, template_folder='templates')
|
|
||||||
|
|
||||||
faup = Faup()
|
|
||||||
list_types=['onion', 'regular']
|
|
||||||
dic_type_name={'onion':'Onion', 'regular':'Website'}
|
|
||||||
|
|
||||||
# ============ FUNCTIONS ============
|
|
||||||
|
|
||||||
|
|
||||||
def is_valid_domain(domain):
|
|
||||||
faup.decode(domain)
|
|
||||||
domain_unpack = faup.get()
|
|
||||||
if domain_unpack['tld'] is not None and domain_unpack['scheme'] is None and domain_unpack['port'] is None and domain_unpack['query_string'] is None:
|
|
||||||
return True
|
|
||||||
else:
|
|
||||||
return False
|
|
||||||
|
|
||||||
def get_type_domain(domain):
|
|
||||||
if domain is None:
|
|
||||||
type = 'regular'
|
|
||||||
else:
|
|
||||||
if domain.rsplit('.', 1)[1] == 'onion':
|
|
||||||
type = 'onion'
|
|
||||||
else:
|
|
||||||
type = 'regular'
|
|
||||||
return type
|
|
||||||
|
|
||||||
def get_domain_from_url(url):
|
|
||||||
faup.decode(url)
|
|
||||||
unpack_url = faup.get()
|
|
||||||
domain = unpack_url['domain']
|
|
||||||
## TODO: FIXME remove me
|
|
||||||
try:
|
|
||||||
domain = domain.decode()
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
return domain
|
|
||||||
|
|
||||||
def get_last_domains_crawled(type): # DONE
|
|
||||||
return r_serv_onion.lrange('last_{}'.format(type), 0 ,-1)
|
|
||||||
|
|
||||||
|
|
||||||
def get_last_crawled_domains_metadata(list_domains_crawled, date, type=None, auto_mode=False):
|
|
||||||
list_crawled_metadata = []
|
|
||||||
for domain_epoch in list_domains_crawled:
|
|
||||||
if not auto_mode:
|
|
||||||
domain, epoch = domain_epoch.rsplit(';', 1)
|
|
||||||
else:
|
|
||||||
url = domain_epoch
|
|
||||||
domain = domain_epoch
|
|
||||||
domain = domain.split(':')
|
|
||||||
if len(domain) == 1:
|
|
||||||
port = 80
|
|
||||||
domain = domain[0]
|
|
||||||
else:
|
|
||||||
port = domain[1]
|
|
||||||
domain = domain[0]
|
|
||||||
metadata_domain = {}
|
|
||||||
# get Domain type
|
|
||||||
if type is None:
|
|
||||||
type_domain = get_type_domain(domain)
|
|
||||||
else:
|
|
||||||
type_domain = type
|
|
||||||
if auto_mode:
|
|
||||||
metadata_domain['url'] = url
|
|
||||||
epoch = r_serv_onion.zscore('crawler_auto_queue', '{};auto;{}'.format(domain, type_domain))
|
|
||||||
#domain in priority queue
|
|
||||||
if epoch is None:
|
|
||||||
epoch = 'In Queue'
|
|
||||||
else:
|
|
||||||
epoch = datetime.datetime.fromtimestamp(float(epoch)).strftime('%Y-%m-%d %H:%M:%S')
|
|
||||||
|
|
||||||
metadata_domain['domain'] = domain
|
|
||||||
if len(domain) > 45:
|
|
||||||
domain_name, tld_domain = domain.rsplit('.', 1)
|
|
||||||
metadata_domain['domain_name'] = '{}[...].{}'.format(domain_name[:40], tld_domain)
|
|
||||||
else:
|
|
||||||
metadata_domain['domain_name'] = domain
|
|
||||||
metadata_domain['port'] = port
|
|
||||||
metadata_domain['epoch'] = epoch
|
|
||||||
metadata_domain['last_check'] = r_serv_onion.hget('{}_metadata:{}'.format(type_domain, domain), 'last_check')
|
|
||||||
if metadata_domain['last_check'] is None:
|
|
||||||
metadata_domain['last_check'] = '********'
|
|
||||||
metadata_domain['first_seen'] = r_serv_onion.hget('{}_metadata:{}'.format(type_domain, domain), 'first_seen')
|
|
||||||
if metadata_domain['first_seen'] is None:
|
|
||||||
metadata_domain['first_seen'] = '********'
|
|
||||||
if r_serv_onion.sismember('{}_up:{}'.format(type_domain, metadata_domain['last_check']) , domain):
|
|
||||||
metadata_domain['status_text'] = 'UP'
|
|
||||||
metadata_domain['status_color'] = 'Green'
|
|
||||||
metadata_domain['status_icon'] = 'fa-check-circle'
|
|
||||||
else:
|
|
||||||
metadata_domain['status_text'] = 'DOWN'
|
|
||||||
metadata_domain['status_color'] = 'Red'
|
|
||||||
metadata_domain['status_icon'] = 'fa-times-circle'
|
|
||||||
list_crawled_metadata.append(metadata_domain)
|
|
||||||
return list_crawled_metadata
|
|
||||||
|
|
||||||
def delete_auto_crawler(url):
|
|
||||||
domain = get_domain_from_url(url)
|
|
||||||
type = get_type_domain(domain)
|
|
||||||
# remove from set
|
|
||||||
r_serv_onion.srem('auto_crawler_url:{}'.format(type), url)
|
|
||||||
# remove config
|
|
||||||
r_serv_onion.delete('crawler_config:auto:{}:{}:{}'.format(type, domain, url))
|
|
||||||
# remove from queue
|
|
||||||
r_serv_onion.srem('{}_crawler_priority_queue'.format(type), '{};auto'.format(url))
|
|
||||||
# remove from crawler_auto_queue
|
|
||||||
r_serv_onion.zrem('crawler_auto_queue'.format(type), '{};auto;{}'.format(url, type))
|
|
||||||
|
|
||||||
# ============= ROUTES ==============
|
|
||||||
|
|
||||||
@hiddenServices.route("/crawlers/blacklisted_domains", methods=['GET'])
|
|
||||||
@login_required
|
|
||||||
@login_read_only
|
|
||||||
def blacklisted_domains():
|
|
||||||
blacklist_domain = request.args.get('blacklist_domain')
|
|
||||||
unblacklist_domain = request.args.get('unblacklist_domain')
|
|
||||||
type = request.args.get('type')
|
|
||||||
if type in list_types:
|
|
||||||
type_name = dic_type_name[type]
|
|
||||||
if blacklist_domain is not None:
|
|
||||||
blacklist_domain = int(blacklist_domain)
|
|
||||||
if unblacklist_domain is not None:
|
|
||||||
unblacklist_domain = int(unblacklist_domain)
|
|
||||||
try:
|
|
||||||
page = int(request.args.get('page'))
|
|
||||||
except:
|
|
||||||
page = 1
|
|
||||||
if page <= 0:
|
|
||||||
page = 1
|
|
||||||
nb_page_max = r_serv_onion.scard('blacklist_{}'.format(type))/(1000)
|
|
||||||
if isinstance(nb_page_max, float):
|
|
||||||
nb_page_max = int(nb_page_max)+1
|
|
||||||
if page > nb_page_max:
|
|
||||||
page = nb_page_max
|
|
||||||
start = 1000*(page -1)
|
|
||||||
stop = 1000*page
|
|
||||||
|
|
||||||
list_blacklisted = list(r_serv_onion.smembers('blacklist_{}'.format(type)))
|
|
||||||
list_blacklisted_1 = list_blacklisted[start:stop]
|
|
||||||
list_blacklisted_2 = list_blacklisted[stop:stop+1000]
|
|
||||||
return render_template("blacklisted_domains.html", list_blacklisted_1=list_blacklisted_1, list_blacklisted_2=list_blacklisted_2,
|
|
||||||
type=type, type_name=type_name, page=page, nb_page_max=nb_page_max,
|
|
||||||
blacklist_domain=blacklist_domain, unblacklist_domain=unblacklist_domain)
|
|
||||||
else:
|
|
||||||
return 'Incorrect Type'
|
|
||||||
|
|
||||||
@hiddenServices.route("/crawler/blacklist_domain", methods=['GET'])
|
|
||||||
@login_required
|
|
||||||
@login_analyst
|
|
||||||
def blacklist_domain():
|
|
||||||
domain = request.args.get('domain')
|
|
||||||
type = request.args.get('type')
|
|
||||||
try:
|
|
||||||
page = int(request.args.get('page'))
|
|
||||||
except:
|
|
||||||
page = 1
|
|
||||||
if type in list_types:
|
|
||||||
if is_valid_domain(domain):
|
|
||||||
res = r_serv_onion.sadd('blacklist_{}'.format(type), domain)
|
|
||||||
if page:
|
|
||||||
if res == 0:
|
|
||||||
return redirect(url_for('hiddenServices.blacklisted_domains', page=page, type=type, blacklist_domain=2))
|
|
||||||
else:
|
|
||||||
return redirect(url_for('hiddenServices.blacklisted_domains', page=page, type=type, blacklist_domain=1))
|
|
||||||
else:
|
|
||||||
return redirect(url_for('hiddenServices.blacklisted_domains', page=page, type=type, blacklist_domain=0))
|
|
||||||
else:
|
|
||||||
return 'Incorrect type'
|
|
||||||
|
|
||||||
@hiddenServices.route("/crawler/unblacklist_domain", methods=['GET'])
|
|
||||||
@login_required
|
|
||||||
@login_analyst
|
|
||||||
def unblacklist_domain():
|
|
||||||
domain = request.args.get('domain')
|
|
||||||
type = request.args.get('type')
|
|
||||||
try:
|
|
||||||
page = int(request.args.get('page'))
|
|
||||||
except:
|
|
||||||
page = 1
|
|
||||||
if type in list_types:
|
|
||||||
if is_valid_domain(domain):
|
|
||||||
res = r_serv_onion.srem('blacklist_{}'.format(type), domain)
|
|
||||||
if page:
|
|
||||||
if res == 0:
|
|
||||||
return redirect(url_for('hiddenServices.blacklisted_domains', page=page, type=type, unblacklist_domain=2))
|
|
||||||
else:
|
|
||||||
return redirect(url_for('hiddenServices.blacklisted_domains', page=page, type=type, unblacklist_domain=1))
|
|
||||||
else:
|
|
||||||
return redirect(url_for('hiddenServices.blacklisted_domains', page=page, type=type, unblacklist_domain=0))
|
|
||||||
else:
|
|
||||||
return 'Incorrect type'
|
|
||||||
|
|
||||||
@hiddenServices.route("/crawlers/auto_crawler", methods=['GET'])
|
|
||||||
@login_required
|
|
||||||
@login_read_only
|
|
||||||
def auto_crawler():
|
|
||||||
nb_element_to_display = 100
|
|
||||||
try:
|
|
||||||
page = int(request.args.get('page'))
|
|
||||||
except:
|
|
||||||
page = 1
|
|
||||||
if page <= 0:
|
|
||||||
page = 1
|
|
||||||
|
|
||||||
nb_auto_onion = r_serv_onion.scard('auto_crawler_url:onion')
|
|
||||||
nb_auto_regular = r_serv_onion.scard('auto_crawler_url:regular')
|
|
||||||
|
|
||||||
if nb_auto_onion > nb_auto_regular:
|
|
||||||
nb_max = nb_auto_onion
|
|
||||||
else:
|
|
||||||
nb_max = nb_auto_regular
|
|
||||||
|
|
||||||
nb_page_max = nb_max/(nb_element_to_display)
|
|
||||||
if isinstance(nb_page_max, float):
|
|
||||||
nb_page_max = int(nb_page_max)+1
|
|
||||||
if page > nb_page_max:
|
|
||||||
page = nb_page_max
|
|
||||||
start = nb_element_to_display*(page -1)
|
|
||||||
stop = nb_element_to_display*page
|
|
||||||
|
|
||||||
last_auto_crawled = get_last_domains_crawled('auto_crawled')
|
|
||||||
last_domains = get_last_crawled_domains_metadata(last_auto_crawled, '')
|
|
||||||
|
|
||||||
if start > nb_auto_onion:
|
|
||||||
auto_crawler_domain_onions = []
|
|
||||||
elif stop > nb_auto_onion:
|
|
||||||
auto_crawler_domain_onions = list(r_serv_onion.smembers('auto_crawler_url:onion'))[start:nb_auto_onion]
|
|
||||||
else:
|
|
||||||
auto_crawler_domain_onions = list(r_serv_onion.smembers('auto_crawler_url:onion'))[start:stop]
|
|
||||||
|
|
||||||
if start > nb_auto_regular:
|
|
||||||
auto_crawler_domain_regular = []
|
|
||||||
elif stop > nb_auto_regular:
|
|
||||||
auto_crawler_domain_regular = list(r_serv_onion.smembers('auto_crawler_url:regular'))[start:nb_auto_regular]
|
|
||||||
else:
|
|
||||||
auto_crawler_domain_regular = list(r_serv_onion.smembers('auto_crawler_url:regular'))[start:stop]
|
|
||||||
|
|
||||||
auto_crawler_domain_onions_metadata = get_last_crawled_domains_metadata(auto_crawler_domain_onions, '', type='onion', auto_mode=True)
|
|
||||||
auto_crawler_domain_regular_metadata = get_last_crawled_domains_metadata(auto_crawler_domain_regular, '', type='regular', auto_mode=True)
|
|
||||||
|
|
||||||
return render_template("Crawler_auto.html", page=page, nb_page_max=nb_page_max,
|
|
||||||
last_domains=last_domains,
|
|
||||||
is_manager_connected=crawlers.get_lacus_connection_metadata(),
|
|
||||||
auto_crawler_domain_onions_metadata=auto_crawler_domain_onions_metadata,
|
|
||||||
auto_crawler_domain_regular_metadata=auto_crawler_domain_regular_metadata)
|
|
||||||
|
|
||||||
@hiddenServices.route("/crawlers/remove_auto_crawler", methods=['GET'])
|
|
||||||
@login_required
|
|
||||||
@login_analyst
|
|
||||||
def remove_auto_crawler():
|
|
||||||
url = request.args.get('url')
|
|
||||||
page = request.args.get('page')
|
|
||||||
|
|
||||||
if url:
|
|
||||||
delete_auto_crawler(url)
|
|
||||||
return redirect(url_for('hiddenServices.auto_crawler', page=page))
|
|
||||||
|
|
||||||
|
|
||||||
# ========= REGISTRATION =========
|
|
||||||
app.register_blueprint(hiddenServices, url_prefix=baseUrl)
|
|
|
@ -1,327 +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">
|
|
||||||
<link href="{{ url_for('static', filename='css/daterangepicker.min.css') }}" rel="stylesheet">
|
|
||||||
|
|
||||||
<!-- JS -->
|
|
||||||
<script src="{{ url_for('static', filename='js/jquery.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/popper.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/bootstrap4.min.js')}}"></script>
|
|
||||||
<script language="javascript" src="{{ url_for('static', filename='js/moment.min.js') }}"></script>
|
|
||||||
<script language="javascript" src="{{ url_for('static', filename='js/jquery.daterangepicker.min.js') }}"></script>
|
|
||||||
<script language="javascript" src="{{ url_for('static', filename='js/d3.min.js') }}"></script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.bar {
|
|
||||||
fill: steelblue;
|
|
||||||
}
|
|
||||||
.bar:hover{
|
|
||||||
fill: brown;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.bar_stack:hover{
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.popover{
|
|
||||||
max-width: 100%;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
</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">
|
|
||||||
|
|
||||||
{% include 'crawler/crawler_disabled.html' %}
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12 col-xl-6">
|
|
||||||
|
|
||||||
<div class="table-responsive mt-1 table-hover table-borderless table-striped">
|
|
||||||
<table class="table">
|
|
||||||
<thead class="thead-dark">
|
|
||||||
<tr>
|
|
||||||
<th>Domain</th>
|
|
||||||
<th>First Seen</th>
|
|
||||||
<th>Last Check</th>
|
|
||||||
<th>Status</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="tbody_last_crawled">
|
|
||||||
{% for metadata_domain in last_domains %}
|
|
||||||
<tr data-toggle="popover" data-trigger="hover"
|
|
||||||
title="<span class='badge badge-dark'>{{metadata_domain['domain']}}</span>"
|
|
||||||
data-content="port: <span class='badge badge-secondary'>{{metadata_domain['port']}}</span><br>
|
|
||||||
epoch: {{metadata_domain['epoch']}}">
|
|
||||||
<td><a target="_blank" href="{{ url_for('crawler_splash.showDomain') }}?domain={{ metadata_domain['domain'] }}&port={{metadata_domain['port']}}&epoch={{metadata_domain['epoch']}}">{{ metadata_domain['domain_name'] }}</a></td>
|
|
||||||
<td>{{'{}/{}/{}'.format(metadata_domain['first_seen'][0:4], metadata_domain['first_seen'][4:6], metadata_domain['first_seen'][6:8])}}</td>
|
|
||||||
<td>{{'{}/{}/{}'.format(metadata_domain['last_check'][0:4], metadata_domain['last_check'][4:6], metadata_domain['last_check'][6:8])}}</td>
|
|
||||||
<td><div style="color:{{metadata_domain['status_color']}}; display:inline-block">
|
|
||||||
<i class="fas {{metadata_domain['status_icon']}} "></i>
|
|
||||||
{{metadata_domain['status_text']}}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<a href="{{ url_for('hiddenServices.blacklisted_domains') }}?type={{type}}">
|
|
||||||
<button type="button" class="btn btn-outline-danger">Show Blacklisted {{type_name}}s</button>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-xl-6">
|
|
||||||
{% include 'crawler/show_domains_by_daterange.html' %}
|
|
||||||
|
|
||||||
<div id="barchart_type">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var chart = {};
|
|
||||||
$(document).ready(function(){
|
|
||||||
$("#page-Crawler").addClass("active");
|
|
||||||
$("#nav_{{type}}_crawler").addClass("active");
|
|
||||||
|
|
||||||
$('#date-range-from').dateRangePicker({
|
|
||||||
separator : ' to ',
|
|
||||||
getValue: function(){
|
|
||||||
if ($('#date-range-from-input').val() && $('#date-range-to-input').val() )
|
|
||||||
return $('#date-range-from-input').val() + ' to ' + $('#date-range-to-input').val();
|
|
||||||
else
|
|
||||||
return '';
|
|
||||||
},
|
|
||||||
setValue: function(s,s1,s2){
|
|
||||||
$('#date-range-from-input').val(s1);
|
|
||||||
$('#date-range-to-input').val(s2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$('#date-range-to').dateRangePicker({
|
|
||||||
separator : ' to ',
|
|
||||||
getValue: function(){
|
|
||||||
if ($('#date-range-from-input').val() && $('#date-range-to-input').val() )
|
|
||||||
return $('#date-range-from-input').val() + ' to ' + $('#date-range-to-input').val();
|
|
||||||
else
|
|
||||||
return '';
|
|
||||||
},
|
|
||||||
setValue: function(s,s1,s2){
|
|
||||||
$('#date-range-from-input').val(s1);
|
|
||||||
$('#date-range-to-input').val(s2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
chart.stackBarChart =barchart_type_stack("{{ url_for('hiddenServices.domain_crawled_by_type_json') }}?type={{type}}", 'id');
|
|
||||||
|
|
||||||
chart.onResize();
|
|
||||||
$(window).on("resize", function() {
|
|
||||||
chart.onResize();
|
|
||||||
});
|
|
||||||
|
|
||||||
$('[data-toggle="popover"]').popover({
|
|
||||||
placement: 'top',
|
|
||||||
container: 'body',
|
|
||||||
html : true,
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
function toggle_sidebar(){
|
|
||||||
if($('#nav_menu').is(':visible')){
|
|
||||||
$('#nav_menu').hide();
|
|
||||||
$('#side_menu').removeClass('border-right')
|
|
||||||
$('#side_menu').removeClass('col-lg-2')
|
|
||||||
$('#core_content').removeClass('col-lg-10')
|
|
||||||
}else{
|
|
||||||
$('#nav_menu').show();
|
|
||||||
$('#side_menu').addClass('border-right')
|
|
||||||
$('#side_menu').addClass('col-lg-2')
|
|
||||||
$('#core_content').addClass('col-lg-10')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var margin = {top: 20, right: 90, bottom: 55, left: 0},
|
|
||||||
width = parseInt(d3.select('#barchart_type').style('width'), 10);
|
|
||||||
width = 1000 - margin.left - margin.right,
|
|
||||||
height = 500 - margin.top - margin.bottom;
|
|
||||||
var x = d3.scaleBand().rangeRound([0, width]).padding(0.1);
|
|
||||||
|
|
||||||
var y = d3.scaleLinear().rangeRound([height, 0]);
|
|
||||||
|
|
||||||
var xAxis = d3.axisBottom(x);
|
|
||||||
|
|
||||||
var yAxis = d3.axisLeft(y);
|
|
||||||
|
|
||||||
var color = d3.scaleOrdinal(d3.schemeSet3);
|
|
||||||
|
|
||||||
var svg = d3.select("#barchart_type").append("svg")
|
|
||||||
.attr("id", "thesvg")
|
|
||||||
.attr("viewBox", "0 0 "+width+" 500")
|
|
||||||
.attr("width", width + margin.left + margin.right)
|
|
||||||
.attr("height", height + margin.top + margin.bottom)
|
|
||||||
.append("g")
|
|
||||||
.attr("transform", "translate(" + margin.left + "," + margin.top + ")");
|
|
||||||
|
|
||||||
|
|
||||||
function barchart_type_stack(url, id) {
|
|
||||||
|
|
||||||
d3.json(url)
|
|
||||||
.then(function(data){
|
|
||||||
|
|
||||||
var labelVar = 'date'; //A
|
|
||||||
var varNames = d3.keys(data[0])
|
|
||||||
.filter(function (key) { return key !== labelVar;}); //B
|
|
||||||
|
|
||||||
data.forEach(function (d) { //D
|
|
||||||
var y0 = 0;
|
|
||||||
d.mapping = varNames.map(function (name) {
|
|
||||||
return {
|
|
||||||
name: name,
|
|
||||||
label: d[labelVar],
|
|
||||||
y0: y0,
|
|
||||||
y1: y0 += +d[name]
|
|
||||||
};
|
|
||||||
});
|
|
||||||
d.total = d.mapping[d.mapping.length - 1].y1;
|
|
||||||
});
|
|
||||||
|
|
||||||
x.domain(data.map(function (d) { return (d.date); })); //E
|
|
||||||
y.domain([0, d3.max(data, function (d) { return d.total; })]);
|
|
||||||
|
|
||||||
svg.append("g")
|
|
||||||
.attr("class", "x axis")
|
|
||||||
.attr("transform", "translate(0," + height + ")")
|
|
||||||
.call(xAxis)
|
|
||||||
.selectAll("text")
|
|
||||||
.attr("class", "bar")
|
|
||||||
.on("click", function (d) { window.location.href = "#" })
|
|
||||||
.attr("transform", "rotate(-18)" )
|
|
||||||
//.attr("transform", "rotate(-40)" )
|
|
||||||
.style("text-anchor", "end");
|
|
||||||
|
|
||||||
svg.append("g")
|
|
||||||
.attr("class", "y axis")
|
|
||||||
.call(yAxis)
|
|
||||||
.append("text")
|
|
||||||
.attr("transform", "rotate(-90)")
|
|
||||||
.attr("y", 6)
|
|
||||||
.attr("dy", ".71em")
|
|
||||||
.style("text-anchor", "end");
|
|
||||||
|
|
||||||
var selection = svg.selectAll(".series")
|
|
||||||
.data(data)
|
|
||||||
.enter().append("g")
|
|
||||||
.attr("class", "series")
|
|
||||||
.attr("transform", function (d) { return "translate(" + x((d.date)) + ",0)"; });
|
|
||||||
|
|
||||||
selection.selectAll("rect")
|
|
||||||
.data(function (d) { return d.mapping; })
|
|
||||||
.enter().append("rect")
|
|
||||||
.attr("class", "bar_stack")
|
|
||||||
.attr("width", x.bandwidth())
|
|
||||||
.attr("y", function (d) { return y(d.y1); })
|
|
||||||
.attr("height", function (d) { return y(d.y0) - y(d.y1); })
|
|
||||||
.style("fill", function (d) { return color(d.name); })
|
|
||||||
.style("stroke", "grey")
|
|
||||||
.on("mouseover", function (d) { showPopover.call(this, d); })
|
|
||||||
.on("mouseout", function (d) { removePopovers(); })
|
|
||||||
.on("click", function(d){ window.location.href = "#" });
|
|
||||||
|
|
||||||
|
|
||||||
data.forEach(function(d) {
|
|
||||||
if(d.total != 0){
|
|
||||||
svg.append("text")
|
|
||||||
.attr("class", "bar")
|
|
||||||
.attr("dy", "-.35em")
|
|
||||||
.attr('x', x(d.date) + x.bandwidth()/2)
|
|
||||||
.attr('y', y(d.total))
|
|
||||||
.on("click", function () {window.location.href = "#" })
|
|
||||||
.style("text-anchor", "middle")
|
|
||||||
.text(d.total);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
drawLegend(varNames);
|
|
||||||
});
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function drawLegend (varNames) {
|
|
||||||
var legend = svg.selectAll(".legend")
|
|
||||||
.data(varNames.slice().reverse())
|
|
||||||
.enter().append("g")
|
|
||||||
.attr("class", "legend")
|
|
||||||
.attr("transform", function (d, i) { return "translate(0," + i * 20 + ")"; });
|
|
||||||
|
|
||||||
legend.append("rect")
|
|
||||||
.attr("x", 943)
|
|
||||||
.attr("width", 10)
|
|
||||||
.attr("height", 10)
|
|
||||||
.style("fill", color)
|
|
||||||
.style("stroke", "grey");
|
|
||||||
|
|
||||||
legend.append("text")
|
|
||||||
.attr("class", "svgText")
|
|
||||||
.attr("x", 941)
|
|
||||||
.attr("y", 6)
|
|
||||||
.attr("dy", ".35em")
|
|
||||||
.style("text-anchor", "end")
|
|
||||||
.text(function (d) { return d; });
|
|
||||||
}
|
|
||||||
|
|
||||||
function removePopovers () {
|
|
||||||
$('.popover').each(function() {
|
|
||||||
$(this).remove();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function showPopover (d) {
|
|
||||||
$(this).popover({
|
|
||||||
title: d.name,
|
|
||||||
placement: 'top',
|
|
||||||
container: 'body',
|
|
||||||
trigger: 'manual',
|
|
||||||
html : true,
|
|
||||||
content: function() {
|
|
||||||
return d.label +
|
|
||||||
"<br/>num: " + d3.format(",")(d.value ? d.value: d.y1 - d.y0); }
|
|
||||||
});
|
|
||||||
$(this).popover('show')
|
|
||||||
}
|
|
||||||
|
|
||||||
chart.onResize = function () {
|
|
||||||
var aspect = width / height, chart = $("#thesvg");
|
|
||||||
var targetWidth = chart.parent().width();
|
|
||||||
chart.attr("width", targetWidth);
|
|
||||||
chart.attr("height", targetWidth / 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
window.chart = chart;
|
|
||||||
|
|
||||||
</script>
|
|
|
@ -1,219 +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">
|
|
||||||
<link href="{{ url_for('static', filename='css/dataTables.bootstrap4.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>
|
|
||||||
<script src="{{ url_for('static', filename='js/jquery.dataTables.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/dataTables.bootstrap.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">
|
|
||||||
|
|
||||||
{% include 'crawler/crawler_disabled.html' %}
|
|
||||||
|
|
||||||
{%if last_domains%}
|
|
||||||
<div class="table-responsive mt-1 mb-3 table-hover table-borderless table-striped">
|
|
||||||
<table class="table">
|
|
||||||
<thead class="thead-dark">
|
|
||||||
<tr>
|
|
||||||
<th>Domain</th>
|
|
||||||
<th>First Seen</th>
|
|
||||||
<th>Last Check</th>
|
|
||||||
<th>Status</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="tbody_last_crawled">
|
|
||||||
{% for metadata_domain in last_domains %}
|
|
||||||
<tr>
|
|
||||||
<td><a target="_blank" href="{{ url_for('crawler_splash.showDomain') }}?domain={{ metadata_domain['domain'] }}&port={{metadata_domain['port']}}&epoch={{metadata_domain['epoch']}}">{{ metadata_domain['domain_name'] }}</a></td>
|
|
||||||
<td>{{'{}/{}/{}'.format(metadata_domain['first_seen'][0:4], metadata_domain['first_seen'][4:6], metadata_domain['first_seen'][6:8])}}</td>
|
|
||||||
<td>{{'{}/{}/{}'.format(metadata_domain['last_check'][0:4], metadata_domain['last_check'][4:6], metadata_domain['last_check'][6:8])}}</td>
|
|
||||||
<td><div style="color:{{metadata_domain['status_color']}}; display:inline-block">
|
|
||||||
<i class="fas {{metadata_domain['status_icon']}} "></i>
|
|
||||||
{{metadata_domain['status_text']}}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
{%endif%}
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-lg-6">
|
|
||||||
<div class="table-responsive mt-1 table-hover table-borderless table-striped">
|
|
||||||
<table class="table" id="myTable_1">
|
|
||||||
<thead class="thead-dark">
|
|
||||||
<tr>
|
|
||||||
<th>Onion Url</th>
|
|
||||||
<th></th>
|
|
||||||
<th>Next Check</th>
|
|
||||||
<th></th>
|
|
||||||
<th></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="tbody_last_crawled">
|
|
||||||
{% for metadata_domain in auto_crawler_domain_onions_metadata %}
|
|
||||||
<tr>
|
|
||||||
<td><a target="_blank" href="{{ url_for('crawler_splash.showDomain') }}?domain={{ metadata_domain['domain'] }}&port={{metadata_domain['port']}}&epoch={{metadata_domain['epoch']}}">{{ metadata_domain['url'] }}</a></td>
|
|
||||||
<td><a class="btn btn-outline-danger px-1 py-0" href="{{ url_for('hiddenServices.remove_auto_crawler') }}?url={{ metadata_domain['url'] }}&page={{page}}">
|
|
||||||
<i class="fas fa-trash-alt"></i></a>
|
|
||||||
</td>
|
|
||||||
<td>{{metadata_domain['epoch']}}</td>
|
|
||||||
<td><div style="color:{{metadata_domain['status_color']}}; display:inline-block">
|
|
||||||
<i class="fas {{metadata_domain['status_icon']}} "></i>
|
|
||||||
{{metadata_domain['status_text']}}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<button class="btn btn-outline-secondary px-1 py-0 disabled"><i class="fas fa-pencil-alt"></i></button>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-lg-6">
|
|
||||||
<div class="table-responsive mt-1 table-hover table-borderless table-striped">
|
|
||||||
<table class="table" id="myTable_2">
|
|
||||||
<thead class="thead-dark">
|
|
||||||
<tr>
|
|
||||||
<th>Regular Url</th>
|
|
||||||
<th></th>
|
|
||||||
<th>Next Check</th>
|
|
||||||
<th></th>
|
|
||||||
<th></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="tbody_last_crawled">
|
|
||||||
{% for metadata_domain in auto_crawler_domain_regular_metadata %}
|
|
||||||
<tr>
|
|
||||||
<td><a target="_blank" href="{{ url_for('crawler_splash.showDomain') }}?domain={{ metadata_domain['domain'] }}&port={{metadata_domain['port']}}&epoch={{metadata_domain['epoch']}}">{{ metadata_domain['url'] }}</a></td>
|
|
||||||
<td><a class="btn btn-outline-danger px-1 py-0" href="{{ url_for('hiddenServices.remove_auto_crawler') }}?url={{ metadata_domain['url'] }}&page={{page}}">
|
|
||||||
<i class="fas fa-trash-alt"></i></a>
|
|
||||||
</td>
|
|
||||||
<td>{{metadata_domain['epoch']}}</td>
|
|
||||||
<td><div style="color:{{metadata_domain['status_color']}}; display:inline-block">
|
|
||||||
<i class="fas {{metadata_domain['status_icon']}} "></i>
|
|
||||||
{{metadata_domain['status_text']}}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<button class="btn btn-outline-secondary px-1 py-0 disabled"><i class="fas fa-pencil-alt"></i></button>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<hr class="mt-4">
|
|
||||||
|
|
||||||
<div class="d-flex justify-content-center">
|
|
||||||
<nav aria-label="...">
|
|
||||||
<ul class="pagination">
|
|
||||||
<li class="page-item {%if page==1%}disabled{%endif%}">
|
|
||||||
<a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page={{page-1}}">Previous</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
{%if page>3%}
|
|
||||||
<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page=1">1</a></li>
|
|
||||||
<li class="page-item disabled"><a class="page-link" aria-disabled="true" href="#">...</a></li>
|
|
||||||
<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page={{page-1}}">{{page-1}}</a></li>
|
|
||||||
<li class="page-item active"><a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page={{page}}">{{page}}</a></li>
|
|
||||||
{%else%}
|
|
||||||
{%if page>2%}<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page={{page-2}}">{{page-2}}</a></li>{%endif%}
|
|
||||||
{%if page>1%}<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page={{page-1}}">{{page-1}}</a></li>{%endif%}
|
|
||||||
<li class="page-item active"><a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page={{page}}">{{page}}</a></li>
|
|
||||||
{%endif%}
|
|
||||||
|
|
||||||
{%if nb_page_max-page>3%}
|
|
||||||
<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page={{page+1}}">{{page+1}}</a></li>
|
|
||||||
<li class="page-item disabled"><a class="page-link" aria-disabled="true" href="#">...</a></li>
|
|
||||||
<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page={{nb_page_max}}">{{nb_page_max}}</a></li>
|
|
||||||
{%else%}
|
|
||||||
{%if nb_page_max-page>2%}<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page={{nb_page_max-2}}">{{nb_page_max-2}}</a></li>{%endif%}
|
|
||||||
{%if nb_page_max-page>1%}<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page={{nb_page_max-1}}">{{nb_page_max-1}}</a></li>{%endif%}
|
|
||||||
{%if nb_page_max-page>0%}<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page={{nb_page_max}}">{{nb_page_max}}</a></li>{%endif%}
|
|
||||||
{%endif%}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="page-item {%if page==nb_page_max%}disabled{%endif%}">
|
|
||||||
<a class="page-link" href="{{ url_for('hiddenServices.auto_crawler') }}?page={{page+1}}" aria-disabled="true">Next</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</body>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
$(document).ready(function(){
|
|
||||||
$("#page-Crawler").addClass("active");
|
|
||||||
$("#nav_auto_crawler").addClass("active");
|
|
||||||
|
|
||||||
table1 = $('#myTable_1').DataTable(
|
|
||||||
{
|
|
||||||
//"aLengthMenu": [[5, 10, 15, 20, -1], [5, 10, 15, 20, "All"]],
|
|
||||||
//"iDisplayLength": 5,
|
|
||||||
//"order": [[ 0, "desc" ]]
|
|
||||||
columnDefs: [
|
|
||||||
{ orderable: false, targets: [-1, -4] }
|
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
table2 = $('#myTable_2').DataTable(
|
|
||||||
{
|
|
||||||
//"aLengthMenu": [[5, 10, 15, 20, -1], [5, 10, 15, 20, "All"]],
|
|
||||||
//"iDisplayLength": 5,
|
|
||||||
//"order": [[ 0, "desc" ]]
|
|
||||||
columnDefs: [
|
|
||||||
{ orderable: false, targets: [-1, -4] }
|
|
||||||
]
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
function toggle_sidebar(){
|
|
||||||
if($('#nav_menu').is(':visible')){
|
|
||||||
$('#nav_menu').hide();
|
|
||||||
$('#side_menu').removeClass('border-right')
|
|
||||||
$('#side_menu').removeClass('col-lg-2')
|
|
||||||
$('#core_content').removeClass('col-lg-10')
|
|
||||||
}else{
|
|
||||||
$('#nav_menu').show();
|
|
||||||
$('#side_menu').addClass('border-right')
|
|
||||||
$('#side_menu').addClass('col-lg-2')
|
|
||||||
$('#core_content').addClass('col-lg-10')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
|
@ -1,66 +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 >
|
|
||||||
<pre>
|
|
||||||
--------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------
|
|
||||||
|
|
||||||
</pre>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
$(document).ready(function(){
|
|
||||||
$("#page-Crawler").addClass("active");
|
|
||||||
});
|
|
||||||
|
|
||||||
function toggle_sidebar(){
|
|
||||||
if($('#nav_menu').is(':visible')){
|
|
||||||
$('#nav_menu').hide();
|
|
||||||
$('#side_menu').removeClass('border-right')
|
|
||||||
$('#side_menu').removeClass('col-lg-2')
|
|
||||||
$('#core_content').removeClass('col-lg-10')
|
|
||||||
}else{
|
|
||||||
$('#nav_menu').show();
|
|
||||||
$('#side_menu').addClass('border-right')
|
|
||||||
$('#side_menu').addClass('col-lg-2')
|
|
||||||
$('#core_content').addClass('col-lg-10')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
|
@ -1,208 +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">
|
|
||||||
<link href="{{ url_for('static', filename='css/dataTables.bootstrap.min.css') }}" rel="stylesheet">
|
|
||||||
|
|
||||||
<!-- JS -->
|
|
||||||
<script 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.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 class="card-deck justify-content-center mx-0">
|
|
||||||
<div class="card border-dark mt-2">
|
|
||||||
<div class="card-header bg-dark text-white">
|
|
||||||
Blacklisted {{type_name}}s
|
|
||||||
</div>
|
|
||||||
<div class="card-body text-dark">
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-12 col-md-6">
|
|
||||||
<div class="card text-center border-danger">
|
|
||||||
<div class="card-body text-danger">
|
|
||||||
<h5 class="card-title">Blacklist {{type_name}}</h5>
|
|
||||||
<input type="text" class="form-control {%if blacklist_domain is not none %}{%if blacklist_domain==1 %}is-valid{% else %}is-invalid{%endif%}{%endif%}" id="blacklist_domain_input" placeholder="{{type_name}} Address">
|
|
||||||
<div class="invalid-feedback">
|
|
||||||
{%if blacklist_domain==2 %}
|
|
||||||
This {{type_name}} is already blacklisted
|
|
||||||
{% else %}
|
|
||||||
Incorrect {{type_name}} address
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
<div class="valid-feedback">
|
|
||||||
{{type_name}} Blacklisted
|
|
||||||
</div>
|
|
||||||
<button type="button" class="btn btn-danger mt-2" onclick="window.location.href ='{{ url_for('hiddenServices.blacklist_domain') }}?redirect=0&type={{type}}&domain='+$('#blacklist_domain_input').val();">Blacklist {{type_name}}</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-md-6 mt-4 mt-md-0">
|
|
||||||
<div class="card text-center border-success">
|
|
||||||
<div class="card-body">
|
|
||||||
<h5 class="card-title">Unblacklist {{type_name}}</h5>
|
|
||||||
<input type="text" class="form-control {%if unblacklist_domain is not none %}{%if unblacklist_domain==1 %}is-valid{% else %}is-invalid{%endif%}{%endif%}" id="unblacklist_domain_input" placeholder="{{type_name}} Address">
|
|
||||||
<div class="invalid-feedback">
|
|
||||||
{%if unblacklist_domain==2 %}
|
|
||||||
This {{type_name}} is not blacklisted
|
|
||||||
{% else %}
|
|
||||||
Incorrect {{type_name}} address
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
<div class="valid-feedback">
|
|
||||||
{{type_name}} Unblacklisted
|
|
||||||
</div>
|
|
||||||
<button type="button" class="btn btn-outline-secondary mt-2" onclick="window.location.href ='{{ url_for('hiddenServices.unblacklist_domain') }}?redirect=0&type={{type}}&domain='+$('#unblacklist_domain_input').val();">Unblacklist {{type_name}}</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="row mt-4">
|
|
||||||
<div class="col-12 col-xl-6">
|
|
||||||
<table class="table table-striped table-bordered table-hover" id="myTable_1">
|
|
||||||
<thead class="thead-dark">
|
|
||||||
<tr>
|
|
||||||
<th style="max-width: 800px;">{{type_name}}</th>
|
|
||||||
<th style="max-width: 800px;">Unblacklist {{type_name}}</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for domain in list_blacklisted_1 %}
|
|
||||||
<tr>
|
|
||||||
<td>{{domain}}</td>
|
|
||||||
<td>
|
|
||||||
<a href="{{ url_for('hiddenServices.unblacklist_domain') }}?page={{page}}&domain={{domain}}&type={{type}}">
|
|
||||||
<button type="button" class="btn btn-outline-danger">UnBlacklist {{type_name}}</button>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-xl-6">
|
|
||||||
<table class="table table-striped table-bordered table-hover" id="myTable_2">
|
|
||||||
<thead class="thead-dark">
|
|
||||||
<tr>
|
|
||||||
<th style="max-width: 800px;">{{type_name}}</th>
|
|
||||||
<th style="max-width: 800px;">Unblacklist {{type_name}}</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for domain in list_blacklisted_2 %}
|
|
||||||
<tr>
|
|
||||||
<td>{{domain}}</td>
|
|
||||||
<td>
|
|
||||||
<a href="{{ url_for('hiddenServices.unblacklist_domain') }}?page={{page}}&domain={{domain}}&type={{type}}">
|
|
||||||
<button type="button" class="btn btn-outline-danger">UnBlacklist {{type_name}}</button>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="d-flex justify-content-center">
|
|
||||||
<nav class="mt-4" aria-label="...">
|
|
||||||
<ul class="pagination">
|
|
||||||
<li class="page-item {%if page==1%}disabled{%endif%}">
|
|
||||||
<a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page={{page-1}}">Previous</a>
|
|
||||||
</li>
|
|
||||||
|
|
||||||
{%if page>3%}
|
|
||||||
<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page=1">1</a></li>
|
|
||||||
<li class="page-item disabled"><a class="page-link" aria-disabled="true" href="#">...</a></li>
|
|
||||||
<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page={{page-1}}">{{page-1}}</a></li>
|
|
||||||
<li class="page-item active"><a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page={{page}}">{{page}}</a></li>
|
|
||||||
{%else%}
|
|
||||||
{%if page>2%}<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page={{page-2}}">{{page-2}}</a></li>{%endif%}
|
|
||||||
{%if page>1%}<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page={{page-1}}">{{page-1}}</a></li>{%endif%}
|
|
||||||
<li class="page-item active"><a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page={{page}}">{{page}}</a></li>
|
|
||||||
{%endif%}
|
|
||||||
|
|
||||||
{%if nb_page_max-page>3%}
|
|
||||||
<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page={{page+1}}">{{page+1}}</a></li>
|
|
||||||
<li class="page-item disabled"><a class="page-link" aria-disabled="true" href="#">...</a></li>
|
|
||||||
<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page={{nb_page_max}}">{{nb_page_max}}</a></li>
|
|
||||||
{%else%}
|
|
||||||
{%if nb_page_max-page>2%}<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page={{nb_page_max-2}}">{{nb_page_max-2}}</a></li>{%endif%}
|
|
||||||
{%if nb_page_max-page>1%}<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page={{nb_page_max-1}}">{{nb_page_max-1}}</a></li>{%endif%}
|
|
||||||
{%if nb_page_max-page>0%}<li class="page-item"><a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page={{nb_page_max}}">{{nb_page_max}}</a></li>{%endif%}
|
|
||||||
{%endif%}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<li class="page-item {%if page==nb_page_max%}disabled{%endif%}">
|
|
||||||
<a class="page-link" href="{{ url_for('hiddenServices.blacklisted_domains') }}?page={{page+1}}" aria-disabled="true">Next</a>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</nav>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var table
|
|
||||||
$(document).ready(function(){
|
|
||||||
|
|
||||||
table = $('#myTable_1').DataTable(
|
|
||||||
{
|
|
||||||
/*"aLengthMenu": [[5, 10, 15, 20, -1], [5, 10, 15, 20, "All"]],
|
|
||||||
"iDisplayLength": 10,*/
|
|
||||||
"order": [[ 0, "asc" ]]
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
table = $('#myTable_2').DataTable(
|
|
||||||
{
|
|
||||||
/*"aLengthMenu": [[5, 10, 15, 20, -1], [5, 10, 15, 20, "All"]],
|
|
||||||
"iDisplayLength": 10,*/
|
|
||||||
"order": [[ 0, "asc" ]]
|
|
||||||
}
|
|
||||||
);
|
|
||||||
$("#page-Crawler").addClass("active");
|
|
||||||
});
|
|
||||||
|
|
||||||
function toggle_sidebar(){
|
|
||||||
if($('#nav_menu').is(':visible')){
|
|
||||||
$('#nav_menu').hide();
|
|
||||||
$('#side_menu').removeClass('border-right')
|
|
||||||
$('#side_menu').removeClass('col-lg-2')
|
|
||||||
$('#core_content').removeClass('col-lg-10')
|
|
||||||
}else{
|
|
||||||
$('#nav_menu').show();
|
|
||||||
$('#side_menu').addClass('border-right')
|
|
||||||
$('#side_menu').addClass('col-lg-2')
|
|
||||||
$('#core_content').addClass('col-lg-10')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
|
@ -1,162 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<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">
|
|
||||||
<link href="{{ url_for('static', filename='css/daterangepicker.min.css') }}" rel="stylesheet">
|
|
||||||
<link href="{{ url_for('static', filename='css/dataTables.bootstrap.min.css') }}" rel="stylesheet">
|
|
||||||
|
|
||||||
<!-- JS -->
|
|
||||||
<script 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/popper.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/bootstrap4.min.js')}}"></script>
|
|
||||||
<script src="{{ url_for('static', filename='js/dataTables.bootstrap.min.js')}}"></script>
|
|
||||||
<script language="javascript" src="{{ url_for('static', filename='js/moment.min.js') }}"></script>
|
|
||||||
<script language="javascript" src="{{ url_for('static', filename='js/jquery.daterangepicker.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 class="row">
|
|
||||||
<div class="col-12 col-xl-6">
|
|
||||||
|
|
||||||
{% for date in date_range %}
|
|
||||||
{% if domains_by_day[date]%}
|
|
||||||
<div class="card text-center mt-1 mb-3">
|
|
||||||
<div class="card-header bg-dark text-white">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-6">
|
|
||||||
<h3 style="text-align:center;">{{'{}/{}/{}'.format(date[0:4], date[4:6], date[6:8])}}</h3>
|
|
||||||
</div>
|
|
||||||
<div class="col-6">
|
|
||||||
<a href="{{ url_for('hiddenServices.show_domains_by_daterange') }}?service_type={{type}}&domains_up=True&date_from={{date}}&date_to={{date}}" class="badge badge-success">{{ stats_by_date[date]['domain_up'] }}</a> UP
|
|
||||||
<a href="{{ url_for('hiddenServices.show_domains_by_daterange') }}?service_type={{type}}&domains_down=True&date_from={{date}}&date_to={{date}}" class="badge badge-danger ml-md-3">{{ stats_by_date[date]['domain_down'] }}</a> DOWN
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="card-body px-1">
|
|
||||||
|
|
||||||
<table id="table_{{date}}" class="table table-striped table-bordered">
|
|
||||||
<thead class="bg-dark text-white">
|
|
||||||
<tr>
|
|
||||||
<th>Domain</th>
|
|
||||||
<th>First Seen</th>
|
|
||||||
<th>Last Check</th>
|
|
||||||
<th>Status</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for domain in domains_by_day[date] %}
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a target="_blank" href="{{ url_for('crawler_splash.showDomain') }}?domain={{ domain }}">{{ domain }}</a>
|
|
||||||
<div>
|
|
||||||
{% for tag in domain_metadata[domain]['tags'] %}
|
|
||||||
<a href="{{ url_for('tags_ui.get_obj_by_tags') }}?object_type=domain<ags={{ tag }}">
|
|
||||||
<span class="badge badge-{{ bootstrap_label[loop.index0 % 5] }} pull-left">{{ tag }} <i>{{ domain_metadata[domain]['tags'][tag] }}</i></span>
|
|
||||||
</a>
|
|
||||||
{% endfor %}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
<td>{{'{}/{}/{}'.format(domain_metadata[domain]['first_seen'][0:4], domain_metadata[domain]['first_seen'][4:6], domain_metadata[domain]['first_seen'][6:8])}}</td>
|
|
||||||
<td>{{'{}/{}/{}'.format(domain_metadata[domain]['last_check'][0:4], domain_metadata[domain]['last_check'][4:6], domain_metadata[domain]['last_check'][6:8])}}</td>
|
|
||||||
<td><div style="color:{{domain_metadata[domain]['status_color']}}; display:inline-block">
|
|
||||||
<i class="fas {{domain_metadata[domain]['status_icon']}}"></i>
|
|
||||||
{{domain_metadata[domain]['status_text']}}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<div class="col-12 col-xl-6">
|
|
||||||
{% include 'crawler/show_domains_by_daterange.html' %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</body>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
$(document).ready(function(){
|
|
||||||
$("#page-Crawler").addClass("active");
|
|
||||||
|
|
||||||
$('#date-range-from').dateRangePicker({
|
|
||||||
separator : ' to ',
|
|
||||||
getValue: function(){
|
|
||||||
if ($('#date-range-from-input').val() && $('#date-range-to-input').val() )
|
|
||||||
return $('#date-range-from-input').val() + ' to ' + $('#date-range-to-input').val();
|
|
||||||
else
|
|
||||||
return '';
|
|
||||||
},
|
|
||||||
setValue: function(s,s1,s2){
|
|
||||||
$('#date-range-from-input').val(s1);
|
|
||||||
$('#date-range-to-input').val(s2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$('#date-range-to').dateRangePicker({
|
|
||||||
separator : ' to ',
|
|
||||||
getValue: function(){
|
|
||||||
if ($('#date-range-from-input').val() && $('#date-range-to-input').val() )
|
|
||||||
return $('#date-range-from-input').val() + ' to ' + $('#date-range-to-input').val();
|
|
||||||
else
|
|
||||||
return '';
|
|
||||||
},
|
|
||||||
setValue: function(s,s1,s2){
|
|
||||||
$('#date-range-from-input').val(s1);
|
|
||||||
$('#date-range-to-input').val(s2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
{% for date in date_range %}
|
|
||||||
$('#table_{{date}}').DataTable({
|
|
||||||
"aLengthMenu": [[5, 15, 30, -1], [5, 15, 30, "All"]],
|
|
||||||
"iDisplayLength": 15,
|
|
||||||
"order": [[ 0, "asc" ]]
|
|
||||||
});
|
|
||||||
{% endfor %}
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
function toggle_sidebar(){
|
|
||||||
if($('#nav_menu').is(':visible')){
|
|
||||||
$('#nav_menu').hide();
|
|
||||||
$('#side_menu').removeClass('border-right')
|
|
||||||
$('#side_menu').removeClass('col-lg-2')
|
|
||||||
$('#core_content').removeClass('col-lg-10')
|
|
||||||
}else{
|
|
||||||
$('#nav_menu').show();
|
|
||||||
$('#side_menu').addClass('border-right')
|
|
||||||
$('#side_menu').addClass('col-lg-2')
|
|
||||||
$('#core_content').addClass('col-lg-10')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</html>
|
|
|
@ -1 +0,0 @@
|
||||||
<li id='page-hiddenServices'><a href="{{ url_for('crawler_splash.crawlers_dashboard') }}"><i class="fa fa-user-secret"></i> hidden Services </a></li>
|
|
|
@ -1,451 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
||||||
|
|
||||||
<title>Hidden Service - 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/sb-admin-2.css') }}" rel="stylesheet">
|
|
||||||
<link href="{{ url_for('static', filename='css/daterangepicker.min.css') }}" rel="stylesheet" type="text/css" />
|
|
||||||
<!-- JS -->
|
|
||||||
<script language="javascript" src="{{ url_for('static', filename='js/jquery.js')}}"></script>
|
|
||||||
<script language="javascript" src="{{ url_for('static', filename='js/moment.min.js') }}"></script>
|
|
||||||
<script language="javascript" src="{{ url_for('static', filename='js/jquery.daterangepicker.min.js') }}"></script>
|
|
||||||
<script language="javascript" src="{{ url_for('static', filename='js/d3.min.js') }}"></script>
|
|
||||||
|
|
||||||
<style>
|
|
||||||
.input-group .form-control {
|
|
||||||
position: unset;
|
|
||||||
}
|
|
||||||
div.tooltip {
|
|
||||||
position: absolute;
|
|
||||||
text-align: center;
|
|
||||||
padding: 2px;
|
|
||||||
font: 12px sans-serif;
|
|
||||||
background: #ebf4fb;
|
|
||||||
border: 2px solid #b7ddf2;
|
|
||||||
border-radius: 8px;
|
|
||||||
pointer-events: none;
|
|
||||||
color: #000000;
|
|
||||||
}
|
|
||||||
.line_graph {
|
|
||||||
fill: none;
|
|
||||||
stroke: steelblue;
|
|
||||||
stroke-width: 2px;
|
|
||||||
stroke-linejoin: round;
|
|
||||||
stroke-linecap: round;
|
|
||||||
stroke-width: 1.5;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
{% include 'navbar.html' %}
|
|
||||||
|
|
||||||
<div id="page-wrapper">
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
|
|
||||||
<div class="panel panel-primary">
|
|
||||||
<div class="panel-heading">ONION</div>
|
|
||||||
<div class="panel-body">
|
|
||||||
<table class="table table-striped">
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Domain</th>
|
|
||||||
<th>First Seen</th>
|
|
||||||
<th>Last Check</th>
|
|
||||||
<th>Status</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody id="tbody_last_crawled">
|
|
||||||
{% for metadata_onion in last_onions %}
|
|
||||||
<tr>
|
|
||||||
<td><a target="_blank" href="{{ url_for('hiddenServices.onion_domain') }}?onion_domain={{ metadata_onion['domain'] }}">{{ metadata_onion['domain'] }}</a></td>
|
|
||||||
<td>{{'{}/{}/{}'.format(metadata_onion['first_seen'][0:4], metadata_onion['first_seen'][4:6], metadata_onion['first_seen'][6:8])}}</td>
|
|
||||||
<td>{{'{}/{}/{}'.format(metadata_onion['last_check'][0:4], metadata_onion['last_check'][4:6], metadata_onion['last_check'][6:8])}}</td>
|
|
||||||
<td><div style="color:{{metadata_onion['status_color']}}; display:inline-block">
|
|
||||||
<i class="fa {{metadata_onion['status_icon']}} fa-2x"></i>
|
|
||||||
{{metadata_onion['status_text']}}
|
|
||||||
</div>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<div id="graph_line">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="panel panel-info" style="text-align:center;">
|
|
||||||
<div class="panel-heading">
|
|
||||||
Select domains by date range :
|
|
||||||
<br>
|
|
||||||
<br>
|
|
||||||
<form action="{{ url_for('hiddenServices.get_onions_by_daterange') }}" id="hash_selector_form" method='post'>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="input-group">
|
|
||||||
<span class="input-group-addon"><i class="fa fa-calendar fa" aria-hidden="true"></i></span>
|
|
||||||
<input class="form-control" id="date-range-from" placeholder="yyyy-mm-dd" value="{{ date_from }}" name="date_from">
|
|
||||||
</div>
|
|
||||||
<div class="input-group">
|
|
||||||
<span class="input-group-addon"><i class="fa fa-calendar fa" aria-hidden="true"></i></span>
|
|
||||||
<input class="form-control" id="date-range-to" placeholder="yyyy-mm-dd" value="{{ date_to }}" name="date_to">
|
|
||||||
</div>
|
|
||||||
<div class="checkbox">
|
|
||||||
<label>
|
|
||||||
<input type="checkbox" name="domains_tags" value="True" checked>
|
|
||||||
<div style="color:#286090; display:inline-block">
|
|
||||||
Domains Tags <i class="fa fa-tags"></i>
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-6">
|
|
||||||
<div class="checkbox">
|
|
||||||
<label>
|
|
||||||
<input type="checkbox" name="domains_up" value="True" checked>
|
|
||||||
<div style="color:Green; display:inline-block">
|
|
||||||
Domains UP <i class="fa fa-check-circle"></i>
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
<div class="checkbox">
|
|
||||||
<label>
|
|
||||||
<input type="checkbox" name="domains_down" value="True">
|
|
||||||
<div style="color:Red; display:inline-block">
|
|
||||||
Domains DOWN <i class="fa fa-times-circle"></i>
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<button class="btn btn-primary" style="text-align:center;">
|
|
||||||
<i class="fa fa-eye-slash"></i> Show Onions
|
|
||||||
</button>
|
|
||||||
<form>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="panel panel-info">
|
|
||||||
<div class="panel-heading">
|
|
||||||
<i class="fa fa-eye-slash"></i> Domains Crawled Today
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<table class="table table-hover table-striped">
|
|
||||||
<tbody>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a target="_blank" href="{{ url_for('hiddenServices.show_domains_by_daterange') }}?date_from={{ date_from }}&domains_up=True">
|
|
||||||
<div style="color:Green; display:inline-block">
|
|
||||||
<i class="fa fa-check-circle fa-2x"></i>
|
|
||||||
Domains UP
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a target="_blank" href="{{ url_for('hiddenServices.show_domains_by_daterange') }}?date_from={{ date_from }}&domains_up=True">
|
|
||||||
<div style="color:Green; display:inline-block">
|
|
||||||
<div id="text_domain_up">{{ statDomains['domains_up'] }}</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a target="_blank" href="{{ url_for('hiddenServices.show_domains_by_daterange') }}?date_from={{ date_from }}&domains_down=True">
|
|
||||||
<div style="color:Red; display:inline-block">
|
|
||||||
<i class="fa fa-times-circle fa-2x"></i>
|
|
||||||
Domains DOWN
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a target="_blank" href="{{ url_for('hiddenServices.show_domains_by_daterange') }}?date_from={{ date_from }}&domains_down=True">
|
|
||||||
<div style="color:Red; display:inline-block">
|
|
||||||
<div id="text_domain_down">{{ statDomains['domains_down'] }}</div>
|
|
||||||
</div>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<a target="_blank" href="{{ url_for('hiddenServices.show_domains_by_daterange') }}?date_from={{ date_from }}&domains_up=True&domains_down=True">
|
|
||||||
Crawled Domains
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<a target="_blank" href="{{ url_for('hiddenServices.show_domains_by_daterange') }}?date_from={{ date_from }}&domains_up=True&domains_down=True">
|
|
||||||
<div id="text_total_domains">{{ statDomains['total'] }}</div>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td>Domains in Queue</td>
|
|
||||||
<td><div id="text_domain_queue">{{ statDomains['domains_queue'] }}</div></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="panel panel-info" {%if not crawler_metadata%}hidden{%endif%} id="panel_crawler">
|
|
||||||
<div class="panel-heading">
|
|
||||||
Crawlers Status
|
|
||||||
</div>
|
|
||||||
<table class="table table-hover table-striped">
|
|
||||||
<tbody id="tbody_crawler_info">
|
|
||||||
{% for crawler in crawler_metadata %}
|
|
||||||
<tr>
|
|
||||||
<td>
|
|
||||||
<i class="fa fa-{%if crawler['status']%}check{%else%}times{%endif%}-circle fa-2x" style="color:{%if crawler['status']%}Green{%else%}Red{%endif%};"></i> {{crawler['crawler_info']}}
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
{{crawler['crawling_domain']}}
|
|
||||||
</td>
|
|
||||||
<td style="color:{%if crawler['status']%}Green{%else%}Red{%endif%};">
|
|
||||||
{{crawler['status_info']}}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
<!-- /#page-wrapper -->
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var all_graph = {};
|
|
||||||
var to_refresh = false
|
|
||||||
$(document).ready(function(){
|
|
||||||
activePage = "page-hiddenServices"
|
|
||||||
$("#"+activePage).addClass("active");
|
|
||||||
|
|
||||||
$('#date-range-from').dateRangePicker({
|
|
||||||
separator : ' to ',
|
|
||||||
getValue: function()
|
|
||||||
{
|
|
||||||
if ($('#date-range-from').val() && $('#date-range-to').val() )
|
|
||||||
return $('#date-range-from').val() + ' to ' + $('#date-range-to').val();
|
|
||||||
else
|
|
||||||
return '';
|
|
||||||
},
|
|
||||||
setValue: function(s,s1,s2)
|
|
||||||
{
|
|
||||||
$('#date-range-from').val(s1);
|
|
||||||
$('#date-range-to').val(s2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
$('#date-range-to').dateRangePicker({
|
|
||||||
separator : ' to ',
|
|
||||||
getValue: function()
|
|
||||||
{
|
|
||||||
if ($('#date-range-from').val() && $('#date-range-to').val() )
|
|
||||||
return $('#date-range-from').val() + ' to ' + $('#date-range-to').val();
|
|
||||||
else
|
|
||||||
return '';
|
|
||||||
},
|
|
||||||
setValue: function(s,s1,s2)
|
|
||||||
{
|
|
||||||
$('#date-range-from').val(s1);
|
|
||||||
$('#date-range-to').val(s2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
all_graph.line_chart = create_line_chart('graph_line', "{{ url_for('hiddenServices.domain_crawled_7days_json') }}?type=onion");
|
|
||||||
|
|
||||||
$( window ).focus(function() {
|
|
||||||
to_refresh = true
|
|
||||||
refresh_list_crawled();
|
|
||||||
});
|
|
||||||
$( window ).blur(function() {
|
|
||||||
to_refresh = false
|
|
||||||
});
|
|
||||||
|
|
||||||
to_refresh = true
|
|
||||||
refresh_list_crawled();
|
|
||||||
});
|
|
||||||
$(window).on("resize", function() {
|
|
||||||
all_graph.onResize();
|
|
||||||
});
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
all_graph.onResize = function () {
|
|
||||||
var aspect = 1000 / 500, all_graph = $("#graph_div");
|
|
||||||
var targetWidth = all_graph.parent().width();
|
|
||||||
all_graph.attr("width", targetWidth);
|
|
||||||
all_graph.attr("height", targetWidth / aspect);
|
|
||||||
}
|
|
||||||
window.all_graph = all_graph;
|
|
||||||
|
|
||||||
function create_line_chart(id, url){
|
|
||||||
var width = 650;
|
|
||||||
var height = Math.round(width / 6);
|
|
||||||
var margin = {top: 20, right: 55, bottom: 50, left: 40};
|
|
||||||
var x = d3.scaleTime().range([0, width]);
|
|
||||||
var y = d3.scaleLinear().rangeRound([height, 0]);
|
|
||||||
var xAxis = d3.axisBottom(x);
|
|
||||||
var yAxis = d3.axisLeft(y);
|
|
||||||
var parseTime = d3.timeParse("%Y-%m-%d");
|
|
||||||
var line = d3.line()
|
|
||||||
.x(function(d) {
|
|
||||||
return x(d.date);
|
|
||||||
})
|
|
||||||
.y(function(d) {
|
|
||||||
return y(d.value);
|
|
||||||
});
|
|
||||||
var svg_line = d3.select('#'+id).append('svg')
|
|
||||||
.attr("id", "graph_div")
|
|
||||||
.attr("width", width + margin.left + margin.right)
|
|
||||||
.attr("height", height + margin.top + margin.bottom)
|
|
||||||
.append('g')
|
|
||||||
.attr('transform', "translate("+ margin.left +","+ margin.top +")");
|
|
||||||
var div = d3.select('body').append('div')
|
|
||||||
.attr('class', 'tooltip')
|
|
||||||
.style('opacity', 0);
|
|
||||||
//add div tooltip
|
|
||||||
d3.json(url)
|
|
||||||
.then(function(data){
|
|
||||||
data.forEach(function(d) {
|
|
||||||
d.date_label = d.date;
|
|
||||||
d.date = parseTime(d.date);
|
|
||||||
d.value = +d.value;
|
|
||||||
});
|
|
||||||
// fit the data
|
|
||||||
x.domain(d3.extent(data, function(d) { return d.date; }));
|
|
||||||
//x.domain(data.map(function (d) { return d.date; })); //E
|
|
||||||
y.domain([0, d3.max(data, function(d){ return d.value ; })]);
|
|
||||||
//line
|
|
||||||
svg_line.append("path")
|
|
||||||
.data([data])
|
|
||||||
.attr("class", "line_graph")
|
|
||||||
.attr("d", line);
|
|
||||||
// add X axis
|
|
||||||
svg_line.append("g")
|
|
||||||
.attr("transform", "translate(0," + height + ")")
|
|
||||||
.call(d3.axisBottom(x))
|
|
||||||
.selectAll("text")
|
|
||||||
.style("text-anchor", "end")
|
|
||||||
.attr("transform", "rotate(-45)" );
|
|
||||||
// Add the Y Axis
|
|
||||||
svg_line.append("g")
|
|
||||||
.call(d3.axisLeft(y));
|
|
||||||
//add a dot circle
|
|
||||||
svg_line.selectAll('dot')
|
|
||||||
.data(data).enter()
|
|
||||||
.append('circle')
|
|
||||||
.attr('r', 2)
|
|
||||||
.attr('cx', function(d) { return x(d.date); })
|
|
||||||
.attr('cy', function(d) { return y(d.value); })
|
|
||||||
.on('mouseover', function(d) {
|
|
||||||
div.transition().style('opacity', .9);
|
|
||||||
div.html('' + d.date_label+ '<br/>' + d.value).style('left', (d3.event.pageX) + 'px')
|
|
||||||
.style("left", (d3.event.pageX) + "px")
|
|
||||||
.style("top", (d3.event.pageY - 28) + "px");
|
|
||||||
})
|
|
||||||
.on('mouseout', function(d)
|
|
||||||
{
|
|
||||||
div.transition().style('opacity', 0);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
|
|
||||||
function refresh_list_crawled(){
|
|
||||||
|
|
||||||
$.getJSON("{{ url_for('hiddenServices.last_crawled_domains_with_stats_json') }}",
|
|
||||||
function(data) {
|
|
||||||
|
|
||||||
var tableRef = document.getElementById('tbody_last_crawled');
|
|
||||||
$("#tbody_last_crawled").empty()
|
|
||||||
|
|
||||||
for (var i = 0; i < data.last_onions.length; i++) {
|
|
||||||
var data_domain = data.last_onions[i]
|
|
||||||
var newRow = tableRef.insertRow(tableRef.rows.length);
|
|
||||||
|
|
||||||
var newCell = newRow.insertCell(0);
|
|
||||||
newCell.innerHTML = "<td><a target=\"_blank\" href=\"{{ url_for('hiddenServices.onion_domain') }}?onion_domain="+data_domain['domain']+"\">"+data_domain['domain']+"</a></td>";
|
|
||||||
|
|
||||||
newCell = newRow.insertCell(1);
|
|
||||||
newCell.innerHTML = "<td>"+data_domain['first_seen'].substr(0, 4)+"/"+data_domain['first_seen'].substr(4, 2)+"/"+data_domain['first_seen'].substr(6, 2)+"</td>"
|
|
||||||
|
|
||||||
newCell = newRow.insertCell(2);
|
|
||||||
newCell.innerHTML = "<td>"+data_domain['last_check'].substr(0, 4)+"/"+data_domain['last_check'].substr(4, 2)+"/"+data_domain['last_check'].substr(6, 2)+"</td>"
|
|
||||||
|
|
||||||
newCell = newRow.insertCell(3);
|
|
||||||
newCell.innerHTML = "<td><div style=\"color:"+data_domain['status_color']+"; display:inline-block\"><i class=\"fa "+data_domain['status_icon']+" fa-2x\"></i>"+data_domain['status_text']+"</div></td>"
|
|
||||||
|
|
||||||
}
|
|
||||||
var statDomains = data.statDomains
|
|
||||||
document.getElementById('text_domain_up').innerHTML = statDomains['domains_up']
|
|
||||||
document.getElementById('text_domain_down').innerHTML = statDomains['domains_down']
|
|
||||||
document.getElementById('text_domain_queue').innerHTML = statDomains['domains_queue']
|
|
||||||
document.getElementById('text_total_domains').innerHTML = statDomains['total']
|
|
||||||
|
|
||||||
if(data.crawler_metadata.length!=0){
|
|
||||||
$("#tbody_crawler_info").empty();
|
|
||||||
var tableRef = document.getElementById('tbody_crawler_info');
|
|
||||||
for (var i = 0; i < data.crawler_metadata.length; i++) {
|
|
||||||
var crawler = data.crawler_metadata[i];
|
|
||||||
var newRow = tableRef.insertRow(tableRef.rows.length);
|
|
||||||
var text_color;
|
|
||||||
var icon;
|
|
||||||
if(crawler['status']){
|
|
||||||
text_color = 'Green';
|
|
||||||
icon = 'check';
|
|
||||||
} else {
|
|
||||||
text_color = 'Red';
|
|
||||||
icon = 'times';
|
|
||||||
}
|
|
||||||
|
|
||||||
var newCell = newRow.insertCell(0);
|
|
||||||
newCell.innerHTML = "<td><i class=\"fa fa-"+icon+"-circle fa-2x\" style=\"color:"+text_color+";\"></i>"+crawler['crawler_info']+"</td>";
|
|
||||||
|
|
||||||
newCell = newRow.insertCell(1);
|
|
||||||
newCell.innerHTML = "<td><a target=\"_blank\" href=\"{{ url_for('hiddenServices.onion_domain') }}?onion_domain="+crawler['crawling_domain']+"\">"+crawler['crawling_domain']+"</a></td>";
|
|
||||||
|
|
||||||
newCell = newRow.insertCell(2);
|
|
||||||
newCell.innerHTML = "<td><div style=\"color:"+text_color+";\">"+crawler['status_info']+"</div></td>";
|
|
||||||
|
|
||||||
$("#panel_crawler").show();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$("#panel_crawler").hide();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
if (to_refresh) {
|
|
||||||
setTimeout("refresh_list_crawled()", 10000);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
|
|
||||||
</html>
|
|
|
@ -0,0 +1,102 @@
|
||||||
|
<!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">
|
||||||
|
<link href="{{ url_for('static', filename='css/dataTables.bootstrap.min.css') }}" rel="stylesheet">
|
||||||
|
|
||||||
|
<!-- JS -->
|
||||||
|
<script 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.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 class="card text-center border-danger my-2">
|
||||||
|
<div class="card-body text-danger">
|
||||||
|
<h4 class="card-title">Blacklist</h4>
|
||||||
|
<input type="text" class="form-control {%if error_code is not none %}{%if error_code==0 %}is-valid{% else %}is-invalid{%endif%}{%endif%}" id="blacklist_domain_input" placeholder="Domain" {% if domain %}value="{{ domain }}"{% endif %}>
|
||||||
|
<div class="invalid-feedback">
|
||||||
|
{%if error_code==2 %}
|
||||||
|
This Domain is already blacklisted
|
||||||
|
{% else %}
|
||||||
|
Incorrect address
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
<div class="valid-feedback">
|
||||||
|
Blacklisted
|
||||||
|
</div>
|
||||||
|
<button type="button" class="btn btn-danger mt-2" onclick="window.location.href ='{{ url_for('crawler_splash.crawler_blacklist') }}?domain='+$('#blacklist_domain_input').val();">Blacklist Domain</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<table class="table table-striped table-bordered table-hover" id="myTable_1">
|
||||||
|
<thead class="thead-dark">
|
||||||
|
<tr>
|
||||||
|
<th style="max-width: 800px;">Blacklisted Domains</th>
|
||||||
|
<th style="max-width: 800px;"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for dom in blacklist %}
|
||||||
|
<tr>
|
||||||
|
<td>{{dom}}</td>
|
||||||
|
<td>
|
||||||
|
<a href="{{ url_for('crawler_splash.crawler_blacklist_delete') }}?domain={{dom}}">
|
||||||
|
<button type="button" class="btn btn-outline-danger">Remove</button>
|
||||||
|
</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var table
|
||||||
|
$(document).ready(function(){
|
||||||
|
table = $('#myTable_1').DataTable(
|
||||||
|
{
|
||||||
|
"aLengthMenu": [[5, 10, 15, 20, -1], [5, 10, 15, 20, "All"]],
|
||||||
|
"iDisplayLength": 10,
|
||||||
|
"order": [[ 0, "asc" ]]
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
function toggle_sidebar(){
|
||||||
|
if($('#nav_menu').is(':visible')){
|
||||||
|
$('#nav_menu').hide();
|
||||||
|
$('#side_menu').removeClass('border-right')
|
||||||
|
$('#side_menu').removeClass('col-lg-2')
|
||||||
|
$('#core_content').removeClass('col-lg-10')
|
||||||
|
}else{
|
||||||
|
$('#nav_menu').show();
|
||||||
|
$('#side_menu').addClass('border-right')
|
||||||
|
$('#side_menu').addClass('col-lg-2')
|
||||||
|
$('#core_content').addClass('col-lg-10')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
|
@ -13,9 +13,9 @@
|
||||||
<script src="{{ url_for('static', filename='js/jquery.js')}}"></script>
|
<script src="{{ url_for('static', filename='js/jquery.js')}}"></script>
|
||||||
<script src="{{ url_for('static', filename='js/popper.min.js')}}"></script>
|
<script src="{{ url_for('static', filename='js/popper.min.js')}}"></script>
|
||||||
<script src="{{ url_for('static', filename='js/bootstrap4.min.js')}}"></script>
|
<script src="{{ url_for('static', filename='js/bootstrap4.min.js')}}"></script>
|
||||||
<script language="javascript" src="{{ url_for('static', filename='js/moment.min.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/moment.min.js') }}"></script>
|
||||||
<script language="javascript" src="{{ url_for('static', filename='js/jquery.daterangepicker.min.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/jquery.daterangepicker.min.js') }}"></script>
|
||||||
<script language="javascript" src="{{ url_for('static', filename='js/d3.min.js') }}"></script>
|
<script src="{{ url_for('static', filename='js/d3.min.js') }}"></script>
|
||||||
|
|
||||||
<style>
|
<style>
|
||||||
.bar {
|
.bar {
|
||||||
|
@ -93,10 +93,6 @@
|
||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<a href="{{ url_for('hiddenServices.blacklisted_domains') }}?type={{type}}">
|
|
||||||
<button type="button" class="btn btn-outline-danger">Show Blacklisted {{type_name}}s</button>
|
|
||||||
</a>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-12 col-xl-6">
|
<div class="col-12 col-xl-6">
|
||||||
{% include 'crawler/show_domains_by_daterange.html' %}
|
{% include 'crawler/show_domains_by_daterange.html' %}
|
||||||
|
|
|
@ -222,6 +222,10 @@
|
||||||
</div>
|
</div>
|
||||||
</div> -->
|
</div> -->
|
||||||
|
|
||||||
|
<a href="{{ url_for('crawler_splash.crawler_blacklist') }}">
|
||||||
|
<button type="button" class="btn btn-outline-danger">Blacklisted domains</button>
|
||||||
|
</a>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue