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.

121 lines
4.6 KiB

# Copyright (C) 2005-2024 Splunk Inc. All Rights Reserved.
'''
A script that allows for the following:
- Register the ITSI diag utility function with the core diag infrastructure.
- Collect ITSI specific diag information.
For Detail diag information, refer to the following wiki:
https://confluence.splunk.com/display/CMTY/App-extensions+to+Diag
'''
import os
import re
import sys
from splunk.clilib.bundle_paths import make_splunkhome_path
sys.path.append(make_splunkhome_path(['etc', 'apps', 'SA-ITOA', 'lib']))
sys.path.append(make_splunkhome_path(['etc', 'apps', 'SA-ITOA', 'lib', 'SA_ITOA_app_common']))
import itsi_path
from ITOA.itoa_config import get_supported_objects
from ITOA.setup_logging import logger
SCRIPT_NAME = __file__
FILE_EXTENSION = '.json'
# using the **args pattern to ignore options we don't care about.
def setup(parser=None, app_dir=None, callback=None, **kwargs):
"""
This is a diag registry function which registers the app diag utility function with the
diag infrastructure in the core.
@type parser: function object
@param parser: parser function
@type app_dir: string
@param app_dir: location of the application directory
@type callback: function object
@param callback: any callback function
@type **kwargs: string tuples
@param **kwargs: any optional arguments
@rtype None
@return: None
"""
logger.debug("[ITSI Diag] in setup")
if callback is not None:
callback.will_need_rest()
logger.info("[ITSI Diag] Diag extensions initialized")
def collect_diag_info(diag, options=None, global_options=None, app_dir=None, **args):
"""
This is the actual diag collection implementation for ITSI
@type diag: function object
@param diag: callback diag function pointer
@type options: string
@param options: diag options
@type global_options: string
@param global_options: diag options
@type app_dir: string
@param app_dir: location of the application
@type **args: string tuples
@param **kwargs: any optional arguments
@rtype None
@return: None
"""
logger.info("[ITSI Diag] Collecting Diag from ITSI")
logger.debug("[ITSI Diag] in collect_diag_info")
total_count = 0
SPLUNK_HOME = os.environ['SPLUNK_HOME']
# Build up a list of collections to be collected and sent to diag.
# User have to enter a list of the apps that are ITSI relevant.
# The collecting utility will parse the all the specific collections from
# <APP_Name>/default/collections.conf file.
CONF_FILE = '/default/collections.conf'
KVSTORE_RST_PATH = '/servicesNS/nobody/%s/storage/collections/data/'
# List of apps that are related to ITSI
app_list = ['SA-ITOA',
'SA-ITSI-ATAD',
'SA-UserAccess']
kvstore_collections = []
# Parse the etc/apps/<app_name>/default/collections.conf file
# and retrieve a list of the kvstore collections.
# Retrieve the kvstore content directly via restful endpoints.
try:
for app in app_list:
final_app_rst_path = KVSTORE_RST_PATH % app
target_path = (SPLUNK_HOME + '/etc/apps/' + '%s' + CONF_FILE) % app
logger.info("[ITSI Diag] Retrieve kvstore collection list from %s." % target_path)
# Parsing of the collections.conf is based on the standard collections file format.
# Assumes that collection name are identified by [], such as
# [<collection-name>]
# The following parsing logic will look for [ and ], extract the collection name
# and ignore the rest of the collection options.
# Format of collections.conf can be found in the following official Splunk linkL
# http://docs.splunk.com/Documentation/Splunk/latest/Admin/Collectionsconf
for line in open(os.path.abspath(target_path), 'r').readlines():
keyword = re.search(r'\[(.*)\]', line)
if keyword:
kvstore_collections.append(keyword.group(1))
for collection in kvstore_collections:
full_rst_uri = final_app_rst_path + collection
diag_json_file = collection + FILE_EXTENSION
diag.add_rest_endpoint(full_rst_uri, diag_json_file)
logger.info("[ITSI Diag] Collect %s into ITSI diag" % full_rst_uri)
total_count += len(kvstore_collections)
kvstore_collections[:] = []
logger.info("[ITSI Diag] Total number of %s collections have been captured" % total_count)
except Exception:
logger.exception("[ITSI Diag] Unable to locate the kvstore collection.")
pass