From 6f80e1a8182acdbd1d49e21a4451850d6df4f05c Mon Sep 17 00:00:00 2001 From: Radostin Stoyanov Date: Fri, 16 Jun 2017 11:08:15 +0100 Subject: Use setuptools (setup.py) for installation - Rename "virt-bootstrap.py" to "virt_bootstrap.py" to avoid installation issues. Reference: https://stackoverflow.com/a/30284007 Install: $ sudo ./setup.py install Clean: $ sudo ./setup.py clean --all Uninstall: $ sudo pip uninstall virt-bootstrap Or: $ sudo ./setup.py install --record installed_files.txt $ cat installed_files.txt | xargs sudo rm -rf --- src/virtBootstrap/virt-bootstrap.py | 139 ------------------------------------ src/virtBootstrap/virt_bootstrap.py | 139 ++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+), 139 deletions(-) delete mode 100755 src/virtBootstrap/virt-bootstrap.py create mode 100755 src/virtBootstrap/virt_bootstrap.py (limited to 'src/virtBootstrap') diff --git a/src/virtBootstrap/virt-bootstrap.py b/src/virtBootstrap/virt-bootstrap.py deleted file mode 100755 index 638b4d9..0000000 --- a/src/virtBootstrap/virt-bootstrap.py +++ /dev/null @@ -1,139 +0,0 @@ -#!/usr/bin/env python -# Authors: Cedric Bosdonnat -# -# Copyright (C) 2017 SUSE, Inc. -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. -# - -import argparse -import gettext -import sys -import os -from textwrap import dedent -from subprocess import CalledProcessError, Popen, PIPE -try: - from urlparse import urlparse -except ImportError: - from urllib.parse import urlparse - -import sources - - -gettext.bindtextdomain("virt-bootstrap", "/usr/share/locale") -gettext.textdomain("virt-bootstrap") -try: - gettext.install("virt-bootstrap", - localedir="/usr/share/locale", - codeset='utf-8') -except IOError: - import __builtin__ - __builtin__.__dict__['_'] = unicode - - -def get_source(args): - url = urlparse(args.uri) - scheme = url.scheme - - if scheme == "": - scheme = 'file' - - try: - class_name = "%sSource" % scheme.capitalize() - clazz = getattr(sources, class_name) - return clazz(url, - args.username, - args.password, - args.format, - args.not_secure, - args.no_cache) - except Exception: - raise Exception("Invalid image URI scheme: '%s'" % url.scheme) - - -def set_root_password(rootfs, password): - users = 'root:%s' % password - args = ['chpasswd', '-R', rootfs] - p = Popen(args, stdin=PIPE) - p.communicate(input=users) - if p.returncode != 0: - raise CalledProcessError(p.returncode, cmd=args, output=None) - - -def bootstrap(args): - source = get_source(args) - if not os.path.exists(args.dest): - os.makedirs(args.dest) - source.unpack(args.dest) - - if args.root_password is not None: - set_root_password(args.dest, args.root_password) - - -def main(): - parser = argparse.ArgumentParser( - description=_("Container bootstrapping tool"), - formatter_class=argparse.RawDescriptionHelpFormatter, - epilog=dedent(_(''' - Example supported URI formats: - ---------------------------------------- - docker://ubuntu:latest - docker://docker.io/fedora - docker://privateregistry:5000/image - file:///path/to/local/rootfs.tar.xz - ---------------------------------------- - - '''))) - parser.add_argument("uri", - help=_("URI of container image")) - parser.add_argument("dest", - help=_("Destination folder" - "where image files to be extracted")) - parser.add_argument("--not-secure", action='store_true', - help=_("Ignore HTTPS errors")) - parser.add_argument("-u", "--username", default=None, - help=_("Username to use" - "to connect to the source registry")) - parser.add_argument("-p", "--password", default=None, - help=_("Password to use" - "to connect to the source registry")) - parser.add_argument("--root-password", default=None, - help=_("Root password to set in the created rootfs")) - parser.add_argument("--no-cache", action="store_true", - help=_("Do not store downloaded Docker images")) - parser.add_argument("-f", "--format", default='dir', - choices=['dir', 'qcow2'], - help=_("Format to be used for the root filesystem")) - # TODO add UID / GID mapping parameters - - try: - args = parser.parse_args() - - # do the job here! - bootstrap(args) - - sys.exit(0) - except KeyboardInterrupt as e: - sys.exit(0) - except ValueError as e: - for line in e: - for l in line: - sys.stderr.write("%s: %s\n" % (sys.argv[0], l)) - sys.stderr.flush() - sys.exit(1) - - -if __name__ == '__main__': - sys.exit(main()) diff --git a/src/virtBootstrap/virt_bootstrap.py b/src/virtBootstrap/virt_bootstrap.py new file mode 100755 index 0000000..638b4d9 --- /dev/null +++ b/src/virtBootstrap/virt_bootstrap.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python +# Authors: Cedric Bosdonnat +# +# Copyright (C) 2017 SUSE, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +# + +import argparse +import gettext +import sys +import os +from textwrap import dedent +from subprocess import CalledProcessError, Popen, PIPE +try: + from urlparse import urlparse +except ImportError: + from urllib.parse import urlparse + +import sources + + +gettext.bindtextdomain("virt-bootstrap", "/usr/share/locale") +gettext.textdomain("virt-bootstrap") +try: + gettext.install("virt-bootstrap", + localedir="/usr/share/locale", + codeset='utf-8') +except IOError: + import __builtin__ + __builtin__.__dict__['_'] = unicode + + +def get_source(args): + url = urlparse(args.uri) + scheme = url.scheme + + if scheme == "": + scheme = 'file' + + try: + class_name = "%sSource" % scheme.capitalize() + clazz = getattr(sources, class_name) + return clazz(url, + args.username, + args.password, + args.format, + args.not_secure, + args.no_cache) + except Exception: + raise Exception("Invalid image URI scheme: '%s'" % url.scheme) + + +def set_root_password(rootfs, password): + users = 'root:%s' % password + args = ['chpasswd', '-R', rootfs] + p = Popen(args, stdin=PIPE) + p.communicate(input=users) + if p.returncode != 0: + raise CalledProcessError(p.returncode, cmd=args, output=None) + + +def bootstrap(args): + source = get_source(args) + if not os.path.exists(args.dest): + os.makedirs(args.dest) + source.unpack(args.dest) + + if args.root_password is not None: + set_root_password(args.dest, args.root_password) + + +def main(): + parser = argparse.ArgumentParser( + description=_("Container bootstrapping tool"), + formatter_class=argparse.RawDescriptionHelpFormatter, + epilog=dedent(_(''' + Example supported URI formats: + ---------------------------------------- + docker://ubuntu:latest + docker://docker.io/fedora + docker://privateregistry:5000/image + file:///path/to/local/rootfs.tar.xz + ---------------------------------------- + + '''))) + parser.add_argument("uri", + help=_("URI of container image")) + parser.add_argument("dest", + help=_("Destination folder" + "where image files to be extracted")) + parser.add_argument("--not-secure", action='store_true', + help=_("Ignore HTTPS errors")) + parser.add_argument("-u", "--username", default=None, + help=_("Username to use" + "to connect to the source registry")) + parser.add_argument("-p", "--password", default=None, + help=_("Password to use" + "to connect to the source registry")) + parser.add_argument("--root-password", default=None, + help=_("Root password to set in the created rootfs")) + parser.add_argument("--no-cache", action="store_true", + help=_("Do not store downloaded Docker images")) + parser.add_argument("-f", "--format", default='dir', + choices=['dir', 'qcow2'], + help=_("Format to be used for the root filesystem")) + # TODO add UID / GID mapping parameters + + try: + args = parser.parse_args() + + # do the job here! + bootstrap(args) + + sys.exit(0) + except KeyboardInterrupt as e: + sys.exit(0) + except ValueError as e: + for line in e: + for l in line: + sys.stderr.write("%s: %s\n" % (sys.argv[0], l)) + sys.stderr.flush() + sys.exit(1) + + +if __name__ == '__main__': + sys.exit(main()) -- cgit