Ejemplo n.º 1
0
def merge_conf_file(src_file, dst_file, merge_mode="stanza_overwrite"):
    if not os.path.isfile(src_file):
        return
    if not os.path.isfile(dst_file):
        return
    if bn(src_file) in merge_black_list:
        return

    parser = TABConfigParser()
    parser.read(src_file)
    src_dict = parser.item_dict()
    parser.read(dst_file)
    dst_dict = parser.item_dict()

    if merge_mode == "stanza_overwrite":
        for stanza, key_values in src_dict.items():
            if stanza in dst_dict:
                parser.remove_section(stanza)

            parser.add_section(stanza)

            for k, v in key_values.items():
                parser.set(stanza, k, v)
    elif merge_mode == "item_overwrite":
        for stanza, key_values in src_dict.items():
            if stanza not in dst_dict:
                parser.add_section(stanza)

            for k, v in key_values.items():
                if v:
                    parser.set(stanza, k, v)
                else:
                    parser.remove_option(stanza, k)
    else:
        # overwrit the whole file
        parser.read(src_file)

    with open(dst_file, "w") as df:
        parser.write(df)
Ejemplo n.º 2
0
def remove_alert_from_conf_file(alert, conf_file, logger):
    if not alert or not conf_file:
        logger.info('alert="%s", conf_file="%s"', alert, conf_file)
        return

    if not isinstance(alert, dict):
        msg = 'alert="{}", event="alert is not a dict, don\'t remove anything form file {}"'.format(alert, conf_file)
        raise aae.AlertCleaningFormatFailure(msg)

    parser = TABConfigParser()
    parser.read(conf_file)
    conf_dict = parser.item_dict()

    for stanza, key_values in conf_dict.items():
        if stanza == alert[ac.SHORT_NAME] or \
            stanza == alert[ac.SHORT_NAME] + "_modaction_result" or \
                stanza == "eventtype=" + alert[ac.SHORT_NAME] + "_modaction_result":
            logger.info('alert="%s", conf_file="%s", stanza="%s"',
                        alert[ac.SHORT_NAME],
                        conf_file, stanza)
            parser.remove_section(stanza)

    with open(conf_file, "w") as cf:
        parser.write(cf)
Ejemplo n.º 3
0
class App(object):
    """
    The splunk app object
    """
    BUILDER_VERSION = 'builder_version'
    BUILDER_BUILD = 'builder_build'
    IS_EDITED = 'is_edited'

    def __init__(self, app_name, service):
        self._app_path = os.path.join(os.environ['SPLUNK_HOME'], 'etc', 'apps',
                                      app_name)
        if not os.path.isdir(self._app_path):
            raise Exception("App directory {} not found.".format(
                self._app_path))
        self._app = app_name
        self.logger = logger.get_app_instance_logger()
        self.tabuilder_conf = {}
        self.conf_parser = None
        self._service = service
        self.tabuilder_conf_file = os.path.join(self._app_path, 'default',
                                                'addon_builder.conf')
        self.logger.info("App instance '%s' is created.", self._app)

    def is_powered_by_tab(self):
        return os.path.isfile(self.tabuilder_conf_file)

    def _load_tabuilder_conf(self):
        if not self.conf_parser:
            self.conf_parser = TABConfigParser()
            if os.path.isfile(self.tabuilder_conf_file):
                self.conf_parser.read(self.tabuilder_conf_file)
        self.tabuilder_conf = self.conf_parser.item_dict()

    def get_tabuilder_version(self):
        """
        get the tabuilder version for this app.
        """
        self._load_tabuilder_conf()
        tab_version = '1.0.1'  # no tab_conf, it is 1.0.1
        if 'base' in self.tabuilder_conf:
            base = self.tabuilder_conf['base']
            tab_version = base.get(App.BUILDER_VERSION, '1.0.1')
        return tab_version

    def get_tabuilder_build(self):
        self._load_tabuilder_conf()
        return self.tabuilder_conf.get('base', {}).get(App.BUILDER_VERSION,
                                                       None)

    def update_tabuilder_version(self, version, build=None):
        self._load_tabuilder_conf()
        if 'base' not in self.tabuilder_conf:
            self.conf_parser.add_section('base')

        self.conf_parser.set('base', App.BUILDER_VERSION, version)
        if build:
            self.conf_parser.set('base', App.BUILDER_BUILD, build)
        with open(self.tabuilder_conf_file, "w") as f:
            self.conf_parser.write(f)

    def update_is_edited_flag(self, is_edited):
        self._load_tabuilder_conf()
        if 'base' not in self.tabuilder_conf:
            self.conf_parser.add_section('base')
        flag = '1' if is_edited else '0'
        self.conf_parser.set('base', App.IS_EDITED, flag)
        with open(self.tabuilder_conf_file, 'w') as f:
            self.conf_parser.write(f)

    def upgrade(self, ta_builder=None):
        latest_tab_version, latest_tab_build = upgrade_util.get_latest_tabuilder_version(
            self._service)
        if not latest_tab_version:
            raise Exception("tabuilder version is unknown.")
        current_tab_version = self.get_tabuilder_version()
        if ta_builder:
            self.logger.debug(
                "Try to upgrade app %s from verison %s to version %s",
                self._app, current_tab_version, latest_tab_version)
            ta_builder.upgrade(current_tab_version, latest_tab_version)
        self.logger.debug("Upgrade app %s successfully.", self._app)
        self.update_tabuilder_version(latest_tab_version, latest_tab_build)
