blob: 28d55d1b1470f4f515ba437437189db3441e90c7 [file] [log] [blame]
#!/usr/bin/env python
# @@@ START COPYRIGHT @@@
#
# 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.
#
# @@@ END COPYRIGHT @@@
### this script should be run on all nodes with sudo user ###
import re
import os
import json
import sys
import platform
from glob import glob
from constants import DEF_CORE_SITE_XML, DEF_HBASE_HOME
from common import cmd_output, err, Version, ParseXML
PREFIX = 'get_'
NA = 'N/A' # not available
NS = 'N/S' # not supported
OK = 'OK'
def deco(func):
def wrapper(self):
if PREFIX in func.__name__:
name = func.__name__.replace(PREFIX, '')
return name, func(self)
else:
return
return wrapper
class Discover(object):
""" discover functions, to add a new discover function,
simply add a new def with name get_xx and decorated
by 'deco', then return result in string format:
@deco
def get_xx(self):
# do something
return result
"""
def __init__(self, dbcfgs):
self.CPUINFO = cmd_output('cat /proc/cpuinfo')
self.MEMINFO = cmd_output('cat /proc/meminfo')
self.SYSCTLINFO = cmd_output('sysctl -a')
self.version = Version()
self.dbcfgs = dbcfgs
def _parse_string(self, info, string):
try:
info = info.split('\n')
string_line = [line for line in info if string in line][0]
except IndexError:
err('Cannot get %s info' % string)
return string_line
def _get_cpu_info(self, string):
return self._parse_string(self.CPUINFO, string).split(':')[1].strip()
def _get_mem_info(self, string):
return self._parse_string(self.MEMINFO, string).split(':')[1].split()[0]
def _get_sysctl_info(self, string):
return self._parse_string(self.SYSCTLINFO, string).split('=')[1].strip()
@deco
def get_linux(self):
""" get linux version """
os_dist, os_ver = platform.dist()[:2]
if os_dist not in self.version.get_version('linux'):
return NA
else:
if not os_ver.split('.')[0] in self.version.get_version(os_dist):
return NA
return '%s-%s' % (os_dist, os_ver)
@deco
def get_firewall_status(self):
""" get firewall running status """
iptables_stat = cmd_output('iptables -nL|grep -vE "(Chain|target)"').strip()
if iptables_stat:
return 'Running'
else:
return 'Stopped'
@deco
def get_pidmax(self):
""" get kernel pid max setting """
return self._get_sysctl_info('kernel.pid_max')
@deco
def get_default_java(self):
""" get default java version """
jdk_path = glob('/usr/java/*') + \
glob('/usr/jdk64/*') + \
glob('/usr/lib/jvm/java-*-openjdk.x86_64')
jdk_list = {} # {jdk_version: jdk_path}
for path in jdk_path:
jdk_ver = cmd_output('%s/bin/javac -version' % path)
try:
main_ver, sub_ver = re.search(r'(\d\.\d\.\d)_(\d+)', jdk_ver).groups()
# don't support JDK version less than 1.7.0_65
if main_ver == '1.7.0' and int(sub_ver) < 65:
continue
jdk_list[main_ver] = path
except AttributeError:
continue
# auto detect JDK1.8/1.7
if jdk_list.has_key('1.8.0'):
return jdk_list['1.8.0']
elif jdk_list.has_key('1.7.0'):
return jdk_list['1.7.0']
else:
return NA
@deco
def get_hive(self):
""" get Hive status """
hive_stat = cmd_output('which hive')
if 'no hive' in hive_stat:
return NA
else:
return OK
def _get_core_site_info(self, name):
if self.dbcfgs.has_key('hadoop_home'): # apache distro
core_site_xml = '%s/etc/hadoop/core-site.xml' % self.dbcfgs['hadoop_home']
else:
core_site_xml = DEF_CORE_SITE_XML
if os.path.exists(core_site_xml):
p = ParseXML(core_site_xml)
return p.get_property(name)
else:
return NA
@deco
def get_hadoop_authentication(self):
return self._get_core_site_info('hadoop.security.authentication')
@deco
def get_hbase(self):
""" get HBase version """
if self.dbcfgs.has_key('hbase_home'): # apache distro
hbase_home = self.dbcfgs['hbase_home']
else:
hbase_home = DEF_HBASE_HOME
hbase_ver = cmd_output('%s/bin/hbase version | head -n1' % hbase_home)
support_hbase_ver = self.version.get_version('hbase')
try:
hbase_ver = re.search(r'HBase (\d\.\d)', hbase_ver).groups()[0]
except AttributeError:
return NA
if hbase_ver not in support_hbase_ver:
return NS
return hbase_ver
@deco
def get_cpu_model(self):
""" get CPU model """
return self._get_cpu_info('model name')
@deco
def get_cpu_cores(self):
""" get CPU cores """
return self.CPUINFO.count('processor')
@deco
def get_arch(self):
""" get CPU architecture """
arch = platform.processor()
if not arch:
arch = 'Unknown'
return arch
@deco
def get_mem_total(self):
""" get total memory size """
mem = self._get_mem_info('MemTotal')
memsize = mem.split()[0]
return "%0.1f GB" % round(float(memsize) / (1024 * 1024), 2)
@deco
def get_mem_free(self):
""" get current free memory size """
free = self._get_mem_info('MemFree')
buffers = self._get_mem_info('Buffers')
cached = self._get_mem_info('Cached')
memfree = float(free) + float(buffers) + float(cached)
return "%0.1f GB" % round(memfree / (1024 * 1024), 2)
@deco
def get_ext_interface(self):
""" get external network interface """
return cmd_output('ip route |grep default|awk \'{print $5}\'')
@deco
def get_rootdisk_free(self):
""" get root disk space left """
space = cmd_output('df -h|grep "\/$" | awk \'{print $4}\'')
return space.strip()
@deco
def get_python_ver(self):
""" get python version """
return platform.python_version()
@deco
def get_home_dir(self):
if self.dbcfgs.has_key('traf_user'):
traf_user = self.dbcfgs['traf_user']
return cmd_output("getent passwd %s | awk -F: '{print $6}' | sed 's/\/%s//g'" % (traf_user, traf_user))
else:
return ''
@deco
def get_traf_status(self):
""" get trafodion running status """
mon_process = cmd_output('ps -ef|grep -v grep|grep -c "monitor COLD"')
if int(mon_process) > 0:
return 'Running'
else:
return 'Stopped'
def run():
try:
dbcfgs_json = sys.argv[1]
except IndexError:
err('No db config found')
dbcfgs = json.loads(dbcfgs_json)
discover = Discover(dbcfgs)
methods = [m for m in dir(discover) if m.startswith(PREFIX)]
result = {}
for method in methods:
key, value = getattr(discover, method)() # call method
result[key] = value
print json.dumps(result)
# main
if __name__ == '__main__':
run()