Пример #1
0
    def read_config(self):
        """ 
        Read self.images_dbase_dir and self.max_size_gb from kmotion_rc and
        self.version from core_rc. If kmotion_rc is corrupt logs error and exits
        
        args    :
        excepts : 
        return  : none
        """

        self.kmotion_dir = os.getcwd()[:-5]

        parser = self.mutex_www_parser_rd(self.kmotion_dir)
        self.version = parser.get('system', 'version')

        parser = ConfigParser.SafeConfigParser()
        try:  # try - except because kmotion_rc is a user changeable file
            parser.read('../kmotion_rc')
            self.images_dbase_dir = parser.get('dirs', 'images_dbase_dir')
            # 2**30 = 1GB
            self.max_size_gb = int(
                parser.get('storage', 'images_dbase_limit_gb')) * 2**30

        except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
            logger.log(
                '** CRITICAL ERROR ** corrupt \'kmotion_rc\': %s' %
                sys.exc_info()[1], 'CRIT')
            logger.log(
                '** CRITICAL ERROR ** killing all daemons and terminating',
                'CRIT')
            daemon_whip.kill_daemons()
Пример #2
0
 def read_config(self):
     """ 
     Read self.images_dbase_dir and self.max_size_gb from kmotion_rc and
     self.version from kmotion_rc. If kmotion_rc is corrupt logs error and exits
     
     args    :
     excepts : 
     return  : none
     """
     
     self.kmotion_dir = os.getcwd()[:-5]
     
     parser = self.mutex_kmotion_parser_rd(self.kmotion_dir)
     
     try: # try - except because kmotion_rc is a user changeable file
         self.version = parser.get('version', 'string')
 	    self.max_feed = parser.getint('misc', 'max_feed')
         self.images_dbase_dir = parser.get('dirs', 'images_dbase_dir')
         # 2**30 = 1GB
         self.max_size_gb = int(parser.get('storage', 'images_dbase_limit_gb')) * 2**30
         
     except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
         logger.log('** CRITICAL ERROR ** corrupt \'kmotion_rc\': %s' % 
                    sys.exc_info()[1], 'CRIT')
         logger.log('** CRITICAL ERROR ** killing all daemons and terminating', 'CRIT')
         daemon_whip.kill_daemons()
Пример #3
0
    def main(self):
        """
        Start the hkd1 daemon. This daemon wakes up every 15 minutes
        
        args    : 
        excepts : 
        return  : none
        """

        logger.log('starting daemon ...', 'CRIT')
        time.sleep(
            60)  # delay to let stack settle else 'update_version' returns
        # IOError on system boot
        old_date = time.strftime('%Y%m%d', time.localtime(time.time()))
        self.update_version()

        while True:

            # sleep here to allow system to settle
            time.sleep(15 * 60)
            date = time.strftime('%Y%m%d', time.localtime(time.time()))

            # if > 90% of max_size_gb, delete oldest
            if self.images_dbase_size() > self.max_size_gb * 0.9:

                dir_ = os.listdir(self.images_dbase_dir)
                dir_.sort()

                if len(dir_) > 0 and dir_[0] == '.svn':
                    dir_.pop(0)  # skip '.svn' directory

                # if need to delete current recording, shut down kmotion
                if date == dir_[0]:
                    logger.log(
                        '** CRITICAL ERROR ** kmotion_hkd1 crash - image storage limit reached ... need to',
                        'CRIT')
                    logger.log(
                        '** CRITICAL ERROR ** kmotion_hkd1 crash - delete todays data, \'images_dbase\' is too small',
                        'CRIT')
                    logger.log(
                        '** CRITICAL ERROR ** kmotion_hkd1 crash - SHUTTING DOWN KMOTION !!',
                        'CRIT')
                    update_logs.add_no_space_event()
                    daemon_whip.kill_daemons()
                    sys.exit()

                update_logs.add_deletion_event(dir_[0])
                logger.log(
                    'image storeage limit reached - deleteing %s/%s' %
                    (self.images_dbase_dir, dir_[0]), 'CRIT')
                shutil.rmtree('%s/%s' % (self.images_dbase_dir, dir_[0]))

            if date != old_date:

                time.sleep(5 * 60)  # to ensure journals are written
                logger.log('midnight processes started ...', 'CRIT')
                self.ping_server_0000()
                self.update_version()
                self.build_smovie_cache(date)
                old_date = date
