# coding: utf-8
# Copyright (C) 1994-2018 Altair Engineering, Inc.
# For more information, contact Altair at www.altair.com.
#
# This file is part of the PBS Professional ("PBS Pro") software.
#
# Open Source License Information:
#
# PBS Pro is free software. You can redistribute it and/or modify it under the
# terms of the GNU Affero General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option) any
# later version.
#
# PBS Pro is distributed in the hope that it will be useful, but WITHOUT ANY
# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
# FOR A PARTICULAR PURPOSE.
# See the GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see .
#
# Commercial License Information:
#
# For a copy of the commercial license terms and conditions,
# go to: (http://www.pbspro.com/UserArea/agreement.html)
# or contact the Altair Legal Department.
#
# Altair’s dual-license business model allows companies, individuals, and
# organizations to create proprietary derivative works of PBS Pro and
# distribute them - whether embedded or bundled with other software -
# under a commercial license agreement.
#
# Use of Altair’s trademarks, including but not limited to "PBS™",
# "PBS Professional®", and "PBS Pro™" and Altair’s logos is subject to Altair's
# trademark licensing policies.
import logging
import os
import re
class CliUtils(object):
"""
Command line interface utility
"""
@classmethod
def get_logging_level(cls, level):
"""
Get the logging levels
:param level: Name of the logging level
:type level: str
"""
logging.DEBUG2 = logging.DEBUG - 1
logging.INFOCLI = logging.INFO - 1
logging.INFOCLI2 = logging.INFOCLI - 1
l = None
level = str(level).upper()
if level == 'INFO':
l = logging.INFO
elif level == 'INFOCLI':
l = logging.INFOCLI
elif level == 'INFOCLI2':
l = logging.INFOCLI2
elif level == 'DEBUG':
l = logging.DEBUG
elif level == 'DEBUG2':
l = logging.DEBUG2
elif level == 'WARNING':
l = logging.WARNING
elif level == 'ERROR':
l = logging.ERROR
elif level == 'FATAL':
l = logging.FATAL
return l
@staticmethod
def check_bin(bin_name):
"""
Check for command exist
:param bin_name: Command to be checked
:type bin_name: str
:returns: True if command exist else return False
"""
ec = os.system("/usr/bin/which " + bin_name + " > /dev/null")
if ec == 0:
return True
return False
@staticmethod
def __json__(data):
try:
import json
return json.dumps(data, sort_keys=True, indent=4)
except:
# first escape any existing double quotes
_pre = str(data).replace('"', '\\"')
# only then, replace the single quotes with double quotes
return _pre.replace('\'', '"')
@staticmethod
def expand_abs_path(path):
"""
Expand the path to absolute path
"""
if path.startswith('~'):
return os.path.expanduser(path)
return os.path.abspath(path)
@staticmethod
def priv_ports_info(hostname=None):
"""
Return a list of privileged ports in use on a given host
:param hostname: The host on which to query privilege ports
usage. Defaults to the local host
:type hostname: str or None
"""
from ptl.utils.pbs_dshutils import DshUtils
netstat_tag = re.compile("tcp[\s]+[\d]+[\s]+[\d]+[\s]+"
"(?P[\w\*\.]+):(?P[\d]+)"
"[\s]+(?P[\.\w\*:]+):"
"(?P[\d]+)"
"[\s]+(?P[\w]+).*")
du = DshUtils()
ret = du.run_cmd(hostname, ['netstat', '-at', '--numeric-ports'])
if ret['rc'] != 0:
return False
msg = []
lines = ret['out']
resv_ports = {}
source_hosts = []
for line in lines:
m = netstat_tag.match(line)
if m:
srcport = int(m.group('srcport'))
srchost = m.group('srchost')
destport = int(m.group('destport'))
desthost = m.group('desthost')
if srcport < 1024:
if srchost not in source_hosts:
source_hosts.append(srchost)
msg.append(line)
if srchost not in resv_ports:
resv_ports[srchost] = [srcport]
elif srcport not in resv_ports[srchost]:
resv_ports[srchost].append(srcport)
if destport < 1024:
msg.append(line)
if desthost not in resv_ports:
resv_ports[desthost] = [destport]
elif destport not in resv_ports[desthost]:
resv_ports[desthost].append(destport)
if len(resv_ports) > 0:
msg.append('\nPrivilege ports in use: ')
for k, v in resv_ports.items():
msg.append('\t' + k + ': ' +
str(",".join(map(lambda l: str(l), v))))
for sh in source_hosts:
msg.append('\nTotal on ' + sh + ': ' +
str(len(resv_ports[sh])))
else:
msg.append('No privileged ports currently allocated')
return msg