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.
155 lines
5.2 KiB
155 lines
5.2 KiB
'''
|
|
This script automatically collects icons from glasstable_icon_library.conf and imports them to the KV store icon collection.
|
|
It utilizes icon_collection endpoint from apiiconcollection.
|
|
Icons with conflicting names not imported.
|
|
|
|
@author lbudchenko
|
|
'''
|
|
|
|
from builtins import str
|
|
import sys
|
|
import splunk.rest as rest
|
|
import json
|
|
import logging
|
|
from splunk.clilib.bundle_paths import make_splunkhome_path
|
|
|
|
sys.path.append(make_splunkhome_path(['etc', 'apps', 'SA-ITOA', 'lib']))
|
|
import itsi_path
|
|
from itsi_py3 import _
|
|
from ITOA.storage.itoa_storage import ITOAStorage
|
|
|
|
ICON_COLLECTION_ENDPOINT = 'services/%s/v1/icon_collection' % 'SA-ITSI-Licensechecker'
|
|
|
|
# initialize logging
|
|
sys.path.insert(0, make_splunkhome_path(['etc', 'apps', 'SA-ITSI-Licensechecker', 'lib', 'SA_ITSI_Licensechecker_app_common']))
|
|
from SA_ITOA_app_common.solnlib.server_info import ServerInfo
|
|
from solnlib import log
|
|
log.Logs.set_context(log_format='%(asctime)s %(levelname)s %(message)s')
|
|
logger = log.Logs().get_logger('gt_icon_collection')
|
|
logger.setLevel(logging.INFO)
|
|
|
|
def get_conf(session_key, conf_name, count=0, app='-'):
|
|
'''
|
|
Retrieves data from a conf file
|
|
'''
|
|
getargs = {'output_mode': 'json', 'count': count}
|
|
path = rest.makeSplunkdUri() + 'servicesNS/nobody/' + app + '/configs/conf-' + conf_name
|
|
response, content = rest.simpleRequest(
|
|
path,
|
|
method='GET',
|
|
getargs=getargs,
|
|
sessionKey=session_key,
|
|
raiseAllErrors=False
|
|
)
|
|
if response.status != 200:
|
|
logger.error('Failed to load config: %s.' % path)
|
|
|
|
return {'response': response, 'content': content}
|
|
|
|
def conf_to_json(conf):
|
|
'''
|
|
Converts response object from conf request to json object formatted for icon_collection endpoint
|
|
Skips duplicates.
|
|
'''
|
|
entries = conf['entry']
|
|
iconsInfo = [entry['content'] for entry in entries]
|
|
icons = []
|
|
seen = []
|
|
for iconInfo in iconsInfo:
|
|
label = iconInfo['iconLabel']
|
|
category = iconInfo['iconCategory']
|
|
if (label,category) in seen:
|
|
continue # skip duplicates
|
|
icon = {
|
|
'title': label,
|
|
'category': category,
|
|
'default_width': iconInfo['defaultWidth'],
|
|
'default_height': iconInfo['defaultHeight'],
|
|
'svg_path': iconInfo['svgPath']
|
|
}
|
|
icons.append(icon)
|
|
seen.append((label,category))
|
|
return icons
|
|
|
|
def get_all_icons_from_kvstore(session_key):
|
|
'''
|
|
Requests a list of icons from KV store to check for conflicts
|
|
'''
|
|
getargs = {'fields': 'title,category'}
|
|
path = rest.makeSplunkdUri() + ICON_COLLECTION_ENDPOINT
|
|
response, content = rest.simpleRequest(
|
|
path,
|
|
method='GET',
|
|
getargs=getargs,
|
|
sessionKey=session_key,
|
|
raiseAllErrors=False
|
|
)
|
|
if response.status != 200:
|
|
logger.error('Failed to load KV store: ' + str(response.status) + ' ' + str(content))
|
|
return {'response': response, 'content': content}
|
|
|
|
def put_kvstore(session_key, payload):
|
|
'''
|
|
Saves new icons in KV store
|
|
'''
|
|
path = rest.makeSplunkdUri() + ICON_COLLECTION_ENDPOINT
|
|
response, content = rest.simpleRequest(
|
|
path,
|
|
method='PUT',
|
|
jsonargs=payload,
|
|
sessionKey=session_key,
|
|
raiseAllErrors=False
|
|
)
|
|
return {'response': response, 'content': content}
|
|
|
|
|
|
def run_script():
|
|
session_key = sys.stdin.readline().strip()
|
|
server_info = ServerInfo(session_key)
|
|
|
|
# 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/import_icons_SA_ITOA.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)
|
|
|
|
try:
|
|
logger.info(f"Modular input running on instance: {server_info.server_name}")
|
|
logger.info('Glass table icon importer has started.')
|
|
response = get_conf(session_key, 'glasstable_icon_library')
|
|
conf_icons = conf_to_json(json.loads(response['content']))
|
|
kvstore = ITOAStorage()
|
|
|
|
kvstore_output = []
|
|
if kvstore.wait_for_storage_init(session_key):
|
|
# KV store might be not available yet - get icons after storage init
|
|
kvstore_output = get_all_icons_from_kvstore(session_key)
|
|
else:
|
|
logger.error('Error connecting to the KV store.')
|
|
return
|
|
|
|
kvstore_tuples = [(res['title'],res['category']) for res in json.loads(kvstore_output['content'])['result']]
|
|
new_icons = []
|
|
for icon in conf_icons:
|
|
if (icon['title'],icon['category']) in kvstore_tuples:
|
|
# skip icons already existing in KV store
|
|
continue
|
|
icon['immutable'] = 1 # mark icons that are being imported
|
|
new_icons.append(icon)
|
|
|
|
if len(new_icons) > 0:
|
|
put_kvstore(session_key, json.dumps(new_icons))
|
|
logger.info('Successfully imported %s icons to the KV store.' % str(len(new_icons)))
|
|
|
|
except Exception as e:
|
|
logger.error(str(e))
|
|
|
|
if __name__ == '__main__':
|
|
run_script()
|
|
|
|
sys.exit(0)
|