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
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)
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
def main(): """ Waits on the 'fifo_settings_wr' fifo until data received then parse the data and modifiy 'www_rc', also updates 'feeds_cache' ine ... interleave enabled fse ... full screen enabled lbe ... low bandwidth enabled lce ... low CPU enabled skf ... skip archive frames are ... archive button enabled lge ... logs button enabled coe ... config button enabled fue ... func button enabled spa ... msg button enabled abe ... about button enabled loe ... logout button enabled sec ... secure config coh ... config hash code fma ... feed mask fen ... feed enabled fpl ... feed pal fde ... feed device fin ... feed input ful ... feed url fpr ... feed proxy fln ... feed loggin name flp ... feed loggin password fwd ... feed width fhe ... feed height fna ... feed name fbo ... feed show box ffp ... feed fps fpe ... feed snap enabled fsn ... feed snap interval ffe ... feed smovie enabled fme ... feed movie enabled fup ... feed updates psx ... PTZ step x psy ... PTZ step y ptt ... PTZ track type pte ... PTZ enabled ptc ... PTZ calib first pts ... PTZ servo settle ppe ... PTZ park enabled ppd ... PTZ park delay ppx ... PTZ park x ppy ... PTZ park y p1x ... PTZ preset 1 x p1y ... PTZ preset 1 y p2x ... PTZ preset 2 x p2y ... PTZ preset 2 y p3x ... PTZ preset 3 x p3y ... PTZ preset 3 y p4x ... PTZ preset 4 x p4y ... PTZ preset 4 y st1 ... schedule time line 1 st2 ... schedule time line 2 st3 ... schedule time line 3 st4 ... schedule time line 4 st5 ... schedule time line 5 st6 ... schedule time line 6 st7 ... schedule time line 7 ed1 ... exception time line 1 dates ed2 ... exception time line 2 dates ed3 ... exception time line 3 dates ed4 ... exception time line 4 dates ed5 ... exception time line 5 dates ed6 ... exception time line 6 dates ed7 ... exception time line 7 dates et1 ... exception time line 1 et2 ... exception time line 2 et3 ... exception time line 3 et4 ... exception time line 4 et5 ... exception time line 5 et6 ... exception time line 6 et7 ... exception time line 7 dif ... display feeds col ... color select dis ... display select chk ... length check args : excepts : return : none """ logger.log('starting daemon ...', 'CRIT') kmotion_dir = os.getcwd()[:-5] reload_ptz_config = False reload_all_config = False RELOAD_PTZ = ['psx', 'psy', 'ptc', 'pts', 'ppe', 'ppd', 'ppx', 'ppy', 'p1x', 'p1y', 'p2x', 'p2y', 'p3x', 'p3y', 'p4x', 'p4y'] RELOAD_ALL = ['fma', 'fen', 'fpl', 'fde', 'fin', 'ful', 'fpr', 'fln', 'flp', 'fwd', 'fhe', 'fbo', 'ffp', 'fpe', 'fsn', 'ffe', 'fme', 'fup', 'ptt', 'pte', 'st1', 'st2', 'st3', 'st4', 'st5', 'st6', 'st7', 'ed1', 'ed2', 'ed3', 'wd4', 'ed5', 'ed6', 'ed7', 'et1', 'et2', 'et3', 'et4', 'et5', 'et6', 'et7'] update_feeds_cache(kmotion_dir) while True: logger.log('waiting on FIFO pipe data', 'DEBUG') data = subprocess.Popen(['cat', '%s/www/fifo_settings_wr' % kmotion_dir], stdout=subprocess.PIPE).communicate()[0] data = data.rstrip() logger.log('FIFO pipe data: %s' % data, 'DEBUG') if len(data) < 8: continue if len(data) > 7 and data[-8:] == '99999999': # FIFO purge logger.log('FIFO purge', 'DEBUG') continue if int(data[-8:]) != len(data) - 13: # filter checksum logger.log('data checksum error - rejecting data', 'CRIT') continue masks_modified = [] # reset masks changed list parser = mutex_www_parser_rd(kmotion_dir) for raw_data in data.split('$'): if raw_data == '': continue # filter starting '' split_data = raw_data.split(':') if len(split_data[0]) > 3: key = split_data[0][:3] index = int(split_data[0][3:]) else: key = split_data[0] # the 3 digit key ie 'fen' or 'fha' index = 0 # optional list pointer for the id value = split_data[1] if key == 'ine': # interleave parser.set('misc', 'misc1_interleave', num_bool(value)) elif key == 'fse': # full screen parser.set('misc', 'misc1_full_screen', num_bool(value)) elif key == 'lbe': # low bandwidth parser.set('misc', 'misc1_low_bandwidth', num_bool(value)) elif key == 'lce': # low cpu parser.set('misc', 'misc1_low_cpu', num_bool(value)) elif key == 'skf': # skip archive frames enabled parser.set('misc', 'misc1_skip_frames', num_bool(value)) elif key == 'are': # archive button enabled parser.set('misc', 'misc2_archive_button_enabled', num_bool(value)) elif key == 'lge': # logs button enabled parser.set('misc', 'misc2_logs_button_enabled', num_bool(value)) elif key == 'coe': # config button enabled parser.set('misc', 'misc2_config_button_enabled', num_bool(value)) elif key == 'fue': # function button enabled parser.set('misc', 'misc2_func_button_enabled', num_bool(value)) elif key == 'spa': # update button enabled parser.set('misc', 'misc2_msg_button_enabled', num_bool(value)) elif key == 'abe': # about button enabled parser.set('misc', 'misc2_about_button_enabled', num_bool(value)) elif key == 'loe': # logout button enabled parser.set('misc', 'misc2_logout_button_enabled', num_bool(value)) elif key == 'sec': # secure config parser.set('misc', 'misc3_secure', num_bool(value)) elif key == 'coh': # config hash parser.set('misc', 'misc3_config_hash', value) elif key == 'fma': # feed mask parser.set('motion_feed%02i' % index, 'feed_mask', value) masks_modified.append((index, value)) elif key == 'fen': # feed enabled parser.set('motion_feed%02i' % index, 'feed_enabled', num_bool(value)) elif key == 'fpl': # feed pal parser.set('motion_feed%02i' % index, 'feed_pal', num_bool(value)) elif key == 'fde': # feed device parser.set('motion_feed%02i' % index, 'feed_device', value) elif key == 'fin': # feed input parser.set('motion_feed%02i' % index, 'feed_input', value) elif key == 'ful': # feed url parser.set('motion_feed%02i' % index, 'feed_url', de_sanitise(value)) elif key == 'fpr': # feed proxy parser.set('motion_feed%02i' % index, 'feed_proxy', de_sanitise(value)) elif key == 'fln': # feed loggin name parser.set('motion_feed%02i' % index, 'feed_lgn_name', de_sanitise(value)) elif key == 'flp': # feed loggin password # check to see if default *'d password is returned if de_sanitise(value) != '*' * len(parser.get('motion_feed%02i' % index, 'feed_lgn_pw')): parser.set('motion_feed%02i' % index, 'feed_lgn_pw', de_sanitise(value)) elif key == 'fwd': # feed width parser.set('motion_feed%02i' % index, 'feed_width', value) elif key == 'fhe': # feed height parser.set('motion_feed%02i' % index, 'feed_height', value) elif key == 'fna': # feed name parser.set('motion_feed%02i' % index, 'feed_name', de_sanitise(value)) elif key == 'fbo': # feed show box parser.set('motion_feed%02i' % index, 'feed_show_box', num_bool(value)) elif key == 'ffp': # feed fps parser.set('motion_feed%02i' % index, 'feed_fps', value) elif key == 'fpe': # feed snap enabled parser.set('motion_feed%02i' % index, 'feed_snap_enabled', num_bool(value)) elif key == 'fsn': # feed snap interval parser.set('motion_feed%02i' % index, 'feed_snap_interval', value) elif key == 'ffe': # feed smovie enabled parser.set('motion_feed%02i' % index, 'feed_smovie_enabled', num_bool(value)) elif key == 'fme': # feed movie enabled parser.set('motion_feed%02i' % index, 'feed_movie_enabled', num_bool(value)) elif key == 'psx': # ptz step x parser.set('motion_feed%02i' % index, 'ptz_step_x', value) elif key == 'psy': # ptz step y parser.set('motion_feed%02i' % index, 'ptz_step_y', value) elif key == 'ptt': # ptz calib first parser.set('motion_feed%02i' % index, 'ptz_track_type', value) elif key == 'pte': # ptz enabled parser.set('motion_feed%02i' % index, 'ptz_enabled', num_bool(value)) elif key == 'ptc': # ptz calib first parser.set('motion_feed%02i' % index, 'ptz_calib_first', num_bool(value)) elif key == 'pts': # ptz servo settle parser.set('motion_feed%02i' % index, 'ptz_servo_settle', value) elif key == 'ppe': # ptz park enable parser.set('motion_feed%02i' % index, 'ptz_park_enabled', num_bool(value)) elif key == 'ppd': # ptz park delay parser.set('motion_feed%02i' % index, 'ptz_park_delay', value) elif key == 'ppx': # ptz park x parser.set('motion_feed%02i' % index, 'ptz_park_x', value) elif key == 'ppy': # ptz park y parser.set('motion_feed%02i' % index, 'ptz_park_y', value) elif key == 'p1x': # ptz preset 1 x parser.set('motion_feed%02i' % index, 'ptz_preset1_x', value) elif key == 'p1y': # ptz preset 1 y parser.set('motion_feed%02i' % index, 'ptz_preset1_y', value) elif key == 'p2x': # ptz preset 2 x parser.set('motion_feed%02i' % index, 'ptz_preset2_x', value) elif key == 'p2y': # ptz preset 2 y parser.set('motion_feed%02i' % index, 'ptz_preset2_y', value) elif key == 'p3x': # ptz preset 3 x parser.set('motion_feed%02i' % index, 'ptz_preset3_x', value) elif key == 'p3y': # ptz preset 3 y parser.set('motion_feed%02i' % index, 'ptz_preset3_y', value) elif key == 'p4x': # ptz preset 4 x parser.set('motion_feed%02i' % index, 'ptz_preset4_x', value) elif key == 'p4y': # ptz preset 4 y parser.set('motion_feed%02i' % index, 'ptz_preset4_y', value) elif key == 'st1': # schedule time line 1 parser.set('schedule%i' % index, 'tline1', value) elif key == 'st2': # schedule time line 2 parser.set('schedule%i' % index, 'tline2', value) elif key == 'st3': # schedule time line 3 parser.set('schedule%i' % index, 'tline3', value) elif key == 'st4': # schedule time line 4 parser.set('schedule%i' % index, 'tline4', value) elif key == 'st5': # schedule time line 5 parser.set('schedule%i' % index, 'tline5', value) elif key == 'st6': # schedule time line 6 parser.set('schedule%i' % index, 'tline6', value) elif key == 'st7': # schedule time line 7 parser.set('schedule%i' % index, 'tline7', value) elif key == 'ed1': # exception time line 1 dates parser.set('schedule_except%i' % index, 'tline1_dates', value) elif key == 'ed2': # exception time line 2 dates parser.set('schedule_except%i' % index, 'tline2_dates', value) elif key == 'ed3': # exception time line 3 dates parser.set('schedule_except%i' % index, 'tline3_dates', value) elif key == 'ed4': # exception time line 4 dates parser.set('schedule_except%i' % index, 'tline4_dates', value) elif key == 'ed5': # exception time line 5 dates parser.set('schedule_except%i' % index, 'tline5_dates', value) elif key == 'ed6': # exception time line 6 dates parser.set('schedule_except%i' % index, 'tline6_dates', value) elif key == 'ed7': # exception time line 7 dates parser.set('schedule_except%i' % index, 'tline7_dates', value) elif key == 'et1': # exception time line 1 parser.set('schedule_except%i' % index, 'tline1', value) elif key == 'et2': # exception time line 2 parser.set('schedule_except%i' % index, 'tline2', value) elif key == 'et3': # exception time line 3 parser.set('schedule_except%i' % index, 'tline3', value) elif key == 'et4': # exception time line 4 parser.set('schedule_except%i' % index, 'tline4', value) elif key == 'et5': # exception time line 5 parser.set('schedule_except%i' % index, 'tline5', value) elif key == 'et6': # exception time line 6 parser.set('schedule_except%i' % index, 'tline6', value) elif key == 'et7': # exception time line 7 parser.set('schedule_except%i' % index, 'tline7', value) elif key == 'dif': # display feeds parser.set('misc', 'misc4_display_feeds_%02i' % index, value) elif key == 'col': # color select parser.set('misc', 'misc4_color_select', value) elif key == 'dis': # display select parser.set('misc', 'misc4_display_select', value) # if key fits flag for reload everything including the ptz daemon, # motion and everything else, slow and painfull if key in RELOAD_ALL : reload_all_config = True # if key fits flag for reload the ptz daemon only. the ptz daemon is # quick to reload and does not have the crashy pants of a motion # reload ! if key in RELOAD_PTZ : reload_ptz_config = True mutex_www_parser_wr(kmotion_dir, parser) mutex.acquire(kmotion_dir, 'www_rc') sort_rc.sort_rc('%s/www/www_rc' % kmotion_dir) mutex.release(kmotion_dir, 'www_rc') update_feeds_cache(kmotion_dir) # has to be here, image width, height have to be written to 'www_rc' # before mask can be made for i in range(len(masks_modified)): create_mask(kmotion_dir, masks_modified[i][0], masks_modified[i][1]) if reload_all_config: init_motion.gen_motion_configs(kmotion_dir) daemon_whip.reload_all_configs() reload_all_config = False reload_ptz_config = False continue # skip 'reload_ptz_config', already done if reload_ptz_config: daemon_whip.reload_ptz_config() reload_ptz_config = False
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)
def main(): """ Waits on the 'fifo_settings_wr' fifo until data received then parse the data and modifiy 'www_rc', also updates 'feeds_cache' ine ... interleave enabled fse ... full screen enabled lbe ... low bandwidth enabled lce ... low CPU enabled skf ... skip archive frames are ... archive button enabled lge ... logs button enabled coe ... config button enabled fue ... func button enabled spa ... msg button enabled abe ... about button enabled loe ... logout button enabled sec ... secure config coh ... config hash code fma ... feed mask fen ... feed enabled fpl ... feed pal fde ... feed device fin ... feed input ful ... feed url fpr ... feed proxy fln ... feed loggin name flp ... feed loggin password fwd ... feed width fhe ... feed height fna ... feed name fbo ... feed show box ffp ... feed fps fpe ... feed snap enabled fsn ... feed snap interval ffe ... feed smovie enabled fme ... feed movie enabled fup ... feed updates psx ... PTZ step x psy ... PTZ step y ptt ... PTZ track type pte ... PTZ enabled ptc ... PTZ calib first pts ... PTZ servo settle ppe ... PTZ park enabled ppd ... PTZ park delay ppx ... PTZ park x ppy ... PTZ park y p1x ... PTZ preset 1 x p1y ... PTZ preset 1 y p2x ... PTZ preset 2 x p2y ... PTZ preset 2 y p3x ... PTZ preset 3 x p3y ... PTZ preset 3 y p4x ... PTZ preset 4 x p4y ... PTZ preset 4 y st1 ... schedule time line 1 st2 ... schedule time line 2 st3 ... schedule time line 3 st4 ... schedule time line 4 st5 ... schedule time line 5 st6 ... schedule time line 6 st7 ... schedule time line 7 ed1 ... exception time line 1 dates ed2 ... exception time line 2 dates ed3 ... exception time line 3 dates ed4 ... exception time line 4 dates ed5 ... exception time line 5 dates ed6 ... exception time line 6 dates ed7 ... exception time line 7 dates et1 ... exception time line 1 et2 ... exception time line 2 et3 ... exception time line 3 et4 ... exception time line 4 et5 ... exception time line 5 et6 ... exception time line 6 et7 ... exception time line 7 dif ... display feeds col ... color select dis ... display select chk ... length check args : excepts : return : none """ logger.log('starting daemon ...', 'CRIT') kmotion_dir = os.getcwd()[:-5] reload_ptz_config = False reload_all_config = False RELOAD_PTZ = [ 'psx', 'psy', 'ptc', 'pts', 'ppe', 'ppd', 'ppx', 'ppy', 'p1x', 'p1y', 'p2x', 'p2y', 'p3x', 'p3y', 'p4x', 'p4y' ] RELOAD_ALL = [ 'fma', 'fen', 'fpl', 'fde', 'fin', 'ful', 'fpr', 'fln', 'flp', 'fwd', 'fhe', 'fbo', 'ffp', 'fpe', 'fsn', 'ffe', 'fme', 'fup', 'ptt', 'pte', 'st1', 'st2', 'st3', 'st4', 'st5', 'st6', 'st7', 'ed1', 'ed2', 'ed3', 'wd4', 'ed5', 'ed6', 'ed7', 'et1', 'et2', 'et3', 'et4', 'et5', 'et6', 'et7' ] update_feeds_cache(kmotion_dir) while True: logger.log('waiting on FIFO pipe data', 'DEBUG') data = subprocess.Popen( ['cat', '%s/www/fifo_settings_wr' % kmotion_dir], stdout=subprocess.PIPE).communicate()[0] data = data.rstrip() logger.log('FIFO pipe data: %s' % data, 'DEBUG') if len(data) < 8: continue if len(data) > 7 and data[-8:] == '99999999': # FIFO purge logger.log('FIFO purge', 'DEBUG') continue if int(data[-8:]) != len(data) - 13: # filter checksum logger.log('data checksum error - rejecting data', 'CRIT') continue masks_modified = [] # reset masks changed list parser = mutex_www_parser_rd(kmotion_dir) for raw_data in data.split('$'): if raw_data == '': continue # filter starting '' split_data = raw_data.split(':') if len(split_data[0]) > 3: key = split_data[0][:3] index = int(split_data[0][3:]) else: key = split_data[0] # the 3 digit key ie 'fen' or 'fha' index = 0 # optional list pointer for the id value = split_data[1] if key == 'ine': # interleave parser.set('misc', 'misc1_interleave', num_bool(value)) elif key == 'fse': # full screen parser.set('misc', 'misc1_full_screen', num_bool(value)) elif key == 'lbe': # low bandwidth parser.set('misc', 'misc1_low_bandwidth', num_bool(value)) elif key == 'lce': # low cpu parser.set('misc', 'misc1_low_cpu', num_bool(value)) elif key == 'skf': # skip archive frames enabled parser.set('misc', 'misc1_skip_frames', num_bool(value)) elif key == 'are': # archive button enabled parser.set('misc', 'misc2_archive_button_enabled', num_bool(value)) elif key == 'lge': # logs button enabled parser.set('misc', 'misc2_logs_button_enabled', num_bool(value)) elif key == 'coe': # config button enabled parser.set('misc', 'misc2_config_button_enabled', num_bool(value)) elif key == 'fue': # function button enabled parser.set('misc', 'misc2_func_button_enabled', num_bool(value)) elif key == 'spa': # update button enabled parser.set('misc', 'misc2_msg_button_enabled', num_bool(value)) elif key == 'abe': # about button enabled parser.set('misc', 'misc2_about_button_enabled', num_bool(value)) elif key == 'loe': # logout button enabled parser.set('misc', 'misc2_logout_button_enabled', num_bool(value)) elif key == 'sec': # secure config parser.set('misc', 'misc3_secure', num_bool(value)) elif key == 'coh': # config hash parser.set('misc', 'misc3_config_hash', value) elif key == 'fma': # feed mask parser.set('motion_feed%02i' % index, 'feed_mask', value) masks_modified.append((index, value)) elif key == 'fen': # feed enabled parser.set('motion_feed%02i' % index, 'feed_enabled', num_bool(value)) elif key == 'fpl': # feed pal parser.set('motion_feed%02i' % index, 'feed_pal', num_bool(value)) elif key == 'fde': # feed device parser.set('motion_feed%02i' % index, 'feed_device', value) elif key == 'fin': # feed input parser.set('motion_feed%02i' % index, 'feed_input', value) elif key == 'ful': # feed url parser.set('motion_feed%02i' % index, 'feed_url', de_sanitise(value)) elif key == 'fpr': # feed proxy parser.set('motion_feed%02i' % index, 'feed_proxy', de_sanitise(value)) elif key == 'fln': # feed loggin name parser.set('motion_feed%02i' % index, 'feed_lgn_name', de_sanitise(value)) elif key == 'flp': # feed loggin password # check to see if default *'d password is returned if de_sanitise(value) != '*' * len( parser.get('motion_feed%02i' % index, 'feed_lgn_pw')): parser.set('motion_feed%02i' % index, 'feed_lgn_pw', de_sanitise(value)) elif key == 'fwd': # feed width parser.set('motion_feed%02i' % index, 'feed_width', value) elif key == 'fhe': # feed height parser.set('motion_feed%02i' % index, 'feed_height', value) elif key == 'fna': # feed name parser.set('motion_feed%02i' % index, 'feed_name', de_sanitise(value)) elif key == 'fbo': # feed show box parser.set('motion_feed%02i' % index, 'feed_show_box', num_bool(value)) elif key == 'ffp': # feed fps parser.set('motion_feed%02i' % index, 'feed_fps', value) elif key == 'fpe': # feed snap enabled parser.set('motion_feed%02i' % index, 'feed_snap_enabled', num_bool(value)) elif key == 'fsn': # feed snap interval parser.set('motion_feed%02i' % index, 'feed_snap_interval', value) elif key == 'ffe': # feed smovie enabled parser.set('motion_feed%02i' % index, 'feed_smovie_enabled', num_bool(value)) elif key == 'fme': # feed movie enabled parser.set('motion_feed%02i' % index, 'feed_movie_enabled', num_bool(value)) elif key == 'psx': # ptz step x parser.set('motion_feed%02i' % index, 'ptz_step_x', value) elif key == 'psy': # ptz step y parser.set('motion_feed%02i' % index, 'ptz_step_y', value) elif key == 'ptt': # ptz calib first parser.set('motion_feed%02i' % index, 'ptz_track_type', value) elif key == 'pte': # ptz enabled parser.set('motion_feed%02i' % index, 'ptz_enabled', num_bool(value)) elif key == 'ptc': # ptz calib first parser.set('motion_feed%02i' % index, 'ptz_calib_first', num_bool(value)) elif key == 'pts': # ptz servo settle parser.set('motion_feed%02i' % index, 'ptz_servo_settle', value) elif key == 'ppe': # ptz park enable parser.set('motion_feed%02i' % index, 'ptz_park_enabled', num_bool(value)) elif key == 'ppd': # ptz park delay parser.set('motion_feed%02i' % index, 'ptz_park_delay', value) elif key == 'ppx': # ptz park x parser.set('motion_feed%02i' % index, 'ptz_park_x', value) elif key == 'ppy': # ptz park y parser.set('motion_feed%02i' % index, 'ptz_park_y', value) elif key == 'p1x': # ptz preset 1 x parser.set('motion_feed%02i' % index, 'ptz_preset1_x', value) elif key == 'p1y': # ptz preset 1 y parser.set('motion_feed%02i' % index, 'ptz_preset1_y', value) elif key == 'p2x': # ptz preset 2 x parser.set('motion_feed%02i' % index, 'ptz_preset2_x', value) elif key == 'p2y': # ptz preset 2 y parser.set('motion_feed%02i' % index, 'ptz_preset2_y', value) elif key == 'p3x': # ptz preset 3 x parser.set('motion_feed%02i' % index, 'ptz_preset3_x', value) elif key == 'p3y': # ptz preset 3 y parser.set('motion_feed%02i' % index, 'ptz_preset3_y', value) elif key == 'p4x': # ptz preset 4 x parser.set('motion_feed%02i' % index, 'ptz_preset4_x', value) elif key == 'p4y': # ptz preset 4 y parser.set('motion_feed%02i' % index, 'ptz_preset4_y', value) elif key == 'st1': # schedule time line 1 parser.set('schedule%i' % index, 'tline1', value) elif key == 'st2': # schedule time line 2 parser.set('schedule%i' % index, 'tline2', value) elif key == 'st3': # schedule time line 3 parser.set('schedule%i' % index, 'tline3', value) elif key == 'st4': # schedule time line 4 parser.set('schedule%i' % index, 'tline4', value) elif key == 'st5': # schedule time line 5 parser.set('schedule%i' % index, 'tline5', value) elif key == 'st6': # schedule time line 6 parser.set('schedule%i' % index, 'tline6', value) elif key == 'st7': # schedule time line 7 parser.set('schedule%i' % index, 'tline7', value) elif key == 'ed1': # exception time line 1 dates parser.set('schedule_except%i' % index, 'tline1_dates', value) elif key == 'ed2': # exception time line 2 dates parser.set('schedule_except%i' % index, 'tline2_dates', value) elif key == 'ed3': # exception time line 3 dates parser.set('schedule_except%i' % index, 'tline3_dates', value) elif key == 'ed4': # exception time line 4 dates parser.set('schedule_except%i' % index, 'tline4_dates', value) elif key == 'ed5': # exception time line 5 dates parser.set('schedule_except%i' % index, 'tline5_dates', value) elif key == 'ed6': # exception time line 6 dates parser.set('schedule_except%i' % index, 'tline6_dates', value) elif key == 'ed7': # exception time line 7 dates parser.set('schedule_except%i' % index, 'tline7_dates', value) elif key == 'et1': # exception time line 1 parser.set('schedule_except%i' % index, 'tline1', value) elif key == 'et2': # exception time line 2 parser.set('schedule_except%i' % index, 'tline2', value) elif key == 'et3': # exception time line 3 parser.set('schedule_except%i' % index, 'tline3', value) elif key == 'et4': # exception time line 4 parser.set('schedule_except%i' % index, 'tline4', value) elif key == 'et5': # exception time line 5 parser.set('schedule_except%i' % index, 'tline5', value) elif key == 'et6': # exception time line 6 parser.set('schedule_except%i' % index, 'tline6', value) elif key == 'et7': # exception time line 7 parser.set('schedule_except%i' % index, 'tline7', value) elif key == 'dif': # display feeds parser.set('misc', 'misc4_display_feeds_%02i' % index, value) elif key == 'col': # color select parser.set('misc', 'misc4_color_select', value) elif key == 'dis': # display select parser.set('misc', 'misc4_display_select', value) # if key fits flag for reload everything including the ptz daemon, # motion and everything else, slow and painfull if key in RELOAD_ALL: reload_all_config = True # if key fits flag for reload the ptz daemon only. the ptz daemon is # quick to reload and does not have the crashy pants of a motion # reload ! if key in RELOAD_PTZ: reload_ptz_config = True mutex_www_parser_wr(kmotion_dir, parser) mutex.acquire(kmotion_dir, 'www_rc') sort_rc.sort_rc('%s/www/www_rc' % kmotion_dir) mutex.release(kmotion_dir, 'www_rc') update_feeds_cache(kmotion_dir) # has to be here, image width, height have to be written to 'www_rc' # before mask can be made for i in range(len(masks_modified)): create_mask(kmotion_dir, masks_modified[i][0], masks_modified[i][1]) if reload_all_config: init_motion.gen_motion_configs(kmotion_dir) daemon_whip.reload_all_configs() reload_all_config = False reload_ptz_config = False continue # skip 'reload_ptz_config', already done if reload_ptz_config: daemon_whip.reload_ptz_config() reload_ptz_config = False