blob: 552f0e0dac5e017f5ab794c26b1ccb38353e48f1 [file] [log] [blame]
#!/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
from common_functions 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 ""
@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 self.getFqdn().split('.', 1)[0]
# Returns the CPU hardware architecture
def getArchitecture(self):
result = platform.processor()
if result == '':
return 'OS NOT SUPPORTED'
else:
return result
# Returns the full name of the OS
def getOperatingSystem(self):
return OSCheck().get_os_type()
# Returns the OS version
def getOperatingSystemRelease(self):
return OSCheck().get_os_version()
# 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):
return OSCheck().get_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})",
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())
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})",
self.DATA_IFCONFIG_OUTPUT)
if result == '':
log.warn("Can't get a netmask from {0}".format(self.DATA_IFCONFIG_OUTPUT))
return 'OS NOT SUPPORTED'
else:
return result
# Return interfaces
def getInterfaces(self):
result = self.data_return_list("(\w+)(?:.*Link encap:)", self.DATA_IFCONFIG_OUTPUT)
if result == '':
log.warn("Can't get a network interfaces list from {0}".format(self.DATA_IFCONFIG_OUTPUT))
return 'OS NOT SUPPORTED'
else:
return result
# Return uptime seconds
def getUptimeSeconds(self):
try:
return int(self.data_return_first("\d+", self.DATA_UPTIME_OUTPUT))
except ValueError:
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",
try:
return int(self.data_return_first("MemFree:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT))
except ValueError:
log.warn("Can't get free memory size from {0}".format(self.DATA_MEMINFO_OUTPUT))
return 0
# Return memorytotal
def getMemoryTotal(self):
try:
return int(self.data_return_first("MemTotal:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT))
except ValueError:
log.warn("Can't get total memory size from {0}".format(self.DATA_MEMINFO_OUTPUT))
return 0
# Return swapfree
def getSwapFree(self):
#:swapfree_mb => "SwapFree"
try:
return int(self.data_return_first("SwapFree:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT))
except ValueError:
log.warn("Can't get free swap memory size from {0}".format(self.DATA_MEMINFO_OUTPUT))
return 0
# Return swapsize
def getSwapSize(self):
#:swapsize_mb => "SwapTotal",
try:
return int(self.data_return_first("SwapTotal:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT))
except ValueError:
log.warn("Can't get total swap memory size from {0}".format(self.DATA_MEMINFO_OUTPUT))
return 0
# Return memorysize
def getMemorySize(self):
#:memorysize_mb => "MemTotal"
try:
return int(self.data_return_first("MemTotal:.*?(\d+) .*", self.DATA_MEMINFO_OUTPUT))
except ValueError:
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['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()