12d57dc69SVladimir Kotal# 22d57dc69SVladimir Kotal# CDDL HEADER START 32d57dc69SVladimir Kotal# 42d57dc69SVladimir Kotal# The contents of this file are subject to the terms of the 52d57dc69SVladimir Kotal# Common Development and Distribution License (the "License"). 62d57dc69SVladimir Kotal# You may not use this file except in compliance with the License. 72d57dc69SVladimir Kotal# 82d57dc69SVladimir Kotal# See LICENSE.txt included in this distribution for the specific 92d57dc69SVladimir Kotal# language governing permissions and limitations under the License. 102d57dc69SVladimir Kotal# 112d57dc69SVladimir Kotal# When distributing Covered Code, include this CDDL HEADER in each 122d57dc69SVladimir Kotal# file and include the License file at LICENSE.txt. 132d57dc69SVladimir Kotal# If applicable, add the following below this CDDL HEADER, with the 142d57dc69SVladimir Kotal# fields enclosed by brackets "[]" replaced with your own identifying 152d57dc69SVladimir Kotal# information: Portions Copyright [yyyy] [name of copyright owner] 162d57dc69SVladimir Kotal# 172d57dc69SVladimir Kotal# CDDL HEADER END 182d57dc69SVladimir Kotal# 192d57dc69SVladimir Kotal 202d57dc69SVladimir Kotal# 21*c41895f8SVladimir Kotal# Copyright (c) 2018, 2022, Oracle and/or its affiliates. All rights reserved. 222d57dc69SVladimir Kotal# 232d57dc69SVladimir Kotal 242d57dc69SVladimir Kotalimport os 252d57dc69SVladimir Kotalfrom shutil import which 262d57dc69SVladimir Kotalfrom logging import log 272d57dc69SVladimir Kotalimport logging 282d57dc69SVladimir Kotalimport sys 29941332aaSVladimir Kotalfrom distutils import util 302d57dc69SVladimir Kotalfrom .exitvals import ( 312d57dc69SVladimir Kotal FAILURE_EXITVAL, 322d57dc69SVladimir Kotal) 332d57dc69SVladimir Kotal 342d57dc69SVladimir Kotal 352d57dc69SVladimir Kotaldef is_exe(fpath): 362d57dc69SVladimir Kotal return os.path.isfile(fpath) and os.access(fpath, os.X_OK) 372d57dc69SVladimir Kotal 382d57dc69SVladimir Kotal 392d57dc69SVladimir Kotaldef check_create_dir(logger, path): 402d57dc69SVladimir Kotal """ 412d57dc69SVladimir Kotal Make sure the directory specified by the path exists. If unsuccessful, 422d57dc69SVladimir Kotal exit the program. 432d57dc69SVladimir Kotal """ 442d57dc69SVladimir Kotal if not os.path.isdir(path): 452d57dc69SVladimir Kotal try: 462d57dc69SVladimir Kotal os.makedirs(path) 472d57dc69SVladimir Kotal except OSError: 482d57dc69SVladimir Kotal logger.error("cannot create {} directory".format(path)) 492d57dc69SVladimir Kotal sys.exit(FAILURE_EXITVAL) 502d57dc69SVladimir Kotal 512d57dc69SVladimir Kotal 522d57dc69SVladimir Kotaldef get_command(logger, path, name, level=logging.ERROR): 532d57dc69SVladimir Kotal """ 542d57dc69SVladimir Kotal Get the path to the command specified by path and name. 552d57dc69SVladimir Kotal If the path does not contain executable, search for the command 562d57dc69SVladimir Kotal according to name in OS environment and/or dirname. 572d57dc69SVladimir Kotal 582d57dc69SVladimir Kotal The logging level can be used to set different log level to error messages. 592d57dc69SVladimir Kotal This is handy when trying to determine optional command. 602d57dc69SVladimir Kotal 612d57dc69SVladimir Kotal Return path to the command or None. 622d57dc69SVladimir Kotal """ 632d57dc69SVladimir Kotal 642d57dc69SVladimir Kotal cmd_file = None 652d57dc69SVladimir Kotal if path: 662d57dc69SVladimir Kotal cmd_file = which(path) 672d57dc69SVladimir Kotal if not is_exe(cmd_file): 682d57dc69SVladimir Kotal log(level, "file {} is not executable file". 692d57dc69SVladimir Kotal format(path)) 702d57dc69SVladimir Kotal return None 712d57dc69SVladimir Kotal else: 722d57dc69SVladimir Kotal cmd_file = which(name) 732d57dc69SVladimir Kotal if not cmd_file: 742d57dc69SVladimir Kotal # try to search within dirname() 752d57dc69SVladimir Kotal cmd_file = which(name, 762d57dc69SVladimir Kotal path=os.path.dirname(sys.argv[0])) 772d57dc69SVladimir Kotal if not cmd_file: 782d57dc69SVladimir Kotal log(level, "cannot determine path to the {} command". 792d57dc69SVladimir Kotal format(name)) 802d57dc69SVladimir Kotal return None 812d57dc69SVladimir Kotal logger.debug("{} = {}".format(name, cmd_file)) 822d57dc69SVladimir Kotal 832d57dc69SVladimir Kotal return cmd_file 842d57dc69SVladimir Kotal 852d57dc69SVladimir Kotal 862d57dc69SVladimir Kotaldef get_int(logger, name, value): 872d57dc69SVladimir Kotal """ 882d57dc69SVladimir Kotal If the supplied value is integer, return it. Otherwise return None. 892d57dc69SVladimir Kotal """ 902d57dc69SVladimir Kotal if not value: 912d57dc69SVladimir Kotal return None 922d57dc69SVladimir Kotal 932d57dc69SVladimir Kotal try: 942d57dc69SVladimir Kotal return int(value) 952d57dc69SVladimir Kotal except ValueError: 962d57dc69SVladimir Kotal logger.error("'{}' is not a number: {}".format(name, value)) 972d57dc69SVladimir Kotal return None 982d57dc69SVladimir Kotal 992d57dc69SVladimir Kotal 100941332aaSVladimir Kotaldef get_bool(logger, name, value): 101941332aaSVladimir Kotal """ 10212429534SVladimir Kotal If the supplied value is bool or its representation, return the bool value. 10312429534SVladimir Kotal Otherwise return None. 104941332aaSVladimir Kotal """ 105941332aaSVladimir Kotal if value is None: 106941332aaSVladimir Kotal return None 107941332aaSVladimir Kotal 10812429534SVladimir Kotal if type(value) is bool: 10912429534SVladimir Kotal return value 11012429534SVladimir Kotal 111941332aaSVladimir Kotal try: 112941332aaSVladimir Kotal return bool(util.strtobool(value)) 113941332aaSVladimir Kotal except ValueError: 114941332aaSVladimir Kotal logger.error("'{}' is not a number: {}".format(name, value)) 115941332aaSVladimir Kotal return None 116