mirror of https://github.com/CIRCL/AIL-framework
chg: [dashboard] nb objects per days + websocket update
parent
73543ae5ad
commit
edfd48b8e6
|
@ -158,7 +158,23 @@ class ChatSubChannel(AbstractChatObject):
|
|||
|
||||
class ChatSubChannels(AbstractChatObjects):
|
||||
def __init__(self):
|
||||
super().__init__('chat-subchannel')
|
||||
super().__init__('chat-subchannel', ChatSubChannel)
|
||||
|
||||
def get_name(self):
|
||||
return 'Chat-SubChannels'
|
||||
|
||||
def get_icon(self):
|
||||
return {'fas': 'far', 'icon': 'comments'}
|
||||
|
||||
def get_link(self, flask_context=False):
|
||||
if flask_context:
|
||||
url = url_for('chats_explorer.chats_explorer_protocols')
|
||||
else:
|
||||
url = f'{baseurl}/chats/explorer/protocols'
|
||||
return url
|
||||
|
||||
def sanitize_id_to_search(self, subtypes, name_to_search):
|
||||
return name_to_search
|
||||
|
||||
# if __name__ == '__main__':
|
||||
# chat = Chat('test', 'telegram')
|
||||
|
|
|
@ -112,7 +112,23 @@ def create(thread_id, chat_instance, chat_id, subchannel_id, message_id, contain
|
|||
|
||||
class ChatThreads(AbstractChatObjects):
|
||||
def __init__(self):
|
||||
super().__init__('chat-thread')
|
||||
super().__init__('chat-thread', ChatThread)
|
||||
|
||||
def get_name(self):
|
||||
return 'Chat-Threads'
|
||||
|
||||
def get_icon(self):
|
||||
return {'fas': 'fas', 'icon': 'grip-lines'}
|
||||
|
||||
def get_link(self, flask_context=False):
|
||||
if flask_context:
|
||||
url = url_for('chats_explorer.chats_explorer_protocols')
|
||||
else:
|
||||
url = f'{baseurl}/chats/explorer/protocols'
|
||||
return url
|
||||
|
||||
def sanitize_id_to_search(self, subtypes, name_to_search):
|
||||
return name_to_search
|
||||
|
||||
# if __name__ == '__main__':
|
||||
# chat = Chat('test', 'telegram')
|
||||
|
|
|
@ -60,6 +60,14 @@ class Chat(AbstractChatObject):
|
|||
username = username.split(':', 2)[2]
|
||||
return f'https://t.me/{username}'
|
||||
|
||||
def get_chat_instance(self):
|
||||
if self.subtype == '00098785-7e70-5d12-a120-c5cdc1252b2b':
|
||||
return 'telegram'
|
||||
elif self.subtype == 'd2426e3f-22f3-5a57-9a98-d2ae9794e683':
|
||||
return 'discord'
|
||||
else:
|
||||
return self.subtype
|
||||
|
||||
def get_svg_icon(self): # TODO
|
||||
# if self.subtype == 'telegram':
|
||||
# style = 'fab'
|
||||
|
@ -164,6 +172,21 @@ class Chat(AbstractChatObject):
|
|||
def update_username_timeline(self, username_global_id, timestamp):
|
||||
self._get_timeline_username().add_timestamp(timestamp, username_global_id)
|
||||
|
||||
def get_label(self):
|
||||
username = self.get_username()
|
||||
if username:
|
||||
username = username.split(':', 2)[2]
|
||||
name = self.get_name()
|
||||
if username and name:
|
||||
label = f'{username} - {name}'
|
||||
elif username:
|
||||
label = username
|
||||
elif name:
|
||||
label = name
|
||||
else:
|
||||
label = ''
|
||||
return label
|
||||
|
||||
#### ChatSubChannels ####
|
||||
|
||||
|
||||
|
@ -203,7 +226,23 @@ class Chat(AbstractChatObject):
|
|||
|
||||
class Chats(AbstractChatObjects):
|
||||
def __init__(self):
|
||||
super().__init__('chat')
|
||||
super().__init__('chat', Chat)
|
||||
|
||||
def get_name(self):
|
||||
return 'Chats'
|
||||
|
||||
def get_icon(self):
|
||||
return {'fas': 'fas', 'icon': 'comment'}
|
||||
|
||||
def get_link(self, flask_context=False):
|
||||
if flask_context:
|
||||
url = url_for('chats_explorer.chats_explorer_protocols')
|
||||
else:
|
||||
url = f'{baseurl}/chats/explorer/protocols'
|
||||
return url
|
||||
|
||||
def sanitize_id_to_search(self, subtypes, name_to_search):
|
||||
return name_to_search
|
||||
|
||||
def get_ids_with_messages_by_subtype(self, subtype):
|
||||
return r_object.smembers(f'{self.type}_w_mess:{subtype}')
|
||||
|
|
|
@ -15,7 +15,7 @@ sys.path.append(os.environ['AIL_BIN'])
|
|||
# Import Project packages
|
||||
##################################
|
||||
from lib.ConfigLoader import ConfigLoader
|
||||
from lib.objects.abstract_subtype_object import AbstractSubtypeObject, get_all_id
|
||||
from lib.objects.abstract_subtype_object import AbstractSubtypeObject, AbstractSubtypeObjects, get_all_id
|
||||
|
||||
config_loader = ConfigLoader()
|
||||
baseurl = config_loader.get_config_str("Notifications", "ail_domain")
|
||||
|
@ -166,6 +166,31 @@ class CryptoCurrency(AbstractSubtypeObject):
|
|||
meta['tags'] = self.get_tags(r_list=True)
|
||||
return meta
|
||||
|
||||
|
||||
class CryptoCurrencies(AbstractSubtypeObjects):
|
||||
"""
|
||||
Usernames Objects
|
||||
"""
|
||||
def __init__(self):
|
||||
super().__init__('cryptocurrency', CryptoCurrency)
|
||||
|
||||
def get_name(self):
|
||||
return 'Cryptocurrencies'
|
||||
|
||||
def get_icon(self):
|
||||
return {'fas': 'fas', 'icon': 'coins'}
|
||||
|
||||
def get_link(self, flask_context=False):
|
||||
if flask_context:
|
||||
url = url_for('objects_subtypes.objects_dashboard_cryptocurrency')
|
||||
else:
|
||||
url = f'{baseurl}/objects/cryptocurrencies'
|
||||
return url
|
||||
|
||||
def sanitize_id_to_search(self, subtypes, name_to_search):
|
||||
return name_to_search
|
||||
|
||||
|
||||
############################################################################
|
||||
############################################################################
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ sys.path.append(os.environ['AIL_BIN'])
|
|||
# Import Project packages
|
||||
##################################
|
||||
from lib.ConfigLoader import ConfigLoader
|
||||
from lib.objects.abstract_daterange_object import AbstractDaterangeObject
|
||||
from lib.objects.abstract_daterange_object import AbstractDaterangeObject, AbstractDaterangeObjects
|
||||
from packages import Date
|
||||
|
||||
sys.path.append('../../configs/keys')
|
||||
|
@ -321,6 +321,32 @@ class Decoded(AbstractDaterangeObject):
|
|||
|
||||
############################################################################
|
||||
|
||||
class Decodeds(AbstractDaterangeObjects):
|
||||
"""
|
||||
Barcodes Objects
|
||||
"""
|
||||
def __init__(self):
|
||||
super().__init__('decoded', Decoded)
|
||||
|
||||
def get_name(self):
|
||||
return 'Decodeds'
|
||||
|
||||
def get_icon(self):
|
||||
return {'fa': 'fas', 'icon': 'lock-open'}
|
||||
|
||||
def get_link(self, flask_context=False):
|
||||
if flask_context:
|
||||
url = url_for('objects_decoded.decodeds_dashboard')
|
||||
else:
|
||||
url = f'{baseurl}/objects/decodeds'
|
||||
return url
|
||||
|
||||
def sanitize_id_to_search(self, name_to_search):
|
||||
return name_to_search
|
||||
|
||||
|
||||
############################################################################
|
||||
|
||||
def is_vt_enabled():
|
||||
return VT_ENABLED
|
||||
|
||||
|
|
|
@ -57,7 +57,7 @@ class DomHash(AbstractDaterangeObject):
|
|||
return url
|
||||
|
||||
def get_svg_icon(self):
|
||||
return {'style': 'fas', 'icon': '\uf714', 'color': 'grey', 'radius': 5}
|
||||
return {'style': 'fas', 'icon': '\ue58a', 'color': 'grey', 'radius': 5}
|
||||
|
||||
def get_misp_object(self):
|
||||
obj_attrs = []
|
||||
|
@ -118,7 +118,7 @@ class DomHashs(AbstractDaterangeObjects):
|
|||
return 'DomHashs'
|
||||
|
||||
def get_icon(self):
|
||||
return {'fa': 'fas', 'icon': 'align-left'}
|
||||
return {'fa': 'fa-solid', 'icon': 'trowel-bricks'}
|
||||
|
||||
def get_link(self, flask_context=False):
|
||||
if flask_context:
|
||||
|
|
|
@ -727,6 +727,32 @@ def cluster_onion_domain_vanity(len_vanity=4):
|
|||
res = dict(sorted(occurrences.items(), key=lambda item: item[1], reverse=True))
|
||||
print(json.dumps(res))
|
||||
|
||||
class Domains:
|
||||
def __init__(self):
|
||||
self.type = 'message'
|
||||
self.obj_class = Domain
|
||||
|
||||
def get_name(self):
|
||||
return 'Domains'
|
||||
|
||||
def get_icon(self):
|
||||
return {'fas': 'fas', 'icon': 'spider'}
|
||||
|
||||
def get_link(self, flask_context=False):
|
||||
if flask_context:
|
||||
url = url_for('crawler_splash.crawlers_dashboard')
|
||||
else:
|
||||
url = f'{baseurl}/crawlers/dashboard'
|
||||
return url
|
||||
|
||||
# def get_by_date(self, date):
|
||||
# pass
|
||||
|
||||
def get_nb_by_date(self, date):
|
||||
nb = 0
|
||||
for domain_type in get_all_domains_types():
|
||||
nb += r_crawler.scard(f'{domain_type}_up:{date}')
|
||||
return nb
|
||||
|
||||
if __name__ == '__main__':
|
||||
_rebuild_vanity_clusters()
|
||||
|
|
|
@ -13,7 +13,7 @@ sys.path.append(os.environ['AIL_BIN'])
|
|||
# Import Project packages
|
||||
##################################
|
||||
from lib.ConfigLoader import ConfigLoader
|
||||
from lib.objects.abstract_subtype_object import AbstractSubtypeObject, get_all_id, get_all_id_iterator
|
||||
from lib.objects.abstract_subtype_object import AbstractSubtypeObject, AbstractSubtypeObjects, get_all_id, get_all_id_iterator
|
||||
|
||||
config_loader = ConfigLoader()
|
||||
baseurl = config_loader.get_config_str("Notifications", "ail_domain")
|
||||
|
@ -93,6 +93,30 @@ class Pgp(AbstractSubtypeObject):
|
|||
obj_attr.add_tag(tag)
|
||||
return obj
|
||||
|
||||
|
||||
class Pgps(AbstractSubtypeObjects):
|
||||
"""
|
||||
Usernames Objects
|
||||
"""
|
||||
def __init__(self):
|
||||
super().__init__('pgp', Pgp)
|
||||
|
||||
def get_name(self):
|
||||
return 'PGP Dumps'
|
||||
|
||||
def get_icon(self):
|
||||
return {'fas': 'fas', 'icon': 'key'}
|
||||
|
||||
def get_link(self, flask_context=False):
|
||||
if flask_context:
|
||||
url = url_for('objects_subtypes.objects_dashboard_pgp')
|
||||
else:
|
||||
url = f'{baseurl}/objects/pgps'
|
||||
return url
|
||||
|
||||
def sanitize_id_to_search(self, subtypes, name_to_search):
|
||||
return name_to_search
|
||||
|
||||
############################################################################
|
||||
############################################################################
|
||||
|
||||
|
|
|
@ -143,6 +143,19 @@ class Usernames(AbstractSubtypeObjects):
|
|||
def __init__(self):
|
||||
super().__init__('username', Username)
|
||||
|
||||
def get_name(self):
|
||||
return 'Usernames'
|
||||
|
||||
def get_icon(self):
|
||||
return {'fas': 'far', 'icon': 'user'}
|
||||
|
||||
def get_link(self, flask_context=False):
|
||||
if flask_context:
|
||||
url = url_for('objects_subtypes.objects_dashboard_username')
|
||||
else:
|
||||
url = f'{baseurl}/objects/usernames'
|
||||
return url
|
||||
|
||||
def sanitize_id_to_search(self, subtypes, name_to_search):
|
||||
return name_to_search
|
||||
|
||||
|
|
|
@ -15,7 +15,7 @@ sys.path.append(os.environ['AIL_BIN'])
|
|||
##################################
|
||||
from lib import ail_core
|
||||
from lib.ConfigLoader import ConfigLoader
|
||||
from lib.objects.abstract_subtype_object import AbstractSubtypeObject, get_all_id
|
||||
from lib.objects.abstract_subtype_object import AbstractSubtypeObject, AbstractSubtypeObjects, get_all_id
|
||||
from lib.timeline_engine import Timeline
|
||||
from lib.objects import Usernames
|
||||
|
||||
|
@ -220,8 +220,6 @@ class UserAccount(AbstractSubtypeObject):
|
|||
obj_attr.add_tag(tag)
|
||||
return obj
|
||||
|
||||
def get_user_by_username():
|
||||
pass
|
||||
|
||||
def get_all_subtypes():
|
||||
return ail_core.get_object_all_subtypes('user-account')
|
||||
|
@ -236,6 +234,30 @@ def get_all_by_subtype(subtype):
|
|||
return get_all_id('user-account', subtype)
|
||||
|
||||
|
||||
class UserAccounts(AbstractSubtypeObjects):
|
||||
"""
|
||||
Usernames Objects
|
||||
"""
|
||||
def __init__(self):
|
||||
super().__init__('user-account', UserAccount)
|
||||
|
||||
def get_name(self):
|
||||
return 'User-Accounts'
|
||||
|
||||
def get_icon(self):
|
||||
return {'fas': 'fas', 'icon': 'user-circle'}
|
||||
|
||||
def get_link(self, flask_context=False):
|
||||
if flask_context:
|
||||
url = url_for('objects_subtypes.objects_dashboard_user_account')
|
||||
else:
|
||||
url = f'{baseurl}/objects/user-accounts'
|
||||
return url
|
||||
|
||||
def sanitize_id_to_search(self, subtypes, name_to_search):
|
||||
return name_to_search
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
from lib.objects import Chats
|
||||
chat = Chats.Chat('', '00098785-7e70-5d12-a120-c5cdc1252b2b')
|
||||
|
|
|
@ -18,7 +18,7 @@ sys.path.append(os.environ['AIL_BIN'])
|
|||
##################################
|
||||
# Import Project packages
|
||||
##################################
|
||||
from lib.objects.abstract_subtype_object import AbstractSubtypeObject
|
||||
from lib.objects.abstract_subtype_object import AbstractSubtypeObject, AbstractSubtypeObjects
|
||||
from lib.ail_core import unpack_correl_objs_id, zscan_iter ################
|
||||
from lib.ConfigLoader import ConfigLoader
|
||||
from lib.objects import Messages
|
||||
|
@ -314,9 +314,10 @@ class AbstractChatObject(AbstractSubtypeObject, ABC):
|
|||
return self.get_correlation_iter('user-account', self.subtype, user_id, 'message')
|
||||
|
||||
# TODO move me to abstract subtype
|
||||
class AbstractChatObjects(ABC):
|
||||
def __init__(self, type):
|
||||
self.type = type
|
||||
class AbstractChatObjects(AbstractSubtypeObjects, ABC):
|
||||
|
||||
def __init__(self, obj_type, obj_class):
|
||||
super().__init__(obj_type, obj_class)
|
||||
|
||||
def add_subtype(self, subtype):
|
||||
r_object.sadd(f'all_{self.type}:subtypes', subtype)
|
||||
|
|
|
@ -18,7 +18,7 @@ sys.path.append(os.environ['AIL_BIN'])
|
|||
# Import Project packages
|
||||
##################################
|
||||
from lib.objects.abstract_object import AbstractObject
|
||||
from lib.ail_core import get_object_all_subtypes, zscan_iter
|
||||
from lib.ail_core import get_object_all_subtypes, zscan_iter, get_object_all_subtypes
|
||||
from lib.ConfigLoader import ConfigLoader
|
||||
from lib.item_basic import is_crawled, get_item_domain
|
||||
from lib.data_retention_engine import update_obj_date
|
||||
|
@ -198,10 +198,46 @@ class AbstractSubtypeObjects(ABC):
|
|||
"""
|
||||
Abstract Subtype Objects
|
||||
"""
|
||||
|
||||
def __init__(self, obj_type, obj_class):
|
||||
""" Abstract for Daterange Objects
|
||||
|
||||
:param obj_type: object type (item, ...)
|
||||
:param obj_class: object python class (Item, ...)
|
||||
"""
|
||||
self.type = obj_type
|
||||
self.obj_class = obj_class
|
||||
|
||||
def get_subtypes(self):
|
||||
return get_object_all_subtypes(self.type)
|
||||
|
||||
@abstractmethod
|
||||
def get_name(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_icon(self):
|
||||
pass
|
||||
|
||||
@abstractmethod
|
||||
def get_link(self, flask_context=False):
|
||||
pass
|
||||
|
||||
def get_by_date_subtype(self, subtype, date):
|
||||
return r_object.hkeys(f'{self.type}:{subtype}:{date}')
|
||||
|
||||
def get_by_date(self, date):
|
||||
pass
|
||||
|
||||
def get_nb_by_date_subtype(self, subtype, date):
|
||||
return r_object.hlen(f'{self.type}:{subtype}:{date}')
|
||||
|
||||
def get_nb_by_date(self, date):
|
||||
nb = 0
|
||||
for subtype in self.get_subtypes():
|
||||
nb += self.get_nb_by_date_subtype(subtype, date)
|
||||
return nb
|
||||
|
||||
def get_ids(self): # TODO FORMAT
|
||||
ids = []
|
||||
for subtype in get_object_all_subtypes(self.type):
|
||||
|
@ -249,6 +285,8 @@ class AbstractSubtypeObjects(ABC):
|
|||
########################################################################
|
||||
########################################################################
|
||||
|
||||
# TODO REFACTOR
|
||||
|
||||
def get_all_id(obj_type, subtype):
|
||||
return r_object.zrange(f'{obj_type}_all:{subtype}', 0, -1)
|
||||
|
||||
|
@ -303,5 +341,3 @@ def get_subtypes_objs_range_json(obj_type, date_from, date_to):
|
|||
objs_range.append(day_dict)
|
||||
|
||||
return objs_range
|
||||
|
||||
|
||||
|
|
|
@ -26,8 +26,8 @@ from lib.objects import ChatThreads
|
|||
from lib.objects import CryptoCurrencies
|
||||
from lib.objects import CookiesNames
|
||||
from lib.objects import Cves
|
||||
from lib.objects.Decodeds import Decoded, get_all_decodeds_objects, get_nb_decodeds_objects
|
||||
from lib.objects.Domains import Domain
|
||||
from lib.objects import Decodeds
|
||||
from lib.objects import Domains
|
||||
from lib.objects import Etags
|
||||
from lib.objects import Favicons
|
||||
from lib.objects import FilesNames
|
||||
|
@ -50,29 +50,29 @@ from lib.objects import Usernames
|
|||
# TODO INIT objs classes ????
|
||||
OBJECTS_CLASS = {
|
||||
'barcode': {'obj': BarCodes.Barcode, 'objs': BarCodes.Barcodes},
|
||||
'chat': {'obj': Chats.Chat, 'objs': None}, ## SUBTYPE #########################################
|
||||
'chat': {'obj': Chats.Chat, 'objs': Chats.Chats},
|
||||
'chat-subchannel': {'obj': ChatSubChannels.ChatSubChannel, 'objs': None}, ###### ######
|
||||
'chat-thread': {'obj': ChatThreads.ChatThread, 'objs': None}, ###### ######
|
||||
'cookie-name': {'obj': CookiesNames.CookieName, 'objs': CookiesNames.CookiesNames},
|
||||
'cve': {'obj': Cves.Cve, 'objs': Cves.Cves},
|
||||
'cryptocurrency': {'obj': CryptoCurrencies.CryptoCurrency, 'objs': None}, ## SUBTYPE #########################################
|
||||
'decoded': {'obj': Decoded, 'objs': None}, ###############################################################################################
|
||||
'domain': {'obj': Domain, 'objs': None}, ####################################################################################################
|
||||
'cryptocurrency': {'obj': CryptoCurrencies.CryptoCurrency, 'objs': CryptoCurrencies.CryptoCurrencies},
|
||||
'decoded': {'obj': Decodeds.Decoded, 'objs': Decodeds.Decodeds},
|
||||
'domain': {'obj': Domains.Domain, 'objs': Domains.Domains},
|
||||
'dom-hash': {'obj': DomHashs.DomHash, 'objs': DomHashs.DomHashs},
|
||||
'etag': {'obj': Etags.Etag, 'objs': Etags.Etags},
|
||||
'favicon': {'obj': Favicons.Favicon, 'objs': Favicons.Favicons},
|
||||
'file-name': {'obj': FilesNames.FileName, 'objs': FilesNames.FilesNames},
|
||||
'hhhash': {'obj': HHHashs.HHHash, 'objs': HHHashs.HHHashs},
|
||||
'item': {'obj': Item, 'objs': None}, ######
|
||||
'item': {'obj': Item, 'objs': None}, ####################################################################################################
|
||||
'image': {'obj': Images.Image, 'objs': Images.Images},
|
||||
'message': {'obj': Messages.Message, 'objs': None}, ######
|
||||
'message': {'obj': Messages.Message, 'objs': None}, #############################################################
|
||||
'ocr': {'obj': Ocrs.Ocr, 'objs': Ocrs.Ocrs},
|
||||
'pgp': {'obj': Pgps.Pgp, 'objs': None}, ## SUBTYPE ###########################################################################
|
||||
'pgp': {'obj': Pgps.Pgp, 'objs': Pgps.Pgps},
|
||||
'qrcode': {'obj': QrCodes.Qrcode, 'objs': QrCodes.Qrcodes},
|
||||
'screenshot': {'obj': Screenshots.Screenshot, 'objs': None}, ######
|
||||
'screenshot': {'obj': Screenshots.Screenshot, 'objs': None}, ####################################################################################################
|
||||
'title': {'obj': Titles.Title, 'objs': Titles.Titles},
|
||||
'user-account': {'obj': UsersAccount.UserAccount, 'objs': None}, ## SUBTYPE ###########################################################################
|
||||
'username': {'obj': Usernames.Username, 'objs': None}, ## SUBTYPE ###########################################################################
|
||||
'user-account': {'obj': UsersAccount.UserAccount, 'objs': UsersAccount.UserAccounts},
|
||||
'username': {'obj': Usernames.Username, 'objs': Usernames.Usernames},
|
||||
}
|
||||
|
||||
|
||||
|
@ -119,7 +119,7 @@ def get_object(obj_type, subtype, obj_id):
|
|||
return obj_class(obj_id)
|
||||
# SUBTYPES
|
||||
else:
|
||||
obj_class(obj_id, subtype)
|
||||
return obj_class(obj_id, subtype)
|
||||
|
||||
def exists_obj(obj_type, subtype, obj_id):
|
||||
obj = get_object(obj_type, subtype, obj_id)
|
||||
|
@ -354,7 +354,7 @@ def is_filtered(obj, filters):
|
|||
|
||||
def obj_iterator(obj_type, filters):
|
||||
if obj_type == 'decoded':
|
||||
return get_all_decodeds_objects(filters=filters)
|
||||
return Decodeds.get_all_decodeds_objects(filters=filters)
|
||||
elif obj_type == 'image':
|
||||
return Images.get_all_images_objects(filters=filters)
|
||||
elif obj_type == 'screenshot':
|
||||
|
@ -377,7 +377,7 @@ def card_objs_iterators(filters):
|
|||
|
||||
def card_obj_iterator(obj_type, filters):
|
||||
if obj_type == 'decoded':
|
||||
return get_nb_decodeds_objects(filters=filters)
|
||||
return Decodeds.get_nb_decodeds_objects(filters=filters)
|
||||
elif obj_type == 'item':
|
||||
return get_nb_items_objects(filters=filters)
|
||||
elif obj_type == 'pgp':
|
||||
|
|
|
@ -312,9 +312,8 @@ def ws_dashboard(ws):
|
|||
# break
|
||||
if int(time.time()) >= next_feeders:
|
||||
feeders = ail_stats.get_feeders_dashboard()
|
||||
# feeders['data']['telegram'] = 600
|
||||
# feeders['data']['test'] = 1300
|
||||
ws.send(json.dumps({'feeders': feeders}))
|
||||
objs = ail_stats.get_nb_objs_today()
|
||||
ws.send(json.dumps({'feeders': feeders, 'objs': objs}))
|
||||
next_feeders = next_feeders + 30
|
||||
time.sleep(1)
|
||||
except Exception as e: # ConnectionClosed ?
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<a class="icon-button btn-outline-dark px-2" href="{{ url }}">
|
||||
<div class="icon-wrapper text-center">
|
||||
<i class="fas fa-{{ icon }} fa-4x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
<span class="badge badge-pill badge-danger notification-badge" id="obj_btn_{{ type }}">
|
||||
{{ nb }}
|
||||
</span>
|
||||
</div>
|
||||
|
|
|
@ -71,291 +71,20 @@
|
|||
|
||||
{% for obj_type in nb_objects %}
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
{% with name=nb_objects[obj_type]['name'], icon=nb_objects[obj_type]['icon']['icon'], nb=nb_objects[obj_type]['nb'], url=nb_objects[obj_type]['link'] %}
|
||||
{% with type=obj_type, name=nb_objects[obj_type]['name'], icon=nb_objects[obj_type]['icon']['icon'], nb=nb_objects[obj_type]['nb'], url=nb_objects[obj_type]['link'] %}
|
||||
{% include 'objects/block_obj_button.html' %}
|
||||
{% endwith %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<a class="icon-button btn-outline-dark px-2" href="{{url_for('chats_explorer.chats_explorer_protocols')}}">
|
||||
<div class="icon-wrapper text-center">
|
||||
<i class="fas fa-comment fa-4x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
384556
|
||||
<span class="sr-only">Chats by days</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>Chats</b></div>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="col-12" id="core_content">
|
||||
|
||||
<div class="container mt-5">
|
||||
<div class="row">
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<a class="icon-button btn-outline-dark px-2" href="{{url_for('chats_explorer.chats_explorer_protocols')}}">
|
||||
<div class="icon-wrapper text-center">
|
||||
<i class="fas fa-comment fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
384556
|
||||
<span class="sr-only">Chats by days</span>
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>Chats</b></div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<a class="btn" style="position:relative;display: inline-block;">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-6 col-md-4 col-lg-3 text-center mb-4">
|
||||
<div class="icon-wrapper">
|
||||
<i class="fas fa-bug fa-6x"></i>
|
||||
<span class="badge badge-pill badge-danger notification-badge">
|
||||
5896
|
||||
</span>
|
||||
</div>
|
||||
<div class="h4"><b>CVEs</b></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<span class="fa-6x">
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-comment"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-bug"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-cookie-bite"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-tag"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-align-left"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-skull-crossbones"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-star-half"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-image"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-expand"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-barcode"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-qrcode"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-heading"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-lock-open"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-key"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-coins"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-user"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
<span class="fa-layers fa-fw">
|
||||
<i class="fa-solid fa-user-circle"></i>
|
||||
<span class="fa-layers-counter" style="background:Tomato">1,419</span>
|
||||
</span>
|
||||
</span>
|
||||
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
@ -364,6 +93,12 @@
|
|||
$("#page-Decoded").addClass("active");
|
||||
$("#nav_dashboard_{{obj_type}}").addClass("active");
|
||||
});
|
||||
|
||||
var btn_selector = {
|
||||
{% for obj_type in nb_objects %}
|
||||
'{{ obj_type }}': $("#obj_btn_{{ obj_type }}"),
|
||||
{% endfor %}
|
||||
}
|
||||
</script>
|
||||
|
||||
<script>
|
||||
|
@ -439,16 +174,16 @@ optionFeeder && feederChart.setOption(optionFeeder);
|
|||
|
||||
{# TODO UPDATE NEW FEEDER NAME#}
|
||||
function updateFeederChart(data) {
|
||||
let new_date = data['feeders']['date']
|
||||
let new_date = data['date']
|
||||
feeders_xaxis.push(new_date)
|
||||
feeders_xaxis.shift()
|
||||
|
||||
for (const f_name in data['feeders']['data']) {
|
||||
for (const f_name in data['data']) {
|
||||
if (f_name in feeders_data) {
|
||||
feeders_data[f_name].push(data['feeders']['data'][f_name])
|
||||
feeders_data[f_name].push(data['data'][f_name])
|
||||
feeders_data[f_name].shift()
|
||||
} else {
|
||||
let fdata = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, data['feeders']['data'][f_name]]
|
||||
let fdata = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, data['data'][f_name]]
|
||||
feeders_names.push(f_name)
|
||||
feeders_data[f_name] = fdata
|
||||
// add new feeder
|
||||
|
@ -460,6 +195,12 @@ function updateFeederChart(data) {
|
|||
feederChart.setOption(optionFeeder)
|
||||
}
|
||||
|
||||
function updateNbObjects(data) {
|
||||
for (const obj_type in data) {
|
||||
btn_selector[obj_type].text(data[obj_type]);
|
||||
}
|
||||
}
|
||||
|
||||
// WebSocket
|
||||
var socket = new WebSocket("{{ url_for('ws_dashboard') }}");
|
||||
socket.wsocket = function(event) {
|
||||
|
@ -467,7 +208,8 @@ socket.wsocket = function(event) {
|
|||
};
|
||||
socket.onmessage = function(event) {
|
||||
let data = JSON.parse(event.data);
|
||||
updateFeederChart(data);
|
||||
updateFeederChart(data['feeders']);
|
||||
updateNbObjects(data['objs']);
|
||||
};
|
||||
socket.onerror = function(error) {
|
||||
console.error('WebSocket error:', error);
|
||||
|
|
|
@ -72,7 +72,7 @@
|
|||
</li>
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{{url_for('objects_dom_hash.objects_dom_hashs')}}" id="nav_dom_hash">
|
||||
<i class="fas fa-skull-crossbones"></i>
|
||||
<i class="fas fa-trowel-bricks"></i>
|
||||
<span>Dom-Hash</span>
|
||||
</a>
|
||||
</li>
|
||||
|
|
Loading…
Reference in New Issue