diff options
Diffstat (limited to 'ambari-agent/src/main/python/ambari_agent/Facter.py')
-rw-r--r-- | ambari-agent/src/main/python/ambari_agent/Facter.py | 329 |
1 files changed, 222 insertions, 107 deletions
diff --git a/ambari-agent/src/main/python/ambari_agent/Facter.py b/ambari-agent/src/main/python/ambari_agent/Facter.py index 947f38021b..aabc77dd86 100644 --- a/ambari-agent/src/main/python/ambari_agent/Facter.py +++ b/ambari-agent/src/main/python/ambari_agent/Facter.py @@ -27,55 +27,29 @@ import shlex import socket import multiprocessing import subprocess - +from shell import shellRunner import time import uuid from ambari_commons import OSCheck log = logging.getLogger() -# selinux command -GET_SE_LINUX_ST_CMD = "/usr/sbin/sestatus" -GET_IFCONFIG_CMD = "ifconfig" -GET_UPTIME_CMD = "cat /proc/uptime" -GET_MEMINFO_CMD = "cat /proc/meminfo" - -class Facter(): - def __init__(self): - - self.DATA_IFCONFIG_OUTPUT = Facter.setDataIfConfigOutput() - self.DATA_UPTIME_OUTPUT = Facter.setDataUpTimeOutput() - self.DATA_MEMINFO_OUTPUT = Facter.setMemInfoOutput() - - @staticmethod - def setDataIfConfigOutput(): - - try: - result = os.popen(GET_IFCONFIG_CMD).read() - return result - except OSError: - log.warn("Can't execute {0}".format(GET_IFCONFIG_CMD)) - return "" - - @staticmethod - def setDataUpTimeOutput(): - try: - result = os.popen(GET_UPTIME_CMD).read() - return result - except OSError: - log.warn("Can't execute {0}".format(GET_UPTIME_CMD)) - return "" +def run_os_command(cmd): + if type(cmd) == str: + cmd = shlex.split(cmd) + process = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stdin=subprocess.PIPE, + stderr=subprocess.PIPE + ) + (stdoutdata, stderrdata) = process.communicate() + return process.returncode, stdoutdata, stderrdata - @staticmethod - def setMemInfoOutput(): - try: - result = os.popen(GET_MEMINFO_CMD).read() - return result - except OSError: - log.warn("Can't execute {0}".format(GET_MEMINFO_CMD)) - return "" +class FacterBase(): + def __init__(self): + pass # Returns the currently running user id def getId(self): @@ -87,7 +61,7 @@ class Facter(): # Returns the FQDN of the host def getFqdn(self): - return socket.getfqdn() + return socket.getfqdn().lower() # Returns the host's primary DNS domain name def getDomain(self): @@ -153,15 +127,211 @@ class Facter(): def getOsFamily(self): return OSCheck.get_os_family() + # Return uptime hours + def getUptimeHours(self): + return self.getUptimeSeconds() / (60 * 60) + + # Return uptime days + def getUptimeDays(self): + return self.getUptimeSeconds() / (60 * 60 * 24) + + def facterInfo(self): + facterInfo = {} + facterInfo['id'] = self.getId() + facterInfo['kernel'] = self.getKernel() + facterInfo['domain'] = self.getDomain() + facterInfo['fqdn'] = self.getFqdn() + facterInfo['hostname'] = self.getHostname() + facterInfo['macaddress'] = self.getMacAddress() + facterInfo['architecture'] = self.getArchitecture() + facterInfo['operatingsystem'] = self.getOperatingSystem() + facterInfo['operatingsystemrelease'] = self.getOperatingSystemRelease() + facterInfo['physicalprocessorcount'] = self.getProcessorcount() + facterInfo['processorcount'] = self.getProcessorcount() + facterInfo['timezone'] = self.getTimeZone() + facterInfo['hardwareisa'] = self.getArchitecture() + facterInfo['hardwaremodel'] = self.getArchitecture() + facterInfo['kernelrelease'] = self.getKernelRelease() + facterInfo['kernelversion'] = self.getKernelVersion() + facterInfo['osfamily'] = self.getOsFamily() + facterInfo['kernelmajversion'] = self.getKernelMajVersion() + + facterInfo['ipaddress'] = self.getIpAddress() + facterInfo['netmask'] = self.getNetmask() + facterInfo['interfaces'] = self.getInterfaces() + + facterInfo['uptime_seconds'] = str(self.getUptimeSeconds()) + facterInfo['uptime_hours'] = str(self.getUptimeHours()) + facterInfo['uptime_days'] = str(self.getUptimeDays()) + + facterInfo['memorysize'] = self.getMemorySize() + facterInfo['memoryfree'] = self.getMemoryFree() + facterInfo['memorytotal'] = self.getMemoryTotal() + + return facterInfo + + #Convert kB to GB + @staticmethod + def convertSizeKbToGb(size): + return "%0.2f GB" % round(float(size) / (1024.0 * 1024.0), 2) + + #Convert MB to GB + @staticmethod + def convertSizeMbToGb(size): + return "%0.2f GB" % round(float(size) / (1024.0), 2) + + +class FacterWindows(FacterBase): + GET_SYSTEM_INFO_CMD = "systeminfo" + GET_MEMORY_CMD = '$mem =(Get-WMIObject Win32_OperatingSystem -ComputerName "LocalHost" ); echo "$($mem.FreePhysicalMemory) $($mem.TotalVisibleMemorySize)"' + GET_PAGE_FILE_INFO = '$pgo=(Get-WmiObject Win32_PageFileUsage); echo "$($pgo.AllocatedBaseSize) $($pgo.AllocatedBaseSize-$pgo.CurrentUsage)"' + GET_UPTIME_CMD = 'echo $([int]((get-date)-[system.management.managementdatetimeconverter]::todatetime((get-wmiobject -class win32_operatingsystem).Lastbootuptime)).TotalSeconds)' + + # Return first ip adress + def getIpAddress(self): + #TODO check if we need ipconfig + return socket.gethostbyname(socket.gethostname().lower()) + + # Return netmask + def getNetmask(self): + #TODO return correct netmask + return 'OS NOT SUPPORTED' + + # Return interfaces + def getInterfaces(self): + #TODO return correct interfaces + return 'OS NOT SUPPORTED' + + # Return uptime seconds + def getUptimeSeconds(self): + try: + runner = shellRunner() + result = runner.runPowershell(script_block=FacterWindows.GET_UPTIME_CMD).output.replace('\n', '').replace('\r', + '') + return int(result) + except: + log.warn("Can not get SwapFree") + return 0 + + # Return memoryfree + def getMemoryFree(self): + try: + runner = shellRunner() + result = runner.runPowershell(script_block=FacterWindows.GET_MEMORY_CMD).output.split(" ")[0].replace('\n', + '').replace( + '\r', '') + return result + except: + log.warn("Can not get MemoryFree") + return 0 + + # Return memorytotal + def getMemoryTotal(self): + try: + runner = shellRunner() + result = runner.runPowershell(script_block=FacterWindows.GET_MEMORY_CMD).output.split(" ")[-1].replace('\n', + '').replace( + '\r', '') + return result + except: + log.warn("Can not get MemoryTotal") + return 0 + + # Return swapfree + def getSwapFree(self): + try: + runner = shellRunner() + result = runner.runPowershell(script_block=FacterWindows.GET_PAGE_FILE_INFO).output.split(" ")[-1].replace('\n', + '').replace( + '\r', '') + return result + except: + log.warn("Can not get SwapFree") + return 0 + + # Return swapsize + def getSwapSize(self): + try: + runner = shellRunner() + result = runner.runPowershell(script_block=FacterWindows.GET_PAGE_FILE_INFO).output.split(" ")[0].replace('\n', + '').replace( + '\r', '') + return result + except: + log.warn("Can not get SwapFree") + return 0 + + # Return memorysize + def getMemorySize(self): + try: + runner = shellRunner() + result = runner.runPowershell(script_block=FacterWindows.GET_MEMORY_CMD).output.split(" ")[-1].replace('\n', + '').replace( + '\r', '') + return result + except: + log.warn("Can not get MemorySize") + return 0 + + def facterInfo(self): + facterInfo = FacterBase.facterInfo(self) + facterInfo['swapsize'] = FacterBase.convertSizeMbToGb(self.getSwapSize()) + facterInfo['swapfree'] = FacterBase.convertSizeMbToGb(self.getSwapFree()) + return facterInfo + + +class FacterLinux(FacterBase): + # selinux command + GET_SE_LINUX_ST_CMD = "/usr/sbin/sestatus" + GET_IFCONFIG_CMD = "ifconfig" + GET_UPTIME_CMD = "cat /proc/uptime" + GET_MEMINFO_CMD = "cat /proc/meminfo" + + def __init__(self): + + self.DATA_IFCONFIG_OUTPUT = Facter.setDataIfConfigOutput() + self.DATA_UPTIME_OUTPUT = Facter.setDataUpTimeOutput() + self.DATA_MEMINFO_OUTPUT = Facter.setMemInfoOutput() + + @staticmethod + def setDataIfConfigOutput(): + + try: + result = os.popen(FacterLinux.GET_IFCONFIG_CMD).read() + return result + except OSError: + log.warn("Can't execute {0}".format(FacterLinux.GET_IFCONFIG_CMD)) + return "" + + @staticmethod + def setDataUpTimeOutput(): + + try: + result = os.popen(FacterLinux.GET_UPTIME_CMD).read() + return result + except OSError: + log.warn("Can't execute {0}".format(FacterLinux.GET_UPTIME_CMD)) + return "" + + @staticmethod + def setMemInfoOutput(): + + try: + result = os.popen(FacterLinux.GET_MEMINFO_CMD).read() + return result + except OSError: + log.warn("Can't execute {0}".format(FacterLinux.GET_MEMINFO_CMD)) + return "" + def isSeLinux(self): try: - retcode, out, err = run_os_command(GET_SE_LINUX_ST_CMD) + retcode, out, err = run_os_command(FacterLinux.GET_SE_LINUX_ST_CMD) se_status = re.search('(enforcing|permissive|enabled)', out) if se_status: return True except OSError: - log.warn("Could not run {0}: OK".format(GET_SE_LINUX_ST_CMD)) + log.warn("Could not run {0}: OK".format(FacterLinux.GET_SE_LINUX_ST_CMD)) return False # Function that returns list of values that matches @@ -183,10 +353,6 @@ class Facter(): return result - #Convert kB to GB - def convertSizeKbToGb(self, size): - return "%0.2f GB" % round(float(size) / (1024.0 * 1024.0), 2) - # Return first ip adress def getIpAddress(self): ip_pattern="(?: inet addr:)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})" @@ -195,7 +361,7 @@ class Facter(): result = self.data_return_first(ip_pattern,self.DATA_IFCONFIG_OUTPUT) if result == '': log.warn("Can't get an ip address from {0}".format(self.DATA_IFCONFIG_OUTPUT)) - return socket.gethostbyname(socket.gethostname()) + return socket.gethostbyname(socket.gethostname().lower()) else: return result @@ -231,15 +397,6 @@ class Facter(): log.warn("Can't get an uptime value from {0}".format(self.DATA_UPTIME_OUTPUT)) return 0 - - # Return uptime hours - def getUptimeHours(self): - return self.getUptimeSeconds() / (60 * 60) - - # Return uptime days - def getUptimeDays(self): - return self.getUptimeSeconds() / (60 * 60 * 24) - # Return memoryfree def getMemoryFree(self): #:memoryfree_mb => "MemFree", @@ -284,55 +441,18 @@ class Facter(): log.warn("Can't get memory size from {0}".format(self.DATA_MEMINFO_OUTPUT)) return 0 - def facterInfo(self): - facterInfo = {} - facterInfo['id'] = self.getId() - facterInfo['kernel'] = self.getKernel() - facterInfo['domain'] = self.getDomain() - facterInfo['fqdn'] = self.getFqdn() - facterInfo['hostname'] = self.getHostname() - facterInfo['macaddress'] = self.getMacAddress() - facterInfo['architecture'] = self.getArchitecture() - facterInfo['operatingsystem'] = self.getOperatingSystem() - facterInfo['operatingsystemrelease'] = self.getOperatingSystemRelease() - facterInfo['physicalprocessorcount'] = self.getProcessorcount() - facterInfo['processorcount'] = self.getProcessorcount() - facterInfo['timezone'] = self.getTimeZone() - facterInfo['hardwareisa'] = self.getArchitecture() - facterInfo['hardwaremodel'] = self.getArchitecture() - facterInfo['kernelrelease'] = self.getKernelRelease() - facterInfo['kernelversion'] = self.getKernelVersion() - facterInfo['osfamily'] = self.getOsFamily() + facterInfo = FacterBase.facterInfo(self) facterInfo['selinux'] = self.isSeLinux() - facterInfo['kernelmajversion'] = self.getKernelMajVersion() - - facterInfo['ipaddress'] = self.getIpAddress() - facterInfo['netmask'] = self.getNetmask() - facterInfo['interfaces'] = self.getInterfaces() - - facterInfo['uptime_seconds'] = str(self.getUptimeSeconds()) - facterInfo['uptime_hours'] = str(self.getUptimeHours()) - facterInfo['uptime_days'] = str(self.getUptimeDays()) - - facterInfo['memorysize'] = self.getMemorySize() - facterInfo['memoryfree'] = self.getMemoryFree() - facterInfo['swapsize'] = self.convertSizeKbToGb(self.getSwapSize()) - facterInfo['swapfree'] = self.convertSizeKbToGb(self.getSwapFree()) - facterInfo['memorytotal'] = self.getMemoryTotal() - + facterInfo['swapsize'] = FacterBase.convertSizeKbToGb(self.getSwapSize()) + facterInfo['swapfree'] = FacterBase.convertSizeKbToGb(self.getSwapFree()) return facterInfo -def run_os_command(cmd): - if type(cmd) == str: - cmd = shlex.split(cmd) - process = subprocess.Popen(cmd, - stdout=subprocess.PIPE, - stdin=subprocess.PIPE, - stderr=subprocess.PIPE - ) - (stdoutdata, stderrdata) = process.communicate() - return process.returncode, stdoutdata, stderrdata + +if platform.system() == "Windows": + Facter = FacterWindows +else: + Facter = FacterLinux def main(argv=None): @@ -341,8 +461,3 @@ def main(argv=None): if __name__ == '__main__': main() - - - - - |