1*2d57dc69SVladimir Kotal# 2*2d57dc69SVladimir Kotal# CDDL HEADER START 3*2d57dc69SVladimir Kotal# 4*2d57dc69SVladimir Kotal# The contents of this file are subject to the terms of the 5*2d57dc69SVladimir Kotal# Common Development and Distribution License (the "License"). 6*2d57dc69SVladimir Kotal# You may not use this file except in compliance with the License. 7*2d57dc69SVladimir Kotal# 8*2d57dc69SVladimir Kotal# See LICENSE.txt included in this distribution for the specific 9*2d57dc69SVladimir Kotal# language governing permissions and limitations under the License. 10*2d57dc69SVladimir Kotal# 11*2d57dc69SVladimir Kotal# When distributing Covered Code, include this CDDL HEADER in each 12*2d57dc69SVladimir Kotal# file and include the License file at LICENSE.txt. 13*2d57dc69SVladimir Kotal# If applicable, add the following below this CDDL HEADER, with the 14*2d57dc69SVladimir Kotal# fields enclosed by brackets "[]" replaced with your own identifying 15*2d57dc69SVladimir Kotal# information: Portions Copyright [yyyy] [name of copyright owner] 16*2d57dc69SVladimir Kotal# 17*2d57dc69SVladimir Kotal# CDDL HEADER END 18*2d57dc69SVladimir Kotal# 19*2d57dc69SVladimir Kotal 20*2d57dc69SVladimir Kotal# 21*2d57dc69SVladimir Kotal# Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved. 22*2d57dc69SVladimir Kotal# 23*2d57dc69SVladimir Kotal 24*2d57dc69SVladimir Kotalimport os 25*2d57dc69SVladimir Kotalfrom shutil import which 26*2d57dc69SVladimir Kotalfrom logging import log 27*2d57dc69SVladimir Kotalimport logging 28*2d57dc69SVladimir Kotalimport sys 29*2d57dc69SVladimir Kotalfrom urllib.parse import urlparse 30*2d57dc69SVladimir Kotalfrom .exitvals import ( 31*2d57dc69SVladimir Kotal FAILURE_EXITVAL, 32*2d57dc69SVladimir Kotal) 33*2d57dc69SVladimir Kotal 34*2d57dc69SVladimir Kotal 35*2d57dc69SVladimir Kotaldef is_exe(fpath): 36*2d57dc69SVladimir Kotal return os.path.isfile(fpath) and os.access(fpath, os.X_OK) 37*2d57dc69SVladimir Kotal 38*2d57dc69SVladimir Kotal 39*2d57dc69SVladimir Kotaldef check_create_dir(logger, path): 40*2d57dc69SVladimir Kotal """ 41*2d57dc69SVladimir Kotal Make sure the directory specified by the path exists. If unsuccessful, 42*2d57dc69SVladimir Kotal exit the program. 43*2d57dc69SVladimir Kotal """ 44*2d57dc69SVladimir Kotal if not os.path.isdir(path): 45*2d57dc69SVladimir Kotal try: 46*2d57dc69SVladimir Kotal os.makedirs(path) 47*2d57dc69SVladimir Kotal except OSError: 48*2d57dc69SVladimir Kotal logger.error("cannot create {} directory".format(path)) 49*2d57dc69SVladimir Kotal sys.exit(FAILURE_EXITVAL) 50*2d57dc69SVladimir Kotal 51*2d57dc69SVladimir Kotal 52*2d57dc69SVladimir Kotaldef get_command(logger, path, name, level=logging.ERROR): 53*2d57dc69SVladimir Kotal """ 54*2d57dc69SVladimir Kotal Get the path to the command specified by path and name. 55*2d57dc69SVladimir Kotal If the path does not contain executable, search for the command 56*2d57dc69SVladimir Kotal according to name in OS environment and/or dirname. 57*2d57dc69SVladimir Kotal 58*2d57dc69SVladimir Kotal The logging level can be used to set different log level to error messages. 59*2d57dc69SVladimir Kotal This is handy when trying to determine optional command. 60*2d57dc69SVladimir Kotal 61*2d57dc69SVladimir Kotal Return path to the command or None. 62*2d57dc69SVladimir Kotal """ 63*2d57dc69SVladimir Kotal 64*2d57dc69SVladimir Kotal cmd_file = None 65*2d57dc69SVladimir Kotal if path: 66*2d57dc69SVladimir Kotal cmd_file = which(path) 67*2d57dc69SVladimir Kotal if not is_exe(cmd_file): 68*2d57dc69SVladimir Kotal log(level, "file {} is not executable file". 69*2d57dc69SVladimir Kotal format(path)) 70*2d57dc69SVladimir Kotal return None 71*2d57dc69SVladimir Kotal else: 72*2d57dc69SVladimir Kotal cmd_file = which(name) 73*2d57dc69SVladimir Kotal if not cmd_file: 74*2d57dc69SVladimir Kotal # try to search within dirname() 75*2d57dc69SVladimir Kotal cmd_file = which(name, 76*2d57dc69SVladimir Kotal path=os.path.dirname(sys.argv[0])) 77*2d57dc69SVladimir Kotal if not cmd_file: 78*2d57dc69SVladimir Kotal log(level, "cannot determine path to the {} command". 79*2d57dc69SVladimir Kotal format(name)) 80*2d57dc69SVladimir Kotal return None 81*2d57dc69SVladimir Kotal logger.debug("{} = {}".format(name, cmd_file)) 82*2d57dc69SVladimir Kotal 83*2d57dc69SVladimir Kotal return cmd_file 84*2d57dc69SVladimir Kotal 85*2d57dc69SVladimir Kotal 86*2d57dc69SVladimir Kotaldef get_int(logger, name, value): 87*2d57dc69SVladimir Kotal """ 88*2d57dc69SVladimir Kotal If the supplied value is integer, return it. Otherwise return None. 89*2d57dc69SVladimir Kotal """ 90*2d57dc69SVladimir Kotal if not value: 91*2d57dc69SVladimir Kotal return None 92*2d57dc69SVladimir Kotal 93*2d57dc69SVladimir Kotal try: 94*2d57dc69SVladimir Kotal return int(value) 95*2d57dc69SVladimir Kotal except ValueError: 96*2d57dc69SVladimir Kotal logger.error("'{}' is not a number: {}".format(name, value)) 97*2d57dc69SVladimir Kotal return None 98*2d57dc69SVladimir Kotal 99*2d57dc69SVladimir Kotal 100*2d57dc69SVladimir Kotaldef is_web_uri(url): 101*2d57dc69SVladimir Kotal """ 102*2d57dc69SVladimir Kotal Check if given string is web URL. 103*2d57dc69SVladimir Kotal """ 104*2d57dc69SVladimir Kotal o = urlparse(url) 105*2d57dc69SVladimir Kotal return o.scheme in ['http', 'https'] 106