def project_syncer(logger, loglevel, uri, config_path, sync_period, numworkers, env): """ Wrapper for running opengrok-sync. To be run in a thread/process in the background. """ wait_for_tomcat(logger, uri) set_config_value(logger, 'projectsEnabled', 'true', uri) while True: refresh_projects(logger, uri) if os.environ.get('OPENGROK_SYNC_YML'): # debug only config_file = os.environ.get('OPENGROK_SYNC_YML') else: config_file = os.path.join(fs_root, 'scripts', 'sync.yml') config = read_config(logger, config_file) if config is None: logger.error("Cannot read config file from {}".format(config_file)) raise Exception("no sync config") projects = list_projects(logger, uri) # # The driveon=True is needed for the initial indexing of newly # added project, otherwise the incoming check in the opengrok-mirror # program would short circuit it. # if env: logger.info('Merging commands with environment') commands = merge_commands_env(config["commands"], env) logger.debug(config['commands']) else: commands = config["commands"] logger.info("Sync starting") do_sync(loglevel, commands, config.get('cleanup'), projects, config.get("ignore_errors"), uri, numworkers, driveon=True, logger=logger, print_output=True) logger.info("Sync done") # Workaround for https://github.com/oracle/opengrok/issues/1670 Path(os.path.join(OPENGROK_DATA_ROOT, 'timestamp')).touch() save_config(logger, uri, config_path) sleep_seconds = sync_period * 60 logger.info("Sleeping for {} seconds".format(sleep_seconds)) time.sleep(sleep_seconds)
def refresh_projects(logger, uri): """ Ensure each immediate source root subdirectory is a project. """ webapp_projects = list_projects(logger, uri) logger.debug('Projects from the web app: {}'.format(webapp_projects)) src_root = OPENGROK_SRC_ROOT # Add projects. for item in os.listdir(src_root): logger.debug('Got item {}'.format(item)) if os.path.isdir(os.path.join(src_root, item)): if item not in webapp_projects: logger.info("Adding project {}".format(item)) add_project(logger, item, uri) # Remove projects for item in webapp_projects: if not os.path.isdir(os.path.join(src_root, item)): logger.info("Deleting project {}".format(item)) delete_project(logger, item, uri)