[libvirt] [jenkins-ci PATCH v2 03/12] lcitool: Add tool configuration handling
Katerina Koukiou
kkoukiou at redhat.com
Tue Jul 17 09:40:02 UTC 2018
On Thu, Jul 12, 2018 at 05:19:20PM +0200, Andrea Bolognani wrote:
> The on-disk configuration format and its behavior
> are fully backwards compatible with the previous
> implementation.
>
> Signed-off-by: Andrea Bolognani <abologna at redhat.com>
> ---
> guests/lcitool | 112 +++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 112 insertions(+)
>
> diff --git a/guests/lcitool b/guests/lcitool
> index 1cba8ad..e03b388 100755
> --- a/guests/lcitool
> +++ b/guests/lcitool
> @@ -18,6 +18,10 @@
> # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
>
> import argparse
> +import crypt
> +import os
> +import random
> +import string
> import sys
> import textwrap
>
> @@ -32,9 +36,117 @@ class Error(Exception):
> def __init__(self, message):
> self.message = message
>
> +class Util:
> +
> + @staticmethod
> + def mksalt():
> + alphabeth = string.ascii_letters + string.digits
> + salt = "".join(random.choice(alphabeth) for x in range(0, 16))
> + return "$6${}$".format(salt)
> +
> +class Config:
> +
> + def _get_config_file(self, name):
> + try:
> + config_dir = os.environ["XDG_CONFIG_HOME"]
> + except KeyError:
> + config_dir = os.path.join(os.environ["HOME"], ".config/")
> + config_dir = os.path.join(config_dir, "lcitool/")
> +
> + # Create the directory if it doesn't already exist
> + if not os.path.exists(config_dir):
> + try:
> + os.mkdir(config_dir)
> + except:
> + raise Error(
> + "Can't create configuration directory ({})".format(
> + config_dir,
> + )
> + )
> +
> + return os.path.join(config_dir, name)
> +
> + def get_flavor(self):
> + flavor_file = self._get_config_file("flavor")
> +
> + try:
> + with open(flavor_file, "r") as f:
> + flavor = f.readline().strip()
> + except:
And it's generally discouraged to use a bare except because it catches
BaseException. Be at least as specific as Exception, and here
specifically, perhaps catch IOError.
> + # If the flavor has not been configured, we choose the default
> + # and store it on disk to ensure consistent behavior from now on
> + flavor = "test"
> + try:
> + with open(flavor_file, "w") as f:
> + f.write("{}\n".format(flavor))
> + except:
> + raise Error(
> + "Can't write flavor file ({})".format(
> + flavor_file,
> + )
> + )
> +
> + if flavor != "test" and flavor != "jenkins":
More pythonic would be "flavor not in ('test', 'jenkins')"
> + raise Error("Invalid flavor '{}'".format(flavor))
> +
> + return flavor
> +
> + def get_vault_password_file(self):
> + vault_pass_file = None
> +
> + # The vault password is only needed for the jenkins flavor, but in
> + # that case we want to make sure there's *something* in there
> + if self.get_flavor() != "test":
> + vault_pass_file = self._get_config_file("vault-password")
> +
> + try:
> + with open(vault_pass_file, 'r') as f:
> + if len(f.readline().strip()) == 0:
> + raise ValueError
> + except:
> + raise Error(
> + "Missing or invalid vault password file ({})".format(
> + vault_pass_file,
> + )
> + )
> +
> + return vault_pass_file
> +
> + def get_root_password_file(self):
> + root_pass_file = self._get_config_file("root-password")
> + root_hash_file = self._get_config_file(".root-password.hash")
> +
> + try:
> + with open(root_pass_file, "r") as f:
> + root_pass = f.readline().strip()
> + except:
> + raise Error(
> + "Missing or invalid root password file ({})".format(
> + root_pass_file,
> + )
> + )
> +
> + # The hash will be different every time we run, but that doesn't
> + # matter - it will still validate the correct root password
> + root_hash = crypt.crypt(root_pass, Util.mksalt())
> +
> + try:
> + with open(root_hash_file, "w") as f:
> + f.write("{}\n".format(root_hash))
> + except:
> + raise Error(
> + "Can't write hashed root password file ({})".format(
> + root_hash_file,
> + )
> + )
> +
> + return root_hash_file
> +
> class Application:
>
> def __init__(self):
> + self._config = Config()
> +
> self._parser = argparse.ArgumentParser(
> conflict_handler = "resolve",
> formatter_class = argparse.RawDescriptionHelpFormatter,
> --
> 2.17.1
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20180717/32e26555/attachment-0001.sig>
More information about the libvir-list
mailing list