Пример #4
0
 def read_config(self):
     """
     Read configs from kmotion_rc, core_rc and www_rc.
     
     args    :
     excepts : 
     return  : none
     """
     
     self.kmotion_dir = os.getcwd()[:-5]
     parser = ConfigParser.SafeConfigParser()
     parser.read('../kmotion_rc')
     try: # try - except because kmotion_rc is user changeable file
         self.images_dbase_dir = parser.get('dirs', 'images_dbase_dir')
     except (ConfigParser.NoSectionError, ConfigParser.NoOptionError): 
         logger.log('** CRITICAL ERROR ** corrupt \'kmotion_rc\': %s' % 
                    sys.exc_info()[1], 'CRIT')
         logger.log('** CRITICAL ERROR ** killing all daemons and terminating', 'CRIT')
         daemon_whip.kill_daemons()
         
     parser = self.mutex_core_parser_rd(self.kmotion_dir) 
     self.ramdisk_dir = parser.get('dirs', 'ramdisk_dir')
     
     parser = self.mutex_www_parser_rd(self.kmotion_dir) 
     self.feed_enabled = (parser.get('motion_feed%02i' % self.feed, 'feed_enabled') == 'true')
     self.feed_snap_enabled = (parser.get('motion_feed%02i' % self.feed, 'feed_snap_enabled') == 'true')
     self.feed_snap_interval = int(parser.get('motion_feed%02i' % self.feed, 'feed_snap_interval'))
     self.feed_fps = int(parser.get('motion_feed%02i' % self.feed, 'feed_fps'))
     self.feed_name = parser.get('motion_feed%02i' % self.feed, 'feed_name')
Пример #5
0
    def main(self):    
        """
        Start the hkd1 daemon. This daemon wakes up every 15 minutes
        
        args    : 
        excepts : 
        return  : none
        """
        
        logger.log('starting daemon ...', 'CRIT') 
        time.sleep(60) # delay to let stack settle else 'update_version' returns 
                       # IOError on system boot  
        old_date = time.strftime('%Y%m%d', time.localtime(time.time()))
        #self.update_version()
        
        while True:   
            
            # sleep here to allow system to settle 
            time.sleep(15 * 60)
            date = time.strftime('%Y%m%d', time.localtime(time.time()))

            # if > 90% of max_size_gb, delete oldest
            if  self.images_dbase_size() > self.max_size_gb * 0.9:
                
                dir_ = os.listdir(self.images_dbase_dir)
                dir_.sort()
                
                if len(dir_) > 0 and dir_[0] == '.svn': 
                    dir_.pop(0)  # skip '.svn' directory
                    
                # if need to delete current recording, shut down kmotion 
                if date == dir_[0]:
                    logger.log('** CRITICAL ERROR ** kmotion_hkd1 crash - image storage limit reached ... need to', 'CRIT')
                    logger.log('** CRITICAL ERROR ** kmotion_hkd1 crash - delete todays data, \'images_dbase\' is too small', 'CRIT')
                    logger.log('** CRITICAL ERROR ** kmotion_hkd1 crash - SHUTTING DOWN KMOTION !!', 'CRIT')
                    update_logs.add_no_space_event()
                    daemon_whip.kill_daemons()
                    sys.exit()
                
                update_logs.add_deletion_event(dir_[0])
                logger.log('image storeage limit reached - deleteing %s/%s' % 
                           (self.images_dbase_dir, dir_[0]), 'CRIT')
                shutil.rmtree('%s/%s' % (self.images_dbase_dir, dir_[0])) 
                
            if date != old_date:
                
                time.sleep(5 * 60) # to ensure journals are written
                logger.log('midnight processes started ...', 'CRIT')
                #self.ping_server_0000()
                #self.update_version()
                self.build_smovie_cache(date)
                old_date = date