Ejemplo n.º 4
0
def _merge_conf_file(app_root_dir, conf_file_name):
    '''
    :param app_root_dir: the root directory full path
    :param conf_file_name: the conf file short path, like 'app.conf'. It must endswith ".conf"
    '''
    if not conf_file_name.endswith('.conf'):
        _logger.error('%s is not a conf file. Can not merge it.',
                         conf_file_name)
        return
    dft_conf = os.path.join(app_root_dir, "default", conf_file_name)
    usr_conf = os.path.join(app_root_dir, "local", conf_file_name)
    if os.path.isfile(dft_conf):
        if os.path.isfile(usr_conf):
            parser = TABConfigParser()
            parser.read(usr_conf)
            # for the inputs.conf, filter all the input instance stanzas in local conf
            if usr_conf.split(os.path.sep)[-1] == 'inputs.conf':
                to_be_delete_sections = [s for s in parser.sections() if len(s.split("://")) == 2]
                if to_be_delete_sections:
                    _logger.info("Remove stanzas %s in conf %s", to_be_delete_sections, usr_conf)
                for s in to_be_delete_sections:
                    parser.remove_section(s)

            local_dict = parser.item_dict()
            parser.read(dft_conf)
            default_dict = parser.item_dict()
            # overwrite the key values by local dict
            for stanza, key_values in list(local_dict.items()):
                if stanza not in default_dict:
                    parser.add_section(stanza)
                for k, v in list(key_values.items()):
                    parser.set(stanza, k, v)

            with open(dft_conf, "w") as conf_file:
                parser.write(conf_file)

            _logger.info("%s is merged to %s", usr_conf, dft_conf)
        else:
            _logger.debug("No need to merge. User Conf %s not found!",
                             usr_conf)
    else:
        if os.path.isfile(usr_conf):
            p = TABConfigParser()
            p.read(usr_conf)
            if p.sections() or p.fields_outside_stanza:
                shutil.copyfile(usr_conf, dft_conf)
                _logger.info("copy %s to %s, because %s not found.", usr_conf, dft_conf, dft_conf)
            else:
                os.remove(usr_conf)
                _logger.info('remove {} because it is a empty conf file.'.format(usr_conf))
                return
        else:
            _logger.error(
                "Both default conf %s and user conf %s are not found!",
                dft_conf, usr_conf)
            return
    # if it is inputs.conf, set default disabled = 0
    if (conf_file_name.split(os.path.sep)[-1]
        ) == 'inputs.conf' and os.path.isfile(dft_conf):
        parser = TABConfigParser()
        parser.read(dft_conf)
        item_dict = parser.item_dict()
        for section, key_values in list(item_dict.items()):
            splits = section.split("://")
            # it's default section
            if len(splits) == 1:
                parser.set(section, "disabled", 0)

        with open(dft_conf, "w") as fp:
            parser.write(fp)