Exemple #1
0
  def __init__(self, instance_queue, global_queue):
    #
    # "sched|port|command or action"
    #

    self.logger = logging.getLogger('Hasip.sched')
    self.sched = Scheduler()
    self.items  = ConfigItemReader()
    self.mod_list = self.items.get_items_dict()     # getting module list from item file
    self.queue_identifier = 'sched'       # this is the 'module address'  
    self.instance_queue = instance_queue  # worker queue to receive jobs 
    self.global_queue = global_queue      # queue to communicate back to main thread

    self.sched.start()

    # read jobs configuration
    self.config = ConfigBaseReader('config/jobs/')
    if self.config.has_config_files(): # true
      self.logger.info('Loading config files...')
      self.jobs = self.config.get_values()
    else:
      self.logger.info('No config files present.')
      self.jobs = []

    sched_params={}
    for section in self.jobs:
      for item in self.jobs[section]:
        if self.jobs[section][item] != '':
          sched_params.update({item : self.jobs[section][item]})
        else:
          sched_params.update({item : None})
 
      
      self.sched.add_cron_job(self.send_msg,
        year   = sched_params['year'], 
        month  = sched_params['month'],
        day    = sched_params['day'],
        week   = sched_params['week'],
        day_of_week = sched_params['day_of_week'],
        hour   = sched_params['hour'],
        minute = sched_params['minute'],
        second = sched_params['second'],
        args=(sched_params['module'],sched_params['action']))

    
    self.logger.debug(self.sched.print_jobs())
Exemple #2
0
  def __init__(self):

    self.config_items = ConfigItemReader()
    self.config_hasip = ConfigBaseReader()

    self.global_queue = Queue.Queue()

    self.log = Log()
    self.logger = logging.getLogger('Hasip.main')

    # dynamically creation of communication queues and instances of all used
    # modules. Afterwards a worker of each module is started in background and
    # is waiting for jobs on the incomming queue.
    #
    # (1) create a temp dictionary
    # (2) add a module specific communication queue
    # (3) capitalize & create instance for used module
    # (4) as params we give: "global_queue" and the previously created queue
    # (5) start "worker" of each module in background
    #

    # list of 'modules' to start
    modules_to_start =  []
    modules_to_start += self.config_items.modules_items()
    modules_to_start += self.config_hasip.modules_services()

    self.modules = {}
    for module_name in modules_to_start:
      self.modules[module_name] = {}                                      # (1)
      self.modules[module_name]["instance_queue"] = Queue.Queue()         # (2)
      self.modules[module_name]["instance_object"] = eval(
        "lib.modules." + module_name.capitalize()                         # (3)
      ) (self.modules[module_name]["instance_queue"], self.global_queue)  # (4)

      t = threading.Thread(                                               # (5)
        target = self.modules[module_name]["instance_object"].worker
      )

      self.logger.debug('Loaded Module %s', str(module_name))
      t.daemon = True
      t.start()
