LCM/scripts/python3/OmsConfigHostHelpers.py (87 lines of code) (raw):

#!/usr/bin/env python3 import json import time import datetime import os import math import signal def write_omsconfig_host_telemetry(message, pathToCurrentScript='', level = 'INFO'): omsagent_telemetry_path = '/var/opt/microsoft/omsconfig/status' dsc_host_telemetry_path = os.path.join(omsagent_telemetry_path, 'omsconfighost') if not os.path.exists(omsagent_telemetry_path): os.makedirs(omsagent_telemetry_path) if os.path.isfile(dsc_host_telemetry_path): with open(dsc_host_telemetry_path) as host_telemetry_file: try: host_telemetry_json = json.load(host_telemetry_file) except: host_telemetry_json = {} host_telemetry_json['operation'] = 'omsconfighost' host_telemetry_json['message'] = '' host_telemetry_json['success'] = 1 else: os.mknod(dsc_host_telemetry_path) host_telemetry_json = {} host_telemetry_json['operation'] = 'omsconfighost' host_telemetry_json['message'] = '' host_telemetry_json['success'] = 1 msg_template = '<OMSCONFIGLOG>[%s] [%d] [%s] [%d] [%s:%d] %s</OMSCONFIGLOG>' timestamp = datetime.datetime.fromtimestamp(time.time()).strftime('%Y/%m/%d %H:%M:%S') msg_buffer = msg_template % (timestamp, os.getpid(), level, 0, pathToCurrentScript, 0, json.dumps(message)) host_telemetry_json['message'] += msg_buffer with open(dsc_host_telemetry_path, 'w+') as host_telemetry_file: json.dump(host_telemetry_json, host_telemetry_file) def get_agent_id(): agentid_path = "/etc/opt/omi/conf/omsconfig/agentid" if os.path.isfile(agentid_path): with open(agentid_path, "r") as agentid_file: agent_id = agentid_file.read(36) # read 36 characters from the file return agent_id return "00000000-0000-0000-0000-000000000000" def write_omsconfig_host_switch_event(pathToCurrentScript, dsc_host_switch_exists): if dsc_host_switch_exists: message = 'Using dsc_host' else: message = 'Falling back to OMI' telemetry_message = '[%s] %s' % (get_agent_id(), message) write_omsconfig_host_telemetry(telemetry_message, pathToCurrentScript) def write_omsconfig_host_log(message, pathToCurrentScript, level = 'INFO'): log_entry_template = '[%s] [%d] [%s] [%d] [%s:%d] %s\n' timestamp = datetime.datetime.fromtimestamp(time.time()).strftime('%Y/%m/%d %H:%M:%S') log_entry = log_entry_template % (timestamp, os.getpid(), level, 0, pathToCurrentScript, 0, message) omsconfig_log_folder = '/var/opt/microsoft/omsconfig' if not os.path.exists(omsconfig_log_folder): os.makedirs(omsconfig_log_folder) print(log_entry) omsconfig_log_path = os.path.join(omsconfig_log_folder, 'omsconfig.log') with open(omsconfig_log_path, 'a+') as omsconfig_log_file: omsconfig_log_file.write(log_entry) omsconfig_detailed_log_path = os.path.join(omsconfig_log_folder, 'omsconfigdetailed.log') with open(omsconfig_detailed_log_path, 'a+') as omsconfig_detailed_log_file: omsconfig_detailed_log_file.write(log_entry) if (level == 'ERROR') or (level == 'WARNING') or (level == 'FATAL'): write_omsconfig_host_telemetry(message, pathToCurrentScript, level) def stop_old_host_instances(dsc_host_lock_path): dsc_host_pid_path = '/opt/dsc/bin/dsc_host.pid' last_host_pid = 0 if os.path.isfile(dsc_host_pid_path): with open(dsc_host_pid_path) as dsc_host_pid_file: try: last_host_pid = dsc_host_pid_file.read() except: pass if last_host_pid == 0: return # Timestamps are measured in seconds since epoch host_pid_last_modified_time = os.path.getmtime(dsc_host_pid_path) current_time = math.floor(time.time()) timestamp_diff = current_time - host_pid_last_modified_time if (timestamp_diff < 0): return # If file was last modified more than 3 hours ago, we will kill the process if (timestamp_diff > 3600 * 3): try: write_omsconfig_host_log('Killing dsc_host with pid = ' + str(last_host_pid) + ' since it is older than 3 hours.', 'stop_old_host_instances', 'WARNING') os.kill(last_host_pid, signal.SIGTERM) if (os.path.exists(dsc_host_lock_path)): os.remove(dsc_host_lock_path) write_omsconfig_host_log('Killed dsc_host with pid = ' + str(last_host_pid) + ' since it was taking longer than 3 hours.', 'stop_old_host_instances', 'WARNING') except: pass