예제 #1
0
def modular_input_should_run(session_key, logger=None):
    """
    Determine if a modular input should run or not.
    Run if and only if:
    1. Node is not a SHC member
    2. Node is an SHC member and is Captain
    @return True if condition satisfies, False otherwise
    """
    if any([
            not isinstance(session_key, basestring),
            isinstance(session_key, basestring) and not session_key.strip()
    ]):
        raise ValueError('Invalid session key')

    info = ServerInfo(session_key, port=getDefault('port'))
    logger = log.getLogger() if not logger else logger

    if not info.is_shc_member():
        return True

    timeout = 300  # 5 minutes
    while timeout > 0:
        try:
            # captain election can take time on a rolling restart.
            if info.is_captain_ready():
                break
        except HTTPError as e:
            if e.status == 503:
                logger.warning(
                    'SHC may be initializing on node `%s`. Captain is not ready. Will try again.',
                    info.server_name)
            else:
                logger.exception('Unexpected exception on node `%s`',
                                 info.server_name)
                raise
        time.sleep(5)
        timeout -= 5

    # we can fairly be certain that even after 5 minutes if `is_captain_ready`
    # is false, there is a problem
    if not info.is_captain_ready():
        raise Exception(
            ('Error. Captain is not ready even after 5 minutes. node=`%s`.'),
            info.server_name)

    return info.is_captain()
 def do_additional_setup(self):
     log_level = self.inputs.get('job').get('log_level', 'INFO')
     self.logger = log.getLogger(logger_name=self.name, log_level=log_level)
     self.check_kvstore_readiness()
     self.session_key = session['authtoken']
     self.dry_run = self.inputs.get('job').get('dry_run',
                                               '').lower() in ('1', 'true')
     server_uri = em_common.get_server_uri()
     self.splunkd_service = Service(
         port=getDefault('port'),
         token=self.session_key,
         owner='nobody',
         app=em_constants.APP_NAME,
     )
     self.app_conf_manager = ConfManager(conf_file=APP_CONF_FILE,
                                         server_uri=server_uri,
                                         session_key=self.session_key,
                                         app=em_constants.APP_NAME)
     self.migration_metadata = MigrationMetadata.get()
     self.current_version = self.migration_metadata.latest_migrated_version
     self.new_version = self.app_conf_manager.get_stanza(
         'launcher')['entry'][0]['content']['version']
     self.data_inputs_controller = NonMigrationDataInputsController()
     self.savedsearch_controller = SavedsearchController()
                          'bin']))  # noqa

import em_path_inject  # noqa
from logging_utils import log
import rest_handler.rest_interface_splunkd as rest_interface_splunkd
from rest_handler.rest_interface_splunkd import route
from rest_handler.session import session
from rest_handler.hooks import before_handle_hooks
from rest_handler.exception import BaseRestException

from em_migration.migration_before_handle_hook import MigrationStatusCheckHook
from authentication_before_rest_hook import AuthenticationRestHook
from em_rest_notifications_impl import EmVictorOpsInterfaceImpl, EmWebhookInterfaceImpl, EmSlackInterfaceImpl
import http.client

logger = log.getLogger()


class NotificationAuthorizationException(BaseRestException):
    def __init__(self, msg):
        super(NotificationAuthorizationException,
              self).__init__(http.client.UNAUTHORIZED, msg)


@before_handle_hooks([MigrationStatusCheckHook, AuthenticationRestHook])
class EmNotificationsInterface(rest_interface_splunkd.BaseRestInterfaceSplunkd
                               ):
    def _check_power_or_greater(self):
        roles = session['roles']
        if ('admin' not in roles and 'sc_admin' not in roles
                and 'power' not in roles):
예제 #4
0
import em_path_inject  # noqa

from splunk import getDefault
from splunklib.client import Service
from solnlib.utils import retry, is_true
from rest_handler.session import session
from logging_utils.log import getLogger
from storage_mixins import KVStoreMixin

import em_constants
from em_base_persistent_object import EMBasePersistentObject

from future.moves.urllib.error import HTTPError
import time

logger = getLogger()


class ProcessControlInternalException(Exception):
    pass


class MigrationProcessControlCheckpoint(EMBasePersistentObject, KVStoreMixin):
    """
    MigrationProcessControlCheckpiont - a checkpoint record where the changes made to processes are
    recorded and persisted to disk to avoid information loss upon migration process crash.
    """

    STORE_MIGRATION_PROCESS_CONTROL_RECORD = 'em_migration_process_control_checkpoint'

    def __init__(self, key, mutated_savedsearches=None):