You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

139 lines
4.9 KiB

'''
This script triggers the Event Analytics Rules Engine Java process, collects parameters from inputs.conf,
detects the environment and provides all the arguments to itsirulesengine script.
It generates pulse messages every second to let the Rules Engine know that the mod input is enabled.
'''
import sys
import subprocess
import splunk.rest as rest
import xml.dom.minidom
import json
import time
import logging
import os
from urllib.parse import quote_plus
from splunk.clilib.bundle_paths import make_splunkhome_path
sys.path.append(make_splunkhome_path(['etc', 'apps', 'SA-ITOA', 'lib']))
import itsi_path
from ITOA.itoa_common import modular_input_should_run, is_shc_member, is_shcluster_restarting, \
is_noah_enabled
from SA_ITOA_app_common.solnlib.conf_manager import ConfManager
# initialize logging
sys.path.insert(0, make_splunkhome_path(['etc', 'apps', 'SA-ITOA', 'lib', 'SA_ITOA_app_common']))
from solnlib import log
log.Logs.set_context(log_format='%(asctime)s %(levelname)s %(message)s')
logger = log.Logs().get_logger('itsi_adhoc_re_init')
logger.setLevel(logging.INFO)
SPLUNK_HOME = os.environ.get("SPLUNK_HOME")
def get_args(conf):
arguments = []
cwd = os.path.abspath(SPLUNK_HOME + '/etc/apps/SA-ITOA/bin')
command = os.path.abspath(SPLUNK_HOME + '/etc/apps/SA-ITOA/bin/itsirulesengine')
bash_command = []
for key, value in conf.items():
if key.startswith('command.arg.'):
arguments.append(value)
if os.name == 'nt':
command = command + '.bat'
for args in arguments:
params = args.split('=')
if (len(params) == 2):
params[1] = os.path.abspath(params[1])
args = params[0] + '=' + params[1]
bash_command.append(command)
bash_command = bash_command + arguments
return bash_command, cwd
def is_shcluster_status_check_enabled(conf):
shcluster_status_check_enabled = conf.get('shcluster_status_check', '1') == '1'
if not shcluster_status_check_enabled:
logger.info('SHCluster status check is disabled.')
return shcluster_status_check_enabled
def run_script():
session_key = sys.stdin.readline().strip()
server_uri = rest.makeSplunkdUri()
# log the message for restartless upgrade testing which can be useful while debugging.
logger.info('Restartless upgrade - Reloaded modular input '
'script://$SPLUNK_HOME/etc/apps/SA-ITOA/bin/itsi_adhoc_re_init.py')
if len(session_key) == 0:
logger.error("Did not receive a session key from splunkd. "
+ "Must enable passAuth in inputs.conf for this "
+ "script to run.\n")
exit(2)
cfm = ConfManager(session_key, 'SA-ITOA')
conf = cfm.get_conf('inputs')
script_settings = conf.get('script://$SPLUNK_HOME/etc/apps/SA-ITOA/bin/itsi_adhoc_re_init.py')
shcluster_status_check_enabled = is_shcluster_status_check_enabled(script_settings)
noah_enabled = is_noah_enabled(session_key, logger)
pulse_frequency = int(script_settings.get('pulse_frequency', 20))
if noah_enabled:
logger.info("Skipping Captaincy checks as modular input is running on a Noah stack.")
try:
if ( not noah_enabled and shcluster_status_check_enabled
and is_shc_member(session_key, logger)
and is_shcluster_restarting(session_key, logger) ):
exit(0)
except Exception as e:
logger.error('SHCluster status check failed with error: %s', e)
exit(1)
try:
if not noah_enabled and not modular_input_should_run(session_key, logger=logger):
logger.info("The modular input won't be executed on this node as it's not a Captain of SHC.")
return
logger.info('Rules Engine script has started.')
bash_command, cwd = get_args(script_settings)
logger.info('Generated bash_command=%s and cwd=%s' % (str(bash_command), str(cwd)))
data = dict()
search_info = dict()
search_info['splunkd_uri'] = server_uri
search_info['session_key'] = session_key
data['action'] = 'getinfo'
data['searchinfo'] = search_info
with subprocess.Popen(
bash_command,
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
cwd=cwd
) as process:
while process.poll() is None:
if ( not noah_enabled and shcluster_status_check_enabled
and not modular_input_should_run(session_key, logger=logger) ):
logger.info('SH Captain check failed. Exiting Rules Engine script.')
break
string = json.dumps(data) + '\n'
process.stdin.write(string.encode())
process.stdin.flush()
time.sleep(pulse_frequency)
except Exception as e:
logger.error(str(e))
if __name__ == '__main__':
run_script()
sys.exit(0)