Пример #6
0
    def read_config(self):
        """
        Read configs from kmotion_rc, core_rc and www_rc.
        
        args    :
        excepts : 
        return  : none
        """

        self.kmotion_dir = os.getcwd()[:-5]
        parser = configparser.ConfigParser()
        parser.read('../kmotion_rc')
        try:  # try - except because kmotion_rc is user changeable file
            self.images_dbase_dir = parser.get('dirs', 'images_dbase_dir')
        except (configparser.NoSectionError, configparser.NoOptionError):
            logger.log(
                '** CRITICAL ERROR ** corrupt \'kmotion_rc\': %s' %
                sys.exc_info()[1], 'CRIT')
            logger.log(
                '** CRITICAL ERROR ** killing all daemons and terminating',
                'CRIT')
            daemon_whip.kill_daemons()

        parser = self.mutex_core_parser_rd(self.kmotion_dir)
        self.ramdisk_dir = parser.get('dirs', 'ramdisk_dir')

        parser = self.mutex_www_parser_rd(self.kmotion_dir)
        self.feed_enabled = (parser.get('motion_feed%02i' % self.feed,
                                        'feed_enabled') == 'true')
        self.feed_snap_enabled = (parser.get('motion_feed%02i' % self.feed,
                                             'feed_snap_enabled') == 'true')
        self.feed_snap_interval = int(
            parser.get('motion_feed%02i' % self.feed, 'feed_snap_interval'))
        self.feed_fps = int(
            parser.get('motion_feed%02i' % self.feed, 'feed_fps'))
        self.feed_name = parser.get('motion_feed%02i' % self.feed, 'feed_name')
Пример #7
0
def daemon_diagnostic():
    """
    Generate a primative CLI daemon control menu and act on selections
    
    args    : 
    excepts : 
    return  : none
    """

    # set kmotion_dir, remove /core from path
    kmotion_dir = os.getcwd()[:-5]
    # init the ramdisk dir
    init_core.init_ramdisk_dir(kmotion_dir)

    print """
kmotion manual daemon control ........"""

    while True:
        print """
The Options ....

s: Start Daemons
k: Kill Daemons
r: Reload Daemon configs
q: Quit

ENTER: Refresh"""
        print_status()
        opt = raw_input('Option letter then ENTER to select : ')
        # 's' start daemons - lifted from 'kmotion.py' -------------------------
        if opt == 's':
            if daemon_whip.all_daemons_running():
                print '\nDaemons are already running ...'

            else:
                init_configs(kmotion_dir)
                daemon_whip.start_daemons()
                time.sleep(1)
                if daemon_whip.all_daemons_running():
                    print '\nDaemons have been started ...'
                else:
                    print """
**** W A R N I N G ****
Some daemons refused to start
**** W A R N I N G ****"""

        # 'k' kill daemons -----------------------------------------------------
        elif opt == 'k':
            print '\nDaemons are being killed ... this may take some time ...'
            daemon_whip.kill_daemons()

        # 'r' reload daemons ---------------------------------------------------
        elif opt == 'r':
            if daemon_whip.all_daemons_running():
                print '\nDaemons config being reloaded ... this may take some time ...'
                init_configs(kmotion_dir)
                daemon_whip.reload_all_configs()
            else:
                print """
**** W A R N I N G ****
Some daemons are NOT running so daemon configs have NOT been reloaded
**** W A R N I N G ****"""

        # 'q' quit -------------------------------------------------------------
        elif opt == 'q':
            print 'Quitting kmotion manual daemon control ...'
            print_status()
            break