Exemple #3
0
class Sched(Basemodule):

  # ################################################################################
  # initialization of module and optional load of config files
  # ################################################################################
  def __init__(self, instance_queue, global_queue):
    #
    # "sched|port|command or action"
    #

    self.logger = logging.getLogger('Hasip.sched')
    self.sched = Scheduler()
    self.items  = ConfigItemReader()
    self.mod_list = self.items.get_items_dict()     # getting module list from item file
    self.queue_identifier = 'sched'       # this is the 'module address'  
    self.instance_queue = instance_queue  # worker queue to receive jobs 
    self.global_queue = global_queue      # queue to communicate back to main thread

    self.sched.start()

    # read jobs configuration
    self.config = ConfigBaseReader('config/jobs/')
    if self.config.has_config_files(): # true
      self.logger.info('Loading config files...')
      self.jobs = self.config.get_values()
    else:
      self.logger.info('No config files present.')
      self.jobs = []

    sched_params={}
    for section in self.jobs:
      for item in self.jobs[section]:
        if self.jobs[section][item] != '':
          sched_params.update({item : self.jobs[section][item]})
        else:
          sched_params.update({item : None})
 
      
      self.sched.add_cron_job(self.send_msg,
        year   = sched_params['year'], 
        month  = sched_params['month'],
        day    = sched_params['day'],
        week   = sched_params['week'],
        day_of_week = sched_params['day_of_week'],
        hour   = sched_params['hour'],
        minute = sched_params['minute'],
        second = sched_params['second'],
        args=(sched_params['module'],sched_params['action']))

    
    self.logger.debug(self.sched.print_jobs())

  # @TODO loading jobs from persistent store and create them in the scheduler


  # ################################################################################
  # main thread of this module file which runs in background and constanly
  # checks working queue for new tasks. 
  # ################################################################################

  def worker(self):
    while True:
      instance_queue_element = self.instance_queue.get(True)

      _senderport = instance_queue_element.get("module_from_port")
      _sender	  = instance_queue_element.get("module_from")
      _port       = instance_queue_element.get("module_addr")
      _action     = instance_queue_element.get("cmd")
      _optargs    = instance_queue_element.get("opt_args")
      
      options = {
        "create"   : self.create,
        "delete"  : self.delete
      }
      options[_action](_sender, _senderport, _port, _optargs)

  # ################################################################################
  #
  # "private" methods from here on...
  #
  # ################################################################################

  def create(self, sender, senderport, port, optargs):
    # @TODO
    print "Function to put jobs in the running scheduler job queue and store them persistent"
    pass

  def delete(self, sender, senderport, port, optargs):
    # @TODO
    print "Function to delete running and persistent jobs"
    pass
  
  def send_msg(self, module, action):               # ########################################
    if module in self.mod_list.keys():              # checking existence of requested module
      rcpt = self.mod_list[module][0]               # setting receiving module from item file
      mid = self.mod_list[module][1]                # setting module id from item file
      msg = {                                       # creating queue message
        'module_from_port': 0,                      # ########################################
        'module_from':    'sched',
        'module_rcpt':    rcpt,
        'module_addr':    mid,
        'cmd':            action,
        'opt_args':       ''
      }                                                 
      self.global_queue.put(msg)
Exemple #4
0
class Hasip(object):

  def __init__(self):

    self.config_items = ConfigItemReader()
    self.config_hasip = ConfigBaseReader()

    self.global_queue = Queue.Queue()

    self.log = Log()
    self.logger = logging.getLogger('Hasip.main')

    # dynamically creation of communication queues and instances of all used
    # modules. Afterwards a worker of each module is started in background and
    # is waiting for jobs on the incomming queue.
    #
    # (1) create a temp dictionary
    # (2) add a module specific communication queue
    # (3) capitalize & create instance for used module
    # (4) as params we give: "global_queue" and the previously created queue
    # (5) start "worker" of each module in background
    #

    # list of 'modules' to start
    modules_to_start =  []
    modules_to_start += self.config_items.modules_items()
    modules_to_start += self.config_hasip.modules_services()

    self.modules = {}
    for module_name in modules_to_start:
      self.modules[module_name] = {}                                      # (1)
      self.modules[module_name]["instance_queue"] = Queue.Queue()         # (2)
      self.modules[module_name]["instance_object"] = eval(
        "lib.modules." + module_name.capitalize()                         # (3)
      ) (self.modules[module_name]["instance_queue"], self.global_queue)  # (4)

      t = threading.Thread(                                               # (5)
        target = self.modules[module_name]["instance_object"].worker
      )

      self.logger.debug('Loaded Module %s', str(module_name))
      t.daemon = True
      t.start()

  # If there are new jobs in the global_queue a new message is generated and
  # sent to the instance queue
  def run(self):
    while True:

        # (1) get last job from global_queue
        # (2) create new message for addressed module
        # (3) get addresed queue object from modules dictonary
        # (4) put instance_queue_element which was generated before (2) to the
        #     instance_queue of module

        global_queue_element = self.global_queue.get(True) # (1)

        # (2)
        instance_queue_element = {
          'module_from_port':  global_queue_element.get('module_from_port'),
          'module_from':  global_queue_element.get('module_from'),
          'module_rcpt':  global_queue_element.get('module_rcpt'),
          'module_addr':  global_queue_element.get('module_addr'),
          'cmd':          global_queue_element.get('cmd'),
          'opt_args':     global_queue_element.get('opt_args')
        }

        module_rcpt = instance_queue_element.get('module_rcpt') # (3)
        self.logger.debug("Message from " + str(global_queue_element.get('module_from')) + " to " + str(global_queue_element.get('module_rcpt')) + " transmitted")
        self.modules[ module_rcpt ]["instance_queue"].put( instance_queue_element ) # (4)