|
@@ -0,0 +1,367 @@
|
|
|
+#!/usr/bin/env python2.6
|
|
|
+
|
|
|
+'''
|
|
|
+Licensed to the Apache Software Foundation (ASF) under one
|
|
|
+or more contributor license agreements. See the NOTICE file
|
|
|
+distributed with this work for additional information
|
|
|
+regarding copyright ownership. The ASF licenses this file
|
|
|
+to you under the Apache License, Version 2.0 (the
|
|
|
+"License"); you may not use this file except in compliance
|
|
|
+with the License. You may obtain a copy of the License at
|
|
|
+
|
|
|
+ http://www.apache.org/licenses/LICENSE-2.0
|
|
|
+
|
|
|
+Unless required by applicable law or agreed to in writing, software
|
|
|
+distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
+See the License for the specific language governing permissions and
|
|
|
+limitations under the License.
|
|
|
+'''
|
|
|
+
|
|
|
+import logging
|
|
|
+import os
|
|
|
+import getpass
|
|
|
+import platform
|
|
|
+import re
|
|
|
+import shlex
|
|
|
+import socket
|
|
|
+import multiprocessing
|
|
|
+import subprocess
|
|
|
+
|
|
|
+import time
|
|
|
+import uuid
|
|
|
+import hostname
|
|
|
+
|
|
|
+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"
|
|
|
+
|
|
|
+DATA_IFCONFIG_OUTPUT = ""
|
|
|
+DATA_UPTIME_OUTPUT = ""
|
|
|
+DATA_MEMINFO_OUTPUT = ""
|
|
|
+
|
|
|
+
|
|
|
+class Facter():
|
|
|
+ def __init__(self):
|
|
|
+ global DATA_IFCONFIG_OUTPUT
|
|
|
+ DATA_IFCONFIG_OUTPUT = Facter.setDataIfConfigOutput()
|
|
|
+ global DATA_UPTIME_OUTPUT
|
|
|
+ DATA_UPTIME_OUTPUT = Facter.setDataUpTimeOutput()
|
|
|
+ global DATA_MEMINFO_OUTPUT
|
|
|
+ DATA_MEMINFO_OUTPUT = Facter.setMemInfoOutput()
|
|
|
+ pass
|
|
|
+
|
|
|
+ @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 ""
|
|
|
+
|
|
|
+ @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 ""
|
|
|
+
|
|
|
+ # Returns the currently running user id
|
|
|
+ def getId(self):
|
|
|
+ return getpass.getuser()
|
|
|
+
|
|
|
+ # Returns the OS name
|
|
|
+ def getKernel(self):
|
|
|
+ return platform.system()
|
|
|
+
|
|
|
+ # Returns the FQDN of the host
|
|
|
+ def getFqdn(self):
|
|
|
+ return socket.getfqdn()
|
|
|
+
|
|
|
+ # Returns the host's primary DNS domain name
|
|
|
+ def getDomain(self):
|
|
|
+ fqdn = self.getFqdn()
|
|
|
+ hostname = self.getHostname()
|
|
|
+ domain = fqdn.replace(hostname, "", 1)
|
|
|
+ domain = domain.replace(".", "", 1)
|
|
|
+ return domain
|
|
|
+
|
|
|
+ # Returns the short hostname
|
|
|
+ def getHostname(self):
|
|
|
+ return hostname.hostname()
|
|
|
+
|
|
|
+ # Returns the CPU hardware architecture
|
|
|
+ def getArchitecture(self):
|
|
|
+ result = platform.processor()
|
|
|
+ if result == '':
|
|
|
+ return 'OS NOT SUPPORTED'
|
|
|
+ else:
|
|
|
+ return result
|
|
|
+
|
|
|
+ # Returns the name of the OS
|
|
|
+ def getOperatingSystem(self):
|
|
|
+ dist = platform.linux_distribution()
|
|
|
+ operatingSystem = dist[0].lower()
|
|
|
+
|
|
|
+ if os.path.exists('/etc/oracle-release'):
|
|
|
+ return 'OracleLinux'
|
|
|
+ elif operatingSystem.startswith('suse linux enterprise server'):
|
|
|
+ return 'SLES'
|
|
|
+ elif operatingSystem.startswith('red hat enterprise linux server'):
|
|
|
+ return 'RedHat'
|
|
|
+ elif operatingSystem != '':
|
|
|
+ return operatingSystem
|
|
|
+ else:
|
|
|
+ return 'OS NOT SUPPORTED'
|
|
|
+
|
|
|
+ # Returns the OS vesion
|
|
|
+ def getOperatingSystemRelease(self):
|
|
|
+ dist = platform.linux_distribution()
|
|
|
+ if dist[1] != '':
|
|
|
+ return dist[1]
|
|
|
+ else:
|
|
|
+ return 'OS NOT SUPPORTED'
|
|
|
+
|
|
|
+ # Returns the OS TimeZone
|
|
|
+ def getTimeZone(self):
|
|
|
+ return time.tzname[time.daylight - 1]
|
|
|
+
|
|
|
+
|
|
|
+ # Returns the CPU count
|
|
|
+ def getProcessorcount(self):
|
|
|
+ return multiprocessing.cpu_count()
|
|
|
+
|
|
|
+ # Returns the Kernel release
|
|
|
+ def getKernelRelease(self):
|
|
|
+ return platform.release()
|
|
|
+
|
|
|
+
|
|
|
+ # Returns the Kernel release version
|
|
|
+ def getKernelVersion(self):
|
|
|
+ kernel_release = platform.release()
|
|
|
+ return kernel_release.split('-', 1)[0]
|
|
|
+
|
|
|
+ # Returns the major kernel release version
|
|
|
+ def getKernelMajVersion(self):
|
|
|
+ return '.'.join(self.getKernelVersion().split('.', 2)[0:2])
|
|
|
+
|
|
|
+ def getMacAddress(self):
|
|
|
+ mac = uuid.getnode()
|
|
|
+ if uuid.getnode() == mac:
|
|
|
+ mac = ':'.join('%02X' % ((mac >> 8 * i) & 0xff) for i in reversed(xrange(6)))
|
|
|
+ else:
|
|
|
+ mac = 'UNKNOWN'
|
|
|
+ return mac
|
|
|
+
|
|
|
+ # Returns the operating system family
|
|
|
+
|
|
|
+ def getOsFamily(self):
|
|
|
+ os_family = self.getOperatingSystem().lower()
|
|
|
+ if os_family in ['redhat', 'fedora', 'centos', 'oraclelinux', 'ascendos',
|
|
|
+ 'amazon', 'xenserver', 'oel', 'ovs', 'cloudlinux',
|
|
|
+ 'slc', 'scientific', 'psbm']:
|
|
|
+ os_family = 'RedHat'
|
|
|
+ elif os_family in ['ubuntu', 'debian']:
|
|
|
+ os_family = 'Debian'
|
|
|
+ elif os_family in ['sles', 'sled', 'opensuse', 'suse']:
|
|
|
+ os_family = 'Suse'
|
|
|
+ elif os_family == '':
|
|
|
+ os_family = 'OS NOT SUPPORTED'
|
|
|
+ else:
|
|
|
+ os_family = self.getOperatingSystem()
|
|
|
+ return os_family
|
|
|
+
|
|
|
+ def isSeLinux(self):
|
|
|
+
|
|
|
+ try:
|
|
|
+ retcode, out, err = run_os_command(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))
|
|
|
+ return False
|
|
|
+
|
|
|
+ # Function that returns list of values that matches
|
|
|
+ # Return empty str if no matches
|
|
|
+ def data_return_list(self, patern, data):
|
|
|
+ full_list = re.findall(patern, data)
|
|
|
+ result = ""
|
|
|
+ for i in full_list:
|
|
|
+ result = result + i + ","
|
|
|
+
|
|
|
+ result = re.sub(r',$', "", result)
|
|
|
+ return result
|
|
|
+
|
|
|
+ def data_return_first(self, patern, data):
|
|
|
+ full_list = re.findall(patern, data)
|
|
|
+ result = ""
|
|
|
+ if full_list:
|
|
|
+ result = full_list[0]
|
|
|
+
|
|
|
+ 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):
|
|
|
+ result = self.data_return_first("(?: inet addr:)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", DATA_IFCONFIG_OUTPUT)
|
|
|
+ if result == '':
|
|
|
+ return 'OS NOT SUPPORTED'
|
|
|
+ else:
|
|
|
+ return result
|
|
|
+
|
|
|
+ # Return netmask
|
|
|
+ def getNetmask(self):
|
|
|
+ result = self.data_return_first("(?: Mask:)(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})", DATA_IFCONFIG_OUTPUT)
|
|
|
+ if result == '':
|
|
|
+ return 'OS NOT SUPPORTED'
|
|
|
+ else:
|
|
|
+ return result
|
|
|
+
|
|
|
+ # Return interfaces
|
|
|
+ def getInterfaces(self):
|
|
|
+ result = self.data_return_list("(\w+)(?:.*Link encap:)", DATA_IFCONFIG_OUTPUT)
|
|
|
+ if result == '':
|
|
|
+ return 'OS NOT SUPPORTED'
|
|
|
+ else:
|
|
|
+ return result
|
|
|
+
|
|
|
+ # Return uptime seconds
|
|
|
+ def getUptimeSeconds(self):
|
|
|
+ try:
|
|
|
+ return int(self.data_return_first("\d+", DATA_UPTIME_OUTPUT))
|
|
|
+ except ValueError:
|
|
|
+ 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",
|
|
|
+ try:
|
|
|
+ return int(self.data_return_first("MemFree:.*?(\d+) .*", DATA_MEMINFO_OUTPUT))
|
|
|
+ except ValueError:
|
|
|
+ return 0
|
|
|
+
|
|
|
+ # Return memorytotal
|
|
|
+ def getMemoryTotal(self):
|
|
|
+ try:
|
|
|
+ return int(self.data_return_first("MemTotal:.*?(\d+) .*", DATA_MEMINFO_OUTPUT))
|
|
|
+ except ValueError:
|
|
|
+ return 0
|
|
|
+
|
|
|
+ # Return swapfree
|
|
|
+ def getSwapFree(self):
|
|
|
+ #:swapfree_mb => "SwapFree"
|
|
|
+ try:
|
|
|
+ return int(self.data_return_first("SwapFree:.*?(\d+) .*", DATA_MEMINFO_OUTPUT))
|
|
|
+ except ValueError:
|
|
|
+ return 0
|
|
|
+
|
|
|
+ # Return swapsize
|
|
|
+ def getSwapSize(self):
|
|
|
+ #:swapsize_mb => "SwapTotal",
|
|
|
+ try:
|
|
|
+ return int(self.data_return_first("SwapTotal:.*?(\d+) .*", DATA_MEMINFO_OUTPUT))
|
|
|
+ except ValueError:
|
|
|
+ return 0
|
|
|
+
|
|
|
+ # Return memorysize
|
|
|
+ def getMemorySize(self):
|
|
|
+ #:memorysize_mb => "MemTotal"
|
|
|
+ try:
|
|
|
+ return int(self.data_return_first("MemTotal:.*?(\d+) .*", DATA_MEMINFO_OUTPUT))
|
|
|
+ except ValueError:
|
|
|
+ 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['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()
|
|
|
+
|
|
|
+ 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
|
|
|
+
|
|
|
+
|
|
|
+def main(argv=None):
|
|
|
+ print Facter().facterInfo()
|
|
|
+
|
|
|
+
|
|
|
+if __name__ == '__main__':
|
|
|
+ main()
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|