xref: /OpenGrok/tools/src/main/python/opengrok_tools/utils/utils.py (revision 1242953427e70300e50b4143b807ac85fb879e5f)
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#
212d57dc69SVladimir Kotal# Copyright (c) 2018, 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
292d57dc69SVladimir Kotalfrom urllib.parse import urlparse
30941332aaSVladimir Kotalfrom distutils import util
312d57dc69SVladimir Kotalfrom .exitvals import (
322d57dc69SVladimir Kotal    FAILURE_EXITVAL,
332d57dc69SVladimir Kotal)
342d57dc69SVladimir Kotal
352d57dc69SVladimir Kotal
362d57dc69SVladimir Kotaldef is_exe(fpath):
372d57dc69SVladimir Kotal    return os.path.isfile(fpath) and os.access(fpath, os.X_OK)
382d57dc69SVladimir Kotal
392d57dc69SVladimir Kotal
402d57dc69SVladimir Kotaldef check_create_dir(logger, path):
412d57dc69SVladimir Kotal    """
422d57dc69SVladimir Kotal    Make sure the directory specified by the path exists. If unsuccessful,
432d57dc69SVladimir Kotal    exit the program.
442d57dc69SVladimir Kotal    """
452d57dc69SVladimir Kotal    if not os.path.isdir(path):
462d57dc69SVladimir Kotal        try:
472d57dc69SVladimir Kotal            os.makedirs(path)
482d57dc69SVladimir Kotal        except OSError:
492d57dc69SVladimir Kotal            logger.error("cannot create {} directory".format(path))
502d57dc69SVladimir Kotal            sys.exit(FAILURE_EXITVAL)
512d57dc69SVladimir Kotal
522d57dc69SVladimir Kotal
532d57dc69SVladimir Kotaldef get_command(logger, path, name, level=logging.ERROR):
542d57dc69SVladimir Kotal    """
552d57dc69SVladimir Kotal    Get the path to the command specified by path and name.
562d57dc69SVladimir Kotal    If the path does not contain executable, search for the command
572d57dc69SVladimir Kotal    according to name in OS environment and/or dirname.
582d57dc69SVladimir Kotal
592d57dc69SVladimir Kotal    The logging level can be used to set different log level to error messages.
602d57dc69SVladimir Kotal    This is handy when trying to determine optional command.
612d57dc69SVladimir Kotal
622d57dc69SVladimir Kotal    Return path to the command or None.
632d57dc69SVladimir Kotal    """
642d57dc69SVladimir Kotal
652d57dc69SVladimir Kotal    cmd_file = None
662d57dc69SVladimir Kotal    if path:
672d57dc69SVladimir Kotal        cmd_file = which(path)
682d57dc69SVladimir Kotal        if not is_exe(cmd_file):
692d57dc69SVladimir Kotal            log(level, "file {} is not executable file".
702d57dc69SVladimir Kotal                       format(path))
712d57dc69SVladimir Kotal            return None
722d57dc69SVladimir Kotal    else:
732d57dc69SVladimir Kotal        cmd_file = which(name)
742d57dc69SVladimir Kotal        if not cmd_file:
752d57dc69SVladimir Kotal            # try to search within dirname()
762d57dc69SVladimir Kotal            cmd_file = which(name,
772d57dc69SVladimir Kotal                             path=os.path.dirname(sys.argv[0]))
782d57dc69SVladimir Kotal            if not cmd_file:
792d57dc69SVladimir Kotal                log(level, "cannot determine path to the {} command".
802d57dc69SVladimir Kotal                           format(name))
812d57dc69SVladimir Kotal                return None
822d57dc69SVladimir Kotal    logger.debug("{} = {}".format(name, cmd_file))
832d57dc69SVladimir Kotal
842d57dc69SVladimir Kotal    return cmd_file
852d57dc69SVladimir Kotal
862d57dc69SVladimir Kotal
872d57dc69SVladimir Kotaldef get_int(logger, name, value):
882d57dc69SVladimir Kotal    """
892d57dc69SVladimir Kotal    If the supplied value is integer, return it. Otherwise return None.
902d57dc69SVladimir Kotal    """
912d57dc69SVladimir Kotal    if not value:
922d57dc69SVladimir Kotal        return None
932d57dc69SVladimir Kotal
942d57dc69SVladimir Kotal    try:
952d57dc69SVladimir Kotal        return int(value)
962d57dc69SVladimir Kotal    except ValueError:
972d57dc69SVladimir Kotal        logger.error("'{}' is not a number: {}".format(name, value))
982d57dc69SVladimir Kotal        return None
992d57dc69SVladimir Kotal
1002d57dc69SVladimir Kotal
101941332aaSVladimir Kotaldef get_bool(logger, name, value):
102941332aaSVladimir Kotal    """
103*12429534SVladimir Kotal    If the supplied value is bool or its representation, return the bool value.
104*12429534SVladimir Kotal    Otherwise return None.
105941332aaSVladimir Kotal    """
106941332aaSVladimir Kotal    if value is None:
107941332aaSVladimir Kotal        return None
108941332aaSVladimir Kotal
109*12429534SVladimir Kotal    if type(value) is bool:
110*12429534SVladimir Kotal        return value
111*12429534SVladimir Kotal
112941332aaSVladimir Kotal    try:
113941332aaSVladimir Kotal        return bool(util.strtobool(value))
114941332aaSVladimir Kotal    except ValueError:
115941332aaSVladimir Kotal        logger.error("'{}' is not a number: {}".format(name, value))
116941332aaSVladimir Kotal        return None
117941332aaSVladimir Kotal
118941332aaSVladimir Kotal
1192d57dc69SVladimir Kotaldef is_web_uri(url):
1202d57dc69SVladimir Kotal    """
1212d57dc69SVladimir Kotal    Check if given string is web URL.
1222d57dc69SVladimir Kotal    """
1232d57dc69SVladimir Kotal    o = urlparse(url)
1242d57dc69SVladimir Kotal    return o.scheme in ['http', 'https']
125