move slapos monitor script to slapos.toolbox
Showing
slapos/monitor/__init__.py
0 → 100644
slapos/monitor/collect.py
0 → 100644
This diff is collapsed.
slapos/monitor/monitor.py
0 → 100644
This diff is collapsed.
#!/usr/bin/env python | |||
import sys | |||
import os | |||
import re | |||
import json | |||
import argparse | |||
import subprocess | |||
from datetime import datetime | |||
import time | |||
def parseArguments(): | |||
""" | |||
Parse arguments for monitor instance. | |||
""" | |||
parser = argparse.ArgumentParser() | |||
parser.add_argument('--config_folder', | |||
help='Path where json configuration/document will be read and write') | |||
parser.add_argument('--htpasswd_bin', | |||
help='Path apache htpasswd binary. Needed to write htpasswd file.') | |||
parser.add_argument('--output_cfg_file', | |||
help='Ouput parameters in cfg file.') | |||
return parser.parse_args() | |||
def fileWrite(file_path, content): | |||
if os.path.exists(file_path): | |||
try: | |||
with open(file_path, 'w') as wf: | |||
wf.write(content) | |||
return True | |||
except OSError, e: | |||
print "ERROR while writing changes to %s.\n %s" % (file_path, str(e)) | |||
return False | |||
def htpasswdWrite(htpasswd_bin, parameter_dict, value): | |||
if not os.path.exists(parameter_dict['file']): | |||
return False | |||
command = [htpasswd_bin, '-cb', parameter_dict['htpasswd'], parameter_dict['user'], value] | |||
process = subprocess.Popen( | |||
command, | |||
stdin=None, | |||
stdout=subprocess.PIPE, | |||
stderr=subprocess.PIPE | |||
) | |||
result = process.communicate()[0] | |||
if process.returncode != 0: | |||
print result | |||
return False | |||
with open(parameter_dict['file'], 'w') as pfile: | |||
pfile.write(value) | |||
return True | |||
def httpdCorsDomainWrite(httpd_cors_file, httpd_gracefull_bin, cors_domain): | |||
cors_string = "" | |||
cors_domain_list = cors_domain.split() | |||
old_httpd_cors_file = os.path.join( | |||
os.path.dirname(httpd_cors_file), | |||
'prev_%s' % os.path.basename(httpd_cors_file) | |||
) | |||
if os.path.exists(old_httpd_cors_file) and os.path.isfile(old_httpd_cors_file): | |||
try: | |||
with open(old_httpd_cors_file, 'r') as cors_file: | |||
if cors_file.read() == cors_domain: | |||
if os.path.exists(httpd_cors_file) and (os.stat(httpd_cors_file).st_size > 0 | |||
or (cors_domain == "" and os.stat(httpd_cors_file).st_size == 0)): | |||
# Skip if cors file is not empty | |||
return True | |||
except OSError, e: | |||
print "Failed to open file at %s. \n%s" % (old_httpd_cors_file, str(e)) | |||
for domain in cors_domain_list: | |||
if cors_string: | |||
cors_string += '|' | |||
cors_string += re.escape(domain) | |||
try: | |||
with open(httpd_cors_file, 'w') as file: | |||
file.write('SetEnvIf Origin "^http(s)?://(.+\.)?(%s)$" origin_is=$0\n' % cors_string) | |||
file.write('Header always set Access-Control-Allow-Origin %{origin_is}e env=origin_is') | |||
except OSError, e: | |||
print "ERROR while writing CORS changes to %s.\n %s" % (httpd_cors_file, str(e)) | |||
return False | |||
# Save current cors domain list | |||
try: | |||
with open(old_httpd_cors_file, 'w') as cors_file: | |||
cors_file.write(cors_domain) | |||
except OSError, e: | |||
print "Failed to open file at %s. \n%s" % (old_httpd_cors_file, str(e)) | |||
return False | |||
# Restart httpd process | |||
try: | |||
subprocess.call(httpd_gracefull_bin) | |||
except OSError, e: | |||
print "Failed to execute command %s.\n %s" % (httpd_gracefull_bin, str(e)) | |||
return False | |||
def applyEditChage(parser): | |||
parameter_tmp_file = os.path.join(parser.config_folder, 'config.tmp.json') | |||
config_file = os.path.join(parser.config_folder, 'config.json') | |||
parameter_config_file = os.path.join(parser.config_folder, 'config.parameters.json') | |||
if not os.path.exists(parameter_tmp_file) or not os.path.isfile(parameter_tmp_file): | |||
return {} | |||
if not os.path.exists(config_file): | |||
print "ERROR: Config file doesn't exist... Exiting" | |||
return {} | |||
new_parameter_list = [] | |||
parameter_list = [] | |||
description_dict = {} | |||
result_dict = {} | |||
try: | |||
with open(parameter_tmp_file) as tmpfile: | |||
new_parameter_list = json.loads(tmpfile.read()) | |||
except ValueError: | |||
print "Error: Couldn't parse json file %s" % parameter_tmp_file | |||
with open(parameter_config_file) as tmpfile: | |||
description_dict = json.loads(tmpfile.read()) | |||
for i in range(0, len(new_parameter_list)): | |||
key = new_parameter_list[i]['key'] | |||
if key != '': | |||
description_entry = description_dict[key] | |||
if description_entry['type'] == 'file': | |||
result_dict[key] = fileWrite(description_entry['file'], new_parameter_list[i]['value']) | |||
elif description_entry['type'] == 'htpasswd': | |||
result_dict[key] = htpasswdWrite(parser.htpasswd_bin, description_entry, new_parameter_list[i]['value']) | |||
elif description_entry['type'] == 'httpdcors': | |||
result_dict[key] = httpdCorsDomainWrite(description_entry['cors_file'], description_entry['gracefull_bin'], new_parameter_list[i]['value']) | |||
if (parser.output_cfg_file): | |||
try: | |||
with open(parser.output_cfg_file, 'w') as pfile: | |||
pfile.write('[public]\n') | |||
for parameter in new_parameter_list: | |||
if parameter['key']: | |||
pfile.write('%s = %s\n' % (parameter['key'], parameter['value'])) | |||
except OSError, e: | |||
print "Error failed to create file %s" % parser.output_cfg_file | |||
pass | |||
return result_dict | |||
def main(): | |||
parser = parseArguments() | |||
parameter_tmp_file = os.path.join(parser.config_folder, 'config.tmp.json') | |||
config_file = os.path.join(parser.config_folder, 'config.json') | |||
# Run 4 times with sleep | |||
run_counter = 1 | |||
max_runn = 4 | |||
sleep_time = 15 | |||
while True: | |||
result_dict = applyEditChage(parser) | |||
if result_dict != {}: | |||
status = True | |||
for key in result_dict: | |||
if not result_dict[key]: | |||
status = False | |||
if status and os.path.exists(parameter_tmp_file): | |||
try: | |||
os.unlink(config_file) | |||
except OSError, e: | |||
print "ERROR cannot remove file: %s" % parameter_tmp_file | |||
else: | |||
os.rename(parameter_tmp_file, config_file) | |||
if run_counter == max_runn: | |||
break | |||
else: | |||
run_counter += 1 | |||
time.sleep(sleep_time) | |||
|
|||
slapos/monitor/runpromise.py
0 → 100644
slapos/monitor/status2rss.py
0 → 100644