Пример #8
0
def main():
    """
    Re-initialises the kmotion core and reload the kmotion daemon configs
       
    args    : start|stop|reload on command line
    excepts : 
    return  : none
    """
    
    # set kmotion_dir, remove /core from path
    kmotion_dir = os.getcwd()[:-5]
    
    option = sys.argv[1]
    # if 'stop' shutdown and exit here
    if option == 'stop':
        logger.log('stopping kmotion ...', 'CRIT')
        daemon_whip.kill_daemons()
        return
    
    elif option == 'start':
        logger.log('starting kmotion ...', 'CRIT')
    elif option == 'restart':
        logger.log('restarting kmotion ...', 'CRIT')
    elif option == 'status':
	print daemon_whip.daemon_status()
	return
    # check for any invalid motion processes
    p_objs = Popen('ps ax | grep -e [[:space:]]motion | grep -v \'\-c %s/core/motion_conf/motion.conf\'' % kmotion_dir, shell=True, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
    line = p_objs.stdout.readline()
    
    if line != '':
        logger.log('** CRITICAL ERROR ** kmotion failed to start ...', 'CRIT')
        logger.log('** CRITICAL ERROR ** Another instance of motion daemon has been detected', 'CRIT')
        raise exit_("""An instance of the motion daemon has been detected which is not under control 
of kmotion. Please kill this instance and ensure that motion is not started
automatically on system bootup. This a known problem with Ubuntu 8.04 
Reference Bug #235599.""")

    # init the ramdisk dir
    init_core.init_ramdisk_dir(kmotion_dir)
    
    # init the mutex's
    mutex.init_mutex(kmotion_dir, 'www_rc')
    mutex.init_mutex(kmotion_dir, 'kmotion_rc')
    mutex.init_mutex(kmotion_dir, 'logs')
    
    parser = mutex_kmotion_parser_rd(kmotion_dir)
    ramdisk_dir = parser.get('dirs', 'ramdisk_dir')
    max_feed = parser.getint('misc', 'max_feed')
    
    try: # wrapping in a try - except because parsing data from kmotion_rc
        init_core.update_rcs(kmotion_dir, ramdisk_dir)
    except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
        raise exit_('corrupt \'kmotion_rc\' : %s' % sys.exc_info()[1])
    
    try: # wrapping in a try - except because parsing data from kmotion_rc
        init_core.gen_vhost(kmotion_dir)
    except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
        raise exit_('corrupt \'kmotion_rc\' : %s' % sys.exc_info()[1])

    # init motion_conf directory with motion.conf, thread1.conf ...
    init_motion.gen_motion_configs(kmotion_dir)
    
    # speed kmotion startup
    if daemon_whip.no_daemons_running():
        daemon_whip.start_daemons()
    elif daemon_whip.all_daemons_running():
        daemon_whip.reload_all_configs()
    else:
        daemon_whip.start_daemons()
        daemon_whip.reload_all_configs()
          
    time.sleep(1) # purge all fifo buffers, FIFO bug workaround :)
    purge_str = '#' * 1000 + '99999999'
    for fifo in ['fifo_func', 'fifo_ptz', 'fifo_ptz_preset', 'fifo_settings_wr']:
        
        pipeout = os.open('%s/www/%s' % (kmotion_dir, fifo), os.O_WRONLY)
        os.write(pipeout, purge_str)
        os.close(pipeout)
Пример #9
0
    opt = raw_input('Option letter then ENTER to select : ')

    if (opt == 's'):
        if(daemon_whip.daemons_running()):
            print '\n\033[1;32mDaemons already running ...\033[1;37m'
        else:
            daemon_whip.start_daemons()
            time.sleep(1)
            if(daemon_whip.daemons_running()):
              print '\n\033[1;32mDaemons have been started ...\033[1;37m'
            else:
              print '\n\033[1;31m*WARNING* Unable to start daemons ...\033[1;37m'
              
    elif (opt == 'k'):
        print '\n\033[1;31mStarting to kill daemons ...\033[1;37m'
        daemon_whip.kill_daemons()
        time.sleep(2)
        print '\033[1;31mDaemons have been killed ...\033[1;37m'
    
    elif (opt == 'r'):
        if(daemon_whip.daemons_running()):
            daemon_whip.config_reload()
            print '\n\033[1;33mDaemons config reloaded ...\033[1;37m'
        else:
            print '\n\033[1;31m*WARNING* Daemons not running ...\033[1;37m'
    
    elif (opt =='q'):
        print '\n\033[1;32mQuitting kmotion manual daemon control ...\033[1;37m'
        status = daemon_whip.daemon_status()
        if status['kmotion_hkd1.py']:
            text = '\033[1;32mRunning\033[1;37m'
Пример #10
0
def daemon_diagnostic():
    """
    Generate a primative CLI daemon control menu and act on selections
    
    args    : 
    excepts : 
    return  : none
    """
    
    # set kmotion_dir, remove /core from path
    kmotion_dir = os.getcwd()[:-5]
    # init the ramdisk dir
    init_core.init_ramdisk_dir(kmotion_dir)
    
    print """
kmotion manual daemon control ........"""
    
    while True:
        print """
The Options ....

s: Start Daemons
k: Kill Daemons
r: Reload Daemon configs
q: Quit

ENTER: Refresh"""
        print_status()
        opt = raw_input('Option letter then ENTER to select : ')
        # 's' start daemons - lifted from 'kmotion.py' -------------------------
        if opt == 's':
            if daemon_whip.all_daemons_running():
                print '\nDaemons are already running ...'
                
            else:          
                init_configs(kmotion_dir)
                daemon_whip.start_daemons()
                time.sleep(1)
                if daemon_whip.all_daemons_running():
                    print '\nDaemons have been started ...'
                else:
                    print """
**** W A R N I N G ****
Some daemons refused to start
**** W A R N I N G ****"""
                   
        # 'k' kill daemons -----------------------------------------------------
        elif opt == 'k':
            print '\nDaemons are being killed ... this may take some time ...'
            daemon_whip.kill_daemons()
                
        # 'r' reload daemons ---------------------------------------------------
        elif opt == 'r':
            if daemon_whip.all_daemons_running():
                print '\nDaemons config being reloaded ... this may take some time ...'                
                init_configs(kmotion_dir)
                daemon_whip.reload_all_configs()
            else:
                print """
**** W A R N I N G ****
Some daemons are NOT running so daemon configs have NOT been reloaded
**** W A R N I N G ****"""
        
        # 'q' quit -------------------------------------------------------------
        elif opt =='q':
            print 'Quitting kmotion manual daemon control ...'
            print_status()
            break
Пример #11
0
def main():
    """
    Re-initialises the kmotion core and reload the kmotion daemon configs
       
    args    : start|stop|reload on command line
    excepts : 
    return  : none
    """

    # set kmotion_dir, remove /core from path
    kmotion_dir = os.getcwd()[:-5]

    option = sys.argv[1]
    # if 'stop' shutdown and exit here
    if option == 'stop':
        logger.log('stopping kmotion ...', 'CRIT')
        daemon_whip.kill_daemons()
        return

    elif option == 'start':
        logger.log('starting kmotion ...', 'CRIT')
    elif option == 'restart':
        logger.log('restarting kmotion ...', 'CRIT')

    # check for any invalid motion processes
    p_objs = Popen(
        'ps ax | grep -e [[:space:]]motion | grep -v \'\-c %s/core/motion_conf/motion.conf\''
        % kmotion_dir,
        shell=True,
        stdin=PIPE,
        stdout=PIPE,
        stderr=PIPE,
        close_fds=True)
    line = p_objs.stdout.readline()

    if line != '':
        logger.log('** CRITICAL ERROR ** kmotion failed to start ...', 'CRIT')
        logger.log(
            '** CRITICAL ERROR ** Another instance of motion daemon has been detected',
            'CRIT')
        raise exit_(
            """An instance of the motion daemon has been detected which is not under control 
of kmotion. Please kill this instance and ensure that motion is not started
automatically on system bootup. This a known problem with Ubuntu 8.04 
Reference Bug #235599.""")

    # init the ramdisk dir
    init_core.init_ramdisk_dir(kmotion_dir)

    # init the mutex's
    mutex.init_mutex(kmotion_dir, 'www_rc')
    mutex.init_mutex(kmotion_dir, 'core_rc')
    mutex.init_mutex(kmotion_dir, 'logs')

    parser = mutex_core_parser_rd(kmotion_dir)
    ramdisk_dir = parser.get('dirs', 'ramdisk_dir')

    try:  # wrapping in a try - except because parsing data from kmotion_rc
        init_core.update_rcs(kmotion_dir, ramdisk_dir)
    except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
        raise exit_('corrupt \'kmotion_rc\' : %s' % sys.exc_info()[1])

    try:  # wrapping in a try - except because parsing data from kmotion_rc
        init_core.gen_vhost(kmotion_dir)
    except (ConfigParser.NoSectionError, ConfigParser.NoOptionError):
        raise exit_('corrupt \'kmotion_rc\' : %s' % sys.exc_info()[1])

    # init motion_conf directory with motion.conf, thread1.conf ...
    init_motion.gen_motion_configs(kmotion_dir)

    # speed kmotion startup
    if daemon_whip.no_daemons_running():
        daemon_whip.start_daemons()
    elif daemon_whip.all_daemons_running():
        daemon_whip.reload_all_configs()
    else:
        daemon_whip.start_daemons()
        daemon_whip.reload_all_configs()

    time.sleep(1)  # purge all fifo buffers, FIFO bug workaround :)
    purge_str = '#' * 1000 + '99999999'
    for fifo in [
            'fifo_func', 'fifo_ptz', 'fifo_ptz_preset', 'fifo_settings_wr'
    ]:

        pipeout = os.open('%s/www/%s' % (kmotion_dir, fifo), os.O_WRONLY)
        os.write(pipeout, purge_str)
        os.close(pipeout)