summaryrefslogtreecommitdiff
path: root/ambari-agent/src/main/python/ambari_agent/Facter.py
diff options
context:
space:
mode:
Diffstat (limited to 'ambari-agent/src/main/python/ambari_agent/Facter.py')
-rw-r--r--ambari-agent/src/main/python/ambari_agent/Facter.py329
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()
-
-
-
-
-