importsubprocess, re, os, socket, resource, pwd, crypt, logging, sys, platformdefdemote(user_uid, user_gid):defresult():
os.setgid(user_gid)
os.setuid(user_uid)returnresultclasssetuputil:
@staticmethoddef run_command(args, username=None, usercwd=None):try:ifusername:
pw_record=pwd.getpwnam(username)
env=os.environ.copy()
env['HOME'] =pw_record.pw_dir
env['LOGNAME'] =username
env['USER'] =usernameifusercwd:
env['PWD'] =usercwd
p= subprocess.Popen(args, preexec_fn=demote(pw_record.pw_uid, pw_record.pw_gid),
cwd=usercwd, env=env, close_fds=True)else:
p= subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds =True)
outputs=p.communicate()for out inoutputs:ifout:return(p.returncode, out)exceptOSError as os_e:return(os_e.errno, os_e.strerror)exceptValueError as val_e:return(val_e.errno, val_e.strerror)else:return(p.returncode, outputs)
@staticmethoddefjava_version():
java_ver_pattern= '\"(\d+\.\d+).*\"'java_cmd= "java"
if 'JAVA_HOME' inos.environ:
java_cmd= os.environ['JAVA_HOME'] + "/bin/java"version= subprocess.check_output([java_cmd, '-version'], stderr=subprocess.STDOUT)ifversion:returnre.search(java_ver_pattern, version).groups()[0]else:returnNone
@staticmethoddefstart_app(es_exec, pid_file, es_user):
rtcode, msg= setuputil.run_command([es_exec, '-d', '-p', pid_file], es_user)ifrtcode:return(rtcode, msg)else:return (0, "OK")
MIN_JAVA_VERSION= 1.8
ELASTIC_USER= 'elastic'ELASTIC_PASSWORD= 'elastic'ELASTIC_PID= '/tmp/elasticpid'
defmain():#set up java home
os.environ['JAVA_HOME'] = '/shared/java8'j_ver=setuputil.java_version()if not j_ver or float(j_ver)
logging.error("Java isn't installed or java version is not up to date: %s", j_ver if j_ver else "None")return (1, "Java isn't installed or java version is not up to date: %s"%(j_ver if j_ver else "None"))
rtcode, msg= setuputil.start_app('/opt/elasticsearch6.2.3/bin/elasticsearch', ELASTIC_PID, ELASTIC_USER)ifrtcode:
logging.error("Failed to start elasticsearch: %d, %s", rtcode, msg)return(rtcode, msg)else:
logging.debug("Start elasticsearch: %s", msg)return(0, None)if __name__ == '__main__':
main()