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.
200 lines
6.6 KiB
200 lines
6.6 KiB
#!/usr/bin/env python
|
|
|
|
# Program name: create_agent.py
|
|
# Compatibility: Python 2x
|
|
# Purpose - Create a customized version of the TA-metricator-hec-for-nmon
|
|
# Licence:
|
|
|
|
# Copyright 2018 Guilhem Marchand
|
|
|
|
import sys
|
|
import os
|
|
import tarfile
|
|
import glob
|
|
import fnmatch
|
|
import argparse
|
|
import shutil
|
|
|
|
version = '2.0.0'
|
|
|
|
####################################################################
|
|
############# Arguments Parser
|
|
####################################################################
|
|
|
|
# Define Arguments
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
parser.add_argument('-f', action='store', dest='INFILE',
|
|
help='Name of the tgz archive file')
|
|
|
|
parser.add_argument('--agentname', action='store', dest='TARGET',
|
|
help='Define the TA Agent name and root directory')
|
|
|
|
parser.add_argument('--version', action='version', version='%(prog)s ' + version)
|
|
|
|
parser.add_argument('--debug', dest='debug', action='store_true')
|
|
|
|
parser.set_defaults(debug=False)
|
|
|
|
args = parser.parse_args()
|
|
|
|
# Set debug
|
|
if args.debug:
|
|
debug = True
|
|
|
|
####################################################################
|
|
############# Functions
|
|
####################################################################
|
|
|
|
# String replacement function
|
|
# Can be called by:
|
|
# findreplace(path, string_to_search, replace_by, file_extension)
|
|
|
|
def findreplace(directory, find, replace, filepattern):
|
|
for path, dirs, files in os.walk(os.path.abspath(directory)):
|
|
for filename in fnmatch.filter(files, filepattern):
|
|
filepath = os.path.join(path, filename)
|
|
|
|
# Prevents binaries modification
|
|
if "bin/linux" in filepath:
|
|
if debug:
|
|
print("file " + str(filename) + " is binary or binary related")
|
|
elif "bin/sarmon" in filepath:
|
|
if debug:
|
|
print("file " + str(filename) + " is binary or binary related")
|
|
else:
|
|
with open(filepath) as f:
|
|
s = f.read()
|
|
s = s.replace(find, replace)
|
|
with open(filepath, "w") as f:
|
|
f.write(s)
|
|
|
|
|
|
####################################################################
|
|
############# Main Program
|
|
####################################################################
|
|
|
|
# Check Arguments
|
|
if len(sys.argv) < 2:
|
|
print "\n%s" % os.path.basename(sys.argv[0])
|
|
print "\nThis utility had been designed to allow creating customized agents for the TA-metricator-hec-for-nmon" \
|
|
" please follow these instructions:\n"
|
|
print "- Download the current release of the technical add-on"
|
|
print "- Ensure to have this Python script and the TGZ archive in the same directory"
|
|
print "- Run the tool: ./create_agent.py and check for available options"
|
|
print "- After the execution, a new agent package will have been created in the resources directory"
|
|
print "- Extract its content to your Splunk deployment server, configure the server class, associated clients and" \
|
|
" deploy the agent"
|
|
print "- Don't forget to set the application to restart splunkd after deployment\n"
|
|
print "\nRun this tool such as:\n"
|
|
print "./create_agent.py -f TA-metricator-hec-for-nmon_xxx.tgz --agentname TA-metricator-hec-for-nmon-custom \n"
|
|
|
|
sys.exit(0)
|
|
|
|
# Will expect in first Argument the name of the tgz Archive of the Application to be downloaded in Splunk Base
|
|
if not args.INFILE:
|
|
print "\nERROR: Please provide the tgz Archive file with -f statement\n"
|
|
sys.exit(1)
|
|
else:
|
|
infile = args.INFILE
|
|
|
|
# If the root directory of the TA-nmon is not defined, exit and show message
|
|
if not args.TARGET:
|
|
print "ERROR: You must specify the name of the agent package you want to create, and it must be different from" \
|
|
" the default package: TA-metricator-hec-for-nmon"
|
|
sys.exit(0)
|
|
else:
|
|
ta_root_dir = args.TARGET
|
|
|
|
# Avoid naming the TA ascore application
|
|
if not "TA-" in ta_root_dir:
|
|
print "ERROR: The TA package name should always start by TA_ as good Splunk practice."
|
|
sys.exit(1)
|
|
|
|
# Verify tgz Archive file exists
|
|
if not os.path.exists(infile):
|
|
print ('ERROR: invalid file, could not find: ' + infile)
|
|
sys.exit(1)
|
|
|
|
# Ensure the same package name does not already exist in current directory
|
|
if os.path.exists(ta_root_dir):
|
|
print ('ERROR: A directory named ' + ta_root_dir + ' already exist in current directory, please remove it and'
|
|
' restart')
|
|
sys.exit(1)
|
|
elif os.path.exists(ta_root_dir + ".tgz"):
|
|
print ('ERROR: A tgz archive named ' + ta_root_dir + ".tgz" + ' already exist in current directory, please'
|
|
' remove it and restart')
|
|
sys.exit(1)
|
|
|
|
# Extract Archive
|
|
tar = tarfile.open(infile)
|
|
msg = 'Extracting tgz Archive: ' + infile
|
|
print (msg)
|
|
tar.extractall()
|
|
tar.close()
|
|
|
|
# Operate
|
|
|
|
# Get current directory
|
|
curdir = os.getcwd()
|
|
|
|
# Extract the TA-nmon default package in current directory
|
|
|
|
print ('INFO: Extracting Agent tgz resources Archives')
|
|
|
|
tgz_files = 'TA-metricator-hec-for-nmon*.tgz'
|
|
for tgz in glob.glob(str(tgz_files)):
|
|
tar = tarfile.open(tgz)
|
|
tar.extractall()
|
|
tar.close()
|
|
|
|
# Rename the TA directory to match agent name
|
|
|
|
msg = 'INFO: Renaming TA-metricator-hec-for-nmon default agent to ' + ta_root_dir
|
|
print (msg)
|
|
|
|
shutil.copytree('TA-metricator-hec-for-nmon', ta_root_dir)
|
|
|
|
################# STRING REPLACEMENTS #################
|
|
|
|
# Replace the old agent name in files
|
|
|
|
# Achieve string replacements
|
|
|
|
print ('Achieving files transformation...')
|
|
|
|
search = 'TA-metricator-hec-for-nmon'
|
|
replace = ta_root_dir
|
|
findreplace(ta_root_dir, search, replace, "*.sh")
|
|
findreplace(ta_root_dir, search, replace, "*.py")
|
|
findreplace(ta_root_dir, search, replace, "*.pl")
|
|
findreplace(ta_root_dir, search, replace, "*.conf")
|
|
|
|
print ('Done.')
|
|
|
|
# Don't use "with" statement in tar creation for Python 2.6 backward compatibility
|
|
tar_file = ta_root_dir + '.tgz'
|
|
out = tarfile.open(tar_file, mode='w:gz')
|
|
|
|
try:
|
|
out.add(ta_root_dir)
|
|
finally:
|
|
msg = 'INFO: ************* Tar creation done of: ' + tar_file + ' *************'
|
|
print (msg)
|
|
out.close()
|
|
|
|
# remove Agent directory
|
|
if os.path.isdir(ta_root_dir):
|
|
shutil.rmtree(ta_root_dir)
|
|
|
|
print ('\n*** Agent Creation terminated: To install the agent: ***\n')
|
|
print (' - Upload the tgz Archive ' + tar_file + ' to your Splunk deployment server')
|
|
print (' - Extract the content of the TA package in $SPLUNK_HOME/etc/deployment-apps/')
|
|
print (' - Configure the Application (set splunkd to restart), server class and associated clients to push the new'
|
|
' package to your clients\n')
|
|
|
|
# END
|
|
print ('Operation terminated.\n')
|
|
sys.exit(0)
|