mirror of https://github.com/CIRCL/AIL-framework
				
				
				
			
		
			
				
	
	
		
			111 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
#!/usr/bin/env python3
 | 
						|
# -*-coding:UTF-8 -*
 | 
						|
"""
 | 
						|
The JSON Receiver Module
 | 
						|
================
 | 
						|
 | 
						|
Recieve Json Items (example: Twitter feeder)
 | 
						|
 | 
						|
"""
 | 
						|
import os
 | 
						|
import importlib
 | 
						|
import json
 | 
						|
import redis
 | 
						|
import sys
 | 
						|
import time
 | 
						|
 | 
						|
sys.path.append(os.path.join(os.environ['AIL_BIN'], 'lib/'))
 | 
						|
import ConfigLoader
 | 
						|
 | 
						|
# Import all receiver
 | 
						|
#from all_json_receiver import *
 | 
						|
 | 
						|
#### CONFIG ####
 | 
						|
config_loader = ConfigLoader.ConfigLoader()
 | 
						|
server_cache = config_loader.get_redis_conn("Redis_Log_submit")
 | 
						|
r_serv_db = config_loader.get_redis_conn("ARDB_DB")
 | 
						|
config_loader = None
 | 
						|
 | 
						|
DEFAULT_FEEDER_NAME = 'Default_json'
 | 
						|
 | 
						|
#### ------ ####
 | 
						|
 | 
						|
def reload_json_importer_list():
 | 
						|
    global importer_list
 | 
						|
    importer_json_dir = os.path.join(os.environ['AIL_BIN'], 'import', 'ail_json_importer')
 | 
						|
    importer_list = [f[:-3] for f in os.listdir(importer_json_dir) if os.path.isfile(os.path.join(importer_json_dir, f))]
 | 
						|
 | 
						|
# init importer list
 | 
						|
importer_list = []
 | 
						|
reload_json_importer_list()
 | 
						|
 | 
						|
 | 
						|
#### FUNCTIONS ####
 | 
						|
def get_json_importer_list():
 | 
						|
    return importer_list
 | 
						|
 | 
						|
def add_json_to_json_queue(json_item):
 | 
						|
    json_item = json.dumps(json_item)
 | 
						|
    r_serv_db.rpush('importer:json:item', json_item)
 | 
						|
 | 
						|
def get_json_item_to_import():
 | 
						|
    return r_serv_db.lpop('importer:json:item')
 | 
						|
 | 
						|
def get_json_receiver_class(feeder_name_in):
 | 
						|
    global importer_list
 | 
						|
 | 
						|
    # sanitize class name
 | 
						|
    feeder_name = feeder_name_in[:1].upper() + feeder_name_in[1:]
 | 
						|
    feeder_name = feeder_name.replace('-', '_')
 | 
						|
 | 
						|
    if feeder_name is None or feeder_name not in get_json_importer_list():
 | 
						|
        reload_json_importer_list() # add refresh timing ?
 | 
						|
        if feeder_name not in get_json_importer_list():
 | 
						|
            print('Unknow feeder: {}'.format(feeder_name_in))
 | 
						|
            feeder_name = 'Default_json'
 | 
						|
    # avoid subpackages
 | 
						|
    parts = feeder_name.split('.')
 | 
						|
    module = 'ail_json_importer.{}'.format(parts[-1])
 | 
						|
    # import json importer class
 | 
						|
    try:
 | 
						|
        mod = importlib.import_module(module)
 | 
						|
    except:
 | 
						|
        raise
 | 
						|
    mod = importlib.import_module(module)
 | 
						|
    class_name = getattr(mod, feeder_name)
 | 
						|
    return class_name
 | 
						|
 | 
						|
def get_json_source(json_item):
 | 
						|
    return json_item.get('source', DEFAULT_FEEDER_NAME)
 | 
						|
 | 
						|
def process_json(importer_obj, process):
 | 
						|
    item_id = importer_obj.get_item_id()
 | 
						|
    if 'meta' in importer_obj.get_json_file():
 | 
						|
        importer_obj.process_json_meta(process, item_id)
 | 
						|
 | 
						|
    # send data to queue
 | 
						|
    send_item_to_ail_queue(item_id, importer_obj.get_item_gzip64encoded_content(), importer_obj.get_feeder_name(), process)
 | 
						|
 | 
						|
def send_item_to_ail_queue(item_id, gzip64encoded_content, feeder_name, process):
 | 
						|
    # Send item to queue
 | 
						|
    # send paste to Global
 | 
						|
    relay_message = "{0} {1}".format(item_id, gzip64encoded_content)
 | 
						|
    process.populate_set_out(relay_message, 'Mixer')
 | 
						|
 | 
						|
    # increase nb of paste by feeder name
 | 
						|
    server_cache.hincrby("mixer_cache:list_feeder", feeder_name, 1)
 | 
						|
 | 
						|
#### ---- ####
 | 
						|
 | 
						|
 | 
						|
#### API ####
 | 
						|
def api_import_json_item(data_json):
 | 
						|
    if not data_json:
 | 
						|
        return ({'status': 'error', 'reason': 'Malformed JSON'}, 400)
 | 
						|
 | 
						|
    # # TODO: add JSON verification
 | 
						|
    res = add_json_to_json_queue(data_json)
 | 
						|
    if res:
 | 
						|
        return ({'status': 'error'}, 400)
 | 
						|
    return ({'status': 'success'}, 200)
 |