xref: /OpenGrok/tools/src/main/python/opengrok_tools/utils/utils.py (revision 2d57dc692b4dd10e696ca6922510f6cecded1bfd)
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