From faad336946fff4b63a607de434ce1fd268b5ecb0 Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Mon, 26 Apr 2021 16:24:12 -0700 Subject: [PATCH] New lorax documentation - 34.9.0 Related: rhbz#1952978 --- docs/Makefile | 2 +- docs/composer-cli.rst | 542 - docs/composer.cli.rst | 101 - docs/composer.rst | 37 - docs/conf.py | 1 - docs/html/.buildinfo | 2 +- docs/html/.doctrees/composer-cli.doctree | Bin 117558 -> 0 bytes docs/html/.doctrees/composer.cli.doctree | Bin 427593 -> 0 bytes docs/html/.doctrees/composer.doctree | Bin 66251 -> 0 bytes docs/html/.doctrees/environment.pickle | Bin 2450517 -> 1983311 bytes docs/html/.doctrees/index.doctree | Bin 8319 -> 8299 bytes docs/html/.doctrees/lifted.doctree | Bin 3715 -> 0 bytes docs/html/.doctrees/livemedia-creator.doctree | Bin 170060 -> 170310 bytes docs/html/.doctrees/lorax-composer.doctree | Bin 4153 -> 0 bytes docs/html/.doctrees/lorax.doctree | Bin 81120 -> 81120 bytes docs/html/.doctrees/modules.doctree | Bin 2554 -> 2536 bytes docs/html/.doctrees/pylorax.api.doctree | Bin 1004255 -> 0 bytes docs/html/.doctrees/pylorax.doctree | Bin 607937 -> 577219 bytes docs/html/README | 5 - docs/html/_modules/composer/cli.html | 258 - .../_modules/composer/cli/blueprints.html | 778 -- docs/html/_modules/composer/cli/cmdline.html | 250 - docs/html/_modules/composer/cli/compose.html | 891 -- docs/html/_modules/composer/cli/modules.html | 248 - docs/html/_modules/composer/cli/projects.html | 310 - .../html/_modules/composer/cli/providers.html | 522 - docs/html/_modules/composer/cli/sources.html | 352 - docs/html/_modules/composer/cli/status.html | 256 - docs/html/_modules/composer/cli/upload.html | 477 - .../html/_modules/composer/cli/utilities.html | 323 - docs/html/_modules/composer/http_client.html | 458 - docs/html/_modules/composer/unix_socket.html | 261 - docs/html/_modules/index.html | 86 +- docs/html/_modules/lifted/config.html | 233 - docs/html/_modules/lifted/providers.html | 443 - docs/html/_modules/lifted/queue.html | 467 - docs/html/_modules/lifted/upload.html | 410 - docs/html/_modules/pylorax.html | 49 +- docs/html/_modules/pylorax/api/bisect.html | 249 - .../_modules/pylorax/api/checkparams.html | 244 - docs/html/_modules/pylorax/api/cmdline.html | 263 - docs/html/_modules/pylorax/api/compose.html | 1467 --- docs/html/_modules/pylorax/api/config.html | 340 - .../_modules/pylorax/api/crossdomain.html | 264 - docs/html/_modules/pylorax/api/dnfbase.html | 386 - .../_modules/pylorax/api/flask_blueprint.html | 254 - docs/html/_modules/pylorax/api/gitrpm.html | 422 - docs/html/_modules/pylorax/api/projects.html | 897 -- docs/html/_modules/pylorax/api/queue.html | 1063 -- docs/html/_modules/pylorax/api/recipes.html | 1476 --- docs/html/_modules/pylorax/api/server.html | 303 - docs/html/_modules/pylorax/api/timestamp.html | 251 - docs/html/_modules/pylorax/api/toml.html | 242 - docs/html/_modules/pylorax/api/utils.html | 249 - docs/html/_modules/pylorax/api/v0.html | 2197 ---- docs/html/_modules/pylorax/api/v1.html | 1242 -- docs/html/_modules/pylorax/api/workspace.html | 329 - docs/html/_modules/pylorax/base.html | 47 +- docs/html/_modules/pylorax/buildstamp.html | 47 +- docs/html/_modules/pylorax/cmdline.html | 49 +- docs/html/_modules/pylorax/creator.html | 51 +- docs/html/_modules/pylorax/decorators.html | 47 +- docs/html/_modules/pylorax/discinfo.html | 47 +- docs/html/_modules/pylorax/dnfbase.html | 49 +- docs/html/_modules/pylorax/dnfhelper.html | 47 +- docs/html/_modules/pylorax/executils.html | 99 +- docs/html/_modules/pylorax/imgutils.html | 68 +- docs/html/_modules/pylorax/installer.html | 64 +- docs/html/_modules/pylorax/ltmpl.html | 49 +- docs/html/_modules/pylorax/monitor.html | 50 +- docs/html/_modules/pylorax/mount.html | 47 +- docs/html/_modules/pylorax/sysutils.html | 51 +- docs/html/_modules/pylorax/treebuilder.html | 47 +- docs/html/_modules/pylorax/treeinfo.html | 47 +- docs/html/_sources/composer-cli.rst.txt | 542 - docs/html/_sources/composer.cli.rst.txt | 101 - docs/html/_sources/composer.rst.txt | 37 - docs/html/_sources/index.rst.txt | 1 - docs/html/_sources/lifted.rst.txt | 46 - docs/html/_sources/lorax-composer.rst.txt | 8 - docs/html/_sources/modules.rst.txt | 1 - docs/html/_sources/pylorax.api.rst.txt | 173 - docs/html/_static/ajax-loader.gif | Bin 673 -> 0 bytes docs/html/_static/basic.css | 3 +- docs/html/_static/comment-bright.png | Bin 756 -> 0 bytes docs/html/_static/comment-close.png | Bin 829 -> 0 bytes docs/html/_static/comment.png | Bin 641 -> 0 bytes docs/html/_static/css/badge_only.css | 2 +- docs/html/_static/css/theme.css | 6 +- docs/html/_static/doctools.js | 14 +- docs/html/_static/documentation_options.js | 2 +- docs/html/_static/down-pressed.png | Bin 222 -> 0 bytes docs/html/_static/down.png | Bin 202 -> 0 bytes docs/html/_static/fonts/Inconsolata-Bold.ttf | Bin 108360 -> 0 bytes .../_static/fonts/Inconsolata-Regular.ttf | Bin 95960 -> 0 bytes docs/html/_static/fonts/Lato-Bold.ttf | Bin 657188 -> 0 bytes docs/html/_static/fonts/Lato-BoldItalic.ttf | Bin 699008 -> 0 bytes docs/html/_static/fonts/Lato-Italic.ttf | Bin 723544 -> 0 bytes docs/html/_static/fonts/Lato-Regular.ttf | Bin 657212 -> 0 bytes docs/html/_static/fonts/Lato/lato-bold.eot | Bin 256056 -> 0 bytes docs/html/_static/fonts/Lato/lato-bold.ttf | Bin 657188 -> 0 bytes docs/html/_static/fonts/Lato/lato-bold.woff | Bin 309728 -> 0 bytes docs/html/_static/fonts/Lato/lato-bold.woff2 | Bin 184912 -> 0 bytes .../_static/fonts/Lato/lato-bolditalic.eot | Bin 266158 -> 0 bytes .../_static/fonts/Lato/lato-bolditalic.ttf | Bin 699008 -> 0 bytes .../_static/fonts/Lato/lato-bolditalic.woff | Bin 323344 -> 0 bytes .../_static/fonts/Lato/lato-bolditalic.woff2 | Bin 193308 -> 0 bytes docs/html/_static/fonts/Lato/lato-italic.eot | Bin 268604 -> 0 bytes docs/html/_static/fonts/Lato/lato-italic.ttf | Bin 723544 -> 0 bytes docs/html/_static/fonts/Lato/lato-italic.woff | Bin 328412 -> 0 bytes .../html/_static/fonts/Lato/lato-italic.woff2 | Bin 195704 -> 0 bytes docs/html/_static/fonts/Lato/lato-regular.eot | Bin 253461 -> 0 bytes docs/html/_static/fonts/Lato/lato-regular.ttf | Bin 657212 -> 0 bytes .../html/_static/fonts/Lato/lato-regular.woff | Bin 309192 -> 0 bytes .../_static/fonts/Lato/lato-regular.woff2 | Bin 182708 -> 0 bytes docs/html/_static/fonts/RobotoSlab-Bold.ttf | Bin 170616 -> 0 bytes .../html/_static/fonts/RobotoSlab-Regular.ttf | Bin 169064 -> 0 bytes .../fonts/RobotoSlab/roboto-slab-v7-bold.eot | Bin 79520 -> 0 bytes .../fonts/RobotoSlab/roboto-slab-v7-bold.ttf | Bin 170616 -> 0 bytes .../fonts/RobotoSlab/roboto-slab-v7-bold.woff | Bin 87624 -> 0 bytes .../RobotoSlab/roboto-slab-v7-bold.woff2 | Bin 67312 -> 0 bytes .../RobotoSlab/roboto-slab-v7-regular.eot | Bin 78331 -> 0 bytes .../RobotoSlab/roboto-slab-v7-regular.ttf | Bin 169064 -> 0 bytes .../RobotoSlab/roboto-slab-v7-regular.woff | Bin 86288 -> 0 bytes .../RobotoSlab/roboto-slab-v7-regular.woff2 | Bin 66444 -> 0 bytes .../_static/fonts/fontawesome-webfont.eot | Bin 165742 -> 0 bytes .../_static/fonts/fontawesome-webfont.svg | 2671 ---- .../_static/fonts/fontawesome-webfont.ttf | Bin 165548 -> 0 bytes .../_static/fonts/fontawesome-webfont.woff | Bin 98024 -> 0 bytes .../_static/fonts/fontawesome-webfont.woff2 | Bin 77160 -> 0 bytes docs/html/_static/jquery-3.2.1.js | 10253 --------------- docs/html/_static/jquery-3.4.1.js | 10598 ---------------- docs/html/_static/js/badge_only.js | 1 + docs/html/_static/js/modernizr.min.js | 4 - docs/html/_static/js/theme.js | 4 +- docs/html/_static/language_data.js | 6 +- docs/html/_static/pygments.css | 7 +- docs/html/_static/searchtools.js | 36 +- docs/html/_static/underscore-1.12.0.js | 2027 +++ docs/html/_static/underscore-1.3.1.js | 999 -- docs/html/_static/underscore.js | 37 +- docs/html/_static/up-pressed.png | Bin 214 -> 0 bytes docs/html/_static/up.png | Bin 203 -> 0 bytes docs/html/_static/websupport.js | 808 -- docs/html/composer-cli.html | 863 -- docs/html/composer.cli.html | 1503 --- docs/html/composer.html | 504 - docs/html/genindex.html | 370 +- docs/html/index.html | 56 +- docs/html/intro.html | 60 +- docs/html/lifted.html | 222 - docs/html/livemedia-creator.html | 97 +- docs/html/lorax-composer.html | 208 - docs/html/lorax.html | 82 +- docs/html/mkksiso.html | 62 +- docs/html/modules.html | 87 +- docs/html/objects.inv | Bin 2720 -> 2030 bytes docs/html/product-images.html | 60 +- docs/html/py-modindex.html | 165 +- docs/html/pylorax.api.html | 5206 -------- docs/html/pylorax.html | 638 +- docs/html/search.html | 53 +- docs/html/searchindex.js | 2 +- docs/index.rst | 1 - docs/lorax-composer.rst | 8 - docs/man/.doctrees/composer-cli.doctree | Bin 117558 -> 0 bytes docs/man/.doctrees/composer.cli.doctree | Bin 427593 -> 0 bytes docs/man/.doctrees/composer.doctree | Bin 66251 -> 0 bytes docs/man/.doctrees/environment.pickle | Bin 2450516 -> 1983310 bytes docs/man/.doctrees/index.doctree | Bin 8319 -> 8299 bytes docs/man/.doctrees/livemedia-creator.doctree | Bin 170060 -> 170310 bytes docs/man/.doctrees/lorax-composer.doctree | Bin 4153 -> 0 bytes docs/man/.doctrees/lorax.doctree | Bin 81120 -> 81120 bytes docs/man/.doctrees/modules.doctree | Bin 2554 -> 2536 bytes docs/man/.doctrees/pylorax.doctree | Bin 607937 -> 577219 bytes docs/man/composer-cli.1 | 922 -- docs/man/livemedia-creator.1 | 37 +- docs/man/lorax.1 | 24 +- docs/man/mkksiso.1 | 2 +- docs/modules.rst | 1 - 180 files changed, 3383 insertions(+), 57043 deletions(-) delete mode 100644 docs/composer-cli.rst delete mode 100644 docs/composer.cli.rst delete mode 100644 docs/composer.rst delete mode 100644 docs/html/.doctrees/composer-cli.doctree delete mode 100644 docs/html/.doctrees/composer.cli.doctree delete mode 100644 docs/html/.doctrees/composer.doctree delete mode 100644 docs/html/.doctrees/lifted.doctree delete mode 100644 docs/html/.doctrees/lorax-composer.doctree delete mode 100644 docs/html/.doctrees/pylorax.api.doctree delete mode 100644 docs/html/README delete mode 100644 docs/html/_modules/composer/cli.html delete mode 100644 docs/html/_modules/composer/cli/blueprints.html delete mode 100644 docs/html/_modules/composer/cli/cmdline.html delete mode 100644 docs/html/_modules/composer/cli/compose.html delete mode 100644 docs/html/_modules/composer/cli/modules.html delete mode 100644 docs/html/_modules/composer/cli/projects.html delete mode 100644 docs/html/_modules/composer/cli/providers.html delete mode 100644 docs/html/_modules/composer/cli/sources.html delete mode 100644 docs/html/_modules/composer/cli/status.html delete mode 100644 docs/html/_modules/composer/cli/upload.html delete mode 100644 docs/html/_modules/composer/cli/utilities.html delete mode 100644 docs/html/_modules/composer/http_client.html delete mode 100644 docs/html/_modules/composer/unix_socket.html delete mode 100644 docs/html/_modules/lifted/config.html delete mode 100644 docs/html/_modules/lifted/providers.html delete mode 100644 docs/html/_modules/lifted/queue.html delete mode 100644 docs/html/_modules/lifted/upload.html delete mode 100644 docs/html/_modules/pylorax/api/bisect.html delete mode 100644 docs/html/_modules/pylorax/api/checkparams.html delete mode 100644 docs/html/_modules/pylorax/api/cmdline.html delete mode 100644 docs/html/_modules/pylorax/api/compose.html delete mode 100644 docs/html/_modules/pylorax/api/config.html delete mode 100644 docs/html/_modules/pylorax/api/crossdomain.html delete mode 100644 docs/html/_modules/pylorax/api/dnfbase.html delete mode 100644 docs/html/_modules/pylorax/api/flask_blueprint.html delete mode 100644 docs/html/_modules/pylorax/api/gitrpm.html delete mode 100644 docs/html/_modules/pylorax/api/projects.html delete mode 100644 docs/html/_modules/pylorax/api/queue.html delete mode 100644 docs/html/_modules/pylorax/api/recipes.html delete mode 100644 docs/html/_modules/pylorax/api/server.html delete mode 100644 docs/html/_modules/pylorax/api/timestamp.html delete mode 100644 docs/html/_modules/pylorax/api/toml.html delete mode 100644 docs/html/_modules/pylorax/api/utils.html delete mode 100644 docs/html/_modules/pylorax/api/v0.html delete mode 100644 docs/html/_modules/pylorax/api/v1.html delete mode 100644 docs/html/_modules/pylorax/api/workspace.html delete mode 100644 docs/html/_sources/composer-cli.rst.txt delete mode 100644 docs/html/_sources/composer.cli.rst.txt delete mode 100644 docs/html/_sources/composer.rst.txt delete mode 100644 docs/html/_sources/lifted.rst.txt delete mode 100644 docs/html/_sources/lorax-composer.rst.txt delete mode 100644 docs/html/_sources/pylorax.api.rst.txt delete mode 100644 docs/html/_static/ajax-loader.gif delete mode 100644 docs/html/_static/comment-bright.png delete mode 100644 docs/html/_static/comment-close.png delete mode 100644 docs/html/_static/comment.png delete mode 100644 docs/html/_static/down-pressed.png delete mode 100644 docs/html/_static/down.png delete mode 100644 docs/html/_static/fonts/Inconsolata-Bold.ttf delete mode 100644 docs/html/_static/fonts/Inconsolata-Regular.ttf delete mode 100644 docs/html/_static/fonts/Lato-Bold.ttf delete mode 100644 docs/html/_static/fonts/Lato-BoldItalic.ttf delete mode 100644 docs/html/_static/fonts/Lato-Italic.ttf delete mode 100644 docs/html/_static/fonts/Lato-Regular.ttf delete mode 100644 docs/html/_static/fonts/Lato/lato-bold.eot delete mode 100644 docs/html/_static/fonts/Lato/lato-bold.ttf delete mode 100644 docs/html/_static/fonts/Lato/lato-bold.woff delete mode 100644 docs/html/_static/fonts/Lato/lato-bold.woff2 delete mode 100644 docs/html/_static/fonts/Lato/lato-bolditalic.eot delete mode 100644 docs/html/_static/fonts/Lato/lato-bolditalic.ttf delete mode 100644 docs/html/_static/fonts/Lato/lato-bolditalic.woff delete mode 100644 docs/html/_static/fonts/Lato/lato-bolditalic.woff2 delete mode 100644 docs/html/_static/fonts/Lato/lato-italic.eot delete mode 100644 docs/html/_static/fonts/Lato/lato-italic.ttf delete mode 100644 docs/html/_static/fonts/Lato/lato-italic.woff delete mode 100644 docs/html/_static/fonts/Lato/lato-italic.woff2 delete mode 100644 docs/html/_static/fonts/Lato/lato-regular.eot delete mode 100644 docs/html/_static/fonts/Lato/lato-regular.ttf delete mode 100644 docs/html/_static/fonts/Lato/lato-regular.woff delete mode 100644 docs/html/_static/fonts/Lato/lato-regular.woff2 delete mode 100644 docs/html/_static/fonts/RobotoSlab-Bold.ttf delete mode 100644 docs/html/_static/fonts/RobotoSlab-Regular.ttf delete mode 100644 docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot delete mode 100644 docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf delete mode 100644 docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff delete mode 100644 docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 delete mode 100644 docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot delete mode 100644 docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf delete mode 100644 docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff delete mode 100644 docs/html/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 delete mode 100644 docs/html/_static/fonts/fontawesome-webfont.eot delete mode 100644 docs/html/_static/fonts/fontawesome-webfont.svg delete mode 100644 docs/html/_static/fonts/fontawesome-webfont.ttf delete mode 100644 docs/html/_static/fonts/fontawesome-webfont.woff delete mode 100644 docs/html/_static/fonts/fontawesome-webfont.woff2 delete mode 100644 docs/html/_static/jquery-3.2.1.js delete mode 100644 docs/html/_static/jquery-3.4.1.js create mode 100644 docs/html/_static/js/badge_only.js delete mode 100644 docs/html/_static/js/modernizr.min.js create mode 100644 docs/html/_static/underscore-1.12.0.js delete mode 100644 docs/html/_static/underscore-1.3.1.js delete mode 100644 docs/html/_static/up-pressed.png delete mode 100644 docs/html/_static/up.png delete mode 100644 docs/html/_static/websupport.js delete mode 100644 docs/html/composer-cli.html delete mode 100644 docs/html/composer.cli.html delete mode 100644 docs/html/composer.html delete mode 100644 docs/html/lifted.html delete mode 100644 docs/html/lorax-composer.html delete mode 100644 docs/html/pylorax.api.html delete mode 100644 docs/lorax-composer.rst delete mode 100644 docs/man/.doctrees/composer-cli.doctree delete mode 100644 docs/man/.doctrees/composer.cli.doctree delete mode 100644 docs/man/.doctrees/composer.doctree delete mode 100644 docs/man/.doctrees/lorax-composer.doctree delete mode 100644 docs/man/composer-cli.1 diff --git a/docs/Makefile b/docs/Makefile index fe841b99..ad11e8ed 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -8,7 +8,7 @@ SPHINXAPIDOC = sphinx-apidoc-3 PAPER = BUILDDIR = . SOURCEDIR = ../src -MODULE_NAMES = pylorax.rst pylorax.api.rst modules.rst composer.rst composer.cli.rst +MODULE_NAMES = pylorax.rst pylorax.api.rst modules.rst # User-friendly check for sphinx-build ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1) diff --git a/docs/composer-cli.rst b/docs/composer-cli.rst deleted file mode 100644 index 9d62f6a6..00000000 --- a/docs/composer-cli.rst +++ /dev/null @@ -1,542 +0,0 @@ -composer-cli -============ - -:Authors: - Brian C. Lane - -``composer-cli`` is an interactive tool for use with a WELDR API server, -managing blueprints, exploring available packages, and building new images. As -of Fedora 34, `osbuild-composer ` is the recommended -server. - -It requires the server to be installed on the local system, and the user -running it needs to be a member of the ``weldr`` group. - -composer-cli cmdline arguments ------------------------------- - -.. argparse:: - :ref: composer.cli.cmdline.composer_cli_parser - :prog: composer-cli - -Edit a Blueprint ----------------- - -Start out by listing the available blueprints using ``composer-cli blueprints -list``, pick one and save it to the local directory by running ``composer-cli -blueprints save http-server``. - -Edit the file (it will be saved with a .toml extension) and change the -description, add a package or module to it. Send it back to the server by -running ``composer-cli blueprints push http-server.toml``. You can verify that it was -saved by viewing the changelog - ``composer-cli blueprints changes http-server``. - -See the `Example Blueprint`_ for an example. - -Build an image ----------------- - -Build a ``qcow2`` disk image from this blueprint by running ``composer-cli -compose start http-server qcow2``. It will print a UUID that you can use to -keep track of the build. You can also cancel the build if needed. - -The available types of images is displayed by ``composer-cli compose types``. -Currently this consists of: alibaba, ami, ext4-filesystem, google, hyper-v, -live-iso, openstack, partitioned-disk, qcow2, tar, vhd, vmdk - -You can optionally start an upload of the finished image, see `Image Uploads`_ for -more information. - - -Monitor the build status ------------------------- - -Monitor it using ``composer-cli compose status``, which will show the status of -all the builds on the system. You can view the end of the anaconda build logs -once it is in the ``RUNNING`` state using ``composer-cli compose log UUID`` -where UUID is the UUID returned by the start command. - -Once the build is in the ``FINISHED`` state you can download the image. - -Download the image ------------------- - -Downloading the final image is done with ``composer-cli compose image UUID`` and it will -save the qcow2 image as ``UUID-disk.qcow2`` which you can then use to boot a VM like this:: - - qemu-kvm --name test-image -m 1024 -hda ./UUID-disk.qcow2 - - -Image Uploads -------------- - -``composer-cli`` can upload the images to a number of services, including AWS, -OpenStack, and vSphere. The upload can be started when the build is finished, -by using ``composer-cli compose start ...`` or an existing image can be uploaded -with ``composer-cli upload start ...``. In order to access the service you need -to pass authentication details to composer-cli using a TOML file, or reference -a previously saved profile. - -.. note:: - With ``osbuild-composer`` you can only specify upload targets during - the compose process. - - -Providers ---------- - -Providers are the services providers with Ansible playbook support under -``/usr/share/lorax/lifted/providers/``, you will need to gather some provider -specific information in order to authenticate with it. You can view the -required fields using ``composer-cli providers template ``, eg. for AWS -you would run:: - - composer-cli upload template aws - -The output looks like this:: - - provider = "aws" - - [settings] - aws_access_key = "AWS Access Key" - aws_bucket = "AWS Bucket" - aws_region = "AWS Region" - aws_secret_key = "AWS Secret Key" - -Save this into an ``aws-credentials.toml`` file and use it when running ``start``. - -AWS -^^^ - -The access key and secret key can be created by going to the -``IAM->Users->Security Credentials`` section and creating a new access key. The -secret key will only be shown when it is first created so make sure to record -it in a secure place. The region should be the region that you want to use the -AMI in, and the bucket can be an existing bucket, or a new one, following the -normal AWS bucket naming rules. It will be created if it doesn't already exist. - -When uploading the image it is first uploaded to the s3 bucket, and then -converted to an AMI. If the conversion is successful the s3 object will be -deleted. If it fails, re-trying after correcting the problem will re-use the -object if you have not deleted it in the meantime, speeding up the process. - - -Profiles --------- - -Profiles store the authentication settings associated with a specific provider. -Providers can have multiple profiles, as long as their names are unique. For -example, you may have one profile for testing and another for production -uploads. - -Profiles are created by pushing the provider settings template to the server using -``composer-cli providers push `` where ``PROFILE.TOML`` is the same as the -provider template, but with the addition of a ``profile`` field. For example, an AWS -profile named ``test-uploads`` would look like this:: - - provider = "aws" - profile = "test-uploads" - - [settings] - aws_access_key = "AWS Access Key" - aws_bucket = "AWS Bucket" - aws_region = "AWS Region" - aws_secret_key = "AWS Secret Key" - -You can view the profile by using ``composer-cli providers aws test-uploads``. - - -Build an image and upload results ---------------------------------- - -If you have a profile named ``test-uploads``:: - - composer-cli compose start example-http-server ami "http image" aws test-uploads - -Or if you have the settings stored in a TOML file:: - - composer-cli compose start example-http-server ami "http image" aws-settings.toml - -It will return the UUID of the image build, and the UUID of the upload. Once -the build has finished successfully it will start the upload process, which you -can monitor with ``composer-cli upload info `` - -You can also view the upload logs from the Ansible playbook with:: - - ``composer-cli upload log `` - -The type of the image must match the type supported by the provider. - - -Upload an existing image ------------------------- - -You can upload previously built images, as long as they are in the ``FINISHED`` state, using ``composer-cli upload start ...```. If you have a profile named ``test-uploads``:: - - composer-cli upload start "http-image" aws test-uploads - -Or if you have the settings stored in a TOML file:: - - composer-cli upload start "http-image" aws-settings.toml - -This will output the UUID of the upload, which can then be used to monitor the status in the same way -described above. - - -Debugging ---------- - -There are a couple of arguments that can be helpful when debugging problems. -These are only meant for debugging and should not be used to script access to -the API. If you need to do that you can communicate with it directly in the -language of your choice. - -``--json`` will return the server's response as a nicely formatted json output -instead of printing what the command would usually print. - -``--test=1`` will cause a compose start to start creating an image, and then -end with a failed state. - -``--test=2`` will cause a compose to start and then end with a finished state, -without actually composing anything. - - -Blueprint Reference -------------------- - -Blueprints are simple text files in `TOML `_ format that describe -which packages, and what versions, to install into the image. They can also define a limited set -of customizations to make to the final image. - -A basic blueprint looks like this:: - - name = "base" - description = "A base system with bash" - version = "0.0.1" - - [[packages]] - name = "bash" - version = "4.4.*" - -The ``name`` field is the name of the blueprint. It can contain spaces, but they will be converted to ``-`` -when it is written to disk. It should be short and descriptive. - -``description`` can be a longer description of the blueprint, it is only used for display purposes. - -``version`` is a `semver compatible `_ version number. If -a new blueprint is uploaded with the same ``version`` the server will -automatically bump the PATCH level of the ``version``. If the ``version`` -doesn't match it will be used as is. eg. Uploading a blueprint with ``version`` -set to ``0.1.0`` when the existing blueprint ``version`` is ``0.0.1`` will -result in the new blueprint being stored as ``version 0.1.0``. - -[[packages]] and [[modules]] -^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -These entries describe the package names and matching version glob to be installed into the image. - -The names must match the names exactly, and the versions can be an exact match -or a filesystem-like glob of the version using ``*`` wildcards and ``?`` -character matching. - -.. note:: - Currently there are no differences between ``packages`` and ``modules`` - in ``osbuild-composer``. Both are treated like an rpm package dependency. - -For example, to install ``tmux-2.9a`` and ``openssh-server-8.*``, you would add -this to your blueprint:: - - [[packages]] - name = "tmux" - version = "2.9a" - - [[packages]] - name = "openssh-server" - version = "8.*" - - - -[[groups]] -^^^^^^^^^^ - -The ``groups`` entries describe a group of packages to be installed into the image. Package groups are -defined in the repository metadata. Each group has a descriptive name used primarily for display -in user interfaces and an ID more commonly used in kickstart files. Here, the ID is the expected -way of listing a group. - -Groups have three different ways of categorizing their packages: mandatory, default, and optional. -For purposes of blueprints, mandatory and default packages will be installed. There is no mechanism -for selecting optional packages. - -For example, if you want to install the ``anaconda-tools`` group you would add this to your -blueprint:: - - [[groups]] - name="anaconda-tools" - -``groups`` is a TOML list, so each group needs to be listed separately, like ``packages`` but with -no version number. - - -Customizations -^^^^^^^^^^^^^^ - -The ``[customizations]`` section can be used to configure the hostname of the final image. eg.:: - - [customizations] - hostname = "baseimage" - -This is optional and may be left out to use the defaults. - - -[customizations.kernel] -*********************** - -This allows you to append arguments to the bootloader's kernel commandline. This will not have any -effect on ``tar`` or ``ext4-filesystem`` images since they do not include a bootloader. - -For example:: - - [customizations.kernel] - append = "nosmt=force" - - -[[customizations.sshkey]] -************************* - -Set an existing user's ssh key in the final image:: - - [[customizations.sshkey]] - user = "root" - key = "PUBLIC SSH KEY" - -The key will be added to the user's authorized_keys file. - -.. warning:: - - ``key`` expects the entire content of ``~/.ssh/id_rsa.pub`` - - -[[customizations.user]] -*********************** - -Add a user to the image, and/or set their ssh key. -All fields for this section are optional except for the ``name``, here is a complete example:: - - [[customizations.user]] - name = "admin" - description = "Administrator account" - password = "$6$CHO2$3rN8eviE2t50lmVyBYihTgVRHcaecmeCk31L..." - key = "PUBLIC SSH KEY" - home = "/srv/widget/" - shell = "/usr/bin/bash" - groups = ["widget", "users", "wheel"] - uid = 1200 - gid = 1200 - -If the password starts with ``$6$``, ``$5$``, or ``$2b$`` it will be stored as -an encrypted password. Otherwise it will be treated as a plain text password. - -.. warning:: - - ``key`` expects the entire content of ``~/.ssh/id_rsa.pub`` - - -[[customizations.group]] -************************ - -Add a group to the image. ``name`` is required and ``gid`` is optional:: - - [[customizations.group]] - name = "widget" - gid = 1130 - - -[customizations.timezone] -************************* - -Customizing the timezone and the NTP servers to use for the system:: - - [customizations.timezone] - timezone = "US/Eastern" - ntpservers = ["0.north-america.pool.ntp.org", "1.north-america.pool.ntp.org"] - -The values supported by ``timezone`` can be listed by running ``timedatectl list-timezones``. - -If no timezone is setup the system will default to using `UTC`. The ntp servers are also -optional and will default to using the distribution defaults which are fine for most uses. - -In some image types there are already NTP servers setup, eg. Google cloud image, and they -cannot be overridden because they are required to boot in the selected environment. But the -timezone will be updated to the one selected in the blueprint. - - -[customizations.locale] -*********************** - -Customize the locale settings for the system:: - - [customizations.locale] - languages = ["en_US.UTF-8"] - keyboard = "us" - -The values supported by ``languages`` can be listed by running ``localectl list-locales`` from -the command line. - -The values supported by ``keyboard`` can be listed by running ``localectl list-keymaps`` from -the command line. - -Multiple languages can be added. The first one becomes the -primary, and the others are added as secondary. One or the other of ``languages`` -or ``keyboard`` must be included (or both) in the section. - - -[customizations.firewall] -************************* - -By default the firewall blocks all access except for services that enable their ports explicitly, -like ``sshd``. This command can be used to open other ports or services. Ports are configured using -the port:protocol format:: - - [customizations.firewall] - ports = ["22:tcp", "80:tcp", "imap:tcp", "53:tcp", "53:udp"] - -Numeric ports, or their names from ``/etc/services`` can be used in the ``ports`` enabled/disabled lists. - -The blueprint settings extend any existing settings in the image templates, so if ``sshd`` is -already enabled it will extend the list of ports with the ones listed by the blueprint. - -If the distribution uses ``firewalld`` you can specify services listed by ``firewall-cmd --get-services`` -in a ``customizations.firewall.services`` section:: - - [customizations.firewall.services] - enabled = ["ftp", "ntp", "dhcp"] - disabled = ["telnet"] - -Remember that the ``firewall.services`` are different from the names in ``/etc/services``. - -Both are optional, if they are not used leave them out or set them to an empty list ``[]``. If you -only want the default firewall setup this section can be omitted from the blueprint. - -NOTE: The ``Google`` and ``OpenStack`` templates explicitly disable the firewall for their environment. -This cannot be overridden by the blueprint. - -[customizations.services] -************************* - -This section can be used to control which services are enabled at boot time. -Some image types already have services enabled or disabled in order for the -image to work correctly, and cannot be overridden. eg. ``ami`` requires -``sshd``, ``chronyd``, and ``cloud-init``. Without them the image will not -boot. Blueprint services are added to, not replacing, the list already in the -templates, if any. - -The service names are systemd service units. You may specify any systemd unit -file accepted by ``systemctl enable`` eg. ``cockpit.socket``:: - - [customizations.services] - enabled = ["sshd", "cockpit.socket", "httpd"] - disabled = ["postfix", "telnetd"] - - -[[repos.git]] -~~~~~~~~~~~~~ - -.. note:: - Currently ``osbuild-composer`` does not support ``repos.git`` - -The ``[[repos.git]]`` entries are used to add files from a `git repository `_ -repository to the created image. The repository is cloned, the specified ``ref`` is checked out -and an rpm is created to install the files to a ``destination`` path. The rpm includes a summary -with the details of the repository and reference used to create it. The rpm is also included in the -image build metadata. - -To create an rpm named ``server-config-1.0-1.noarch.rpm`` you would add this to your blueprint:: - - [[repos.git]] - rpmname="server-config" - rpmversion="1.0" - rpmrelease="1" - summary="Setup files for server deployment" - repo="PATH OF GIT REPO TO CLONE" - ref="v1.0" - destination="/opt/server/" - -* rpmname: Name of the rpm to create, also used as the prefix name in the tar archive -* rpmversion: Version of the rpm, eg. "1.0.0" -* rpmrelease: Release of the rpm, eg. "1" -* summary: Summary string for the rpm -* repo: URL of the get repo to clone and create the archive from -* ref: Git reference to check out. eg. origin/branch-name, git tag, or git commit hash -* destination: Path to install the / of the git repo at when installing the rpm - -An rpm will be created with the contents of the git repository referenced, with the files -being installed under ``/opt/server/`` in this case. - -``ref`` can be any valid git reference for use with ``git archive``. eg. to use the head -of a branch set it to ``origin/branch-name``, a tag name, or a commit hash. - -Note that the repository is cloned in full each time a build is started, so pointing to a -repository with a large amount of history may take a while to clone and use a significant -amount of disk space. The clone is temporary and is removed once the rpm is created. - -Example Blueprint ------------------ - -This example blueprint will install the ``tmux``, ``git``, and ``vim-enhanced`` -packages. It will set the ``root`` ssh key, add the ``widget`` and ``admin`` -users as well as a ``students`` group:: - - name = "example-custom-base" - description = "A base system with customizations" - version = "0.0.1" - - [[packages]] - name = "tmux" - version = "*" - - [[packages]] - name = "git" - version = "*" - - [[packages]] - name = "vim-enhanced" - version = "*" - - [customizations] - hostname = "custombase" - - [[customizations.sshkey]] - user = "root" - key = "A SSH KEY FOR ROOT" - - [[customizations.user]] - name = "widget" - description = "Widget process user account" - home = "/srv/widget/" - shell = "/usr/bin/false" - groups = ["dialout", "users"] - - [[customizations.user]] - name = "admin" - description = "Widget admin account" - password = "$6$CHO2$3rN8eviE2t50lmVyBYihTgVRHcaecmeCk31LeOUleVK/R/aeWVHVZDi26zAH.o0ywBKH9Tc0/wm7sW/q39uyd1" - home = "/srv/widget/" - shell = "/usr/bin/bash" - groups = ["widget", "users", "students"] - uid = 1200 - - [[customizations.user]] - name = "plain" - password = "simple plain password" - - [[customizations.user]] - name = "bart" - key = "SSH KEY FOR BART" - groups = ["students"] - - [[customizations.group]] - name = "widget" - - [[customizations.group]] - name = "students" diff --git a/docs/composer.cli.rst b/docs/composer.cli.rst deleted file mode 100644 index 4dd2e240..00000000 --- a/docs/composer.cli.rst +++ /dev/null @@ -1,101 +0,0 @@ -composer.cli package -==================== - -Submodules ----------- - -composer.cli.blueprints module ------------------------------- - -.. automodule:: composer.cli.blueprints - :members: - :undoc-members: - :show-inheritance: - -composer.cli.cmdline module ---------------------------- - -.. automodule:: composer.cli.cmdline - :members: - :undoc-members: - :show-inheritance: - -composer.cli.compose module ---------------------------- - -.. automodule:: composer.cli.compose - :members: - :undoc-members: - :show-inheritance: - -composer.cli.help module ------------------------- - -.. automodule:: composer.cli.help - :members: - :undoc-members: - :show-inheritance: - -composer.cli.modules module ---------------------------- - -.. automodule:: composer.cli.modules - :members: - :undoc-members: - :show-inheritance: - -composer.cli.projects module ----------------------------- - -.. automodule:: composer.cli.projects - :members: - :undoc-members: - :show-inheritance: - -composer.cli.providers module ------------------------------ - -.. automodule:: composer.cli.providers - :members: - :undoc-members: - :show-inheritance: - -composer.cli.sources module ---------------------------- - -.. automodule:: composer.cli.sources - :members: - :undoc-members: - :show-inheritance: - -composer.cli.status module --------------------------- - -.. automodule:: composer.cli.status - :members: - :undoc-members: - :show-inheritance: - -composer.cli.upload module --------------------------- - -.. automodule:: composer.cli.upload - :members: - :undoc-members: - :show-inheritance: - -composer.cli.utilities module ------------------------------ - -.. automodule:: composer.cli.utilities - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: composer.cli - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/composer.rst b/docs/composer.rst deleted file mode 100644 index 1ff06326..00000000 --- a/docs/composer.rst +++ /dev/null @@ -1,37 +0,0 @@ -composer package -================ - -Subpackages ------------ - -.. toctree:: - :maxdepth: 4 - - composer.cli - -Submodules ----------- - -composer.http\_client module ----------------------------- - -.. automodule:: composer.http_client - :members: - :undoc-members: - :show-inheritance: - -composer.unix\_socket module ----------------------------- - -.. automodule:: composer.unix_socket - :members: - :undoc-members: - :show-inheritance: - -Module contents ---------------- - -.. automodule:: composer - :members: - :undoc-members: - :show-inheritance: diff --git a/docs/conf.py b/docs/conf.py index ed68fdd2..a608bdcc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -265,7 +265,6 @@ latex_documents = [ man_pages = [ ('lorax', 'lorax', u'Lorax Documentation', [u'Weldr Team'], 1), ('livemedia-creator', 'livemedia-creator', u'Live Media Creator Documentation', [u'Weldr Team'], 1), - ('composer-cli', 'composer-cli', u'Composer Cmdline Utility Documentation', [u'Weldr Team'], 1), ('mkksiso', 'mkksiso', u'Make Kickstart ISO Utility Documentation', [u'Weldr Team'], 1), ] diff --git a/docs/html/.buildinfo b/docs/html/.buildinfo index 55d53fdf..43715611 100644 --- a/docs/html/.buildinfo +++ b/docs/html/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: d9d287449bd26afc7e34fe721edb25e6 +config: 02f30f407e07a2deb3d7c7f13d65fb26 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/html/.doctrees/composer-cli.doctree b/docs/html/.doctrees/composer-cli.doctree deleted file mode 100644 index c61a78b796d8f323cd548a9aafcd8cfbba398317..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 117558 zcmeIb37A}0c_wVx+PbuQYul16U(1_pcU5b#jV&Z$NtSIPsU@VAEn^gQb=B>zD%H}i zMXh!)O9)`#W+8M4{6HZ2$--nAh6!OpX7VHLZ{}}+wDta@KFH+T?Phth(*_0v@ipaQi=bOksODQOJjCD2 z>iL@bYh|%BV}DHM3+I~t6qV@&E86*KdNp5KSK3%wU0PDQCRi@G-!@upH1ij-&BiFO zZjHL2=bEkde6X}yuKV+cukK6&i_BEnuNKc%%XlNS6k-r9_;t@4B9pGkfY_SBihZ4S zsnKjHG7a0`mN2^j^~0b@X%om$+6-!X_`e1J@5KMRfnsTE=^+%_S-Q7$U+MnCSGk~0 zHi~l&K*4SMo8^4nJCO5^4QfeJK^m+e#nDJ>+%G~Yy`2w?coU5lm&^*Z-tJPn zJ=5AXI;!8~8qMjw41T-hdrcn&Vd{#0F{2>NX`vhnR#eM`T-BAX_1$z3`3f7cuyh4U zw0|dP|2EKjIQWq(l&+3QU$G!+A`S)Xc!)V0X&$zwl@MX<-RUIC5{M1Tk0r7E!-nM> ziRJxd(FjryTTC?;ZxO`CtUzH_^pJwT`A{3m@LZ?d^c6Hp8$4*WH|ayqTkU+c>KDC6 zoq?@33i+znnrpTFn$l200h-^;G&}V=X==F*W%Y|_j+@APHNQ6LH$7-9m7SQF#n{+{ zDVc6IIy0ho!@+Zx9TdyFm!fm<3jq{RJ%m7>ZGxYnVBy`DL z`yvf>dIVb^67buOkmKeZ(7vWeb{_)^Lq;Q)BDEdy(v=?$63baE{tf{CO%fJR(=j+@ zOHlS3$z=`3sH421HG0%KI|&s%=Z;;k>$EUz?jp>MyX`%jEuFzfg+5x|$zul&9~`H@ zv(?75cjVX;^mm>H@TU%*;OFqK+ur!WljBE^J$8_uJaxv)<&^e9(k^W$mX`3^Dl0I9 zi6c=kbfH$=)q*2|SuzLHt1v&a<7}yO7 zz>;SN39j5kkdX)|cCKp7P_KQb5bK@yXW_5Z9FB`(4h5@qDYmpdB{1DsqYJb!hpJCI zC4!|;Tcfe+M;Nh3k`b%Cg2`QZAVtv~s^};e1!Su*B`q||Oa%ungoq zSyl8t?lgAhRN1PE5}RBfys`-o@=;T*jFmIZ)fh2bH-?#Ku~))+o`-o*O9q^Ut3tqQ z;i}w=A7Zk#s8n(h&vy1at32#H3NqQsh?mV)TA1FL*+vN6Po^kWc*4P4T7a(4MY^wm{55i)m>5=DlM^dUSS?J=*-#HKITv5 zJJt3s@9})Kg%&8XG8}Y2ws3u1!S(a$;HrF#ir;_u8la+}s{9Ps?5}Djj>2`x;w=f* z7CKD|&5wC`BQn!CR^4%tQ!l4 zru{mmZ|z2N9zTkC8o2Vc8T?qKx`IuupTp0L{@H0(@oP=HQ8-HhA$p7MmI1cr+1Q^6-*i4aK_Zo!Z$8nEBS`@nkL8(3!L3U!ZCWO>R_A{Ho7S&eGiYtc0b| zqpqOiRAa&Fra#kYw$E1m^L`bfq##quSIy65!L|N{GU(OLw>vEVh>y%l-ji_x)^HbC!qqx zc4_|b%HUQARPC(MEi-37tK7DC1j7ssth3)_N64=ejfxQDRftJL0M$<@-ul*Dy`8^s zwp5-jRq>yLu?>>&)va0{`t)1}>f1ui>-o3(d6s9gih{QmN{C_>5cN@N1&)#ZIg8ro zIy3X{;83>;E+}<>2ZW?iDA%XJYSI7e$Re~lli_mfY3^HuO3r~>CEstOwHpi7M*iGc zpQ4Iq5q`&5M1krTgKPZy`FZ$%!AfNbpn8y^a=nPzIb@~{m&}J{K}7pnbOfnrBmNF2 zu}CrO7htPGPgR^7kI~wc`9VQV3X$Xa3VNvj9-_b7b2EVBh56EEyj|lmhs&=ilwo_Q zL$slukOE0L1(^Fpl{+&}EUHa5s)pZO^oFj7ru0y##UbgHD_s|AAGWaBCgXc!cU$_+ zRY3;oU1)SDUO6AEDl`zx;6)0U_!S5A^Y;Mfx6Yq{j3b&2t-)deO_@}OM$1EwSDDAm zq)d?vkJi!B5(TD2a%JL+YIpU!dAPkOpKWy(an)?Lg()ILQF{jA zhsG~}d$F-{;_B3X+p!cywcmDxizfJOcOK6pmW&`0MU5219vKCCL@O(P9YHCxKEsu==`LeQi)*o7C54{vs1oxm`WELw((aFEnwF`np$r-LJl~>T6VeZO7N) zC6yiYbya02zA6vlLn(1(7yd*$yVciTe2rCJMW5iALLGWZ)ay?HM=zDA#ur_B zMYaCaxM+g@oH&kj8;@5BYM79d3h4!hoVR_?Q8=9PTjdB$Ve*snc0|1?*UOkH6;1T* zQZ#MoRtbO|^!J^~^yt;!w^Q9{{iXIC{mmHt-6kw_A6amIRDtusbl_CpN5z%yYGB^a zHT#RB)m^IV=q~+ydF!r19lA@@>rVkkca>KN5^bc}w! zymd^W4jm)v^{0TNV@ed`i-vS8zNlV^qb04-LRId$;(i9=)Kd%fM`&m2Fv*L!yNp`-hrIG7#VcND*NA3t&IsY8z) zJfZ%4{Lm3Re7)CGhF;{xj~zX-_e>^plEPMA-VBJH76S4r%z?!M#37OQCRuWs4u+Ni(DYCOu+UXIQ zaGRlEm-p;!9(f4$>DTL8ua_FHCr`>RLaZ1t#N*2a@Rh>S9FO$!lK?NWU8H*KK6UEQ zV=20y7qcorex zZR7;i=Kv#OvRL&lW2J%CW3goEVy#OufFsB>*_(mG#FZI33IG-btBC4E0Rz%WLaOMu znNlI*=(IKsqJtEo;dv|`=1m)qHD>FiWK10MmU3Rn)y0Y%upr0;TRh#}>6D9mvr;$* zwYQoE8n&Vvmln8$ZH9h^o6tn-ZH1&uFKA0+y6h{Fji(SB@u)#<2`I6a@K6wkd*Q6x z-aZIdE%&MfmSt-$1#;fw5KLNE0O@Hxjuem!upP@}jE!q?JlD|^Uab%eY-+Hr07ls# z9=kEtRExBfTUf=K;~q_6vUp^MDPbA<5pD;|Ky`%u9jhPFloUb(o}Vw2tf>w+RxD3V zIW1v)c>Kh%quB$;jvhV4qscM(8-neCO7&EFdkYzu?O7jj?j7QqfrPLfZkJA@9u$$1 zHhEyFAq}&H1yc`Tjvag&iCdX*>CuZUIikyrP?e{Toj82*_`U-N!-UQw-@Av*VeG=x8niF60c zhU@|e0+9_TD?oSav3j7vZN+oDr%9LT28}G~^4^>(%mNU`0K0A+x`4vtctCWl!7YGY zFCdx15{0ZQNp>DY!ONw%*vCuTWeeq2 zC?;(cT5s;QoVKi#a0{zJ5iaYi4;~oTGU$wrAS(L`1V6z5J#ku5=`t}r>H-;^SVP_= zjln06ojP$q`O6~qJQBOTsj2`~I>EBI)KqSBCbJKZ^0GYy3xc#O&9aJinK<fJary}$*?tLbs>!_K^?)|3@9np2d6OL!2W+ktuham_26i*t+nsu>Y{>zZR{^2*ZaAS-+}O99Kvu7 z2&O4T!n7zX3d7(yhZ+j;XkQB}rFl6tZy4o$z?`iFI_d_)swCD!(<-L}-C?-RW z#eY}su67t&Gk&2wg^7W*fzbtjQp0Y$YP<`{iRc~eztS}rY*4j1+eGGZNSlzc=(eXu zkccTV=D^}K=tcpMK+LAuj;l0)z!+$##EB3@s2a}-qRFA90*b4!Rbs$DnPVK=qK%j9 zkVJzy7^k-oOKeV|vx)VFu0q|J*Qc*R5JEg|rKOi4o^bMt3nv(=E~P1+L&{+0a#Kfw zmzTd|8wPz!#T&yuhoy;GK2h%nkN`5XT7q3jJmK7i49j~) z@nJe;b1EktiUrSIc5;clzXUy7d44;I(#FbLS%%_QmaM&5i5hR_8kK@W!yX&+Q!f*N z5Kg>o;I;gFpW@$plldq12%CE=?@2B$_DJzLtvw>ih_FY2B!Tg|L@PNi9;KmcL_<~X zv0l3CdTJ^2i;6P8kOEaJ*{cBm$GJwlWP3;8_i^mOt`USH`yx`w1uev%QxJbP8Dilj zf&1&p#f6s&v$VXV#-n(7Q25Z|*{Q?KL6$6{IJ`F8ve2;mv8C9T6~+E%3KCczuLWLT z;u`The$euG0K^37i>z&N`?kXETgkYIG!SBclU!V+LD3+sG*IJF((sh6yxKm@v%TwDZ5VVPEdsPQNPdfad|VvW&6ixQU@qXcGSOw&Tw*fN%w2NW^) zrJ#3a&ZwIMU%9mLybp?&K}{Y1o|jSu2vG9m@kb~2op+Kz1*Es2bFCNPYZ96 zQavpSjbln!`u&)q--lBW#LCJBVEF;A5icuSl5rDY(-gH(e?me1@nool>jd)8B^MX2 zE9}y8of?ng`d;CYo5;Z?HB}x5)255<*GDudG>m*_iS~PnXuq3+3YOKk0=3`f8u6@F zc0UbT0_^}bEDnFBaQIR(4#Ids;ETz{h4Bj4w2Y_5qZp6fn#v)RL={OrS)>Gtx~yfnGkJ51+WmMQ@Bj-Rh0A?+u^h-q>g-N>6TM;8%aS3 zD>ZijyRBR!UTQ`L!At-itdhm#RSJ_m$(V=)5E{FZi;Dy(jMGX0H6A4aMPaaZ5PFQu zVx-PR3CVDD$3pgguPuSkC;~s5f?`%w?gkm2<{I&$a>R(rBH%ALEpDTh5_Lt1YBD86 z)QAk_L}6oj%8 zb}z7h8`p@JutST6xS+F$Em|6UNYUT}$utnzA_BZGxwy!dqE%YiqQ;|SYq!Z<)A?8& zcOsEWkvbbCIP1C^6e9OLx1{=IMXFy)fx8tK95-C~B-e-+m-`1mNMIePj>Y456du2w zjEAtCkoa73abdZ_H!aJl@hFx*?r?~cd~A}Vo(wxl#HMUdo@W&EZ!^UuwaDa8a??WK z#B!FXUsFW=N(w4j;TQ$#f5A24h2t(av)91hjjBMMvb2T$9~A6=pA5SQ1Ofi-a{EH!G(|0aZ&|^Ug`4n|Fj;US@H;?- z>$yg}Y}}I)WdS{Pc?6uhEgw0wF-@#*PgK8eyk z2quju7Z;^f{7kE~Bmq%Md(4sM$o&^4Z`Kr~9QeMQZK5k{=@es}?mb28IRn+aI zAeYqw+*ne1j%&ngL2fXd1^hv)S!`ZZ*t{(n8<7=4lc5#~Ado+iTwEkTVV70{sPQNXcx{MRefGh*V~Fe`OWp<-B^r06=uYUJ zs;njWA1Q+WK?(|5F?keZ`8?N%7n27siUfkmMb@^s{iVX~FOqQ+VIsu-EV;M{lcGUd zVWP&Pgvp&?_H2Aizwa?ha5g%E)7`X?Ikt=?=F*isdAJ&1=_d~dfbu`35R`jUqbX1i zP{ZPIqr&0(WE?~w2!Zv<#YG?#u4x5=8jli)ryZ{K*}>{6R`-6;z8hGhB;@wQzJ%f_ zN?JE%h1vdO%tVF=tyd)%7a39%NGn6s zc$5r{_wqF{c-1XP-GQCRoQ}KGbtL3ZTig#eOU6V*htQ}e7Z=e{7^f8-YCKAGDiIuwn622IggtWOPK-=rQ5({kqFvb{ zQ4$i-y)Ywfam$8xD>nQ<3c6Z>Is#(7i)+LS)P6H(x@f8hW{c63#rnq;)*ng6T7-{K z{!nsp5k5tow8BS?M+x7Ukry0l*mXp~MVwF&C14x+cOj&YD`H9dtBRz*l7dE7kd6WI zPjiiULE14mwgUadRJBd}SLL$F$SLl)z!hInT2PstdIz!AFt zkX&2@PEjVUz)|B-0(ZvYx;;e1E(Y#ZXVlPIuqmmIJi>5DPh-y@iIOwhPRlvA#OYDE zkzCMHd$XeUCVZuz$DIOAZsr>C^7Trd$6Xu=1epc3VeuSQcxIFF6saO4?@KN&Ql;pT zR;sA+D5<(PboPu{e7DERn4@Q+BxJQ)TL>6_Xen}3QRHw66s=`B4Y;4+8u6Up7z4Th z7F))``CSUm*CoR#oFgEgNiHs&Q~0Fi95o)rx%+Xlg>w{81pZPWIvIYAyyhKPLZhyy zmMX7TRCzuHnwERd0`~Ju4G7se+1@>$;E|#3Zu0AqsF87 z_n4u7#OX{VGRHR73mPf8>O=G5ga{Qq9T|LJ7-MHC45PbC)@QBZiM6$NTMN))!r=~u*Gy9L)8 zVf{Wb0J7SxEVK$gv;_HYiXdM|fuUt+9$^0=*NA86h6pXzzzJM&MJ$wmrJ($3GL*tL z0`V`CiwoNnHfh;LjYqNV5utpa^UfX%9p^>*t13jR?dJH_gn~)MEER_`?ANZqS9(vY z2wbn>8u7for7v; zy24Di^lj1*uzv|lz=st9A4)+HtI*Rxa|hRmXYw5>kP~QAm9=mmQgA9jb6xWuJF}{$c-?XBipMoHk?-gK~=Nj>Rzojo? z0%lAJ3*!X^Rx%iCWnWq zW1Mi?r1LD;p%2Q`TWs9}I>W=dJ%W_+>mI`THY3!yrGE*F>lYQS|1B9;CoQ-MbpM!Z z#LM|jeGn1|`@XmEeM7vSFK`ac?e(Wo#hT#v5afP3t?_BY6`A{RrgUW!bJk=@#NydMFoFaE>h!BTs*FMU`}{( z#}hgEWRUZonLJ%%&BmBcgq*QuELqEntkWszWZC`QK)%2=;@Q3PA`lk%FRHG^>v@IO zg=D-$TnMR7a&ZwCg@0Ocp~j=c<*??YxX7W?ytP;AXnyQr-f@x=)xJ<#Bqg$prRe(< zMcNU{G1}^XH(F}3dfs)^sjM^1mPGAQ-M4;U^R=)7Zf&s zoQ#bK2chx@$;CxD6xL~lgBy= zzlMsfr@vk!N^owC?Lvs1P|6Z^ToLv}3QAdFc_+{x;~Me8GCCl_0{y`CEIz)%r;v<~ z2nr!Hkz8B^Md6)RP^j@JK`B@+s;!?<7pIuKUKFP5TL!#0B}#f+Q^Fa}5&a4mQkAuo ze~Y60n^Ta|O49d%J}+>McuCs3Fj@#o3vI??JFl?)p=4}D&Ir{XNG>jNrl^uu&ZzMy zIeWs&nM`~lIBxfkYDw$9Iwvv^b62Xih4d*)TMB!%`7gEGGg-Akd}1QU zq}mFhf8b(puy@^GWPMQfsx>r0D80+DvkQS<$_RTm#SzeghPAPcl_BmW_Og@`4cr=< z;oy;rroZiZA&ppAEM-OpVXaVUt4pOgX|QlJ#WoE}u_Za%LVzCzgCzTMFRRooC@)&( zYS-z9aW4{UIL$!FC-SyJ4`$1_1R1yCl3oB4L@!)K}l~KsRhMX_^vtmOO{IqzI?XMc?qq7jGXk<-P#ieFXU@8ux-YP znK(R$Qj~!eZ)NW+X`TmU8Zqgu(s3W-me8I0Z zY56K{@70Ua=CxOz(r4f}S|b=b(!J6=1AYD#)6wxnhYT%*7t0s{+W?!Bf185-pyM_o7zkwp9Jj@*VZOgvk)_NesfUjR4=P^7;OqJZ@-2=*3^_d zOo6xHzhgphAt`&u_n^G!Z%A+dcpNHWrmN(@XSYgR385qFR7h8@`fK8#E-t!8@-Yo>*PE zlAtntOQ%Wq_tT`JOw1ZQLBvVx9%TN2>DbA>D zDeo;)Ycz2?J@)4{Yk9hR+>SjfIk zaHIW0F5)A0)vUY)DiW+=%IeI)mT?RT(8^m;K)Zy)Dv&L5ttApi418v?gb#7Ktyx4R4$ZM=*FxmD?FfC8M>Ro z;D;fn&c9kbyjXvaLL>Zw;xpPM%-8c6sfuvK*@LEwS~87#0jk%g5wNUUnwU6oYHaM# z*c0$=saK?(wt54m#(Y!6h1}AKiOg)thaR(!islGL{=4b7JI%TpSm_}eg})25Ylzrd zRll}}P>$Y2yabOPWga=M=xu!lB1OH436TT28j&ON1{GDx_R2%ip%ijJZmWi6IC#@b z%|MI56#$E+jCHVAIU*(;S)ql_0?*Wc-JsN86OvimTF~_(3a;DxNRJh9f%eu&Pe#hw zUKxkRpg25qk(y*|Sa7i|7^+y)9p`R8gz{qlT)P)Mag5B0u~H%H^7x^#Lnog+2!o+n zB~#gAW42yx@k`SR`aQ)soyM6 zl~iLMFP&icq;(cvmtcZ%_(QjtZ=oG3%=5UMM2*xKFQN}lU{3&ta=gh#gF-z|9mNvq zIZ~o>Yu7FoPnzi6n;Lp6z=Ko*^*+N?c1G1Z`q)L65TZY~MOsE%(n7^*^*bpzN~5cW zX*jqm6~%2YX)D-1>^OCO1mgtHbzLmAJu+Tj8WgWl?e(RV2-{yUa8-k=H41T7o{mZu zjp|HRmcyqt5%Wi$^J|^#x$`wI%STG$T&-4H`S@P8=561$;{h*Qg3Fm3?IxI3`~|dN z>;sehe(n`I9p=ImmhAXi9H7 zpblthnx+G^I88Q?dQ!6!%pfFwFp@z?E_M>aZFsp{4sgqAkj^hrrbqXsdiIN%DEqF# za@siz z7xzZYQql5kOPFUO97-3I919mi$z#0*EdiLX4-LxK`v=e$+ZPsD(yJMz zxM(@D6zHC7^(vnbAUxOVE@xq4{0|L^|NIrHk{3-J>7L_Yd5M#f5}JOC9+%AQ(1xM5u~Vs zf~jdGbKz|ndZd%0*Pwhc8RN<%$~Xe2yu46GZe=5UMLXG5QFJX+l#UzY#61yY%rLD} zE>?*YgC{G_%x`saZikM`4n1M1^Td#{@*xHB2a=KF42AbmaqG)H74qdCg)e7%Me48$ z!-$_oYN59bvJ12i3zw6~ra+=e0UBGYy1iaf-9w%uGy-c3RERRtfElRvXRy zh0$tx3f|hNX$Of(BP>;%YDmry`AXAy=wcH`yw%XQ?lNPxLODx46m_;9mi3=&R)%@eM@n^Rs6CFS(#G%1oO7CxJA5V+wS*sfE^YKQ@iSN6|N)S7C7J=IU^i z4-Uk}m_iPHV~YWRuO~oHOPG>5GZ6wf9ORi7Tk7rcwt$*jGMQ&vew(&$w9aJk;H;V& zpFQW#Q4v^FZ=aehANJ?AaEZxI;hf)=xBK~*deii$vE(mrPVg`FrsWr~cIdWxlAn0g zs>uD730zo={vm-8eZ^=p#1%)3PMoAoDx7?T%s|8@>WDIf6IoEKNC61s`{`7AwHbhd zFce^>STzM&Y-T>kJKQAr>w4REgf8kWpd4D?wLj(Ne((t6ZioWccEtL39k<#)If5jZ zh8o@baIiTZTibkMN!zM5&B%1r)Dk3?@o(EKLw(nvP)8+BE0ogN#!6UBVjR+Ipqm0a z|7`@dvL8^RokvpuPXWa}RNOkDwU86~IXIzY!*s}u>;mu3QtC@TbwCc{3eSvl?xq{O zAj8))!0|k^?`U@KDfq3e>|UrnCV1^R?|_wVT0X?CE;1d|G&e*IAUcW62iq}+95c$4 zc+@ldsXUpa;3Ez*s4I<7Nf1-zW(&y)8Z6|@*77jVtq%Fo4G;Us;H+k-D7qy8=mosX zf(~tJV}@qQnM4P0gHeku9B*M^Pcx5XUbMywKG<)w@8}`4hlD}kLFKir)Fgsx`xkUD zQ@!C}p~4euRU`0XtJQ{Vgvrz?i>gXdSZN4J=0urhr|P$C)+m4zG?4}jl!^_%Rlf&o zPgP)FoKw9@ym2_#vml0A6|rZTT(((T%L98=V@?Xb~DEve1*KdF7k4LD~Gn{HYZi*BmR4 zUPTtjK(=;j(`IaD9qIOUY!#%jM7cvSsyWX)q&7pSm$ccDR`^>Tc21`{Dv=JYH74ou z5H&PR(gw(?kCtF7*)UG!%T=s!HT`V6ImcrRLLg1dC6EM;5eTN0fP#~ZNJ>pLg0f=W zb=$D9Wcy3xw;}q8r6KNvbMMr;SIx(`P_98|5GcWR8noNNrViD#6U!Vv{T;%A&1w)P z@}wY~u@jXh`7IkOGbxO^%#F^61lS6Fa1C5oXGK{53`Y;mG*GWL!%=ct7?P=#+fL|V zxV6xRe+vA?_+Ah-$KoE|Rg9*SKx*-^k=<~PQ{{X`8m}dCHv^6I2uU#3#{Vs#q!Woiel0R zLzF3Y*xk%1Ya}ZR!~f#Yw!-scN_ak;LU=@%-slLCD?FzkQgLhMDf3R8Q>^{dCUM8i zvP{6iQV|Fn--Y2Pk)v2QxW;Sjm`L=Ai$$D5g(-zfVV;<9Pp86TozC2XU}-VSKp+$x z5?&s`m_$Pe631BZi`WoJ0}iqz@|c`!Awy#vwPu-wi_LphX&57iof;(quml%TiL+_6 zyb*LftDvw^Pt=IkolYLtIm5tS@f?BV}n z3IQe$Uqd<^tk8mD+p&*qIU6`Yjz(Cb1m@N5W7`@-^;?5NwSVDqYC#AVqqQhnAp6_s zf{l%$|gTHRmXP>tcIF#fV>KP@4gk1!d*6@fm)7gU9a(@zDt$ zk9Du88V{&no}F+VUezqELm|i0j7l~_v?aM+M_SXA1_r~7zB4-9-*-swg-sOko<2@M zcMS_3lm4~@(o6VR!#GUm`55NO2^i{SI@SB35X)?xV5L?wcbecnimj~+8ixP5=< zI0X(uD&Atk+k&@k7SB?Yw8%dO(gB(MDJV$uidRu_JFj@J>ly|*OvBCG*`7;BZho(m zVDP-jqNBcUkv?A*{p8y02LT8Nd;F zic-ATC_-=vS`JIW4*F{vnnXb$%!WDsJ6H2 z0?KCQJld$niHItVy@aTQPMckrdW!bRHc|*?hQc3u*Or=L zc8!6$X73eNddn-#4uAgTg`uM-FE_{`V;^Dxbw-T)2ILqRc6UfW`?A;)iVfsXCa8w^ zEDFMOBgselY0ZA|`1p7sv*%pHN*m18dATIrJ*kEiDzTHyrY9}!j`bs!7@2c z>%c(;#9S_*b4THnVIDzGW!j*o2oUMTY0RKp`L941fd5GX*6xV-(;-By{0FzI%yT)S z0%uhe^&}@Nj<8J`R)r~Srv?UEy4O-~3&%L+A{I;{2^5 z&i_h59CE?GLB*{L{<9$${9lW9Y9yWQNklf}L(s7<7_-8`c%*$G3J>pzq`}>8O|E7e zD_xPhx^y3EVB}3*I1e<=m+y|hICFplivYM|SQe!@5c{8)DbDyX&}Q@%*Tshf#K!Ah zhJ&?XdOHYpzlnmad$&>qe?%_ByOnwh+Kzdw+At^{o8#rcHXkIFGQNDvxsNLk&?p3onwNtnMY;K{=7-Pij zKA1qEzJt@pLzp^))5~t|b~1qk?nw2C5Y}Or;#C9lH+rVF;C8|so=iZmFNc32gsa2h z^W${Dp32$lv}drwMnj1^GgC%JW=k|vLJ8hkj0_CU29cQ))ueH!W6nC_1-;q)oIdh; z66N!gjq|>7SYE2`4OuHqkQBt3NuaDNIKLPorZpykzWQYc9p#i0P7JVx$p_Sl zpOoN({7Ml(b)32+rQ*0&lEi(-k)Wi#8re2gq!nyHHK(^cLCb5%VZd&3vmZ*|W#M^cEF%k$X?6J6MJ}iKyw&kuknmnx4TslOo1YE*Sz$}GJ zI_7@1A9Hb-qb4bx6V67Wo4JOqq}|YT47v^v<@{9U;s_sFLbvDS3vFcpl!&NwwK;4C zs!#V?1Iuav(aq`|U9A3}DOvp`VKrk@2Lc%~DB{}>VjTPGMYE`pOQ z8hRKLC?cOG#;>~GT!i4Akkey?$&v329VAy4)^xCUcPC(RQO&&5|F(f9+ML0wcJnoFR1` z4brmJnQ1dPAX~?pNL6TvM7kg4b|d@*eWHPs&Pe5baWr^xXo|N1sclCbt1jYp1*CrF zkw{l7(^!m!tPIB90^*vDTKRcCzXz!fdIJ!?sVV2EIMKA>;LbG2TSZG*9@2Cpv!-Ov z8@_)45{eWoC8|5UtKVpSa{}Y_!NZliQ7%}HLl3Y8Yd*L=k$vVAVh#RKuv{I};hy(# zrx}@&&&r)NlY9SlHXc;42+dg!VG78ZNqovN3i$u@DfYS;ozg%1G}=N z%P8v01YSd7Yx&|lqR*qen3Rwyxnm#hl4>Ch++Ly4cc1i@Ng!q4aL^xx=<0-ner6n2cw&Nx0GEn0sU_)^38NR| zjqG5Ct>*aH0o2Z8#@qraX`O;{wPDfqc2L?2>FytbW6xsyDXvSS@qn&l z;AZV6PyB@=Q^x`Kpk2~lEH>|w!*+sY%p@VylB@-Vsq~gXsq`qFy1XEM8{rQY-j=~QojLte zl#ev0g^39xlN_ti0WUZ{*fWD|63$y$;WgTWQyp3QIpoE`EZPdAZ%VDc-|`mpu%zr${si3vSc zz!D-xj!h;lzeYP>Xj%yWmCkiCUY2^5Yc!`v$-kCSMxEqIaY&pwNgL-4@2N=@T8DFN zcC~Q8-0hgWV!h#pW`Y^)_iE539=LZEp{~hJP3>SjzHj`%lU~(7?^i|2oK`pvN-a6h zGO`_AB^f{vd8R2*Rjf0Yv6-C?aXMvok2+V3DUjXv;NX+_o|wR(n%hPba#DBd)x^0i z@=iq}1XV&cJ&VTyRFoJi>)K(mP5Lw+*Lj10(zN91er4idEg5!17*2|+tk6%o)Z{;; zRFhv4HCe7i!!{Gh6Nr{BWhWT-r57Oq^x7VwbNY&SiEe){0SUSCB%*dDhq}S_G6`{{ z+DtnXQkCr}XvT`+Xhl#sm1hm#WreRkuo#s{K!8C@XqvLl?;raeb@<=iCTy6lHYUmaLk%4uhFjYeA{O*6M^~0eA5}#9@f1XoMd`0Q#0n9K!y^ZNob`b+ihvo+_VOx#&vB|OpH;}D)PWWuujFwe z&7BmpSjabVFe^nwCMI5mPzr9F#^tnhYKm}1++eIKgR`1-F9pz!S$L@-0b4)LV&H^? z5as|;MKqV(XTfE|`AaFphMW@J?r^ZKi$Au#-dDDsbx;5g7;4~om95Y4{LY~8+z=@n zMm>V)_Xe_b_V2GzUaSjJB@0*+5EB@@+r7+{F0i8{pE||)ru20TxX#&c&-$1xV(YqI zeS(}T>DI;(GLGnC)M4H^Z$FL^;a1!FSUFZBs9JNTW^7l{$Bh{{y0I{)G{XscUZD_D zX!HI7h-W2buxjAlSG%0P|NcKbag6`y?(A|@g1Gb+abrnPHbaMG^low&^PT9}9p0`=%BOZko z1xeoetqF!{7pewPG;4#Gp(ms5EKt=1mi1i+{QD5SERBO3#MJXPEit!te^&eq#RTps zOqD?&GB?s^w9(8XW{!jf+36+{ik%se`^ey4c{}h%>u*g!pP-=m&-YMqGygfdbcyTR zpFV()KY7X%6RL9E_jODP zrf5x;$6Po?*mKSIfnyZ|iTkL=t)Tq5a^alHf#gHN0Kt=R*O2oA2vLcwD*o~>;2b$5 z^kk6MPjsm2qjNQB?6jlrs_c81U5@!gLamTo%+zxAz?uw}^ADzAG&$qChvCx?f~Vi% z;>B>$DA{*th-I*g)C7@4Ygl7ac8)HmEGn^4u4xLs`UIOpb)sUs)bxEbd&06^eh#;k zBeM>f$kUBx`FRSM~+n4B!k2+YV-9?NSgNYR*~L-g|1T!y?NS#qZK zjO&DK4pW)S1y%&LxcmCj8|dTKWO zF9~C#X_ZgW_=H<{Q&>42sXDrbU3_dZ=(tBf-&>z;HyTwWRqH{A zHp!?B5pb&^QP!=_7};>#>aA%zv_?HhUk7ygO!v5PT`%Y|eyk1SWV_^X$9dL=VqbU9mM}$(vzlDc2q@F;%L%mW=W8ClE)1?S z1?<@IU#+HdA~QJ_II6kf`PL7jeOx@bLnxKrb6)WbLZ5AH{25V)cDj)ZPD7*Q3Y^+6 zu~>b(syHe(@|M~S`Tr6~Ad9nqrv!F5IIsw4Ia0MK%|X~Se3k+OMSU{E>7p%$3Y%iN zVWcdGFK6IRrzAIqrOs9g#Kp9e8h4VBFojW*hnP9c+5@3PcVm~j9viGH+dxj>mPk;hxBUpm$%&GD;-@<{KrADjG6AZly z;ilzNN|0mq`+E7i84<_JM+mJK9-+(n?pIda+3FljK^C&uy4T_0iABQH!m)Tw8aS;q z#`%StNQ8yo-BFEux(Syt%+smSygkF1`_$!)WHSA~D}nxft^VdP@Q&4ggm<39sW4t3 z1^nsYa5C=xRGW5g((D>C$}>;xcG`o%7tn&iu2LsO+E}S3AV@Y{oUYruaEdVlH+8Wm zcg}Ct{i<2%?fc#W_(lcb3n>63!|*&6w}#=auwnQ#6CJsO4V*Jd4j$;6pP`izETBwx zYKVC7_)3l;?yGE98+qJQiJi6zZc2Tmxj+@s3)=Am?s3*2?Z@Wh_fH>kVLY4?zYLB{Lhpmtet za16j@?ikE`7c<>4qAN5>#co~$0$T`KRp(O(3YkjXHqz&bKeiG5+m^8Y!SxYb6iC)} z@z*xUQ2o@PP>l{M9!6t=fvXx^(;4J@NdHC8LKF2h&KyV&l32uB?LM`1>3WVfe>DY> z#0cFN1|sbJ=lYnPjMjAw4fRH=*4{JKXcl}kI1F0Nkepfk`2^_uju9haR4fyM8^aDv zR#_n@YqYQZ?D5}Z097IAqih#r4EHV1c9Re*D!AUvCh5eKFm$PW4Kx8`zmh;2iBNx; zid*BoJ#4&pof4R>26DX<-`O)#?Y@;5%h`zZe>DB2<;$)`$3_{iHSFi z<{;Ih<>J|9E1#R`OiD`3QOPT*+(kfgcAXudFg$YmGALbxUsjBnYxku>*~}k=$_Qc9cO;QCqXVZ@cL+ z;mV9UCOpQDCK++Ik1wDNSSgSCsOyc>tBptwqlotFM90$OKX!cJt zcuJ3uK)gEgglxUQ83+&dq-^T3nGcHFtMIrgxBzI<>;`@wD1+Ea7;pDCBdr=L3UWFhYtYW{(9 zJGURfiKG1nY6LITp6=0B^Ze*+xj5~&N4I2JI6kaO-Hdix&C$tneN^q`R*S@V@$42= zcFTyjg;cyne_;QaU)^#h(Jj2QR0&hX7(O0bekeii`+7K!hXv8` za6X6=*~phM!owK{6h=S}=fni$h)fp#c#!{qyy5R1llWl{bcb7Hw*O_w9j+Ieb2GFS zAdTXbc=XYnEhBQ|Y;2VDP)?@6rNZPd(+Mi38Vd!bUDAyeeW7&JH@+N{@gv>#1|ACI zXgn1BvJEoTKbAmsSzgd>4+mF|xYKv~)vsqFs_pr~?w`{xIRpx`q2Qi+Apir}(zXQ-FX>c1weY?Upbp?Jx`VtU+PL&F#0aep%< zPruIP7T@F6?Jk?fPX z_05o zbgB09xailcYQ>Z=bg8@*Gy%unl0X^>jlPMBTTL&9HT|&zdbwREzj*=^>omD?W8=rM zBuv`|c!3K>(M*-qAyGC~dSDS6bHsX4nggZYoq|#lO`RgS5t4N)!yEfDFk{Gu$=0cp zqX+ZIv1wvPSjU-yns_wZ+Lo*1M5a;}5r!s?BFW7laV&>2bp8oVy|%}_H)8UV!(oJx zmGmPC^zEyp5KEWX&TQw*I3(|UzS=?hb?EjMEaPdV!BC@fF?2!`?sjQ*>J&M}SVX0e zw~6)CDknT;r5e)o?272k{kn0auzwi<|MQHxGa?}qNP4m}hL!TjHp_(jR083|A=14J z2OIjMY@3cP6$SI=cyft3-_W0?wsXeow+F>5Y8$yi+8XY-_)WF1ApKiRNRh%O44@Gd zXDoEo;Xme(I|NB2H<$A!ScXoGAHel4Bq2~xV*)93NC$OhLfIF*nBUU`nNJ)_g^l4j z)s3#)mP`zsu29Av1!{}-Gq6FeA$N!(oaWf7;oy;r2HrAcA&o#-{#*(8N6frv*#yx= zWa1k9uzfM}|0)IZKWtkb4mvLlk&O*|sQ@rENGIdQg9B{L6z@=)RlHqUSrNF}Uee&E;7mz#|`WyxTNraIx!4w>fstQoS{X4MXk5wwm{ z-tkPgX!56(4ac1KUncTKcq_|qVQ+9LzLHK$79Z!iuq0XW3vTN2jm2y_?s1HZn&cm| z>lx!8_v9p08#t}addGd=TWZ{u%K4AG+ zFBo-u!P$YTS?d`LSP}5wp8`+e`W$gx5bpMD4|IFBn)K!pj}|W$`1P}=PUcRHKc0OU z>jPLLo^0Se4O(F6v`n(VqO@gL%45o|1U&nCnBN^n+VL=F`ni4+6LN70?dXVcF%^l7 zgQfFN-97Juvr5pCO=N&@FwsKo>sm z9~7UyqLohi6ej7U?|b@6-{+2ECu5neo-$TKY+asGr<6}VRc>NZLXH@GK6seyR%X=3 zY3Hye93w-~A$B%7?+OcrNVRBS=VWt^Zl1;+P?UjzFDj`rl}x`lp@vs0MP4BFeB2V2 zD|J3|(c6j=lc;>JID$Hp!&=ohzQhPwsR&+jP++4z(XFEcjuF3{QmS=7NQNdRIz&*v zqaYc`TKw*yaNIwL@K}u-sG7kloff_|tcA8xPmY%w?i_Esugja{YqKjG<7@Z0@lbVt z7W*4akTIr&AzS5JU=OJAw<)+p{`NPixb?T+752CP$9`;NPv=j}8fJ#JaU<5+qAbK}xlpF#2GY9%~x%p$*AL?B85SbT!z-A^wUDeZs`!$%9l3jdsU*`Dq5%0tq%t?mz#kW z;Fq9pgSoXIQ52Ht-uIEw5q;~P?mg8#-4j(ilTorxYZW_o>}nTgXjS6jZSoi5Lo@RC zgFBtSI>nhS#&le&=8fH9dD)U6FMTJ4?+%m3nG}}Cu#*c5Gs<#sj*hY<>Xb^F*kNs9 z)NdC?#S~Z{9kE*zr@~%pG7xyF3{r6vabU7cMP7|?V!U^x=+cq9RK>yhZQUw}6JfjH z7F}EudT#q-B0rKqWSJ}K{)U4a#Eo>xVH@r9J_=%-(5s0kkS^ojwlRkA$e5}bAGp0q#Bs&DJ4v|J{&xIDH&je^pbXCsFhC6-`iKtKZHdrlA+K-7_DvqLnk?Df{7YBuXh~go%1iZ_( z6gUqJ2I;iz{b6kj?_qtWpL1sv;0!M0Rn7?cc~fn6^03HFzFx5epYKe@xGPiwhs4zV zw)O8WVGqW-v5b5^fzEwhybp#6l2<+9aY-JYOWsWM$h>2=<8Pc5>7*b_bE` zM}?Iq2ubYmr|j5xU2h)_+oRrs|9{H3I+G^sZxd~D;1ZF&w&$Jgf@$}c3A7W>P4_z- z+@6TC?IBI!D4Z_R3;p{+afwPOQHZ8fu#fbWpHG=Xvn2rpmyz)Zr`E!0xtv|!s-MSk zlMtC2pU1(`1Ky+tIl|cy*nUx)Y0oJq3@5zcj2XU_1;b#5PnT3jj?uuWLn6X(auqp& zg>zZhs))~x3u18_V9`ozgyS}TDG+cZS5#rSBAaN$)z6->V6X~o;2Oyh z1>N#+aOTpoz!eWxH93!G(q;64Q%c6Lh*PAd~cL~@p^ z2euKGp4};>NB0nW+H?;Ta19;$2_Qq}Sr;tF289Ji=5n&cO7>;$*l;+Vr2j-%(ru-l z)E5z0Cm0_S5l;%obEJEaaJ&SNkL*>%x&V}#FX z!nxJed;yCE>X2wkV8-f(3fQO+PsXS(yB9bf%DR`o$Hr1mC}ik=IdjDtyWsyk+@NP~ zW_@&Ad+ZKkITX8p4Src7@aXf-6go_+A-e71AY+BvHWhkmOTWvc^QH=beP~cvXe+I; zO1#ZBs&Cv-VpL8ju|hww)tMR}9~6S+N{4MTfjo(VWNld21(=LA0Jb59=QD%C^F3F9 z{jeOl5}+}Bu!C^ide+a-$Sng_=$_iBXjy%}oKk&sujE=2!EGz@APO>^Zr#lnfopB} zg>8?a`rm^>wZw_$RnA?@zLx?yolJisEYsmIUb#DrC;mh@dPnXH#qGkF(G$9hxY!-a z!+ja;sqzJSucCS=A=J5yJsMNQgkQfYK6$-wnD3Ke0><5qvgX-m`L>YUbh&MJR(Cx$ zU{&q_ND!{u6Ck4?8hO&2skrr|e;J;1_%gRW_CB(xyV!7mCl*8~cBFT^!MGT3W$C~k z;kBK*<0HH;S$MbBfP|G2&X>{+zSzJYH z%3#(;G3$e-(Q0|UQ0>qWfqJ^7=5nkM_9`JZjFhs! zlm>GvUivpgq13Hc2yl0CQ><%0Q^T_QT(U@&NTYOr!@=F@gv5b4Z4KMYX){aMnpW5Z z*|lNebin9-gYLdJ0r_AlExODH-Bl|&T=pK^5GD8XWSE~es8qJ2q`~GUFIra=@REMU z-DRzeIf0;VKuq)}SPmiVG|TgqA10hiTPxepapgyFt>rniC5^u<*8`uwK_?umt;6jv2E+Fcp4zP%3=j zO16T=D+;b?Fb(h04duT|3Mu2WJ1_?m;|Ol@Fec*~*&iDJ$OXssnJVQsyFIrJ|LfQS zS19FhWiG}tN@9t=`p4!_Ig`Yj`t)SQDd<}S(ElNend8-MNd{4*cXK>076KONKTRpn z8X_8>Qjx-Tle&h%I~|*UGtB1j9P8hO#_9}sNSxlYB}AJo^qh`AfxEH?Cv?`bCwXO7yJ@`QOY(vh+?i@)j&?tzD!j2hTaND=f6_blxc9`Naqq;z zuzY>;+(3w#g}Vttc)jv zZ}9y?!uNP`g_QX2C4;`pJ9XlSa2H9bJT+y*K@(}tm(UIc84Yb6cp~3Tin1leLR+>} z;zl=C&LtylsPsofrRn4fDXBCLJGskyf+H3(ODDTZVFU^ysMT2<&Oc3O6gTtrLMcl_ zG42mUopv4zr5H}>Z`!SeFI?ZaYBEbT5$f0m-$6)qi3CXk`%9}`92kX#`pMaLZH zU>B}R#woxcs2g$_H3G?GpF!*em!6iet4)_8t<-~Dri+%r(M4@uwLZMqty+G3fLOn= z^8RG<8h-o<@#BY+EA-_@fB!RBu6&UBV99+HiKr|k@a`?$SGxZw53`Zej_=>6f@pFa zjVg)^;M-%Tlz=hZF&E!gbR{z|fFaY#@1HXN+&qQ8;u zo;L=@{vt?m7TF5;UrEv9F+CW8yj8hDC1tJepJ_u&f@mA~>P@wD=&v6r!j|*DB|!?U9A+uLs3%WDqvl&Vs?}MPWA_ z&2&NXx?YK}-7~IBHYYpr6dO0ZybTkzSb?&dl~~lYn@-if*iY3?uf%H4SOZsxm~96( zw9Fw;UUDH5FopT6y1SRs=17fbnU2cvk^i(VgIVZI136|qf@55FqseUg^ElR{IgQFS zx^jXX0oZlA#hh~=+WB+TE)w@>t32E=yt#u~Ng1E*>=f8jg#@>X5#luxo8dX>@7$J2auOR;`!itk73BLEs^G z8&b%BWiIBnFXL#+0uvm(<7aO5CN>}|l4PS5eMqrUg4|GoJ z_O*4a@H*T@X|-+t@P9@Sd6mRJB;2%K9t77ORCfp23{f$G5pRrzsvK3qa5#l9P$I&U zRNO>mj{XI3b~Zo#24{}yON?wp8sj=ljyre2iLkZK1sa-pY~nGRlm5?_YgxZu!UWAn zqAaemDV)QJk;tn$gt-N^LW4bd0q`u44-2Of2`Y3m8*DOGu+Pb7#<=B`4B|o0}!s0|DINF#ClHtKG+4 zFugb^OdDf_%C;TE7PHi~UKV(#BvPPWNHiD16IU$80M|oFk=+gaQXHXjK#-mho>}n_>91L1DNdO0#XFLG=45 zI^pOjYYzm-mGa0o$#DMRpm46x7RI&{m`4U0JA%YztNta8$6|}SPG32_V(C>^QE-dS z&D6Fyt46sjuIKW%^jst6(PN#Zs^(zfL2*k)FHcd62&m_iSuxIM&X~&@$Xta= z-`B4stV_CruI~5N2m^X1bjiAUr%(pC;i7bnC58>aPQwBrM(S$rKiemFlzNXJJK>!; zc5Ivx>1u&PP6JL%i{`P;Wo>CMR-3}w5Lm}!lsYW6 zSk7brNSjhEd1ON>W-pdq5Jul4rvc=b3%^FrKX$6>KXrKY#Ax1s`l%CxwQKGK;hLYmT2Az3tc|GpEDBZr3$ti1qoxd`z}E@_(8HtahlL7T(x zn1ojDJ0?M2I@zm7U8MOx(Gb6qhc0sJ)Qu*FBS6!7C?|AVuKDvdcCLE(>bRBqV0o+2X%>)DaUTUKmQ+4N z@wCcs@aJdoS@|vcxb|v#dL2H`%vWx}*9-HNVfA%0e{GGz7iF77lVFWX1MVPQCtqyM z<9TK+o_8u6R2!RA8abD#a`nVmpc2qXg z#|!lFJbm1R(>g0R(8t&5sN-TS6^OqX6M z9@8ZOipO+*q~b9}1Qm~IAxZK0z4RCHm}fej%I!)??oeNM;R_0MkNUb-eci9Vvg&J8 xeQn3r;U$$F^mSEbC%!5V;o}9&!%oascHvL7vs-=b#n)KnRrE=wqcfTN{{d1KWhDRr diff --git a/docs/html/.doctrees/composer.cli.doctree b/docs/html/.doctrees/composer.cli.doctree deleted file mode 100644 index 48ce8ea4bc9f268e358e4c348594b2f92c3d987e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 427593 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�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 B(r5qx diff --git a/docs/html/.doctrees/composer.doctree b/docs/html/.doctrees/composer.doctree deleted file mode 100644 index 04cba15a2e627bd8272c347b3c67e0b6d7145f46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66251 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 M$g=f_&X3vu2OJ2a%K!iX diff --git a/docs/html/.doctrees/environment.pickle b/docs/html/.doctrees/environment.pickle index 0b8d7a155e1f982de6215c1a81c43fc1d878e27f..1f561895a8a8d8fe7d1a8ea4637a57e6f195d372 100644 GIT binary patch literal 1983311 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Ð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
    Pi{42 zOs6e^q;`1V`i1@GcJs|T&DuuYA)jd%S9~|4Tf(d*dl>`d`NWrJmr~Ie3zD%mvtW@R zF*GE&*c^?TCk^#qVcQvFxh`tR915U6q$G5WM?1R$Hpk6TF%4?UOTe}aK&cE!oh)#zNWyDI3K1IbX3cxQY@G&jjO3i zm$bAe{T4ZJVFDQ!x&nC(2%v8`Xmg>A#tT7_Gc-w+Fog#OD&3%C`s)wfV2)6^K`n{| zPv*m}3~o^*`1EiYrf5+BeqOb}n`UrFDPxf)TUH?m(8t~W3mIrr6;vYtRCSui-N~b% zmshoJ0|8j20Q&5OH0|oLG6Fy$>z{)TGl#4UAz=rDUZB{@uo?oeS_QO;_)2uW$|_I@ z06oX{u@`DOuQaK`(dOq|LRUMH90rW*BEiG0lH@i?m&b-_AKNR4gFaWG& zri-%lIGA+ym1PD<2uz4yRlmfT~02+aUt8s^uC8z$znK z@3y37s~VXC0HkU#{)Agn$XZpa76i~*tKHWEwX#;JJOIzK)o%PK@cuDln(G@Z6$ji^ z1^2eq8BS7};xcwsMBm*INFY&7w()i--EGw-QviTeP4WZ|@@ zYLjt!0A6DiVIka}D@jg>ZQQD*1vOgH`3D z;($|w`{qH|LRANMjQ~*9G!)l5Sa1PjAOL%XjY5C+grbCmN;5W%g-LlZfY+Lpi@D00 zb?YLngg)IXkj7NiJ~uUllu~Y=R+iG;a@XxYem;;wR&IZV02$R{>Q9vKtkb4rQ_)UU z*EGsQ>_}`aXZsj%IOH`@TZ~_;vQ-&nb!2E}n-C z&RR2$uEa19Vu46akob?^cj*<8V3}TZg5=|XKy~8hgMM#7!N5ZMRVSqu1klRxLWf?} z@VGnx)fhn^1WSpkV}wQsK{w@qI|nEs08}}f7jnd@>TIYu;8c&>3Lku{+C3BiAXVdR z4Pl3;e!rU`;|rj zsPa=U9|Z?yRsEC#kdUMhq0q{Z3;;-Fr!V`>(MhmBUDZy30br%mACBlCT?kuMry2pE zN~h6TP*nve06;1^|I+RBF z9bt>cs@kWxJOGsn=mQl|A|hZacW1M{+MD2gxpnkJtY!IRM&XbIe9Y} zN!zH}HGlzNHO+iOCz|w-vD`4JI?c2ofTp=Pot7R^oV)sg-ivI?5jZ2z(n6Rs>lhGh zAFHo+2aQMjbQPpY`|s4>+duG=K*17VJ7G0a@sLUMuY}y&+83Rwskj zKrUu70{aX`osuJ}@=_538N4@rUbPgAwiVv4>KYC#w#A>&7EPghf4*2vBW$qK;exK?lPRrFNi!DVJ+DYl@oH<;Qj*K_;+lbQiIx#os*a`RcI>@$?cp` z7bszZRJyy+js-nyP3d0Z{j=O{JBD!N0U+4)TwVTgkGB#jish1qLjm-Mt>boM?O2}NWjJ0gra?`40N&;& z9UGgRPlRT8l)!|x$H#-9Yh{en3Pv*&0D|#e$f(E@$xJeqr^T#3D419I>#Z@Rex-l- zy$I1b84k*nx78F_V7Y6)Md`yvI@xlM9a*>%&a53#_;d--65fseJKzNy|)7?XEaRrV@QHV=j_rQb=H+*6Nv;ov5=PHM{+1 zO?fLQ%Rn54sh0b|f`XEo%=;@HtA<-p8K)mUM9gR~K}dev5xy9acj>gF>xUV;Z9Ysy z>f?e~DEB2L4v1J6Rjvgsq>L^(EQ3;9e4uXO)XM^qa|rVUXY9N9D3NwOSk&}Wzko`> z!yEecPMYW|837j|S|mb(0-}5p7JkH{Z1OyTk}C;GGERg;uwqFpLxvz>wEXe~VFn07 zgO9Tbr8!PD5NRVLDk20*Yr~>LfRDm*k7*H_FwBfVfex}?t}$t9K{M5dGll%lFG_6kT1*0b!!S z$qFO)vzIkEdGLiIY|}C0Xxt5FY|9eCgNF!F_q2NQ?P6Ko(}IIuEX25bhL^P}u89~T z*)#l0TsK2A-0A)lT#(8*84f|xvg%h`9bQZUvoAX-&h?G|P`hP^MDR=avF;(3B?nQX)7tBa9>gR3t?ZtNN=%QFC^^MW=UGX5Wqc zSB^`MYE~priVYh2WkNa~D^e(2#`_!z&?4ayWRQ(U!Tv#4C)FJ_=o&+pcDHGvPBEVG zLw|W~=-?oa`y@dCN!X6u7uVD;i5#~X=kEe2mO(&+{R>fO8*?8NfH|3i_P5ZRT2jC!KGZS^L%&BP4d1V5Iq(`Zi^U=7Tu(v#4o4 zp@Q%k1tth-CpRMez9|hpYbV#C6mc>vXleV@74U!F9lYwud!2cmpW8NF;}{)6Tx^YB zH`cp!)E?v|%!rlXqPn6U27s?<;MQb24)M*1feElJOaz}e`rk>m8EcerhgoPuBLMWW1>K`%wvabt0vZD=6o9Yt->3cVTZ&eT%_Jjv zp1>DCpt#i1@lKC8DYy_nBe{(!s}0e|0s39@jmO=?4Z14W?9+ZYJ)Rm~tI9bb^1`x; zLBV^`d}VF@=~Gdu9Q%x!6b!Jh80_!1H+Eh=-4*aTC!{evkic-mFg)$l8VBgB zM*6f_=fteU6>wN!K^)5F{A(~S&B*~Ma9l?{cDlTo5o;?at|U00E#P@M z3=}vpR<-sH=(RPu(LLW-1tc)QH?{cHGttoV`6i76bSFQd|Km3Te_r`DQj#Hfz-s{p zLP|1x^YyaoKuBP4y_xFv&w^my-k^YD{N5mVjeA~v1q6I}z81Yn+doY7hWR|7fCJZ6 z<7M?9qxxh#BVqvjNv{V69%s2@$_gTT#=Lf=k-*@5)R;~k_9Vr;{=-0l1M{2K9zAap zk<2&0aadq+x|%94@9%KTt1FEJ2G>KTWZ6sUAqoiit}XcEz){WH76vNK5xA;FI6Pk^ z>k&AsML0Zf<+XO?uI6rS;jcV~sDsbVAUxJJ>qVygdBl>D<09!s99p8)V@EP~ixhd1 z*Mn|*NwXaTg?hL)c@s_9=4}&=1P14;)aOAp=Ji#;3R#9Hd-TF(xN|oji^BrTEjo4_ z(=9aKRvb3lja~Y8e<05{bB<6oiXN)ch+w?hrp1|hu##w>M5zfg$b10B=zpLQL3Ww` z)Zqs}8~lTC#~CJV3xmaj0s~jaeauvXC1XNi0b&*f2PRjSh-Ln|2!?A`6#lr~=>@Ck zjLjg6AS>hWP#dQ={u{q|x+J|>I54ePnI=E+)3AakV;W|Q2UXHwV7WneiMq$lo<4V7 zOPpwA+@1o4W=a8qZUtYZhog>%L6Av?b3k#y1gw}OQJuL-3|2(4uInqBXI>Iuf#eSA zYyO~L0tz>|GIoc7BlH%5g7y}^ZnB-F%p&8`Ay5L+gC=F80%T0teNBnv2mQwwN!e9g_78|(>0sdQX^2%u0r`QC{U2LaAdal94~3Sm1sN*1{$lvZJly* zDJldONUowTl&z-EFFea*xQrLV;ox6yHsbdrTvmI>(?=Bo+)bw?TslPX~!|^F&qf?;!I3W0hzA>R|BE4~= z#bJni%d@eTyzf~OY+^y~H;3I(=fKve1R4_Dw1pe$7Q4Q2D%4owxNYGgX1>^NAi?-c zTc|-*=KHOUeg0_gc-(bA2?Am4eW8eHB7ZRR=M}bep%fk_IPcj~nsc4( zWYpcK9uuTtF9`&*5M{&y80>d!QO&MqKT!twlGH)Ad>OSv1@9NOT;rhGZ=LKNb|!-% zy$i{|e5-yIZC`S)#3B_)P>2s%KDG#IS7MLT9jSeZDAh|zFulbnkb?I+0%Y)CZx33N z4!!!c-r1iXZcqE+oxYr9uz}EyK7j|a6-zc~?GmZba?a`}No24g9t*~ZX0iD{T*C{p10kA1rpnCFQ${>loC{TTCbMW zZW7TFQf~QfufhAK;|@KRt^XA^nGu>JK~xuz9|0G%Uz$Jj&Om=c<1>dM>!{FvGBSDZ z^k9o5q%TV;86^8u!yMvSSvBh$yQ`@FNK`Uqps6;;SKSZMJb4N!AWAJPysoC7?X)mI z0j}$EM=J8P@m(B%nz2R}5FW1t1>?v5*GHX0 zo*A4p=nW*!rY1T`$<#=if+n(9kqGuLV1X=Ol*y7%#{bH-hpG}8F39y+QZ9Z{BO%m( zEL|v%2olwk5~(e!{$!mJQV!_3MVj0t~hQclzQ7_F6U`b?t--m)}2&SRw0INgLTA$I`)Gp@4hx&q1T8~8|oLx5Yd7@HThyj&@kY(~fl z2bdD%78t}g1L8!bOSYvXFYUWg=I4hG>SY2L0`MDOaLmW|lw5-zPE$ub4Hoo~`(3m` z_RLG6`dT=R1yaEt)c2=tN`bB9;h%&gC7TmcHEBr#WU${cZNlvPG^2r1vI3N zsPv%T?cv{qE;164dF>fm<8c84q%rAwv`wxuXPI0A%n41|66(xOGr_&kt)4J zxfB8)a+p@|oed}$%_wai@}eUWHO>lC&$!oYnrq-*Cl#MqSg^vjbb$??6eV8V z$hWN`VjmgY(6KI)pv~8D5v>6QYm*Ju;$y1awBE z14=8E;1>f0itGG&w@(}N6wcb~Z1PWnC*$P7L0F~`5p-wb3sxET)q?~?8Uv8`4me6? zLhDzX8{`Q-5jDx^&kjo01ULy~(BE-okTfK5;XlKPIh+FSAOXM)S73d5yq_Q~2}Hms z;V=SH4-z%K?Y{hc+Uq@ma)gpgPIph`l&GNf>d9YNay>mr5MDb_uL#f+0*xo;CsDx5eNMN|FdORh}8aHSrF`=vuv_W+=kS|8$m>S)6o+uby7yGM31?{Jf zcC0p<=pbG_`IKPK*fDWv0ecc0Lfoe41+_f*_W4V-d#&?d$upXapfJEFZu}Brg7gl) z!2O|+HDhW59Kjlag7zbNsCszBR=PW&IpE-sc1e0WbP+H(D9%`HStQL|j0^6|hd*_P zjc@5cJn#u4&ggxru%;3)K)=O*W8>wO9KTd!CcgeGK4VbuQ52j1fd>oP6`s@)-|iMA zf0|6C(PZ30RmBaF1OmfH>MN~Ym(%?*5uFP4>4HxfVU)2%@sS*78XEL>{6b8>-JwG; z@}HssGuCE4PLkXLgZiFdM5(x->d*O$<3HZNPmwF+z)r|>^&5lH;r)mAF$VfjN%kEN z8v@+ar3Qmn-Ok_mi6`~bd=G$#&dbM)geW9|NZL0TP3YvaG_Ut$_orjI zj?%zI(xmVq$YnYjQme7eXOFhN79AvG#e~9&62E995L^`>@9pf!gl-wPc>oZTC^Qh= z!1omY9z~JS1LvYb8S7(UB)AM9=vFDqQ-jwJo5#a=U63)O>1mVX{NUra*&ZN23oE#+-oiR{4 ztVD$aXb2EkHJhg)gdu0QwXG5_w;jC4hm303W%Q zV=LGxs(;41)gdKpKmddMt}DXiw7bL4X+%#AW$dvypai#%3+m5YiGVtx`;0Sf2UjjY zp#Cpix#MQ*h~K$7X*{MIW%S_GW@=o?n4dYwK$KzzXywrU2XDrRPEK^FjKC%bTqs$Z2cmfc0pFo+JZ=7z z%9^~$KoH`B`c_v@^cs&jb;6_3;q;jHkLC7s&dkf8Xa%GpL3tIFwDYdxn?--kSrMh! z99l%Q(>?6dru#_lMbAs*&_MJ)rEe2;`1*8n4vx+l0dQ9-`t$LW^T*TsA}^va%$&8= zz$~pIpcKdU4_nQy+?AP+!vG~Y=z9D>E=T9&&_GF!__o%Z92zLakvQd^k0S^gxWH{r zxgW-xFREG+mDJtNAwcr;^f&gn0qDci&C>%l06u2IDyv}{0APMhbl&6h&pU5=G#Avj z1f^kSoUeMK7h{6?5`CLqw@FkeBmBiYzC|3fA1TL|D@CR`4BO^BS4 zC&Uxk0|EA`#r}cLX({`Wu*Hl-ArU-qz;Kg-oAuSk#^%=RuWn@1Sg&}0 z41-cKA}~=}H3xnn9)<$NRr`4|pe|$j2mr}q(f;?p{N3OG9sduED=2{4`u3cW{sF}W zAFx1TtMznnxXsUj$>6PdtL4x@WSfZo6g~nsZxb0PP~7Yp+tZ&vYBz_WF=T|v0z{}y zB7)EwJD+?&vwkZrZ0tTTSZy_FGC+qqDc+3zQCrPqCzH@%{zX)Xmm}K)iecjOI*lZp z$$y?cyNNJ`;*TI+iV1Rk9%1MOQ-M$!+Y1q3flz8)=Fvc+S_D8hwVM?DmTaz!O~VK; zEl|h;c|MNH^XY1;#WMC(BdoM6J_F?VG%EY7b37QGq$K%%X|^LdAj=n#EYEj0UekWZ z(?QafGxmNW#I$B&9?0}bgz)dv&eV=~zHiCcxr@Nk;s^>z61SB4+Ebb?aH1N~%a_+u zk^{2Deg{6spA7iQS)SiXF+r}lSM5A|*S*STfE;mK?F=Z3Q!>J4d2J;*N@O`17xbtl z$|5)*%Wt9%uuFHE+o>k?jiyunJOBjU1$_0{cU4t|l7fU_ z0DTo-c=jDw{SKJ1>Ht8%05lL?!uOs%TYn;Ik+DyUvXX;=0Dm1{VR&%+HF58VO^8>uyJ;Y0ud9mD@ue4zRCt z+6Vo(<1_kcm(psYBq15+}wPOK}0D*$Sb-eworrb13BFZl97qihAYPnl7xl1Q75q82q(Ij|KQYXE?MN zoKb*$1;~^fb2O+vPA1R|5*VNxevNz}@4e5b8v_LVRa1j?%1Tc676bL?IFq;z4ht;M z)00koSe-MUh&g}+hTEnd+fB+V^msa%4Ek}JxEwzmQ$>)DQze`k4O-+od7t=kb2RD( z>&c7=N1ceq!Dv%1zy^6OETzI6I_(|GLouX>4ds+DBkVoIOG}}jp>QM+=WbY>E|axY zo=DNGprjlQ9Rl18%c<=TL7oxc8-gUsH8O}l3CsM6ULxjDN45SJ0%Yt*g5FEXm5u_wzMS+=4JH)V1qnr^;qf4YITiVNW2|sds)O9 z8N^XXbA8dDaxSZ*IdlkcFKlmpB_>vU#^sg}Drs##K7{yXSh8iW1altj)a~GmZL|h5>ek&#H(k;#>f>_a{X-Jtm8jr>#6W!w=gBG1&S(B!S z1mZ-#TzzwkWD;^L%a=QJ2=H0hxauqVR$(MY#twG~m+XEa2ZZ@;SXvsRvUZ+Vv3nEx z8NL%cFJp(u|BxZF>7YX5!GD*;Acw#g`<=_<+>^9EX#Dmcp5vM_*y8(gBH|RYmm5itHV#uj#;_Zlxok5GC8o~bNBZBW{ z@Yh84pN#zv3z8xD?R}tLi&u2 zY)^WL1BOdOQaNwKvfc!GMju02)u#AG0RjH1{gmDhd8_{9uU9jU$p9cZEEAf&l)qfxC?3AN#m;d&da|3L2_iwO%faq%c}>SV9`Acn*PwsFG5{8j-bn> zjkW|32(Axb9jZHfo5w@?f1F_>$D|B|=1Jgz?5anW$h?r_bqc70qzl(Tqz}(F`v)>D zZ;qvf#o<8ZjoEs!^-#cP#Fdz$8r*{c z_KJrcP2w}=qy_k53V&lb9CayE;MRz;TApn2&%v2Yj)iFqU6B-?tI=q1KoK}Zr~VZh z%juM+xMm8lKyq$48ql4kiJWF-v_~*SwJ-p_G#t}pV@%h%=)XeroW3qZ_kjTa>F{Ka zL!p#@PFm(Qb+uF=!0d?^0*<8C_g4hDe~euKz&B zHW+m$CoxTir-^7J8mKPn@5K}ulgx-hqX7D<{=2{7?vM2u)*KP|SfIH)qCoh;G2Kp_ z=jN;_teQgt0sp%Bc;|%Tdyf+=8O}JtBH+MvhQ1g)=#sHYkx?ZY0*IGJo#BY*;oJ0Y z)h>y$T01@v;8)bzMX!S>%0n__bOv2q;fF||xH0au$oG<0DQbX>*gjxrrW7FPZc*Mr z6}zC1Gj_~xLUkFb2px){OoD>+uKT*lnVICxNNnJM0^SfeN&T8~828=*wZsMWZ71wT zA#ui?NCy+tS)zjWj{E+e@9)sh2f_(t zto;pumOKIj&n@${^?jcC_330VCd*j-C&)rXFkUj>jd?P*eiA$y2j~~aN3_-5Q2!Mg z%a~H=qDEm31<+^4^g@oD=zVkgiawaOY79W$93M}HZT;FjU(el%Q;lX!@HL2*JBbIn zYxHIhk=jp+&c1U-=8(l9f#RyB;CnaprZ|O3$diYR z30|Z&9}6_AjwaDK8OyvRi-7{kCH@l6lb%v-gwRp zG+GH~+7y=;HLzfy`E0B%PnrC&>fULGM$mM^;*7**0!~w(LI6o_i=r$^!Zb1h)C5dg zg1}I|6h&~Wbh}s&8Rz~2GM1u%1iH8@iqoq$ugHx(>%QIW3q#8Yw-!LL90D5bpNK-{ zE4yo3iT23Ip)SA*C2;ViQoLM$r&2h0Nb$K4U*8ljv5c3e4_yK<)<=>8(%ce-ozDE> zCTB(Acga`;hYQ|&lJ|(N;edGi@@+l14*;;vy)v2h}e_rSKUC;5Wu&3a6u8 zrOA3{+!}RN;DZ>`a%MJ!p=*!=1Jz}w(y@<^gEVA0s}`Tbp#c0MgTGMH%U$t|wF?)u z;sXP~SNN}#DW77L`N1urnvCsyf$hNn{+fZ`7>x!a6RP98iyRyB#U~0M3N%Xh^tTuL zf1`~zQHiR$cPIddigx%?%|OnG=1>t}01w%B)F8R2>;?tkN_Kjm?t6+LTU2%r2JkD~ zyoB97IN_&2rD^7D1o&<1NzKi>aB;doH@H` z4n+4e_qzuQ&iBU?xyN07hlv1ywn}Jx(<}WFWzPCpmp6h3SYTN(EXhOooIV_rSSWB@ zCXQ)q!igN|AJGqT*3Y^ys^I|v|K51IPsfdXHO|CRPUum`bEIMecAF!WUc(=YGa3oSmGbZluu>#Z*vSGU3JWBwlTMF< zzInrGSN$X$Mus7{^13o19Ed)qM8T8Bcsk_3Abw@5+uEg1wx_gNDgAgxmr_`UuLKp` zcLeuZuhTS7HHgY)m`DMyj|k3>1Sdt)j$icY*mR!2z5-T>3ErCE-RQsWjs|^Bkp6vh z^zF16q)yDZ%2>djLWT@Cg$z%cui|jcEX$&%jT_m*f$fH1d!|woNsG#e(I}`T(7+`v zX@_1vQK{8?(oN5ANj@StWsB}m58`A;Yoq4)h$0E7Hwi1AzeQ8Xkl|CIWA&&nKiW!n ztJL!|LV}E~ivn%OxZwXp@c+;p^=Yz3Zy<0k(7=6UoE8_*N3dY83-*1=dETNRr#(7G zq}VN$1D${0C3m()+uuSNe>r_)u|S$rX&@ch|J%tMN`9?!Y$JQMKO$w>qros8E`bQX zs}pSXCG#R=%)lIgW{dDZ^^yB#X%>Wx;{}Hlau#JixbBM3sy>nPAV;mXY5}W5L|s=L zU7X<{$AcA7$*cxf98GkwJ!3xRN(U7ZsRO*a#MkE+sf)Za@3oM-&R*52(L$@P z^1G^(=;=8lS`n9l1CggbPR>_-Fe~IyXbGC$fF4U1)mfyKG#Y4DC&b#&tI|FGS@2|> zf2;D^+(IO9T;lI^CyibDN2)7h_r#R73>F9I7bbL$N3q6@U72wT=dZG4ZVFe}$s{oH3FZe1RpH#b3YzS?)Pmj*r>nab_aA2o@zM${1oz;eb4b z1@|p*xBC47?Pk#WD1tkH1+7&-ujXupQyG&oW;LlgCvn043B>ij#mmWr$}>i| zQ|LWl@PD4*=j#vNSAB1qaY%TI3;{UgxSf#WMYyw*amVo#b_EH}y9rL7eLs>@`HXGL zQ&vz2jGz7s;xhrSkSg-@ElZzwgrIbYzGz+Y#-svlxt($JnV1=(o}N5 zj6_NaBtf2FfD~5ubc97wpPe?(oEtml7k*quc-;S)?{Nj75J&t)P(do|cE|K8o9Bg= z<#toB;JyxRPP&{Dw$~d32QwLQp+1DDx{nFMoBp?TI=9CIc^N-v|Hlk;%n(zmByo(I zBwah|v|dH2CKe@is35)J*OYd%_XlA`GklAW5mnTJf>N|5pG1bK3m0uoU?vG^KPpn| zqJ+Q%;T>Ng^hX_f94aa`>C*|NOo2awwU$_KN>1paw)VL7PP`Oa&tZ(OgfJT1G!{f)HMoVPzzI{ zx8s8)_@bty5kV%#)npwP9ak+VD1{;E$e(AO{&cA=>cN86E{oXmwwnD;TPIf#ycz4# zQlH@Cf>`ucIuoA`qv|f&TOBG$ulZu?aYj_M!ipr>Qw=2OM0eSlw9|9ZMZ1dt2DRue zyG!@H8WChye6zZKqCgOXlAnLz$K<7qBl}g(=?dw@5m?N7WJt|F?x|MsIjM^J zxFB}3TPm?L?Dj+LR+-(VNP!7L*9)0&auU3?Qf1Ie(kVoc3FBdFj-D)7v?VPlD4jng z@qXyG4?A*qql!OGRnS0!?&f4fIaH}*yzY!>gNIIrDOZ-Aeo8fu2MGbR5LBtpw+Ef!6oIHnjhK}sn*TCbK(DnLQ{ zv8$<40gJcsw$+KFyE9_>99B@@1T+M=qY6>DD4iHJ)(7-fN}tw6;ruaY5N2f?97mr5 z2K6@%B^Jz-s0R01gZAw^dMt2J` zDkum5UeV82t#NQ#2%V#Qe)7sJQ`CM*A2`xC!i=K5nv#?rHP(3 zhqN*{r1itwlc+{HeIg`_071BF2-O=`5mm-j4P9P462+<${wXMs+|*yvskGb!0sfhL z&YU@{REP(<>zd9wdL@fbmJ{<6l1VgBv0?Cann(K-_tR`mc7nx69up%#gCQE2J^~Zx z`sed0I>k*rLy$8(YMBLN0u{{MdP*w(jFVA1zQRq{My#NxofgSt?pLv4pud(liTV0#00=%;tI>e+;`ZgxK5wmn1r{FT*<98rj5%C5=fqaV{RT*2 zfG;;`>(;x$t-|?yxsL{>OQtUCoWeyIbk6iDu8GD0`bD6J703zWOn@^Cu+dZKg!K*G zvDxm(73h3D#RCHmZ0gBq@KdKBj;iz7l*0;H(u3N3EDj4Suv|0Y6YV{ph<9i#ZOshTIEn!er6H;M;<;Nz7ikFVy>J3KV?=h*9u2apgE zj2KJo-{scrd}E0R7V_}Iv%MQ__07lQfq@5>_kyqLb=pgsKlo^1LNB6Awlo!zi2>#t zQGf&n_!-)Pm<;GLg)r~={EUSH2ikwTLq}=jE@c7`Ec3OC2L>M0C27+0)x|=AXE83x!GUv}w3N~a*;=Nn&u1P09d`SWqlhQo zkaEKLJvAduwM0w^kR*XXpUC3=cf;1-KK(M21Up3*#)lXm$&$1XQcqz;4U%#1SRy54 z5a1Bt?sU}S%vbs~SK5)L$i+l&&j@}KK$^Y~8tk8nLOy%E2FPg!pRim6jSo5Q2szYK zun8sPxPfvBd}MHcQp6prAR`g50E<=N2~ehi9eR8q<@6WVfRCKkfcK4ep@9ena+J!)@INzrgEk4k`fY;G5F!v!LAI|7WLxhZ(&$_y-2Ymta4{F8 z`zVl(A3#VcD`$>*y0Uz9NB}07*h!aC-5S6wA?t zj}8go(V>e1HROyar#FTN4u1GE%irv`PF_;hBFbhF9BXGJSkGvRCz1eige}3hP2XKh z_~?+}%Ru<=c6Ya;F7D5I{<4$~o1}qEUnFE&qboJt4owd@p=}VplaX>KKuq-(7Aa(b zM868k^LNe3xXRC+YP0`bnxaxnkn9&J$x1!$UzaCW!~>~5Pe`Q{m2SYCne^%XoEs$| zfjnV9Zdj`t54AW0+9Hl8FubSFo~;I=!> zp1j%KUYhNcF+$Sco-V0+qLt?sVlCW!S7JIk$e8j~+mxb;b5o@(YC_ofG7Qp6;JlYJz6J!4BlM2se%_vx4sXlxj%gl9^~<1z z)VJfQt3T@g$5Jf1fCzGhmZQG@?kq>ZLxx*{ZnpJGM|AJ}6<(R)0vXI$U!zQVI+&3| zC8$BF(>QFfhdt(H|5bnRrk~ROa(YZa06E-9IUWxB<4&X5rl+V5D1ERzL|=5IjL{*1 z^{8}ld!n{{MvZO$nWwL6Z$OTg73NtUqG%QG^Ngm1Dz2msfxvK^q9|30=SGY3 zdGFy@(Ook(YEe#KBe1^(pkTfGrqg^i>KrtFpnoa;i$hiDZG`ah?{}yBOaQ4$;+Gf| z#Mk_>c0 z3~^DzRg^gB_M1Hl4-rO_akz={g3*G3<|4jE1|t|U;!jXiFfb0lKYKGiq)E*|n%v*F%`348SfV-+A=s2c(O4LJn+@|B6NKkit8Sjb4Wzrs2#rjkSOL z`uPtd3hWrsGe}{on%3zPE{EFDsEWa=BZCkEe&V2f0nN`sM;U8+2bL)pcp%Q_4j~~9 z>rRN2aqQ&)tBItzAXd$x_+qJLl-es5Qe~VJI=oD&JSqrv&w=_EnAJhwtR1ic%2{8%?Acz{X*gE|0xf_@MN+BbX2nsnx4u=mh)S$p(5CT6nPqX$% z6S@PxKb>^On{?AaXyp66e$03VOsJ%g1JZnfdZfPjd?%78b5N)vk70pC%GF8zZ1yRM z5YK{|DOZdAO-dLkSTpunB}9T%qk@u`U7jYM5o4EQaRqJ0 zDUgIo&^lyLvweBgbVj8v5XN)mi~|q}m7tgC5P`dxCxYHsP={rr{&~wz4=5pkj}7`? z8v3!`&!NpU?g3kCC7U{V3oI7Jfcm1G!UM6sl47k7S~-&Ct!T<6E1`mLfzGJJe~ZqF zcpw%J8eZM(*LAZCYs#B%cwmVp4DlgG&~$na^Hc>bqv=YhARJGIylVL+5^BnuFnf3j zH6Q zDVmJaD-;(rz)F$K^YC^NiFkPXCVh+cxA`$_`%|!p%Gg-9MfCxv`_=wLn5fs)p9cL7 zpSd^wNIu8b$`KMvdbEt8x5|NZ%^+24OIj3OgL3IXVPIi&jM zwmN6%a4*O=m|@H*ObrAzeLx$K@&RbZ>_rrE~JWrmYluiKUV-I^x`Q}c>!Ab$Pf&%sjZHg!ooqNt6qi}$Fw$qQ4k#Wm9 zC9pvP@(28K_cG*FI6ytyJ?sxga^#y+UV{YWbL#b3N~0-cp3|Bw7SKQV+w^!T+E6$a zwMS1733=zV355gH_ky+BKcBvbl(Gjx0pbV!@Y%;XrzrFQa`F4p2WF(Uq*`NCMC4WdH^2v!f2BdX|1>&i-YPeB{@```7a$GZK*B zA5Epe88Lk+gJl?Co*l?V4tT1E8TH4V$L~3abUndL+LuZa^q>vIfMoR?t4?&f^&KbLIL90H%I)OgYXq| zwx2-)@|ibBlo3n-(qWN@dm%e?$(9k&PiB@;$VdA44UCLAU8EM*cij`Q`pN)Z;k*;_I(D8&XA z-%2)dx12s z248!KKP(0DjfePWfmpS+fAEm@1=75=-S-e%OF?XTh%&-`UK!gSqP(j&FXEAh*j-Ak zyB?y9@S9i0V-NAirO5cBhbYIyd1Z84U+>lBQ>pVJPCXf4i&|IhD_?s^^6~k3Wpj_s zUuaUkv&4v>F_q?$YG>8WEa;=Uv&cIdyW4N|rtMCh(wv&$3ZaepnVMEFm%!AflW2jS zF#|5BN0*W@dN~b^qK@fx8bOdTfiECXP?){k(lzK0>Jv()SLZEAVwbj^ahzU26~Th` ztfFm-8ZDziG_G`U^W!>`(zw#m&5!F`oyL{!ZhlZLtZm!8@s$TjU5bxzVz$nz@Y^K_;hp%OZ2rK0zkW z6PHEiR(66+y6t6=x#_1Mle4{Lk-6F54bPYAWF3Rx>EMhcEFMO&Kc-Xax?{jVu;P{F zfDh3hGJ+?);^ou|9IO`)Dc*pF!F}5O7mOK`MO8H5;?Fb~7_J(Ic84XTqXB6(8T*li zJZ`K(H4bPFx3p>~FjNB!(SG0}6>yWe54D!$n7jzI(~W_a6VOGVoz&-*)RDDjq!2D_ zQ|=tXLa%oF;~^!9AtP;f=#jCWw4V$|0D!<$&BqoMEq(oO<3YbM84P%u$~GGw-)2Pj zD2RZMKdUn=%{j$#YSkx<>?g`Z^xR-XnGwQY-fBz< zU~t|Vc3ZD{9d<`!a&ygoe?YIW%SlH@U44|m-FbhiyWOd~-p9nN`$do5%aMzXJ&zlblUjl9&xk&2Tae_FJ7mkNpR*px_pYqf*^T6ri{$0i&)LiBn9>H27nst84|T9FdPc@;Myh<^ zcla|85e`pq@pqQXr4TI_1yZpa=lLV`y?`qt!w1R-RWlz06m(bd^?IEm;`q^SQMZg4 zG5`wrfC|DZ_9>W$S(L{O5Ux6-&X64G zQfb_#<`r9=F$Jp1ac|Mec)OXFh2K0`YE|6%x@(z~4_mY{uYdmEU;o|T{~iAiUh_O^ zB^P9iGPz9)OCZB>7bS4UYzdaz@Xm@Yf!v&5v4QPiEg!mIgX={kuGsG;f=QM^J&ZHkWzws%FjfNT&3VC6Tc>h}VU~=3zvdWx-voItp@-bP6N? z7)X#^0$H@DvsiW9Nwj5{XWO_$VIo-h8mgf$H}Tn(&|1!drdVqpDD-wSAf&L2X>cHx zu^cU_p5ZjOpuGxOUV$7;`$35LVr}Lov@4)F?v6P$UFdQ#61R0=>q0x!Gua#nBS>G5%x*?BP%H`3XP(6nZ`ZF6XSkacrPX`)>gtA<<9 z*e=TyuUZsxC8q|9by*J-24EY9T;P~OsYI=EMu}nv0Yp%pGq$!SIF{_XL9#7KmfdZ@ zvMX4Y-Z-F$cIWAVE_aF-Lw7D7=yEV# z4BdHKpi9587`k(_K$oM^V(8BM-NU1zG*ub5cveQU{vpL&cY;f(8Tr2f6^3`?b4yWo z3%)O-KN7#XUF*gD_y_MxmBVTI*C{zBgJE4Axczs?a!Q*}%S8LEOVx#20NzOGLN551 zO6-gwMJzkjQi)ybr-)^LTPm?@>J+hD*DsaWwXu7%odVjX2M59aXT~%HMpD?@T`cvg z{VtvI@KYyZ3||J98)DrP@%8!vg+N7NZp)x^W3I2q9;I>&CXX3mBvv=ULK&ae4J_t# z7x9Ni5CgxAin%uPXyjaI88oiBJQ_JES_X}4CXYs@Ct3!Ld+eK2gf)j8B$^E1%-Ewd z0D&#&PrbdF%a$nG%~+Jg+hejMoKH*i*^IEo(wZnhShTCmakDFzLyK0%O#wNnnr@mz zWXYm5E-t{)3{U8Vqvh7djg;q68`(D(t%vKEmO%RIMG2g7SpqrZUzET#xFwL5yC{Kc zYD*yJMvD@-MqZ^xUMMyK_;U4t1(YnHalO-V$fJymL-amd;B;v9C0J)NE7 zJSnuEJ^qd@cvA){=Z> zDFz+(%OC(gN72GlzHcoA|3f9MSO|cA+#H|uTSucoe=r@_IKv~k&DwFZ-#iS~XeDcl zl>8nn%}y0;9k3v$>*OB!AwN4DC8sZ$`khAW073X!ny|)iBt^_6iHowC>lPUz+!P|H zKZgOpCGO}nVvAQo7e4B|C>`U0?z~N(AdIvm%TcOENWtL2zG-&p4nuI%SP|A@K-v%X z+Xr&AspeBvae!Uir>8MTC$;EAxg`BXqVgI=UbH&5e=?yvdO=QyYCYdVK;EnT$(X`K zUv+AO{lC#YF41HqJH9EYEmqxNf#w_^aqZJlmq4#3yM+Mgnb?6>8y%#}zM_7uy>5=W zk&Trk6-($r0o5%Ky!$HY4 z#gtwOMu1gNSe5yk?T!Wdx`$I5;e-)Z8<9N_08_^05iRfO=A6K-=9U}= zV6WMaY8>mp`7Z>1$pzq~T8xZ!3kISOTZvtRuPaR`fB?wze3>{NORK5GVF30*yEAT$ zy2Ehns@8-ahyzZ)M_m!vfdKeU+kQsVD!yKQM3)`IrYt!dPc)^2G#h?^1nG+VM(uUC z^G29WwI1t`>Iw-I=Xu>iDUyQdn2HT-F#vn9J*7O7lvOAMt~Pr5D1iQ;(>#!SCe=oH zRUBX!I&alY`LH3Y*^37P;8mJ;YXhkzf~u-{LJP%db2vT=BfrW7Jyy{XsuuYTWyI9G+bci4g;!dht1JGEilP3_Ifn& z3_DY`0nUJtOSE7hI`5W%zNV@!wE8j;Uh-D%zxmqocoS(Jrxs<{mZ z#OauAozC&+(E_KM+prK&)Cb*muqv-Mx~k#;JKsG%o-Vr1cNl=Zs2>HYQJ|4LU#d1j zX%r4ua_36t^oPOlQB9{70`ig?I4(Gx3RQDk4g;_k@k~Ycwd{Ho)xZW!Td9m9p_Nt3 zL^*Rn8x%m_@H$Lwd^DXz52I9bwjNyF!h!6Z-9YobdBx^r_3&1e1PzxibAb9gZI>vA zNZM0ZbEE_ld+AmB^vz(@uG#%!Umewk0s~dIP*BU+9_2o0%UlH2=3NE=fFJbsPZrtE zQ^g%vcz?Q@UlZqn*Z8-RWni^2oWTkffMIMejA0AVPMCj$J?LPnkkgG(|RF0lDVxwt&HOplvEa3y>lzW1XA_Ipigl1n z){7dj#+k;1SyvlbG)i5eK-Tw1HW+H{di1M0)nw56gYn~4t~FZP?qopz0GJqPov zY86)~b&Ue(^ZenMvZu*uKsEby7=XQMKcWuUdPNI7(O}h16f73?K#c{OOO&W=LYkrY z@r9NU8m6vc0KU@iyrDgk6WY;;J9xDnG>a4*5T8w)wp8mP!7j;%(2ze!S2I2!Kn>@I z%@NrM&16IqR3SWar`PFAj zl3!tkXfCRNgMs_2GbW1JNh6%(s(MzYA5{@N#JJRCk4vap*lf<{HXWhZP&tA=McP3cBu7 zpgS*68;=HPpt`6}jcN~n|NGwy_fTzQ(kOL>0_b!4!>%0at1Xo*1VFF+IHg4L2VEL7 zcvKN0SKC;zKy?KKf|XH+ZZvfIE#A=#@5fhbUW-H%d`9vp4yV25C^@oLrBF!GxO#5f z`EkmX5DKcMdkX=%uTtKYl7&w-k55z)<9u1#Y$KQ9;E_^75Hjl`G7G!klZX58xr zx~Ud(pvwd93QtA5vc=t!>hY;>D^B;SK|GUseHPWF~`lxN<9b ziXyQc$~ct&)!+dByn^Sm8exUiq*l-h1F$#f)QjfP^&h7LHFb;+!K!T{2{@dof$W25 zZ@b#ofhrEL3;bIxev+};T!umF8U(=S74Q*lhb^LM##I=Ay+-$i_+B_!Hcf!ztisi{ zIxJY-f`RBd;yjjfUInz&dDZpT-O+@`kXoltKMnd(r>ZtnFlc1_4h^+h0o8G{MS7LJ zpqe8C4Uj-_`KJ!;102v9Lv&-LS`Q|i`rv?$7!;0ypU%kfwEx&^?o;Aej(|S<;2|yG zWaLfBJdmHW98+W8f6#cS1EE#v+3KU#tN!3kuhTwMPHp`2lNIUGO zshYqqvAQ(AgPGlD+*-Z%XgV1j)8O5%ZK=Lhdr+GUY7c21)$Y_NjJ-eZsaKI$mJ3Q2 z^`NAXqh#KemP13#F1+LkP>oR;{^N)LRHp}fCkF$%jWC`Lc^O8#f7F)Y-P4j#CTl7W z8~>ygTMRk7yJhHVJDRShOo!=6o*UnMUEl9c>djV*-m9pOx`#&-*}x?O3@ZMn+aGlf zwIngvY(;a_c6f$%Kx+}=J%^Bgq2v-{YVqpqK1vyTHJ1>6p51zc`v@;o={k09(|{o zYer6G6BeS~CGSX$Q6%E_f+D8yXP-mHb;VvFwRmmsogFYn`8!?Z;}#dcKMOA_1dJ|F@GzX_m&`)6(RV3{rZM;!X?FLK`LMRG;AxmO9i46K8byoKy>>qPHoHl( zcb8mNFg?zcr-wq+y|x72?9)e<1a@7cvk@BdYu|O6Lzd$Vmy^^b8n!mWg&gnr=h^4q za=;CppuHIK6%%%?J14Y#eO%k=j9$}%QhBvY%=TulxlgaU%X|za%C@AVL)vK_n+LQN zQr#e7%J)8XVqq;MJ2iGZy6=LKP$xo}U3*L~6Lgw1h14|~^i>tkQ`8t;s-paDf~dqB zJEAegD)c&ggCGvu=kUg27G-nKgG#dT?nCDV*#wLF;Fg$;*E zG?$phJbx-lN~WAi5(_fBys4j4rCD=NoA`OnLb?|AQL=?wK*0#JOEirg(M(du4pJp9 zGQ2()k##tAh^DEs-~PaueQ8F#-_>?$k*n7L+jgICjd$miL0o5MvSqbjmwE@OWRELZ z#Sm+DJD?@Usb5>7dMnFE30d>1=IBsns{y04eEO2!=@hM4a;{GMXcIbm?v3x0o~X3z zX%32pxUEf^<^h`OrObtQC}f?gnu|u5ol#B5eTwzf+*dmkVbp2KB3`$XC~E8Bq0zLC z>cNY}M~^pa-|KvPJbV)IT?%>a(%gM?V$78G>*%&G&7XuOOY+zq4c<%!_j?01A{+Wb z%-NTE9&cGqfHv9jn6?}Zvr_bkHX2^Dl>QcE$xeV9cT7RZ0-V{W>rD#6SW~wi$Ys;e zs&rzBi1tPkztz2Q#FwCCq=y6?zSZpo^giC~#v{-K!_`GP@u3}X%7_?L{8S60f?#wA zvtMp$EPIlq9mYP78$5u}a*3wkYzS8gK#kXQC{F=hv;`~_U$RxG4FJWp5Z$(SMV$U5 zt*N9k(4mA=2(y*Pos$7s@%Uuipif@2*zYwZbcuo3j;&tcB}ds7Lp#liuIrI!= zg6%lY9Q3|1y*DEFBTFVgjwdmJ&`7fz%%ou@*A@Mt*)^ASEAiM+o6U-(Cz*=PVqw}v zuW|E)sLFQXDRlzc?B*j2?dqlM>qA<&P{e^eW6YVm+6AI1Kf6Xfn67NM>rZJTvi6dl z6}QqgML?aKhW1hYpw|qHu4FKP_T1XaM6!8Mvn%X4_=DOLg-w)a)TL?BPfA#v4*B9$ zY=3m;oc2xDaCc8>?Yv^BwL3B`RLQA81`AC|4}P9~Vwr5bCiCzriH9Jno*}0_7E#3o z$r)~TTiZWXxkkS`Q(;;%PyU?yq2Mj?yg8Ltc(Xf>IPU2B;y<0`sr#kK3m`jTNxlIm z1-%a5q;1Cz1_7>63_JVek)LQ_&0K4Jrn4NV_FqxDu$LmFC|L?gilV}a$;*?^yCr1U zmbkSY1y8v;RE1X+CvCQK z(tTcj2@@!p3%Nc_x~B3TvyV2j1hoxAKs6;-%%ya?iMqNA!dkEq$g=V;i?@%Q3B;?^ z(H>eI%#{kqhS+R@@$k<#2t_O4GA%!8a=P&)>E#-T<^o$G^?Lk^0z zciWVWGEDdVJYOYLzy5@777nFiB=+p%9j$tvbeccakUv4`;vy`CR4n>@#;nIH8Vd26 z#+r40EposS-Fk9ozHTNB+CEh+=;G5rUdhdPN)zM-dhmc}*EU#JwWq{Vd!~Y_Rn@Nx z2qlEEs(gJe!;S-e|N>%qZw66~{>ic~AEnI$OydD9V$VG&>vzyz~exI%Jv7w?h zsqUFH``6~k%jw`;rDWO_8bKt2ft!8!R4>!n^z~$i6n#AHO=zw~?+!*=hb5DpQ#k|J z*{3wWX-!8Qk9MLK-p?d2iDVtqkX9)C8Zlq?krwcLVaFt~u_n3$&4)*T!WU(nZG|}4 zIW`R&!OvF1gGFu}Jxig+84f7CtDCfB^L84TGBSWXwC{_Z`!mR?CgTHA?p3t=&s;+B- z**~mP+&(R~RWOI11y5?UHD`_+oGf4chK2pyxCSRIIk!n?k9H>eiNrL2S+oxrotRwM zyi*C9**%)Jt6ylnvhkKqO?lz6LrbI%4TU7?Z%!38>2~+>MNW+lg#uf$**DvrLlT$v z>vd2_zcyAR2Tx3wNUwV%YMZ%(HXEc>M_&m zV(&l>xfQlXPiZc-(5Msq?AL06QERH?<#cR>T)V2dXhz(wDJV4$wT5NSP51asg|=!c z;kLH&-Bzq5i*8apup!Xm;#-@)P?6GxzOfG_o8AN*j5;{frUx|qRd&fizE~3xg6A+K z-s}tIv*<${Y;!^jitzq!cX!Kdm9Ra>vOHL_EDwGzltpdZXg|TST%k41Te5aD76>^? z0<5e~RB59Ti3Diqg4tH-NdLIrZPT6+-?|SjV3lnCmL2MckhANXj-d9{bGq0+R!h3e zioK^IFM{XsN}B&PYKu2J_Y}}n)iX>ccPdLFHcla-6T>r)6rNV%WJG82qeHs%PDkqU zz`A6M!I31Q;^<`sfeF_`O-5Im_ooxOC9H0n2oote9dK-6{7VQp`*>|SrrLFX;)Si{ zs~JA3@(ueT$5ZPtW2xJcskAMTxVB(Lv0oxp-*|+NDL?019veJy7@90aK2b`aYN4NpRl$V;*HoHlV9*~xov**uc_3RxRX+9dd+BwA$o_m*Ew6)ctXj~m_%CHOo z$n(wVp$;__-FDu)Hx`WU-b@cUdX)ldTqvsxB2;7UWxD-G2OV@*vK3aU#NVP)Hjeg~ z_KZ+HA8&SvF8B>BylSM^^w27W-IGr~5fv`E6azm0wucWhyZM}a?3k~CHT}^~Z$H`*F03 zeq>$FtY_x{XcL1;YVU1EDPf=(GJdf0T9 zG_)3F+b|lD*aMu^@9zlilIxpxv{c6N)seBoY8S9sf4=B;}bH>>>ES0W3m^S>stTk|NFV7UO4)l`lmS>HBWv= z5tGM*(TRG{!fBr8$?7JiKdNR7Xu2*^AcHi!VWe8;eQ#cs!}XzNUq0?m-jMvb9!!^Mc?hE0jU5V0)27Uo{E$T8?}=Vh zVxqpuP_hqo3Cs3XjWoMUEyfR)8R)<(UEJ?A`>*JEFiMjtShLn|^ek1Ew(9pN!oGJh z?t9BLmyjsu974 zj|%pTYP$ea(}k4E-KXS!`0n(CE*R6q!(L@3>U)}+mbU8lx1MIEbda&wN+~}LJiE)9 zAm?G@acOR=$3@o1RU_22*Gq|#5gM8l#e<`rWfp)w@o0_x@c_3>`xAJxOS=T`+aGmt z?r~~Z742R!;VH8^4MhD54bFsWjqsuA)qTkZZ@;4q z*T1V#+jDE4GqloymH6y3x2Y*RtB25ONen-}fB#|QpAB1#g(2?@C8B7`yt5@n;nWsyIcXs6fYi@! z`N&OleSbtTEEF_lJ$>|YXQTFbXTA1xb8X`}{ru#`c5Us&`bKT@d2RQ* zjoQ{e75m?_tEa=i|4G48~f7(+KZxn7CLLDyOD9h!Z_@=eVbUeD zoWct03NR8)iFIY&M^w>O%}6(L%%V{+mTazyJNRU?gICmf&Avs1Is3mgH%%Pr?I3k+ z-(I~}v*f{aGMr9Spbss~kLl79P1JQp;@%0H!)1+`@+u`urXsZfhCGYbiGMnNUR_n^ zq*X!}CC}=_j>y`j$G;pgY#e09I6CnuqdG zGoHvfL5WwzD5FX>X}$EC^T2#l{D7K$ zs`=Pk^G~WZy)6lD=1cp`j#lx>OXl&ei9MBDklAHT`$DHcWR`3DKRu{VInxC8b7b>o zRFn`*^TtrKs~b9In08qXC>+&fw796`q^{fUNY|T@Jc^2FIv->9iMFTvdhFZA`C^Sy z4p1IpRnrz7Zqf5cd|P60FnQAqradJc=b-sxxZj@un>Bu*9cMixcE=QfGiv`|l%0kW zh*BgeGjEL(zTO+Wue}0{g3}4yaiQlG93T${(XM+x1mRs#$a@K|KWXW zSU8sAvRFU7-)im)ppvvU06HGiiO#-JCKaDuTzmA`@A7wAloPpgFd3GfSUf*n7EM=H^;nHR zAv+b*U*-?VZnd=u<(BwaJ0Xd>hCrKrwx)kaYF#^S)(%F4 zQD~gm8RpcJ5cNsDIo2;SNsf$mO&phoi0Fdn_zx4>Sri(~7$5mXPG>a=VRnvdpnfFv zoNv)8LEX9#&?QIMvE>6`c1?T#8WXUyGB!xk566^1LP}q<8UckW1@R38i*J4;@h?$y zD|YuJ{HgAqOB!q+gSK|*SKn2gZyj<@Mb1^|50x3(r-FvTBA`VtF({o-Ov$gygYS|d z7#>03T9DbzH9D8%c$|G&jMnVus+H*+_K@;9$Yol|K7d^iQd$^Y($oaMlIiGWAcLxw zIO@==?{t{OkCgk0D#=}l3VCMgqd-|_;^(_cCJ(L;r&2~~sM*!E9z{WTxtmm%zOMdS zZ<*jG@@v5>MJ3w_jy80e%oJeGKJo*o6l<-e7CkzP)J-jjo}%d+MxiJrp+cvK5~9xT z+VvLAC-hrscmtkV_G0Upjv5n*g-W^@8kUM0yYVn+GH~4XLl+c-mMXgwCmDdD8D6-# zC^Jy_UA;}OCg&QbUXW8kKGw3euqZIj%LZD<*$VKIfur74E&)n5Ct{bM*^%fwL|dtZhRuf>|0Q&^QAfeWAu-BXl*Cx`aMXxTn8M zZiV%HSf>LderbS@kfbeqTRa!E&gx;qJj+l9I{TE)i!296(rC%PGa~4Di_!<|$#-WZ zPP14Q0GfTa!!P;JSU9e2nD=tjCf7PIRjK|=enm@9Y3+I6LyiuoZWXGs##&V!EX?c| zx}Nwz@tS72Jx$Vu zI29ZeFR*5Jn2EM3Unp-FY}el)i70_-cdRy2>2ZR;(NDt5l++gHKJ2z$*=c49Z+3%Z zFf{t=pQ2G?i~WPFc8SArN{;8~9vY1S-fzUUs_Hs<_+ZcE%oX)~UhG~_&(1N$DmH+E zoWEA<^u*Z12l({o*}v(p8?MGPou~JYlp2|XI5?i3r)vG0`Wns>%(YrI472ovh*>ms zN=~I2&q+!wq2Z5ZI)J_ z*IGRG28II~W@Z{P`v+Z}_B-v2N>*lGtu2P-x1Tr>xc>ApCnT4BcZH-F)7u^PtC=3d z3E(Db5@>dhBNj(ZvfbA-Q`a=U0%%CUnV3(S;SA}-l_sCIzUE+!HWDl#>Gw9l(_!yq z(T!o;lTj-Rgu51DtIou%Y7rn+ebW@8puPjMzdshFxB&0M)G|Ev<2RW4Ny8cqVUDkwnHS-sp`kGcy+CCBUL1NMTPKYJl zUY5fTcWy$!*=Ij+qIli!pv^& z^4^S=h@fj`r;RF3i+5FVdiK(u$N4?8r0RBr;r8V6wsYbGJCV4%rdjCxpB_4(6NRzw z6n+`Yus0mgt|`3%K#_xcdK*zFd|u44F^`6JlxVGdn&tX$&lm*{y6l_ zV$E)$9T?h8aJXaK;&16d1=`7=n@@>jkCHthdZ5eGe*$NA|J#lZF(TJF;+tGPA@^8) zRH-`dxYIjep?GlSM_i*RP}W2*vBYv{ln32igz;&J_GA4!uX5}g>a^iaQEK6<)X$6U z0M0Wy0#j8gz@B}xX8+6!EZVV~s?G{_R#cN(PHmRUAReALk+KwW7*~=pLsf5qn41*= z679}g=-SS%-*?DtbnIDOU7Mm5>U`frz8_GM0jAuoCXr|V0`F=V)v`~qvU0Hh-C^fn z(|5T@Pqb;qsW^EBM-5D>8ocV-vwhLEOU5TODK~mULs+91c(V`9`9718i&KC6TXXIy zmq$n_@N*IB?8`Mp^(T6tont8Y(JS|f-bBG-MiqvG^gZq(^#>kLw3)!S6q<@CPMvBl zIrqzmurJX>0L=4mCR7=3MaT}#O-6&H02%8UywN2vc)D%!KloLq*=8zhNX9D0q@(e2 z;5(@B$q-sj7?xz6O12l=pben~7KG-WZH-Qb z6S;)SIlfn=(AElp)`{vvdWUv+M7Mwa+n|?PxRRn|1p|W>Rq0x$xGN}*udF3$MsO0Kc(TI7j471p1+(vk<`#e(-mlDzt9i&vTa#ubd-^n zrlzDJAM+29^eU8kOfANKi{w^yh=k8M>{0?32w%)H`_jp-zs30qlq|Xi5dAVl=lERN z>?M29w%HTXX`tCz74fSY_m<$m@=cPJjJBteImFp@&8lW`W|^o&_>~cX?#j}m@*R2$ zmNr<-*&83DanwF-NC~I8JC|vl#-OeYQ=TrCfyYXBl&6F?a*$EoH6n8u7^j19JwixX zaztLDxCAI2)*B{g?L2_q@#GL4Q;6~Z)Ap|0aoxz8;OV;P%Bw_)l6>2C-CXB5CCjqQ zRqpATk#(`TjwrE2x?HC(!<8bFRF+6)R%TK%{i_}TKdaa3S*z#e>PhB{2n2xG8wqZu zRQ_QxGxz=?00aVoKt!MrBy$QI78CZ84NEfJe2CtC0z(GccNSSmqv6k8WAXX0ZSrKhlEd$zlv3zNB~ract)~UZ_cJe>WFZ43jII> z9tu&iDXkxl$m<&Y6>ZBXmJw9nhit_WY8IdfQn+1_n z&6A?K%MU#*a*0d^LJR%zUSwq#2F=l=doXQ&x7eoV#tA2$8DMu64CxQG=^CUbK9TU$ zv2_e*l%8qOCB9URP(qTN>}Ry#Y-*$d>6X?4l~{-4SAMj}fTMY}djbboe}~FsP^}D= z^VF}?qRxG0)J`Gb-hU(qd~S6Li2-Xm?Hd%jp0eN4g=3dNEj9 zX}`@jjtxlnyA7dIDV6Hu!RRaOwV5{l)qMo&1jRLjOG$c7p69RNXesChWdg+sHslzB z?aRwvu5i+SJj#`1DCAufs2Mmn_mt7&viw_5m8z@t_fBXiC?_1(wC_g$ds8cZKa-u& zf{6P+HUlSIs!X|w{&-nhKUNi+C{rG>ceO=&*D1Dqd1I+XVYAG%4A!>6#VtaCUQLzi zau;6AZWU%*?wXhhBeG$R+X3BUhL`xKPWQlHDczy`z7DQ|s~sZDw#RHkMbF&4y@q>C zM#zDr5Z_b{6wclXf*-Nm`OSa}rKqZh?zl5s;2?zmbR$kN=hX$fXF?FJdU?& z05vh)@^?bV8bFnwCpf<4b6HgF{*l}x`ML6VrU^eC+g;c5V4+)^GfRlxff!8bnKlB! z?|WOhj^)m)CB~X}&J%08m{pXbcfxe zUOpSCjqxcQFotQaMRoHVL?t~Ux$4Q&k^OK=P1iR2p=KA<5#8bzXgnMIkmmSZ@#Ntf z#vMl4^OJ(lIZXT}^%|gC5La{BbWdBlNEZ^TbP9EbYqT3(Ux%%U+p6EfW2=Ig894ZS zNi3uD3MREko{wOG0!s^!OoK+wqfbu4>3^U|K{1-k4tZSkZ~M?E+aCpm*n*(|>3*$@ z(1g&hWoA&|BTl;!xF$Ed%zJ(~Gu3iaH~=x+=!~GM(~{weiV5?=LiGqmekCUp>PDWx zTt!C3$a;bbOS2)C9}5hW$HY;O9|UUqqrv`Dp@pu83gW`p6!>CqMJ}8$MLCS`rVZv0 zmmwIPvi9ldBF{ z`SC*I1t2^7TbO6LEbc6>yL=y9eoLu3HcD@a9_IqFdVv0#mPeYh-oSE8M3&%F?ZY%_ zQP5aL)8{R8zMuOyb^6Gl6Lo{?7Ku828|LPi0naBE!}Kiiy&>WJ}X9zbc*O!QIDDnLhM$LiBif$;4C{y z3(JBIX{I`{@)RI>qV%@VvnlB~#*IFoeT=2Q=jfl5)}_D`{Q_+^>6$@q5u2k3wVsZ6 zZaMs&l8)jX6k$J$OU4rLoO1CZ|6 zmjem-VG(0pyE?wGoJ?&O%qNfJmbEpAl=k1DS&K*n?jOQAj_ovUG0gmIu_yGe>kwKj zw+PddP}4n1py*$HD-;zA%d@m6rFhZ*+ChaML#@r)DR8!ZgySwMrH6O_NCGmiR8S?g zCLJwC&cAHw2$EZQ2!}8QY*p;rq%ym*UWcxPG2E|bam_k-isjD2lx9>k?y5Epfpl{8 zMRtju11*-VY%6P!wH%btM!f*-HEqc(NyWld_x|R#bSmf_>u-aSV!0LEw#k{5bPNn_ zhL|nPZ;*vzky#TCHdDH7mW-T;1~9ks$73V~Bd7vl>eUu5{eWwVOJxyZocB-}^Uf>8 zN7&J9A+tY1?F50fNUG9)y4%|`Q?8&WqfJa~k({L|jRb_5pr?KKh=4lD14SpkhtJ(( z)CoL2D!0YK5&7kOKy-*tE)#I?+!qF>1?gVb_vNYt=>CJj4sN+>UzS(aYk6IJUE17) zbk{vQ)jHqIP~DB>WH!s2uuu_|h^Q`e%x z@Uh_E*_K!+BPa#kEDi$P%z=`MwkJG}yB5OOsH_YLM&*A3RhTa%J81S%?^Wicv*0Ge zQYP2I+`_B8huYSO78t2RBi7E-OQK?V%k`C+j>Oh6F8qUOk7z%RST!9|Fy(YWD9?^B z4#_}CvP}E|k$yr0J%U+ktF0A63*#(pX66u#TP6bvf7yJT%lHO+F?4#ocFQ!c#TFe$ zD-*1Ilbi8UqZ}&y5}sCa`xlAZ1w7q9q-*A^sw-^xVr%nNBoahyrX#!vH*_oJI1T_% z48=6IAlxDOEEG`Lr78s;r}H_QaX)-Pt%BTy-*cvEi%nMOST8&cJa;M5M0rE8e?j|- z+-ZsXME2ox#oTD7HWfTh#mxX&`E^|P?tQ*PlfH+?)zkCocf6S1NEot;$PRgdE1gVr z?G_lS9IXGzxO!w~FC?RWc1ck`w*X?oq?nth`O*3nq?e`p9^luz=AL6R3VW zc(paCzB$G{nKV0K`|D3u0t)7Fi!O)9`&zi_f}}BWz@5FiORiuXP$5GBaV&^U!V-(; zOv76&vGSs?<1-D@Ro_4FPO7yrxJandF_}>1BBbaExaJ2#3WhRl6naAELh`B(LByh+ zW%yKW;dTY?g0pyuHVKASAtNcFMXv=qjNw+pmOPSLCv=Q4wg@kgEtNm+Yq4x1Jrkku zfuMnM*KYy+7JY}^m()^x5{sGrjLug~3tKInjZ{vC!NR3wDo!dWM=oa}3m3lc(DhnY zh6~Gx_NJ{*Ok_NcTTO@&wB0e|!JLvfwdxd6@I9G8Kri4Ev>siIlyu+XZlCXE2-y#* zLTV$IcpWWOf)>jy+-LN(yxoE)m}^@LNujsv^b{(POWL>WUx41n#N?Yt(-szvf^_^E z6!AlXhJ*qHLa;lBg5`P$UH612;mW^EB6McAKdN7O{psoP2LmYTto;Vab!(wy+i zYsotSx5NES#wJ<~tD?}x_o{mT74#8S{N{i86^;&k86+9s_y(KqW;UBAcPJ#eC3z*2Ex7d4j<;n2rb zAgOjM2t-_vrg^3!q`N>%EULc}K8AmZ$dNY-6%!}V2eo6T!oILc)Hk(`7q#eMrz2T^XK(PPdDySUa*Z%S;4IfEk2M{Fdh9M;vwMk?TB~+=dQ9l=Pq9z@IWJ3XyOypgS0uU61!_Lnu4$p% zJ&sjx4N&)MIQjU_o%^^xM`}m;p&Fy6@6KTVh{EofwV>lki87uG50OAih>&#)Iwk#jX!v?wmh<;rP((6b$ArKBj9W7Aqmxe|C(E7O>;YIt*JZR$0nTRJZaNDcQS^ zaW1gl9j2^YCRWH%io=gA6NO!l%3gzsIv$0)F@=;eOcbIl)m-cK7F*2f4AqE5#mnO- znc0UV>0D(o+t67AtO1C)P){RmDkfYc&ihIAji;N~789<~W@W&Dx)o)DT)8PDJlZ(a zd8?yc$Aft&6jI6;sSDJAOk4dL@&$F#2TYvbiieQHC+oVt(R#KZ)O@a!)oU%>@QrRx zjnE6x@+49>h!i_(xR?T&G+FU#k>b@LI|UX&Oi$L=$PE=prd`eI>VZTYjkExMfM>D9G$DhKf*H@qD6g?DuUESqTor3K2ph{ z)dSU}!U>_dU*6}#YAVS*uD5g`h!}PMh-;5_} zvD(DjP^RFys}F<_GmsEMXPl*X>anYZGLCY^ntw?|K@r>%kpUKyS-by$8~J{34_^5` zq!Tf~R2+Jn&c_f-N7w4sf~N`-gRb;N2#qF-d&&w;h32RuEwsDO?ibwcOB(TT06iR- zsb1l>Y^ur}n86ct<*y*&mBBs??%qh;BHm=cx%I&@)~S3_^mo&bRnmFg!z}IH^oaa7 z2kT8GQA?11Cwa5u|ISYB7KJHjYM0p|{u)%W2Ga)_zWD9j+VkJvMpvc08A|T*12HwW zzj(P-G z@etPWRrMed>DxE&(BPRVN3V0#!<5^+-rkhUQF52JK>uqBp{X6wrCs%dSD;3?3a9n2 zIc@>oE&UnA$w*aK{w_x9uJ;TphX*8LQ#$LvzBMg?Nm`@hmNEA>n06{tAJ)0U)Tq6g zTJQhQTjj7x%UvNZ@qLriWy2|5SY^iZ@!R8!vEBTiH$WpD$)928X0wqBNlwvbwl42CpaP^kl?A@5P+bkyHg0kB$8X>CjsyavTlntpBKr}RRCRYaJm~wFc}&Np0E6PwD6(q1 zx`jhc-m3ASSnhKawoFnBUg1&|1Szm>>J3S<3lVM2Yo~z zb*s7l^40y%V+S#yLpUoF1=mEB^n8v>1awy(cyJ{6;9Bev8{;e(m%>vWTp2u~fMO#d zg&mTrYrZa5WlDG~LB6iyw=G@{-DxtkAm_j^2_xKvQJHR|spgFghgn0#P#(FMEvwy|XtCTpdw0@~oKuBQo?O$7Ev_rTD_&6idcYv|x`H#}K{n8Z zcEpa$uCW~Y;1dc-))8TfJ7_VrXwEMOXSKg<%pT(wOlj>s_+!Eqh)pn^2$2rUUww~L z2x*e6ser7SO#?atoV)ZuzY{?u8ff8#_^Rp9f^#Q!XwLPO;JKQ6|2#djr>Fe$3j+^dux zB#fA#$_5x}#C;EsZQ@A5Wf+;53~=;>Y%{nXu_7NqP{S0iK|{9(Y6v?aYGC1FWWfqo z!4`_tlb3^p`vxKT@M0wB7cDTrmmZtWZl!y(lmyE(Ouj7eVS*2 zZF@moh4-eD_kjK+0_CcH9AMi;Q%g);JHHkKA|$(>DpVNp@LHM#62A0Uu+OxeY^24V z26@Aq)ecF}4MX)LhQewUXix7MpTY2cWXiL^=QQ_VNa?L+s{zgDFzBgy>i#GwpYZy0 zW<+)sH=n+6E#TmyEnF`Wc7;Y-3s(+=_iu$)>(W{ScGn+-A(P>P|4+J!M(6yVKj&yI zv2nKM^>74q*RfruYNwzmM<7tdbeJY7z}Ip95-Xm+9Fq$dK2bbidZTcbmp#Clj_Q7& zp50LTV{e3wX|H71WNz&-i?Ir4u8I0x*aya*`&xBmaA{_Ve1|Lq@t`(NnYLqy~Lk80FKO>a!mr1I>m z=QuK?X{yte?5KK3b>z`K2Pf6t@e7E+ zACD37sm2u#{vk@Q^mnnxB3nCKac7@rWoAaLA6%#t$XN)s{SOzb3EY= zd5;=29E>&1ad32S5@gj*mBNLu)Jcs4#xk<|zgb3kd}*-82i@`Wk8k~!;#KK$m?O+< zHP}Nl^iZfe>~)VK`v{Py(gIwd6y=iO`0!`UuhYZkSejU$j_N)MJ&cFImlp)jL&ZE) z{;ZnWoR>O7xx>7|!k|Vdyx^nZ&P`PMft0BjQk5sgbMp_mxX+WAk-x|ky{~|BmQ(#- zSf-U``g%e#0YtXyc#Qj|c?qKUW;nxQjR|Png}vSF{tbby= zH+Mb-Cv;r)r|x_bP$PzUgNikmJB&yMv5PN+=t^2}E&Q zL~2|mv>=@q=}W1-ZfO@RV(sqa)yRNixw(hbP%(65vqjI7&%zRF5s9aI+;1c!j(VH8 z6{_7*p*gki24O|!6~Z&0=*OSagO>5a#!Y)@nonB5B#%|<9>6Y;FEJ)(`LEjjl`WK! ze=Rm=3=G(sG!8WWQ5q!9o#x$T{}Sw@j-ExB`QAbXgXX0!IvE=%_g|Pio#~H1(GsfF zBXT?3^|#vNd*bfF(aZj5z=mU`7jm%NoB@k<+qW>T+V?>VO%4x!;UU}txB*r=@nWf=T_qhPxiqlMK``M=jF*X0$%1f>AKdB4JTOp`8stS`L{E zPedhyfye5^o}O)}Z7z3`k}h~&C2-N2$bv*pYesU5M3Y8YzX82-d%k3^X=B0UjcuH= z=T=w?W@BOeetTYWP!3UekdEw|wlttaJiMBomO)w@5l+3E#Y6vDBixX}=W~ zb?G;FxOHn%$HCnsT^Kd+|5sg3<|RsU4a+kAgx`d8HANoRCqrQtYTv=#g3x(CU=1+7 zpc4d;78wYjtrtC6?8lEy#}>px3C4io6vTPM2s_iGOrXKgn}N>P7o(o z+Uo%cdVqO?LxyXo@N#%T$kAeKNVV7oHc2sx`^b}##n?y2RO^t#&ZF+p{xPy)NvwUB z3yPhYg;_McoeG2+%+kzFNxa@X!QHAq5JhMM@dcvHC9-xb%@(Uzcs=c245vqnzQ$3t zX0n2~r!R-sv1`U#jbdvp_Im-M!9hTDt6T8VJk*v}oIAj@&;x!}6VIwXQ(e-c53H@H zR05h#YfwlnKc$OB2)^FN6f5lcPM>0&YM|5X{}hvptgQadF#>>^lMFsA6m;KzJ~*C8 z#WQ5Nr14wxd*lKREo#|6QM*$-4DG#it7y=4;kdv=nz{ZhW_Wzl3jq-jBzI{;oNe%Y zhA%Pf*Y|=Wv_ln~r??RdPX93Nj-SDoMyb0>Ts^FHV9bU6jk^$-WK)@Ud2fIp-W)kB-+|Yi7b#KfUgGajz-v>dy+1-fmq{4+3ODY9fT~u)8_}!eR z;B}Gz6tLXVL;qE(m2N0aoYS#kfPy*XT(2kk6&%=NPedF`KZEPeuLT-dw|H905n^f? zwAh|t%Mqgals=q>_Ey@}@C%H@&dz?{@8XTb6n5#V!|&Rqk9o_cVRNXRJQK0 zg5b+Q!bye0%!#hc2@HH4@l!gC5Smi&aUa#g7FonOU7mpB$&SZN37j}l$$Z+S z%Xmh<%@%Db1RuqgHNvc#nC?cP9;O~P)}eySVtj=vVc2E8#nNbtf!D#@VxV48f;#u_ zyZjVN*oSL7I!JiM9+QOG3~xcOVoZw`rwl!hL((bO?pSN;)+1>si*ueg z+Yc?y7tndwDj6Q2D$aR&-0ri4jW9RU#8wiV9cMyvSC|0HR`L*;>(mmsOnSEF({H9v zRehe@@OSs~HGUaLm=6=)vJJ)-tS}$M$$8lIm+7PkuKGss*rA%#uwC!JFMr4U7+ z>j<_Vjh0+L%i6PKJa}k6mk^yte z54_Kfe1J@eI&)r*{k_#=NVc#FQ-i_+xz(q=eZ&#rG+H*0=~8i4p0$djg-$Y_AH{Hs zLclCWzF8xw5Nw)N5D??(k*@SqJdQi(X|X6QK1Wm%ZYkTxb#asDhgJ>?=BL^a^g8}l zLKcgfHGU3fZ9vCpU3lK>4l~zr6>L8ddRhvxVfUmWh`aDDKE$PL?s@M3_mvKgM{uy1 zZfoIX8hBpxnD&N%$w$ zHWL5K&mp4-nUEv5{toS?O|uKq0*@U%?)x-@<1T+I-}1un$fJYm!t)os6Vf|A=^-`a z3tCg<#>_g4piK5WItSWkwY2N^rY5&yI%jls+ z?n0Cz(tLz|mpig>EW8MX*yV^UG=8Ys6+Bf#5^ z<1uyv1kdX>*xTm0y?u0KuP1CVKTpvXgs9ECO5DLfIFbrDVFIQ4sl`DLw=oS3p91Ty zQhQ-DczUUfU8Z*s(8qg|+@Vjab(X@JlMwYBrYMJXp_FpKItn>&NH84dPeohkhiq3g zK-~&;#8XczWrC;LSf^NaK;B@gHGzeb&CDG8S^xI$t?U(cpE|MV9hp)5HeG=UpR!bn zqrf^24<{MF(BI7ltrz4w`tR~_SqY;10DVi^VOQ=gqY&l23inW=OvGNFLVUo&Pw8ID zRMJ18!OLsfnqP+AbZ6=86jkyF>tc$XViszcpWdFxF0QzY%(I;jgPhhdZpqJROJthT zW~lIvA1Zp={cP?2BW}x2YL$5kdz09N+}R3n@)dK=_V;j?&s*{6_4i8p7`-Xi)Sk}BLg?Ojfuqm<@0CAm^{%zv_=0S7#xo#QE;I!C#(aV@q zetZm)n_pYMyYadD_(}Rat(?}Jjg}%Qt;FJ9q=2GW2H5W2TS+@7lA5d6>X7dGT^~G# z305PA=KeZ7Pf<2FUqO@yc}8%l^-h|rkj}&Jrq6BFT}Q_#eKhjsY)caE*MUFqA{l>y zms(oH5@G%`lJOh3?h0{5q#%+u8UG9(u5Zu_G7{%O(}U`frpJ&_gF%Z9_V~=g%1Wyv zTS3riP(yPh97JH$J4h<+RpER@CqF$zo|sf1zL+i$-hs>5DQSXm%R-Yzd)jr2$omn=V5 z{yUI+7vGFfOKZ0?hRg8)8v$fDOmHVUGOVqGzJ;+2XKW9(m??v#2$<;X;KkpB52_K5>+O)2BQ21;ln*X4KqGQ;u ztg=T6l8=g4V=H{lcFRt^vLuwiV=zj>l=D5{Z5vmFQ@BU`C9xD5%5| z8y3)AUGoH*3@mX6VD3K8^+KWcPl0CBDj|(9)bSwc;ZjFvOD<}KF_=c$l$umYea67&(u;Cc^#MGBIg0~P;$hl)IKj{ z1FAOiK-wMCP?2jRlz5*S!o2*1l((c~8?L*;j3_dZz|oz}dT!*RA0jw4_CxpQ%0z)316w;<-^RB7Vf4jCk;?{8{IG(aMzQV zqE_oc_ZcN_bKwN+pm6)IXT;wkN27&VETbi7s)o0MZC4yA59O{tMcMj(?mN_c!8D-U)nxlD@WJnPrT#R+OAoE@sNg?uL0$0NZz2o+ zC1&9(-XaspYK)5!K^dL#Zi6Qb&tCtB4uX+vpq>vA*$K_P<>33LZ0`W za`xN@(^$n}InwOxj;m0t<~6ugWOrv8!`}<-X*@TF9GNlp;Oh;Cobk#-PLCu*zRdl| z)$VCIMX-gL0EMWQX+3AK+%LJ1Jt>z5RFI2m501a8w)#VviKukDBX@&J=ZK}*K?*%? zHNhc-VP=NTY2dk!9-%@u8Q!c3m3$o%3 zni1w2R5GGPIxI?=>uC$t$u#11ICtq=B;%^AN>MOUfmZ`@kCY)_u-QxGEg+8Iz<~cw z1X42Uz{Cam8r@#68(8otOd~8HZjS8^@9U*@ihLvV7|D?cALx#3fa(nLZLsL-rtyTT z*NiJ%#ZIO0#2%)?lUfvo#a!k+U08BR2fK$uO#NDj=M3|{f#*IJPagfS-rs=@HrS)8 z7@i)|vb9DR^$wYZh<(CtmC|1+=(Nv6WR*Z+w?1t+a**!wh9^`dgusQ^CgWargsWO< zvuU*947N!M<;ZK=-#a1IEW1a((0Y@pRkWFnVlsvgTY{O7ZHep|#Kd5^l}&|ad*m;J zXB9}G?IIQ`n^_e!gIF~1+>K2y{uM7&yeO=RLLxR~2ypRO_eExhGQ$w0Q11OL0;UmA zK|~nT5$>q2WH$r`;JE?Q-&Pj!^7BX4b+qG5q}-A!u{F4+Tldk~s8wX?M>BKUyR?wW?o=ilfFz1KJVZJ(5Ch>FB7Ija~4nM$ZU^ z;%JyPQz8_a`0_)ASkcK~X8_}g^zY{Jkj^yy#KR-vG|9?cVOdb}bWWlJ-UOqPn)p^a zR7!aWxm5U|qG6k=IhjgctAS464xB{1rnP#pKZuv!q~r>R$J*Tfz>`QI+_@*v?3{>> zeqZblQ5_huVTj72*kYl#N$eeb6tyG`v6U4{c2x zU`~sK3hhHRSUJSRyY9D-QPmkGm1w?_?C@avxMw=PJcKJJUL5t4zMZCp4MvWK%7eIoTg?QVyCCSLEL>0lHemf zgn|qFpJ6IeTb7hScIp)*#h<5mOiL_aLBA={B+TbB(VPsR3#ObG6m)$M5rv49>xhV+ z@(+c=$~=6_kvu|<`}G9d!gN2CxZ+7?Gegx=PlG!9FAyQx5t0o`(KBXLTR4O1eQ9t5 zsdP3Wbdi=aJn2lxIsb-qQzQ-dU3g*dB}!FViT{JK48 zkW>aDw$en$}h&;#6%9mCZ7a9?}tf7h($>5(m&>Cpzn6xld z^gWqH`U&n4ZwP8_wQ7?VQ_3L3yahGX(Lk*Q(_4jwI=49fFsR|4hG7Jpu?nL<=@Gg*!KXBgx0&(mR74}$4hu)+YeGfL^ z==cq3z_eNq4v=AuN3np)4Sr|%rX5SN(2YtmWCc-RlZS8%j|Te)yxo_aNN(I&Ki^E( z6`B;KETPNJWBNEmHun_5VTMEB|nCqy!RozLnoPDMuRIUPq*&PZ6T&?H`eJAPSZq2 z2Ost5RufdftXCOnwH2B&sumT3L~*Q<47zraDm|g|vymMI>m)h?Pz>pKDEoVDtVMJ; z9tjOt(!2ea{aut$R-YA(?vk=F#4$2*>g}W{_-R}45Fp)EW#ZNI0jh3?AHcvxVjve= zR+zA26w-^a(F)<_h*r7;{hS`O?J5XRoUF|yf^pnD6F~dnl13$QwBcO1rY2n`-eBnt zc<$UIG9&#BI16&yY=^2?)Xy6WtDerq^sd?(lDi?b&uNS0Gnf!!0gvYZH@~u^(%Bz! z`?Q>UROi5ipV-bhF zgOn7b*$Y*bl#o@k5ymY)8tlU|2V_d=3_ag|nV&|5AY^@lXD8YCKuid}gWFz*b!)Xn zuhkoqLb)qw5Wcu8&?(jH{ymU=NiM!!+;fECMev*H%|dKaZpo5WDT9dw3s0vamS_pv zQhE^BtI7?|(2!D*Wud5gTIBvR$4-}@LcR(@F?lL+a57LO?j6BpeKmYu@lKfN1yFW^Ti?MD4R?Z$U< zGD1N$yS+Wrg@1f|BB=0g%+XK2II|dyUM*7@4Z2ptaMM=9 zLj}p(b*<(xu^sY?ovLRr8H`uZsmcArsWDP;;}?{A0_G5JwbSDh%CX#ww_EMX#T#CL zsSCo$NT!Wk7SHARO<%m>$TYz@TMtJX6`bya118AcYJY=@yx=1==fN*+Cvi>QQO&R~ zoH9lOc*?%UfWjJ<&zz>m>XMdTBD>AGH%GhUZA9wgrsi~%T9}MT&p`^QFU+kiQAnI5 z6C{fW@0j%m8k-e7Ep}Y2GiVpN!pdJ?c=>=J3+PrJ1>?@<>s>q;9PO))Nt=E8o(3=K zbchgcaSc8fm|dy8bp>~2K&7#tVoGhOf_*{j9N#lizZf)+>N;QdPLQ2kO|232RfW?U zB$$P>q01-%2sbD1Dm(B*V{>U8TZJ8qIJQC!!5otNRdUjNcQ@osdym3~Zf7A6%ZD&Y zala+mJUE=D%d^u#X<-t>lkN+~HKE+n`rZ3~suz-)r;O^IY<|a)zDU$p7*NjLr%+T-~M$@S+ zX4rI63h3sT;<^;N;FU)SXX{uMbbqmZ0nFxxE-Eql7lmU?0}F2dA}z&oXV*O{`txdy zl6F8UrY%&aN3nzF2`Z#p@N|=2oeSh4H>Q;Z2V=RF1mu2pNdKUH&;=q%^o4SgHm=2- z@DR1eC3x;4p(o8+4OHK(CQF`j4bv@p%BgXAA#h+L5L>tu@&UgOtj|c?{gqHf1H50V{|^w8+G~3sXSu<%2A2Z!_rj&20wW-lh&c zhefx)hjS4_r?3VjE?o{erq4>tBe{<@!MG28rC1Ew8Srg+^sv-bCfZ9%+sFFZ6}O#h zdkPN$(Op~j4Gh&2B(RW|K}@}&jzg+x3Ws;%R)&#~)JRWI+%h&r6AYfU!_MN7Ay#73 z%Z2*LLdCzN-75$%B?QaFPC!KYXMaRtyRtBxLdeuJts}YXO7IEad0cJkDG2xBnZxer zMJ;f-(6Xpl=q+s;BS3Bxc^4)NeMfDinu6@P8z4%R!?eTxIUL);h5Y4Vtkt3GcJWfAx^7LE`Ia_v&BLatZT zK#fC@X~?IQVmN~rQBKwj@2LSt@{S)}dEYIs^B<6^P)HsvUXVw%3Yj5Oa8T%AV#7x+ z<(s}Nqpzq_!^GG!X^WFinW zkn|>PIOW!}*s8F*d&5=*92-n{NxGL}3$t^uu>PkFqxaK3G>!l2Onv z$>LZ)bB$PTCE1C_uhE4U=~M2C^8(2@>nNTdi3WO2S&9XVCP4D@pq#ldc+5x-4ciD#M-W`(Xy+#Txp zNa+cd`;tNuBwU?SdOYndie>XLp=nKs3Rk8`$slz5@?jr*QKEFV6I%3t0PvhO@Sy7O zog`z+dd+L*;vuR;>>}F`(S9BLYsS5WuA{SAymr&WD0PeJ-t|9oKhRQh|H(QfpGyWD zIv}u-TR-2F4aIa9iEPsNpB?tc){t&dH;~@ZX5wvkbsb-z7*Y4AH$WBBG$w21u>S)e z98i>2c4P~#RGnFL4Z`tm9~1bclFfj+m35+3-A73QXNM=85%|JBDyi7@h3DPCxJxwu1yf^Gh}xW|hH?)* z8`E0o{HeqQMQ;9lAf?c@fSVFr@C5y}2c~@mZ90{t;<(GyK>sNvsQo$qD@C3ddb9MW zhY@n};Z90U+xKd`k8;e`n=niJ6h{d9Pbt9_=}@}18E*SGi836eAU%8mfEm zfm|OVSBFrJ_&SRjD*b?ZBEG8BQgf=%-QLJytdzdOV6EieQq6Hzn6@gT#r+}vwUi7Z zJoAMEFT;-Sk*B*m<^Jiyx-3U>xN1%7$>p%1T0nt(+$jZ2Ovn)~H8{wsQN$)_UQcKxQ|0(oG&4`#cp2;mUob$F$(Vany41YE#Ftrl-vb+itA|G zF)V1FX|z0wJHtiw*>pHd==;YuDy6U!od!)1?&3G!t!b@dl5%F9Evq+X-J{Tzxd^5@ zL>d_m@%@)92jiDJD56Q{JBTkd6T9FbiLIfxy{ua#cM(1x!mQSAJ(0CQ9$>$hAyiOY z1ww-379Y|H`;#GM(ZIIm!I?W0QUh39_UvIcQi9_apAcTKU76JC;TZX~9db&dxHR3d z>7&w9)zrdk9LOx~1@&PnI#FP-KB+?QL~b0C(ray(p#6-l=yKA&&1s@4Qz-BhB!`$+lXEsW#twOQXjWf(7R0!Q2lgsRh&E2~Gp5sLf6s zJ8W-@Crd&1x#ziL6(Ulsfl#oxRr7R5`&_101}DO}71~cdMpEFIVEri{nF(j`P+b@b zW^nZM^?vB>a8ws8aCP^2EO!Z%0LoM188#C{0JP2`1-{|$YhmO2*LuO zXV6gz`?fuyd3-zC31gi~QwxiPUk=0)94EM`%q-$z%Ej(@KfGD>3xN=&b*&ERzSxuq zDDF?#l|7`#pm#mVijzT6Mt~|F;h)OCPd&a$6`MZ$g6vJo!{`Jxk#xF4A>re9Z-bBD>ByjA8Nf0hmze$E!Bm6jNX-K?Vg<=hy27%MVo_n( zfLz_fp$sJ|VIYL?mv2b;%cSiVYbxQ3)M6i@Xqs9$C=5*vSycUIxhuJiN@Vu1TL zeygxE%YzGq`?>rJ;41_yn|qZSC^^%DLLy@z^4ZN~u$pjErPR+3;3st&mWTmylcR!2 zf5$EWg-v_(-~)jH;;0!s_uKmv@5dL9g?}DBixFZTajD159nR=r*C-*MPBOgg{MK&?;IYbEG{dhh1nk0x#nFQ0n1$_Qu>jv z7UPorMDeHff*1uqNF>%cwB~9Um%c{SL9dIbRkQ6rgCDU6G<{YWnlcq=rc*B^Krdzr z+PCUOD9KPAMTg8|xpR*d7X5blXwu;Y4Xa!BOuVpvRV&CZjI}fI9I#t{y!GHEHVlsj z`^n+>+|e-#UqO50vL@@$C-2CJ3 z9zCiy6dZkgMsD9Rf^%v_gS?{zsJJpt(jN0QJ|+lgK_1M;02QQDW;E$XXo8eV0CLwn zHBlY42%xh<)^=WDg^05upFE&&ZV6O-C}C?VQV})!(sW@POIBVB?PCmADG3N1%qHx+ z5t_rv0_*H2XDtbtWReiev5nDe;W!*mcGHz8MRM1^1t2X#@c(-n6+cXBY+k9#H>ufJ z2;7XFTZ;#&|;AztmsK-Tn&lEmWNa%iM#jWV7q$= z^*Y8Fm{C1-6~dlN#&gh#2)dO!BkUW*Q>U7|<3VLzgfmpuYwTLNY#0sBS$WX*O<{vG zbyyU~T^B0jPf(`x;MkW^55jN-^($yPV!S%y8l#~zZ7XbfR6kl-%tN~OaY5_RWDnF% z;JZUe9?8f<6lz8O3eiOCFAZ>;=57x+mmD0(g-Es|T4YNgRL1u*L&4CDP{;%2FOdft zzXaK(rkyOV?r$&pD_Hb2$GLQvTF}bh__PUb1G{j5kzIgLYS+Fi}12 zNlmsnyu@X+u%oo)VhdAK1wh{oEssd<{SfBq32?}+hOh8UUDEeE(XMhURBS#z;6LJ0g^ZKY2w!$7dlFhF)5zw7iqTJATBuH3_(srPi{P3d+ zq9xwqY7<<>9c$E-aNXP!&M1ucXAm3gR3eu(O?}9IhiV7X=}#*4Ei5yI(xIOY>@HD& z8Z8XCmrSW)`dwFul$++_RJgn#ilI=S&Wpg}s`|)D(1n)+AJ34$wLcmh*Vc`KM4ZAw z0_ZM$9nsPHI2PE;9MFU6fA8FWOJk7%cE7ymso}CutZ~rDw^2rT1UD3FwCD?@lMDQP z_Rr$)Gh9;H;P11qD&!`kYzBsjLI6?MLLwRp9Nzh7ad_wN?(+tRcXAw7AMcZ%r)#!) zyT3i9M?e2(@%#DTU8lkC=gMz)gwQT3&qNgxB%ARRM!)!HG5W>d-7gx9e(@C!{CS>{`V0`(3K~;t>j&X5W02#-Ij}|7M!qhsb2I>~z z6(lO&1SjGBP+yh05VQ#IsQ$-KP;iEq7G)_Eu*nNMBpdMVM(|a3gU0uxMI6Ru8O;$0 zVa)c@?8|Zk)-45&loI%e>OJ^GNS=8xO&`r}tYm=Qr3V_UO?@KNz)cikQR}pI>EJR^ zYckI+!gW-)_zf=~yrX71MtInvMJ%911*wAUOrKqNroy`q*wsbWoTprUOt&BWHl6P8 zX~*%kFe=_S(1)P+?3TR6Mn}PF@{MD+Ald;M9uQp95-4KbKy0m0Mfd$up_s4uft`cn zPA1~5#o@5RWZ2W6y!$awaPJV8`YU2%$vHW$Jbf^FLx1zb+DS@1q-J`H-GU<3*u&RQ zH7TxJej@f&LJO=!ZQx%CoonXc?Ao9K>y|tt_q<-@B?NnQuemv-EW2wdgl3(xfLKg7 zFX3v*UZqYx7fJA@t`bnq>yOdM~mp~2t*UtEpG@dYkfu891e!w<(FH{XP3<; zuDh}kXw_EqFpUs)0yh(NjlTuNySI#(wur7$Ijc>WY3T0yhNp|;dQX`OZh{e7OcVBw zdriEO0CIb{ytjAcs0ee%>-Rg$?QsEv=&_%69PZ!L6qHV>+B)t*cEkscT{V=Nd znUn;tf!0*}@23ayD0ZzM+fZ_!{L%BnVG=1%6{`J?{91!xd$u9bl3ysb&Zyhx`60>_ zM`2-+FoLi-a{~$l+`CVOx>w~m(SuN^!X$BsRzz?mQ7AMj2&c1nb}OQe>K32&_Ie}o zcvasp9V3&PN)?uwj4Nn%nVg31RyXw)Cy}t!DfE6A$@=R}&(PzU2QiQBuGAR|KB6lL zTa`aV|Lr90qd@O4@zv-N{5W8Lf-#H67uWNas1YBFh&d)YWp2T zQ=!3GivVavt;tN8hWjY68Tp82MBw>nK)1WfPp6M1ksQN?eCxBDK9i2$hP4FIIPCxE z1LV;aKdB8sAwDW7%v;Ta1e}Ub3D;N}jP|im{z!t^EHvN3zY}V0aizBgnp=4i2-qs~ zKN;Bm`nT!*CC8`Z6FnD0Nc{~tlmOe6+yYg7hdUo3Clc9qet=s`kWW3dH115N5$1Rx zq5$p&XP4aXNuh8Qc=xn@qRB;~gIeLUZI=f}FZ-jx5&15wKheFEbbUBY z*Lg4nVTPsH>mJ(vE{JQU2NDps!fg5DWpRPQp9E@WL9KBmm)a2?`LA4)#45SuBe@ zQmdLt4UgT_gzPrEoq9s{G+Y#Ppv3J=PWIwp`~%sGdXb-Lb|EUQR@$(R;%+=WKH}g- ze`}xIZ{MwuTu0-1Nw&vC*wwJ!u3sZ=!41`3$ zxdC*=iW!1}J_$7A>J>3?K2IO2a6?NHZoDdO_0E6}6b*ZA>bJ{iY=;J$q1!B`jH z-Fa~|cm)sSzK9H8PP2A|LixC_uS*fSo49586?}#?#?k{CPLpoW3Sl|9kR@)F;?*f?=*jWs?Jy`=BZ>e6X8zA%ZSuwmLFz}oVV;Gsx} zq_1z|GOfvTsZ)p6V^<6T9Mkcv5%5+t8`h%5!zIxvK9{lP#pD8>TOeWDfwW(~$N_;LFrTn8+w9vb@olJ-aBWvAc?CB_3!YL`_pkmku#`8L z4AYo@++L>pG(Dt64^RHnFGoN@}SITq4-mvrOozL$W!7MCT zi6!6@S^|RmaO1&71+1?sQl9_#+yA1=dr=n3j+7_)I~(mV14$sbFPP--5X$B&Cmm1-o~+@kVYI7b$TtERqf8S!Jp00V4v?LL;WQJojw<; zh;H&RX-EorLZMBtL+;0W8Ib&5i(1vT|Nf1+`2FAAZQ0C;hyI>&z*P zn(9+Q@$qe|82Pi*j60uN4hn99MC85eMgd&K415X(?r8`T0?{Cfls}JEi&srg?+>QM zGtm3P-`%f--X9=mqR7LtSlu0x{IeS=jP{+|pT41tF@l#dfYETvRYmzwXdYd>V*{;T zTe2C!y~m9O*jEUB#pxJw(J+nG0!KqS|ona4=3d?4gjv*H+TfqRe zHCD;2U~NkQF`g*Av3e$~VUNuD3>6}jIa;qim2TS!JWJnT27lmL!xX;z4E{4Xa5p*SnmodHToqJ*P1cjQpQk+tM0Dy1&XP9)5Y`SSjDuCAQu}JmKn^FaU zUlQ+t>H{eRfjy+pR;#*L`FBQrI;IIttqt_+Hv++=iu9WHh8 zErcB+R)H-&>D|xmN-+aTEEJ+RKF2yiD$R%2!N_@tkW}2knzqmy^D~e`oOnB1UfTD? zo3;-C?qlxKFVMcQ`eL~sQ)@e$oP3pNNKf}o8~Ozr>gi(B@*Qp3E7)y6_O@|KiG&|a zAodV(8e$ZoFRWsI{SF3z7ojhpmi=aFdz)!(Z_|!Re4CNv@2!c`hNM*!0C1mj7yljx zj%a&UN%wnn@iYf&a;d7#<7Yma6X%d&*8Ji1yV}wRfcp*8{{y=EA-Py7@Z2ZVJ?)Xj z43}0|bY+D9@cKPnBa5Dv9nv4r(|$2{k}gzl2rqszN+A;>TEv8NgV_^Zo|Sbe*UF3CEJnnrwn9e5rA8# zVZ>jUsYf^wBw9N?xRp=_4`v*Nk;$LrwR?7gB5V>xPCGKBT*B*7(a|019!h~M$k;`s zxZ&<@xcX|9h6*YD>ODzb^&XT23$fW$k_Vge01t8t!{@jv9Fa|#Yu*ZO!|0pJ9}v_~ z-NJ?^6EAvOME#Bzd~A&JNAOn}1Fzsk4UOg3eLHJVZV|P{8MWf_+bm@Zo?xzkYl{p? zdE3xaBwJtqqNfAbo2{MEqE=Lf2*bE*8`MOSFR>l@`Z9`4VtvrQ~iMkr8Bz%YTMfKv85dA;d2*VOa3q)bqs&_TSB zoi-DtDLV|wSU%=u2X35aD6GtnB5?`*aD3!Hahy)z!ta*GZ-a|~n1n>GQ;U4H6ONzlH*4Z42!J?A?dL0q-XX~BP87;wRH*Mmy|;d+za z-mw|wb4(PRn0{>`(?6ol48;;8bCpos$_9^R1(ziJ{yxr#`gCrHbn@V7PF>b5nuiL% z$aMF#QXIFqfsfRaPq<6~&mWK)-qHL})36q#@Gd%4NhLUNjz8JBgSobZL)4fR{|sWSJHr!P-*D8qW38dW zc}?OYQP-`|v1mE+cW!=3RJU^I)9sB2h6s-5B4#gTL?FbC-i*0Mju1lv$*aZ+CFX6sNzCs z+V+zmL!xl$tD#@eI?={!o{=+-KYygZ5mPI*Cy30#kbTryE!W1-;ma~&rZog;GG0^&}*K80densO;==xaEG-I3nu7!_!${PvL@7N`ag zcX_kN86{NJB7BQ}T%^wsT&(;%R1C-rTnkGJQi&-zPDrL;?qiK`th&#hjo_SSAstsA z3t8NACS*Cj<1D@enC<3P!c(g@q&V0XG9s;y(-E58^0iLh+|5*@DUlL)eT%j#%zIXn9pCa9m;6FRLI- zUy8H+vVWd(is9tu0XL%9`kh$08<7zsUx6@O1ep`%2sFs8AZqM_X)pT~ok zrj9J4dk+z`pfhu9=u$(eMmo_y=l`}NTu9oADj7v%`Nn(HCqqEY z5mc8(ZwWjk>l%^(@DQALUT*|yAbk}d_+(U4%(F{Uiy{WNGi@~7xhY=1Fz7j89tQq_ zuU$!(CYoIQ%QkE;tGrsQiawZb)I%C)uq(B345&8yQlR4>Zad&Qv5KS=Q>iT{)W#U1 zv6Zhj;n5N%m~RRSS~DZ>{9VrzcoUX=NUpj31E2VRwIr z?sQ;32(0L2V|`s1+wG%RH4=@dan?R=vfd%!EC=r1XV&gB-6_10=;8HTPt7iR2_QT* zL?F{E7l-3Lc&a&2+{j^}exrZf&$HxxoYHPStRAi1d+>PkL3Q_=rw<;iKX|-VJ$&-C z+W3#HZ=XD_?%ezXvJo)zZw!y&-shT}>VnXKHp55Z8eH1I@g3LDqqov%>*>huH&1(A zuDC|ZUJV%zq$9hT6DvYC@WK$<74nBN*Q9aOyL>1FB zh{`s^3fqFXr}e&b)xU~^6Dp$On;N?e=O-WI00pEF_Rc$!3*1}^;Ww2*iZDPZ(L>aU~La3s0h`0j1jtyimf7pFavr8`MPIpO#wkknF46d^} zmRs_qu~mupf6sZEV-&x#zKs@VIf=_ms0oTHFvSMBTJCLO7RE&g-4M1^X(u8VobcQY zi7h(N^@zUKk`3t1<>84>SjbMsf;!UfwD}GVG*s?6`LF%qL-;LH+wja^Cyjd-3k!nC zsV~3}=lkFVDt^6?_Ie~_s#brTP?{(Qg7{}iFy}&@mvLBtd7fAcMpx?ExaUC!I z)OH&rxA2sqQ>}nOh5w#Xb4(W(RF4=}A$r;yR}sc7gNi`%0W6(mpjjBw-D8BsZ6n2h zG^*FgYGHIp^ocf%u{r_E{r;Z#WS= zobjEVng!9~gbmt*u2oBVJq4p#ZFAnIT_T8KSKQ zmn{`%0fGvGLb+uv+!E*$vBf|PJH~oud_n5MYpIhaeCe^=dwkX|mUgK2VCX|d@A*qG zOlu2vlT5JqUTCS}xC6F5enV5t8qT)vkcP*oxzkTxk))VT| zb9f6kpw;3UTdXM?nzwuC|E|CBT^wh$yNeGDhaK!iMLB_VZNeA zMeJ^+yZ<^Ef-EIRm0S++F2uZ9YWvElcL=4k3jt6M;2oP6R9KvXi-a7CTq-Jy=FUD9 zB190Yfo>(A9q-$=7TlfmtdcPA5eaLv2JJLYIOW zv~v?ocl~~1JXD4rx)_TLl7L?Jwx#G)x~v!49fdY`VCEq^0?Cn^lxIZCAKe*61+8dw zi8RNFZWD-U{F{(wNLXlqbRT~03k~oJtMuSQ3v3f3XAoj>JhG-nVWo?W&ul^jNly0# z)^0;E;7E2xG+1LzFQ|PL>E@cAV37eQAG0g^93pa`?;H-vp=Kqmm2#?u$`~;9cw8DC z(BUPWP{Ikx+YvLWEm}zF_+E&cSneuJR5rk=h1l#I`{)Q3CV1&yWan=SvXkdznnV96 z?G($+KYfJH>9oCq<49;>6c3@ejjThUMbYv6-aHSDS>#EQ$0hL(To@gr{4AT9rn3vH ztcp`~U?mtjn2alD8gGW{F%)-s-2K5HQNx|zxG=Gh*r9CWi25c#)Q=)V)T^D8Ib55LpKBZEs+?F4b7G>-+$-c5cN8O-|}DYz)Vc3zGpSkizNHniI5>ZPc|xE1;4 z<$2TP+@?$=on;#?SzXJ;r2Gt9z>I?LO8Ti@F&%9U}7-&JVJTZQc7#3qTM}+9O zhi+*w?J9WB6FPSyoq!^h7C!quQu6LrUsEU`a$RV{Oyjbw1i4rf)URz_L0G0!jZg?L zK*ro>zeD2VricokhH!Nzre!&x>n7_dCo^)OPzWv{4!%ShevdDq1ip;vC2e^~`m{|i zD2(Y%Pq3r{z-M2e+c#lW!ly6C3t9nSLFpsC@J_8-Nnz7CowmpEwPC1aiEeP#XhY2Q znyC;#RxE7D12!EkJ2tO*c6N}XDdjgl_37JdT$-r*7Do~pvbK84>|~LL%93}7@=)1b z&>2f1985M^?K8A(iplJ>k$3wpr~7_NdAE{-^dLQFhs-a9vCo~c7S@fz=qnQPy8WLt z-#HTm`#@C7^UGFsH$8m~!#<|K89M`J>I0AC79X(B3S>708O_F&!)2Av2dVEn-5wQA zdR2GV%*qTP7HXxUK6J0>ly+`MS~x&Fm9*leloO}pxiM{0>j}OEW73~$`?pl1dki8X zf0~*ykSO_9mc&}#M`1srt=sMI;gT@#Pi}yr_P@tpr#u0B91>~ENxYS!f&!O@Qn7w? zp>3y+4y99BrL6M1sj;FuiG9Nf$C56@LB$^BW*3EIO>fgCqi*^$ju>Zc6iV|Vd=Vn zuXF7xoQ3J^^%+MA02#8AlywZ4TrSf)difHkjHVfdRY2-Ozk;88@XCAt>PYT4*d*a_ z=6DSAL#V(2ibc&qE*3S1)j2sH=KKosdMCh67o%klPZ zuQx=*`0&KAQ0NHNp!ANXENHYrAvAO>&~&%HKrt;Z^9P=VF;^<`w$d?3=CJb|qF48* z-%T?LTA(yH6bh5j|LIczvB}_hGCzKf45RG6zhFhgHsNJ$Qi|gQH=Q$=g%ZV@pmCYn z!!1UNAyRr4&CS!1KZ$Ipx_oW?oMat$av(SFB@xb@SGRC53y#vBg6Wp;DjmJzg&Y!eG$cGWXWvX9FW^73AAN*CB` zK)NOUD($X2o&zZJ2~||UTtw;wt`VPfdVBEIP!SfMnz%WG_MI%tsoLqz)OoK(4n^u3 z+*N@)I8cTswV8Isw`z1awO3o1(E?%yy#|N_DW;J2=)$qWNO*+oiFv9t5#z(6VsQWc-BOJfcJ(w`b%8!f4Gx+oINNo?Lh&SnRU@r))NV zECoVW644(ZS7j}Hq>!pM>7|HUVrp-2e~<6E8y^qpl#^~m>X3#;J8_#3W-g?X%yYyqU<2fX zF4DRDm(%C6e;+-Y^y4gab)~=HIRsN}#VMLIevYYmCv7DpY{mEkCZ<-1_vZol?N^>8 z3Ngc7>5sB-CV&qW%lF!UHH;2Z30cIdIm@kxon7J(pCzl zScX&%O&Y@cZEgst{+yn(O)88|)X(*OKBKtv+uMvM*GtTe4=2N{+G`OVLGMQ8kpf{~ zxxTfLdZUC;?zFDOF5%3VX* z9!UZaDx6r)R4}jS#*#VHjBabuwOnRNrG`HU3^h^8Orbw332VD3rvgCp zLoG~ukJn%*4^HJ3DCbJ*;-RQSq>FyK8kmEh683zqj|wAJ?jsB77VhyEY2RE@@-f2Q zXoJFJERs&(+=URS!ZTu3Ns7TPJC+%u6tkmH$8_(nbNY0p`JS@Xg-~K2N<=XPE6Na@ z7CXJ?g9Ey{*YrXgUqVhu4WMp_E-Sgw;8k|GTb#mW+n(aNi%$oy(t(~=s&Z0~n)+Ovco(wIG$Jmm_>cF;J+ZbJAb;{L&+}yns7vnfb#7HWkhHThK zp`cWd;*?MTaZ8T~Z*%ie0&iU7EWB{RKO~Ip$=orZ=>IXzyFH&142jiEwx9^yC7LIPSeaaY} zJGgRS>(OR)`{o_$$@2)!lFRN5c8jKvv%2TgEF*|}FX|c=NGT!1wkr)3NM4u{ja}G2 zX?tokRaLtSHkv2h;jQDSuq`ZFf7GrN(|vTey7y?U z>c)Gggck}7P{Pt9yKrJ*>h#BSOqNPVA-GKC5*6c9i+f_QP;4$i7Gj9EKFr2V7aFd_ zrtF9Lmg|6t{V;!#?1!&lb37MYoEyeLPU7)ayLxuy~r4Sa547PiBlS$$h1c(cY+FR1# zX*u#lhd(&SFx^zxf{6YGpnorPlW(HJIlX8kKFXaWCFVIkAmJnVHXW|QeqCpfG{kU` zfMFxZ=@iP$LoRTy)UkAM?|IE`x?l!HX|Uh`k}*K!D+SY&9duUcS&dxi>vn^WP_^rx z7D*xBJgXzmWPLN~Z0&VIEwzW~Y%A^Gfa9)h;U{t)QbAaZzpVj-#v)O=gBZ~LBg%<; z{qCjr17(ZlKH$6i_yWvN5a;|OPI{>IcLO!__o8P(kF*R2ZG4K{0>eRovUMUz0}_KG zdZdKV9d?{sXg~om^lE@^K_uAAa~NKtt+sJGf!gddn~hW?cb3aTiC1lPeEbYasZc1W z6oLPDba$50D+seFj#v?U8XUGpmQcD4JWp>m&tVE1BOyx$4O->9HejfKU>UGnX^WH? zC7arzYhlcr4AmwYJnfMJ@_uc~Ds?SF8EF;~b#jR`lSm6Twa(NC6B?R@b)SO+P@yUN zgj_GNeu2c(a3)RQDY?RT9wa2Ntr4_Ruy&#zYeqjBJQ#ZBGv@F)P~^;QGkII=9D`xc zdC&pHb;vP}mLE%*MOe;bWHiw_$$>aNK|DOqYUCK{M5B}J3~QlA(t;V|8WgrS@(s3^ zGS|_uscm%u(+n##j#F(mRhyX|-c)f2NZ4G4ANB4&TA^>K zL~fAjfrtFvMLcj!5A&Y}-1Oco^c2S}d?$!ie>_Hk0qVWWo;%p~&=AOgt;dWMl%gu_ zdIPCP4PJ;G=`W(OBDb+_rk#0T8D#IBl8Z4$riZG?P zFzFo}O*zlgkoM`!1Qje0d=f(!mdSg=;~vb*lxD%G z3PR)ow2gH*J0F+STa+Ed7MgU}N5)H}MINsJ<(9U*FDf0xNHS*|w~!lotwvL^5}NuI zX6HN>b%ZqFjG8VOHHx5xw|fv8n1Z+u{^$z~O1d$CrEwCgcb&Z7S1hvGa4KZ$qZ&%e(Vs+ z$w$?+(%AK?#necR42}v-prGDp!_4Q=0*-DyOHU!|$qZi$`Lu3Y1#vf+M97)i!p5ii z$KU==&M9i%oIIHE1QaZbsAbd>U{K0_fE8>ekRq`2VvJJ8&pX(6>>u07SkS5BA5V%% zWx=FG%hyVy+7KGtxwz2?P7l+$1uFnUfk=G_1g_QbfBBi=aoo8r{8g>V)j?<*IiL|z zLsy&PG+;!P0@7(wnC7LNH*3b+f z?#J^~Y(w9nXAyvZYI&m;xmx*Sx)K2_3PgTNrK9)gRa~j(_f1@bPn?T;bSqmrLt0eV z6)>-;i@@c*l)Rd?!CS2S87=~pwZG@-(fnCmVZ8_vSksXP%gt}m=hXB*J3+t@R9{<0g?J|F|j5N~lH=|TLM3I{br z_ujf-SA4-uwe^CkI1ccyG#8UF@WPv`=d?qw$C=H_i$!$vyifLC95!E9wI7flO#Vin zFJyIY3pY}>C+e7P5ed#jrFz0yNzB3Agd$S0L%}T))*5KxJk)pn2&709^vUiHaY%ee z@vfxX&m;Vz!xvwf(Jr(xI)ckFs6;$GLs<_J-cBon2x4p1dz1O;9-rTrqFllY4LkJ{W`nHD@@KPI<@?o*ci1z z^_1u5IO&?$N?WHgt#zA{Qo;7vsqZ#Z;S#)@F?o-FOoSeyAc8HvE$pu;c_7 zbmmYp;UIf&Kw*38Cl$TvDWo7+p6Fw`JT0P_1ERN3S1ywYU9bf48UoL{2UG=uLcRA; zMnNfBK)0fnS#>v|BQ3Sn%<#Yfuc>0pC+(%He+ADi1)3ZF zE42J7QGJHQ559#17T(Umas4E#P4h7cp=%=H45YjCwbFqW^>o0(C1!y`IJ0LEZ5l7+ zeJ#BVp8L)BgAt~d);yMg(fg?4i?d#;kY7FOo(w3f2@IWQ0Qe1Fm_cYGaak!qur#3D z@A+TegVAICBWNbxmhn-tL`U=v#yC_v=pr$euS9t?7z~-GdEu$w+nbmxx_9NiS0BRPMWO_PTLV3G zOT};S9bo7)%pcmv!X$`QbkeQT#&l;w=q3(x2+n)rr-Y7+%IIg7D!KO;RX6{Xmhib8 zI7FT-MR(L=$=dW(o~Z=TtqLFa1C1))<#92v0LO9KABDyDl>Pva34USmWG>aHNa?f@ z&wLXVEpri@Zxw20){^xKPKwYf3Gk2l5-0hLg9_r@gV0p>=&KHjBHfKn3*StBmP@ag z?kxE4P9rQ}bS*dKh2xZTH%p&w0eH}%Ny)&mj(}Ezl(Pj=KzD78_QLSW{5YTrjeP4R z**v_1xxtc@+zWuZJNu~US$9ws!XH9U)ODh9bwt?Uk&wCox`@U#o8AKhq$g9EYqMSR-db~y|C?L9D+|$1iOejU=MEl55ie)&7rc52w*NDw?(;bW8Wia-oq>8fZ2vdOX|n^=#l~vf8$dL}q9kJhuqa5JfC@6*;ovSR+@ak4qgp zdp5(PO^*xF#4<>*+=urCxO#XnK!-yyZVWJQU_qm_6#|1%S{sdL#RSdOJwCuptl94~ zE2b3CtwJ*se6-zpcga0~ofrn*Yi^?kS}i>}r5MoM4Ha`RfCU^qpxY&;eO74O?7lYL zPI8r-?Yq4Lzq7?(c4y1$&u*U=B&e90fEB7)hS@chXbS4)?x!CyzS2k(5KHw)VV4`| zN%Cu=%cu$&yd9Xv_zRf;+Lt6nya(GI?4Va@g)_w3%$}_IpWwMG_Xj(?T#4$~^mIU) zHyvyh7^-b-iKfC591}7}%K^w-AYl>X!_X;IQV3mHw^=-lyYc{0exOws2%f^-$Vj)8J z;{Ggb*N!Lnf3yoDoV)%|awDj4vScn$iZQZBSPSqjntk4{`Ukr^NPM(yZNoub`PbkO z+fK1&-v@kjFY8@;E|;RwM(^fZodCL3pP)gzQ)VDJT;^FrF+hW1`H+N~76yq64fisn}DqM?Atq3qyA)t!(>fa$0_GjYVA z!Z(oW!*>0h+w&%X?gOE{N$_wBAmbA^O{fpts}WYmh>$VlTkYm@OC15Z1^k~p58_6R zb_KphwPP9qL#&ND&JS_K!<52iy-%lcJngE7@i%leFY0@!`b6sOwTZ*s$>z$Ctd(S> z70<0umO*b!raqa-6>Cw_nxaRB9UsQ}x+6TDum^OXO*N&ys;V^(o@L2@)IaR2(>L%H z&d^i7+Gv;T;AlGX~VBGWrV%YT2*2y+_~BRh7$ar6DX+N9-K zLqWrsw$>(XBP5tB8JApuLxweCyF55;e#67@B6XTVye#$Q798@&nFhCUlQg6z1#=hI z5@?X)t(W@#)Mb({xlMBF30}{~-#- z$OStrKl(#WCAVp$hqoS&@Ff7b*8b?@tOJrn za!uBySRO=$mwm}|!*0qnu#G+2R39`KFjrvDo?i=pgU~se#D5uM-lQt3%`sB8L5zfK zawPL(js}OqZbe&t2|VIQK$+F@i{8mITu^|AZ6jMx(z?Sm1#};6b)T_k3^yZ^RYiTQ zI>YM`>TKoY70&+Np1%m31VFd^@A4`5i+Ba*S$ohue74&)-QUWT$r;Zc%UycJpmhs_ z&8Gt>&CUcDeEt8ty$y_HSC%H!vu(Sovi^Vl?|yFEW0&oybp5(q(=$C;nOUx!&cDtd zm)*>e8<`oI8C{tX(eYDR>1B6&wW}TNDptGN=|MYU0f9gu5C{YUfj}S-2!TK#5C{YU z4FZ8cAP|VvA{M@L?m73}^WMuBH(#Z(NmByPg4rAAY1Ymu}7zf!^^}arqCT+w}&?8dS>B7zq70{MP^YXcZjD`fx{ZU zOnl71lAqt!>b)9F;dJIK98o2)Ec^s~m^mzqJG|<4BAGqGMkG$T_%m)8&i?mM8Q{r( z{P_^vTt2X3BR&i%Rz$=P)$qrtviWY--rgoTKRkiMm;4tfTxZ6fcyqJa&K&)Su_GN? z+bJZ*5q*FpTWM_Uw3=vFE*%RDEJSy3g%oVgwuWPRRd$XKv4*GT0%R1F9a5Z0MYX@M zXT@mJx%t4t4bM5VO6cjsEhq-lBe!7A(5gVg6VM)U`zBW-?~uqhuxao;E4D6U6ggOK4VFO9lHm1Nab5Y@%C$}t(>dXg1q5}50yWI~BL5N&ZH6;O)yWSZVj!g96(%Duxy&+<#}Dq3T+jM2 zM=Gd(F`LdhiZ(nkFSsZf>kv*Zm~zEv-nnuK&hVXy1amk7w5+$Gn$FY3;Z8wKkHNCy z*xt-omP^j1`DrfCN+`p#3;2gwrd#-oqOolihbdWI&mA?0>7!XWYruwYEVvt8AQt4b z{S2*UnF;h)Ni|0Kp`D8_TF&qoGtcBYY#wrWap6##V+T`eE<|xmr_GH|k2E|fSAKFW zb3>A2py@s_4243Ek%s5#pNui+O{!1SI9r3rFKVw*N012TDI1D`7+opbvWMZ~THBN{ znF|=v!Yq(FPq%Bh^8^9Fv0GEOw%r(kl&|Lu;P4H1oheN}A19CK66U&Iy6SbMPPh3C z=5EslF}hN2Fe%XR;-Z5r@BsV8ppIZ;2XxK}3wCRmt74+a;tkLL)G_FM=Zo2`H!1d% zDQ1kM%33!SXLxDJA!clwtnnj~bmo9()Y`ddVdbEPSI8Q|e`hv}S=ys3*Si^gyHXn} z(D2+6maOP6OM8KC0t7|Sl zk604;I5%N9D|RPAq9fqeD-Yzv;V-asqo1OgGCnp*S`vckO)|=D^SSyeu z7-7)Aa4iGf9-N&fs%Qm=;Ua9E%MgYeF(z1YJ4WP4dPd&sCq}py+lyR2AmvUtUhaWT zw0IB8BUk>R13iUg54}3ozPNExjk8+aJHS@+b2qIT<`@y4epBpk+>fKfUgUVIkHiq04_$ze4raG3t-Jd~Rny~8V!zDla?phX%s zvT=wXa>?1~bZu0md=vo>Ut3i=Z&OYe_v`?Kb0ghDoSkASBiqOsxZ$g-z;}L*@Ita% z%dCF!{llhj#i(C}Q;LJq6BvC66q%`c!Io~$@T~a^Hy9h*l5>N;;we$up&4TM?pIAn zZXBQv_PSi-hwCSv#P)Hj2hkw6P~%wH*q#?NiRF5D7I1j}2`HcldJ2_P`#bf1tG#bZ z9HVtgy0p*=G(7bLkjZ>||Hss~Nlfvc48Bh8HQsF2ja|r<5?dP~~J~r*Sch1FwTiL_%vxgyE5EHBE0U zSyCR(mcbidopc14s`=thzG#qVmkUG>4{1FQZHrn`uZOgsfwHk6P7)Pu%bN0)7`+ZJ zAEOM<>1J$NoO8sn2eWMV;90X_$92hMc{o#mH9RxNz{yuY7Bv`bMcWD`LNl#58P)+r zzR$l*<*{v2Qej?(j?-ie6}}<&+c=crnW+k{vkh(b|cRCURfw)yUndOTjOi zbxU2TFJ|zDm)M630RSclpPP=v77w-_?&!7Avr8n%;f>~C5E~wD9xGIVE-qN3|7o(- zZGVf+O|Y^xo}}zska1JnIJhVykNZ{g*oHRRWis*is+%ln+B+%>|&YRD+)TC!YNVU!^*74DM;A&N+Zh)iENA<1BoD+%{51YEdv?{ zMqE`Zi6RX@z~%#C2DOKVM7Ja#*H1av2W~$|E3-(rRLg=Q4d0w}?v=c{<-f7}LPCL5 zFSOzq3yU`NL@TIE3{)lk#^DUFxI=9Z2hCl$O}1R|iH#=(xMbU)fF&}ngo{vyAL!a5 zsAAd~{1gX_vHrj<$!ypJ^?5ER5^-#%j1y1EO0GNy3O0NLr^@!QY3TDK8z$mb;bbkb zH~01i?oOt#H&>Ij77xx?ik)VI1tL|w6G@bU>c{l*Y9h%)1->1uUr_tjiV9g`6c|y< ziUxV)DzBh`tPC)>YxA&rtBH3ihr=4a0_!qeeu;`qdAN(2nyk*_u!gU=Wi#=-JfPdT z41CF;OqGFLD0+u8{BV_T`@-=vIseBZ0kJ#wn+To&J9cnW8@O@&%5az5I;M@siJYF} z(hsk!5)Pl-!ooK&DW1iO1IL#eHFv9Q*j6QlbWt-UsS<@a!?UXr%i7=edr^LV^yR(N z-O_Z1Fnx_XND4l69}kgPZK}tI z$G#Ymhb$_VqxBw?5oJLZF8D0q21hn_hn=EC^&kUCuhrNezjfpDOwknyX15L&CK&f_ zci};zWYj0pn(sYr<|FAB2QcO<}Mx9r@XwX8N)Sq=%l!c zdZUf&o~-OG+2a|}4jIrPBD2Hw61Q~-3v%!ha$wCxpG7tMb6@w*acXoGAW0g&Rj);I zC436QS4*#aC=5zA7eU#@&BN{lL zLN;VBHHfHjxFB<4sfI&9VSm+cFwZ$UDBp54W58w7v1gaSF{ZPkD#<{4)0uGPC%uw| zuS|LjDQEo+%yk$e?8~_G2Xx?Jso^#kdx&Yt3pf}9T)NPq;#Gl?7A>xYsvX1C zLJr#6iLN0Bt^;5+!dFbXrkNf~_OtxhbIlO;hGJaYSfpD#o2UugKtojpVipDGVY=TM z?CLnNy`e-Nx<>NRWcz!&?`4sO=dlX_>_o-`^Szw6{70-soDU9-MCbr@vi`^bV22S1 zUT*RHuSnRPV@5=4>Y&gWV^fLL^1sS@&NbJ(LxL=HOqV-$Mb^wA#Ow7*vnsOQnCti zjFKp*>RJGWJEWa*gDdJ?*l%!#^P^T#`oA%=EPi4ha zCkzu_MaWlo6AAVWCUb`Hs4{lkJ6g!>e=n*x22z zw;JsM;@zcXKI?OkQz%M;emG`IktsEU4BuJJ6r1%7+;`9?_e2(B7d@|BbZq;2$+FmS z7nj;&>HL}Y?0pRXHq7#&x;k=1Nuo?46^eFgNou9d`$S04sjs*K!c11%*lyOGMr+t3 z#5Pif+!-(|mYE-~6Z}%NW*SjayYzbs0{b*$sw?Tv>w|6C0!#C+5ZbQ9CuQb??ug6k zIKX^v(BC-Bp|`}{-pqzj?AlM)@xPSaBH~cJ4<3+E`0$=wRJXb^nSAu++{*RjS+h2zP2hK!6b#e-46yTVd4W(0JN|bf1Cez#~%J9^xent3a1_Olg*QHX}%}OY|GJ>>% zAEMYBZk|z$-5OgZO-CwG1r;A%7FUNjh7e|WnnNq4_SUgySnagC*xa$6t9K4p^<6bl z3c*hihOe%muYBcSP;`radjnpvsIZgd2!NQgHXwHikrpO(C-4Zv@5`+l4ivkLriP9V zN(d@MPUua(VWXC4KAO+GI;9ol?iogqA{bV?&2>Iood^qyM--!bu+!YOK9MCVj%x%> z<#`;23#RrJAaO!-dncJ~JVU%G1Y(6;pq@)xp@j>)63dzvGQ85!;0({uK4`dxyCmWn zs${>h4QGXnGFdX!DVqv-SHJ?i;iV__E{E=#Oi572B>!7FOc)sD!p2=Xytivk(v*kg zC4)aaDLHe?2F(v_2jm@Vx@*MDAjw5mXTgSVFQ6-Qol;HW8r_*Asv&|8ZLp(4&S@HX z6&Al__SNDS^9z>qJ$d39qDRh|LVD4Y`e-B}Z^W27gxA9jFHby!p@tofjV<%MQsWM0 z9L%y;h*qv}1smRA(-mn0?1+mgDw#*`$C%@TvJ_HjszK4U;lf1y9xZS|b42%pVkv8N zlZdU4;=1r?L-?f9(F@q`cPWg6BcUulk(Qxc_DDZ3a#D*-UsqE;E&l>P7!@X5%nGU;SiF%k0 z0}UvehZ_%^qw!Dm=478Mq>{4(S{PhM}>^eI$PVn|(bk#-p@ zqo{bMqDrmGq*w@CVSM!pi%4StXO2vlDiJQJsR9OS)~{?S6)wk3gNk@qp1La0e1;uq zWj+l7049n#*^WQl0igrK^c=^h?R zS<3@9G}XFBiZwhTe^V7Enlrd6&>j5J6Y^kR* zlwo+{NknTaMmwDF?y+Uz?yrWoT^8;lzPm)}b`cPvjZTU*7oXLMU0f09f*9pnsK6oIy!;X9p?F?F3>v%)?-=hyQ7rRFJv*6>2OiSzO)U z$K@C4GJ(NGwqd&D%^wG0=TzT-qQ|R1XOz1)E956T5h~K~GtST5o9Mo>2}0Yo zY_H*65?b836VP(ZzMzKgTA^5Ro71iO#h+ zvxpn$RAFHEK^ULCp*=I~?jBqB0@Co7%OASeGUAe;3t@fWHaQU$87^78G<=K;c;R47 zMhN&e71Y_iDy>-9tAI585$EaNP4p^wO>Mw!L{95**c4GOxjpIpf;$G2o@B`P`FmBQ zL~-sQC0vW%yGwl@mI6#EJRT7X65avM%?ry}%y0?L4tDWQVtvr>Fg^-u@AG4;Js=H# zhimV1sy$pq-rGQfazJtQje+;}A7E!?y+Owfxw*IMh}qkvxZ`YkJV@w3076!VJrK0?NQ9*tbw(aL%{OS*r z@BP~M=)d88SBYO>D&S#&bBpbcJ0L+Dth@-Pydk(|6DNt??i~lU%Xh!~caAHIKpI}* zoZY{J<|W@#m?+7ss(|&_8tOh8>W*VYLro;UBT*k0(?tSl)@?tBmldw_h4%_%e&5~C zq-qqxZ9pX6uOhq(n+r(8AG=&Zc+J(H;=;Rhr)9Pd8y9@8lRC^k*tXolE{8in2P=BB z+iua-D23H_Z1dxN%#Ti~xqlzhe-}ZE>B1EB9uoQAEF@&kDa^vLb?N(G_?AOY=I}tZ z&Q2XJ8N7yPUjet(hK`Kc+t1Vm{ppJ;+FoJH0ZAt6FK(e1Pqw>l3Wx=%TAW?I5bwg;FeS$$&?%MKuMBiRXR@Q|3^9jk6zWw0ur2Xnibj|Oyg7Hg&6F3AU@&S@TR->LOlc5}I8 zKT}iXrH$Zd*YrY$-uHIpD6MI{I3bhiEEZ1LUe|o#Yi#1zHX0mC3p-ebvBd3E0SXJ2 zfmBv+Exdh?Jn#{Ep`SA}#aRnO>oQD98NA`EFabbK-{>dUET_9o|L-^leD+HW?JaI!#VwxZnJ|J*ddi{u7SqCVXJ9IIBY ziEg5Ip?M99qdO%VWG#_Z*W22*QbYGYN5}|oKQZ|$xu;J-&_Rl8D+3FMO){xbUQ=t0 z_v}DC2dpI^=TsfdHscpojen7f1Jv+`oS846$IrrmwVTjgY2+%87|n41@l}<}#qo8f zFQ67nF3_2<^NS?|*|W&C16>O12CO|@EYeIa?tW$$4=+#`1T{Q?lN1Ow&nkG9>gKUk z`&~c{KcZ^KUk_j#!wA921Pmgw`RD=G*^*-4wCjNvDK?;npSZkWK|m%uRC%3OBG9vW z?M;^EL{;K~p?vq&XJ)9pNOl0_R+a!Yg2f%Ao#;DvAF^}m6|skkn7g;E-R_0*1;gD< zuBKZs+@;mjMfB06K^|dF%#ianF25AxaA9Q~Uq8Bqew4UO(K4KN5qGeVB@b0+W>xb; zwlCj0zF`9>>C3msV(5Y^kr_Z8q_J*GFJ#ZpN_TG^n;;=5Z6pX1G1G`kDfu&EqYaJK z!Z{S`)8A?|o zN8iWG=O#tVta1F3N+{8XjM$4?QWX;t*6{tQ6#g9{v@L6t~KdzzkWQqlu?GDULksE2dLz*7#O*N8_YF}gj;MsL6l0GNx z{qF55ax$L@fpT_8fI{tSY}Yrii|F(}3WSLr7EzGXo+g>7A{P(IgjYOnLoU)XCOx{e zvco=QP9cSzy^9#rMRjtgia0FJ4xpS8diM^*A(YS!XrMelBuj%9xyf@A73QMKjDAQi zFr)Lj>h2xP=-N%pO{|a+tzNJfm~EoF)}Rz842p9DsNp+2Mclb%h@lj+MJr)|Q9V0oInM>AWAW9-VbQ zTjlqTuNwkt_yt$_J#<4D!V#U+34XTJILRyrRd}LcMNi}16!p$~$JZYKHN5LGhyIZB zh;SEvkzNI1hLeto*VYTW$-OGtd2u5FYWS(k7`n+~yVviuTj;0LsbY>DmWjg@QP*wn z*`0$I>9&9x-gEi6<76AJs=YroZl=YOYQElTW5J0V;pseVdzVi!6gJ`U2^egAYfVAG zEaTV^xmELg4v{Z@&9n?%TidHQTWf2D`8mGfb&rOZm;m{}CX^0u*M)YFo9W~1x<%at zDg&-@z{$Nm@gCw{8BF$Tyw8-`@2EQ2E0)n^-bwYIHGjAT4$g9J+^94qC$JR-2B&;M zJudvR6?b^qzeOYgeH-d`Yp|;~ch|TjT7_{ES>T4GUK)p zWM{3{-|MThJVUwD8VqaipdZ6K?1oc_dc#+8jxXgym@*0xxQ2j|y9d2y%BYCL*PnQJ z^4-{PG+HR>Q#j+&puMrbgF6)Jts3Hi)o?PthCgxb1rA)0zDe%Rc#%dfG8z2(@Y4fZ z^pWp(>3kq!D=_w%mKB^yC}?sYs@wiIVL=JaY_SfNapu|_D%4x1*E~?ZJ%w1)WqC*()wKY_sr8C90dYHjGJGwbR{#5yVo#C@mUAm|!BbZ9s zTyq9nG4J=tUB(6q2QuiGSC>3=gUwCpZ2T1_GW;NS|5nKk@(5xNhk*Jht!BW#=Ai{@ zSlu{yRkS2lUh-OFEzC0jcq) z%S8rhIOb#OIR%-%r_PRe`g)`)($0DqTLx`-Zjs@`lW13n)m<%c2ye;u`C+^{yx|4s zn2sJ6918pX^F4cZANADl^d5|lBeG%-whxMSL&9(T_PD3olf(Ozc6jaUxmnuKr3>$7CRQAC!*8eS&yECYJ&MKE))rpoQuIe>mtm(H6< z8(su6$9FQ-NxWpvJER>;g3^TL?bV-S=|U*dYjdDXzr;TYTk|T>cQ$GpyG_!2i{eX^ zEVY6x0OW=PNpq0L9lkp4?xG@}P8^gW+pZ6X^zuQov1@0=lJ#slQ}jr(Ho}#M19B@5 z{@boRPVqZZqRq5a(zjBwRP`3kG{qWT{Duk;Xy@Fg&wty%y>Y+LgUD7QmUz~b1ue-! z4nJ8Qtg{V{1{B{Z{Ma2_hQnw*`5AIB_fur7PBlf!z}wD+i`;KU1;8x1`$XH{fw_h+ z2QCYKd0vuAHf=>k%#{VX@K83!+eKk=!YUUeq{N4;q{IQ(a7?sZ2^;dR@VRR-4tR1z z@Eo3;VP3)%Z8~B^$kBqbmVgi6a8VeEnZ3SeXu=j|^oGlTqs>U57pk(^}Pe*GK3Mf@B@HK*`&P(t$g2xAj=Q!y8Z9Z(%n+m8o48uBwBOpc! zN^Xkt76MbyI`>%zBo!bDO^-HT!AAcY48f+>BBEg`SW(Ub=o&%eQpLclz*S=q=jtuR zauwEfyMINkS#m_#_vVrs6J+0zS9PN?o23Eyt#3YPcQ}ITpZ?WHxKC&L(ZbU7+QjlV z^OI{&W>y}X3X2%pI85N`%AwZsfNG^3dpI*cvGmQ_#MG1_iCAXjNK&L6`uwq>14+>@ zOWq&NE-WmqP0f5YGc|1rQKFq_6CP3s1F3vxg>QEG@yw$Y!xS;)9>OGG%5hCN<|bB_ zX1-pVTb*5*S)BdGkVS;BK7=fbs;pYFxrM3K*#$#Zy<`HW9Ot!UMMa8O(H~YMg;SnW z!n3es%2A?m_ecI)Fd3I*f&L$B{xLjA_oI5DRKO^{%@AF@p=B*+_9D&191}VYH>f-D% zmB2wM{@F>mZ>~LBou6EpS(rCPs31Qqm~vb&uh*u(HZ&3IxolJ9@D5@6$&=${0-iFR z<~+6`O$+`z+HvLCz;0W;B)xa?OG%$4Ppf ztC|Y6?r{|PGQIg`W*VCNqoswpJV^zuy$DkI&OV;_3bW+Wm#cHr^R_iA)RqNPj?*)9 ziwjFDTp-il6=X#SmBl}fSw`^9ETj2fUYW3xsCxbxD$W1=;_SpEnjvF0tAZau|)- z@GVkcNPB@6$ym~Si+H=#F|~-t)AC%_Vuog^kgUQiQv|7er}fLMsp|zKP-yFVc_z1x zEV)tV&~eEin&-2>vpTo9Ht}$IVRkj6n^)*p7EC$L@N1}EPbQY^BEEutXt0#w3csCs zwDxFXb{T8=rM1P(VxWR-F2q#EtNQKy!U`-cldwCkOxiuC2tS_ebWjYcoR{@$?#~5< ztk9o}AeHYl*(TQ}78kL6cu|cegtGW8+pNW>!m1(#QtS)-${AZHXHhECEEQ(U9G)_r=Wm!J zZ(ORd*O7%&o-^{r!t(0U3$INLmNJaFx3mFaYOBJ$A0S!ud=*ticSwrv`clsJR<$n~ z%iC!#O@ZC5!fY5qY2F?F@mPi#U!WA<)lF`-Rkd!+TI=lG#80M=Z8yMzY5q@O^C!2~ zs$dgS7{&emd}eAbx%=%f9fTkh?-Zu$wTB38@e?zAD%5idq}XHh3bXU{;tP+>07=m= z(mS0%S@SR@sNi#w2UM;L;a4>O8>$MDIftiAC+M4Fu%#-D;*Kq1^Nw_-MQdKDAjtwG zML)YVF$2x-tBEC8dF-@RVXn7e%5h?8n!hkrUtvTkjN+bInqFC5nm-=f4Vz;yk<2HwV>m!k^b>e@ z95a@}C@$q%cZ|a2f3;jIQi{I9j)z%=yb5}Xr0A!Y`CVQCte{1OP>Mh1UglK5%DFc> z;2DQrpafP}`5UZE{&Q+t<@_5xP4Zu`@me|mnSIwYtL#cTGyfG9kY-}3z+kYnhR(US z^V45K)_rBgbOozk22EK`$@>Lchzj#S3Z&Rlg2jd9nd2*gM^hG*U~yvdCt0_dN+nPr z#Xc|C%hNwyou1G5NL5(vX5p0QB1vXZc-Lt6#kNL;nJo{fTx03}o$0p~MqYrV=%?Mg z{FZVBxfenSzBrJ>5uW_t$$|Wmi?YZ5<1-6W(+^keW_gJjXFx|9$IboW4!Bl;sRg{? zzI(VdJ@J#p1!%^m5=&e#N3jKn%5}zZO-?LNFW6O9i2xYIBWTKTSvVG^mnNqtv7DR8 zY)hAzLq}2>P-Q&r81qe4qV9}ha$w4ERvEs+u9B6UC4+V}hl5j=SA_-sT~C&<-Tv^K zmFdYWU&&dNk$gE|Wj-g&*aComm(_wxRMU}!il;o%*QdXpo?OlQE4)Bo4-l10#_^*G z?DsvMn4g->IE}o(I5wEdCw2IEV)^m%^t82;zd#*&Jmnd4ZS{B|<6~B$CX8w)#!`Ig z>+n@voQ`)rA4Q>X$|5~sW&yL{!c^9o_XT=FfT&z=yBeE?;xqZplbQLcg(u68mJ5kX zPN9t|;bHKai`NQrvAi-hWBtiW4o)2@0}ffaMee)Ev1WdG0l6<|%5l+^&%K4pv0}wY z$(Gcpf`yRECjDoAVHF!LPzSA0eu4fIAS%~+SF(lKDL4p&&QxHDDmAKHDWEcm3|UxQ znVFmUnJv=`$PkaGJR(CDCo-qwUOyyX`V8jPj*(z#*( zc({-$#tU?Ag;N%(EqI{JL+h|})C<&>#}l3bZY;yWWDYvW%gR^kYq_8!CC+puK}WW6 zvjXmpMsP?3G_2J*QlU3#zl>|?wp*qTlvJK}Y(&`~hSSPBiMS&9Vw4Ei_+qp+ zZ9$ldVmq0#92XS>YpGtBdl(veEHq#U1G>RgL0i z`W8G{?{2TPaCwFyFA*6Ljo8IS;)JLrJ`0Wk1-o3^#bt7aXfdXgxj;CXLJE3~(UtTx zN{lO}@)cVW^5h5=%iy*uucmd(y_RB5;ZoVq^j{LsGvyvtT;FN93k!=D`+SfIZs?GH zIi|Kp_NkQL^rUkfX?G1_#tT5wVQG^IJ6&_XMXksA< z>Kgf3qd0u|BCj52kvZO=sqL3=3GkjNYKi(6-?s=DOaiTJV|-I=eio0S8`Y$A32kN`#}zG`&F!WwThuI59Ou~zAdl{ghc^^k zYdaHHYbj>*M=~mY%1O5_2m|Je1Gb1BvN{MDx2IW1?ya-!{o8t{_)PxdED+J2=5=FE&bjKmo8B{4wa_GM7 zG#S-(Mo*I-TiH(Wo1A(XCC?-2jHY>#5|IjGD)BhfcmgKP!%rP2n5t@1h6joTieUs%E@AsSOQkFKO+L|X4Qdl_x{IOd1| zTIslq{ssY4sZpbwAboNP-eso={e_jI%NSQlz*p9jn~mMPo)sl|M|D^r+rD~O7diW=2LN})wP z!}K^9*4eEem`082MKQz*u9Pq574;~IAERA4Xk|LZAJKp8vLH(GM6)q`z=*q?`psw7 zu2$j&pmsHcHYamok#%&lshCQ0!M|E-<3gqQ`SU1jHGx*rt69>#d7xxaR$#Vff{R&t zD}zc@*$ULXR5NP0ix1YYz--txLCGRrDGxV>2rMEr6Rg(pDcnN4+wKiAw`W9&o)Kd) zMOLygx;Gi+>J04oh!Q#dHsXBa`b-vG2(sGJJDIFXL=-3^Q7G+6WRw#aaT7I%#0*N0 zu6$?p&DL(aUZJE%A$1hWJeD?zDQlFtOVbukmg(2NV$Y}V@)q}!p_!^%DZmI$YjY2Y zzZ>IonlU?jp4mD~xji;J!B&x8dvXiRFf$cy%fDeQ1z$Cy@}g9mZCzgywM@!qZQc?s{Vsinj>X|xn)G_AVRJo;M$ z+@fWd&{50F7%>wPDC^0>otKj7Fdgor)#Kcr%W1s9bwO)%6@cmc$5%!ss4+oWM!pp- zqvssoa8q>UJF!);rxYc%BdRpBn{<-6a;CE5YCpx+lAYcfkQ~XcZlcuvk-~(*t%$y| z-JrX6ut+^jR6jWeJA@}GlGdlUciZbwb#imlu@u^Y+d`k;?zRVXF?^AJULv>;U` zp{a-O8Z0t9c+j*GTe!`)*{`=U_vuC%R7TH?%>Z6GPZY_Rs78w#39^N&Y!``*m4RnP zy6Nx6OjMBz_CPORc85z0nV0j92<%*9B@W@HeC8Z#*Gsoi#Kn;jC2vJ*8dW29dS zuZ(B?t6Wi|hR2auO<7asoJ2T&W+NBIsLTb^^s%WU0lwDrx%6GGqL0nBCc{y{ovZ5a zfZNpd>D~5zqr0|F+vuiGABzwq?3%;Y!oISXcR?#L+oz_H5dwG5%Gy_O*Y*I{ULIKz zjapC(t`_H|oSmRVnM?~aN}L;Cn(w#j)_J+)yh4;7NqAa-v#oXu7hM;v#iPX9sQOZP zyW%*5*L0t0etmpw0^BfYX-~G={k8ApbOC_*@@rqQ=dhrHZoW~p;3%2$;~LOGXIC9( zl@eP#1KamYbk!pJW@}2Xq z@(ZUZsd5BTyLNirGOxATYn?WH=yvV$e=TOQdeltRTJ4&WX-&ME$q!kxu>P^DtEgj5 zN6w9>(!88OUSK@iAz#qrUsnn^`Gck_Xmq?@FK<{X5xVKbJZd^4XgigSb=nX~`JL=z z(^dm~t<)=M@g|vxFm0y`+fdgz4hw!tQm}eHpMIM+8AO$RgxpH;t<~V=4r!G}Oh&0( zBk2fLEBF)~vo@MJcg2!J$vTT3ZYWG4mE}aI3(ITQN{QnT#fqy$XF6T-^KMG{z?E{WTW|IXcD16`6{AKWW7}bPzT4QXlbhFCf#x5z6*`hs2x^%nz{PF@ zu6i2{K3B>6>ZWr>`Sivt(*v5CqtUuPjqBtG-Bw=YMYZneauc|%?bE$Rv27`;c}Mgo zVCPIrW4)c`RzJUVj1uaj_z2o6NuX9THZ$Dt!At~T5iQr)|B z{uZ$wbZ5r2U{t>xC2Ji?4J0*BqFK14Sx7-l2BPfFY1+c=FQH&@pEy!wioKiI7xB~kXXj$QY~Lhh(R63?v^%8VXMo(^(eHYAR+vBVP# zL&`f??`?FO`NI`aJ!#b748fK1<=y~;)r^u7N3qm~5HU&^Sb1K7Ow0xWh?4NZR9h(P z1Xp=ZyU%&+SX2$hk=e0$s^2}hS#eo1x)urCsshA!>$~K;W%*8mFHaY>28t@4WqYZA z(6Qa|h151i)4uV_AiuUc4yie?>#Ea(4%s2To9#x%&TKc1?eCCRd(M+CYL8-c8!@_V zrI+`coBbUlHC`wZmxI%GI>j+=swpTD#X$fatL-|zT=hjsj7UD~r1$(VkJ4kCUciud zDLqBJr2kp1C~6BdW=?@r|AS-tMo4S0^ZC(%(Vol>~4cq^{;!5Ftq(FAH}4$|Nxv1ui&G7R1Z-_5 zBruYP1Ol{k8?}0;IbL6f7FXY}S*;z8Yf}lswFyB<7S?}`BeuO{wtfH`I%qCPf?e_~ z$eo5AA4%lX3Dr9j@&@HmvUZEAD|y_gcZl+`P_o0yPNcy_u9GH#vIpryKPTO zT^~h8DTM9(L;T&Sx3mJO3}*y)u(g%hQu$;gGNra zGn4qcs0P}ZrSxb}r0}5lI|P;H+Q4gjR&8W+aT0-jf0EKC-NrVYP`d{_XnIioV6jiU z|2%a;t#8Cxz#MI6q0#m25((wCN%t|C=d*-inM9=Gkje(OVXS^WQlx6Cl*XYbK`K%& zO5ed*n8x!yE-kVB{j-t%Crv11uTQ#H$ybQ@Q(xb;BS1trGFT)`M~d(?ovCl07nAdm{YO&?&4ovD$R{L_>2iBRB$;7A!t&|TCliYImz_MMvP>Rq zU<)Dnvff>)YGJ4aYVCl=dcX)NX^2f zQS=#v`08?-%&|u=&v??@`2Zjzo12pe_S=iBcZ^Ra6VURO8qk3dlB1E#)mwu)>oC$+ z=_Hpa!$^5VDTL+v4E}CH7yp(u;ZKuCO}Op&Po!L~>>!ThCYMaaJf)|Dm0L}#U5*s< zK|{2dMq1;r5uljG5#NFku- zQOV>38{&$tvsdrXA!h?UQrD40S{HK;!&J71@Ah^uHbT391Ux4a_}4Id))Tlr5fHCX zRpLP$iP+d{?6os)Q6t5MOCux~=NN&8GGrcacBON)`{lD{W8aix&T^hv}9lT(%iAGq@uVs<0eD?IogyHhS?j}qov?w-% zKq}oewdp$}OW@LI2^P4s7;G6}_#NiIBMvZ0BTr7!3Ko43?GPoQKS`rEL z8>eGC?hSgk0|hvRY$8XNhCbio&Y0QgScV9RfSO670XYfBPsU!Kl zK+7^GnUZYN!(53hFTpo{XwOF2!T4KS%MXfz>$D#mwn9nFM$ar3LRn}_E;pHdj! zoC+`#SmJ3 zMwpQY9lHR=q8x%>yROS}<9VGlC_C&%bX}WL$S+Z)@;Aw}V%i3UMYn;d-I;Y;RD=4Y zLUwstvA8XnmI`)0ZO8n8MB2jyZYG(qd`d;q5uO>1$w#w|?fS++B8KDZM1L*BNkdr} zk#;vO7intA%v%#J(oKAPjHKVTWe>;7_5V&NUyv zs3b52FOez*NwvwR6-#r#ZUvJGY;u#Id_u$sIV(b}V8#c`VFD(TObBnJgk&L2D}WoD z?Y3?`0yj~tN-{0pYV4Du8!fuiJZMVE#`P)OJA-?Lw$pY_NFDDzNG5tc7^WMr-nKi< z4Q~B6^Ehh|{B3Nn*%keRnCj51cnHbU4-e1Nijtu{E~c5;hq!C++uA5unBoT&7ZifWE0IuH(_zC{yplLGy>xcIY`MH3; z@nyH(*}=ZfDlS({m*!eOr|8%DS*~Qo>=OvVyPDfB8%FxO2k7!o(cgbMKvaAcc-#(6 zvQuJL$r?LHw1ZD1d^i92mw)rg&Oy@bX+5#|lVGW9?Hxd4+e6gyM)${m{L8;z%gHSy zXKzhKj%XoCBHXXfHrH`N-nkNRe;|pj9OtQOaDtZOsArWlARH#yGRcJNJnWW=qzqh& zqER}c6p}=cuS$!h15xo$A|h(9mpy4*vV_#%3-ZY?H9dyjxt;cYzda78C7izRStCKo z^4g{n;ENN2l7yn`jQcINEn!12ty*Hs3eyPsHK4O6T{6i~$>a8ZZKX}}Lkh7Wn~R2I zWFa(_(0s5cJCte9k%cK~C(sTH_l zHh7YArpXoO(Rf|}JM~ShxqG(10QWGllSw8y_z;VvW@eE@x>Qr)lRdYWg!(<}Aa>i^ z+gWi}BGgSHt>amTk@&W|W_|`o?DkVQDLyroT(TA`PAzN~lx*xMjwW2lxCSRj4<)d9Z^JWkf1#&7l8w@qD_%xhs9 zVd3;iEt$YN26q}j^Yg#ZKe`fwghmlS7hO(N;9nH-cX^z$htAD^UH z$shmnSIHxeqMty^bth*NT!KcPHmU_*NRjsH&DNUDK}l_A(+U6ewKa#s>{wtTxGQZu zIKxrWXgzCo+bwl#IPX#V>_}va55&VJicB)$es9g8F!d}HCP(dFQtyLhnkQjRUSGF5 zT8WGck_g+|NX<WAn)7|D-rTZ85q*o&2-7F@H&ZRa*@~yzeHew| zR6g_Q5r4!VlL;A|Ss6I%GmEna(E`>a66SY#{fDJmZVz&~(S3$}T;{vzlXf?Dn$J+v zrX5Sx>$!x&`wn~B(5gvi4>F}pcz6t4-*F4I`G}6I>4fsJe&&j%^9@*>!p9dQm#zIc z9txijca2%^)6Bt#-e8^X#G^fiObg`B50nVcv^H>7K(h5IpFrR|O>b=>o&t0`kmCov zq`j5Ey@Vn)1_v%qdz6gDG^TTV=dZWx@cknB;XC*80hG$;$x6538a=K59xkxo$y|mN zQ~#1q3i?G|K08|e07=mv^b$AeYeS5qOW@8g47D9p_pY;`c|pP`P3r~-hEakO%USBp#xpbA zO01*>Nrmp!DU#AK2SQ4+YOnPO##~|X(^h}Cow;WI2!-_k!ag=lh{-HLg7A%OK2ry6 zQ_?Tut2agPlp_G z$pQc)r(~B*s6ME>kIV(%=w=7@1*pK?`hLP+B{=F-ry-K|BBVgvJ(^lY(T zdAfyVC8lhyZ?E{RZ?2nML@0hpB3XC?e=`4614pvSQ-6zY%*GWcPpNX#(z0Wv;fX0N zrxL0w;+)Av3D*;Te5~W=y^W^bXNnjfnofvn`k4!c<0EkI=qKxq{(hs;O6W`3Kbcsb zoS_xsAAaw9zxF-)&y*LJh*c;rQb{&G1`|GUCb;FC<&4f-g@?anw*Qe*s+4wYl!x^Di8)W7S`-W>2 zS$_r{q_r_XNYYkjl^fMTd{W5<))DfmkNvd91{`BE`v>rdcXU=uh$^$D6tZiy8fVN4q2z*xj_y)yU@U8Ipr08q=nx# zyLMQg`3QwSOe=YTFiP>XC#ENlSyQ9zz)(!pr0a! z5=22)hv0wSM;APLSJ#w6bqCyn#U)+U(=9yO$s$NGz+?+ae#_%7?D7PV3-1xv13 ze2j)eiG=&(4f?>$>bFAf02@0EXmr??evaPV>(T9(T<~d!9-HhR{u9iu+=o(aMGNbP#g@>hIB0^8o~%gt>ozUNe(X{qvlw=t#SR6_dM z27hAS2^u*K@&Q%VKamNXhm_kLwi(F#R>fo>^sc&(X#ks#oPm`_cMnV3U1yXb(aF16 zxONiZ({Q;R1zn<}M=;@H!bVM`a@0ZQm)opl6E{G@3mKW|J9 z=$&esfu7CP;H4`qZ&c?F73>J<8YC6cw}Mw(2U8T+AlSI}QyKj*KP)1qGM`W=$CzS; zJ=@XMyuygz<)a!!D2$p;;D22|b8(=pVoQ`>@nEN@Nr@{3sJ(dET(@TP2=Rg>LijQM zWG-$oI$6x;Iap}I8yMVmTCDWo?@Qgs%j`|Es+oQhA+tG=5M!f`>~b`mWd{P={`f>J zerCeL3Agju@q+ZDW+q7{Ous1~T@P`H(0QI?;mP+pF+ay3VzsP|F@cR~G9;lzHz+@8 z?}gD6n~S-~?J>PKO)B|9cu0?i6AU;inJN1-xC7c{Z&cYinQ*)+&O0F$e3p0>=qHR# zoQ-JP#*C2HE|u_{UwO)+1gDS)D^rr@)>c-xiz$gqCJY~Kx{ut7j~lyCWqMAwVI6~& z1p3itV;8zKRbo0enpUNc85>PKuntN$15Gu1WF^?cv3_S6l3Jz9X>?8PCmlNB<&NcH zaTAKT2*Dbrm2$tg+}`T%*Rdz!&R6MxL7q|?6gd@j_yYBT-V~C@h&oLu%y%d^jO2t7 zba*~^MZ-09QB#TUTvsyTdm83`?0YG@KPZZt z@G=UPuBMe85i*JsDK&p!Vz}+$Zw30s zoTJEO5kXJ+XNmkQ8L-PHxj&O3f-?BnDmbFUZybh&fy9yt4Si`VEBpbjdE z`-TT~W?;B)uyCiDz?u!B2ZqIvJjuYY-#th~!+*?0*O($SFft9LaoubejczEPTypb< zt0Dgym4r15g`49_$%xz{0T(TDRfM^K;Ga5Tc{xI!Q9XEjmL$vuIgK!5rYWWL_tQ6M z0l3I;|KyiEOu45b1P#V2)S)g`U~o{b!%dztleR-=s*zKz$QaJfV^yM(E@O>P<<6=(@_Bt-2 zf;+5?cHU^v?lg^QU(s6|@Le_S8d1@l$P*I+GtyoOf5kGT356R69bAkq>=b7frsST# zv1fZUAV)3AC7CC8C`|u|_9#iQo^EFr&6$ZDFCkhc4Bmz-3H| zQ!eBT$=%M|LI^0kBN*Fo=kqgcS zB`QJ-PFOI<_c4d#L^-iQ*QSo0);+fezBlwSb*~8}10TAM0wm4?>vyoHAu>4{mTU*0 zr|HzPlU11y6@`V5Vb_Gh{to=j91^oHiBcCjSa|W}UDIr*ju2mIN};_3UtT({n>*t6B|WNk4K#vYf-my9vESdUf~6Ll`eVu2hws5;YKBdy?-cIIB zvYf%Qttg3Yea5t+Ce-Tmvw^a6b*7z_e$TeMqjncfC`4cK?g}Asz0#=(>}_DnicC(L zDHf9HE*=GCAo)!3CPP=WF_o6v*6X+=@JE_L^7F%OcTy`8vmED$*!-d~D1E=e?Rhv; zWQJ@+zjCRB@|OF=<)6eh?Ey;V^iDPO(YYiRn|gkU8r@4RB&U5olLtVLnwTV+Wa2&f z$hn}C#$36&f9T|MmX&sNE3i^BVZ8@d-WMjdXO1QVvV|iAx~uJUMaWVFW}fuWn%DCX zFv9MiN9cK!MzU~&{^nA%tk&x9?-+@V3!iXuK>RlR?gwvwX2nXx?uVw6Ec~{9=4|MI z!$P=!K>N9_<2T&79{y={lPE=V=n#%&fIc4DHv z5NiFj(&3tEnm(q|kw$2Ku#LZ&CseNaCC~S!r|r~xJK0JG&Zzz^$%L^c9~~*2a9~-c zSI|UgaLMWo`>ES7wX&@98Yc__onM&3MrfRzNVwnO56lcJLMP#aCDw1(SM1JS-3qUW zilsC{b(8*Prk^wp8k@DpC?Xm4FzY9C&O%8?oOj5AD)(cB&B_*lP@>1M;~FtxM_1c( zn)PGs6n0n0<72MgeTrT*Tc>f2OCZE2f?C+yFeup#$`S{~4f!K%7$&h~1Xh;-k?X^S zu3{C34qiT9nVU_V6>Jx$nuQvf@=IujaB|o*euT;$B$W)I#~?!@)p?Cav9@uC7-fSx z;Me?@(Ag&GA9)g+YEw%lctr{)M8V{IP+*RxoH^AI@tCT_m7IsXx7!4$c3zEG>xOA1 zKO9<1@*{c2T3Nd@5)E6oSC_a z#XCjnz1RAhd)qskcA*xb^|@5Sc-?(s!YK+Q2&WXdIbhl)R|gVN*gHb5uxkZz;AeM; z4O4p&vpbRq=X>~*3EkS4+3*V5p6Xl9=Hbf5H5uUEoc4NdOA$ zenZ9euBtxS4R|Hg$t}Z_KEhQsk04ok%|%bie@_|klYjnDc*Nw-iG=1&DywXqd&AzW z3tD3PF;1q!3S`O$jFJ7=B@;HZBcr%}EPwCPjnF+#RUpIZbrCOno9+uHlQSPb3nuGa&Qvb_v?A`Z7@iB36A(1^u|`EU!56iSfs) zQPP;`)Evzfe4;)uPNm~RLs*#-#f%S4D5d%|4Ti<%H5Q-U8J}5vc8_KUcT|#&dSM_^ ztUxMtDiAtWUyKn59aR^v&*KoC6q2+MZb(elWErENhkFBr!Q-_Tai+zFxT>`Jr`;@0 zD8>G5|AITLE`53lE;MvoKJ)|L^kNmZ;X`Op_yRNyWy{Z9KZn`WG(^PILTMy3@6z9# zkKb8dn1@ox8{OQK;YvlD-o)mY-A@|_(YigV%Tar;eJgxylTE2EU$fAleKoE4xeJf7SY9hLZQ3vUvOcU(BH6aS7$3M zEpyopK)>O_`l*)g@y%!q5mT*8CCneWPfY7Xl^7-UJUJ;s8Vtv`FZ{W3G3Wp|s(mGy zP=6>NnR`|u(!q#Cn`Q^xrClRX&+;0vLcob0#}!PyM`*-0by@{n8YrQJX|m&91^2P} zFboRikA;WJgNQH;+4Pc`53=t~c05@)w0FPVvon9h(55uPSfjt0g*I3;CQ<5(GyAi- z3A-To-GH2_*4y^vFi=Nz14$_<~3F8l!)kX#HF=q&Xia@gq z$+;DpXpKxo;@l-~QN;|edHYOIxR^5DeFS8u29YH(y%>?Q;3pAmj@S*Lh@M7iq{Kg< zzomkq%;S?ibV^)aw(h}IqLO>IPbjR{{R^S)@aZNpVX|K{yGwW%>a?ub$~WyBQ&yxA z)@#-kAe=tDQnqLJ;3Jf>J>7x7%m(2-+#P^m|AB-~vyYYEk+Y99lKuA(?@Pu4U)fi~ z#|~VNctiwdDsL5V#uJ3!tKb6_rWO7h;X7_O+|LP9q`Pbso`T5BIs!w>VQf24+>cD@ z0XtGExnz=oi!((xoTlTyhgr&+)?>y$rxJ$Sd;EzDN9T7~nR2o3=9(Mbb`MUzP< z!I400_|RT2l{3i0vyHA@pG4(>Ql)vIPn-utEZ-XJCUQ%&Y(mqTdu}=T3bzR)UAmMG zmoy^}-o49hQhTvw>O8`|E0bJuRm;5Q?1^lwk+~gS`f^gT+2ha-ABgrpo=JHF60_Ub zTyu9sn%qrA^a$R8_l2`ylGooYW#pXG%I_J1G9%a<=LQCKx<`{WoK5y_P))B+&E6yH z3QYs9x&1VUwPymP?eA*ZINLciM&$Ng>n~V<=rRp}Y=1D~iY9 zC?!Z@eI09XI2YtX7=+vuPSFg4IBrU&#hq6^NaMLMbi|xUT}TJN7<0RGnM;5p7Gs)D zNI%ujTw-r1(zn>9g0#~8aBAWp1K9qBzr87RR0dqSGz0E4XJC;K-JuWosTb})`zbyX zqBLTPZ)@NFtnFIZDiW^Hq#=qkR+Eg%d`Qc5Zot5!#%gO3tu4u<+}GtJ7n@8TumKP% zZ~unY7oM2Bd7dscpomr#qBjOfB@g$4SDX*E&$g3=F-yBt!u!7a6qa7h6Z{22 zFH77~Kh~*{vib?YM$HwHOlUuqkId_CK1}1YusY)00qJMl0lZA_96d@Gk_hda_>(DD zQsb}&?4mC2yBQt#f}cBVQFeSs>;eTzh4li@hl>FusJyD>&a4|L64Qu$(p?CCUCzCe z2~%3{u=Q42LI%iN6Jtu4CY20);xfQ!u715OSF(ojN=FFE5^#QmMqfdt&I6@!b zL}}51z?^2DhKB);Y11#gX)Eo)Pq)c^+Ry@SWDj=9g!qGw`^eNXI)h`-&Oe(?#$Hrt z&`(1gAu2STF#ooGX6huBSp!-i?H-T-*PpPi0{sx$^%j4@YF;>vb?EB)?0AmKluIX> zx}`XrDLLEXylkByq1%NU$qoKl!GfdH#y3Y^^te=#g&(+2u0a+SZx?AxX~%2#n%1}! z)A1;guzlL04@^eFWUq~rf;44g8e3dgp7~nmQ18&34){(N6RYV2F$11c3Hdu6{>1Do zTqwpA44eEmV=sr!NCMUH0cK=xcgckCN+2*7-8XI|r*gS(Pg+FmhjjWHN#tGp>DsN= z7;Ls{P&-@<26N0I<=VIA{}`@)4G{KrXWs<~qat}nI~o`2ZRNd5I|plMQVLsSYA?c@ zG)*ZL_;LD%3kr=V42R@ymM9t*2OGQVN8a)7a4Mnx$bEA4>s-miL{D8|eWPs7;OD3!{enf{$04qWxmfhR`@_(OfDa{oH-xDs|^b zgS|U&A|IJ_Vi!Uh4o3(j4D64tXZ%X2ii1)+`DU6os?;u> z@PCNPb(hal2Vc?;13F@ka=ZN-@fG%ZZg-bN_%2@=8tR!5dTx+Za&RYj#kD|U9N6R} zpjHC5y?q%p2~~w3;xKe(Vs1qYaZV&z80Qa6K8r0{-nb?gf`*H52Pq~i0I_Eq_8#_= z?bI2;&WVKmb^gHY(|q>;e;#CSlR(g1C?r;~2g0cCCdq{B$MTWc{D8(w@*%bZn(G`! zgE|LzQT9-T_Zk#=(saNG5$;k+em-!YI6F`3@R>zjleY@)w&0)wt{+f+`;8`-B71y3 zViVsd6z=Q(1=9zYToAjn6C<1|vPAq|s?sXxnH4rMrRG$^{Jz6rTD!Ik7P_{R?I0(n zreiu8B@)Va;dd_ao|oY!hGhd44T?18mHO@h7Ur2k=2ml2g``xzX?N&Twr<(BY$bVG zwFps`Ib{^X%Bh5PoUXb>sYseF!)&fQ@Z767Ha!L3r>$u$o+&OOn$~Z^_28jnDmh{g zk?Cu99TJlgP)EslaxgHfC$Hf?sKmQwiaR?i2F`ex>45ig^n%n%7}weDXbfrWs>8 z5vTGE>F)BQPLy6>g1r&-FY`uRYDmAQDi;E}+7IW&2v6%Ut>ogf@Ez9y;`r%_K<>|y zBR)$cR-m*mV@YNzA*L@QjgWuP3zu}*2*cIa#Vb3n5A}WlN1(=SLkhH!6O>CPymtk~ zwfVyu-5GQ1#%HMt#sy#g=`0O3U10Jk_AA+5&zhkkRXuCB4)*`wy zJ?v@`>*zG4kbjoG;VhVaqToB##yBHh5$*Li^L`%@im0ZOOq}zlG*>h-Un)uvCJVE0 zSk9Os&8YrSMG3T())HYheo_s-y5{*1H&7m@=zk7{D2XdZOQs;V8c0?SWPWML4ipDYiwo| z`lteHN@2eQk8#0Dg1y$XaXAErDPK&V=2Sv)(}mIC5>9GVX6I|eUf#u zgySk^;7U5l#a-mWov@{`m0HgGFa^>w5thC#o6IG*{M(Gg&O~XCk=Q;S!e`i6bzO?L zw^Fr>#uR+g&;fkBsiNYqmVUJkA`xF)PZ zm|0~9J){TcQj@Q!9zv-kQy(Hz_{2GKM}pmFF`anlAyQ*}zd!@E>aCVFJxBBlO()#r z`kC2DedACHd>UwP9r`dS;pBg&7lb1ZUYF?CyHyPAl1y^&seI%NWJCbILWEGdA{1d$ z)K$y(ihg4k@;R$8NAwDxP_po*f5DkpVcfveB(3zuUME-Lm`ay)!gm*8(HV#7`~sie zw&}QqE3305N}v|GFCeXY+9$~PK>&S}8pqoU-WlRO`N-Ljy&Db&Kszev{y6rsYnEQQ zAd?aL6Q%J@jlZRxx7A)q-@7@Ej9Fw>aAPn-oH_U(MeI-gzs3iHG1}D;IP~reTK9RM z6iG9fqgvOclT!XVohu+5=}b71%<3sAHe|0t2U72_v@7#v##!|#rYmbgPp&TQ1X-+kgj z&Nb>3{7VgiP#Wn=5@9{WG~PuvAmV#C)zp!oo!$c8x3>#LSit*wwa~kVIjr>D;jI-m zAEe{eh3z$63q=_@UR^TZxDx!ADqHjhzsMyYy_JpKaYyV!81@B$??2gqSp(Z%CKnMQ z42v)%OE-$X<5roZ8(I)C6^zvLCH678fj3ZV(#@7#14kIBgQSv?4}w?BKh>?f@wVB; zB|X7LpSJ{PiY-VwQza3WfG}+~2ZZNFpEMW0kR>V&1b^66Q6v~d_S8qjVbeT9wqa6i zlP7sit^#`xl5DMNt#k|c))P7 zjG3f0q2%PI4>ZWRS%f8`Pr1RWA2+o@*To48zFflp&JF^CqnRz^rV!Hu)1lW&j}Ts( zPDtO=&&t@xIbu0Qt!97fQa;p>{vL;~5Lh%UbVR5jlUQ=_fqBWRt0K=ZZqDQTKx^>!L$Yt@t$uerc(q&W2x_1{Y z=llQ~bg|AlvSX!7B{V;9pIlQf&H7WTdSs4@E$zf^5bp;?oR0A1^HrU)Qb7yw34q+go@vBz82}|MzXpzOO_(6Ldc%j zZt1?QKV+WCV%Yg24w>83l9zk-t<(}<$V6us)PP1Z4;u(A>Wq|4svfU{D@1#}?T(|^ z{fM&w|Aot4I8=gE7O5BszKc!QmvF70KNg zJs7wU6R9mN9gl;iU4+GqN2Kwc0)I2>>gvpthJGPi00LG}wWC`sJ(^7J+`M&*%ISHr zy>IVqi{Pa+!h41)5IS z-_p;VgC`EO&~Ub2&p4w*6qC{j(Yy3FlVl8}PbR)f8`B#b_8ax5-Nu#~>_8f2Y>;Ha z`KEkyWdkDA)2#;GQ0mU&`0bee#=5xE8p4R}m^7tuewMy*jYa{EC zV%GO+A9iZE^_pD76x$_}EWCw-xli1i5%UY^vX?nVC}=K~kp0koa#bv(de4Ly(rC1# z{T9KN$e+R#F{a;2I$zE5nTeMPv4(RKd`u#>Cy~^YnxIUiy{oqkqx8{xmrEvD_ma`ij~4Kvcy`_zLwy~co4OVa^h$B=bPOMGrUVB`S`$n;%wwyc)y-nV)q4N z^_~lGsW$Z=vGyS^Y>LN-kSpYM9T=hmCD~Un{W|LsjO3$+uOt(q>++FHMh^c|qM6I> z4WypqPF#3yP~rU1a|OX6gl0Am5l7E6$t5p0GOsyLb6~(CHkn$OEAXJrWvDaQ-F<-! zNpi{11I>`U<_v`^BwCm8yag?%kGLJ2OMfEpZBZ=72?lHSM&kyYENPmdzfI@(QCz#_ zKqR9#Q-*2BumT3(rr|s4SkjuNC-v%9(FSr%PeL-u!~2v6e9TqS^2FD-_ymD?HJLW! z^jPeYkPcP7$W9a_533@0&DnW~xCLGtCV_=Kd2d4M*k1dTLfjyC@l2K?v`?E_a>UI~ zIl{LNmh&{DXNP$+OHWxy9r65%7fkH}%xI@`cYgdVQ*yuf_%^FOL}=xdMyRjT-^@yfA#^{R zR==>A()yGAdnm>@bvv)beT%g*d6SruM<{WcPT1em&#v4P^Am2{lU|40T_%`k<+;~hPScSQagUT3Q;{W>#Db*4<}Mp{V7736Cm_!hRXCeo z=*~~OBP&>~dd{n9?$X0lwl+(oQek3YJB?#~(mA;bFQz|+4IH61>;zph26G98;f+U7 z&M1NdfhFou?_DJ?r0ELAd`ZvGrW3l0q|Q2|@Zecph8J<|}llK#dyi{WzbeIt!aOy5Omh2zyZii(U4YH~nJ9#NzzAGz^W zpN`}|e74~@4d)*#DN7a^ha?x~^R#tD9^ZtWMCX864(9a)gm zyXQP8j8hqrTB4-dRFZ|ufka)A@nt&^U&-b!4Ksy~=|n+V;kz(H*UE9J7Wg8vEE$|1 z-QCs|$b4F@UtaV%ID{7@;^|FyP?8iURifZekF7#fkDS#_2N0Xx$n8I~HjOJgQn|E} zowr=1`F=WwasC7!efnz9M2E~>CE7+|Vxj&aF7TdlCz5w5y0?#vR;=tn}$bE z3*=JYGQBFMK$1>qZ;Ym8#UGn*2x!ShytBSta=R)e8~G-YkiYwt?4V2sJ19Jq!f0G+ zk@t7%{Z>Zw#}rx83G1mRfJx@t`#+{0a+YIKjBo7a!v>U;#v~Hlx3HE-1Ip2O3^s-W zD#U%ov~PRjNGeGrR2OK}1B2^oW@?%R`)QY{ya+9^90y4R`kH8?I4?WEN*<+Hz&kX>O0Cxt%S|oeDH}M$+8L(%h{; zb9W@o-7L+$3N-gd(%j3^d|rX(^N}>4TbkPy#tqUG(#-gAL#Srl+`e)2af37?X)@#H z_Kl;D8>AUYlNmR+ZybHxAk9dc%(%II;M;|vxGm<7VZf@T=`nW-w zku;fcbNj~8#|_eqq{)q&`$rz0w{P4ZNpn9tZoa5M^TkM-FNo%np9nS(wqqNyE$!*Y z62FgpN})V8>7l@I&i^j2GL@`4Z7M;AWu$11MnML{v(UI7-0HV)Z#AD|+4ZM?_0jNU z7<_iEYjea|2f|>!_dHt70sZ{%T>IYlP^1&&uh;Ec-7>=EvJhFI6nl)K_rVZ?)xBx; z-#%RZ!=i}J8IBjh2WZOh%KBgnu0IC7#P(K-?vNDurOjsM?EHgjxn>+ieWmeyqmj8I zxnh0=Ns(V7d%mfMiuq+6MLkKMa(i&URjnpGR)F5@)46Js@5<MfO71@ugRZ9w{_^)gY$Z}|ErE1O{k|Ljg=kvz?rgh=0INBA;W8)6tHC)nV zvRx5dp%nX-CgO|lSs_)iMg%EE=8Hc}rmG@5Bt<^qHiB%XE7pfXDfUTuVb#NmBgbPY z`payyG*wb@u5mz$`wH6cb}hoKp}8xL z`4mj?FZx$&+SuWC$d}b*OCD7DUfOMEX61_W1>-2{_i=BK={F_Yer1y}!6@b_y6)6P zNeyeHV$G*uihmlfcG}pp$;$JIYIPpMDaW74gcrSE4H_tl_);r-^tEF9F^;01Xti74 zHoDdWq@v7HD8)XFNUs#(t6R^wl~t_g5KcKxx@b(9D@ZEJMUSQEFT>|DbIP@%Ty#Jw zE}gS9xLZ4oGoNb?f_U`8lHEh)ls0{}tTfG{_vOtvF8zQh0fT`^~ByW+@ED8+t>!ucBDiesH|6!mnk(O;7RX}~Lv#}H0Au#m-mK)nmc z)^27{PF53v7EpOkAW+d7Rz#*86>DFi6#L~qLVjB3fr_Kk0V(bo?3Tc51)`vy(QF@9 zs~Ur+EHAtByWz}PHTQf1S#eKb$Aylx9!HHUlw!Z)PNx~@ilbDJ6#3+Sk6d;#7pPX8 zA3T<#zw#U*ka0G3K(UZckw^mvmVZ`0!)dL;CCmmcrY<9&MkIz2w5 z$8~yqOpj0LQKQE=JwBtyEqdIh$6b2dqsM)Ed_j-jpvRBs@muuxF+C>e@sJ)<^q8i{ zm-Ki{kKdukPv|j6k9m45(&MM}SfHa&hpk1jp>^cc`%pB~TY@hv_66g~blJ^lG zkH0{VzetbYr^jES$6uz$kRE@99)Fb{e~li0ogRNck3Xcx-%F3bL61M8$KOYfze$gO zfFA!KJ^mqj{KNG4N9gg7(&Hba$3ISwe}W$WBt8Bqdi>M$_-E+x&(hG2=Y<3Faye?pJ{lpg;XJ^pig{1^22FX{1L(c{0S$A3eQKc>fjOOOAK9{)W( z{s(&ekM#JT=I0pTl9E` z9zUSRyY%=WJ>I9s2lV)m9v{);V|si-j~YF0(Bm_D+@!~CdfcJMJ$igjk1y!)fF3`h z$8XZ($MpDZdOW1ZBt53-@rWLe=`ll(pU`8L9`p2ApvOc<4@9~PLB+k9^3S2(&Oj!*rmrFJ=*l>(4$L_9z6#1ct(%s^f;i$ zpQ6X#Lytd$$KdCG7EkJGe~w=Ld3yW>di+It{60PY5g%(@2WmDCSxk5VFqSm zHs)X+=3^liVF{LEIaXj5R%0#JVFNZ|GqzwGwqqxDVGs6VKMvp!4&x|};RH_NG|u20 z&f_93;R>$eI&R<=ZsRWQ;Q=1vF`nQVp5rB6;SJv6JwD(QKI1FC;Rk-=H~t`C%)bOe z5ClbVgg_{SMp%SH1Vlt+L_st}M@+;*9K=O@BtRl0Mp7h03Zz78q(M5QM@D2q7GytN0D~|XLoo~^FcPCN2IDXu6EO)>Fcs4=1G6w2 zbN|w%)x5tN!d0fCHT*g&g!wuZTZQQ{<+{Z&a!V^5jbG*PSyvAF+!v}oCXMDjoe8*4x!XE^P z^_M^hjGzdH5D1CT2!n74kBEqbD2R&ah=Ev$jkt)11W1U)NP=WYj+97+G)Rl|$bd}9 zjI79p9LR~>$b)>ykAf(KA}EUDD1lNajj||*3aE(6sDf&!j+&^2I;e~KXn;m&jHYOY z7HEmqXoGfWkB;bs&gg=!=!PEXiQf1RebEmCFc5<=1j8^KBQXkNFc#x60h2HpQ!x!Q zFcY&e2lFr=3$X}GuoTO&0;{kZYq1U+uo0WF1>3M4JFyFUuowGr0EciGM{x`%a1y6+ z2Ip`d7jX$!a23~a1GjJ+cX1C7@DPvj1kdmsFYyX*@D}g!0iW<0U-1n;@DsoB2LWUM zB@lujD1svdLLoH5A{-(hA|fLSq9HnBA{OExF5)8r5+N~?A{kO3B~l{|(jh%EA``M8 zE3zX8av?YJA|DE%APS=hilI14q7=%YEXtz-Dxor}q8e(TCTgP&>Y+Xwq7j;)DVn1N zTA?-Cq8&P*BmO~W{EM#WjvnZR-spqA=#K#yguxh!VHkmt7>zL)hw+$*NtlAEn2s5k zh1r;kd02pjSd1lDhUHj^Rak?ySdR_Zgw5EBZPVATeyR}xQ_>TgvWS_XLx~^c#SuBhxho1Pxykb_>Ld=h2IDe=Pv;f z7(oyW!4VRn5C&lp9uW`;kr5Tq5Cbt08*va1@sSXTkOWDQ94U|rsgV}xkO3Ky8Cj4G z*^v{ukOz5@9|cedg;5m6Py!`U8f8!pc0;NzIWl;_lP!W|;1=Ua;HBk$7P#5*l0FBTXP0RyhG95HVid+;EXHF3CSfwBVj5;(CT3#} z=3zb-ViA^LDVAdeR$(>PVjVVMBQ|3TwqZMVVi)#cFZSaA4&gA4;uucgBu?WD&fz>R z;u5alDz4)OZs9iW;vOF0As*uip5ZxO;uYTDE#Bh;KH)RI;v0V8Cw}7(0>=AGAOt~B z1V;#jLTH3VI7C21L`D=uLv+MMEW|-v#76=oLSiIEGNeFCq(&N~LwaOHCS*ZYWJeC< zLT=&)J7fDLwz(vBQ!x%G)D`xLTj`| zJ9I!t{DaQ;7hTaEJ8+))1`*9G5a0Ewj94BxJr*RhNZ~+%_ z8CP%(*KrfKa0hpB9}n;dkMR`G@B%OK8gK9p@9`0z@C9G-9Y633zY!q*Ujia9f*=@z zBP2p048kHjA|MhXBPyaH24W&M;vgR4BOwwY36df?QXmylBQ4S)12Q5rvLG9>BPVhp z5Aq^E3ZM`QqbQ1@1WKYb%Ag#|qarGy3aX+yYM>Tsqb};90UDw)nxGk)qa|9Q4cekT zI-nE&K^OdsZs?Al=!O5#2mR0=12G6gFciZv0;4b*V=)dBFcFh61=BDcGcgNuFcf);Kk*BH5Fo){0wFMhA{as- zBtjz$!XZ2&A`+q?DxxC>Vj(u-A|4VTArd1Ak|8-#A{EjgEz%5_!emUvG|a$E%*Gtd!+b2n zA}qmDEXNA0!fLF=I&8p3Y{nLB!*=Y%F6_Zx?8gBd!eJc6F`U3joW>cP!+Bi9C0xN( zT*nRE!fo8eJv_ieJjN3|!*jgEE4;y5yvGN8!e@NNH~hd){Kg*yO!${T2!fypjt~fi z&GBt>$hKq{n0TBJh;WJG3UK{jMZPUJ!!cO|3;&@H`k_AtVi1O4D28JMMqxC@VjL!5A|_)BreQi}Vix9LF6Lta7GW`# zVi{IoC01h%)?qz1ViUGtE4E_?c40U6Vjm9RAP(aQj^Q{?;uOx{EY9NsF5xn+;u>z? zCT`;n?%_Tj;t`(UDW2m6Ug0&~;vGKVBR=B`zTrE5;uroPK;pjyLSO_%FoZxzghm*I zLwH0)Bt$_}L`Mw7LTtoEJS0FuBt{Y>Lvo})JFp}LSr;VGqgZUv_>1WLwj^YCv-*^ zbVWDxKu`3>f9Q*T7=VEoj3F3?;TVZg7=y7Gj|rHB$(V|1n1Pv?jX9Wy`B;cWSc0Wk zjulvi)mV#l*no}Lj4jxP?bwN3*n_>;j{`V_!#Ij#IDwNmjWalh^SFphxPq&=jvKgz z+qjE+cz}m^j3;=8=Xi-%c!Rfij}Q2S&-jXO_<^7JjXwyOfti^h4z$R?QR&2u#?8I*D!9MKAK^(#n9K~^*z$u)@S)9WKT*PHu!8KgRP29pA z+{Jx7z#}}yQ#`|qzjSH!@~_UcUQ2KB4j=FlpYa9X@Et$#3x5zG>0bgNFoGf&LLekU zBMibJJR%|zq97`wBL-q2HsT^45+ETGBMFirIZ`4O(jYC;BLgxaGqNHZav&#iBMYy&_qX8PBF`A+oTA(FbqYc`jJvyQj zI-?7^q8oakCwk*Q^hG}mz(5Sf5Ddd`jKnC6!B~vP1WdwYOvN9L&RfEW{!# z!BQ;83ar9vti?KPz(#Dw7Hq?I?8GkY!Cvgg0UW|%9K|u5z)76O8Jxp;T*M_@!Bt$x z4cx+Q+{HaSz(YL76FkFnyu>TK!CSn?2YkY3e8o5Xz)$?f9|TPHmp}-Dpa_l-2!+rH zi*Sg5h=`0Rh=%BhiCBn(xQLGgNQA^lieyNElt_&ifX8Vny8IBsE7J!h(>6Frf7~9Xoc2ji+1RMj`#8J9L8fJCSeMuVmfAE7G`5E=3xOAVlkFr z8J1%uR$&d+Vm&rs6E1OLKuWa zctk)XL`GCZLkz@3Y{Wr4#79CTLJ}lJa-={iq()k#Lk46-W@JG&WJgZqLLTHreiT3< z6h=`LLkW~bX_P@Zlt)EWLY2RCX;t;FR)OkLP1Hgi)J1(XKqE9pQ#3;hv_xyPK|8cZ zM|47GbU{~iLl5*sZ~TY8=!XFqh`|_wVHl2)7=T*o8gVi~Tr&LpY41IEE8AiPJcPb2yKSxP&XX zitD(6Teyw8xQ7RLh{t$>XLyd6c!f83i}(0|Pxy?l_=X?&iQo8xfGPeG2tg1O!4U$X z5E@|-4iOL$kr4&a5FIfQ3vmz^@sR+DkQhmk3@MNjsgVZhkRBP430aU8*^vXekQ;fC z4+T&Vg;4~>P#h&u3T03hC&g4js@D z|DZGeMOSo35A;HB^g&#|fOmX`ID5T);(K#uZ${ zb=<@)+`(Pk#{)dVV?4z(yueGm#v8oDdwj$ve8E?I#}E9%Zv;sBmw*V2AP9!w2#HV# zgRlsX2#AEph>B>4ftZMmIEaV%NQgv8f}}`}6i9{CNQ-pHfQ-nDEXaoJ$cbFYgS^O( z0w{#SD2iezfs!bVGAM`gsEA6af~u&F8mNWZsEc}NfQD#{CTND{Xo*&6gSKdo4(Nn` z&;|dZ8@i(>df`9xK|l1zKn%hV48?Gaz$lEySd7C2OvGeN!8AN9!7&`iNu0tNoW*%uz$IM9Rb0aj z+{A6%!9Co^Lp;J0JjHXoz$?7QTfD;ue8gvb!8d%zPyE6k1W5IlKnRSW2!;>{iO>jx za0rixh=eGJis*=eScr|dh=&A7h{Q;OWJr#bNQE>=i}c8VOvsF^$c7xqiQLG8e8`W2 zD1;&?isC4NQYekGD2EEDh{~vfYN(EysD(PHi~4AQMre$tXoePOiPmU?c4&`|=!DLH z>C&ppUoD$mrS9l~Ug(WJ=!^asfI%3Hp%{h{7>UssgK-#-iI{{bn2PC`fmxW1xtNCq zSct_~f@N5al~{!}Sc~=8fKAwpt=NVg*oocPgMHYKgE)jEIEv#qfm1k*vp9zfxQNTR zf@`>ro4AELxQqLEfJbeSsgN3Jkq#M<5t)$%*^nJMkqdc{ z7x_^Dg-{qpQ4A$e5~WcF*Gbh0z#`ahQOKn2afyhUu7zS(t;ln2!Zm zgvD5jWmtigSdBGUhxOQqP1u61*p408h27YTeK>%FIE*7WhT}MiQ#gaOIFAdsgv+>! zYq)`%xQ#owhx>SlM|gs#c#ao%h1YnCcldyh_>3?3hVS@^U-*LnY5o!jfe{qJ5CS0) z8etF);Smv$5Cu^Y9Wf9Ku@M*XkN^ph7)g)}$&nJNkOpay9vP4cnUNLQkOMi98+niq z`B4ysPy|I$93@Z+rBN2;PyrQD8C6gX)ln0*PzQBU9}Un5jnNd%&;l*d8g0-H?a>jP z&>3CO72VJSJ<%Kgp)dMj00v?(hF}MZw7yU5+gD@CFF$^Ox5~DE&<1ii*F$q&J71J>TvoITTF%Ju{5R0({ z%di|Pu?lOj7VEJAo3I&Mu?;)06T7ho`>-DeaR^6n6vuG_r*Il)aSj)75tnfV*Ki#- zaSL~F7x(c1kMI~z@eD8U60h+F@9-WU@d;n>72oj#zwjFY()}eM0wV~5Avi)J6v7}Z z!XpAAAu^&O8e$+OVj~XXAwCi!5t1M&k|PCDAvMw>9Wwl7Qh)#f19+`6N|})b*^nJM zkqdc{7x_^Dg-{qpQ4A$e5~WcF*Gbh0z#`ahQOKn2afyhUu7zS(t;l zn2!ZmgvD5jWmtigSdBGUhxOQqP1u61*p408h27YTeK>%FIE*7WhT}MiQ#gaOIFAds zgv+>!Yq)`%xQ#owhx>SlM|gs#c#ao%h1YnCcldyh_>3?3hVS@^U-*Ln>HiW4fe{qJ z5CS0)8etF);Smv$5Cu^Y9Wf9Ku@M*XkN^ph7)g)}$&nJNkOpay9vP4cnUNLQkOMi9 z8+niq`B4ysPy|I$93@Z+rBN2;PyrQD8C6gX)ln0*PzQBU9}Un5jnNd%&;l*d8g0-H z?a>jP&>3CO72VJSJ<%Kgp)dMj00v?(hF}MZw7yU5+gD@CFF$^Ox5~DE&<1ii*F$q&J71J>TvoITTF%Ju{ z5R0({%di|Pu?lOj7VEJAo3I&Mu?;)06T7ho`>-DeaR^6n6vuG_r*Il)aSj)75tnfV z*Ki#-aSL~F7x(c1kMI~z@eD8U60h+F@9-WU@d;n>72oj#zwjFYGX5nX0wV~5Avi)J z6v7}Z!XpAAAu^&O8e$+OVj~XXAwCi!5t1M&k|PCDAvMw>9Wo#zG9wGJAvp)iV~7)qcdN}~+Qp*$+05~`pos-p&Kp*HHG9vYw_8lwrCp*dQj722RJ+M@$H z;U9FtzvzbU=!stV4}H)N{V@=OFa$#}93wCaqcIlaFaZ-W8B;I~(=ijXFb8un9}BPu zi?I~TumUTw8f&l)>#-4=umxMO9XqfKyRjGhZ~zB!7)Njn$8i#;a0X{_9v5&4mvI%> za054S8+ULI_wf*q@B~ls953(+ukjY|@Btt38DH=X-|-W_@CN}h{Us0rBPfC)1VSP- z!XO;NBO)Rp3Zf!9Vjvb`BQD}00TLoHk{}t9BPCKH4bmb#G9VK&BP+5Y2XZ1e@*p4b zqaX^Q2#TUON}v=!81I^OT5Axyv2Kbz$bjhSA4?{{KRkkLBPy^34|aBir@%=Pza5% z2!{xWh{%Y7Xo!xOh=n+ai}*-@L`aOJNQM+hiPT7gbV!ek$b>A&itNaNT*!^Q$cF+b zh{7m>VknN1D1|a8i}I*|N~nygsD>J-iQ1@xdZ>?vXoMzcisop6R%ng3Xon8yh=0%- z|Dr3pqX&ASH~OG2`eOhFVK9bb7)D?uMq>=dVLT>c5~g4(reg+XVK(Ms9u{CB7GnvP zVL4V}71m%a)?))UVKcU38+KqPc4H6rVLuMy5RTv|j^hMQ;WWO z7Vh9K?&AR-;W3`#8D8KeUgHhk;XOX$6TaXpzT*de;Wq+g`Aa|qMi2x;aD+rCgh5z@ zM+8JdWJEs`k){BV;}}$2!>)fMqm_1V=TsD0w!WIreGSTVBFV=wmM01o0Xj^G%M<0MYu49?;_F5nU_<0`J<25#au z?%*Eo;~^g537+CPUf>m8<1OCd13uz2zTg|a<0pRM4+3QUOCSVBPy|B=ghXhBK{$j* zL_|UqL`8JOKrF;YT*N~HBt&8)K{6yqN~A&>q(ypUKqh2HR%AmCs} z6h(2AKq-_)S(HNsR77P|K{ZrIP1Hgi)J1(XKqE9pQ#3;hv_xyPK|8cZM|47GbU{~i zLl5*sZ~TY8=!XFqh`|_wVHl2)7=T*o8gVi~Tr&LpY41IEE8AiPJcPb2yKSf9cZd(qCPDU6HQg zI&R_??%*!&;{hJwF`nWXUf?BO;|<>7JwDHv(k)OF#rh5ClVTghVKW zL0E)G1Vln)L`5{jKup9&9K=I>Bt#-4K~f|~3Zz16q(wSpKt^On7Gy(qo4b(zy)I~isKtnV}6Es6}v_vbkL0hy(2Xw+e z=z@RI4c*Zbz3?CUpdb2UAO>LwhGIBIU=&7UEXH91CSo$CU>c@lCT3v{=3+h;U=bE$ zDVAXcR$?{QU>(+DBQ{|RwqiSWU>9~{FZSU84&pG5;24hMBu?QB&f+{S;1Vw5Dz4!M zZsIoX;2!SdAs*ogp5i%P;1youE#Bb+KH@XJ;2XZ&Der%*p8jpg+17d{WyR_IEh7&l6(>Q~3IFF0Cge$m;>$rhi zxQ)BGhX;6w$9RHgc#fBNg*SMM_xONM_>8akh9CHe-}r-oIsOs|K@b$d5dxtQ8etI* z5fBlP5e3l@9WfCLaS#{rkpPL17)g-~DUcGWkp}6I9vP7dS&$XkkpsDq8+nlr1yB%$ zQ3SvVsOvEHi!BkAg49vo8%*8w`z(Op>5-h`V zti&p;!CI`x25iD+Y{fS0z)tMO9_+(@9K<0U!BHH?37o=doW(g@z(rif6385B$P!1jzZ9fC!8r2!`MYiBJfGun3O` zh=j<9ifD*|n23!yh==${h(t(&q)3hwNQKl$i*(3QbD2MW>h)Sq}s;G_{sD;|7i+X5)hG>i?Xolu!iB@QXwrGzI=!AdJ1^=QO zx}zt0;Xm|2KlH~y48jl$#c+(kD2&EfjKc&>#AHmtG)%`#%)%VZ#e6KlA}q#IEW-+{ z#A>X;I;_V=Y{C|7#dhq#F6_o$?85;Z#917bJi-$^#dEyCE4;>Ayu$~4#AkfLH+;uW{K6ju$n}>%2#lZzh7bse&h>f_2hXhE7#7Kf8B;M0GcXggF$eQ79}BSvORyBnu>z~G z8f&o*8?X_Zu?5?(9XqiLd$1S#aR7&K7)NmoCvXy{aR%pb9v5*5S8x^AaRaw-8+UOJ z5AYC=@dVHC953+-Z}1lH@d2Ok8DH@YKkyU3@dp8O|0NKDASi+(1VSM+!Xg|ZAR;0o z3Zfx8Vj>peATHt~0TLlGk|G&WASF^G4bmY!G9nYQAS<#X2XY}d@**D!pdbpP2#TRN zN}?3Xpe)Lx0xF?0s-hZdpeAag4(g#k8ln-JpedT81zMps+M*pgpdDtgh)I}&shEx#n1$Jxi+Napg;5u^#kr`Q#4cU%(QhY6U7$(Vv^n2wp4g*lju`B;EOSd67uh80+e)mVdd zSdWd^ge};L?bv}`*p0o|hXXi>!#ILtIF6Gzg)=yd^SFRZxQwf~h8wtv+qi>!xQ~Z; zgeQ24=Xilvc#XGshY$FO&-j9G_>Q0Wg+B<8_b-7E7(o#XArKOw5eDH99uW}I8Cj7HIgk^%kq7yZ9|cheMNkyQQ39n< z8f8%q6;KhCQ3cgd9W_x4bx;@e(EyFm7){X(EzlCJ(FX0%9v#sMozVqd(G5M&6TR^t z`l25OU?2u#2!>%eMq(7kU@XRC0w!THreYdqU?yf`4(4G#7Ge>WU@4Yk1y*4-)?ytt zU?VnT3$|f9c48OyU@!LL01n|Wj^Y?j;3Q7t49?*^F5(id;3}@;25#Xt?&2OE;2|F4 z37+9OUg8zr;4R+c13uw1zTz8x;3t0L4+7@7M zL@dNXT*OBLBtl{&MKYv7N~A^_q(gdSL?&cGR%AyG(26hm>8L@AU( zS(HZwR6=D`MK#nwP1Hsm)I)tVL?bjoQ#3~lv_fmNMLTprNBo1%_!nK#9X-$sz0n7K z(H{da2!k;c!!QCPF&bkq4&yNqlQ0ESFȽ$rm7^RNI5u^3CR49l?+tFQ)Zu^t<+ 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

    9j*L$^~! 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 D@eHP= literal 2450517 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

      )BiVE++ce@LhV^C#)0xqj(=- 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Ƚ$rm7^RNI5u^3CR49l?+ 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Ƚ$rm7^RNI5u^3CR49l?+tFQ)Z zu^t<+37fGM+pq&Wu^W4^5BqTthj0W(aU3Ub3a4=v=WqcRaT!-|4cBoKw{Qn{aUT!x z2#@g;&+q~-@d~f;7Vq!@AMqJq@D1Pb6Tk2W0Sf;m5CS78f*}M#A~eDv9Ks_aA|VQ* zB06Fq7XCpT{EK*qkAz5sBuI+nNP$#HjkHLI49JMg$bxLhj-1GaJjjduD1bsJjG`!p z5-5q%D1&k+kBX>-DyWL;sDWCjjk>6Z255-JXo6;Fj+SVJHfW3X=zvb>jIQX09_WeQ z=!1UfkAWD3AsC9`7=ck3jje@BLqSrG{PbrA|N6nBMPD+ zI$|OgVj~XXA|4VTArd1Ak|8-#A{EjgEz%RyhG95HVid+;EXHF3CSfwBVj5;(CT3#}=3zb-ViA^LDVAdeR$(>PVjVVM zBQ|3TwqZMVVi)#cFZSaA4&gA4;uucgBu?WD&fz>R;u5alDz4)OZs9iW;vOF0As*ui zp5ZxO;y=8`8@$7Ne8eYw!B>385B$P!1StBKfC!8r2!`MYiBJfGun3O`h=j<9ifD*| znD_^=@h{>cJ`x}i5+f;+Aq7$*HPRp*(jy}>Aq%o1J8~cwaw9MDp#Tb^Fp8iUilZb- zp$y8RJSw0PDx)f@p$2NAHtL`r>Z2hVp$VFzIa;6VI%Z%NW@9eqVF4CmF_vH%mSZJWVGY(|JvLwy zHe)NcVFz|%H}+s3_TwN9;Ruf6I8NXcPU9@j;Q}t=GOpknuHzYkP(@Y1=)}tIgtx_kQez;0EJK(MNteTP!gq4 z2IWv56;TOQP!-it1GP{abx{uu&=8H$1kKPKEzt^X&=&2{0iDnpUC|9a&=bAU2mR0= z12G6gFciZv0;4b*V=)dBFcFh61=BDcGcgNuFcLvo})JFp}LSr;VGqgZUv_>1WLwj^YCv-tqbVm>LLT~g%KMcS? z48{-)!*GnmD2%~ajK>5_!emUvG|a$E%*Gtd!+b2nA}qmDEXNA0!fLF=I&8p3Y{nLB z!*=Y%F6_Zx?8gBd!eJc6F`U3joW>cP!+Bi9C0xN(T*nRE!fo8eJv_ieJjN3|!*jgE ze|U{Ic!&4+h)?)}ulSB1_=VpHP~tBE5g0)b48ai+p%4aP5gri`36T*M(GUYM@eg9- zU&KXxBtRl0Mp7h03Zz78q(M5QM@D2q7GybFvl}yf5K0uHqVQ;3jV44({PT9^w(6;3=Nt z1^&Y;yun+%#|M1EXMDvs{J>BA#vcSM^_M^hf}jYF5D10P2#autfQX2UD2RsWh>2K; zjW~#lcu0VRNQ@*%hU7?zR7iugNRJH2gv`i_Y{-F}$c;S6hx{mrLMVcwD2@^+h0-XC za;SicsEjJ8hU%z^TBw7%sE-C{gvMx!W@v$yXpJ^#hxX`*PUwQJ=#C!fh2H3kei(p( z7>pqphT#~AQ5b`<7>@~p46IE^znhx53IOSpooxQ-jRh15+Wliq9F!i;vdAu zzle+YNPt90jHF106iA8GNP~1pkBrEKEXa!N$bnqQjl9T*0w{>WD1u@rj*=*aGAN7k zsDMhSjH;-H8mNidsDpZ_kA`T3CTNQ0Xn|H}jkaiq4(N!^=z?zOj-Kd+KIn`77=S?- zjG-8Y5g3Wl7=v*bkBOLsDVU1sn1NZCjk%bI1z3p1Sb}9(j+I!2HCT)F*nmygjIG#) z9oUK8*n@r8kApabBRGoVIDu0*jk7q13%H2OxPoiAj+?lJJGhJccz{QEjHh^p7kG(R zc#XGshY$FO&-j9G_>Q0Wg+B;T<}ZN|7(o#XArKOw5eDH99uW}MLJ|aMr1}7WJ7l3L@wk(UgSps6hdJXMKP2>Nt8wzltXz` zL?u)~Ra8d})Ix34MLje?Lo`McG(&T=L@TsGTeL?9bV6rzMK|<7PxM9~^h19P#2^g8 zPz=WijKXM)#W+mBL`=pMOv7}{#4OCgT+GJ;EW%r9K&&(#3`J?S)9iOT*75s#Wmc(P29#E+{1l5#3MYxQ#{8D{D)U~ zgSU8(5BP-7_=<1%fuHz|KL}X%FM$vQK@l7w5DK9Y7U2*95fK?t5Dn206R{8*aS#{r zkN^ph7)g)}$&nJNkOpay9vP4cnUNLQkOMi98+niq`B4ysPy|I$93@Z+rBN2;PyrQD z8C6gX)ln0*PzQBU9}Un5jnNd%&;l*d8g0-H?a>jP&;?!59X-$sz0nu_FaQHF7(*}& z!!Z)0Fa~2W9uqJLlQ9+3Fat9&8*?xZ^RW<%umnr794oL2tFadAumKyf8C$Ro+p!b7 zum^jw9|v#1OLKuWactk)XL`GCZLkz^kKZuQg5f|~1 z0Ev(oNs$aGkP@kp2I-I<8IcKDkQLdH1G$hJd65qVP!NSt1jSGsB~c1xP!{D;0hLf0 zRZ$H!P!qLL2lY@N4bccq&=k$l0MjcJ<$t&&=>tN0D~|XLoo~^ zFcPCN2IDXu6EO)>Fcs4=1G6w2b1@GKun>!}1k11-E3pb|uommF0h_QHTd@s0uoJtn z2m7!e2XP2Ta1_UJ0;g~qXK@Y}a1obr1=nyLH*pJha2NOS0FUq(Pw@;d@Di`^8gKCq zAMg>M@de-T9Y664e-NPjUjiX8f+83~AS6N~48kEiA|eu^AS$9G24dkK#KFIahxkZ{ zL`Z_9NRAXph15ukbjW~=$c!w=hV00RT*!mG$d3Xjgu*C_Vkm)uY=#4(;hyECdK^TIe7>*Gb zh0z#`ahQOKn2afyhUu7zS(t;ln2!ZmgvD5jWmtigSdBGUhxOQqP1u61*p408h27YT zeK>%FIE*7WhT}MiQ#gaOIFAdsgv+>!Yq)`%xQ#owhx>SlM|gs#c#aqN53leBZ}A=< z@Cl#s72og!Kk*xX5U|2u0wD;3A~-@I6hb2`!XW}8A~K>N8lod6Vj(u-ATHt|0TLoH zk{}t9BPCKH4bmb#G9VK&BP+5Y2XZ1e@*p4bqaX^Q2#TUON}v=I^e+h`d2!db;j*tk2FbIqAh=53ljHrl)7>J2~5F7s@F5)8r5+N~? zA{kO3B~l{|(jh%EA``M8E3zX8av?YJA|DE%APS=hilI14q7=%YEXtz-Dxor}q8e(T zCTgP&>Y+Xwq7j;)DVn1NTA?-Cq8&P*BRZoCx}iIIq8Iw0FZyEu24OIUVi-nXBt~Nl z#$h}rViKlcDyCxwW??qwVjdP?Ar@l^mSH(oVine4E!JZLHeoZiVjFf~Cw5~G_F+E` z;t-DDD30Re@BLqSrG{PbrA|N6nBMPD+I$|Og;vg>KBLNa2F_Iz~QXnN#BMs6aJu)H_ zvLGw6BL{LJH}WDM3ZNhgqX>$jI7*@v%AhRDqXH_SGOD5)YM>@+qYmn!J{qDCnxH9~ zqXk-_HQJ&bI-nyuqYJvBJ9?rQ`k*iRV*mzWFot3nMqngHV+_V&JSJiireG?jV+Lkn zHs)d;7GNP3V+odFIaXp7)?h8xV*@r}Gqz$Ic3>xVV-NOWKMvv$j^HSc;{;COG|u82 zF5n_A;|i|fI&R_??%*!&;{hJwF`nWXUf?BO;|<>7JwD2Y%uge&Y`U zR}UZvf+09UA{4?PEW#rKA|W!OA{t^KCSoHF;vqf~A`y}xDUu@vQXw_cA{{ayBQhfk zvLQQiA{X)?FY==R3ZXEHq8Lh`Bub+U%Aq_eq7tg0DypLfYN0mjq8=KcAsV9znxQ#b zq7~YpE!v|4I-xVVq8oakCwij~`k_AtVi1O4D28JMMqxC@VjL!5A|_)BreQi}Vix9L zF6Lta7GW`#Vi{IoC01h%)?qz1ViUGtE4E_?c40U6Vjm9RAP(aQj^Q{?;uOx{EY9Ns zF5xn+;u>z?CT`;n?%_Tj;t`(UDW2m6Ug0&~;vGKVBmTl?{Ee^p2jB58e&Rp;MxYu2 z1V&Ht+dSpN*WJXqG zLk{FbZsb8e2K;gSd!~1W1I$NQz`gfs{y%G)RZ^$cRkHf~?4n z9LR;-$cua^fPyHDA}EI9D2Y-igR&@(3aEt2sETT+ftsj|I;e;GXoyB=f~IJW7HEam zXp45}fR5;lF6f5t=!stFgTCmG0T_hA7>Z#Sfsq&;KtLmIj64qGF%gq61yeB{GcXIY zF&Fc&01L4gORx;fu@bAW25Ye%8?XtRu@&2}13R%Bd$14taS(@a1V?ckCvXa5u^#kr`Q# z4cU3ZpR=<1hgeF&R@Z4bw3bvoHs9 zF&_)C2#c{4%di3~u^MZz4(qWIo3I62u^l_G3%juw`)~jUaTrH%499U2r*H;maUK_N z372sd*Kh+jaT|AV5BKp9kMIOf@fO<^6aV2i0@V&6 zFoGf&LLekUBMibJJR%|zq97`wBL-q2HsT^45+ETGBMFirIZ`4O(jYC;BLgxaGqNHZ zav&#iBMYy&_qX8PBF`A+oTA(Fb zqYc`jJvyQjx}Yn%qX&ASH~OL<24EltV+e*}I7VU=#$YVQV*(~&GNxi0W?&{}V-DtF zJ{DpTmS8ECV+B@WHP&JsHee$*V+*!nJ9c6h_Fyme;{XofFplCFPT(X?;|$K>JTBrA zuHY)J;|6ZwHtymc9^fG!;|ZSOIbPxw-rz0X;{!h7FMPq@_=bP*1OMU|{=**xsuMsE z1VwO!Kq!PpScF3aL_}mnK{P~1OvFMQ#6^50Kq4eYQY1qPq(o|@K{}*IMr1-3WJPx5 zKrZA)UgSdo6hvVZK`|6ZNt8kvltp<|KqXX0Ra8R_)I@F6K|Rz*Lo`AYG(~f?Kr6IH zTeL$5bVO%#K{s?qPxL|`^hJLRz#t69Pz=KejKpY+!8nY^L`=dIOvQA}z%0zhT+G7) zEW~0g!7?nzO02>fti^h4z$R?QR&2u#?8I*D!9MKAK^(#n9K~^*z$u)@S)9WKT*PHu z!8KgRP29pA+{Jx7z#}}yQ#`{9yu@p~!8^RiM|{F(e8E?I!*~3^PyE7f{6XNl0R%xX z1V>1OLKuWactk)XL`GCZLkz@3Y{Wr4#79CTLJ}lJa-={iq()k#Lk46-W@JG&WJgZq zLLTHreiT3<6h=`LLkW~bX_P@Zlt)EWLKRd+b<{vD)J9#@LjyEKV>CfCG)GIcLL0P2 zdvri2bVgTnLl5*sZ}dSw^v6I9!VnC_aE!nxjK)}u!vsvkWK6*{Ovg;j!W_)Sd@R5s zEXGnS!wRg#YOKLJtj9)d!WL}BcI?0|?8aW~!vP$`VI09R9LGtV!Wo>!d0fCHT*g&g z!wuZTZQQ{<+{Z&a!V^5jbG*PSyvAF+!v}oCU-*o_@fH8zJO0H_{DI?~h>LhgfP_elBuIwjNQqQPgS1GG49JAc$ck*pft<*V zJjjRqD2PHRf}$vn5-5ezD2sBafQqP$DyW9)sEJyrgSx1X255xFXo_ZNftF~EHfV?T z=!j0}g0AR}9_WSM=!Q9BgRvNo37CY*n2Kqbfti?%Ihcp}ScpYf zf~8oF65v{7kqKFl71@ykxsV%q zkq-q>5QR|$#ZVk2Q3_>H7UfX^l~5T~Q4KXv6SYwX^-v!T(Fje@6wT2BtTvoITTF%Ju{5R0({ z%di|Pu?lOj7VEJAo3I&Mu?;)06T7ho`>-DeaR^6n6vuG_r*Il)aSj)75tnfV*Ki#- zaSL~F7x(c1kMI~z@eD8U60h+F@9-WU@d=;t1z+(E-|+)K@e9B42Z0*|5Cp*x93c@3 zVGtJK5do198Bq}pF%T265eM-Q9|@5NNstuDkpiiZ8flRZ8ITc~kpQd7)4PGB~TKjQ3mBu9u-juRZtbxQ3JJ58+B0+4bTvc(FD!V94*lbZO|6&(E**% z8C}s0JF#@A78e=gI6EG2zF$L2w9WyZtb1)b4u>gy(7)!AX zE3gu)u?Fj~9viU-rX8+)-22XGLFaRkS394B!KXK)thaRHZb8CP))H*gcT zaR>Ks9}n>ePw*7a@dB^#8gKCqAMg=>;WPfmSNwzT_!mF%AATcH!vF#!D1spbLLxN6 zARNLYA|fFQq9QtCAQoaHF5)2p5+X5@AQ_S)B~l>`(jq-FAQLhpE3zR6aw0eKARqFh zAPS)filR75pcG1@EXtt*Dxxx~pc<;9CTgJ$>Y_dxpb;9QDVm`LTB0@DpdH$yBRZiA zx}rOJpci_hFZy8s24XOVU>JsDBt~Hj#$r4sU=k){DyCruW@0wxU>@dUAr@f?mSQ

      zlE!JTJHexfjU>mk$Cw5^E_F_K{;1CYuD30L-PU1Aq;2h55A}-+yuHrgw;1+J< zF7Dw09^x^c;2ECdC0^kT-r_wz;1mAB7yONH_y<4mFMi=a{6U~b0R%x%1V;#jLTH3V zI7C21L`D=uLv+MMEW|-v#76=oLSiIEGNeFCq(&N~LwaOHCS*ZYWJeC&)J7fDLwz(vBQ!x%G)D`xLTj`|J9I!tbVe6+ zLwEE#}E9(FZ{+I1a2Ha5ClVTghVKWL0E)G z1Vln)L`5{jKup9&9K=I>Bt#-4K~f|~3Zz16q(wSpKt^On7Gy(qo4b(zy)I~isKtnV}6Es6}v_vbkL0hy(2XsPbbVWDx zKu`2WAM`_i48$M|!B7mx2#msLjKw%iz(h>O6imZ(%)~6r!CcJ80xZH}EX6Xcz)Gyf z8mz;5Y{VvP!B%X?4(!5i?8QDDz(E|w5gfyDoWv=d!C9Qg1zf^qT*Woqz)jr79o)lx zJj5eB!BafP3%tT>yu~|wz(@Rr&-fc(@ejV^U;M;>_>DkK0tk$t2!;>{iO>jxa0rix zh=eGJis*=eScr|dh=&A7h{Q;OWJr#bNQE>=i}c8VOvsF^$c7xqiQLG8e8`W2D1;&? zisC4NQYekGD2EEDh{~vfYN(EysD(PHi~4AQMre$tXoePOiPmU?c4&`|=!7olitgxv zUg(X!=!XFqh`|_wVHl2)7=T*o8gVi~Tr&LpY41IEE8AiPJcPb2yKSxP&XXitD(6Teyw8xQ7RL zh{t$>XLyd6c!f83i}(0|PxuR8@Hf8UAN;_-_=W%Q2Z5Rf5ClOH93c=2p%E705CIVp z8Bq`o(Ge4|5C?G)9|@2MiIEh^kOC=@8flOY>5&nckOf(h9XXH-xsez7Pyhu{IDmjg zToJh#ilZb-p$y8RJSw0PDx)f@p$2NAHtL`r>Z2hVp$VFzIa;6VI%Z%NW@9eqVF4CmF_vH%mSZJW zVGY(|JvLwyHe)NcVFz|%H}+s3_TwN9;Ruf6I8NXcPU9@j;Q}t=GOpknuHzLwhGIBIU=&7UEXH91CSo$CU>c@lW&qvW%nHz#&2xkIh035R6-S0MRn9bE!0L`)I$R_L}N5TGc-p_v_c!SMSFBWCv-+v zbVCpHL~ry#KlH~y48jl$#c+(kD2&EfjKc&>#AHmtG)%`#%)%VZ#e6KlA}q#IEW-+{ z#A>X;I;_V=Y{C|7#dhq#F6_o$?85;Z#917bJi-$^#dEyCE4;>Ayu$~4#9#P~zws6S;5+`sPyC192-GrwzzB+92!W6YjW7s@ z@Q8>=h=Qnyju?oA*ocdGNPvV$j3h{g5jXcPQ{3wV* zD1xFWjuI$^(kP2^sDO&7j4G&x>ZplYsDrwwj|OOj#%PLWXn~e!jW%e9_UMRC=z^~3 zjvnZR-sp>d7=VEoj3F3?;TVZg7=y7Gj|rHB$(V|1n1Pv?jX9Wy`B;cWSc0Wkjulvi z)mV#l*no}Lj4jxP?bwN3*n_>;j{`V_!#Ij#IDwNmjWalh^SFphxPq&=jvKgz+qjE+ zcz}m^j3;=8=Xi-%c!Rfij}Q2SzwiZr;~W0L5B!T?_z!;&s8s+#5EQ`?0-+EZVG#}y z5D}3P14F%b)K5Et>00Ev(oNs$aGkP@kp2I-I<8IcKDkQLdH1G$hJd65qVP!NSt z1jSGsB~c1xP!{D;0hLf0RZ$H!P!qLL2lY@N4bccq&=k$l0Mjc zJ<$t&&=>tN0D~|XLoo~^FcPCN2IDXu6EO)>Fcs4=1G6w2b1@GKun>!}1k11-E3pb| zuommF0h_QHTd@s0uoJtn2m7!e2XP2Ta1_UJ0;g~qXK@Y}a1obr1=nyLH*pJha2NOS z0FUq(Pw@;d@Di`_2Ji45AMpvF@daP;4d3wtKk*B{@dtrh2M`3o5F8;93Skfy;Sm9m z5E)Ss4KWZCu@MLH5FZJV2uY9>$&mu7kQ!-`4jGUUnUMwAkR3UZ3we+i`B4CcP#8r~ z3?)z!rBMduP#zUg2~|)P)lmbrP#bko4-L=|jnM?n&>St%3T@C9?a=|9&>3CP4L#5k zz0n8#&>sUa2tzOw!!ZJ*FdAbq4ihjDlQ9L;FdZ{73v)0R^RWPnuoz3R3@fk_tFZ>_ zupS$+30trg+pz(LKtd!&5+p-%q(myDL0Y6o24q5JWJNaQKu+XF9^^xQ6ht8uK~WS( z36w%9L&RfEW{!#!BQ;83ar9vti?KP zz(#Dw7Hq?I?8GkY!Cvgg0UW|%9K|u5z)76O8Jxp;T*M_@!Bt$x4cx+Q+{HaSz(YL7 z6FkFnyu>TK!CSn?2YkX`_=3Oj4gcT={>3l+hd&6^Hh>@qir@%=Pza5%2!{xWh{%Y7 zXo!xOh=n+ai}*-@L`aOJNQM+hiPT7gbV!ek$b>A&itNaNT*!^Q$cF+bh{7m>VknN1 zD1|a8i}I*|N~nygsD>J-iQ1@xdZ>?vXoMzcisop6R%ng3Xon8yh|cJOZs?Al=!HJ$ zi~bmZK^Tmo7={rTiP0E?aTt$@n1m^qis_hvS(uHvn1=;eh{affWmt}tScNrMi}l!m zP1uaB*oGb0iQU+Peb|qKID{iOisLweQ#g&YIEM?kh|9QwYq*Y^xP?2oi~D$hM|g~< zc!n2viPw08cX*GF_=L~+g0J|7@A!eA_=Vs2gTUJ43h=X{DkAz5sBuI+nNP$#HjkHLI49JMg$bxLhj-1GaJjjduD1bsJjG`!p5-5q% zD1&k+kBX>-DyWL;sDWCjjk>6Z255-JXo6;Fj+SVJHfW3X=zvb>jIQX09_WeQ=!1Uf zkAWD3AsC9`7=ck3jj6T7end$At}a0rKS6vuD^Cvh5Qa1Q5j5tncUS8*LTa0|C_7x(Z05AhgJ@C?uK z60h(EZ}A=<@Ckq63;xD8{DU9(7r*cy{vc3?0D>SWf+GY%AvD4w93mhhA|nc-Av$6r z7UCc-;v)ePAu*C78B!o6QX>u0Aw4o86S5#HvLgp_Avf|O9}1u#3Zn>$p*TvS6w071 z%A*1*p)#tX8fu^>YNHP7p*|X-5t^VWnxh3;p*7l~9Xg;RI-?7^p*wn_7y6(t`eOhF zVK9bb7)D?uMq>=dVLT>c5~g4(reg+XVK(Ms9u{CB7GnvPVL4V}71m%a)?))UVKcU3 z8+KqPc4H6rVLuMy5RTv|j^hMQ;WWO7Vh9K?&AR-;W3`#8D8Ke zUgHhk;XOX$6F%b$zTz9c;|G4?7k=Xp0(T4`2!bIvLLwBxAS}Wo0wN(Yq9Ph%ASPlX z4&os`5+V_jASsd~1yUh3(jpx)AR{s(3$h_Qav~SY^SRpdlKg37VlfTA~%&pe@>?13IBIx}qC;peK5x5Bi}$24WC~ zU?_%T1V&*r#$p^MU?L`C3Z`K?W?~lRU@qok0Ty8~mSP!JU?o;#4c1{jHewUDU@Nv` z2XbOT*o8gVi~Tr&LpY41IEE8AiPJcPb2yKSxP&XXitD(6Teyw8xQ7RLh{t$>XLyd6 zc!f83i}(0|PxuR8@Hf8UAN;_-_=W%Q2Z1^V5ClOH93c=2p%E705CIVp8Bq`o(Ge4| z5C?G)9|@2MiIEh^kOC=@8flOY>5&nckOf(h9XXH-xsez7Pyhu{7)4MF#ZeNaPzGgD z9u-gtl~EPdPy;nl8+A|*_0bTG&;(7<94*iat8+))1`*9G5a0Ewj94BxJr*RhNZ~+%_8CP%(*KrfKa0hpB9}n;dkMR`G@B%OK z8gK9p@9`0z@EKq572oh3KkyU3@Ed;+xJv**5DdW)5}^np$odAJ9?lOdZRD; zVE_hVFos|lhGQf~VGPD%JSJcgCSxk5VFqSmHs)X+=3^liVF{LEIaXj5R%0#JVFNZ| zGqzwGwqqxDVGs6VKMvp!4&x|};RH_NG|u20&f_93;R>$eI&R<=ZsRWQ;Q=1vF`nQV zp5rB6;SJv6JwD(Q{=yghjc@n|KkzSp;XnLApsoP~K~Mxo2!ujtghe<+Ktx1F6huRG z#6&E_L0rT~0wh9WBtvVsOvEHi!BkAg49vo8%*8w`z(Op>5-h`Vti&p;!CI`x25iD+ zY{fS0z)tMO9_+(@9K<0U!BHH?37o=doW(g@z(rif6+ghvEKLS#fmG{itm z#6}#%LwqDeA|ydlBu5IQLTaQ%I%GgbWJVTbLw4juF62R88(;AczT;o~#DDmWK-~ifjGzdH5D1CT2!n74kBEqbD2R&ah=Ev$ zjkt)11W1U)NP=WYj+97+G)Rl|$bd}9jI79p9LR~>$b)>ykAf(KA}EUDD1lNajj||* z3aE(6sDf&!j+&^2I;e~KXn;m&jHYOY7HEmqXoGfWkB;bsF6fHx=z(77jlSrI0T_tE z7=mFKj*%FJF&K;Sn1D%`jH#H08JLOLn1gwkkA+x-C0L5(SbZ4cLgy*n(}? zj-A+rJ=lx=IDkVqjH5V)6F7;}ID>OIkBhj3E4Yg5xPe=^jk~yq2Y86bc!Fnmj+c0a zHvx2S^ENQd7)4PGB~TKj zQ3mBu9u-juRZtbxQ3JJ58+B0+4bTvc(FD!V94*lbZO|6&(E**%8C}s0JF#@A78e=gI6EG2zF$L2w9WyZtb1)b4u>gy(7)!AXE3gu)u?Fj~9viU< zTd)<|u>-rX8+)-22XGLFaRkS394B!KXK)thaRHZb8CP))H*gcTaR>Ks9}n>ePw*7a z@dB^#8gKCqAMg=>;WPfmSNwzT_!mF%AATcH&j11=D1spbLLxN6ARNLYA|fFQq9QtC zAQoaHF5)2p5+X5@AQ_S)B~l>`(jq-FAQLhpE3zR6aw0eKARqFhAPS)filR75pcG1@ zEXtt*Dxxx~pc<;9CTgJ$>Y_dxpb;9QDVm`LTB0@DpdH$yBRZiAx}rOJpci_hFZy8s z24XOVU>JsDBt~Hj#$r4sU=k){DyCruW@0wxU>@dUAr@f?mSQzlE!JTJHexfj zU>mk$Cw5^E_F_K{;1CYuD30L-PU1Aq;2h55A}-+yuHrgw;1+J&)J7fDLwz(vBQ!x%G)D`xLTj`|J9I!tbVe6+LwEE#}E9(FZ{+I1nwO`5ClVTghVKWL0E)G1Vln)L`5{jKup9& z9K=I>Bt#-4K~f|~3Zz16q(wSpKt^On7Gy(qo4b(zy)I~isKtnV}6Es6}v_vbkL0hy(2XsPbbVWDxKu`2WAM`_i48$M| z!B7mx2#msLjKw%iz(h>O6imZ(%)~6r!CcJ80xZH}EX6Xcz)Gyf8mz;5Y{VvP!B%X? z4(!5i?8QDDz(E|w5gfyDoWv=d!C9Qg1zf^qT*Woqz)jr79o)lxJj5eB!BafP3%tT> zyu~|wz(@Rr&-fc(@ejV^U;M;>_>Dk)0tk$t2!;>{iO>jxa0rixh=eGJis*=eScr|d zh=&A7h{Q;OWJr#bNQE>=i}c8VOvsF^$c7xqiQLG8e8`W2D1;&?isC4NQYekGD2EED zh{~vfYN(EysD(PHi~4AQMre$tXoePOiPmU?c4&`|=!7olitgxvUg(X!=!XFqh`|_w zVHl2)7=T z*o8gVi~Tr&LpY41IEE8AiPJcPb2yKSxP&XXitD(6Teyw8xQ7RLh{t$>XLyd6c!f83 zi}(0|PxuR8@Hf8UAN;_-_=W%Q2Z8zq5ClOH93c=2p%E705CIVp8Bq`o(Ge4|5C?G) z9|@2MiIEh^kOC=@8flOY>5&nckOf(h9XXH-xsez7Pyhu{7)4MF#ZeNaPzGgD9u-gt zl~EPdPy;nl8+A|*_0bTG&;(7<94*iat z8+))1`*9G5a0Ewj94BxJr*RhNZ~+%_8CP%(*KrfKa0hpB9}n;dkMR`G@B%OK8gK9p z@9`0z@EKq572oh3KkyU3@Ed;+xL*K45DdW)5}^iB~cn>P!8o$5tUE{ zRZ$%^Pz$wD7xmBp4bd1)&6w9yzE3q1Dunz075u30DTd^HGunW7f z7yEDk2XPoja16(B5~pwmXK@}Ea0!=j71wYBH*p(xa1ZzK5RdQ#Pw^Zt@CvW-7Vq!@ zAMqDH<8OS$KlqM+@e}{yHv;t!ATWX=7(yTZ1V~p)s1G8CswvTB8lxp*=dH6S|-)x}yhrp*Q-X9|m9`24e_@VK_!& z6vkjI#$y5|VKSy-8fIW7W@8TKVLldO5td*nmSY80VKvrb9X4PiHe(C6VLNtW7xrK; z_TvB!;V_Qk7*60MPU8&D;XE$l60YDXuHy!7;WqB#9vkIh035R6-S0MRn9b zE!0L`)I$R_L}N5TGc-p_v_c!SMSFBWCv-+vbVCpHL~ry#KlH~y48jl$#c+(kD2&Ef zjKc&>#AHmtG)%`#%)%VZ#e6KlA}q#IEW-+{#A>X;I;_V=Y{C|7#dhq#F6_o$?85;Z z#917bJi-$^#dEyCE4;>Ayu$~4#9#P~ zzws6S;5+`sPyC192s9{wzzB+92!W6YjW7s@@Q8>=h=Qnyju?oA*ocdGNPvV$j3h{g z5jXcPQ{3wV*D1xFWjuI$^(kP2^sDO&7j4G&x>ZplY zsDrwwj|OOj#%PLWXn~e!jW%e9_UMRC=z^~3jvnZR-sp>d7=VEoj3F3?;TVZg7=y7G zj|rHB$(V|1n1Pv?jX9Wy`B;cWSc0Wkjulvi)mV#l*no}Lj4jxP?bwN3*n_>;j{`V_ z!#Ij#IDwNmjWalh^SFphxPq&=jvKgz+qjE+cz}m^j3;=8=Xi-%c!Rfij}Q2SzwiZr z;~W0L5B!T?_z!;&Xm9{Q5EQ`?0-+EZVG#}y5D}3P14F%b)K5Et>00Ev(oNs$aG zkP@kp2I-I<8IcKDkQLdH1G$hJd65qVP!NSt1jSGsB~c1xP!{D;0hLf0RZ$H!P!qLL z2lY@N4bccq&=k$l0MjcJ<$t&&=>tN0D~|XLoo~^FcPCN2IDXu z6EO)>Fcs4=1G6w2b1@GKun>!}1j_;lc*VI~UWrv$gSA+X4cLUu*otk~ft}cmJ=ll+ zIEX_yf}=Q&6F7y_IE!<*fQz_{E4YU1xQSc1gS)to2Y7_Xc#3CuftPrVH+YBl_=r#V zj4$|#Z}^TM_=#WmjXwxHB!D0YhTsT^PzZyt2#*Megvf}BXo!KBh>bXihxkZ{L`Z_9 zNRAXph15ukbjW~=$c!w=hV00RT*!mG$d3Xjgu*C_Vkm)i?Xolu!iB@QXwrGzI=!DMbif-tEp6HD}=!gCoh(Q>F zp%{)47=_Uoi*cBMiI|Kjn1<5&1MkQrH#4LOh#xseC?kRJt62t`m7#ZdyKP#R@X4i!)l zl~D!NP#rZ<3w2Nz_0a&0&=^h83@y+StkJp30=??-O&TR&>MZx4+Ag|gE0id zFdQQ>3S%%9<1qn~Fd0)Z4KpwkvoQzrFdqxC2urXO%drBhuo`Qz4jZr$o3RDkupK+G z3wy8^`*8q=a2Q8%3@30Br*Q`7a2^-`r{Er<#V`T@ipI8W+qP}nw%u5b)!4ReG*)BV zwv+z5xo6H>&SGXUz&ZSf3%G>KxQc7Ift$FEJGh7Yc!)=Mf~R*Gbh0z#;u^5jD zn1sogifNdR8JLCHn2UK>fQ49$C0K^#Scz3wgSA+X4cLUu*otk~ft}cmJ=ll+IEX_y zf`4%g$8i#;a0X{_9{=GYF5wEU;yP~N7H;D%?%@F*;xV4!8J^=MUf~Vi;ypg#6F%cB zzTpRc;y3;v@UQ@aAQ*xpBtjt!!Xi8(AQB=YDxx6|jV zgejPce=r?0F$;4r7xS?Ii?A3=u?#D)605NW>#!ahu?btS72B}`yRaL3u@47u5QlLD zM{x`%a1y6+2Ip`d7jO}maRt|K9XD|ccW@W?@c@tT7*FvGFYpqt@doek9v|@uU+@** z@dLl`8-a!g5Ewxb3?UE_p%Dh*5FQZ`2~iLg(Gdf&5F2q34+)SEiID`!kQ^zI3TcoQ z>5&1MkQrH#4LOh#xseC?kRJt62t`m7#ZdyKP#R@X4i!)ll~D!NP#rZ<3w2Nz_0a&0 z&=^h83@y+StkJp30=??-O&TR&>MZx4+HQQ24OIUVi-nXBu3+JjKw%iz(h>O z6imZEn1Pv?jX9Wy`B;cWSc0Wkjulvi)mV#l*no}Lj4jxP?bwN3*n_>;j{`V_!}u3R zaU3Ub3a4=v=kOmc;1Vw5Dz4!MZsIoX;2!SdAs*ogp5i%P;1youE#Bb+KH@XJ;2XZ< zCw}1%0*weD2!bLwLLd}EBP_xp0wN+Zq97WgBPL=Y4&ov{5+D&0BPo(01yUk4(jXnu zBO@{)3$h|Rav&FSBQNry01Bcoil7*Zqa;e949cQBDxeZ7qbjPQ25O=<>YyI#qahlh z37VogTA&qLqb=H@13IEJx}Y1nqbGWy5Bj1%24EltVF-p|I7VO;Mq>=dVmu~b5+-9R zreQi}U>0U$F6LnY7Gg1$U>TNUC01b#)?z(2U=ucDE4E<=c49a7U?2A5AP(UO{>3pI z$4Q*R8Jxv={D+IUge$m;>$rhixQ)BGhX;6w$9RHgc#fBNg*SMM_xONM_>8akh9CHe z-}r;TBLfJ6UY{-tB$b~$}i~J~nLMV))D25U!iP9*8aww0AsDvu0it4C=TBwb>sD}n385B$P! z1R51UU<5@lgg{7yMi_)cctk`bL_t(UM-0S5Y{W%8BtSwWMiL}La->8mq(NGwM+Rg< zW@JS+kMio>;b<{*H)InX;M*}oMV>CrG zv_MO=MjNz4dvru6bU{~iM-TKuZ}de!48UI)guxh!VHkmt7>&O%7UM7h6EPW6Fb)4; z24-S5=3pM?V<8q{36^3xR$vuYV=dNU12$qawqP5!V<&cD5B6d|4&V?D<6j)bah$*@ zoW@z4!+*GdOSp`yxP}|JiQBk?d$^B>c!Vc-isyKNS9p!Lc!v-8h|lQ40fJ8`)q)3JoNQu-)gLFubjL3v6 z$cpU9fn3OqyvT2TD2wu_fJ&&0s;GtK)Xo}`& zfmUdZwrGbA=!nkff^O)Jp6G=>=!^asfPolk&uHY)J;|6ZwHtymc9^fG!;|ZSOIbPxw-rz0X;{!h7Grr;*e&8p5;|~J= z9Y7ESLvVydD1<>+ghvEKLS#fmG{itm#6}#%LwqDeA|ydlBu5IQLTaQ%I%GgbWJVTb zLw4juF62R83~(iBb3)V=xZmF%gq61yk`4reh{% zVGibEJ{DjR7Go)vVFgxVHP&Dq)?*_!VGFimJ9c0fc4II0;Q$WeFpl6Tj^PAO;xx|S z9M0ncF5)t-;2N&uCT`&l?&3Zk;1M35a%h{>3OY4`^-FcY&e z2lFr=3$X}GuoTO&0;{kZYq1U+uo0WF1>3M4JFyFUuowGr0EciG|Kcc);{;COG|u82 z{=)@a!ev~=HQc~W+{PW;!+ku&BRs)VJjV;X!fU+6JAA-Le8v}i!*~3|FZ@BEu>k}@ zPy|N^ghFV9ML0x2L_|guL_>7ML@dNXT*OBLBtl{&MKYv7N~A^_q(gdSL?&cGR%AyG z(26hm>8L@AU(S(HZwR6=D`MK#nwP1Hsm)C(ZsYFvHehG>K)Xo}`& zfmUdZwrGbA=!nkff^O)Jp6G=>=!^asfPolk&uHY)J;|6ZwHtymc9^fG!;|ZSOIbPxw-rz0X;{!h7Grr;*e&8p5;|~Il z3m^!BAvi)J6v7}Z!XpAAAu^&O8e$+OVj~XXAwCi!5t1M&k|PCDAvMw>9Wo#zG9wGJ zAvp)iV~7)qcdN}~+Qp*$+05~`pos-p&Kp*HHG9vYw_8lwrCp*dQj z722RJ+M@$Hp)#-4=umxMO9XqfKyRjGhZ~zB!7)Njv$8Z8CaT;fE z4(D+J7jYR^a1GaS6Sr^&cX1yN@Cc9b6wmMiFYy|0@DA_s5ufk{U-2D3@C&~YXnX*H z5fs4?0wEC^VGs`C5fPCP1yKMSl#yKn%hV48?Gaz$lEy7>vbuOu!^e##Bth zbj-jk%*I^I!vZYCVl2TjEXPW$!Wyi_dThWZY{ph>!w&4kZtTH6?8iYI!V&z7V>phJ zIE6Dfi}Uyo7jX$!a23~a1GjJ+cX1C7@DPvj1kdmsFYyX*@D}g!0iW<0U-1n;@DsoB z2Z1L95Cp*x93c@3VGtJK5do198Bq}pF%T265eM-Q9|@5NNstuDkpiiZ8flRZ8ITc~ zkpQd7)4PGB~TKjQ3mBu9u-juRZtbxQ3JJ58+B0+4bTvc(FD!V z94*lbZO|6&(E**%8C}s0Jft6T|HCTuB*oaNog00w&9oU84*o%EQfP*-UBRGmVATeyR}xQ_>TgvWS_XLx~^c#SuBhxho1Pxykb_>Ld=h2ID? zF@V4bieLzVkO+-12#4^9h)9TnsECdjh=tgQi+D(Ygh-4eNQUG{iBw2~v`CK($b`(u zifqV%oXCwl$cOwWh(aiWq9~3MD237}i*l%dil~e#sD|pOiCU)=!M?si+&h@zc2`cF%-iv0wXaRe`74hVFD&%GNxb}{=p2) z#B9vLJj};JEW#2j#d55`Dy+s@tiuLu#Aa;4Hf+aE?7|-G#eN*XAsoiPIEv#qfm1k* zvp9$UZ~>Qa8CP))H*gcTaR>Ks9}n>ePw*7a@dB^#8gKCqAMg>M@de-T9Y664e-LO= z06`EG!4U$X5E@|-4iOL$kr4&a5FIfQ3vmz^@sR+DkQhmk3@MNjsgVZhkRBP430aU8 z*^vXekQ;fC4+T&Vg;4~>P#h&u3T03hC&g4js@DozVr|&>cO|3w_WR{V@OoF$hC26vHtBqc9p{Fc#x60h2HpQ!x$GF$1$O z8*?!a3$PH2u>{Mo94oO3Yp@pUu>qT~8C$UpJFpYGu?PFG9|v&=NANF>;W$p>6wcr* z&f`B^#3fw8Rb0mn+`?_##XUU0Lp;V4Ji~Lm#4EhPTfD~ye8OjZ#W(!GPyEIo1fCo~ z5ClVTghVKWL0E)G1Vln)L`5{jKup9&9K=I>Bt#-4K~f|~3Zz16q(wSpKt^On7Gy(q zo4b(zy)I~isKtnV}6Es6}v_vbk zL0hy(2XsPbbVWDxKu`2WAM`_i{DpxSj3F3?;TVZg_#0y|4&yNqlQ0ES@eihBCT3v{ z=3+h;U=bE$DVAXcR$?{QU>(+DBQ{|RwqiSWU>9~{FZSU84&pG5;3$sa1Ww{K&fpx* z;{qyu~|wz(;(>7ktBa{KPN(L7=Gt1VK;) zM+k&MXoN*LL_kDDMifLtbi_m~#6eudM*<{5VkAW}q(DlfMjE6;dSpZw zbU;URMi+ELcl1Or^g&5-h`Vti&p;!CI`x25iD+Y{fS0z)tMO9_+(@9K<0U!M`|$<2Z>^ID@k|kN_wWD@@fc6=4A1crukZ$M@g5)W37_#5-|z!J@f&{-cv=8K5DdW) z5}^iB~cn>P!8o$5tUE{RZ$%^Pz$wD7xmBp4bd1)&jK@Sw!W2x!KbVf0n1wl*i}_f9 zMOcibScVl?iPczxby$y$*n}*ejX?hd5Ewxb3?UE_ zp%Dh*5FQZ`2~iLg(Gdf&5F2q34+)SEiID`!kQ^zI3TcoQ>5&1MkQrH#4LOh#xseC? zkRJt62t`m7#ZdyKP#R@X4i!)ll~D!NP#rZ<3w2Nz_0a&0&=^h83@y+StkJp z30=??-O&TR&>MZx4+HQQ24OIUVi-nXBu3+JjKw%iz(h>O6imZEn1Pv?jX9Wy`B;cW zSc0Wkjulvi)mV#l*no}Lj4jxP?bwN3*n_>;j{`V_!}u3RaU3Ub3a4=v=kOmc;1Vw5 zDz4!MZsIoX;2!SdAs*ogp5i%P;1youE#Bb+KH@XJ;2XZYyI#qahlh37VogTA&qLqb=H@13IEJ zx}Y1nqbGWy5Bj1%24EltVF-p|I7VO;Mq>=dVmu~b5+-9RreQi}U{(O#+sqEoLHb;2 zJ{DjR7Go)vVFgxVHP&Dq)?*_!VGFimJ9c0fc4II0;Q$WeFpl6Tj^PAO;xx|S9M0nc zF5)t-;2N&uCT`&l?&3Zk;1M3u0Aw4o86S5#H zvLgp_Avf|O9}1u#3Zn>$p*TvS6w071%A*1*p)#tX8fu^>YNHP7p*|X-5t^VWnxh3; zp*7l~9Xg;RI-?7^p*wn_7y6(t`eOhFVi1O4D28JMMqxC@U@XRC0w!THreYeVV+Lkn zHs)d;7GNP3V+odFIaXp7)?h8xV*@r}Gqz$Ic3>xVV-NOWKMvv$j^JM$!*QI%DV)Js zoX3B-h)cMFtGJFExP{xei+gy0hj@%9c!uYAiC1`ow|I{a_=L~+if{OVpZJYG2s|@@ zAP9!w2#HV#gRlsX2#AEph>B>4ftZMmIEaV%NQgv8f}}`}6i9{CNQ-pHfQ-nDEXaoJ z$cbFYgS^O(0w{#SD2iezfs!bVGAM`gsEA6af~u&F8mNWZsEc}NfQD#{CTND{Xo*&6 zgSKdo4(No==!$OWfu87%KIn)3_zMFu7(*}&!!Z)0@HfU_9L8fJCSeMu;vY=MOw7U@ z%*A{xz#=ThQY^y?ti)=p!8)wRMr^_sY{ho$z%J~@UhKmG9K>N9!BHH;37o`foWVJq z#|2!(q<0MYu z49?;_{=-FF!WCS_b=<%$+{Rtp!vj3TV?4n#JjYAC!W+EBdwjqre8yLN!w>w#Z~Q^v z*#QJWFa$?PghCjEMR-I&Bt%A3L_-Y3L~O)CJj6#rBtjA-MRKG-Dx^kQq(cT|L}p|` zHe^RmkJo8C}pFJsUZ2!k;U!!Zh@F&5)65tA?#(=Z(~FdK6)9}BP;ORyX(uo`Qy z9viS3Td*BFup4`@9|v$4M{o?saSEq#4(D+Zmv9x=a1*z12X}EF5AYaI@EkAj8gK9p z@9_zr@eSYc3%?O~P5?m=93c=IVGte>5E)Sr9Wf9aaS$H~kQhmj94U|*X^C&f9v#pbUCMZw z9|JH5gE0)lF$$wG7UM7h6EOu-Fɂ*?xp3$PeVupBF}8f&l~8?YH$upK+F8+))H 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

      ^|ShS<(8?2@m|x6cyFX|Tq$Wi;p! zTQym;I~m3>L~~9%on>1sr=V2ZitLQk^_V%5dmW9<*Yk605LO*vO&pLcV|V& zN{>GVdDwGbCkyP*d@30CnS_`t+~W~1_`k?{1lcOwcXXM2jnZi%yMY2uZh~vL8{K(k zHy4`-l*yZ)-h+w#Tu1SRO5S=`B&)uC;i?h`gh|q`F4jq?v)8@UlgSoAsy5YiFj@7# z<+J3z$|AvEjM#D9w*}_*HTPIE0Mgs|)6d$&)B;nYJ7_8kgTo2nDI9;Malw8RnNJqP zyqJM?eeh9c1+#TGfaOQ$B~%x?nK;;)ld;W}{(B?3wqwUL3(UE2@ReS z<*^PjYhRvB4IWzr+ypSpW~wIbBZlvlth2AcUd`Qc0SbU)&eY0%55T|M)mWv3rI@3H zf}Y%`Z=%r_A=I8*z>MkaF(Fc-u%NQkEMmEt!dY?}?s6Y3;0 zv6New-GIP<7C4_}KNDNK(lVYllt1S)sBzs*ytRq@BAff+;s^MfH*i)nn^d`afu^kp6v=KMEtGc_os=B+nx~FP*`Qij5TqGz?T>BO{H-KZ_C*mD= z5GnLKXKOYGX7`kUo$9Rf1;L-sR5!7?6y?#Z^F5(Fmqp<~d5ZAEtn*7AL7t*3!mqQ= z_8eMR%CwLU(s_T*`I^A5WWeG&088`>9c}5GIp;S*eR%?^D3BulKIc4J0OBGL)rFDi zaiQS6NzjE9imNfL`c}c&B_L6&RoT_6;QfO0DS?UM3Ksv7!aplGUlN=+s&F$;Lq++j z;QT}=#L)!ChPxvCTyXv{ZKMbz1N^h#+xQ&df}aDuc#l!NplMQau?f zSM}oZY}ZES47f@{jBvHI8D;w9VDQvw!BFD=IPVxViSG=UAX6?M(;_a-YY!Jr7CVE+ z6^e@E%f;S+1B4^mh-ZIvdl(HbU&t2q{orAUZ|U7(@xdocGc(Kc%htNz8wB3jd1MvW zOV*t?Zoh58CDyXGo6(9@?Vj56gw;R_ciR2Vg60L?)VBi{37Y(N)Ncmvnlo z?s%sza{iL()uWOSxr8a3`!ZM9Bnl3c0&5ewtr2wymfD(05wBm}TX#$s+TIGnJ)n(Z zGa|B){k=!kN;shmEIGSs&B-HA2gm`2D6qx3k62LRxsT*fgDYVifZH(=vMeLgQDoh( zHn#T;8&+la$hu#t*DJe?qcz}0=RTk=k|y(@JbXp(VU*x1@_9xBkd6kNjr#gFYE~0(!SetuwM5NrW)Em|H!<|aq+CQx0K)+#I)&ckf>QMg*-jXNc!Vg>% z=10bS1aXF-tkXhB5S;o0_tZsVXUd&<3Ux6Io!%}wZFYQ)xDuU%id1<(Se3s7B8%I# z-leF*<<-@Gzi*#)W7`kT5a*ud9mk;F;>ce_gzWH5 z_6pGr_%YQxj{J+x3N)KaHi5B0kDf-G3NasmO@TO$%lgr9LNg19>Hpv9sFA`lXlG@Bjh)0Br%0#;t4UnE1n%+wRj&InZs z*nSsrkk6w$BH4tGBa>Jv(xRxR1kUu{^4+j|3oFydSkF~UMAXVUMOP5z9fke~ES+6M zgVBgS4qjdW$3sHK_$=bqa9p8}l>E>p1+l%5CY#jGoI3!%K$>*GLIdR5X7Zz>Wcn&X zq7nuN3X`z7B&L3@bIq`9DrEXsjirMX_d9Y8*hcTz6S_rHamBh7oMdvSO2@!b3X&D7 z*tS`fOLogWMSAw)tA~xv*WbzIV6X1+>XmuHFNt4siyN_D>6CuPrcFQaB6s4vNmsP{ zgo8PwH0#okNb$N%6qzF_kvufBkfqcTPs}1p!Z%8*iY%}9%jp}BGJgOE-LCF|17shx zG%y?2xPIDg8=Vt{&Z}V`YG@m=69a787_lNFVArU=<(F8~?nHGF$AKs$FSAh`h)Khn z0PS<8zFEQ&nW$!67e&%Fl=i}Zv*PB5CmU;)5vp?O4obTDj}>Zc>y)MP?-skfbakbp zz1r-uNfY@kRAdW3G&$0zn*!j9`f diff --git a/docs/html/.doctrees/index.doctree b/docs/html/.doctrees/index.doctree index 3b2253c4ddb6b0d990ef2b7f04a7fa9551feb04d..e278c5ab8214524042739740849bdbe64706d871 100644 GIT binary patch delta 1577 zcmai!Urdu%6u`ZMum3(N{pepRv`A4}x(Xu6{L?s>_(p>GvdktJO8M||C)5<1`LZa9 z37u&c-6;tgMK_miPfN5fh{nVvKKL>>HAam_eO@rku&^a_?wnh`Diz|(>FMn~_xJnm zcTQjL`eRr1F=evv`-loBAbEEPD?!O3snuqJJWcda@o3~~3Aw8pyru4x=HywivU+@3t*L ziQQa@6)KiVa!5^R0s2B$P=X5;zE-1(pL>KE_PRnVKlfj1mwWpP@a?d3ZH#@4@Q&t= zrN{1ghaWfi*ViVrJr(>o^4r{>VnS4!# z>j$^K<1%8nd}YsQ$0}S#TlDUWzcWf2?|@t79gOiL4X!|8JWno2D-4KL~<>?Qb|A&hZn zBgTZYnf-?k;)IjVh~?kXvH!pg=SR#6Kf7bF(Y4O8NXw-$Y(~}sQlkoG^ThX}wwPPS zFU`_bS0vWNX4qNXuDnMv_V%@&l~kNewMf)uG2#2l!;sQ(V$k+_S2hT3Qfy8Xw{ z>r1gF{BLO}{^ond*!AMC{_|D4kMnWykc#eO;5Yd%e337RFs*E$u#dv06i!f>pm2@C z6$(@MSYi?`1zbmu_sDa4_{|(&%*hjSvN|U#bFwNYD|)iLo?h5EkCw0#h`q)a_=^%V iNJmR%FJ+QBUS<|4n delta 1623 zcmaLXTWAzl7y#g$b$7Fq&E~Q@yOU_5yV=AfYd4qH2PvsU1Rp8}TPSK&bh8;f8M9eC z$%2K3UQ%QOLreL$6s(Y~u@`-ltuKj&J`{Y=Codo|M#M)2OO-&BR{#G@X3}glFF$9_ z<^R7qbIv^Oe%0;#()Gj0CFgmkuRNJfolFm_dOSHe0F%zW4xTDJa~7EETOQ&DeD9A| z@Nv%gI=-1V^OoHT%(;(;Cwb}NTnm>BNmq}lx;m6pbC7HODmRL~E~W3FG|e(6B%bcQ$aD@K{UtUtG#iP3yb9n2`@u3CKh8S94S32dERF5Q#q<9T@K z4Ztl=#6N2aF4#3^!7atu1FYFmH)VK_z4vasPfrXbd3%m(5@8NAT!m4ox8kW_@av-X z99Xs2Ci2V2R^7!B2$J>=j!0LRi3ov$yDg_*F_#0v_19cIkAT4 zNM*)r9}n#uJgD61IKQm;uu6$e8I^-+J#i{--2(fpXnD)=P1T6}N0EaDZO2A*oD~k2 zII)nZ-sU^AbY18)kHfFkS*Ad{f1mUSSK|DKVt#8IHs`5l`F=(4Wc*|wYPWgJ@-XXf zWzWGGh+=FB)MMNgXkaA}4$3eZXp#Oi^S(6S??#}8d10>-2fw_bdXdJ=+Z)A#3p6L@ zrsh9_p&(m(x`JWewcq5{_&W~stZOfDg5}ce-d8Jn;a|CdZADa&mBEuxqi2cL2@}dD zAk}tMwMFYNso_bb`v->l)l+mowf`X-k<*4N+F1-^^sT&4LS2n3RDG6pg{luOhr;am zYE{3j`jk`=p>hwa2|dY+O-*Pziu1R)sC9^39&6k1gEw!`ZsSg9cQDXxwmv^?@;r3a zBw3`8uc>vgKMPaqC)Ry&nvZGsXu(|!{2Kp@FY*N~Mm^0G4pP`p!JsfsVTQsqg){h` z+K(7AhBTB&sUx4ARENc{_jHd)+rzJA`C?Wi%!*`Lkti#YWVJn%p(n#@>32QGx0sA^ hWX$jd{KoQLcNyU9M^Yc&Pz zimGjqQhbKmP_|OSt(DCIa<10l8%+UQSm{+> z97letBXhyS%pCAr1^9=C8ae~~#Jd{w?*RQ<6T@ks4;!FAYzo-ILNBv^9Po(_%moYe zbHJ9VW0FviU?I@zZ;6H4xZM*M`s9j&GzJMqV)}26nBaWK&^amlf5T$79Uc&1z_lWQILR z?cy&aG?)qH)Med)ZI5Y8CDB5rI0OWvO_M0WVKq17LH9n6E5*^s5T|u5e9w(EcMEeZ z_$7~0dtoGmj)kU;%e}L9-A(M+MBZd1WR!x^QJAEO=ZnZK0tzax}KG!asJAw8fWMxtF|B&?1tyGbV;vC>2vRWh|~E1*L&hPlomkuhQg4oOJ_ zN?S|fQwJ)2VmmxejP_{kivV1yZ5uu6ece+WzpqYTdQ?gwJx1anq!Mvm2MY$sP*J5Y*VoxYfnv>Oh9LX;Td69Q0b*FzGI4OSn7JHYuI_A0w2 zsV`*U1vH^?05cq!F|dpItaIVuftO%o;gggt+72;Vcs0qMz(k2xWgViL5jcuX z#w2tKyBP(cjg@=*nv^JN0^v;}mromXk_bh;reu~PzV;5d;(2~{y?`q+3>^@+5kPRM ztOj<|t^tff{*!DuM9LIw-iW(Z$gPqIO*~+ts3SkayXGiE0@E(B?KaaoQQ!3Yhlhu| z$&qFv-W77(59mQ3oT{JNOHRURbP}GX5u&US)n(9opMLQb!qSl=f5wcX)Ml=hX0#C4 zYdO`U%nZ{}2or5hhRFXwvvhCSUPCrTUR79?`<_Dkq3Kh5IrE0cib{tZN$X-1Ad6SA zR#!(<-G(}fHJNyfk6DOswowX~-fJo%D5i%7wW}bxm7VjW7Yd&g5xnLzf-=GT<~4;E zbIr$t^u9^pjN8_;6}+hRr$`dv^LT`(E{p$yYX?{yr};K$G^7FQ@d&mUr5f5U`52G; z9*qbOJ^X`^G~2VE*aaFNqysaw%Xu3>-64y39B|~d_B4@Winf9`--ID#g~ne9#3pbn z_#-r`DQdo^gA8q>>aggt9~(aCOOBZT-eK?AJ9dZNX7|{yOtXjV8T*U9Vt=!@?2WN) z$ElAJMA0qP?+5J8fZZD~Jz&oU?A3t19T;}qUA@ENf1BNclDkmy07?#_^AH7v- z*UT@?>MCx|*cEgPUl`X9QoHJlFvRNs14hQuw*~zL0`)lk(N!mrC`9~yQfOAW!K!gg Wkyk5n_Ut#jRyZLH{yZ-}Bo|l6F diff --git a/docs/html/.doctrees/livemedia-creator.doctree b/docs/html/.doctrees/livemedia-creator.doctree index a44ec5a0bfb0af4920ab5a6bb95ea68bb36f71e9..d9049c9778a61269cd756670cebcd387d171b957 100644 GIT binary patch delta 428 zcmX@Jf$P{NE|vz?sRA2WcFHlX-n>uFi*d4(k}OAFzHV7&QAzA%T?PHgQ#E8KCn!iv zo~WQTd6T;Qz;ahKMJ6+9$w1U; z^-eC*k>gG-C@oe9a}Ed%j-5PL*$iy9ptjOvA8kdjxswy64N-Rwlgp? mfWTzM|F0)6vsT$^$yo89bLylSU{QwY8~-!bZZ&5TodE!R+ln>- delta 413 zcmX@MiR;V;E|vz?sf-(0cFHm8ZQdv6#mKD?t*e`tuUnQ`R5H0xLvFI6g7#z`4VlSB z8uF8;E2vEF)-V9FWhd{~5S{#1W7_07no^UmY06G!R+5?gUUS0ahe{HYuWHLq-l8Qj zSx8V-{;0O@61X1~w*9MRu~E&Veh}W2a<@_3*l+rX`l8?Z%9Z75}GhVXEbvDmnu!&amB(kx6t00NJdG(EtDd diff --git a/docs/html/.doctrees/lorax-composer.doctree b/docs/html/.doctrees/lorax-composer.doctree deleted file mode 100644 index 7d200317ac6b095c9d433ae14b0614d962645cee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4153 zcmcgv-D)Jq6_$2)Mw(e^q}}xjlihVX!3o;UYGmxaFd+m&5{!`%!3l|NFg?}XHB*JU zyE^qFjV>1K3&Sqd-L{`0Ay)=JgTYUeXYg0me>0<%tg9Uu=sI=k{MC0(o%2=i+wtz2 z|JfZ?FrLrHBuR3SP*vK^M8qbexh`LokH0RTm-}`g$(a&H#wfe%F=Oy@zy`++*xp8 z|C`d=1flnAzaX$em+X#-h#eBGC6A1T7tZRNJWD2KUyP?Uggo+Hp-bM=C|N84EfB7`{ z)89TGB66ox24{@NEZ|v@Qg?$Y$b_W9loD+uRlz=;je|faEh&8pHZr4uDN;ca^)#S5 z9zPB~7iJifJW#mOG%(6(Zk#)aQx2^pPdqU`DY#xV=ZtGMe4U}=;O~@rHyUgahmb(X z%D39J;EYC!YdZV`)4EW|3u3Wn=j6DjYg3$hHUUqwAYKeKR=f476`bI8a&vg;ev4}4N~0&GKhok^>hnoL@gR<}Bd z-lVUtZ_+P+rW$mT?a#8-PN2x5cvHLuc%hnC3mJ6K6wPZ@md4ke+SlgLf}w)tw0o7|--9bEW#vs%yjlYe>Ka>;rk=H1 zt-quxajlW;Kd##S*ACk-C*{$4ZQ7pQyQC<0h3_(sN(8;K$UbF{*%S7=qg!D1kFklm z0~acI=htdy(Yob)8A8}i_p;Z*@m616>f6_!J#lB(?II z>!pz?R@+*{q3d7VF4Xm4mpm`+-Kh{d7n&|?9 z(4(YiCUJ4_Ek;YWBaB{_((_VE`)FlnMFji59aTa*1Dc}`mp4{U+Fj>>LX=qD&6RdL zCHc&t??Si}bkjG`MB96k#zH1xLJNQcYB-Q_Z2Pgur|=Qs;7M2@_4vGGeLEsXi?Acv z8ytw*PE1yWE$R?ePv8KY%t`75?sy79n=5zs9jQ>%BqE$=4o|yu?mF>s@uY`Htiw}| z{>HDq>Pc@KMY#S;V;C zDyMK`uK0vFePRk2<3=+-Z`HZ}5+D(=Yn!{|zw63@GSM>MF3lpEARo`6i&4BfFYWyp zgThHjGs4pl<01wMH&nf_H)(!a9-GK+R%HNr2Ndx<;lQ;Ht7pqkUw5DgsL+@f5u3!# zThCFbmZ;TC1~Q~g+l6~A-8cvOh9g$r`|L;d1N)wRXY9aH^?3n{T)+O~G5h|7Veh!_ zAMk2?$Np#R_Tt5PS=%v3QF6vWenoM~)$mnDFH$N#43fCMED~vp1<(4{3bExLEJ++R zTK%EBOY%`9rFK>M{;I5cXUz_g`mr!Bu}gb97HNtw!w1yjKz!Ld(OZFEyOk7c_^VdC;CK~?)t7JrB diff --git a/docs/html/.doctrees/lorax.doctree b/docs/html/.doctrees/lorax.doctree index bc096b53007a35f8b69b0f918bfcdf75764f6c75..8e0b0fae02636d74c7346364caebfb236b8ea21c 100644 GIT binary patch delta 416 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

      tz~d z%XC-Sw(X|fdv_n&opBj18SGJK)K1}d3cI+%q;DpC9ZkUfO@+Qk)K)@v=fA-NMd4t2 zjYrc5>8{=y3Tlvp$)HA>gK6#i@fGBDb9I|g6du2rY8ke+468S6Puz^>J+QPu!T@hh)xy&x@#gzV?)g?LpDsw@xPWZ7cI*l>k4y=YOelN%@ zlX90cwwB6tBK0|W8vZ2>KtTg4Nh?J^ZRpkK!nZrU$2KYBW7Hds3yvw;!b!`R36 z|D4U2L+;KqX>l}Uj6px>!F9s-!)Ji+XOah7d9SaYvj47$m@%GFn9;xVGz_y(4S-p| zF&iZls#9?7G)$(b*IRe6j}`Kbyo+;_b-?~m=cRnrvAsO=QvSuC5&0~S^t=>~ML#S@ z9x={xy?Y5IS6+JRDvar>rT|D{givy&yn~KPvbSeUQgScdnxy28)0bH3H=*S6n;PH^ ztmIzf(tM7pyDmlDwVpeO1#a@ISPz!0`2NVS6<>4GG!@vXr0W49F`YwGhKpF(UgD`4 z(wReBp$w0nR9Y>5MsMbj*JD~UbtkclbC)OHq$+E?!)Fr-9(q;zP8alURr#Q+X@aV} z-?J^L$}XaeLRCKLfT^ddyyEC!o|L1F^t=(XC#uRXOaslWDr-{5ROKxgaS&CRz?7;o z=V_*PUX7o9Rpl$=3Wipv)X^<>r)O)mNyA?vP>`QafcmM=+o%UupWmeMu%x@0Uh1=g z*-wLhFU`R<=yI|Kojhnnl7F8EqC$y&w?|VU?FyQZ5^c~VRf&G@0iH`qiYv-jA;S&P zj~RuF(mjo^Uan-%HJ2Jv%jF8}Qu`!w{n)z%G}>Yt(VM9DjHEcB?Z$HJpmHspl7Ws; zZ-bT0Nu&yjG|n*%h0GdnVN9*~&I}5>UXZoH#{i)}!Imegq%y+D-Eb!TOV7t{q|bV+ zs!&q-43MBfN=l17&6HM~^dXvG(b$%1%|qU>s);Q?3f}{KWvnCNhg#wLnuAq66~1r# zvn!wFk*@G@Ec#)&a}>+uD@X1>n9hH1)&zPj}J$+k}!go1+NmBR} zcmpeZrKn85+-?kOz~^-L6Q}`9&gg57XOLqXL7PM#cp!~s>)_Ndl1 zYM$QRE)3k-+w)yb6STL(o^45ca}j0~+S`2&n0jh&_c}V57yD?nw>_9WQF}X?2AW%Y z)1;1RZ#j%Oi1tQcO6`sFHPhY-_}N!`+iau_)#}T2c&wJHO;N|o5bNdM^lq;_P=HUT+d5LyiYXo*%0&w7XQX1ci))m1eiWeW7ZQ%_xb2;$=-#;el?~?Ukz( zFn=mdfb=`0_;t6Bv05ZFc>~!I@OKJ^JjGk0fX|%z4NN*mNq-7Zs!d_x15j#!1KD!C zIAC{-3V=yONRONoA21NF4R%Tt2a_r#wc!Pa=Co${`A08#HDj+mnz6)|`V8BMwswAj z&0X@$JI~}fO(7eqYaRacj?vrUa91J6q8%oc)6r(Jaw)+^6kuRfz*$Lq`RO~U7)0qr8fJU&Rj#r zUVXXEKju{?iIr$lTt?=${i%cCrl8BxP>Q*FYuf%QGVo}=Qm&XQq^HbD@a~zJIyzOh zM@s`QsJ84525^Pm&=mn)Wz^uU)=(d>)tv7pLRsob!eVYZH#K4so(LA2y_d+99lS8!bNO#dVt(I^<|<~?^Zia zRwa*i>MoRI6(u=u;mNc&9~7mNVbMk%*KV*l9~dxCxE9gQ^~K?moUO)rV!}EsrgPgg zTA7T_u+?}`RvW(H|Bc+XjgxcZu&0?AJ&BO}}w+avqO!dI>T@pC_j>4KYdl zsuUqMk|`#nXv!4hf^2WuTliF@0R^rRK7g-JMcUHPQCW`d8Iyb}Hv%trrr0g?CCR6v zz#G`7g4$GO(L*XDloB|1d2fFT21xd$>>FaR9GfW3kFvvoo{}?|4`n-xKRL>S=%H)3 z#b1XOEcXIGmR)!WnDj@`R=8G1Ln`f7xhPH_pp%-zdT;;bM z47M%C`>4)rG3{k>eojj!dx;Azw~yt&xSA&TSYE{18nB;B86<+wIMFrW@o$^ftl#XF zc!LWLH^{GXHT4Dg9JMi`07t)US~GsJf&C2^1a4q|-PN=wu=YV~npLFpl6+V$ZXAUV z>$48{d-||GBHiO3G-pyiJyIa zShJ=N3wH>wC*MUKz?GAAa#fscix@NJ&2V_N)-i(G4&fQw0rGhG{S?v~7Qs6RN$%(R zp2pX*3f}DYa{*NcJLfPce!3|(x0g2xOA+`Umc+bXYL#kfO=6zHwD(>Dz<{QE9D$T94Uf4 zUQkN|#W-csWBG*xh0gT0@chxhHi zbN9hRJeIQyYd8Ft#F40Ej~AgR0a+YoGChGr@pCwNEmqrq=l%n?9=v_mjk{yqrp`YW<1JW?%GR<6$&d=o-Yy~cxTeP# zTOfY>N1){#xV*-n1 zk|zjXe;X=^KPG!W9eC`e)~%tqqKP@hf%i${z*~EL{a7xOSdLX$*(UjMG^rMOjx(qc zwL)eMA?P79UkG|QCe6eGeO9vY4mw4v?WGlpOOatMiqCa;$C(79!5jSFK*Av9d<_WT`>)fDW)p~u#lKMl0h7wzeoO|4Bbug34>a}!wftGk2h0)IVB zz8EIOI~GvXXk^;+A>GQvOF>iABX74*7edwWIuYQnis|T)r1nxhH-^`rs2x53MDa}& zb41_pZ@g&8qC%Fa&iTopn+a<4CL#3@EmRLNLaYaW_l)oPY><(`D zVL?}MWcWGk8La)Edu$zB@3g^ zvkq?HnN3)7xiqZohpc1|zCp(wnSB^xd*&wXIo+PQgO?lLp1G}ETWxV&<8~gVmm4FP z)L|z=^>*f70+(9+=-{jbTqi^glO~8JD*ro6HJ^5vNaw~S} zNf0n7xL|@r0u|RG!wn{|DedS3v27^wfEDVNZhz(SpTNfG*`=boU|JO`kUXQXTN$?DT7!6}$Gpac;3I~>M2M!GW-w03GAP$HaBaYe%Oo%!^+uK+b@jwa@cU-Y! zZ>d9gAf>?yjzm6yuLn|ELeWt_?o$_5@>y*DkV zt9PwRK18w?a)?D4`q%;mTXZH3EmRCLi!$4EU&Nj+{@ zc7L>Y-yu)T$nmH#3l9>K5yzuD4@+08bbr^5I`{X~Jg(4%f!hbxa5YWvfz5liB_EiJ zFr)B+z1#s)PaoJ%IXav^AJ`q3J<$jD(lpTAJ}^z{m=Ek4j5vr7jKG9~%HCV!e9e4d zJMpux59~I>g`mzLNc&I&Nz{i}s?%VY_^HxhxQUrpHAF-=%b$`0=#WQM8$bL2p*9}= zCL!*Z6LuZ-;J&i=YPx*VG%ig#eP#Saih9cuGQ$3lhURD2)ehrK(pV9z%mW^13GdfO zJ(@lUBysx-3Xu29pg^kk>lK1Cg3NOd?%xN`393vYfolcHTX?EQWOq4OMlc9t79MXa z-?w4b3Mw0@IZFtvq{Fi8FjUACyhIufwNo=F_445dnC8zf5g&|)U+8;v$kX$A*2}ho z51=9aQ{R)5)m2PxX-IE{e~D>GJQW5K@m(w+UcX}G$nH=JW~nU?%h+v%q-SO1dQOBR z3q8ru&v@*j)YACB;z8osYO865u0qAK)UmY5)Wj<1z)qLLSAmE~akVrJv+P(v2~y(sGFa3B-uT+f!4M2xX*P6tgpwDBvQun$4tuK|@>XX00PZ z^&1RJBc8=aE!__1y4^`@Lm{tIDAke9y_ z34ARHQl3Odr9Ig*CRq|L%_Uh9#_3CvC4u7y@CLRdL}Hn#T-Lf`nOVK9g|qjq+#is@ zeFrFSJl#IT09`&&nhoI!+lIi{WAGB=HMB5J{ zk;%Lbm%v@0?ESXO6DP7AXq>`l6M7F1+rgbK4BWPZgRZ6twuAkiZCM3Rq6VJ2#<8FX zGYZ?mNe4_lZ3iok4(6FS+W6TUF?*uz;Du?RxoroU2V=H_Ef{eS+W~}xx?&afRQmtj;fWRZ-zVuw1V)Qj!w97S#H@Rta5RQx2w{A>f;sE4TdsqwaK12;Hr z19aNNEdzI54}a-muyWnCVYj{XV=L{&)=v3qyZw5`ducX)SnYI}3;Gy7VnKMH2lBEC zs7KQWxdlPci7W_j(sW9*ARM^{y$u%eF(Zh8G4YUkH&a3u&T^)OK-kt8kDfqfn2d@M z&753lBItsiY=Gx{p$>yVCxdb>OKl$esG@Y(n;jzZXN9HtjFEA{4Em98XUu69Mf8v{ zK6OaOLBFBFYgEW`5@HDEKPNb07ZJr`@bGV|c^m%O787>x8)B3 zYAD;#>EM*+JC&V`EIL@s5oF5wJTo5$NO?f4ThOWT9%FL{VSdItM+ZdSM0f6}J|?&L zQo-O`|2|l-izZ33un)5fY?8`NdY(yWJs;bq<7}8<;c53Fg#HFQXFf1MjUI5 za3fzU4e05bP*e5N9Y!w06C~G2dY;X>NCU_yne(9JCXB0Q0VQ`2g%LF%!x~V*7#@3% zL5U|jSY8t4iP7C)Ko$Rn33jE>Ywb)j9o)Yb@4R+ar`~AR?hlV$#ngtd0U!m)Yfr$5 zK-G6^_uu*$*laefxe8u!R_^DtBlFe+j??ZqVq0B@2{QJWc!nc}DhVR#1%Q9hc2Mv$CV-5pqG|`VwYkh@>oMne30%WXr04woepA8>Kq-=)amFYcT z%-V1IWuk*J*9yV`B@jK}b337&usDjcS%`U+U84gEYdsOS+?xoMQ6Jz` z3K#BXg0~1Z*Ju6(_V30)AN_)Xe>w%E_-!<+!7)$wwV$AKLY&|%l7P|3IGHDoAr&jj zPU;=(Dqjw8L2q7ccIjQz9BDC|GqpC-CdlH$j3`o(Io3QuDf|c_&1}h*wocqlQz=!2 z&o*|Syx$)Nkl5?~+7u$Y*Zmqr=-z^sd@%yjm9XG*#_{zCUadPS)4x4ql1K12ftNeB z__ygxl1EU1H!P1Jnc~*v5oFKAo(_*7pD4{E7>StW=rQizvhY&*YV%s`WqV2Tsh|u8vuq&xEoV&1hSrWv!(;r6r%lS- z0yFYp8JMMcu-2a0bFH-e^o-u^40$T8B>=p=Z?woRd>iW(TJqIfUX+<=H5Z#J(3pyO zruDWP4W#zs-~6ApK*aREiD0D_$jZ+M+l1?_y-dbn5qdbGBFN+q3o9$j*>1f9xmNxZ z&bPa2jN_~G_0Cd#rQV(3Qt-q|dnITAh^dT{z#b8>s?Eh@^P?#X6_L>d4?bQkmMt-v zXDx})LPnG9iYN;{fUk@u&m?qImzF(al8p9az{@S8y_miv$!H3^fn~JF8(GM}OcBvC zJqu8xe{$y6ZNsZS$>vED(4K6EY%$!1C7->>ufWf~!r7)9+l#m_A%bCpYHxvL+@#Nnd&7UF$;QKfAyE8+ zkbaJOaG~pK8d6K>dgiumx9>-3FNXvLFr9+e4`?VZc#Zeyt0fb5qdlgO4z>`!{TCjk!)#V!dL@xk9_M~JXCCZ2xqVDQ4-W^6<5UXjzJVWI2 zA@B59?8zspgNDd0>S{>ineIY+mFly|$Ad9e?Uc-Y5>6(SEH^fHBQFw^J#=chK8HGf zK@H(Z5VsJ-l&Lq#XO)=?mX}-2Dodi8BoB-zxK_VsW%8aZbIa%Mf7KahKy1Z-w1N}? z^zKI*DKuX_0$~TAUdlE?)YWgTuRIgZGk?{1v;CCu*iXXM&u7G1Z*nt^9yzf^0^AqH zc}~Lq#3(oFSs47K0pL$8i|3;0`Ex4<=S#58HGYghbn^fZx!lnl7+W4TFI2;bEe>c> zvM%OqVI9st)DJ+vfD^>3Tj%)z^fCXHS_3kB9MR~bG?9>$g1-BE?Z76#f?B7Ev6X&j#q4 zAkNRaB#85K+M@%Xc0un>>Uq%BG$E3_B{~--Dw+5_99n*l{j1dRXfC)^g0dt;a8t_~2v#$m`dnhL;3Al!VwUrMGpApf+>(v?4$r51)!ZJoV^bBqX^WeJOQzI4|{QWi>o1aG8lN4*$V3C7ry9Z)I)869IRJb_=4M@{AXpp99AAvXjjL5QQ zsFWx(f{3>%g;tI7&0SVY95_<3N`zw|N?R1D7fSTl9D+r=lhgt;WmC@7w> zH39R^HI!s=@{p2zJ?FFyC7BM#`$3SJW9xY;$&3D*hR^aySCTmv{jeOR32>I{-AgFR z@?M0l%X!vUNtQwsIx2O+o-s*Deiatctt7vWz9cEh3cP`p5TO^*nK!w~&t!*Dzu5N|E;QWA^Pjq!CMeIJVr`8V`_AUt50{6u z!f*Y&X-)pqCiOqNCU(R453Z&?VYCk;^PZMmNeaGe1xKOapI?e=Zao$JF-HdziP0+f z9|5@&75vAif#z25HK}6?{x4&?K@@xfQ!4m;12P5wSMam1g1_@HPI2*O01|lHrm~+w z{YB_z^$zo>vTvyRc%s=x&aJ4AAoYOt4x=_kxC7J$W6q=y*$_70PUvz~ze1fIs{W2- zRi94Bn65v0EyvHT^goAY;pgd8lG5LM*oZRpTn}W0`hT-WQ=$F~x{&&B&?Qa%U%U6v z0&*r<9yVWm7M-e&a?T@BK46}5VF-fiyugZTu#T!a$5^Mm3jaO5{$xD-v_g{!-?`SK z_YD^YP42Z}j|}3@u_du}Y43;YnjY&Z^k6;@MEWayNU3&|Uvq^=^1Tt?a-`qg&9UFm z@1%bBlMZ(9)bD=ApBeZpk97TxW6=-GQE^(%a=m*A{Z1ZyP}BHv=&Rq!I}{z2Xlu`y zq~HAp7SXNWeSp3s>30gef%UtxtpKTNM=7q*t9nMws!@_Py@SJxoi%1lQ}-@Q#8&7R z>&|ofla$>k}eFkza?xV%3fb- zPp+{>p>}-FfnQIx<2#NHr%&zp5@t_SJHDL;np^GAq>iZ_AH#@)s2v2RR695;Fty_W z{OqfCOx)RNvS3b2uB0?5;|Sm)wog;V)!~*hfWTwI_`}mv_;CW8s}EODXNUT5WwQF9 zz;(vmPSJoIjmwiX1vP?}QrX^|@jyW+1!a$>LMaf~l2Tw`o2nGNDRI44>Wc`h4LYav z$_eKnLyW%}A$)o$(|`cpZe|WnxH){O)|XdMc@OS7L};nRZMf`sps&y|c^wxStxG|- z^fDfMmXHVa%E~O{fxB&}fa)a~_Q0V3KDKJM-f$KpjXcF42RdmG7+2isvD89e;Nufb zhD&O-*@iu^qKPeNndh&eg9uJ09pqL{NlOR$b&B0qdy6WKE!L@|BFq?4{bWvU&A<96 z>aKvJ5fVs&;V9&fY_~4n(8Ple-@%<@(zUMQ5 zl4r41G4K>WBtpT~PeDQd(w!L;YXd-mXXXcE2t@#TW`3|C6sG;`DE1_{V@Lf^hc>^} z!M2`S{k!~`hR*`leME;gb1eE{x%1Q^-n*C3>ZRlY<(%IFzFNH$QPEN9F!qc|TK(s+ zh;FU^^YkT2t5@I+tkqK%EUt)UJcx7@w$p08m7>o(vS980$(sCnQ$VBhr0MXarP_VA ztgbd|L-Wu6Ys$_uHTZu^gbZ4Dr?6!kYkB23zNkxp-9KkkdaE@OA=1}1Lg5bx zw}`%eCQ+JCtiza%AGI&j_;J%3|A!6LCKpt0KjuZQrU`z`3q0GBAJc{GC=3cy4w!lx z6iSW`ra(JdKjvdGd!j)hp9Y%SprA<|GbsE$_-qh^0)Z(F3Y=G&LE#_8mPFN&2N07g z>lR@rK&9SdS0b6ck)4fjUv^fPmM8;MY%wMS*6J-3oPaz|zNRh;Ba>9#saGNApOTwz z9V4ji5LST+*fB^Ut)a&J1KXPn-xpA4hxuX4wrw}<-n;wIZk6&YaGT^8!sNBIm)*X~ z7t)yA0`V-LK_UWg*8>q@glKy-6-EewGZ`TaoKuYut747GOfB|!^zsxV~7`~3eu>5dI&jWdN^GqmOCXOl08JTYu@@9T1ph$ z>zmG`BEO9FviHmYuL-`U@5xD<5R+TgXl`cJ{y6QWkuQ~IryDc1 zY*1}9vgK-RK09A46|#+~;_Uo%Fk7B!-~n}2FlJc8DRQ&>_Lo!8758oUzxJ}XH3eT& z3?fI_mMzV5pH2WF&B`qRp_C8cE6vLD5gpYHZ_k({&3+Vkxuw|$=u46`tH2wIG|M;W z;Ljq7=C4|yHGhSbi1)N1d)$;m&~}ToKk!82SAoR$Jlm2; z>q2-GBJC9pRC|iF8Ak{6XdA6a`!672qDcGnG|=24ttNF$r2TVDH;70}U`mme^D7ha z{t`b65ieDwoxF)ltt7!nVOC17vSbOB%tKv!gZVeD_1#aget0|R2iDt{LPkS;{Tw00 zy=S*lXNUN@HBo%!hXNO06Q0t30S(HJlPeSCS9_F*06XV_iV$Fb)T5~oUV^5nbiI_FZWN{nR$3+tI;1Fh(mH{w-!t6b-+b2AW$m)TEAyh9AL*gNTL%rW6f1 zD=^XUWBA!uG@Lk~A7GP$1m{pGDXIrmeVQt+4zHYMg1{B{!!vy9qXae=05jCtApkyA zSBVx!%OnTZ88cO)QTPVjBugCH-6A4h#RFI&;uSoa3K37>MIxSoSE`72y|FU2`U-9b zUc?)LBjPRG$U0GpZ<6r4ry$8MD*0~RxO)!kwQk|=`F&4L!kw7h z6z+~>;R#^!9jBub=rZ&plij%eaHcv_E>-G{Y;9`32FYz|CObRdC}e|Ty)jcN)~DtR zfv8VyJ_SOi$9M&6w7?T$tM#KwTAa9f*Pgw*Z_*=#?fIiTa*fQFg-T(%QY;nAv$@$) zzECR8%GYrws3C^wK-iBqER>6dg4Ix(w2hXPO0F_hER~Ixktbw|E{Sx5aD5X_Z6PK` zFQl+=M2r^a2Z_;~jcuXUycG>GS{^l!hWP-#Vzj(H&{2sO_KZnl^nV3jZZZ0&=}VFr zt-u>tjLw^)rf}V)2+|YrTm>bpiV>1U>HX`>Q;5%$CQM)A#Bf;R^qc({l8Mv*9c_g; zJt8t_f!b0b)T;0s-TBSlXTR==775iFt?*rh;d+E>*I1(vsz2qxucuJ`2}cL>_!zBF z{T|GoC{#a?2AW%_)})RJ)vv~gg9z0GrWC3`0kBiFe!>ifML1cxR&^P`hU_YJpTDO3m z>w9t%u*Kw-fPJ%kWYv&8BQ{emVNd7hXUc`yN_KXpFr6*W&ji_^F~tp zOqZ!*ab`9*U6?JE$}<+a5xVe(v(uFVbQG&$lrB@HNOkpR<`gX z8yvO4QBZn^!BOhaWtY=+DTiJ}B@?#}sbu`%vlS#$rZQAAc|k$5;sf}qWK#A(MmXB2&d)h_*r%8wC-x9`?j2&N9+9{=wc>FZINRG%$@#_!2@aqJbH)0B%zweNErsN`kR64J_(2CuJypaHI69ce*=SY7mtpoq74dy(pt)5< zP3oA6cpM`Rq9PKQQbpvv%2dQ9{OqeDUTG*G$jDn>MS>?ClPptIg(b^<=Gj_pzVPn} zl=1NY5TJfa;v)6nO5)#XJS-(K6IT)$%)O$-j4O+_4)sR9RH$hN=Zd{no%SO8mBoccBt zQ-i~Y_uRybJfk93qj^s*Q$Lntzh*n__DT+R{@gwHW{^irEwl6VTeI6%Zk~rZl$td! zoMo(eKK|&BHA%-E^XMglq2&rgXyWVcD{aYbjE?Fe@{_i<0Xny|m7_07(v|{mU}D!&cN=)|nh1(jROYPgyvh*|TVZAr{>Av+2&>*WrZ zdWu;;<>+ww#H>3od!m^2(lpTAVwNU#Ow76lBMu^F5tvfU;=IblteyDTSIm;eb#CKD zP%NDznP48*I1>DXA5QKvzs73og&!b5#>3wvF#UwA>!=48vfit)u!JnU$r+QA0CO)H z>knxtE@O@N=o=BS9`FELh*%%>XevZ3fgy=l28MAFE0T2Cx&^OUT8l)_X5#f1u~sA@ ziPhp_R)>WxVL{mgoZXcUC2CStm9Z)w%M6-46sFN`wc01?6Ro=#a)(^+(>tl=n=jFN zjfY?8o2n!MeV+9S;}i|Q=g4e5115Nx?Yee(vzE!S`l@8IkWoY+Ya2BInnZ0z8B6*N zzeT`u=JM#Tk!1bgl<6BuO7r_yk6u3jx@h`!P7e#w8^HsO<}n~En1MKevk?8hiuib9 zEr{n-kGPw`<1;lX=Yxdb%&w&Xooa!D6k|ISDTXqGCKelcJUkB*^mmew1@Z|Vy?PMq z2IWr?%u%Z^ciXKKAc_7WDRiv9RHy6$M$O~R>T%`;aM0>91BWAOy=b+JyrqQ}a*2G~Wj)yxu z(6otjE{HSb(W?h>ZX~`Dq}jLojsv^sfC+T8B0krbYW1Zm)m&rzBo1kQt|y&8`!$h< zGJ_@-8+kl@o(I}Cv8cw(Z63XP5R0mUvqCH@c+y!Ajr|og6D9_^)oPh7(EX91-feHs z)K{uGZfmwr>4v7#`i9ozVMC6G3m%Bt(*`=(%5WhWb+SgJWcwapw%1?|BD9^ZPH(WUN7?KWs%;t zZJ1g}`1;$=`76hu@_OcWWplJi4a;$>W+9))*nSSfcI#RRiASft*c}Cjw3} zxfPtSM+PVGqnlz0rt{M?^-8f2RLb*(Vm+vr3ROzWD$Y#J906nH=c zzy-AA{Fi|9P?2gWKR;cY$!8H0J&%xxVhPa@m11_PFh4yzJ6)Qs)@Ru8@i1#M3}ixG z&VWkLqE_!#JI!Sh4GGj;c-Hxz04r3_9ABNUca~811*IPY1lRM0&SV5#b$r4GQ(?&_ zHkfKSOr{>V6PVJV&Uuv?)W1Y*%d;(0ONkVXxCJ^er4^CYp{}lWIw*0C8to+VouDGw*nD!| z4boL@%kT)O2nM_(g_v}gJ;)W6FA`eZ*nW^YJMu|UP$X(F2f)JCe%JNg=DqdnZf)Lh zw=)L5L4$J3=#^fhL=5l?9;gTde9fb&jWrqI4XoqlV%q?JxzA#+>v23=>5%J$)r?$&CJ-ti_Y_n7h#)Pj|O z#_9xkvAcecE}xzeXp$`f;Ib%<4RoPfnImF}Yel+3E_R8Ezje$Qv=kjwjzG-W zT!JmEg_0p6;ahi{EySQ1ydyoKLDRuv+v%Ef#DQzo1LlTnHRq{y4t^9^fLAh;D~rpM z^2eJ_otn8Nlmk_^7b@i#md-h;X(iTFkdz=qRz!PAfjErjw{ULY88E(kf(v{p)$#0*Yi7~}480V9_ zW)^}IIQZ)ICGv}j1#=H1;Yh=R^^PsK*abHQG z+eY=f^d-qgrNA55Mr8(el02PapXw3VNxhS8Q^SgCTAE=mK=7vRD zh4Jus-?Snd#sceQ+b|BnP?cG1;x$Va{-cwIHV4bgt!9-egOm4UL5t1I1V*MRnM_2~ z;Wv~1>V3CpXrs9=UIx>*TX9*M@W|ZhUJRWGo?v?rdLw-8m?FJ zJt+)nruO_A+6oD9M5NGCpy_#(n9IHD{HC@V)2@Es6D^VkHCo|^3B%DzgP(Ij<(3Bj z%+)kO8vGN_wj>R@kR63I_+9Zaif(6{{XWmN`v1>1I;ZBYEs9f!M9<= zL8L(fQ%ZxJSD7^U4*dMElLoK2j@|#4;}6e3{a+z8xHR|->g}B%A}r8w zTq1mC)c+XiACU@69^eb9aMGixkO~E+Bo!K%rb>k$a!Z9010E`F3G^f#Lh=#bK0M$J zJ2u3kF(bz(vsACc5y+A{>hL($R;xT`LB96IJcVS~=kgSV7AsTu*m8S$6@i)Pe-i#r zIJ05cZqf^HOac?(Z5bBiu7uA=IvVP#32!C78V~pMz49dE-pqR0GVYOK%D9p*OgVRS z6KJYDpHt<|zNtbfIxebQO;lle5O{fYDX!r##mClg`s$-$KgMCN_YFH`I&j!+soA{4 z3^`qHdx+coFz}VrBspDyH?W*;7C2%V1t~&$j{--m zd$NQ+tlB#h3n>CCCiTI@&|Dbjh z6UTqm6B`o8H8$Zp39*Pc-q)KAuCYcT?S8_6Ur%ZG0Y?Y(q!_KV`!39$DD8eM4K%m3 zt4SS`c3+7R2a$FOOeyVhR$$WZtMRk1v^yzmpCr22`A|#slT1W`!=Ald%lKJ6;LvwJ z#qZ(26L`qxCE)#1-CspLxZL|qjhmJKb6H&OWdJ*)?atbX@%YBPBr5IlZL6SVyYumA zp9ZRsaUbW=RLHmjE0S>ytWss%6NxLv!9NM$*7Ck`x(TLJiajHC>D_5rT$X`pVv&z3maG0tUXN&W-e0IKG zMP1&RVkJ9Mo5mX$g?eMQTB?`lr%M_HGo@-mr%dSvjLVIOFFcW`%;r!-w>&#jN9 zj8VoI%axnJ21r^L)XbeO6z7ZC*(p2(TrOAh*_nKyoNd%+iU+P0vnMW@mdn=0OXHh6oBQpj2)W?y`U|;jR!o+m zmn6MZfj6*TI%%kH;*Hl7&Gho*YH(tJWZiV%kP5=7iPE%F^J#2}-cX~5I(`hvqKB5y zR_LgsA%xaaO|4uJi;KgqPxdDJ2~V6zQ`I?cmD_RjN>|ea$I;Ju zwk5}r3)xYq(jRcZ)KisypQD3$xQ$koehFqzRHfgO2AW%y)})T9(hC@I5LKGMl&Uo6 zRi;WG$Irg1^bVnzxx?1{L7 zEl}y@SNbN6#*da~L^W-@d&I5uZyvx4mHQhWO@+!W@FbPnz%xzdK5~_j&}PRQNe{wy zk)cMbY?bvD&nq%roBNvJT4I@H%GYGplk3aZG{(!=C|^^iA72xz-DZM124z2JQG(Ga zKx9No5vwj{x@~40=*U`m&VVXuCD@>tKgIOEJ@0z9Z^!UQfBTjU8;@tbY{SNWatjS9 zAk6fU4SifqgQs#DJf&|MkQmQtU<=jeO=pPla{EIX=ZAu?7%y)GbW}2pJ!6s>Uja^T zF@Bc5B#H3~yn)4d)4jxM?4=0tJ={yId$I^WEboe#CQX1hrB#90u-r?xr!b)DUfPSc zLv}Bj1ki%J=|vJP;_fB>LG37}86Wk;hJ<#FP51&rEF!e`#MjS*YCNQN;%vpiS#C!0wuS|U5LC6V?^2o8@ z6~Bh>py9{Ex6|Z)((7}m2bW&os$u)?wYpp_HUTzD_ygmoBj-b?qx*5b4S`39X*}U| zp}pFw@sw5gL%I|rU2oO8JI0g+m(@oTwFK3V87f(pVQ(@_svo;ZR_?A$%1Q=DS!8y` zU8NC)2>4sg+r=oNoWUe@>Wu1 zF%%jV-7yIgs{V>l?2Z7tUyg=7F~zuolef0(cS?|H2LnE({G zuvq=G!85Jd(RGBZR)p<0oqg;bWIhLAbKEqk&Pdr#gsDXlI&IHRm=+Wz9 zVl>HJwybB~8BDsw31jo*`#mQ359&1@%ELiX{VF>8$=c^ z9$f6|6j8Xp=>exuxWDev)TT5!KP7g+DNW&CTZ~*AJckE0AXZQkh-bHS`6)eL&sfg=3*t6M{_XPaW-<3y7&snUO%_jqR zv^VuVIi*^Q$xV;;+9C4%YA>{^CAzS(vYbUN4^-)7PSND5r~Im-!kMB(rgBD(XmGU@ zOj^D&g%lA#k~mE+)Z{R4n~9L7Ii+?aPZGMXEM$VY0;L$Y$r# zz~-&nWeS%TOYA#7m)Xn-xtZcPtlCHPxPcTJD6W~4nFWooPh1Sas}=}K7~^3jWZ6Ph z6ov&i1?fN&ZWQ9825-$C1z=rdR8g}*UAwE*Dx#_7mfIi>FF_q4j$+5K0#*cHl~Op8 zt{(fuy~NFpgVZ_N)%WC=>B+5=;ko=|SZ%gyM|osReX4=DmicmawmMV5Yt7S$pqS1# zvcc5sbTugFE7e+q9~Mw+QLGzh!b)eguFr#E4ynk_PJ!D~&~~2!;|lc@LE%cau<}wg zul(K}KaS%Bb4Vo&9hH`DcT6%vEdnpM8R~`fCCLoMPdP{=1Dm08hBuk7W{Mpulk809 z{gVw*w++dcEayqHM47H+fg2rx-J!kZ`rrJxk-3szinhWYH4-{#gVd8^ODeSw#}|8h zy~YzEGD&HK!dDY+5tGzejMRK){hq7&>u;!cYs_Cat%-lxko}qqGPf`JS6odKe93S1 zY)igm7s8{kn|;awQ%}3uCmbD29cZ+6v)5tvM7!AoX`s37W}4J7yV;Lp#6j$41g5l` zaeifXv!B4vzIHS7kyd`5ND~#AlaNeiu>7Vq&(?~~!|xI(U{(+_rD#hYHIUL4{7-gykv%D zA1VN_NSVHumfW{bXT8>~#ZUG27-zXqFz22B973)*;g&-jUI%*Ec;J@AvZLk*c;B>s+F;y<-iY0)OpH{KW)DZi= z1I7mQg-T&sHmp<%#ZuX7h)9ZNcfo2oGn<>8nJSkGx~1{HNIsX(75Vcb>@5`i*2!s! z*_ZDVY1+o=Qkp82%f(z_W~P)98_wF5ij@+|&%$=2=p3O64Ol7UrYeXgFQ|qQqPSzo zH@Inon})zm>U?J!`p#Xw@7sumE-q5CneqeA)|X8&mYMRohA!`1DB64g-#`&5?xCYn zTI?B+WN?(#RbOqkP8oC)M!hDV?3VM$~5!O9fKOa`0h?pi#JvReI1Y%5G z96}!Q2|p%eig^cZha4zk58R8`D5@E4-T2F@?8<5eHFt2~4T*a#mmpZyP`R zD!iKwbw#Qn^`&5*YSN1+Rg00m+bjMKKSSV*hkruA`YF9j)PpO%4{BU2rT6kJ?IpZX zB0*&^W`a&#XiD`Ow*ca8M~{{o)-Q5c|F&;fNli?G)sZ93;B~r>zeW)7LnD?W?K(NW z?g6S$e*e*~frMmNw22&!V~E>>C*8o{2yD=J4D=&-Y_SCT$)@TOny)2M+ft~8?CGyV)jH?`L$`Fxn*Td>X@v&A0rMTD-)PfR_46SWaR_+ z*;iIB3t5?4;UUks>$?a~k=UA2Xc?@t+63W)1n7A9$ApHT6#YEv!KLVrYb-4(db4&N z32-L~r^##0jlI(;r~Wk!$q$?>q}!**7!jAv-*})Qq}IRmXey*uficPA2F9sU>n(;3 z#8KGX6>r|vm#WP=Uci%Cr0x~xos<)1XyfVC{}xeuJp9+bX+aYF*IBQ1OQJvMdvX$k z#pI?WdZa0R9D-ru;wXP{kW*iM&EP*--G=_I-Zo!qvsccg)XKg&UpGe|Dbdac-Fo*F ze7cLume2Yb51mg(-Z@8a!{}asD?+|=F5Wk%0TMvGC;I$42J--MArZLZOi$?Gm&uid zPk?|D&Jy}7fAO6D#tQAwU+|*5^=>+4AKbFm3B-{o;-OncWh}j*X|sf?6w;#C!yg@LVK9hz2pjzP9c|UqPq&0Xy+8xdSVxw zn(E_2p|379Pf&?h0fp|cy4+ns((K~V6IF^%n>c*?!9xdj@4D^i9XB3ysVW;xM+?2d zbf<~w)X~j!*$Zy$eQQT_S#gh%BF~RcTeIY{-K+9vAS4n0-F^SURd?TSD7EtLgKo-4 z@>Oc3Focdu+_$GrQfjXTf^MaDlD;G#_?g6Va(w;|dy1cOO+gtL))Z?`7PjD{U0n7nFI;V})VufpG#y=MqOF?TK66YU z#X-67t7uzw%;{=Ny1Q$+N1?mF-2qci-TkeO4ki+#)!pyJ?1{SjFQ$R!*4;I!W4imb z7;zBYoxqg3JKwELcfTG#`|9q6y%b{?oWOJU#%>x;~%@$rMClPc0l=zh&vy$Bh z=&ANb_!k7?c=%aDz)x%6Nj837od@bjg zq@+yd|BXCH;QYhHVFq6hZ=9@`Y*=g%=N*(b;~mnYBJoCh>H zm@aYVP3dRJUt?S~3%KMg#zuM|`Gaa>L-KgRa1xNS82{<+430|&fa6?~h1Ds!X8o*S zN|pjhV6cx2GIM>0)6_aD2S~`xd*EeHPLXY5a?8wxlIdqKpDQCDj1zk#gH3uI+yly}60L6THCR=SatpT__>TaUUN_!<}5upmx z(|MI_cw~c+AP%$MNH*w~kZP~7t$Te6i$}~6;##JMWH_7m-kIO$0i5y%hcST<04s!T zgTBTs$3(mj-eS#RU?s$wX_r{zF>d6DyEBDObPfqA=b%SZ`_y>FevrN-8D7}q*_JGqE`p50a=B@D zT&?VBxqPyt!|AhJ{vAk|Xt{i18fb3Ir6zUEa`^zJ8^m%+U`op+=VxZQ`~-gXwOm$& zaOM|vBo8^cKL_lswn2C!XbCpll|oWOCI4eWj$1HyQfJ3&xmhjwOMoZk9Wr^XwIkip zN6({yxe0Ttl=V|bipYfrJx~(T{eF+8LNpWDlMU0rKGlX9-XyM2Ca_24dMWQq6qz}v z!z_%fz5LFev+asv=3^)@)eTmf-Nq@_s8dJfsP2jiQ#zefYJNISD>oiC`=%(Fcp9vi ztwj!C;yKy(LBRb2)uB?T$DqJMe?Cru;qS?_b zLJC%;NFY)g7&-vS1RxT8WI|vD9t{HqiUW$oX<3jItS~4Ol2Rm5T-urL6KCVb;&Gdj z5!3caSUh!ztD{)^g4NvLp|dI_y*L-dmbH?G;7b8 zq}RO#c)9hux6zj*y-tBQuwF;G$nr4rNfUA8B3s>)^||%tB1fi4)8(ESLre@XWIgUf zejLg4xDTSO(Bnoy4XwjbVseCDTzZOsu=m%eJh36&O=A;&k`Q}nb+`ZRg50gUeaY1{ zL3jHb&$gtyxd<`}-R*HV_o=&`;pkwVeWQ&!`7}tFsJs1V3Vqkyx|=3-Om}-9MjS+U zBQT}z#`&4)ZXdwUj}YB0k7WiM=2BMM(B0lo$Z_56YU=FJ-L^V(H=ZwZn&VDMIVm^!@{4o)| zvK&;8BfuUHM70s2#B!slrPTLya0`D_TIqHVN6^&85*{Hg7!U90dxb~`Jji;jTL-N5 zJvr%sVsc9deCp$bn_phAaUGDaj{4oy59#kpM~o>KNQ6gAiz&0|M9^#(?nxZ&`g zy*C}basR%X_uO*y!0ww>oPg1zzI4KFzI)#tNo`k}i!6zwm@iCc^QCOQa40{sqcppt zsNaTWL-S~*R{I!1kwuVGccqOKemt$#sZ(T9(8|n%Ws#f#-(;r)=RoTei?NHOjesy4so# z4H9R>H$JE&<-z@j58SvrMn|+W)TlzPXr$gC`G#2p2o(9Z0WxnEgQZiC;Pjh~U9z!D zHg-v3lA5|4nN_2kaydn;8bW>{s|LTIY#W0q*&9|3DeAyD!3XfQYDftf9hIJE&zNM@ zcm?osTQ%;dFG*Gn1>SJ18YDfXc&d9@HK_Y(uxjvW(ySU(VNJ>%M>%55yg7slYwz@9 zLT1Q#8`=)rkYNxY!H~gQI1Cx=gT19b=!p#(GBh^fZxdn>Lq=Z})?8za!UphH4*Yuh zZ~wy4!8|EOYXkUQ%${fi__H+7+%^DB>X;4Se`3TzYybqNv;lBdU^akX!q2`ofUEaX zu%0s`L2lehq2|fwS=RdMqxd{L>lUV0Jq~|(W}Cc)5aIg%8PwUK@4I}pw7VH1eB z8h+1OED0=C|6Xndr;wtNgYi$< z7?f9^ayL{$hf(n2#!kE2&EDP$R@jU02M!&~+(HrCumSF(`ZIWX@6MppKqU>`-J|>k zpGtVWSxyC|pICL~}{F{zNj(^*UvOnh8mVDVRLX1L> z{h9-&o_g#*I69aD&1m)5-@@#PdhA!zKy&M{n$$5p_Kg^E5IvT_lzJ@ZW2VQx89)2# zvE`fCamy4KI(KRr&iiI8Y9L=7g=1*B4VR1Dn}c;$n;^XGIRJD#ycBt%bFUw#NKcgfNGJuVb(i19ji z&(HBU&*rF_13mFe&!%qAptyOkG*<6)@E2pG71Wl%phUEZfrlBNBFLzedWY-zIol}Xqd0_O0_nZGV& zXA1R{iTbZXTOsO?kThD*zchgo@~lbxuC_QkeBSPfA_@5##qe!}ZA8dF&s>A3l<)Yc z#eBy{lsUJCv!VWw3u?EZ|3O#N1VR7(o^46ccM)S0g8mmBF!dDl|Hje5JY7dC=)VKA zCkpz1l?Iwy(AT7n3Hm>W5eE_U2}~*Ib6#eG{x9HXUqL_TN;u2}^LP%33IF7>A=@Np zW975zx0_=8@Z3F2U^@qYcnbGFPv~&r{%q>(5bh@(VX7QrQR1BcgUR$=w@`l>4b6r6 zt7E~c$zw&Npm7hhgfM@pM^hop3kr}hZ%`mrnE#&xg{*R1Go=2Ydf9%+vZ}t?82{EK z(Vt$cRpNdwvk%oB!7#x}=2(5H-a%;Ku~vJ2o=WYZ)lwURuY4H@0y4ekgaK3p>mvYC z#ldTj0ARr=g}&K~G@=~qWotxlY%VUYuCPLimbTaB+R*|^g|nk#LS*it0$#lZgMn6w za+$+XZL&MY6iL=Oq7~&b2Ti4tIZBCvjQV*{thlx=lqBd94|6CL`-C@u#Gv%E`(7VX zA6)A*Ku+wwz9*-rmc-O#GG z{OGY|iZ5mw;21^Cst?^RRR^;^pzZPcsiUi%7Mn@5M-NIIMM3(>`bu?j`FL{@<u+p@RZeoOY&-OtZ*0J6oItcbi8-F0{_oq3p2f~wqiuoT_Hs@03S_w3)f`A#!f zY6VMmascj_!E?vjV<)yk1bljqi^e~-x|pRX#g(bX2O8J!6ug;a=e7HZ=S=eMvGjDDZ}AXdoGP{e}h_ z<@6aE_-tv02A7wNW6Lz#A;gWo%8x;rapC9Dc0|SngB-n$3%nth^IgUT_TAotzvPJ` z85cB);adpXh;gB>U{cpuqtMO&z=2;+-TcFj4(8D^THXAYF?*tJ{<~?Qxpi|*>X>f+ zGZ=9Y-JHObx;bYBrknqN_}N!Cf2Ppi%p^clJCjDT)OL!W!+)Xa$HRXn;QUII|19<3 z+V?+d*sa*GOtSV(+sXN&*niSkd>cM3N!@nr#UFS8F7)f~c{F_x(km`6fg|bH29Bxv z^AgL(7Dl+_=lDH0iUw`A&J_M-rjNFT96P zU5`ZQ8fz31;cFcD^^^$jcXTk%l+j9rFT(7J65-FMf##M7HK}6~;T%RBL?R?Gr9{YC zfk}i_{Ol_cmUh)@h(*CJN1P2W7QqEVW~k@+`j9X(^?M+9k$7RelAC@~}ph&rXmKcn%u^q5H-AmX9ByK9AOO3#{3E>9$gw5er6Rug*Yx#G5qrC3>EgDlXH4&bLoEKWuzsQ zimb@ge22L9Hm#jW%{9M>e*@<4aF}18GhT2xN5LyEkFyy3x<3=t9&>B@hIt*vRkJ_` zIEzt04#T7V-M)Uf~;@rBiW=lG)5u;uWj}2%{p(f z&%!50d&_Nd9$O+Yab$sB>VdCVpcl&px-7Op5-C0ST8~B`Gasv;#i3Vue#`?{YjKh% z2w#8O8E1sQmpy~z((t?77$!s++K8^J`dxb(xT(4879Lu@xa6c|F#ybYnW@%0E6ql; zN|u$(;wmDD;JZHocPDOSbjRg;irv%QdaIG`HjgdAOm?ch$}*zsO?>W9^Z;Jd!_kRD zlf_E&uxf})XxPczsAtIRT3uOyy=?`BuMvTb8+@US8Mz0RZ*PjBejFw?R)+l(DE$waC<4re~fD*;@Mbtp}mR#ndLUbc;Z=^DA9vWAMC}Z z4AKaj;Ps*1&vlMlkJJ)}JJ^f+%c9A)j=V zO6$U&6&~!>#`lvrYx!xv+^L^vwpY7kX5c3+c;?{o=0`&<#RKGHe`&kP^H*QF!Pl<27J*!GM`E}b2~%k9$HNnes&Iu7vG#)9Q$7B4o_ zOY+JD%YMzMU!QgN{R>y!eLq=RNrwH!E3x4bG7h*uLw~*c*74PO4fvMu!}xXW65+?m z(gY{+S^jk5{q=z+ijrz^=0D+9pn&YciJes{kVL z5824?3uo_Jxj!I4?yvw^yQYWttB_khwWHRqqFM(tWH+L-k!d;l$mmlK;+dS~%!z`$ zzjoce2dYE|x0aNTdNt9+eIX}qJDs?~QnY?t4AKm|Hr=({i2}+8lTo;Sl(KZ|wH_YK z!q)rOB4myCk2o(iAFbWCj^%UBljgU4vI94^tjTd~1tpeTXftI_3#IJvy+388%_O;3 zsI4>_5@>JblVTW4HgP$4BWJYZN}pk2vt_>7)FRql0Pn z9f6M$N8(v1;@zy>AHEf{C;BLVCk-^Wk5ZF5=A(Q$MpPH1yraTDfQ4u60(&FeAAXGN zK4*u2h(8#ZbWq=i>yonq^HKgRhV%7NPB@~X_(?=B7}LR|vdDazDy|N{PC$%@UrQkt zz?athHR^$D0=@o0WAI5JsxIND%GkBSq=0Uc1MBoV{y!Rp`yDs&sI_Rf$g%Q$bV$=P zgtzg#9!(#lrP>+_yvW;V;Faoayxv$D{=gtO4Np;F{iAJ};Q-7=V zqr5BwHM)7%p1r$o(%-}O{87~GhdGv}FH{QCm13z_p3Tjc@`X}yRwcSnLk!b#G%S>h zg@V0f z&oZ^;e{l}ktz+$1dJjl1J0O1GXi%-9AmWNbHW>uj18-HV1WlxTrcAIp->r6<%yFMe zgq8YIu%sa#vq@>a62XY3IseXGdk*c{cT0@66RWG7^2Nf;>`bju%gzSX*=)I9EN18D z3$^TYqfo5n3&q*`RE66h_@wF$2L=TFOWP(k_WQsFSj~lHg+w-e>oCqD3YQjaGP)FkFub!!_0@Oc<|r;MdcH@k&RB(`UlC z7qcgtFkX=cn%jh-NgXp`9L0!(m@o)TX~N*FzzhKM_}SNl@hn48rT{XsCQEHcDaX3>k8#Dwx@= z_gN2sg(>6H9!-ThFK{DMhJjnEDPxzhLJ6h}frVPH1Y^b!MpASN|B1*7qfFoUlR4w7 ztk=5D8UNn*=VyX!(3mY| z%awX*Cf_K{&dkcZyQn?mSPL%edZ*D#-54E6G3OP)tu+DptSyW z5E0Q`ZLM@CeHL%B*6be7omhw)b0#+IMzIADwi<3}`eC*kZ5*r{2P-V?8wYFRt+;Wp zZW!eIF~}#+ zs7w|1j7bK%D}a~VK)0E`BpK)wcmo$l*lw7wQp$2uOwluvjdPB2+(tyvtwS=*`IX@| zjdBbtauTJzu;U$3w9}6XnNe;B+6trG2uPp}au-I{QQ9zKzuWuiHcwQ@5T{WI_YzhS zL)@7}V?M2ZJjeJ^m(w<`gU+*mjsH5M9uBcV^f?*X>37yhnCQ(-R@7?Qovz%bQb*t!MPh%LHz7FnEyQR-a8 zfAOLLh?rRIP+sD55ANTGhmKefGL~5U&G= zM8D4J5+3;s(5eKlGsp0Y_^=Rk7gYTcn|cl!6*P_3HL@lS8*w}=d7x<%hpGxpdi3f+oEwR6 z1Zno|zT?0yI$-qM1XLuazErEz8@i(MVw0!i@^igOQFRU?Jx3F1C^Kkcv608a=X#)R z6N|F^Z}#ZbgIL#cr0Yj1nNJXn{S`Dr`qVOB_mEo+1&9#wxgD9l?d=)VPtS1;$Udcy zYAUU7XiXkAbiMl+d`l$=mj|UNL(o^32ibpSt^tNro)Iyx~CxnDY*YsCB zu4xf2CBzm>)Eyue{Iwp)*(7-);1rWv&eI>9DV(SL=%(n{>HPFey;3X$mGXR{SP$x@ zLbcSW<%=^@Gx=ID9pn+%9F(~;X~NvW)Ek?Wc~tO$gb)10y^RxrkSLA@9Tt8(AsjCg zL1z(9l(TonX#n{%4Gbq&SGMO5Ho!3}KZx+-d+wDz?11V{yS3m+7gXaDCg>} zY4fAumn`Orxk^Ds_wvZzyT|ZE0!=JJ^Q)!&{B&(5pGAcHJY2TL61=sQVs@%9KRr7; zU7D@dXV~z)-PBglzF4QoBlNqdOkaQ%s%MTPBNfU9tCkXwJ6s@O(lzcy)r6$A>nBQH zctRyPdwNd$^qTt6&u!fI@t96Xky>$>bnX%fQX}lsqw6PpBkKW4wd86WQzQLkDH zeWFJ+{Y2L@vUValir$K#$K1inD(%o{-U!=sq{`8^egfwsVe%VCAt*VqaTKaei%UW! zgAi|R9EElO$;MHLRHR4OQK*D(=Ae9AikKO3PzsUwA|+}ji_}I2fwYgp&&UVxbx=wJ zI65j9jy+?NgYsj*%k7~2Bl?o$pj6-u?4ZmVjxDBtrKAr$GucDQx+muj>>ZMeQcRPU zIB-!MF{T&}q2$4r{FsnADE|g+g@bYw1kfJJCr0s=YH<96y`{eHi4FNEH8$Zt6Jik` zWnZuKxW*cV3-G+#p`ez+8ZTMO?w(nSH>h7J#!Go{BA&X>4uM2t~K8M^sOZo_m4We~CN> z@c>mg19y8gwXq^+pn+A~bro5$6NxJ}zuH7$Muq??m9D^>TWzgESY>Wq;odVmhO9ZB zK@DJBUOKjYj24^RKztbX8ZOFwise_8XdbHR)ry1xt=@Qev~Nn2gYZXLFMAIRU};3t%jT!*GuiS?P(iVULM24|mUmzmTtIyNRCzjAu1x1)?URnwDAI|@(z)Lr43B$MxrvCLq_mr^M=Jv&vIo$XZ!gBB1CXY#0+(JLK9Q6+A$Gx?JKPXG01xMMwR zYpf!JU)sY)jf;&M7k$;Z*f?D`PFH?XMQ^>0)0NI|E2(Vbblo^z{Z3aUj5GD<$5Mph zh&@nfa};sJ1!CJeXKML|Jy5DhFzfLFeC>f!8%9TEF0p4!vIo8nc)9I?Z=^3t_CN*R zQ0##$gluqoAnQJQd!U%6AA6ucY*_Zd_xUj)vj@H#ZHH_RGzs9g2Z|Ql>|ojh`3HMT zebf^hvIlBx!apFy)?*KJjWr5;;Flfv^|S|m(b2&?DMo7#{6oy1Xb=3GG|=4kKuzkH zJ@6eEaS(eTfhp~QoE4Zo@YnFOuRZX>gH%8fPb-K39%;ai{jT^myx@7v9&;Z4@C?uW zRRW0H^Uk5p+@AN{YjtH)ZmSG`VElCCeAqG%k$tLNJ0(Nh5Z{K!a`=lR3&9EYumj#5 zY&7ewT6f2oQn^`4KoKgZe#}q^Nv6?hFJ>myk6mQdcULA6D9_7Kv$(^II|vaWzuZo; zU5p|+O;V@s*nB5gsxC0`lm0K8*)LxH+m3M0MnHM`^nl7D3!2#u4Y*aW(oevVqGm;R zw4kRH=^ZU*os&-}isz@cglAo+>9&^Zk3w>J`|YMz{|dhPmwT-KnE({Guvq=GadbVM z^$IUBFc2$mg~EM7tV&hp@)hUvpbcY9= z!YOgUqp3}4vQ|s%fK#ed;^!jQ22VqxAPAI=&9F06oYHu5YICr>+@kl@5UM#DcH2vv znWKrFZpPV8G>~rwWfXd8plUYVLv+h* z3E=UO$z$`U#^xr4A$U?&gz3(0r4VwwnUtlH#;li&YgCt%Y|Onz^fK7N5dfz*#At>G zo$uvz{`@({6??IZD3akWiW5wO$+YE{cr5r|V?H%IsJFc@nkydbv!9x=_mOFz6qL{4 z;>M@%7U97sn=1>FEd{sjP)UYQ>(xpVZmoAafbicvsA>aFq3;54(;>I^#}t{YooGzr zATLz3c6oA$I~Uxj4;Ss23rL<;D)8NQgxq#2vxnZm7VaVyLr0^SHM{8pZCLspf32-n z=@iYfCaA0~s(1r~`^N5*JozZXNU=8CO7Bcr^oZd}ND&l>=Hl3AxOh>LRI{v;u~jpJ zXHyyiir-Fw-w1&aus>bHZZhqWw?a31c=N5K5Exg6{yW0e5AMHh_YM1RdcO9WCPkv} z-*@Bgcq=RH^3eXhH|Zv3ZTj2HuJMTUL(eh3TY>p^?mu9Tsl({^9Mm)E(DhsP@7uSF zr)-czS?|e>1rrs59{vkvA31-NvSr;z&NKD4H5J<<4Q$)ngDxU;AS6S2V+INFc%{;L zx3f=?{KqY1wiw$Sjb37ghs}5-Qw8%#bAfG6$YnP3TWT}J<}oQYvtCptK-wp?d4dHL zu}|FM0SgfYi1AnR^gZf*?k z*g|lXHzo=8$C@YVOUUvR4|#U+lw)lbVk?>ni5C-7g8IpYI?tPBbB&22WnCG*v_Wx} zE|WPO6jvK3{3~o4?10au?49^^S90&0wTt9cjfAJ=_ENX5ujePlJ{ecC<0EGHO5bqp z&~Ta8@Y+xCJDB3|#4{oFsRjbK=F8dH>P!K}Wv3A$G@Wl`gQ?l+YEaHssriwH3JmO2|Khb;KTIPEgK%&;4$!gz9 zA+r16yjBsqw@xDRXwM-=W6wkiE2FQIP@2eL$x%KOd&VRu;S&!eISDVOFG)^9F3$nH zft`frqXBRsAqg(UOW5PBMBYEyO*pK#66HK;e!{01ar6Q=x;45(D{po+)~1)ULU1GV z7H&pc;Vm2q9kjd9d=^oXiW>wSU+nF*!xJHL7;1#VS;8&iFg%Nqnk$dG%9;7AE^}u7 zx@k@P%ZBWB7i8{2XM0^u6AGO@$FnUJI&&dB3a{p}1E!u{%|%BC(?UI3ujaLwJ<+Qf zrh(@6YHCu)yqcF|#6i581g7+Aa(-oA&1d0fU$5qsi81r!>_aUdgXK4^dA3$;9=?%4 z84uq;fclj>yMlUf59n((9;R-vc08WZz|RC;?5w-D>0dkVc6uY;Nnr8A=U7zB7!e#=P-7CquX&JDI5>XAqp7g|3CdH}g+cjL z2gj>>MczA`z2Ji1;03+OTfD&3@D*5;ZW3F6g7vnN&ym{N^4AZ5!ax`WR zNHu|k8(C>BYY)-vio+i&0A6**8PJgNA6Dz5eXlX)d;C7@Wjjg+$oKfOz9%OSnwZ>F z5srLcR#stL0c+S@Fbu^qK1Tk=rpK!ks39^{F6W9RJolN`PbI`(rH~CP6?#@dr4UfV zNRe=Ai3c5KXQs+{mO{0Rj+mDCDLp$kI^nfyR?-)DXfYr+A0>M{^MW*G6te^5dVrRZ@tO zX_ZoVn~iek{ggZBV#UTuxN#Cj?}v?(uvd*JcGg(#sN^%w^mZk;+BgY`rt&{+OPz@3 z#HuDFwUO_=pMp}=6Av0nk6`Bl%193sqHdvZ=1QzLb zB~wzR(gRB;AHdf{D)nu2R8}K<#v~Kz_kou?kK(ZhdzeTScmtbArwlWq5SotG5M{ek zPcfBlNiMKrkCSXNJv^jJE7AGVOs7{Ry&3(GQ7G7F$%-$3mh=@G`!yB=wKe0qcyy4!|aKM*CT15xec$H)G@>Bg&1)V z!z+O)4X>P!nc?*!{OoIZt=zFaKr4&G@h1WHn(ltO}qE*KD0X{?V@}?Px7k;=Go;|JE*a9 z*8L>K>u6+dTkT`0h_vtq52S>7^few$g?UuqPv%hr|5Wqna2@jR=^I`$^}UPr3QcR< z+O5nX&+XL^+sH>wW|RS(?b@|I)G-yWG70eaQxK0xfMT)e1ze82EsvQ8njrzob%h|u z2k?~u<;F)xb*l1cql~%+?Fl_%8`<#z&nR5 z1?m~oeR*d#^tJQ144cO1>lz zYIMW1(Jd+vo@cH{R3dbI)FPqdc(x^>&_#?<2!+=< zVCpFp?r?N4&(P5dh38=QM4@mx4K%kgB#Wii z9GpEE58s4WROK8~5NW_eJ~P!;d$op?rS^$tt=^H_bR8q8?GT2*1njtwLRz{xg>du@ zLXr!Ib?WS>Lzs^w{Bc>ZJ1GzDN#&6zHQX&8-a}(^@o>A92$(WhL_oaP12G{Wp73aD z(|`m-g9fPr;>#)ji)C&)>DPuiDv10Fwlv`|Gtge=vDzX7jn95MGtl^q zwpeK%!tw1$vj5L=Dp`7(Gyi6E8EEhIpsKxxC`3R2ZYeECnbOiDKP(|T%riGk<%NxW z9(C3-<>n(P1d1p(;;<$2wrh1yf40`AQ{aztCZ!lU7Wl|knXNUz8prae(zB@4`yA2N zJd7MF)g~z+$9jE4Z1HV%xrWO+H-~DN5dzpy$Fvvadnt&!7v&0teD6C_WJE|A4K^Eo zp!ynnq(G03N@cZYOfvR7<#3X*=V|mM$=IX78`#)WhJug#or*zpk9OOuoof9kdl`Le zW(!_ZTtv1sQpRkv4&Hme%KnA&DqN!^8+i_{)5znVEzQ7lMFN~#B<4d*mndQ3dKu8A zt>YzN&PlWtrkxQIMw@jmO`wC+6%)VPyYU836v>>UQ4Dtxwh{l{m|lUXF(>v(n{r~G zHm#XI+0Y(wLF+c-9C9^HFyq|r*_O;WE+UM=jB}3zrk-Y;RYwO?gBYzD=O)aaXvXQJ zf#x>jXi~?_I9oB|AZ8o_6F2L^eK_Aa4>L2)cKqz?+slcNc2m>4B0k)x5`}sZcWo_GGFtuunDByh*Gpp&x%W0;Xzbk^?7G24u=* z_IHe@jm05`9Cx1hfNbt%cz^4)TxMUJy_Frv=X_h4W3Bf5JbRJ8n^|g8PWbY2yMttk z?Wj1^Iz^ciGL?JnVGpO`+=oA?V37y=W-Kzi{1NMA=U2RO&*I|hN-z&$t9uIRRf`#M z1n{I6S*H=P)$Hp8FV~3rhrE0Me6+dD;cgvFRI4G4Msyxy88fUi6${{v8$qj!)(7or zU}7ZZL8-CoLa=n~|8MV0z~m~fb3v8_+QlX?lAw_h%m{i$%V-%eivS@6(nyF+tfQXp zp6R~onI5`(B#pn|VB-zD%{s&zAz&vswlVRBG2Roi7(){8CYZ!AW{Dj;w)1Qf2S4-v zzqY${-KA%y1%83=CflNm5lk# zFB%H@?5^H{VICi>r}DX|QWaFIrC~ik+3= z!8C|Fw{P2$-neaJ`n(O7;usGykY2eit&aGe$(vyfr}+{?t_4+$nydO`+OtLd)UoP> zUwq|)JwT7`!(qST=wL&Sx5eI3a4xo(0#o95M_;9w87gIl@*Nm*Pg;jhYut}g)Poby z0>9>CGovGe>A`$0Qz{Paa_c|``W{u>WUwgo-yxY-FRYGoWuQ}6J*|Rsj88F2IF3x8 z;?+c8OPg1F_W!${HG`1wQvNGu5C|kJl>5OA;^aW!Pak+)a^`qc!a{p0@JnR_NLct^ zFQ45sl-j*qY>KmUC!e*QJJlOx4|XraE`~X?4`DHf9SylZFt#+7oBiTNz>Rij+U?lW z1}&{fnO4->VkYJvckV3a&@NZ2nPPY@L*+gGJCw?JzwqUvj)cV)#NJJOc%Nz!p9hV~ z_YSv0oayrKx`Do{(Acbt>Et@^@9=Cqc%bG)hqhCBE4K~NNr#GxnZlxL#@Y%;T{%`r z;eSuKM^(QMt(tp)qf;lQKbM0Ew`8~)hvdhPL-N_$LtvkKOu$)iELuaIQTe?+b&JS+|AfgpKwz~_UIABANHhBOAjVEp+53~ zcoi5KEH2^6O<{Ckt<$?gRPg{#!jZD?jCoAFSX2DmTdl|x-fxjFGE?{&O9k({vbCAQ58&>hnZi%Tv1ZQ{ zx~gu-6kdxK$CD`}n>te{O+jP|ufye}nZi};bJ!qIY#2D4$?n27w<@R?sUqoh@e={F zD>ZhP)}}qKy2kFEXUOJ4=V=O&ENA#;){r^FAGtF6a)!qS7J2DWNhc05Dp~hb`A@bd zQ-vwt!Y)e#t_L8V-QOe-KxGJjm4H;eDwV9v5PD>d%@Cf?{%nIQExWEAeXG)c+!BTR zh>L9)bNS(FxwM<smSt5{_2rpg^5wN zYf_&x#ipJnreQ9F&B;Bq8Bk0mxoa=#H+Vim^6U#DW*C0;6E;oo@75Rgc1!{#sW3v` z1$;!ft~O5Q?cC|pmF8!b=W2kfu5oa6MN9j@SXaHZ_c6U0?a2C{YknA_?Dj=?xb1Hm zV^BB^9gIP!&Dn2?d##?{xs!P#W~X3buw1zRnbbwwH_O$yC=)@mH<{m*j*8*e?WZ_O=uEcSjHbCtZCe7iUy^~w7C~z50GXHL z+?lrzIId<=Zkfy`_&Z=P8ntx5!LkF~x;uC3KA6isa0>$6a7_Yv)DZ9nL5glz=ypRR z%WfY;l0lWSy=FRq>E_)D7>?+GWlB*hb81n)Dp4md`LthePh4AQzs;ZEm>;aIyJ)uP zB6Z_H2mNINc~uA9sXOSk4IQL~avQHl5JAndt!6rBHfr6TfLUMXgx|n<|CassbH0?` zkAA81KYXOx9p%dKLA1T9@5P?dJ9o+n1k4l2&gC3}NC)z42Yh{+uhfeDJeUSA?70Rmf!|304^V%&Q@#tr8wVBDC_N?{UA zTC}oL7B4my0~osf-V|W6kv6qs&xr8Zc8_3z+F| zlAEc#8_aZr&rHWFzstyEHHhxBX=EIZ@BusGV;J@D8m$~^?LqgEv6ma3n=#abLJakm zOZ9M>!yLXh;#cuwn+S(6)S}G4b^vD@^o^!+FunnJLgH*N6+t1|PN^LPbxS~=R|0Ic1`@(7L#!{n+qz*iz`rf-}j=x^vWm7v@GL&l*YJu!|o03A)={BZZ? zzBK^c)Kg9J%Ng`6Ubf}IwCuL@3N>lHgwtD`vp!Q4r?#ow(FI~@Z|Zf1E-* zTA{O6?sO;MI(4hwX>t|r=pys3#9iG51|jPXmU!Y+&|f}Nt`5NB0^v?zj@`=$h|?H_ z<<^#0n%x9;ysC?aeXvf6F|@!uv-132Ym6;=q*C+DI^Shn$N!!4%;yVT`yI(dbBdS6 zbdqPDS>6NhGwZn%j6G&@&40_VdFK0|Vf#Gu11t%fXO=@GM!0d$ zGcT7Dkm4)+YO+oAmRKj5eJzB~FmIjs40GU4ans8u*d#=1Tr?wg)jyH@5OCq(r0t&f z&6o$qJLCK~Xw{5!iirg?5y!W#%Cisf8aU6pIthu2{~$P{P1O^8$Mh2xi&} z?(rmZd~}jm_uCp<>4JLTs$YiR+GMbQVe@Mnsb|TR?!|i`?k@zbhw%fHO$Ax@Utdr+ zzx`~^xzrK}+S#08BaLL!KPGu+#^;1!~^)B8V0PlrzL zA0Nk>eR|(jb;I=j!?@jeruWIFp5B)apqSo&6ql1u?;oo-`7`^p9FK22)WOpFdv!g0 zBqKIP?py{A`#M>d6ZjXgvSpW+v%GnMWb#w7IaMMp>Omz|{KrI01Pe7`C7^N#N0PyH4b^*ZTegS@M)BJKm{u)us zzun)VV&@Fsc7G<)uGrYUPVnGrQxqUJiVp-B>@|XPoHi zZ06bQC7)x`6&Vf8nit-vFVy{>kd#e1CT}rB^8#M59tRt)`wj7tWQHg<)B74|m1o!z z6}WyOkD&`{Ne*|G62Cy-Pbd(5LRTQ?dz3BU6E?N@(AHKfyp!Kp7XeePT9 zojifNhk7Uf5yzU{J8@Or;GKL4Esn=KA)DGek)|NLlds}(QtxEN1$dZ^XTlE$YnVg8 z;ufxNQEzjxxT=JCU$J^kKceHPX>8s(<}$Fj&^a3aBwTFv6$&N&mPM>=@mr1yEId>j z51U7_lY@|T>0u{Zl#l8X-_k>C69M02MFJs|?~zVGs(cS6FMSV>ys^HA=L}z*GF`2? zNB_=ukN%YIUYOO)Qm=gow)`_)5_|^tV830AOBl6bb3{1 z)jUoXt8s=ab`vZ!un0Hx;uymXxT)$%qnoOX*SDN`IYvlMt71;yJ0+{fM)BRXJAJs>4ym5Cl@1$C$3XcEC`Wea$}N8(|jG_^5vcE3<*2bSezs#c~cB4_Rc=i zu;Y&qye@_(Ceb4>LJO(qq%nzp6{Di@)%%LB>mQG_P8cZR<;CJq362DmqdbdUAoz_46;Jbb+I+&Mk!)I zIyr$*D%e_^fK&xrN`3}g9{FQ~t;uz&&TpDu##=q2mM`8)cCO3vRckY=a;w**`?^-H zNO!Hucc;6%SFKKGyVtE+y*#_FySsbM5;s4bXsgepZ5mq@eY!J7@PG@aI*b0g6yEPp zc?UF)3#a=Po|tSPsSBqcd{i{AHUAyMT)1l>m)(VX6HCHeIK$q!T{uqGE8ix;4xfud z9XM7Fci+yP9QRG$ByRlyj~?-g)C$+_y~*rQxNc*hRj%9Q>%n#0=K96fZd>rO|9Sdw zLOJNPxpFvnQ>2&2Y5S6mW4qJ#fQ>Z7X}d2WEuA)-B3j|J{j-IqNT=;dO9k&3*IK9T zBe;90)AoZn*6dE3tLg@)?FO_s9;c0LYNt)wv2faM#^t0=Tbtb25j!z9?ChwITakl~ zeh8CSFpsA*^9nGu&^ZwQBy`Pgq6pG8o5so(*Q|ZnvW*)q44$_~F%o!XN3c=pl`T!w zO28pIGJz<{AzP4uR5@fyYC2>dsrRu%w!CS6>5!#GEuTZSV?DklZk&7<8~aI{LY7l4 z`A5z(Q!AE-dTT|oynn^&HLKUGT;AQaykq&A?&Zt7bQA`VBu8hcsFW&X^ccJ9tp zI!nbq`NHm0=V?{2{J%O6dyDQzlI=ixa#k$p9 zUD>Wq980;YV|O8^zXs6LDq`se?~-}LNF}dJ^+b{p3`{kir+vZJEgR0*de)_?7HIIL zLj`*t^hO-U;GqgTjsYazBfian46HiRr#2&lj^+0i?vV^A_njc_J(PiU8#B_lTFVb* zhD4s)9L#_dtyMRf)fP+6UcYJchO@MO^hw!$YgVnzcCA>E?#^}R(p@XpcBlK6uUVU3 zlU;={3^n8)WfUBgilFcHKqv~lX)kJ5bU&=p)L@Dso|L+m>ll>0g=}| z@q}P{Bu6AA8%P?0>DM?a8Yk6%$FLCW3dm&-!FIAFECe&`jXMNe<~r`B@<2=qeNkux zhPvSa*rv$|z{EY`;;$q9^0XrS+LO!%Mfg<(tqQ*;T?=mXHOD8k_WJ@?{SVUH5(>fC z%N4?TE9H54Vz1k69NS~B_u5E9Vz04;w2ZxMifBdb^+gL$k+IhUmI~g%t+lb&J8<{V z*z2=#tl48PSJe%%*C1LPPwYiDb?hbWSj1k#xSTZhI$XzICS#5@(qdeakx6K|dH9^4 z@^%ZI=gCa6t<1`-AtS42TwZ;1|83UD3XCNPtp1B_O7@Sn1Xc}=1mddSB@jf#RliL@ zs^TgoGvg|c%=IHEkbox?}@My*2&d zqoR4O`R^F!t(^?H?B3dGED7`04144D*7*INa%pr}TaEGAEZ^@1TL|~uCi;n5((MQxDFiGpf~DD4$9Ut|8tg4C>EVLS1cz-2?Net zQ>(IVZMDK5y3QhBq(5}6rGj_(XstgqfV+qKL)XNyX7`6&RX6xUo6+KU{2{Wb{UK=z z!XMg-%SrvA52{0ku&I_U9gY1lrB$1S+tm|6mo1It#7f0NzF3)weBE#zO;5u`BJ)o39#hl)%VPmgz}% zbECJtGI({}r}`^}Ba9073aj*=PknHsT6JhSKd5k5D)HjKUo;nee1STfTHYDUP-lAj z%nWb7tAt(Xd9zxV;D4KK$&q=H#a%X)0~+~m z0*xp)`I`wy{W8++^vJl6-Q=G&%`ZK?=S3}_o4n(W;QD(W_oL<;WY%8)L}FEq8+3%% zdoubcK_7@w!c^v#K1*`>{tRXjd>3)qmq*X<%?u8g^yGlt2?!oF^4ju0o|VJ@RMs5T z^(d9*G?uSzU&~SmS=r0^nWZB37EW!_`F2Ht0Wq5|luNmMh4Ptc2NolvJdoepcv)|V zRK-@sLj!V$BGMaPQz=&za}o0l>TI@Nu|YA~y?hC0Pp%ZADmq!wliPo_r>I(V#w)j{ z%or+0@0(8mH8M$FNXr!Bt_Q*pVy= z3&jk3;||46bX|754D+>^Fzl$%)VZh~9)g`WImvT%m$>k2QBW!sl}zf=^A+fssN9#b zMG=LiL93#$7HGnaz~%)6*Pc$pb^l{^dO}ecdAXuEr%|dv!*#;T=)*Sl;ean6WnYAs!W{0wc!9SJ~XrRjlukXX)V(zE13-&8ymJHruw2 zzX7+OAEQpOr*_lQGJ1Mg)bj5IKZ&0x|Db867$PaAyx$@2SfE3shILgHEbke_Ln8`A z#9)FG6PH+4qio;0d9z;Z6Sko_q_MHtG7_wM^?b^&EepE{I&r%U`I zoR)%I_9?StSrQhfS=eiHN}J&*9i{@RbY{4SPl3~e<=jXqKbF@gr5b_`5MckIlp@F! zj>S=`$6Yx_9|q@46lTltqOc6F{P$vS%~^WWA3P*@MYk2^>kDH)(vI* zSpB%9+)eMPjb+$V7yEij`rL(x&8JQnS~Q^SW~t*oEJ-%8@DT6 zU}sM|%wfgG1jSpRFUJ17!T43i23y?O7>^2WY(77zBrRcMfnT<(6UxTu+?CB4rkH`~ z{I#L|BAD@RVmg(il12CHaL+{?^(H9%yuRJWt358i&PEy%m;b4t_3TtSU7A*qKi}mA zb^X)N<6qcrZ0GR)?km|&1xYInyWA$m3d_RubcB)_^H0$xL zI1cSu4_D(2S&vK6Vo26QdlbT9a5;4zM95W`?mUEl1h*XLuYm_7hY6AVxE!q}O@8RD zQ#ofY?Kah4DGzcYJLTS0ITOi}c^oF0}KKtDUEyMD0!~|H}EX z<=S(eYxSAiG8Kfj*w@YMJ>b1$q!;hA!xM=9ELz8dc_@`-`Vk6qUhv#jvgf?maLIq< zq9XHUhuS#4r`k4RlcnwWOP;pao=T@vTZi*Q=yiQfzB`;5-Xk1i-xMojBy^5IbMJta zItStp$k`z(V2XW8sx6R4l10uf4MIA{czK%Z7e$WA3+lnk{+`$v!zVdRNe<77A+68A zXpt)qG94%)3=aAISSnH~W{b74>pdeCpH@L$%TxyPwJ~QC+ICfPGm5<`*}vVY5h!aa z`zx$)Ua%vL==Fvobvx<22L~h_u6UvnxqxAzb3%+#sK1w_IBkN|cM_$|E*Hvof2s}s zw=l;ugqtbyb2d}dUVs{m^iLzJc;K#$Vbj&UGRHp=6|Ckci(<|3HQ-;{p!nO*(QPpt zc?|EC7*em{Iah$V3B!92$X(%;;Tho@49}F<49^tK@^+aKyY9OTgCl*@1~(d`jOGpQ z1dn6pTHS?s(=k`6&-s!>HUsoIcFGEU*Ng^)DgJ$o0B&z6Q+!lZu$rPQny4v09mA2w z6n_*$IuTQR25q~-D^oPWH<+R+v6-SNToBTarcdf&6fjV>(zJm-9HXKJ0}Xf3N%}u> z@LZap)!#}|dJJ)=!~ClxJxGwoJ2wZYPfGN7W_}wr3e#@O#Cvqgtyv1vShvRKuT1U1 z8G4!l`NQ13t_l}A-E3E6pyW#|dU>CiQCjG%Nx-*KF8Q8h8xUs z7Z>^(5@CtXEw(6~_|X`{(}|JmU_*C~_jnukz~ z4-X_1iCIKfB&CpNxfOL2~sX0&N*F@s*A8qW}GhC0^NJBDQj|f^1ciQ_G zW0%XH?{Zk;@Oj&f?L7X(MjFXu_)A_J8?$h>o@qrE?ts3=7jT?4>&I^H1n4z+Yed~#{a9@DdL$h%E$8l)S!nqm`j`_}AxZMP@aO4&aoXEn-$4umz zK7`Bio#Z?M#RT(AK9^_RncTldo+NCB1Ri*Vt!QLEE`x7Obe=|hg5ph_FQ|{d0W-Qd zT~I7cb7hQv>8r|Dd@ILEp~6mbB)4vAeX4F_0=bprbr$(*S7T~}GhP^Ic>F{Iw{so7NBDB5;aqQX?8 zl7=wVl-R;lQ`nG?Goo8lb*v|ylHjNnk*d2qMk&;vO4aQUq%TjZ?h`R=y1G~9c#o)H zHAh(#YmPCgx`$#o@)+LV#gKXpkr_+mVOFUHZ~{Fs>05#%~Y{0PWh;g#VT;TsIk zl-LZ<6#8;gb`lO0Fd| zR}ZGLi1IX>fq88LeW^~Rz9zX-XX&qQ`QWK{k?)#Ohj^)xofG6IG4cJxn?Y~ zj9M7uEHepPW7wI%m?Ll3FzB2Yb4OaYO0AuffK+uXb=6eIMh_P%siU36rjk0^NjF{B znAE9bz_28Bc-fxRc`L+gQBudVaxA~MSgl2Dw_!$zBrC^cV-ra2cvg-n#=Nqzx97_eS54KNoR`)>bp*gFWaU9xnR<6c_(Vue*Za0CP z6}iRBTjZ?dFd-5yW4O$L5sQyvb5_f=FI5>abLZxzqt}x8$GK*zm=Vx91 z_ESB7VVZ!kPlVlzBb=*vNwalc^|8R?rgxKG6>qj`fnVc)JIo1SmXc-04*bT2Nz0vPVyuIP^sLO?q zFB!N27xwaF#zd$6Ld)H*4kbZfR|0*VX!%(=fxxO)DDWiriZ9U_pZvTj0khA_-g!4j zo9msaedTgVbcJO!!q_FtO;?C)>|ez&G=afH-LGLdxhv+Dv{04*ydwdr>RYO-slJVV zGtMjg8n+j3Uxk*SzFgV|%HT9{==*MP}4f$x%J#jjys9 z6`fnbKTPuG7`+-_rM>0Dz0ltcWNTk#NbgP{{Ik+o{Sf(TS1*J=o($>V#z^S;t||}k zB~ihe2arV;&wCOwq~DL>lV+$gq~D1l^*Z#;W=Nkv+pbDfcEG5lAv<77Y}o-**kp#3 z^_tEHd_G1g)St?b-Y-aBo($={foM0()x9#uS)zi~9A#0gImTp2kB#BTV|d5Jka`Wz z`FCi!i45s+XxkND8J-co!SGCp&G1ZN!VD?tn>M%uW0cXn!R_M==@l^oxV@oFafhg2 zHAPu8QB%A+h9i$D4#kj8#1yM&+ZA4!q7lBq6itcE6is1R{?qs)QQz6Jm8K2!q8Jr5 z7-+Z)Pg0d3{Y-*!R^@BxF(k~_+$o3TAH&rMe(>>}=UUx-SF7@H=C@I!NO|3#Ky>BS ze1@uxb8CDV(j`HMR4z63x~|$qO+soouP32~!}|4rF(gW%K9oQss@tfMN$$2LQ>f1+ zU{-bCPpFKhy3f20Eu$62Hp}|a7h~9&z*rNqe)PX$?#Sm+=%_@h4qTc_r0QtV^kHKnm5ziZk;=>VMCytHN*eZ}oRqJFSDI(P7hj&` zk|j}(jZ31ksR<-d+XGDP>*VQ1=sRkkDxCmg^7Ks5$~RekM=O%2Qk8+k>0G~p^ynPC zY(`@74!Jm?R7{w0kfcY^>q5f1_bdDf>dD5c!7&cwqD|5_<3RZKJMX}~+;y`=Q_l6jbJchR? zhSY0#&Uz3xkrw?Ekh{Vw!!yD+7@jGy8J;Ojm=+~{(*}1{j53-xxP6=!{ZxzqZf_`4 zyjN7PnxZV4s3|@Y!;!}nAB-WLh$%jbwq4k4glU);1nHzL9G&Atzw{}Oa%*OSG}f*0rA1HSNB1VsPG!r( zqk0BkuKYeRg@dEGM=X6OL*rxgX815!8 zmYF*?jAvWKO~KPtT5EtKS!kCbu;HdiAq`BP1Y2+PZ-}in^bFxYddO0l<8x!U<7l8v zmAya7rkZF|&l?i3s0{R7AccYcmf@IXQ_p$Q#LmX**A3j$Q<$TFOV2ylg8Z<&f!d5K zj-XoT+?jwgp=ZO=EDR~PC#a=VPI(fk+;;=MFgRw#)l?~a9aQTfF4}G$mJ5MSSNAZ( zL1W5(J>G_vlszxoQ}&NR+7_kkSDANG@19DrmT=+o(zu+xXlnvV`=vp)Y+3sjZSVQx z7&FufNG9z68MN{(SiiIt345i-K*oMvKs(w!Xt-`3Oflg8DxqM^*}H-{zod+Toc*D; z{*W&*PeOcrn|)5-W%0x8dF3fK(vZCJAB6NC?tHs?x><1F<*>~@kFwp^&f}3b(!@MU z=TLUAhez*a@Th+JyL*l8#&#Z8+DIdL3?B>i56YFFd= zA5Sv=lQ9yyUcO2>eOy$qrkrGvB}SQqWc+U5OmONtuE1!ZFR@|fgRF{BeQ$t>D-RiI4LsGz|lO^MAUP2sVLdern& zJsCZm7~Y|2Bi<0Bz6K)>_uNUU683+Y;L%X27$-hk#!V~DG%(u+Dw zXezy^!!2XXjp@Z7f(=W0k(cf1#X|;B61gJS9W&aTb9>PBk^f~qOwv=-t*ncHk9;)Ss+#OgNuDjNA4CF*N9gTlt)@_N?=ogV(JloGIx=?1p^xd5Q<4 z#=Q2>b&;##$nJuA+{WvNs06XFkKs&qS7snTW|9x4m}Y_RLv-=6Slx*go_G%x@H}B| z(bfKxs2;0Nua-wDS!}+&jCJ>~&&`fhDzJ)Pb-kxPTVE*^aSU8f{lIFzRx1t-RLANE z<;vNSTCr5^z!}9frrcP4`o)>j2o6=dbxeJ5Gq0yUV<112uVk<*I_l5J;bfI+Ei*Wb zAG73bdeQbS{G6$Nj#NtcHK$h2_Vz(Wmg08Pz!&yauOHlBF4u<2wY;bBy#4EQs@Qma zXk@T=Z-2QmIEE{8aS~{8xHnrK92AD$Q(q{rxW9Ln&&n#q0=I6BfLD<9yx~gSrBUMc_tv)T6?;9CFdvo_>Dnrl}D6oKh z5Laf@Dw%AaLXEwnKDRhDJW}h;4`s_aP>t1RjMVzm>(bRC{$AuS>=j4G^%n3sP$^%5 zp2=#qHddck9;x|TnI>8pt1k|e1e$QlG~>ClU6%)4dy&5&P`N&zGE||c0utIK$TU`; zQ_2htjKE%@@f?0n$>TiUL*T)eE4kiW9)}y}aGRpg^mIHn{SXrxDdu{Iari=UFCO9g z+{{R=-0NPdPr)(Z^*Onb!QozGcu=gkP=w7@hB75~-8^vx+8wI0``t^!)%-}V+`D&> zCN&?Y0+*|KJoau)VI|pG@9v^FikWTUh_-5`uS7uxO!4&=bk-#F!%a2XB6Lbf}iu+gm6O6iWCXW;(T0riIV04rcH?T|I)ww~CsFh~M&O zZ>gNklyDguT%0Z7Snn))Nj_HSF^)gIsJ&}s7|hJY*i$RkpdR_SUk@WGXNyDq=xY7^ zAIuS^8MAZYcN*%u5yDUaT%@kn;-M# z_<>lrI$VZ!*_^Y!6TV1QB)N+@QRe_wkbk#1oAB&9XY)OKM&UH)Lp;{-PQq1F0hbfz zPXo*$w50({2`R#2!cW!#{*`dk>jCd3e2#D*VcHphDTI%20eqBj?Hd5s5PtD7z|RP| zBf&+6P$yhZs4N1M2~R8re2 z(glR|gi`?{^%>L!k87c3q&9jAXY>d~^av&N2nF;A;d_MOJwoUnA#jfnwnqrsBZTY` z0`>^udW2v-LZ}`gP>&F%M+nj*gy<0h^a$pA1mit|=^nvwk6^ZEq;M436a6&1a9ZI+ z(Mg33g?wQ~eY!ed#=I$~Au&N$ei7;vj=~>#^WN77fY+xLtMEIBIS^*;T870;BNkJXbq!+AQ7)y!gVQ8qGGDQ*6JR zEZ#~G&*>q2Y?l+F*e1b**)9+Ag&57Yq|t1XImNaZO3omk*As3a3>*L$B)oVaVE-9_ zwKD;y5MChso^aP}z=sK|=K@Y9TsjZXOL*)cz&8mS4gs7?`23-OuMoNx0J;hH9uD|4 zq3yMRG~v&W1bm3FVi901;i1KVZxGHq8gM>gc?z(G@Zd3kM+wgy3-}q~Eyn@gNjRbn za1`Mk?SLByV?;Aw+c;2@-W!#3L;|l9>JyP787h`y*&0YpT00A%j;C z{-Fc#9l|Z0fcFqiTM0Oea9bDP1BBnL0sMg=-Vo36h4GqhK$MsyNF-*&NG2b0Ca38$O{IFoQU;U2=`lL1Qz;$?R$-*}%OLk2L zMIviTB=I)>0=fLBI95rJh}Db2hqHco_Pcuf5Xuc#;4DY>Lx5H@Pi7VKA2|hl-%EJ> zRKT|hFP#RMdOF|*!tV*f(KwKP$5KL6e~=)NkP-bcP^?vk2P0*ZBw8f0rbIfQ3|>rl z-I;)P!uqoSXA?GV0Bj*#ayH-!!b60|2xn{roJ05u;UU7g=K!`5Hk}LTA$;vTz}E@F z@A||R{Pp*QD8-N+)Dvl2@hTdc$9GJ6@W7domT-?6L#zbTt)b4 zAK;gSKg|K&Lik-C@Dkxo1Aw;^W)uPQ2sb-`KO-DA2so1PhcaO5FyQ}Q4VY2^?5P5- zA#B|ZxQOuBUck2q!Y#h;4fyL$LR3eQAW=uH5AUd}NAe@lgQTF)T|~xI7k!!RJxI9X z8bBXm^o@Ww5|+Oiu$u71b%1{+T>DnQ+X&aboqrKtcn9G3goED&IGk|ey8$Z**WC!X zp77?I0dFVVbt~X*!Y#J}-b480djOv$eEI!=2MHhfbHKfX^qqi}gv}oWoKJZFUjgnU zoc`BSxDxadB><%BO2zDDT2A8;CBjPQQKFA2XToclSzHo{*KK1SH@0l;*^ zy9hTE)_opuD&bkezZ1^>B49J&@Gk)t6ZZQuU^?Nag#RGS`&+8+o`Z(YO!jA~g5VHRWC=j0i7U1WEa3tZQPXazc_{vj& zhX}v^7r+aI^p63n2#-At_!eRCCx8l}{w&~T!qd+Ko+sS?Gr(Ph@BJL`Bw_9^0f!Je z{u9tec=rDQenu$104Njg{T<*lgr{BvJWV*}CBX57HB%6)o=jLj6|j-;Yr+eJ_e}@f zK{(_b~y1-wM~$w7dh65e?z;3mT2!vRYOBJdty^!*k>l%+B%#t7xvk@nWRU$+pV^iP6BB5evE^=n0>k(fb`l*&+P!N{Nz>@Ko- zH=&F9nQnr}&-{>o{Wl>>2ofX`;%6ybit zSt-CK!Vd^f5k$JFpV_DD2vLHOAdz4Z?_@b6GCX<`@{vr^4-N2pHSfBAL7_z>W4c$! z-ra=y>i{rc(3eU9@!_mmut4kl44t=?tVn>MCxvcnY`x+ zKPSv<0~|(ZYX@`)Scbp42p66JxQuXe8nB+w)&b}sJd7l$^Elz%%K^6%?py)5Tfj>E zbr0deRe*00p6>$ug7DqdfF}umy9V$G;m_6rZYS(o2e_JWayMW-;i;1VPZJ(J8SsyU z55FGpal);q0NzI^oC+8soP8Q#GvSS=1KvU?tp`*HTh9PoM0ov~fHMe>oCWxM!e=%B zK2NyoY`}*Jf4&j$A;OL40B$3^YZKsR!p?I6{REL1-O4;^i4bKJB$%*KtcW&>71}7s zk}`^SlChfzy;}fzLRSyqB*OQ$0)9yN=r+J72*+#(98Z{c0pKvge-M5{Xuk;1Nx1f6 zz}pB9?*Keb_|m0-uMz&{GQfR=8!iWo5eBaSR0*4}1Z*c9e-$825V>XU;w2{NBbCV+ z{6xx(7`)A#f22+gl~%3TW=t%Ra4sdUR}t>Y0PZI6{6TRdq{H2}#eV1xx0Mka{Wx5} zE2rsZ;|?dWBZVbFB4HAyrfT`UwNzg|n;EI%!|EEg0IHT#)dHr#I`qc|`{-_F8H!l9`Ng5w zH7I%u!v|tW>(kV<{{Ho;oJ+za<))sqw{or$iW)m_rdb`~T!x$i7x~?fCSj_7(ubdY fnfk$IzFBvWu#;KlvY0NMnd20=nk|;YW5@pkP^jqK diff --git a/docs/html/.doctrees/pylorax.doctree b/docs/html/.doctrees/pylorax.doctree index a6da55d3b0dfafaa219cefc1f103996970176636..ebf30d76707f6f9d6f60310a59ca9dfc189d2717 100644 GIT binary patch literal 577219 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 - - - - - - - - composer.cli — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.cli

      -#
      -# composer-cli
      -#
      -# Copyright (C) 2018  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("composer-cli")
      -
      -from composer.cli.blueprints import blueprints_cmd
      -from composer.cli.modules import modules_cmd
      -from composer.cli.projects import projects_cmd
      -from composer.cli.compose import compose_cmd
      -from composer.cli.sources import sources_cmd
      -from composer.cli.status import status_cmd
      -from composer.cli.upload import upload_cmd
      -from composer.cli.providers import providers_cmd
      -
      -command_map = {
      -    "blueprints": blueprints_cmd,
      -    "modules":    modules_cmd,
      -    "projects":   projects_cmd,
      -    "compose":    compose_cmd,
      -    "sources":    sources_cmd,
      -    "status":     status_cmd,
      -    "upload":     upload_cmd,
      -    "providers":  providers_cmd
      -    }
      -
      -
      -
      [docs]def main(opts): - """ Main program execution - - :param opts: Cmdline arguments - :type opts: argparse.Namespace - """ - - # Making sure opts.args is not empty (thus, has a command and subcommand) - # is already handled in src/bin/composer-cli. - if opts.args[0] not in command_map: - log.error("Unknown command %s", opts.args[0]) - return 1 - else: - try: - return command_map[opts.args[0]](opts) - except Exception as e: - log.error(str(e)) - return 1
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/composer/cli/blueprints.html b/docs/html/_modules/composer/cli/blueprints.html deleted file mode 100644 index ca1ec1d0..00000000 --- a/docs/html/_modules/composer/cli/blueprints.html +++ /dev/null @@ -1,778 +0,0 @@ - - - - - - - - - - - composer.cli.blueprints — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.cli.blueprints

      -#
      -# Copyright (C) 2018  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("composer-cli")
      -
      -import os
      -
      -from composer import http_client as client
      -from composer.cli.help import blueprints_help
      -from composer.cli.utilities import argify, frozen_toml_filename, toml_filename, handle_api_result
      -from composer.cli.utilities import packageNEVRA
      -
      -
      [docs]def blueprints_cmd(opts): - """Process blueprints commands - - :param opts: Cmdline arguments - :type opts: argparse.Namespace - :returns: Value to return from sys.exit() - :rtype: int - - This dispatches the blueprints commands to a function - """ - cmd_map = { - "list": blueprints_list, - "show": blueprints_show, - "changes": blueprints_changes, - "diff": blueprints_diff, - "save": blueprints_save, - "delete": blueprints_delete, - "depsolve": blueprints_depsolve, - "push": blueprints_push, - "freeze": blueprints_freeze, - "tag": blueprints_tag, - "undo": blueprints_undo, - "workspace": blueprints_workspace - } - if opts.args[1] == "help" or opts.args[1] == "--help": - print(blueprints_help) - return 0 - elif opts.args[1] not in cmd_map: - log.error("Unknown blueprints command: %s", opts.args[1]) - return 1 - - return cmd_map[opts.args[1]](opts.socket, opts.api_version, opts.args[2:], opts.json)
      - -
      [docs]def blueprints_list(socket_path, api_version, args, show_json=False): - """Output the list of available blueprints - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - blueprints list - """ - api_route = client.api_url(api_version, "/blueprints/list") - result = client.get_url_json_unlimited(socket_path, api_route) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - # "list" should output a plain list of identifiers, one per line. - print("\n".join(result["blueprints"])) - - return rc
      - -
      [docs]def blueprints_show(socket_path, api_version, args, show_json=False): - """Show the blueprints, in TOML format - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - blueprints show <blueprint,...> Display the blueprint in TOML format. - - Multiple blueprints will be separated by \n\n - """ - for blueprint in argify(args): - api_route = client.api_url(api_version, "/blueprints/info/%s?format=toml" % blueprint) - print(client.get_url_raw(socket_path, api_route) + "\n\n") - - return 0
      - -
      [docs]def blueprints_changes(socket_path, api_version, args, show_json=False): - """Display the changes for each of the blueprints - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - blueprints changes <blueprint,...> Display the changes for each blueprint. - """ - def changes_total_fn(data): - """Return the maximum number of possible changes""" - - # Each blueprint can have a different total, return the largest one - return max([c["total"] for c in data["blueprints"]]) - - api_route = client.api_url(api_version, "/blueprints/changes/%s" % (",".join(argify(args)))) - result = client.get_url_json_unlimited(socket_path, api_route, total_fn=changes_total_fn) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - for blueprint in result["blueprints"]: - print(blueprint["name"]) - for change in blueprint["changes"]: - prettyCommitDetails(change) - - return rc
      - -
      [docs]def prettyCommitDetails(change, indent=4): - """Print the blueprint's change in a nice way - - :param change: The individual blueprint change dict - :type change: dict - :param indent: Number of spaces to indent - :type indent: int - """ - def revision(): - if change["revision"]: - return " revision %d" % change["revision"] - else: - return "" - - print(" " * indent + change["timestamp"] + " " + change["commit"] + revision()) - print(" " * indent + change["message"] + "\n")
      - -
      [docs]def blueprints_diff(socket_path, api_version, args, show_json=False): - """Display the differences between 2 versions of a blueprint - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - blueprints diff <blueprint-name> Display the differences between 2 versions of a blueprint. - <from-commit> Commit hash or NEWEST - <to-commit> Commit hash, NEWEST, or WORKSPACE - """ - if len(args) == 0: - log.error("blueprints diff is missing the blueprint name, from commit, and to commit") - return 1 - elif len(args) == 1: - log.error("blueprints diff is missing the from commit, and the to commit") - return 1 - elif len(args) == 2: - log.error("blueprints diff is missing the to commit") - return 1 - - api_route = client.api_url(api_version, "/blueprints/diff/%s/%s/%s" % (args[0], args[1], args[2])) - result = client.get_url_json(socket_path, api_route) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - for diff in result["diff"]: - print(pretty_diff_entry(diff)) - - return rc
      - -
      [docs]def pretty_dict(d): - """Return the dict as a human readable single line - - :param d: key/values - :type d: dict - :returns: String of the dict's keys and values - :rtype: str - - key="str", key="str1,str2", ... - """ - result = [] - for k in d: - if type(d[k]) == type(""): - result.append('%s="%s"' % (k, d[k])) - elif type(d[k]) == type([]) and type(d[k][0]) == type(""): - result.append('%s="%s"' % (k, ", ".join(d[k]))) - elif type(d[k]) == type([]) and type(d[k][0]) == type({}): - result.append('%s="%s"' % (k, pretty_dict(d[k]))) - return " ".join(result)
      - -
      [docs]def dict_names(lst): - """Return comma-separated list of the dict's name/user fields - - :param d: key/values - :type d: dict - :returns: String of the dict's keys and values - :rtype: str - - root, norm - """ - if "user" in lst[0]: - field_name = "user" - elif "name" in lst[0]: - field_name = "name" - else: - # Use first fields in sorted keys - field_name = sorted(lst[0].keys())[0] - - return ", ".join(d[field_name] for d in lst)
      - -
      [docs]def pretty_diff_entry(diff): - """Generate nice diff entry string. - - :param diff: Difference entry dict - :type diff: dict - :returns: Nice string - """ - if diff["old"] and diff["new"]: - change = "Changed" - elif diff["new"] and not diff["old"]: - change = "Added" - elif diff["old"] and not diff["new"]: - change = "Removed" - else: - change = "Unknown" - - if diff["old"]: - name = list(diff["old"].keys())[0] - elif diff["new"]: - name = list(diff["new"].keys())[0] - else: - name = "Unknown" - - def details(diff): - if change == "Changed": - if type(diff["old"][name]) == type(""): - if name == "Description" or " " in diff["old"][name]: - return '"%s" -> "%s"' % (diff["old"][name], diff["new"][name]) - else: - return "%s -> %s" % (diff["old"][name], diff["new"][name]) - elif name in ["Module", "Package"]: - return "%s %s -> %s" % (diff["old"][name]["name"], diff["old"][name]["version"], - diff["new"][name]["version"]) - elif type(diff["old"][name]) == type([]): - if type(diff["old"][name][0]) == type(""): - return "%s -> %s" % (" ".join(diff["old"][name]), " ".join(diff["new"][name])) - elif type(diff["old"][name][0]) == type({}): - # Lists of dicts are too long to display in detail, just show their names - return "%s -> %s" % (dict_names(diff["old"][name]), dict_names(diff["new"][name])) - elif type(diff["old"][name]) == type({}): - return "%s -> %s" % (pretty_dict(diff["old"][name]), pretty_dict(diff["new"][name])) - else: - return "Unknown" - elif change == "Added": - if name in ["Module", "Package"]: - return "%s %s" % (diff["new"][name]["name"], diff["new"][name]["version"]) - elif name in ["Group"]: - return diff["new"][name]["name"] - elif type(diff["new"][name]) == type(""): - return diff["new"][name] - elif type(diff["new"][name]) == type([]): - if type(diff["new"][name][0]) == type(""): - return " ".join(diff["new"][name]) - elif type(diff["new"][name][0]) == type({}): - # Lists of dicts are too long to display in detail, just show their names - return dict_names(diff["new"][name]) - elif type(diff["new"][name]) == type({}): - return pretty_dict(diff["new"][name]) - else: - return "unknown/todo: %s" % type(diff["new"][name]) - elif change == "Removed": - if name in ["Module", "Package"]: - return "%s %s" % (diff["old"][name]["name"], diff["old"][name]["version"]) - elif name in ["Group"]: - return diff["old"][name]["name"] - elif type(diff["old"][name]) == type(""): - return diff["old"][name] - elif type(diff["old"][name]) == type([]): - if type(diff["old"][name][0]) == type(""): - return " ".join(diff["old"][name]) - elif type(diff["old"][name][0]) == type({}): - # Lists of dicts are too long to display in detail, just show their names - return dict_names(diff["old"][name]) - elif type(diff["old"][name]) == type({}): - return pretty_dict(diff["old"][name]) - else: - return "unknown/todo: %s" % type(diff["new"][name]) - - return change + " " + name + " " + details(diff)
      - -
      [docs]def blueprints_save(socket_path, api_version, args, show_json=False): - """Save the blueprint to a TOML file - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - blueprints save <blueprint,...> Save the blueprint to a file, <blueprint-name>.toml - """ - for blueprint in argify(args): - api_route = client.api_url(api_version, "/blueprints/info/%s?format=toml" % blueprint) - blueprint_toml = client.get_url_raw(socket_path, api_route) - open(toml_filename(blueprint), "w").write(blueprint_toml) - - return 0
      - -
      [docs]def blueprints_delete(socket_path, api_version, args, show_json=False): - """Delete a blueprint from the server - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - delete <blueprint> Delete a blueprint from the server - """ - api_route = client.api_url(api_version, "/blueprints/delete/%s" % args[0]) - result = client.delete_url_json(socket_path, api_route) - - return handle_api_result(result, show_json)[0]
      - -
      [docs]def blueprints_depsolve(socket_path, api_version, args, show_json=False): - """Display the packages needed to install the blueprint - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - blueprints depsolve <blueprint,...> Display the packages needed to install the blueprint. - """ - api_route = client.api_url(api_version, "/blueprints/depsolve/%s" % (",".join(argify(args)))) - result = client.get_url_json(socket_path, api_route) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - for blueprint in result["blueprints"]: - if blueprint["blueprint"].get("version", ""): - print("blueprint: %s v%s" % (blueprint["blueprint"]["name"], blueprint["blueprint"]["version"])) - else: - print("blueprint: %s" % (blueprint["blueprint"]["name"])) - for dep in blueprint["dependencies"]: - print(" " + packageNEVRA(dep)) - - return rc
      - -
      [docs]def blueprints_push(socket_path, api_version, args, show_json=False): - """Push a blueprint TOML file to the server, updating the blueprint - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - push <blueprint> Push a blueprint TOML file to the server. - """ - api_route = client.api_url(api_version, "/blueprints/new") - rval = 0 - for blueprint in argify(args): - if not os.path.exists(blueprint): - log.error("Missing blueprint file: %s", blueprint) - continue - blueprint_toml = open(blueprint, "r").read() - - result = client.post_url_toml(socket_path, api_route, blueprint_toml) - if handle_api_result(result, show_json)[0]: - rval = 1 - - return rval
      - -
      [docs]def blueprints_freeze(socket_path, api_version, args, show_json=False): - """Handle the blueprints freeze commands - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - blueprints freeze <blueprint,...> Display the frozen blueprint's modules and packages. - blueprints freeze show <blueprint,...> Display the frozen blueprint in TOML format. - blueprints freeze save <blueprint,...> Save the frozen blueprint to a file, <blueprint-name>.frozen.toml. - """ - if args[0] == "show": - return blueprints_freeze_show(socket_path, api_version, args[1:], show_json) - elif args[0] == "save": - return blueprints_freeze_save(socket_path, api_version, args[1:], show_json) - - if len(args) == 0: - log.error("freeze is missing the blueprint name") - return 1 - - api_route = client.api_url(api_version, "/blueprints/freeze/%s" % (",".join(argify(args)))) - result = client.get_url_json(socket_path, api_route) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - for entry in result["blueprints"]: - blueprint = entry["blueprint"] - if blueprint.get("version", ""): - print("blueprint: %s v%s" % (blueprint["name"], blueprint["version"])) - else: - print("blueprint: %s" % (blueprint["name"])) - - for m in blueprint["modules"]: - print(" %s-%s" % (m["name"], m["version"])) - - for p in blueprint["packages"]: - print(" %s-%s" % (p["name"], p["version"])) - - return rc
      - -
      [docs]def blueprints_freeze_show(socket_path, api_version, args, show_json=False): - """Show the frozen blueprint in TOML format - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - blueprints freeze show <blueprint,...> Display the frozen blueprint in TOML format. - """ - if len(args) == 0: - log.error("freeze show is missing the blueprint name") - return 1 - - for blueprint in argify(args): - api_route = client.api_url(api_version, "/blueprints/freeze/%s?format=toml" % blueprint) - print(client.get_url_raw(socket_path, api_route)) - - return 0
      - -
      [docs]def blueprints_freeze_save(socket_path, api_version, args, show_json=False): - """Save the frozen blueprint to a TOML file - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - blueprints freeze save <blueprint,...> Save the frozen blueprint to a file, <blueprint-name>.frozen.toml. - """ - if len(args) == 0: - log.error("freeze save is missing the blueprint name") - return 1 - - for blueprint in argify(args): - api_route = client.api_url(api_version, "/blueprints/freeze/%s?format=toml" % blueprint) - blueprint_toml = client.get_url_raw(socket_path, api_route) - open(frozen_toml_filename(blueprint), "w").write(blueprint_toml) - - return 0
      - -
      [docs]def blueprints_tag(socket_path, api_version, args, show_json=False): - """Tag the most recent blueprint commit as a release - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - blueprints tag <blueprint> Tag the most recent blueprint commit as a release. - """ - api_route = client.api_url(api_version, "/blueprints/tag/%s" % args[0]) - result = client.post_url(socket_path, api_route, "") - - return handle_api_result(result, show_json)[0]
      - -
      [docs]def blueprints_undo(socket_path, api_version, args, show_json=False): - """Undo changes to a blueprint - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - blueprints undo <blueprint> <commit> Undo changes to a blueprint by reverting to the selected commit. - """ - if len(args) == 0: - log.error("undo is missing the blueprint name and commit hash") - return 1 - elif len(args) == 1: - log.error("undo is missing commit hash") - return 1 - - api_route = client.api_url(api_version, "/blueprints/undo/%s/%s" % (args[0], args[1])) - result = client.post_url(socket_path, api_route, "") - - return handle_api_result(result, show_json)[0]
      - -
      [docs]def blueprints_workspace(socket_path, api_version, args, show_json=False): - """Push the blueprint TOML to the temporary workspace storage - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - blueprints workspace <blueprint> Push the blueprint TOML to the temporary workspace storage. - """ - api_route = client.api_url(api_version, "/blueprints/workspace") - rval = 0 - for blueprint in argify(args): - if not os.path.exists(blueprint): - log.error("Missing blueprint file: %s", blueprint) - continue - blueprint_toml = open(blueprint, "r").read() - - result = client.post_url_toml(socket_path, api_route, blueprint_toml) - if handle_api_result(result, show_json)[0]: - rval = 1 - - return rval
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/composer/cli/cmdline.html b/docs/html/_modules/composer/cli/cmdline.html deleted file mode 100644 index f69757d0..00000000 --- a/docs/html/_modules/composer/cli/cmdline.html +++ /dev/null @@ -1,250 +0,0 @@ - - - - - - - - - - - composer.cli.cmdline — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.cli.cmdline

      -#
      -# Copyright (C) 2018 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import os
      -import sys
      -import argparse
      -
      -from composer import vernum
      -from composer.cli.help import epilog
      -
      -VERSION = "{0}-{1}".format(os.path.basename(sys.argv[0]), vernum)
      -
      -
      [docs]def composer_cli_parser(): - """ Return the ArgumentParser for composer-cli""" - - parser = argparse.ArgumentParser(description="Lorax Composer commandline tool", - epilog=epilog, - formatter_class=argparse.RawDescriptionHelpFormatter, - fromfile_prefix_chars="@") - - parser.add_argument("-j", "--json", action="store_true", default=False, - help="Output the raw JSON response instead of the normal output.") - parser.add_argument("-s", "--socket", default="/run/weldr/api.socket", metavar="SOCKET", - help="Path to the socket file to listen on") - parser.add_argument("--log", dest="logfile", default=None, metavar="LOG", - help="Path to logfile (./composer-cli.log)") - parser.add_argument("-a", "--api", dest="api_version", default="1", metavar="APIVER", - help="API Version to use") - parser.add_argument("--test", dest="testmode", default=0, type=int, metavar="TESTMODE", - help="Pass test mode to compose. 1=Mock compose with fail. 2=Mock compose with finished.") - parser.add_argument("-V", action="store_true", dest="showver", - help="show program's version number and exit") - - # Commands are implemented by parsing the remaining arguments outside of argparse - parser.add_argument('args', nargs=argparse.REMAINDER) - - return parser
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/composer/cli/compose.html b/docs/html/_modules/composer/cli/compose.html deleted file mode 100644 index dbdaab13..00000000 --- a/docs/html/_modules/composer/cli/compose.html +++ /dev/null @@ -1,891 +0,0 @@ - - - - - - - - - - - composer.cli.compose — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.cli.compose

      -#
      -# Copyright (C) 2018-2020 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("composer-cli")
      -
      -from datetime import datetime
      -import sys
      -import json
      -import toml
      -
      -from composer import http_client as client
      -from composer.cli.help import compose_help
      -from composer.cli.utilities import argify, handle_api_result, packageNEVRA, get_arg
      -
      -
      [docs]def compose_cmd(opts): - """Process compose commands - - :param opts: Cmdline arguments - :type opts: argparse.Namespace - :returns: Value to return from sys.exit() - :rtype: int - - This dispatches the compose commands to a function - - compose_cmd expects api to be passed. eg. - - {"version": 1, "backend": "lorax-composer"} - - """ - result = client.get_url_json(opts.socket, "/api/status") - # Get the api version and fall back to 0 if it fails. - api_version = result.get("api", "0") - backend = result.get("backend", "unknown") - api = {"version": api_version, "backend": backend} - - cmd_map = { - "list": compose_list, - "status": compose_status, - "types": compose_types, - "start": compose_start, - "log": compose_log, - "cancel": compose_cancel, - "delete": compose_delete, - "info": compose_info, - "metadata": compose_metadata, - "results": compose_results, - "logs": compose_logs, - "image": compose_image, - "start-ostree": compose_ostree, - } - if opts.args[1] == "help" or opts.args[1] == "--help": - print(compose_help) - return 0 - elif opts.args[1] not in cmd_map: - log.error("Unknown compose command: %s", opts.args[1]) - return 1 - - return cmd_map[opts.args[1]](opts.socket, opts.api_version, opts.args[2:], opts.json, opts.testmode, api=api)
      - -
      [docs]def get_size(args): - """Return optional --size argument, and remaining args - - :param args: list of arguments - :type args: list of strings - :returns: (args, size) - :rtype: tuple - - - check size argument for int - - check other args for --size in wrong place - - raise error? Or just return 0? - - no size returns 0 in size - - multiply by 1024**2 to make it easier on users to specify large sizes - - """ - args, value = get_arg(args, "--size", int) - value = value * 1024**2 if value is not None else 0 - return (args, value)
      - -
      [docs]def get_parent(args): - """Return optional --parent argument, and remaining args - - :param args: list of arguments - :type args: list of strings - :returns: (args, parent) - :rtype: tuple - """ - args, value = get_arg(args, "--parent") - value = value if value is not None else "" - return (args, value)
      - -
      [docs]def get_ref(args): - """Return optional --ref argument, and remaining args - - :param args: list of arguments - :type args: list of strings - :returns: (args, parent) - :rtype: tuple - """ - args, value = get_arg(args, "--ref") - value = value if value is not None else "" - return (args, value)
      - -
      [docs]def compose_list(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Return a simple list of compose identifiers""" - - states = ("running", "waiting", "finished", "failed") - - which = set() - - if any(a not in states for a in args): - # TODO: error about unknown state - return 1 - elif not args: - which.update(states) - else: - which.update(args) - - results = [] - - if "running" in which or "waiting" in which: - api_route = client.api_url(api_version, "/compose/queue") - r = client.get_url_json(socket_path, api_route) - if "running" in which: - results += r["run"] - if "waiting" in which: - results += r["new"] - - if "finished" in which: - api_route = client.api_url(api_version, "/compose/finished") - r = client.get_url_json(socket_path, api_route) - results += r["finished"] - - if "failed" in which: - api_route = client.api_url(api_version, "/compose/failed") - r = client.get_url_json(socket_path, api_route) - results += r["failed"] - - if results: - if show_json: - print(json.dumps(results, indent=4)) - else: - list_fmt = "{id} {queue_status} {blueprint} {version} {compose_type}" - print("\n".join(list_fmt.format(**c) for c in results)) - - return 0
      - -
      [docs]def compose_status(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Return the status of all known composes - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - This doesn't map directly to an API command, it combines the results from queue, finished, - and failed so raw JSON output is not available. - """ - def get_status(compose): - return {"id": compose["id"], - "blueprint": compose["blueprint"], - "version": compose["version"], - "compose_type": compose["compose_type"], - "image_size": compose["image_size"], - "status": compose["queue_status"], - "created": compose.get("job_created"), - "started": compose.get("job_started"), - "finished": compose.get("job_finished")} - - # Sort the status in a specific order - def sort_status(a): - order = ["RUNNING", "WAITING", "FINISHED", "FAILED"] - return (order.index(a["status"]), a["blueprint"], a["version"], a["compose_type"]) - - status = [] - - # Get the composes currently in the queue - api_route = client.api_url(api_version, "/compose/queue") - result = client.get_url_json(socket_path, api_route) - status.extend(list(map(get_status, result["run"] + result["new"]))) - - # Get the list of finished composes - api_route = client.api_url(api_version, "/compose/finished") - result = client.get_url_json(socket_path, api_route) - status.extend(list(map(get_status, result["finished"]))) - - # Get the list of failed composes - api_route = client.api_url(api_version, "/compose/failed") - result = client.get_url_json(socket_path, api_route) - status.extend(list(map(get_status, result["failed"]))) - - # Sort them by status (running, waiting, finished, failed) and then by name and version. - status.sort(key=sort_status) - - if show_json: - print(json.dumps(status, indent=4)) - return 0 - - # Print them as UUID blueprint STATUS - for c in status: - if c["image_size"] > 0: - image_size = str(c["image_size"]) - else: - image_size = "" - - dt = datetime.fromtimestamp(c.get("finished") or c.get("started") or c.get("created")) - - print("%s %-8s %s %-15s %s %-16s %s" % (c["id"], c["status"], dt.strftime("%c"), c["blueprint"], - c["version"], c["compose_type"], image_size))
      - - -
      [docs]def compose_types(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Return information about the supported compose types - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - Add additional details to types that are known to composer-cli. Raw JSON output does not - include this extra information. - """ - api_route = client.api_url(api_version, "/compose/types") - result = client.get_url_json(socket_path, api_route) - if show_json: - print(json.dumps(result, indent=4)) - return 0 - - # output a plain list of identifiers, one per line - print("\n".join(t["name"] for t in result["types"] if t["enabled"]))
      - -
      [docs]def compose_start(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Start a new compose using the selected blueprint and type - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: Set to 1 to simulate a failed compose, set to 2 to simulate a finished one. - :type testmode: int - :param api: Details about the API server, "version" and "backend" - :type api: dict - - compose start [--size XXX] <blueprint-name> <compose-type> [<image-name> <provider> <profile> | <image-name> <profile.toml>] - """ - if api == None: - log.error("Missing api version/backend") - return 1 - - # Get the optional size before checking other parameters - try: - args, size = get_size(args) - except (RuntimeError, ValueError) as e: - log.error(str(e)) - return 1 - - if len(args) == 0: - log.error("start is missing the blueprint name and output type") - return 1 - if len(args) == 1: - log.error("start is missing the output type") - return 1 - if len(args) == 3: - log.error("start is missing the provider and profile details") - return 1 - - config = { - "blueprint_name": args[0], - "compose_type": args[1], - "branch": "master" - } - if size > 0: - if api["backend"] == "lorax-composer": - log.warning("lorax-composer does not support --size, it will be ignored.") - else: - config["size"] = size - - if len(args) == 4: - config["upload"] = {"image_name": args[2]} - # profile TOML file (maybe) - try: - config["upload"].update(toml.load(args[3])) - except toml.TomlDecodeError as e: - log.error(str(e)) - return 1 - elif len(args) == 5: - config["upload"] = { - "image_name": args[2], - "provider": args[3], - "profile": args[4] - } - - if testmode: - test_url = "?test=%d" % testmode - else: - test_url = "" - api_route = client.api_url(api_version, "/compose" + test_url) - result = client.post_url_json(socket_path, api_route, json.dumps(config)) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - print("Compose %s added to the queue" % result["build_id"]) - - if "upload_id" in result and result["upload_id"]: - print ("Upload %s added to the upload queue" % result["upload_id"]) - - return rc
      - -
      [docs]def compose_ostree(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Start a new ostree compose using the selected blueprint and type - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: Set to 1 to simulate a failed compose, set to 2 to simulate a finished one. - :type testmode: int - :param api: Details about the API server, "version" and "backend" - :type api: dict - - compose start-ostree [--size XXXX] [--parent PARENT] [--ref REF] <BLUEPRINT> <TYPE> [<IMAGE-NAME> <PROFILE.TOML>] - """ - if api == None: - log.error("Missing api version/backend") - return 1 - - if api["backend"] == "lorax-composer": - log.warning("lorax-composer doesn not support start-ostree.") - return 1 - - # Get the optional size before checking other parameters - try: - args, size = get_size(args) - args, parent = get_parent(args) - args, ref = get_ref(args) - except (RuntimeError, ValueError) as e: - log.error(str(e)) - return 1 - - if len(args) == 0: - log.error("start-ostree is missing the blueprint name, output type, and ostree details") - return 1 - if len(args) == 1: - log.error("start-ostree is missing the output type") - return 1 - if len(args) == 3: - log.error("start-ostree is missing the provider TOML file") - return 1 - - config = { - "blueprint_name": args[0], - "compose_type": args[1], - "branch": "master", - "ostree": {"ref": ref, "parent": parent}, - } - if size > 0: - config["size"] = size - - if len(args) == 4: - config["upload"] = {"image_name": args[2]} - # profile TOML file (maybe) - try: - config["upload"].update(toml.load(args[3])) - except toml.TomlDecodeError as e: - log.error(str(e)) - return 1 - - if testmode: - test_url = "?test=%d" % testmode - else: - test_url = "" - api_route = client.api_url(api_version, "/compose" + test_url) - result = client.post_url_json(socket_path, api_route, json.dumps(config)) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - print("Compose %s added to the queue" % result["build_id"]) - - if "upload_id" in result and result["upload_id"]: - print ("Upload %s added to the upload queue" % result["upload_id"]) - - return rc
      - -
      [docs]def compose_log(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Show the last part of the compose log - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - compose log <uuid> [<size>kB] - - This will display the last 1kB of the compose's log file. Can be used to follow progress - during the build. - """ - if len(args) == 0: - log.error("log is missing the compose build id") - return 1 - if len(args) == 2: - try: - log_size = int(args[1]) - except ValueError: - log.error("Log size must be an integer.") - return 1 - else: - log_size = 1024 - - api_route = client.api_url(api_version, "/compose/log/%s?size=%d" % (args[0], log_size)) - try: - result = client.get_url_raw(socket_path, api_route) - except RuntimeError as e: - print(str(e)) - return 1 - - print(result) - return 0
      - -
      [docs]def compose_cancel(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Cancel a running compose - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - compose cancel <uuid> - - This will cancel a running compose. It does nothing if the compose has finished. - """ - if len(args) == 0: - log.error("cancel is missing the compose build id") - return 1 - - api_route = client.api_url(api_version, "/compose/cancel/%s" % args[0]) - result = client.delete_url_json(socket_path, api_route) - return handle_api_result(result, show_json)[0]
      - -
      [docs]def compose_delete(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Delete a finished compose's results - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - compose delete <uuid,...> - - Delete the listed compose results. It will only delete results for composes that have finished - or failed, not a running compose. - """ - if len(args) == 0: - log.error("delete is missing the compose build id") - return 1 - - api_route = client.api_url(api_version, "/compose/delete/%s" % (",".join(argify(args)))) - result = client.delete_url_json(socket_path, api_route) - return handle_api_result(result, show_json)[0]
      - -
      [docs]def compose_info(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Return detailed information about the compose - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - compose info <uuid> - - This returns information about the compose, including the blueprint and the dependencies. - """ - if len(args) == 0: - log.error("info is missing the compose build id") - return 1 - - api_route = client.api_url(api_version, "/compose/info/%s" % args[0]) - result = client.get_url_json(socket_path, api_route) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - if result["image_size"] > 0: - image_size = str(result["image_size"]) - else: - image_size = "" - - - print("%s %-8s %-15s %s %-16s %s" % (result["id"], - result["queue_status"], - result["blueprint"]["name"], - result["blueprint"]["version"], - result["compose_type"], - image_size)) - print("Packages:") - for p in result["blueprint"]["packages"]: - print(" %s-%s" % (p["name"], p["version"])) - - print("Modules:") - for m in result["blueprint"]["modules"]: - print(" %s-%s" % (m["name"], m["version"])) - - print("Dependencies:") - for d in result["deps"]["packages"]: - print(" " + packageNEVRA(d)) - - return rc
      - -
      [docs]def compose_metadata(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Download a tar file of the compose's metadata - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - compose metadata <uuid> - - Saves the metadata as uuid-metadata.tar - """ - if len(args) == 0: - log.error("metadata is missing the compose build id") - return 1 - - api_route = client.api_url(api_version, "/compose/metadata/%s" % args[0]) - try: - rc = client.download_file(socket_path, api_route) - except RuntimeError as e: - print(str(e)) - rc = 1 - - return rc
      - -
      [docs]def compose_results(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Download a tar file of the compose's results - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - compose results <uuid> - - The results includes the metadata, output image, and logs. - It is saved as uuid.tar - """ - if len(args) == 0: - log.error("results is missing the compose build id") - return 1 - - api_route = client.api_url(api_version, "/compose/results/%s" % args[0]) - try: - rc = client.download_file(socket_path, api_route, sys.stdout.isatty()) - except RuntimeError as e: - print(str(e)) - rc = 1 - - return rc
      - -
      [docs]def compose_logs(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Download a tar of the compose's logs - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - compose logs <uuid> - - Saves the logs as uuid-logs.tar - """ - if len(args) == 0: - log.error("logs is missing the compose build id") - return 1 - - api_route = client.api_url(api_version, "/compose/logs/%s" % args[0]) - try: - rc = client.download_file(socket_path, api_route, sys.stdout.isatty()) - except RuntimeError as e: - print(str(e)) - rc = 1 - - return rc
      - -
      [docs]def compose_image(socket_path, api_version, args, show_json=False, testmode=0, api=None): - """Download the compose's output image - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - compose image <uuid> - - This downloads only the result image, saving it as the image name, which depends on the type - of compose that was selected. - """ - if len(args) == 0: - log.error("logs is missing the compose build id") - return 1 - - api_route = client.api_url(api_version, "/compose/image/%s" % args[0]) - try: - rc = client.download_file(socket_path, api_route, sys.stdout.isatty()) - except RuntimeError as e: - print(str(e)) - rc = 1 - - return rc
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/composer/cli/modules.html b/docs/html/_modules/composer/cli/modules.html deleted file mode 100644 index 9cfc2738..00000000 --- a/docs/html/_modules/composer/cli/modules.html +++ /dev/null @@ -1,248 +0,0 @@ - - - - - - - - - - - composer.cli.modules — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.cli.modules

      -#
      -# Copyright (C) 2018  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("composer-cli")
      -
      -from composer import http_client as client
      -from composer.cli.help import modules_help
      -from composer.cli.utilities import handle_api_result
      -
      -
      [docs]def modules_cmd(opts): - """Process modules commands - - :param opts: Cmdline arguments - :type opts: argparse.Namespace - :returns: Value to return from sys.exit() - :rtype: int - """ - if opts.args[1] == "help" or opts.args[1] == "--help": - print(modules_help) - return 0 - elif opts.args[1] != "list": - log.error("Unknown modules command: %s", opts.args[1]) - return 1 - - api_route = client.api_url(opts.api_version, "/modules/list") - result = client.get_url_json_unlimited(opts.socket, api_route) - (rc, exit_now) = handle_api_result(result, opts.json) - if exit_now: - return rc - - # "list" should output a plain list of identifiers, one per line. - print("\n".join(r["name"] for r in result["modules"])) - - return rc
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/composer/cli/projects.html b/docs/html/_modules/composer/cli/projects.html deleted file mode 100644 index 096e715a..00000000 --- a/docs/html/_modules/composer/cli/projects.html +++ /dev/null @@ -1,310 +0,0 @@ - - - - - - - - - - - composer.cli.projects — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.cli.projects

      -#
      -# Copyright (C) 2018  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("composer-cli")
      -
      -import textwrap
      -
      -from composer import http_client as client
      -from composer.cli.help import projects_help
      -from composer.cli.utilities import handle_api_result
      -
      -
      [docs]def projects_cmd(opts): - """Process projects commands - - :param opts: Cmdline arguments - :type opts: argparse.Namespace - :returns: Value to return from sys.exit() - :rtype: int - """ - cmd_map = { - "list": projects_list, - "info": projects_info, - } - if opts.args[1] == "help" or opts.args[1] == "--help": - print(projects_help) - return 0 - elif opts.args[1] not in cmd_map: - log.error("Unknown projects command: %s", opts.args[1]) - return 1 - - return cmd_map[opts.args[1]](opts.socket, opts.api_version, opts.args[2:], opts.json)
      - -
      [docs]def projects_list(socket_path, api_version, args, show_json=False): - """Output the list of available projects - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - projects list - """ - api_route = client.api_url(api_version, "/projects/list") - result = client.get_url_json_unlimited(socket_path, api_route) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - for proj in result["projects"]: - for k in [field for field in ("name", "summary", "homepage", "description") if proj[field]]: - print("%s: %s" % (k.title(), textwrap.fill(proj[k], subsequent_indent=" " * (len(k)+2)))) - print("\n\n") - - return rc
      - -
      [docs]def projects_info(socket_path, api_version, args, show_json=False): - """Output info on a list of projects - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - projects info <project,...> - """ - if len(args) == 0: - log.error("projects info is missing the packages") - return 1 - - api_route = client.api_url(api_version, "/projects/info/%s" % ",".join(args)) - result = client.get_url_json(socket_path, api_route) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - for proj in result["projects"]: - for k in [field for field in ("name", "summary", "homepage", "description") if proj[field]]: - print("%s: %s" % (k.title(), textwrap.fill(proj[k], subsequent_indent=" " * (len(k)+2)))) - print("Builds: ") - for build in proj["builds"]: - print(" %s%s-%s.%s at %s for %s" % ("" if not build["epoch"] else str(build["epoch"]) + ":", - build["source"]["version"], - build["release"], - build["arch"], - build["build_time"], - build["changelog"])) - print("") - return rc
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/composer/cli/providers.html b/docs/html/_modules/composer/cli/providers.html deleted file mode 100644 index 10d7523a..00000000 --- a/docs/html/_modules/composer/cli/providers.html +++ /dev/null @@ -1,522 +0,0 @@ - - - - - - - - - - - composer.cli.providers — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.cli.providers

      -#
      -# Copyright (C) 2019  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("composer-cli")
      -
      -import json
      -import toml
      -import os
      -
      -from composer import http_client as client
      -from composer.cli.help import providers_help
      -from composer.cli.utilities import handle_api_result, toml_filename
      -
      -
      [docs]def providers_cmd(opts): - """Process providers commands - - :param opts: Cmdline arguments - :type opts: argparse.Namespace - :returns: Value to return from sys.exit() - :rtype: int - - This dispatches the providers commands to a function - """ - cmd_map = { - "list": providers_list, - "info": providers_info, - "show": providers_show, - "push": providers_push, - "save": providers_save, - "delete": providers_delete, - "template": providers_template - } - if opts.args[1] == "help" or opts.args[1] == "--help": - print(providers_help) - return 0 - elif opts.args[1] not in cmd_map: - log.error("Unknown providers command: %s", opts.args[1]) - return 1 - - return cmd_map[opts.args[1]](opts.socket, opts.api_version, opts.args[2:], opts.json, opts.testmode)
      - -
      [docs]def providers_list(socket_path, api_version, args, show_json=False, testmode=0): - """Return the list of providers - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - providers list - """ - api_route = client.api_url(api_version, "/upload/providers") - r = client.get_url_json(socket_path, api_route) - results = r["providers"] - if not results: - return 0 - - if show_json: - print(json.dumps(results, indent=4)) - else: - if len(args) == 1: - if args[0] not in results: - log.error("%s is not a valid provider", args[0]) - return 1 - print("\n".join(sorted(results[args[0]]["profiles"].keys()))) - else: - print("\n".join(sorted(results.keys()))) - - return 0
      - -
      [docs]def providers_info(socket_path, api_version, args, show_json=False, testmode=0): - """Show information about each provider - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - providers info <PROVIDER> - """ - if len(args) == 0: - log.error("info is missing the provider name") - return 1 - - api_route = client.api_url(api_version, "/upload/providers") - r = client.get_url_json(socket_path, api_route) - results = r["providers"] - if not results: - return 0 - - if show_json: - print(json.dumps(results, indent=4)) - else: - if args[0] not in results: - log.error("%s is not a valid provider", args[0]) - return 1 - p = results[args[0]] - print("%s supports these image types: %s" % (p["display"], ", ".join(p["supported_types"]))) - print("Settings:") - for k in p["settings-info"]: - f = p["settings-info"][k] - print(" %-20s: %s is a %s" % (k, f["display"], f["type"])) - - return 0
      - -
      [docs]def providers_show(socket_path, api_version, args, show_json=False, testmode=0): - """Return details about a provider - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - providers show <provider> <profile> - """ - if len(args) == 0: - log.error("show is missing the provider name") - return 1 - if len(args) == 1: - log.error("show is missing the profile name") - return 1 - - api_route = client.api_url(api_version, "/upload/providers") - r = client.get_url_json(socket_path, api_route) - results = r["providers"] - if not results: - return 0 - - if show_json: - print(json.dumps(results, indent=4)) - else: - if args[0] not in results: - log.error("%s is not a valid provider", args[0]) - return 1 - if args[1] not in results[args[0]]["profiles"]: - log.error("%s is not a valid %s profile", args[1], args[0]) - return 1 - - # Print the details for this profile - # fields are different for each provider, so we just print out the key:values - for k in results[args[0]]["profiles"][args[1]]: - print("%s: %s" % (k, results[args[0]]["profiles"][args[1]][k])) - return 0
      - -
      [docs]def providers_push(socket_path, api_version, args, show_json=False, testmode=0): - """Add a new provider profile or overwrite an existing one - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - providers push <profile.toml> - - """ - if len(args) == 0: - log.error("push is missing the profile TOML file") - return 1 - if not os.path.exists(args[0]): - log.error("Missing profile TOML file: %s", args[0]) - return 1 - - api_route = client.api_url(api_version, "/upload/providers/save") - profile = toml.load(args[0]) - result = client.post_url_json(socket_path, api_route, json.dumps(profile)) - return handle_api_result(result, show_json)[0]
      - -
      [docs]def providers_save(socket_path, api_version, args, show_json=False, testmode=0): - """Save a provider's profile to a TOML file - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - providers save <provider> <profile> - - """ - if len(args) == 0: - log.error("save is missing the provider name") - return 1 - if len(args) == 1: - log.error("save is missing the profile name") - return 1 - - api_route = client.api_url(api_version, "/upload/providers") - r = client.get_url_json(socket_path, api_route) - results = r["providers"] - if not results: - return 0 - - if show_json: - print(json.dumps(results, indent=4)) - else: - if args[0] not in results: - log.error("%s is not a valid provider", args[0]) - return 1 - if args[1] not in results[args[0]]["profiles"]: - log.error("%s is not a valid %s profile", args[1], args[0]) - return 1 - - profile = { - "provider": args[0], - "profile": args[1], - "settings": results[args[0]]["profiles"][args[1]] - } - open(toml_filename(args[1]), "w").write(toml.dumps(profile)) - - return 0
      - -
      [docs]def providers_delete(socket_path, api_version, args, show_json=False, testmode=0): - """Delete a profile from a provider - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - providers delete <provider> <profile> - - """ - if len(args) == 0: - log.error("delete is missing the provider name") - return 1 - if len(args) == 1: - log.error("delete is missing the profile name") - return 1 - - api_route = client.api_url(api_version, "/upload/providers/delete/%s/%s" % (args[0], args[1])) - result = client.delete_url_json(socket_path, api_route) - return handle_api_result(result, show_json)[0]
      - -
      [docs]def providers_template(socket_path, api_version, args, show_json=False, testmode=0): - """Return a TOML template for setting the provider's fields - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - providers template <provider> - """ - if len(args) == 0: - log.error("template is missing the provider name") - return 1 - - api_route = client.api_url(api_version, "/upload/providers") - r = client.get_url_json(socket_path, api_route) - results = r["providers"] - if not results: - return 0 - - if show_json: - print(json.dumps(results, indent=4)) - return 0 - - if args[0] not in results: - log.error("%s is not a valid provider", args[0]) - return 1 - - template = {"provider": args[0]} - settings = results[args[0]]["settings-info"] - template["settings"] = dict([(k, settings[k]["display"]) for k in settings]) - print(toml.dumps(template)) - - return 0
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/composer/cli/sources.html b/docs/html/_modules/composer/cli/sources.html deleted file mode 100644 index d71d0fc0..00000000 --- a/docs/html/_modules/composer/cli/sources.html +++ /dev/null @@ -1,352 +0,0 @@ - - - - - - - - - - - composer.cli.sources — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.cli.sources

      -#
      -# Copyright (C) 2018  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("composer-cli")
      -
      -import os
      -
      -from composer import http_client as client
      -from composer.cli.help import sources_help
      -from composer.cli.utilities import argify, handle_api_result
      -
      -
      [docs]def sources_cmd(opts): - """Process sources commands - - :param opts: Cmdline arguments - :type opts: argparse.Namespace - :returns: Value to return from sys.exit() - :rtype: int - """ - cmd_map = { - "list": sources_list, - "info": sources_info, - "add": sources_add, - "change": sources_add, - "delete": sources_delete, - } - if opts.args[1] == "help" or opts.args[1] == "--help": - print(sources_help) - return 0 - elif opts.args[1] not in cmd_map: - log.error("Unknown sources command: %s", opts.args[1]) - return 1 - - return cmd_map[opts.args[1]](opts.socket, opts.api_version, opts.args[2:], opts.json)
      - -
      [docs]def sources_list(socket_path, api_version, args, show_json=False): - """Output the list of available sources - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - sources list - """ - api_route = client.api_url(api_version, "/projects/source/list") - result = client.get_url_json(socket_path, api_route) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - # "list" should output a plain list of identifiers, one per line. - print("\n".join(result["sources"])) - return rc
      - -
      [docs]def sources_info(socket_path, api_version, args, show_json=False): - """Output info on a list of projects - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - sources info <source-name> - """ - if len(args) == 0: - log.error("sources info is missing the name of the source") - return 1 - - if show_json: - api_route = client.api_url(api_version, "/projects/source/info/%s" % ",".join(args)) - result = client.get_url_json(socket_path, api_route) - rc = handle_api_result(result, show_json)[0] - else: - api_route = client.api_url(api_version, "/projects/source/info/%s?format=toml" % ",".join(args)) - try: - result = client.get_url_raw(socket_path, api_route) - print(result) - rc = 0 - except RuntimeError as e: - print(str(e)) - rc = 1 - - return rc
      - -
      [docs]def sources_add(socket_path, api_version, args, show_json=False): - """Add or change a source - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - sources add <source.toml> - """ - api_route = client.api_url(api_version, "/projects/source/new") - rval = 0 - for source in argify(args): - if not os.path.exists(source): - log.error("Missing source file: %s", source) - continue - source_toml = open(source, "r").read() - - result = client.post_url_toml(socket_path, api_route, source_toml) - if handle_api_result(result, show_json)[0]: - rval = 1 - return rval
      - -
      [docs]def sources_delete(socket_path, api_version, args, show_json=False): - """Delete a source - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - - sources delete <source-name> - """ - api_route = client.api_url(api_version, "/projects/source/delete/%s" % args[0]) - result = client.delete_url_json(socket_path, api_route) - - return handle_api_result(result, show_json)[0]
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/composer/cli/status.html b/docs/html/_modules/composer/cli/status.html deleted file mode 100644 index a86ee4c9..00000000 --- a/docs/html/_modules/composer/cli/status.html +++ /dev/null @@ -1,256 +0,0 @@ - - - - - - - - - - - composer.cli.status — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.cli.status

      -#
      -# Copyright (C) 2018  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("composer-cli")
      -
      -from composer import http_client as client
      -from composer.cli.help import status_help
      -from composer.cli.utilities import handle_api_result
      -
      -
      [docs]def status_cmd(opts): - """Process status commands - - :param opts: Cmdline arguments - :type opts: argparse.Namespace - :returns: Value to return from sys.exit() - :rtype: int - """ - if opts.args[1] == "help" or opts.args[1] == "--help": - print(status_help) - return 0 - elif opts.args[1] != "show": - log.error("Unknown status command: %s", opts.args[1]) - return 1 - - result = client.get_url_json(opts.socket, "/api/status") - (rc, exit_now) = handle_api_result(result, opts.json) - if exit_now: - return rc - - print("API server status:") - print(" Database version: " + result["db_version"]) - print(" Database supported: %s" % result["db_supported"]) - print(" Schema version: " + result["schema_version"]) - print(" API version: " + result["api"]) - print(" Backend: " + result["backend"]) - print(" Build: " + result["build"]) - - if result["msgs"]: - print("Error messages:") - print("\n".join([" " + r for r in result["msgs"]])) - - return rc
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/composer/cli/upload.html b/docs/html/_modules/composer/cli/upload.html deleted file mode 100644 index 252e4863..00000000 --- a/docs/html/_modules/composer/cli/upload.html +++ /dev/null @@ -1,477 +0,0 @@ - - - - - - - - - - - composer.cli.upload — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.cli.upload

      -#
      -# Copyright (C) 2019  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("composer-cli")
      -
      -import json
      -import toml
      -import os
      -
      -from composer import http_client as client
      -from composer.cli.help import upload_help
      -from composer.cli.utilities import handle_api_result
      -
      -
      [docs]def upload_cmd(opts): - """Process upload commands - - :param opts: Cmdline arguments - :type opts: argparse.Namespace - :returns: Value to return from sys.exit() - :rtype: int - - This dispatches the upload commands to a function - """ - cmd_map = { - "list": upload_list, - "info": upload_info, - "start": upload_start, - "log": upload_log, - "cancel": upload_cancel, - "delete": upload_delete, - "reset": upload_reset, - } - if opts.args[1] == "help" or opts.args[1] == "--help": - print(upload_help) - return 0 - elif opts.args[1] not in cmd_map: - log.error("Unknown upload command: %s", opts.args[1]) - return 1 - - return cmd_map[opts.args[1]](opts.socket, opts.api_version, opts.args[2:], opts.json, opts.testmode)
      - -
      [docs]def upload_list(socket_path, api_version, args, show_json=False, testmode=0): - """Return the composes and their associated upload uuids and status - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - upload list - """ - api_route = client.api_url(api_version, "/compose/finished") - r = client.get_url_json(socket_path, api_route) - results = r["finished"] - if not results: - return 0 - - if show_json: - print(json.dumps(results, indent=4)) - else: - compose_fmt = "{id} {queue_status} {blueprint} {version} {compose_type}" - upload_fmt = ' {uuid} "{image_name}" {provider_name} {status}' - for c in results: - print(compose_fmt.format(**c)) - print("\n".join(upload_fmt.format(**u) for u in c["uploads"])) - print() - - return 0
      - -
      [docs]def upload_info(socket_path, api_version, args, show_json=False, testmode=0): - """Return detailed information about the upload - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - upload info <uuid> - - This returns information about the upload, including uuid, name, status, service, and image. - """ - if len(args) == 0: - log.error("info is missing the upload uuid") - return 1 - - api_route = client.api_url(api_version, "/upload/info/%s" % args[0]) - result = client.get_url_json(socket_path, api_route) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - image_path = result["upload"]["image_path"] - print("%s %-8s %-15s %-8s %s" % (result["upload"]["uuid"], - result["upload"]["status"], - result["upload"]["image_name"], - result["upload"]["provider_name"], - os.path.basename(image_path) if image_path else "UNFINISHED")) - - return rc
      - -
      [docs]def upload_start(socket_path, api_version, args, show_json=False, testmode=0): - """Start upload up a build uuid image - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - upload start <build-uuid> <image-name> [<provider> <profile> | <profile.toml>] - """ - if len(args) == 0: - log.error("start is missing the compose build id") - return 1 - if len(args) == 1: - log.error("start is missing the image name") - return 1 - if len(args) == 2: - log.error("start is missing the provider and profile details") - return 1 - - body = {"image_name": args[1]} - if len(args) == 3: - try: - body.update(toml.load(args[2])) - except toml.TomlDecodeError as e: - log.error(str(e)) - return 1 - elif len(args) == 4: - body["provider"] = args[2] - body["profile"] = args[3] - else: - log.error("start has incorrect number of arguments") - return 1 - - api_route = client.api_url(api_version, "/compose/uploads/schedule/%s" % args[0]) - result = client.post_url_json(socket_path, api_route, json.dumps(body)) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - print("Upload %s added to the queue" % result["upload_id"]) - return rc
      - -
      [docs]def upload_log(socket_path, api_version, args, show_json=False, testmode=0): - """Return the upload log - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - upload log <build-uuid> - """ - if len(args) == 0: - log.error("log is missing the upload uuid") - return 1 - - api_route = client.api_url(api_version, "/upload/log/%s" % args[0]) - result = client.get_url_json(socket_path, api_route) - (rc, exit_now) = handle_api_result(result, show_json) - if exit_now: - return rc - - print("Upload log for %s:\n" % result["upload_id"]) - print(result["log"]) - - return 0
      - -
      [docs]def upload_cancel(socket_path, api_version, args, show_json=False, testmode=0): - """Cancel the queued or running upload - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - upload cancel <build-uuid> - """ - if len(args) == 0: - log.error("cancel is missing the upload uuid") - return 1 - - api_route = client.api_url(api_version, "/upload/cancel/%s" % args[0]) - result = client.delete_url_json(socket_path, api_route) - return handle_api_result(result, show_json)[0]
      - -
      [docs]def upload_delete(socket_path, api_version, args, show_json=False, testmode=0): - """Delete an upload and remove it from the build - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - upload delete <build-uuid> - """ - if len(args) == 0: - log.error("delete is missing the upload uuid") - return 1 - - api_route = client.api_url(api_version, "/upload/delete/%s" % args[0]) - result = client.delete_url_json(socket_path, api_route) - return handle_api_result(result, show_json)[0]
      - -
      [docs]def upload_reset(socket_path, api_version, args, show_json=False, testmode=0): - """Reset the upload and execute it again - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param api_version: Version of the API to talk to. eg. "0" - :type api_version: str - :param args: List of remaining arguments from the cmdline - :type args: list of str - :param show_json: Set to True to show the JSON output instead of the human readable output - :type show_json: bool - :param testmode: unused in this function - :type testmode: int - - upload reset <build-uuid> - """ - if len(args) == 0: - log.error("reset is missing the upload uuid") - return 1 - - api_route = client.api_url(api_version, "/upload/reset/%s" % args[0]) - result = client.post_url_json(socket_path, api_route, json.dumps({})) - return handle_api_result(result, show_json)[0]
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/composer/cli/utilities.html b/docs/html/_modules/composer/cli/utilities.html deleted file mode 100644 index f26f0c20..00000000 --- a/docs/html/_modules/composer/cli/utilities.html +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - - - - - composer.cli.utilities — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.cli.utilities

      -#
      -# Copyright (C) 2018  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("composer-cli")
      -
      -import json
      -
      -
      [docs]def argify(args): - """Take a list of human args and return a list with each item - - :param args: list of strings with possible commas and spaces - :type args: list of str - :returns: List of all the items - :rtype: list of str - - Examples: - - ["one,two", "three", ",four", ",five,"] returns ["one", "two", "three", "four", "five"] - """ - return [i for i in [arg for entry in args for arg in entry.split(",")] if i]
      - -
      [docs]def toml_filename(blueprint_name): - """Convert a blueprint name into a filename.toml - - :param blueprint_name: The blueprint's name - :type blueprint_name: str - :returns: The blueprint name with ' ' converted to - and .toml appended - :rtype: str - """ - return blueprint_name.replace(" ", "-") + ".toml"
      - -
      [docs]def frozen_toml_filename(blueprint_name): - """Convert a blueprint name into a filename.toml - - :param blueprint_name: The blueprint's name - :type blueprint_name: str - :returns: The blueprint name with ' ' converted to - and .toml appended - :rtype: str - """ - return blueprint_name.replace(" ", "-") + ".frozen.toml"
      - -
      [docs]def handle_api_result(result, show_json=False): - """Log any errors, return the correct value - - :param result: JSON result from the http query - :type result: dict - :rtype: tuple - :returns: (rc, should_exit_now) - - Return the correct rc for the program (0 or 1), and whether or - not to continue processing the results. - """ - if show_json: - print(json.dumps(result, indent=4)) - else: - for err in result.get("errors", []): - log.error(err["msg"]) - - # What's the rc? If status is present, use that - # If not, use length of errors - if "status" in result: - rc = int(not result["status"]) - else: - rc = int(len(result.get("errors", [])) > 0) - - # Caller should return if showing json, or status was present and False - exit_now = show_json or ("status" in result and rc) - return (rc, exit_now)
      - -
      [docs]def packageNEVRA(pkg): - """Return the package info as a NEVRA - - :param pkg: The package details - :type pkg: dict - :returns: name-[epoch:]version-release-arch - :rtype: str - """ - if pkg["epoch"]: - return "%s-%s:%s-%s.%s" % (pkg["name"], pkg["epoch"], pkg["version"], pkg["release"], pkg["arch"]) - else: - return "%s-%s-%s.%s" % (pkg["name"], pkg["version"], pkg["release"], pkg["arch"])
      - -
      [docs]def get_arg(args, name, argtype=None): - """Return optional value from args, and remaining args - - :param args: list of arguments - :type args: list of strings - :param name: The argument to remove from the args list - :type name: string - :param argtype: Type to use for checking the argument value - :type argtype: type - :returns: (args, value) - :rtype: tuple - - This removes the optional argument and value from the argument list, returns the new list, - and the value of the argument. - """ - try: - idx = args.index(name) - if len(args) < idx+2: - raise RuntimeError(f"{name} is missing the value") - value = args[idx+1] - except ValueError: - return (args, None) - - if argtype: - value = argtype(value) - - return (args[:idx]+args[idx+2:], value)
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/composer/http_client.html b/docs/html/_modules/composer/http_client.html deleted file mode 100644 index edaa8d47..00000000 --- a/docs/html/_modules/composer/http_client.html +++ /dev/null @@ -1,458 +0,0 @@ - - - - - - - - - - - composer.http_client — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.http_client

      -#
      -# Copyright (C) 2018  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("composer-cli")
      -
      -import os
      -import sys
      -import json
      -from urllib.parse import urlparse, urlunparse
      -
      -from composer.unix_socket import UnixHTTPConnectionPool
      -
      -
      [docs]def api_url(api_version, url): - """Return the versioned path to the API route - - :param api_version: The version of the API to talk to. eg. "0" - :type api_version: str - :param url: The API route to talk to - :type url: str - :returns: The full url to use for the route and API version - :rtype: str - """ - return os.path.normpath("/api/v%s/%s" % (api_version, url))
      - -
      [docs]def append_query(url, query): - """Add a query argument to a URL - - The query should be of the form "param1=what&param2=ever", i.e., no - leading '?'. The new query data will be appended to any existing - query string. - - :param url: The original URL - :type url: str - :param query: The query to append - :type query: str - :returns: The new URL with the query argument included - :rtype: str - """ - - url_parts = urlparse(url) - if url_parts.query: - new_query = url_parts.query + "&" + query - else: - new_query = query - return urlunparse([url_parts[0], url_parts[1], url_parts[2], - url_parts[3], new_query, url_parts[5]])
      - -
      [docs]def get_url_raw(socket_path, url): - """Return the raw results of a GET request - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param url: URL to request - :type url: str - :returns: The raw response from the server - :rtype: str - """ - http = UnixHTTPConnectionPool(socket_path) - r = http.request("GET", url) - if r.status == 400: - err = json.loads(r.data.decode("utf-8")) - if "status" in err and err["status"] == False: - msgs = [e["msg"] for e in err["errors"]] - raise RuntimeError(", ".join(msgs)) - - return r.data.decode('utf-8')
      - -
      [docs]def get_url_json(socket_path, url): - """Return the JSON results of a GET request - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param url: URL to request - :type url: str - :returns: The json response from the server - :rtype: dict - """ - http = UnixHTTPConnectionPool(socket_path) - r = http.request("GET", url) - return json.loads(r.data.decode('utf-8'))
      - -
      [docs]def get_url_json_unlimited(socket_path, url, total_fn=None): - """Return the JSON results of a GET request - - For URLs that use offset/limit arguments, this command will - fetch all results for the given request. - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param url: URL to request - :type url: str - :returns: The json response from the server - :rtype: dict - """ - def default_total_fn(data): - """Return the total number of available results""" - return data["total"] - - http = UnixHTTPConnectionPool(socket_path) - - # Start with limit=0 to just get the number of objects - total_url = append_query(url, "limit=0") - r_total = http.request("GET", total_url) - json_total = json.loads(r_total.data.decode('utf-8')) - - # Where to get the total from - if not total_fn: - total_fn = default_total_fn - - # Add the "total" returned by limit=0 as the new limit - unlimited_url = append_query(url, "limit=%d" % total_fn(json_total)) - r_unlimited = http.request("GET", unlimited_url) - return json.loads(r_unlimited.data.decode('utf-8'))
      - -
      [docs]def delete_url_json(socket_path, url): - """Send a DELETE request to the url and return JSON response - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param url: URL to send DELETE to - :type url: str - :returns: The json response from the server - :rtype: dict - """ - http = UnixHTTPConnectionPool(socket_path) - r = http.request("DELETE", url) - return json.loads(r.data.decode("utf-8"))
      - -
      [docs]def post_url(socket_path, url, body): - """POST raw data to the URL - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param url: URL to send POST to - :type url: str - :param body: The data for the body of the POST - :type body: str - :returns: The json response from the server - :rtype: dict - """ - http = UnixHTTPConnectionPool(socket_path) - r = http.request("POST", url, - body=body.encode("utf-8")) - return json.loads(r.data.decode("utf-8"))
      - -
      [docs]def post_url_toml(socket_path, url, body): - """POST a TOML string to the URL - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param url: URL to send POST to - :type url: str - :param body: The data for the body of the POST - :type body: str - :returns: The json response from the server - :rtype: dict - """ - http = UnixHTTPConnectionPool(socket_path) - r = http.request("POST", url, - body=body.encode("utf-8"), - headers={"Content-Type": "text/x-toml"}) - return json.loads(r.data.decode("utf-8"))
      - -
      [docs]def post_url_json(socket_path, url, body): - """POST some JSON data to the URL - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param url: URL to send POST to - :type url: str - :param body: The data for the body of the POST - :type body: str - :returns: The json response from the server - :rtype: dict - """ - http = UnixHTTPConnectionPool(socket_path) - r = http.request("POST", url, - body=body.encode("utf-8"), - headers={"Content-Type": "application/json"}) - return json.loads(r.data.decode("utf-8"))
      - -
      [docs]def get_filename(headers): - """Get the filename from the response header - - :param response: The urllib3 response object - :type response: Response - :raises: RuntimeError if it cannot find a filename in the header - :returns: Filename from content-disposition header - :rtype: str - """ - log.debug("Headers = %s", headers) - if "content-disposition" not in headers: - raise RuntimeError("No Content-Disposition header; cannot get filename") - - try: - k, _, v = headers["content-disposition"].split(";")[1].strip().partition("=") - if k != "filename": - raise RuntimeError("No filename= found in content-disposition header") - except RuntimeError: - raise - except Exception as e: - raise RuntimeError("Error parsing filename from content-disposition header: %s" % str(e)) - - return os.path.basename(v)
      - -
      [docs]def download_file(socket_path, url, progress=True): - """Download a file, saving it to the CWD with the included filename - - :param socket_path: Path to the Unix socket to use for API communication - :type socket_path: str - :param url: URL to send POST to - :type url: str - """ - http = UnixHTTPConnectionPool(socket_path) - r = http.request("GET", url, preload_content=False) - if r.status == 400: - err = json.loads(r.data.decode("utf-8")) - if not err["status"]: - msgs = [e["msg"] for e in err["errors"]] - raise RuntimeError(", ".join(msgs)) - - filename = get_filename(r.headers) - if os.path.exists(filename): - msg = "%s exists, skipping download" % filename - log.error(msg) - raise RuntimeError(msg) - - with open(filename, "wb") as f: - while True: - data = r.read(10 * 1024**2) - if not data: - break - f.write(data) - - if progress: - data_written = f.tell() - if data_written > 5 * 1024**2: - sys.stdout.write("%s: %0.2f MB \r" % (filename, data_written / 1024**2)) - else: - sys.stdout.write("%s: %0.2f kB\r" % (filename, data_written / 1024)) - sys.stdout.flush() - - print("") - r.release_conn() - - return 0
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/composer/unix_socket.html b/docs/html/_modules/composer/unix_socket.html deleted file mode 100644 index cd2f95b9..00000000 --- a/docs/html/_modules/composer/unix_socket.html +++ /dev/null @@ -1,261 +0,0 @@ - - - - - - - - - - - composer.unix_socket — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for composer.unix_socket

      -#
      -# Copyright (C) 2018  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import http.client
      -import socket
      -import urllib3
      -
      -
      -# These 2 classes were adapted and simplified for use with just urllib3.
      -# Originally from https://github.com/msabramo/requests-unixsocket/blob/master/requests_unixsocket/adapters.py
      -
      -# The following was adapted from some code from docker-py
      -# https://github.com/docker/docker-py/blob/master/docker/transport/unixconn.py
      -
      [docs]class UnixHTTPConnection(http.client.HTTPConnection, object): - - def __init__(self, socket_path, timeout=60*5): - """Create an HTTP connection to a unix domain socket - - :param socket_path: The path to the Unix domain socket - :param timeout: Number of seconds to timeout the connection - """ - super(UnixHTTPConnection, self).__init__('localhost', timeout=timeout) - self.socket_path = socket_path - self.sock = None - - def __del__(self): # base class does not have d'tor - if self.sock: - self.sock.close() - -
      [docs] def connect(self): - sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) - sock.settimeout(self.timeout) - sock.connect(self.socket_path) - self.sock = sock
      - -
      [docs]class UnixHTTPConnectionPool(urllib3.connectionpool.HTTPConnectionPool): - - def __init__(self, socket_path, timeout=60*5): - """Create a connection pool using a Unix domain socket - - :param socket_path: The path to the Unix domain socket - :param timeout: Number of seconds to timeout the connection - - NOTE: retries are disabled for these connections, they are never useful - """ - super(UnixHTTPConnectionPool, self).__init__('localhost', timeout=timeout, retries=False) - self.socket_path = socket_path - - def _new_conn(self): - return UnixHTTPConnection(self.socket_path, self.timeout)
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/index.html b/docs/html/_modules/index.html index d81c393e..797b5987 100644 --- a/docs/html/_modules/index.html +++ b/docs/html/_modules/index.html @@ -1,38 +1,38 @@ - - + - + - + + + Overview: module code — Lorax 34.9.0 documentation + + + + + + - Overview: module code — Lorax 34.3 documentation - + - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.9.0
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
      @@ -233,7 +206,6 @@ - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for lifted.config

      -#
      -# Copyright (C) 2019  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -from pylorax.sysutils import joinpaths
      -
      -
      [docs]def configure(conf): - """Add lifted settings to the configuration - - :param conf: configuration object - :type conf: ComposerConfig - :returns: None - - This uses the composer.share_dir and composer.lib_dir as the base - directories for the settings. - """ - share_dir = conf.get("composer", "share_dir") - lib_dir = conf.get("composer", "lib_dir") - - conf.add_section("upload") - conf.set("upload", "providers_dir", joinpaths(share_dir, "/lifted/providers/")) - conf.set("upload", "queue_dir", joinpaths(lib_dir, "/upload/queue/")) - conf.set("upload", "settings_dir", joinpaths(lib_dir, "/upload/settings/"))
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/lifted/providers.html b/docs/html/_modules/lifted/providers.html deleted file mode 100644 index 577205c6..00000000 --- a/docs/html/_modules/lifted/providers.html +++ /dev/null @@ -1,443 +0,0 @@ - - - - - - - - - - - lifted.providers — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for lifted.providers

      -#
      -# Copyright (C) 2019 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -
      -from glob import glob
      -import os
      -import re
      -import stat
      -
      -import pylorax.api.toml as toml
      -
      -
      -def _get_profile_path(ucfg, provider_name, profile, exists=True):
      -    """Helper to return the directory and path for a provider's profile file
      -
      -    :param ucfg: upload config
      -    :type ucfg: object
      -    :param provider_name: the name of the cloud provider, e.g. "azure"
      -    :type provider_name: str
      -    :param profile: the name of the profile to save
      -    :type profile: str != ""
      -    :returns: Full path of the profile .toml file
      -    :rtype: str
      -    :raises: ValueError when passed invalid settings or an invalid profile name
      -    :raises: RuntimeError when the provider or profile couldn't be found
      -    """
      -    # Make sure no path elements are present
      -    profile = os.path.basename(profile)
      -    provider_name = os.path.basename(provider_name)
      -    if not profile:
      -        raise ValueError("Profile name cannot be empty!")
      -    if not provider_name:
      -        raise ValueError("Provider name cannot be empty!")
      -
      -    directory = os.path.join(ucfg["settings_dir"], provider_name)
      -    # create the settings directory if it doesn't exist
      -    os.makedirs(directory, exist_ok=True)
      -
      -    path = os.path.join(directory, f"{profile}.toml")
      -    if exists and not os.path.isfile(path):
      -        raise RuntimeError(f'Couldn\'t find profile "{profile}"!')
      -
      -    return os.path.abspath(path)
      -
      -
      [docs]def resolve_provider(ucfg, provider_name): - """Get information about the specified provider as defined in that - provider's `provider.toml`, including the provider's display name and expected - settings. - - At a minimum, each setting has a display name (that likely differs from its - snake_case name) and a type. Currently, there are two types of settings: - string and boolean. String settings can optionally have a "placeholder" - value for use on the front end and a "regex" for making sure that a value - follows an expected pattern. - - :param ucfg: upload config - :type ucfg: object - :param provider_name: the name of the provider to look for - :type provider_name: str - :raises: RuntimeError when the provider couldn't be found - :returns: the provider - :rtype: dict - """ - # Make sure no path elements are present - provider_name = os.path.basename(provider_name) - path = os.path.join(ucfg["providers_dir"], provider_name, "provider.toml") - try: - with open(path) as provider_file: - provider = toml.load(provider_file) - except OSError as error: - raise RuntimeError(f'Couldn\'t find provider "{provider_name}"!') from error - - return provider
      - - -
      [docs]def load_profiles(ucfg, provider_name): - """Return all settings profiles associated with a provider - - :param ucfg: upload config - :type ucfg: object - :param provider_name: name a provider to find profiles for - :type provider_name: str - :returns: a dict of settings dicts, keyed by profile name - :rtype: dict - """ - # Make sure no path elements are present - provider_name = os.path.basename(provider_name) - - def load_path(path): - with open(path) as file: - return toml.load(file) - - def get_name(path): - return os.path.splitext(os.path.basename(path))[0] - - paths = glob(os.path.join(ucfg["settings_dir"], provider_name, "*")) - return {get_name(path): load_path(path) for path in paths}
      - - -
      [docs]def resolve_playbook_path(ucfg, provider_name): - """Given a provider's name, return the path to its playbook - - :param ucfg: upload config - :type ucfg: object - :param provider_name: the name of the provider to find the playbook for - :type provider_name: str - :raises: RuntimeError when the provider couldn't be found - :returns: the path to the playbook - :rtype: str - """ - # Make sure no path elements are present - provider_name = os.path.basename(provider_name) - - path = os.path.join(ucfg["providers_dir"], provider_name, "playbook.yaml") - if not os.path.isfile(path): - raise RuntimeError(f'Couldn\'t find playbook for "{provider_name}"!') - return path
      - - -
      [docs]def list_providers(ucfg): - """List the names of the available upload providers - - :param ucfg: upload config - :type ucfg: object - :returns: a list of all available provider_names - :rtype: list of str - """ - paths = glob(os.path.join(ucfg["providers_dir"], "*")) - return sorted(os.path.basename(path) for path in paths)
      - - -
      [docs]def validate_settings(ucfg, provider_name, settings, image_name=None): - """Raise a ValueError if any settings are invalid - - :param ucfg: upload config - :type ucfg: object - :param provider_name: the name of the provider to validate the settings against - :type provider_name: str - :param settings: the settings to validate - :type settings: dict - :param image_name: optionally check whether an image_name is valid - :type image_name: str - :raises: ValueError when the passed settings are invalid - :raises: RuntimeError when provider_name can't be found - """ - if image_name == "": - raise ValueError("Image name cannot be empty!") - type_map = {"string": str, "boolean": bool} - settings_info = resolve_provider(ucfg, provider_name)["settings-info"] - for key, value in settings.items(): - if key not in settings_info: - raise ValueError(f'Received unexpected setting: "{key}"!') - setting_type = settings_info[key]["type"] - correct_type = type_map[setting_type] - if not isinstance(value, correct_type): - raise ValueError( - f'Expected a {correct_type} for "{key}", received a {type(value)}!' - ) - if setting_type == "string" and "regex" in settings_info[key]: - if not re.match(settings_info[key]["regex"], value): - raise ValueError(f'Value "{value}" is invalid for setting "{key}"!')
      - - -
      [docs]def save_settings(ucfg, provider_name, profile, settings): - """Save (and overwrite) settings for a given provider - - :param ucfg: upload config - :type ucfg: object - :param provider_name: the name of the cloud provider, e.g. "azure" - :type provider_name: str - :param profile: the name of the profile to save - :type profile: str != "" - :param settings: settings to save for that provider - :type settings: dict - :raises: ValueError when passed invalid settings or an invalid profile name - """ - path = _get_profile_path(ucfg, provider_name, profile, exists=False) - validate_settings(ucfg, provider_name, settings, image_name=None) - - # touch the TOML file if it doesn't exist - if not os.path.isfile(path): - open(path, "a").close() - - # make sure settings files aren't readable by others, as they will contain - # sensitive credentials - current = stat.S_IMODE(os.lstat(path).st_mode) - os.chmod(path, current & ~stat.S_IROTH) - - with open(path, "w") as settings_file: - toml.dump(settings, settings_file)
      - -
      [docs]def load_settings(ucfg, provider_name, profile): - """Load settings for a provider's profile - - :param ucfg: upload config - :type ucfg: object - :param provider_name: the name of the cloud provider, e.g. "azure" - :type provider_name: str - :param profile: the name of the profile to save - :type profile: str != "" - :returns: The profile settings for the selected provider - :rtype: dict - :raises: ValueError when passed invalid settings or an invalid profile name - :raises: RuntimeError when the provider or profile couldn't be found - :raises: ValueError when the passed settings are invalid - - This also calls validate_settings on the loaded settings, potentially - raising an error if the saved settings are invalid. - """ - path = _get_profile_path(ucfg, provider_name, profile) - - with open(path) as file: - settings = toml.load(file) - validate_settings(ucfg, provider_name, settings) - return settings
      - -
      [docs]def delete_profile(ucfg, provider_name, profile): - """Delete a provider's profile settings file - - :param ucfg: upload config - :type ucfg: object - :param provider_name: the name of the cloud provider, e.g. "azure" - :type provider_name: str - :param profile: the name of the profile to save - :type profile: str != "" - :raises: ValueError when passed invalid settings or an invalid profile name - :raises: RuntimeError when the provider or profile couldn't be found - """ - path = _get_profile_path(ucfg, provider_name, profile) - - if os.path.exists(path): - os.unlink(path)
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/lifted/queue.html b/docs/html/_modules/lifted/queue.html deleted file mode 100644 index b9f79b9b..00000000 --- a/docs/html/_modules/lifted/queue.html +++ /dev/null @@ -1,467 +0,0 @@ - - - - - - - - - - - lifted.queue — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for lifted.queue

      -#
      -# Copyright (C) 2019 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -
      -from functools import partial
      -from glob import glob
      -import logging
      -import multiprocessing
      -
      -# We use a multiprocessing Pool for uploads so that we can cancel them with a
      -# simple SIGINT, which should bubble down to subprocesses.
      -from multiprocessing import Pool
      -
      -# multiprocessing.dummy is to threads as multiprocessing is to processes.
      -# Since daemonic processes can't have children, we use a thread to monitor the
      -# upload pool.
      -from multiprocessing.dummy import Process
      -
      -from operator import attrgetter
      -import os
      -import stat
      -import time
      -
      -import pylorax.api.toml as toml
      -
      -from lifted.upload import Upload
      -from lifted.providers import resolve_playbook_path, validate_settings
      -
      -# the maximum number of simultaneous uploads
      -SIMULTANEOUS_UPLOADS = 1
      -
      -log = logging.getLogger("lifted")
      -multiprocessing.log_to_stderr().setLevel(logging.INFO)
      -
      -
      -def _get_queue_path(ucfg):
      -    path = ucfg["queue_dir"]
      -
      -    # create the upload_queue directory if it doesn't exist
      -    os.makedirs(path, exist_ok=True)
      -
      -    return path
      -
      -
      -def _get_upload_path(ucfg, uuid, write=False):
      -    # Make sure no path elements are present
      -    uuid = os.path.basename(uuid)
      -
      -    path = os.path.join(_get_queue_path(ucfg), f"{uuid}.toml")
      -    if write and not os.path.exists(path):
      -        open(path, "a").close()
      -    if os.path.exists(path):
      -        # make sure uploads aren't readable by others, as they will contain
      -        # sensitive credentials
      -        current = stat.S_IMODE(os.lstat(path).st_mode)
      -        os.chmod(path, current & ~stat.S_IROTH)
      -    return path
      -
      -
      -def _list_upload_uuids(ucfg):
      -    paths = glob(os.path.join(_get_queue_path(ucfg), "*"))
      -    return [os.path.splitext(os.path.basename(path))[0] for path in paths]
      -
      -
      -def _write_upload(ucfg, upload):
      -    with open(_get_upload_path(ucfg, upload.uuid, write=True), "w") as upload_file:
      -        toml.dump(upload.serializable(), upload_file)
      -
      -
      -def _write_callback(ucfg):
      -    return partial(_write_upload, ucfg)
      -
      -
      -
      [docs]def get_upload(ucfg, uuid, ignore_missing=False, ignore_corrupt=False): - """Get an Upload object by UUID - - :param ucfg: upload config - :type ucfg: object - :param uuid: UUID of the upload to get - :type uuid: str - :param ignore_missing: if True, don't raise a RuntimeError when the specified upload is missing, instead just return None - :type ignore_missing: bool - :param ignore_corrupt: if True, don't raise a RuntimeError when the specified upload could not be deserialized, instead just return None - :type ignore_corrupt: bool - :returns: the upload object or None - :rtype: Upload or None - :raises: RuntimeError - """ - try: - with open(_get_upload_path(ucfg, uuid), "r") as upload_file: - return Upload(**toml.load(upload_file)) - except FileNotFoundError as error: - if not ignore_missing: - raise RuntimeError(f"Could not find upload {uuid}!") from error - except toml.TomlError as error: - if not ignore_corrupt: - raise RuntimeError(f"Could not parse upload {uuid}!") from error
      - - -
      [docs]def get_uploads(ucfg, uuids): - """Gets a list of Upload objects from a list of upload UUIDs, ignoring - missing or corrupt uploads - - :param ucfg: upload config - :type ucfg: object - :param uuids: list of upload UUIDs to get - :type uuids: list of str - :returns: a list of the uploads that were successfully deserialized - :rtype: list of Upload - """ - uploads = ( - get_upload(ucfg, uuid, ignore_missing=True, ignore_corrupt=True) - for uuid in uuids - ) - return list(filter(None, uploads))
      - - -
      [docs]def get_all_uploads(ucfg): - """Get a list of all stored Upload objects - - :param ucfg: upload config - :type ucfg: object - :returns: a list of all stored upload objects - :rtype: list of Upload - """ - return get_uploads(ucfg, _list_upload_uuids(ucfg))
      - - -
      [docs]def create_upload(ucfg, provider_name, image_name, settings): - """Creates a new upload - - :param ucfg: upload config - :type ucfg: object - :param provider_name: the name of the cloud provider to upload to, e.g. "azure" - :type provider_name: str - :param image_name: what to name the image in the cloud - :type image_name: str - :param settings: settings to pass to the upload, specific to the cloud provider - :type settings: dict - :returns: the created upload object - :rtype: Upload - """ - validate_settings(ucfg, provider_name, settings, image_name) - return Upload( - provider_name=provider_name, - playbook_path=resolve_playbook_path(ucfg, provider_name), - image_name=image_name, - settings=settings, - status_callback=_write_callback(ucfg), - )
      - - -
      [docs]def ready_upload(ucfg, uuid, image_path): - """Pass an image_path to an upload and mark it ready to execute - - :param ucfg: upload config - :type ucfg: object - :param uuid: the UUID of the upload to mark ready - :type uuid: str - :param image_path: the path of the image to pass to the upload - :type image_path: str - """ - get_upload(ucfg, uuid).ready(image_path, _write_callback(ucfg))
      - - -
      [docs]def reset_upload(ucfg, uuid, new_image_name=None, new_settings=None): - """Reset an upload so it can be attempted again - - :param ucfg: upload config - :type ucfg: object - :param uuid: the UUID of the upload to reset - :type uuid: str - :param new_image_name: optionally update the upload's image_name - :type new_image_name: str - :param new_settings: optionally update the upload's settings - :type new_settings: dict - """ - upload = get_upload(ucfg, uuid) - validate_settings( - ucfg, - upload.provider_name, - new_settings or upload.settings, - new_image_name or upload.image_name, - ) - if new_image_name: - upload.image_name = new_image_name - if new_settings: - upload.settings = new_settings - upload.reset(_write_callback(ucfg))
      - - -
      [docs]def cancel_upload(ucfg, uuid): - """Cancel an upload - - :param ucfg: the compose config - :type ucfg: ComposerConfig - :param uuid: the UUID of the upload to cancel - :type uuid: str - """ - get_upload(ucfg, uuid).cancel(_write_callback(ucfg))
      - - -
      [docs]def delete_upload(ucfg, uuid): - """Delete an upload - - :param ucfg: the compose config - :type ucfg: ComposerConfig - :param uuid: the UUID of the upload to delete - :type uuid: str - """ - upload = get_upload(ucfg, uuid) - if upload and upload.is_cancellable(): - upload.cancel() - os.remove(_get_upload_path(ucfg, uuid))
      - - -
      [docs]def start_upload_monitor(ucfg): - """Start a thread that manages the upload queue - - :param ucfg: the compose config - :type ucfg: ComposerConfig - """ - process = Process(target=_monitor, args=(ucfg,)) - process.daemon = True - process.start()
      - - -def _monitor(ucfg): - log.info("Started upload monitor.") - for upload in get_all_uploads(ucfg): - # Set abandoned uploads to FAILED - if upload.status == "RUNNING": - upload.set_status("FAILED", _write_callback(ucfg)) - pool = Pool(processes=SIMULTANEOUS_UPLOADS) - pool_uuids = set() - - def remover(uuid): - return lambda _: pool_uuids.remove(uuid) - - while True: - # Every second, scoop up READY uploads from the filesystem and throw - # them in the pool - all_uploads = get_all_uploads(ucfg) - for upload in sorted(all_uploads, key=attrgetter("creation_time")): - ready = upload.status == "READY" - if ready and upload.uuid not in pool_uuids: - log.info("Starting upload %s...", upload.uuid) - pool_uuids.add(upload.uuid) - callback = remover(upload.uuid) - pool.apply_async( - upload.execute, - (_write_callback(ucfg),), - callback=callback, - error_callback=callback, - ) - time.sleep(1) -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/lifted/upload.html b/docs/html/_modules/lifted/upload.html deleted file mode 100644 index fe76972a..00000000 --- a/docs/html/_modules/lifted/upload.html +++ /dev/null @@ -1,410 +0,0 @@ - - - - - - - - - - - lifted.upload — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for lifted.upload

      -#
      -# Copyright (C) 2019 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -
      -from datetime import datetime
      -import logging
      -from multiprocessing import current_process
      -import os
      -import signal
      -from uuid import uuid4
      -
      -from ansible_runner.interface import run as ansible_run
      -from ansible_runner.exceptions import AnsibleRunnerException
      -
      -log = logging.getLogger("lifted")
      -
      -
      -
      [docs]class Upload: - """Represents an upload of an image to a cloud provider. Instances of this - class are serialized as TOML and stored in the upload queue directory, - which is /var/lib/lorax/upload/queue/ by default""" - - def __init__( - self, - uuid=None, - provider_name=None, - playbook_path=None, - image_name=None, - settings=None, - creation_time=None, - upload_log=None, - upload_pid=None, - image_path=None, - status_callback=None, - status=None, - ): - self.uuid = uuid or str(uuid4()) - self.provider_name = provider_name - self.playbook_path = playbook_path - self.image_name = image_name - self.settings = settings - self.creation_time = creation_time or datetime.now().timestamp() - self.upload_log = upload_log or "" - self.upload_pid = upload_pid - self.image_path = image_path - if status: - self.status = status - else: - self.set_status("WAITING", status_callback) - - def _log(self, message, callback=None): - """Logs something to the upload log with an optional callback - - :param message: the object to log - :type message: object - :param callback: a function of the form callback(self) - :type callback: function - """ - if message: - messages = str(message).splitlines() - - # Log multi-line messages as individual log lines - for m in messages: - log.info(m) - self.upload_log += f"{message}\n" - if callback: - callback(self) - -
      [docs] def serializable(self): - """Returns a representation of the object as a dict for serialization - - :returns: the object's __dict__ - :rtype: dict - """ - return self.__dict__
      - -
      [docs] def summary(self): - """Return a dict with useful information about the upload - - :returns: upload information - :rtype: dict - """ - - return { - "uuid": self.uuid, - "status": self.status, - "provider_name": self.provider_name, - "image_name": self.image_name, - "image_path": self.image_path, - "creation_time": self.creation_time, - "settings": self.settings, - }
      - -
      [docs] def set_status(self, status, status_callback=None): - """Sets the status of the upload with an optional callback - - :param status: the new status - :type status: str - :param status_callback: a function of the form callback(self) - :type status_callback: function - """ - self._log("Setting status to %s" % status) - self.status = status - if status_callback: - status_callback(self)
      - -
      [docs] def ready(self, image_path, status_callback): - """Provide an image_path and mark the upload as ready to execute - - :param image_path: path of the image to upload - :type image_path: str - :param status_callback: a function of the form callback(self) - :type status_callback: function - """ - self._log("Setting image_path to %s" % image_path) - self.image_path = image_path - if self.status == "WAITING": - self.set_status("READY", status_callback)
      - -
      [docs] def reset(self, status_callback): - """Reset the upload so it can be attempted again - - :param status_callback: a function of the form callback(self) - :type status_callback: function - """ - if self.is_cancellable(): - raise RuntimeError(f"Can't reset, status is {self.status}!") - if not self.image_path: - raise RuntimeError("Can't reset, no image supplied yet!") - # self.error = None - self._log("Resetting state") - self.set_status("READY", status_callback)
      - -
      [docs] def is_cancellable(self): - """Is the upload in a cancellable state? - - :returns: whether the upload is cancellable - :rtype: bool - """ - return self.status in ("WAITING", "READY", "RUNNING")
      - -
      [docs] def cancel(self, status_callback=None): - """Cancel the upload. Sends a SIGINT to self.upload_pid. - - :param status_callback: a function of the form callback(self) - :type status_callback: function - """ - if not self.is_cancellable(): - raise RuntimeError(f"Can't cancel, status is already {self.status}!") - if self.upload_pid: - os.kill(self.upload_pid, signal.SIGINT) - self.set_status("CANCELLED", status_callback)
      - -
      [docs] def execute(self, status_callback=None): - """Execute the upload. Meant to be called from a dedicated process so - that the upload can be cancelled by sending a SIGINT to - self.upload_pid. - - :param status_callback: a function of the form callback(self) - :type status_callback: function - """ - if self.status != "READY": - raise RuntimeError("This upload is not ready!") - - try: - self.upload_pid = current_process().pid - self.set_status("RUNNING", status_callback) - self._log("Executing playbook.yml") - - # NOTE: event_handler doesn't seem to be called for playbook errors - logger = lambda e: self._log(e["stdout"], status_callback) - - runner = ansible_run( - playbook=self.playbook_path, - extravars={ - **self.settings, - "image_name": self.image_name, - "image_path": self.image_path, - }, - event_handler=logger, - verbosity=2, - ) - - # Try logging events and stats -- but they may not exist, so catch the error - try: - for e in runner.events: - self._log("%s" % dir(e), status_callback) - - self._log("%s" % runner.stats, status_callback) - except AnsibleRunnerException: - self._log("%s" % runner.stdout.read(), status_callback) - - if runner.status == "successful": - self.set_status("FINISHED", status_callback) - else: - self.set_status("FAILED", status_callback) - except Exception: - import traceback - log.error(traceback.format_exc(limit=2))
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax.html b/docs/html/_modules/pylorax.html index 9877fc52..131dffd4 100644 --- a/docs/html/_modules/pylorax.html +++ b/docs/html/_modules/pylorax.html @@ -1,38 +1,38 @@ - - + - + - + + + pylorax — Lorax 34.10 documentation + + + + + + - pylorax — Lorax 34.3 documentation - + - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
        -
      • Docs »
      • +
      • »
      • Module code »
      • @@ -217,7 +220,7 @@ DRACUT_DEFAULT = ["--xz", "--install", "/.buildstamp", "--no-early-microcode", "--add", "fips"] # Used for DNF conf.module_platform_id -DEFAULT_PLATFORM_ID = "platform:f32" +DEFAULT_PLATFORM_ID = "platform:f34"
        [docs]class ArchData(DataHolder): lib64_arches = ("x86_64", "ppc64le", "s390x", "ia64", "aarch64") @@ -618,20 +621,25 @@
        -
      @@ -640,7 +648,6 @@ - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.bisect

      -#
      -# Copyright (C) 2018 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -
      [docs]def insort_left(a, x, key=None, lo=0, hi=None): - """Insert item x in list a, and keep it sorted assuming a is sorted. - - :param a: sorted list - :type a: list - :param x: item to insert into the list - :type x: object - :param key: Function to use to compare items in the list - :type key: function - :returns: index where the item was inserted - :rtype: int - - If x is already in a, insert it to the left of the leftmost x. - Optional args lo (default 0) and hi (default len(a)) bound the - slice of a to be searched. - - This is a modified version of bisect.insort_left that can use a - function for the compare, and returns the index position where it - was inserted. - """ - if key is None: - key = lambda i: i - - if lo < 0: - raise ValueError('lo must be non-negative') - if hi is None: - hi = len(a) - while lo < hi: - mid = (lo+hi)//2 - if key(a[mid]) < key(x): lo = mid+1 - else: hi = mid - a.insert(lo, x) - return lo
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/checkparams.html b/docs/html/_modules/pylorax/api/checkparams.html deleted file mode 100644 index 9e14ce7b..00000000 --- a/docs/html/_modules/pylorax/api/checkparams.html +++ /dev/null @@ -1,244 +0,0 @@ - - - - - - - - - - - pylorax.api.checkparams — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.checkparams

      -#
      -# Copyright (C) 2018  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -
      -import logging
      -log = logging.getLogger("lorax-composer")
      -
      -from flask import jsonify
      -from functools import update_wrapper
      -
      -# A decorator for checking the parameters provided to the API route implementing
      -# functions.  The tuples parameter is a list of tuples.  Each tuple is the string
      -# name of a parameter ("blueprint_name", not blueprint_name), the value it's set
      -# to by flask if the caller did not provide it, and a message to be returned to
      -# the user.
      -#
      -# If the parameter is set to its default, the error message is returned.  Otherwise,
      -# the decorated function is called and its return value is returned.
      -
      [docs]def checkparams(tuples): - def decorator(f): - def wrapped_function(*args, **kwargs): - for tup in tuples: - if kwargs[tup[0]] == tup[1]: - log.error("(%s) %s", f.__name__, tup[2]) - return jsonify(status=False, errors=[tup[2]]), 400 - - return f(*args, **kwargs) - - return update_wrapper(wrapped_function, f) - - return decorator
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/cmdline.html b/docs/html/_modules/pylorax/api/cmdline.html deleted file mode 100644 index 0aa34e91..00000000 --- a/docs/html/_modules/pylorax/api/cmdline.html +++ /dev/null @@ -1,263 +0,0 @@ - - - - - - - - - - - pylorax.api.cmdline — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.cmdline

      -#
      -# cmdline.py
      -#
      -# Copyright (C) 2018 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import os
      -import sys
      -import argparse
      -
      -from pylorax import vernum
      -
      -DEFAULT_USER  = "root"
      -DEFAULT_GROUP = "weldr"
      -
      -version = "{0}-{1}".format(os.path.basename(sys.argv[0]), vernum)
      -
      -
      [docs]def lorax_composer_parser(): - """ Return the ArgumentParser for lorax-composer""" - - parser = argparse.ArgumentParser(description="Lorax Composer API Server", - fromfile_prefix_chars="@") - - parser.add_argument("--socket", default="/run/weldr/api.socket", metavar="SOCKET", - help="Path to the socket file to listen on") - parser.add_argument("--user", default=DEFAULT_USER, metavar="USER", - help="User to use for reduced permissions") - parser.add_argument("--group", default=DEFAULT_GROUP, metavar="GROUP", - help="Group to set ownership of the socket to") - parser.add_argument("--log", dest="logfile", default="/var/log/lorax-composer/composer.log", metavar="LOG", - help="Path to logfile (/var/log/lorax-composer/composer.log)") - parser.add_argument("--mockfiles", default="/var/tmp/bdcs-mockfiles/", metavar="MOCKFILES", - help="Path to JSON files used for /api/mock/ paths (/var/tmp/bdcs-mockfiles/)") - parser.add_argument("--sharedir", type=os.path.abspath, metavar="SHAREDIR", - help="Directory containing all the templates. Overrides config file sharedir") - parser.add_argument("-V", action="store_true", dest="showver", - help="show program's version number and exit") - parser.add_argument("-c", "--config", default="/etc/lorax/composer.conf", metavar="CONFIG", - help="Path to lorax-composer configuration file.") - parser.add_argument("--releasever", default=None, metavar="STRING", - help="Release version to use for $releasever in dnf repository urls") - parser.add_argument("--tmp", default="/var/tmp", - help="Top level temporary directory") - parser.add_argument("--proxy", default=None, metavar="PROXY", - help="Set proxy for DNF, overrides configuration file setting.") - parser.add_argument("--no-system-repos", action="store_true", default=False, - help="Do not copy over system repos from /etc/yum.repos.d/ at startup") - parser.add_argument("BLUEPRINTS", metavar="BLUEPRINTS", - help="Path to the blueprints") - - return parser
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/compose.html b/docs/html/_modules/pylorax/api/compose.html deleted file mode 100644 index f9442b66..00000000 --- a/docs/html/_modules/pylorax/api/compose.html +++ /dev/null @@ -1,1467 +0,0 @@ - - - - - - - - - - - pylorax.api.compose — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.compose

      -# Copyright (C) 2018-2019 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -""" Setup for composing an image
      -
      -Adding New Output Types
      ------------------------
      -
      -The new output type must add a kickstart template to ./share/composer/ where the
      -name of the kickstart (without the trailing .ks) matches the entry in compose_args.
      -
      -The kickstart should not have any url or repo entries, these will be added at build
      -time. The %packages section should be the last thing, and while it can contain mandatory
      -packages required by the output type, it should not have the trailing %end because the
      -package NEVRAs will be appended to it at build time.
      -
      -compose_args should have a name matching the kickstart, and it should set the novirt_install
      -parameters needed to generate the desired output. Other types should be set to False.
      -
      -"""
      -import logging
      -log = logging.getLogger("lorax-composer")
      -
      -import os
      -from glob import glob
      -from io import StringIO
      -from math import ceil
      -import shutil
      -from uuid import uuid4
      -
      -# Use pykickstart to calculate disk image size
      -from pykickstart.parser import KickstartParser
      -from pykickstart.version import makeVersion
      -
      -from pylorax import ArchData, find_templates, get_buildarch
      -from pylorax.api.gitrpm import create_gitrpm_repo
      -from pylorax.api.projects import projects_depsolve, projects_depsolve_with_size, dep_nevra
      -from pylorax.api.projects import ProjectsError
      -from pylorax.api.recipes import read_recipe_and_id
      -from pylorax.api.timestamp import TS_CREATED, write_timestamp
      -import pylorax.api.toml as toml
      -from pylorax.base import DataHolder
      -from pylorax.imgutils import default_image_name
      -from pylorax.ltmpl import LiveTemplateRunner
      -from pylorax.sysutils import joinpaths, flatconfig
      -
      -
      -
      [docs]def test_templates(dbo, share_dir): - """ Try depsolving each of the the templates and report any errors - - :param dbo: dnf base object - :type dbo: dnf.Base - :returns: List of template types and errors - :rtype: List of errors - - Return a list of templates and errors encountered or an empty list - """ - template_errors = [] - for compose_type, enabled in compose_types(share_dir): - if not enabled: - continue - - # Read the kickstart template for this type - ks_template_path = joinpaths(share_dir, "composer", compose_type) + ".ks" - ks_template = open(ks_template_path, "r").read() - - # How much space will the packages in the default template take? - ks_version = makeVersion() - ks = KickstartParser(ks_version, errorsAreFatal=False, missingIncludeIsFatal=False) - ks.readKickstartFromString(ks_template+"\n%end\n") - pkgs = [(name, "*") for name in ks.handler.packages.packageList] - grps = [grp.name for grp in ks.handler.packages.groupList] - try: - projects_depsolve(dbo, pkgs, grps) - except ProjectsError as e: - template_errors.append("Error depsolving %s: %s" % (compose_type, str(e))) - - return template_errors
      - - -
      [docs]def repo_to_ks(r, url="url"): - """ Return a kickstart line with the correct args. - :param r: DNF repository information - :type r: dnf.Repo - :param url: "url" or "baseurl" to use for the baseurl parameter - :type url: str - :returns: kickstart command arguments for url/repo command - :rtype: str - - Set url to "baseurl" if it is a repo, leave it as "url" for the installation url. - """ - cmd = "" - # url uses --url not --baseurl - if r.baseurl: - cmd += '--%s="%s" ' % (url, r.baseurl[0]) - elif r.metalink: - cmd += '--metalink="%s" ' % r.metalink - elif r.mirrorlist: - cmd += '--mirrorlist="%s" ' % r.mirrorlist - else: - raise RuntimeError("Repo has no baseurl, metalink, or mirrorlist") - - if r.proxy: - cmd += '--proxy="%s" ' % r.proxy - - if not r.sslverify: - cmd += '--noverifyssl' - - if r.sslcacert: - cmd += ' --sslcacert="%s"' % r.sslcacert - if r.sslclientcert: - cmd += ' --sslclientcert="%s"' % r.sslclientcert - if r.sslclientkey: - cmd += ' --sslclientkey="%s"' % r.sslclientkey - - return cmd
      - - -
      [docs]def bootloader_append(line, kernel_append): - """ Insert the kernel_append string into the --append argument - - :param line: The bootloader ... line - :type line: str - :param kernel_append: The arguments to append to the --append section - :type kernel_append: str - - Using pykickstart to process the line is the best way to make sure it - is parsed correctly, and re-assembled for inclusion into the final kickstart - """ - ks_version = makeVersion() - ks = KickstartParser(ks_version, errorsAreFatal=False, missingIncludeIsFatal=False) - ks.readKickstartFromString(line) - - if ks.handler.bootloader.appendLine: - ks.handler.bootloader.appendLine += " %s" % kernel_append - else: - ks.handler.bootloader.appendLine = kernel_append - - # Converting back to a string includes a comment, return just the bootloader line - return str(ks.handler.bootloader).splitlines()[-1]
      - - -
      [docs]def get_kernel_append(recipe): - """Return the customizations.kernel append value - - :param recipe: - :type recipe: Recipe object - :returns: append value or empty string - :rtype: str - """ - if "customizations" not in recipe or \ - "kernel" not in recipe["customizations"] or \ - "append" not in recipe["customizations"]["kernel"]: - return "" - return recipe["customizations"]["kernel"]["append"]
      - - -
      [docs]def timezone_cmd(line, settings): - """ Update the timezone line with the settings - - :param line: The timezone ... line - :type line: str - :param settings: A dict with timezone and/or ntpservers list - :type settings: dict - - Using pykickstart to process the line is the best way to make sure it - is parsed correctly, and re-assembled for inclusion into the final kickstart - """ - ks_version = makeVersion() - ks = KickstartParser(ks_version, errorsAreFatal=False, missingIncludeIsFatal=False) - ks.readKickstartFromString(line) - - if "timezone" in settings: - ks.handler.timezone.timezone = settings["timezone"] - if "ntpservers" in settings: - ks.handler.timezone.ntpservers = settings["ntpservers"] - - # Converting back to a string includes a comment, return just the timezone line - return str(ks.handler.timezone).splitlines()[-1]
      - - -
      [docs]def get_timezone_settings(recipe): - """Return the customizations.timezone dict - - :param recipe: - :type recipe: Recipe object - :returns: append value or empty string - :rtype: dict - """ - if "customizations" not in recipe or \ - "timezone" not in recipe["customizations"]: - return {} - return recipe["customizations"]["timezone"]
      - - -
      [docs]def lang_cmd(line, languages): - """ Update the lang line with the languages - - :param line: The lang ... line - :type line: str - :param settings: The list of languages - :type settings: list - - Using pykickstart to process the line is the best way to make sure it - is parsed correctly, and re-assembled for inclusion into the final kickstart - """ - ks_version = makeVersion() - ks = KickstartParser(ks_version, errorsAreFatal=False, missingIncludeIsFatal=False) - ks.readKickstartFromString(line) - - if languages: - ks.handler.lang.lang = languages[0] - - if len(languages) > 1: - ks.handler.lang.addsupport = languages[1:] - - # Converting back to a string includes a comment, return just the lang line - return str(ks.handler.lang).splitlines()[-1]
      - - -
      [docs]def get_languages(recipe): - """Return the customizations.locale.languages list - - :param recipe: The recipe - :type recipe: Recipe object - :returns: list of language strings - :rtype: list - """ - if "customizations" not in recipe or \ - "locale" not in recipe["customizations"] or \ - "languages" not in recipe["customizations"]["locale"]: - return [] - return recipe["customizations"]["locale"]["languages"]
      - - -
      [docs]def keyboard_cmd(line, layout): - """ Update the keyboard line with the layout - - :param line: The keyboard ... line - :type line: str - :param settings: The keyboard layout - :type settings: str - - Using pykickstart to process the line is the best way to make sure it - is parsed correctly, and re-assembled for inclusion into the final kickstart - """ - ks_version = makeVersion() - ks = KickstartParser(ks_version, errorsAreFatal=False, missingIncludeIsFatal=False) - ks.readKickstartFromString(line) - - if layout: - ks.handler.keyboard.keyboard = layout - ks.handler.keyboard.vc_keymap = "" - ks.handler.keyboard.x_layouts = [] - - # Converting back to a string includes a comment, return just the keyboard line - return str(ks.handler.keyboard).splitlines()[-1]
      - - -
      [docs]def get_keyboard_layout(recipe): - """Return the customizations.locale.keyboard list - - :param recipe: The recipe - :type recipe: Recipe object - :returns: The keyboard layout string - :rtype: str - """ - if "customizations" not in recipe or \ - "locale" not in recipe["customizations"] or \ - "keyboard" not in recipe["customizations"]["locale"]: - return [] - return recipe["customizations"]["locale"]["keyboard"]
      - - -
      [docs]def firewall_cmd(line, settings): - """ Update the firewall line with the new ports and services - - :param line: The firewall ... line - :type line: str - :param settings: A dict with the list of services and ports to enable and disable - :type settings: dict - - Using pykickstart to process the line is the best way to make sure it - is parsed correctly, and re-assembled for inclusion into the final kickstart - """ - ks_version = makeVersion() - ks = KickstartParser(ks_version, errorsAreFatal=False, missingIncludeIsFatal=False) - ks.readKickstartFromString(line) - - # Do not override firewall --disabled - if ks.handler.firewall.enabled != False and settings: - ks.handler.firewall.ports = sorted(set(settings["ports"] + ks.handler.firewall.ports)) - ks.handler.firewall.services = sorted(set(settings["enabled"] + ks.handler.firewall.services)) - ks.handler.firewall.remove_services = sorted(set(settings["disabled"] + ks.handler.firewall.remove_services)) - - # Converting back to a string includes a comment, return just the keyboard line - return str(ks.handler.firewall).splitlines()[-1]
      - - -
      [docs]def get_firewall_settings(recipe): - """Return the customizations.firewall settings - - :param recipe: The recipe - :type recipe: Recipe object - :returns: A dict of settings - :rtype: dict - """ - settings = {"ports": [], "enabled": [], "disabled": []} - - if "customizations" not in recipe or \ - "firewall" not in recipe["customizations"]: - return settings - - settings["ports"] = recipe["customizations"]["firewall"].get("ports", []) - - if "services" in recipe["customizations"]["firewall"]: - settings["enabled"] = recipe["customizations"]["firewall"]["services"].get("enabled", []) - settings["disabled"] = recipe["customizations"]["firewall"]["services"].get("disabled", []) - return settings
      - - -
      [docs]def services_cmd(line, settings): - """ Update the services line with additional services to enable/disable - - :param line: The services ... line - :type line: str - :param settings: A dict with the list of services to enable and disable - :type settings: dict - - Using pykickstart to process the line is the best way to make sure it - is parsed correctly, and re-assembled for inclusion into the final kickstart - """ - # Empty services and no additional settings, return an empty string - if not line and not settings["enabled"] and not settings["disabled"]: - return "" - - ks_version = makeVersion() - ks = KickstartParser(ks_version, errorsAreFatal=False, missingIncludeIsFatal=False) - - # Allow passing in a 'default' so that the enable/disable may be applied to it, without - # parsing it and emitting a kickstart error message - if line != "services": - ks.readKickstartFromString(line) - - # Add to any existing services, removing any duplicates - ks.handler.services.enabled = sorted(set(settings["enabled"] + ks.handler.services.enabled)) - ks.handler.services.disabled = sorted(set(settings["disabled"] + ks.handler.services.disabled)) - - # Converting back to a string includes a comment, return just the keyboard line - return str(ks.handler.services).splitlines()[-1]
      - - -
      [docs]def get_services(recipe): - """Return the customizations.services settings - - :param recipe: The recipe - :type recipe: Recipe object - :returns: A dict of settings - :rtype: dict - """ - settings = {"enabled": [], "disabled": []} - - if "customizations" not in recipe or \ - "services" not in recipe["customizations"]: - return settings - - settings["enabled"] = sorted(recipe["customizations"]["services"].get("enabled", [])) - settings["disabled"] = sorted(recipe["customizations"]["services"].get("disabled", [])) - return settings
      - - -
      [docs]def get_default_services(recipe): - """Get the default string for services, based on recipe - :param recipe: The recipe - - :type recipe: Recipe object - :returns: string with "services" or "" - :rtype: str - - When no services have been selected we don't need to add anything to the kickstart - so return an empty string. Otherwise return "services" which will be updated with - the settings. - """ - services = get_services(recipe) - - if services["enabled"] or services["disabled"]: - return "services" - else: - return ""
      - - -
      [docs]def customize_ks_template(ks_template, recipe): - """ Customize the kickstart template and return it - - :param ks_template: The kickstart template - :type ks_template: str - :param recipe: - :type recipe: Recipe object - - Apply customizations to existing template commands, or add defaults for ones that are - missing and required. - - Apply customizations.kernel.append to the bootloader argument in the template. - Add bootloader line if it is missing. - - Add default timezone if needed. It does NOT replace an existing timezone entry - """ - # Commands to be modified [NEW-COMMAND-FUNC, NEW-VALUE, DEFAULT, REPLACE] - # The function is called with a kickstart command string and the value to replace - # The value is specific to the command, and is understood by the function - # The default is a complete kickstart command string, suitable for writing to the template - # If REPLACE is False it will not change an existing entry only add a missing one - commands = {"bootloader": [bootloader_append, - get_kernel_append(recipe), - 'bootloader --location=none', True], - "timezone": [timezone_cmd, - get_timezone_settings(recipe), - 'timezone UTC', False], - "lang": [lang_cmd, - get_languages(recipe), - 'lang en_US.UTF-8', True], - "keyboard": [keyboard_cmd, - get_keyboard_layout(recipe), - 'keyboard --xlayouts us --vckeymap us', True], - "firewall": [firewall_cmd, - get_firewall_settings(recipe), - 'firewall --enabled', True], - "services": [services_cmd, - get_services(recipe), - get_default_services(recipe), True] - } - found = {} - - output = StringIO() - for line in ks_template.splitlines(): - for cmd in commands: - (new_command, value, default, replace) = commands[cmd] - if line.startswith(cmd): - found[cmd] = True - if value and replace: - log.debug("Replacing %s with %s", cmd, value) - print(new_command(line, value), file=output) - else: - log.debug("Skipping %s", cmd) - print(line, file=output) - break - else: - # No matches, write the line as-is - print(line, file=output) - - # Write out defaults for the ones not found - # These must go FIRST because the template still needs to have the packages added - defaults = StringIO() - for cmd in commands: - if cmd in found: - continue - (new_command, value, default, _) = commands[cmd] - if value and default: - log.debug("Setting %s to use %s", cmd, value) - print(new_command(default, value), file=defaults) - elif default: - log.debug("Setting %s to %s", cmd, default) - print(default, file=defaults) - - return defaults.getvalue() + output.getvalue()
      - - -
      [docs]def write_ks_root(f, user): - """ Write kickstart root password and sshkey entry - - :param f: kickstart file object - :type f: open file object - :param user: A blueprint user dictionary - :type user: dict - :returns: True if it wrote a rootpw command to the kickstart - :rtype: bool - - If the entry contains a ssh key, use sshkey to write it - If it contains password, use rootpw to set it - - root cannot be used with the user command. So only key and password are supported - for root. - """ - wrote_rootpw = False - - # ssh key uses the sshkey kickstart command - if "key" in user: - f.write('sshkey --user %s "%s"\n' % (user["name"], user["key"])) - - if "password" in user: - if any(user["password"].startswith(prefix) for prefix in ["$2b$", "$6$", "$5$"]): - log.debug("Detected pre-crypted password") - f.write('rootpw --iscrypted "%s"\n' % user["password"]) - wrote_rootpw = True - else: - log.debug("Detected plaintext password") - f.write('rootpw --plaintext "%s"\n' % user["password"]) - wrote_rootpw = True - - return wrote_rootpw
      - -
      [docs]def write_ks_user(f, user): - """ Write kickstart user and sshkey entry - - :param f: kickstart file object - :type f: open file object - :param user: A blueprint user dictionary - :type user: dict - - If the entry contains a ssh key, use sshkey to write it - All of the user fields are optional, except name, write out a kickstart user entry - with whatever options are relevant. - """ - # ssh key uses the sshkey kickstart command - if "key" in user: - f.write('sshkey --user %s "%s"\n' % (user["name"], user["key"])) - - # Write out the user kickstart command, much of it is optional - f.write("user --name %s" % user["name"]) - if "home" in user: - f.write(" --homedir %s" % user["home"]) - - if "password" in user: - if any(user["password"].startswith(prefix) for prefix in ["$2b$", "$6$", "$5$"]): - log.debug("Detected pre-crypted password") - f.write(" --iscrypted") - else: - log.debug("Detected plaintext password") - f.write(" --plaintext") - - f.write(" --password \"%s\"" % user["password"]) - - if "shell" in user: - f.write(" --shell %s" % user["shell"]) - - if "uid" in user: - f.write(" --uid %d" % int(user["uid"])) - - if "gid" in user: - f.write(" --gid %d" % int(user["gid"])) - - if "description" in user: - f.write(" --gecos \"%s\"" % user["description"]) - - if "groups" in user: - f.write(" --groups %s" % ",".join(user["groups"])) - - f.write("\n")
      - - -
      [docs]def write_ks_group(f, group): - """ Write kickstart group entry - - :param f: kickstart file object - :type f: open file object - :param group: A blueprint group dictionary - :type user: dict - - gid is optional - """ - if "name" not in group: - raise RuntimeError("group entry requires a name") - - f.write("group --name %s" % group["name"]) - if "gid" in group: - f.write(" --gid %d" % int(group["gid"])) - - f.write("\n")
      - - -
      [docs]def add_customizations(f, recipe): - """ Add customizations to the kickstart file - - :param f: kickstart file object - :type f: open file object - :param recipe: - :type recipe: Recipe object - :returns: None - :raises: RuntimeError if there was a problem writing to the kickstart - """ - if "customizations" not in recipe: - f.write('rootpw --lock\n') - return - customizations = recipe["customizations"] - - # allow customizations to be incorrectly specified as [[customizations]] instead of [customizations] - if isinstance(customizations, list): - customizations = customizations[0] - - if "hostname" in customizations: - f.write("network --hostname=%s\n" % customizations["hostname"]) - - # TODO - remove this, should use user section to define this - if "sshkey" in customizations: - # This is a list of entries - for sshkey in customizations["sshkey"]: - if "user" not in sshkey or "key" not in sshkey: - log.error("%s is incorrect, skipping", sshkey) - continue - f.write('sshkey --user %s "%s"\n' % (sshkey["user"], sshkey["key"])) - - # Creating a user also creates a group. Make a list of the names for later - user_groups = [] - # kickstart requires a rootpw line - wrote_rootpw = False - if "user" in customizations: - # only name is required, everything else is optional - for user in customizations["user"]: - if "name" not in user: - raise RuntimeError("user entry requires a name") - - # root is special, cannot use normal user command for it - if user["name"] == "root": - wrote_rootpw = write_ks_root(f, user) - continue - - write_ks_user(f, user) - user_groups.append(user["name"]) - - if "group" in customizations: - for group in customizations["group"]: - if group["name"] not in user_groups: - write_ks_group(f, group) - else: - log.warning("Skipping group %s, already created by user", group["name"]) - - # Lock the root account if no root user password has been specified - if not wrote_rootpw: - f.write('rootpw --lock\n')
      - - -
      [docs]def get_extra_pkgs(dbo, share_dir, compose_type): - """Return extra packages needed for the output type - - :param dbo: dnf base object - :type dbo: dnf.Base - :param share_dir: Path to the top level share directory - :type share_dir: str - :param compose_type: The type of output to create from the recipe - :type compose_type: str - :returns: List of package names (name only, not NEVRA) - :rtype: list - - Currently this is only needed by live-iso, it reads ./live/live-install.tmpl and - processes only the installpkg lines. It lists the packages needed to complete creation of the - iso using the templates such as x86.tmpl - - Keep in mind that the live-install.tmpl is shared between livemedia-creator and lorax-composer, - even though the results are applied differently. - """ - if compose_type != "live-iso": - return [] - - # get the arch information to pass to the runner - arch = ArchData(get_buildarch(dbo)) - defaults = DataHolder(basearch=arch.basearch) - templatedir = joinpaths(find_templates(share_dir), "live") - runner = LiveTemplateRunner(dbo, templatedir=templatedir, defaults=defaults) - runner.run("live-install.tmpl") - log.debug("extra pkgs = %s", runner.pkgs) - - return runner.pkgnames
      - - -
      [docs]def start_build(cfg, dnflock, gitlock, branch, recipe_name, compose_type, test_mode=0): - """ Start the build - - :param cfg: Configuration object - :type cfg: ComposerConfig - :param dnflock: Lock and YumBase for depsolving - :type dnflock: YumLock - :param recipe: The recipe to build - :type recipe: str - :param compose_type: The type of output to create from the recipe - :type compose_type: str - :returns: Unique ID for the build that can be used to track its status - :rtype: str - """ - share_dir = cfg.get("composer", "share_dir") - lib_dir = cfg.get("composer", "lib_dir") - - # Make sure compose_type is valid, only allow enabled types - type_enabled = dict(compose_types(share_dir)).get(compose_type) - if type_enabled is None: - raise RuntimeError("Invalid compose type (%s), must be one of %s" % (compose_type, [t for t, e in compose_types(share_dir)])) - if not type_enabled: - raise RuntimeError("Compose type '%s' is disabled on this architecture" % compose_type) - - # Some image types (live-iso) need extra packages for composer to execute the output template - with dnflock.lock: - extra_pkgs = get_extra_pkgs(dnflock.dbo, share_dir, compose_type) - log.debug("Extra packages needed for %s: %s", compose_type, extra_pkgs) - - with gitlock.lock: - (commit_id, recipe) = read_recipe_and_id(gitlock.repo, branch, recipe_name) - - # Combine modules and packages and depsolve the list - module_nver = recipe.module_nver - package_nver = recipe.package_nver - package_nver.extend([(name, '*') for name in extra_pkgs]) - - projects = sorted(set(module_nver+package_nver), key=lambda p: p[0].lower()) - deps = [] - log.info("depsolving %s", recipe["name"]) - try: - # This can possibly update repodata and reset the YumBase object. - with dnflock.lock_check: - (installed_size, deps) = projects_depsolve_with_size(dnflock.dbo, projects, recipe.group_names, with_core=False) - except ProjectsError as e: - log.error("start_build depsolve: %s", str(e)) - raise RuntimeError("Problem depsolving %s: %s" % (recipe["name"], str(e))) - - # Read the kickstart template for this type - ks_template_path = joinpaths(share_dir, "composer", compose_type) + ".ks" - ks_template = open(ks_template_path, "r").read() - - # How much space will the packages in the default template take? - ks_version = makeVersion() - ks = KickstartParser(ks_version, errorsAreFatal=False, missingIncludeIsFatal=False) - ks.readKickstartFromString(ks_template+"\n%end\n") - pkgs = [(name, "*") for name in ks.handler.packages.packageList] - grps = [grp.name for grp in ks.handler.packages.groupList] - try: - with dnflock.lock: - (template_size, _) = projects_depsolve_with_size(dnflock.dbo, pkgs, grps, with_core=not ks.handler.packages.nocore) - except ProjectsError as e: - log.error("start_build depsolve: %s", str(e)) - raise RuntimeError("Problem depsolving %s: %s" % (recipe["name"], str(e))) - log.debug("installed_size = %d, template_size=%d", installed_size, template_size) - - # Minimum LMC disk size is 1GiB, and anaconda bumps the estimated size up by 10% (which doesn't always work). - installed_size = int((installed_size+template_size)) * 1.2 - log.debug("/ partition size = %d", installed_size) - - # Create the results directory - build_id = str(uuid4()) - results_dir = joinpaths(lib_dir, "results", build_id) - os.makedirs(results_dir) - - # Write the recipe commit hash - commit_path = joinpaths(results_dir, "COMMIT") - with open(commit_path, "w") as f: - f.write(commit_id) - - # Write the original recipe - recipe_path = joinpaths(results_dir, "blueprint.toml") - with open(recipe_path, "w") as f: - f.write(recipe.toml()) - - # Write the frozen recipe - frozen_recipe = recipe.freeze(deps) - recipe_path = joinpaths(results_dir, "frozen.toml") - with open(recipe_path, "w") as f: - f.write(frozen_recipe.toml()) - - # Write out the dependencies to the results dir - deps_path = joinpaths(results_dir, "deps.toml") - with open(deps_path, "w") as f: - f.write(toml.dumps({"packages":deps})) - - # Save a copy of the original kickstart - shutil.copy(ks_template_path, results_dir) - - with dnflock.lock: - repos = list(dnflock.dbo.repos.iter_enabled()) - if not repos: - raise RuntimeError("No enabled repos, canceling build.") - - # Create the git rpms, if any, and return the path to the repo under results_dir - gitrpm_repo = create_gitrpm_repo(results_dir, recipe) - - # Create the final kickstart with repos and package list - ks_path = joinpaths(results_dir, "final-kickstart.ks") - with open(ks_path, "w") as f: - ks_url = repo_to_ks(repos[0], "url") - log.debug("url = %s", ks_url) - f.write('url %s\n' % ks_url) - for idx, r in enumerate(repos[1:]): - ks_repo = repo_to_ks(r, "baseurl") - log.debug("repo composer-%s = %s", idx, ks_repo) - f.write('repo --name="composer-%s" %s\n' % (idx, ks_repo)) - - if gitrpm_repo: - log.debug("repo gitrpms = %s", gitrpm_repo) - f.write('repo --name="gitrpms" --baseurl="file://%s"\n' % gitrpm_repo) - - # Setup the disk for booting - # TODO Add GPT and UEFI boot support - f.write('clearpart --all --initlabel\n') - - # Write the root partition and it's size in MB (rounded up) - f.write('part / --size=%d\n' % ceil(installed_size / 1024**2)) - - # Some customizations modify the template before writing it - f.write(customize_ks_template(ks_template, recipe)) - - for d in deps: - f.write(dep_nevra(d)+"\n") - - # Include the rpms from the gitrpm repo directory - if gitrpm_repo: - for rpm in glob(os.path.join(gitrpm_repo, "*.rpm")): - f.write(os.path.basename(rpm)[:-4]+"\n") - - f.write("%end\n") - - # Other customizations can be appended to the kickstart - add_customizations(f, recipe) - - # Setup the config to pass to novirt_install - log_dir = joinpaths(results_dir, "logs/") - cfg_args = compose_args(compose_type) - - # Get the title, project, and release version from the host - if not os.path.exists("/etc/os-release"): - log.error("/etc/os-release is missing, cannot determine product or release version") - os_release = flatconfig("/etc/os-release") - - log.debug("os_release = %s", dict(os_release.items())) - - cfg_args["title"] = os_release.get("PRETTY_NAME", "") - cfg_args["project"] = os_release.get("NAME", "") - cfg_args["releasever"] = os_release.get("VERSION_ID", "") - cfg_args["volid"] = "" - cfg_args["extra_boot_args"] = get_kernel_append(recipe) - - if "compression" not in cfg_args: - cfg_args["compression"] = "xz" - - if "compress_args" not in cfg_args: - cfg_args["compress_args"] = [] - - cfg_args.update({ - "ks": [ks_path], - "logfile": log_dir, - "timeout": 60, # 60 minute timeout - }) - with open(joinpaths(results_dir, "config.toml"), "w") as f: - f.write(toml.dumps(cfg_args)) - - # Set the initial status - open(joinpaths(results_dir, "STATUS"), "w").write("WAITING") - - # Set the test mode, if requested - if test_mode > 0: - open(joinpaths(results_dir, "TEST"), "w").write("%s" % test_mode) - - write_timestamp(results_dir, TS_CREATED) - log.info("Adding %s (%s %s) to compose queue", build_id, recipe["name"], compose_type) - os.symlink(results_dir, joinpaths(lib_dir, "queue/new/", build_id)) - - return build_id
      - -# Supported output types -
      [docs]def compose_types(share_dir): - r""" Returns a list of tuples of the supported output types, and their state - - The output types come from the kickstart names in /usr/share/lorax/composer/\*ks - - If they are disabled on the current arch their state is False. If enabled, it is True. - eg. [("alibaba", False), ("ext4-filesystem", True), ...] - """ - # These are compose types that are not supported on an architecture. eg. hyper-v on s390 - # If it is not listed, it is allowed - disable_map = { - "arm": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"], - "armhfp": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"], - "aarch64": ["alibaba", "google", "hyper-v", "vhd", "vmdk"], - "ppc": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"], - "ppc64": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"], - "ppc64le": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"], - "s390": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"], - "s390x": ["alibaba", "ami", "google", "hyper-v", "vhd", "vmdk"], - } - - all_types = sorted([os.path.basename(ks)[:-3] for ks in glob(joinpaths(share_dir, "composer/*.ks"))]) - arch_disabled = disable_map.get(os.uname().machine, []) - - return [(t, t not in arch_disabled) for t in all_types]
      - -
      [docs]def compose_args(compose_type): - """ Returns the settings to pass to novirt_install for the compose type - - :param compose_type: The type of compose to create, from `compose_types()` - :type compose_type: str - - This will return a dict of options that match the ArgumentParser options for livemedia-creator. - These are the ones the define the type of output, it's filename, etc. - Other options will be filled in by `make_compose()` - """ - _MAP = {"tar": {"make_iso": False, - "make_disk": False, - "make_fsimage": False, - "make_appliance": False, - "make_ami": False, - "make_tar": True, - "make_tar_disk": False, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 0, - "image_type": False, # False instead of None because of TOML - "qemu_args": [], - "image_name": default_image_name("xz", "root.tar"), - "tar_disk_name": None, - "image_only": True, - "app_name": None, - "app_template": None, - "app_file": None, - "squashfs_only": False, - }, - "liveimg-tar": {"make_iso": False, - "make_disk": False, - "make_fsimage": False, - "make_appliance": False, - "make_ami": False, - "make_tar": True, - "make_tar_disk": False, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 0, - "image_type": False, # False instead of None because of TOML - "qemu_args": [], - "image_name": default_image_name("xz", "root.tar"), - "tar_disk_name": None, - "image_only": True, - "app_name": None, - "app_template": None, - "app_file": None, - "squashfs_only": False, - }, - "live-iso": {"make_iso": True, - "make_disk": False, - "make_fsimage": False, - "make_appliance": False, - "make_ami": False, - "make_tar": False, - "make_tar_disk": False, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 0, - "image_type": False, # False instead of None because of TOML - "qemu_args": [], - "image_name": "live.iso", - "tar_disk_name": None, - "fs_label": "Anaconda", # Live booting may expect this to be 'Anaconda' - "image_only": False, - "app_name": None, - "app_template": None, - "app_file": None, - "iso_only": True, - "iso_name": "live.iso", - "squashfs_only": False, - }, - "partitioned-disk": {"make_iso": False, - "make_disk": True, - "make_fsimage": False, - "make_appliance": False, - "make_ami": False, - "make_tar": False, - "make_tar_disk": False, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 0, - "image_type": False, # False instead of None because of TOML - "qemu_args": [], - "image_name": "disk.img", - "tar_disk_name": None, - "fs_label": "", - "image_only": True, - "app_name": None, - "app_template": None, - "app_file": None, - "squashfs_only": False, - }, - "qcow2": {"make_iso": False, - "make_disk": True, - "make_fsimage": False, - "make_appliance": False, - "make_ami": False, - "make_tar": False, - "make_tar_disk": False, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 0, - "image_type": "qcow2", - "qemu_args": [], - "image_name": "disk.qcow2", - "tar_disk_name": None, - "fs_label": "", - "image_only": True, - "app_name": None, - "app_template": None, - "app_file": None, - "squashfs_only": False, - }, - "ext4-filesystem": {"make_iso": False, - "make_disk": False, - "make_fsimage": True, - "make_appliance": False, - "make_ami": False, - "make_tar": False, - "make_tar_disk": False, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 0, - "image_type": False, # False instead of None because of TOML - "qemu_args": [], - "image_name": "filesystem.img", - "tar_disk_name": None, - "fs_label": "", - "image_only": True, - "app_name": None, - "app_template": None, - "app_file": None, - "squashfs_only": False, - }, - "ami": {"make_iso": False, - "make_disk": True, - "make_fsimage": False, - "make_appliance": False, - "make_ami": False, - "make_tar": False, - "make_tar_disk": False, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 0, - "image_type": False, - "qemu_args": [], - "image_name": "disk.ami", - "tar_disk_name": None, - "fs_label": "", - "image_only": True, - "app_name": None, - "app_template": None, - "app_file": None, - "squashfs_only": False, - }, - "vhd": {"make_iso": False, - "make_disk": True, - "make_fsimage": False, - "make_appliance": False, - "make_ami": False, - "make_tar": False, - "make_tar_disk": False, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 0, - "image_type": "vpc", - "qemu_args": ["-o", "subformat=fixed,force_size"], - "image_name": "disk.vhd", - "tar_disk_name": None, - "fs_label": "", - "image_only": True, - "app_name": None, - "app_template": None, - "app_file": None, - "squashfs_only": False, - }, - "vmdk": {"make_iso": False, - "make_disk": True, - "make_fsimage": False, - "make_appliance": False, - "make_ami": False, - "make_tar": False, - "make_tar_disk": False, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 0, - "image_type": "vmdk", - "qemu_args": [], - "image_name": "disk.vmdk", - "tar_disk_name": None, - "fs_label": "", - "image_only": True, - "app_name": None, - "app_template": None, - "app_file": None, - "squashfs_only": False, - }, - "openstack": {"make_iso": False, - "make_disk": True, - "make_fsimage": False, - "make_appliance": False, - "make_ami": False, - "make_tar": False, - "make_tar_disk": False, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 0, - "image_type": "qcow2", - "qemu_args": [], - "image_name": "disk.qcow2", - "tar_disk_name": None, - "fs_label": "", - "image_only": True, - "app_name": None, - "app_template": None, - "app_file": None, - "squashfs_only": False, - }, - "google": {"make_iso": False, - "make_disk": True, - "make_fsimage": False, - "make_appliance": False, - "make_ami": False, - "make_tar": False, - "make_tar_disk": True, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 1024, - "image_type": False, # False instead of None because of TOML - "qemu_args": [], - "image_name": "disk.tar.gz", - "tar_disk_name": "disk.raw", - "compression": "gzip", - "compress_args": ["-9"], - "fs_label": "", - "image_only": True, - "app_name": None, - "app_template": None, - "app_file": None, - "squashfs_only": False, - }, - "hyper-v": {"make_iso": False, - "make_disk": True, - "make_fsimage": False, - "make_appliance": False, - "make_ami": False, - "make_tar": False, - "make_tar_disk": False, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 0, - "image_type": "vhdx", - "qemu_args": [], - "image_name": "disk.vhdx", - "tar_disk_name": None, - "fs_label": "", - "image_only": True, - "app_name": None, - "app_template": None, - "app_file": None, - "squashfs_only": False, - }, - "alibaba": {"make_iso": False, - "make_disk": True, - "make_fsimage": False, - "make_appliance": False, - "make_ami": False, - "make_tar": False, - "make_tar_disk": False, - "make_pxe_live": False, - "make_ostree_live": False, - "make_oci": False, - "make_vagrant": False, - "ostree": False, - "live_rootfs_keep_size": False, - "live_rootfs_size": 0, - "image_size_align": 0, - "image_type": "qcow2", - "qemu_args": [], - "image_name": "disk.qcow2", - "tar_disk_name": None, - "fs_label": "", - "image_only": True, - "app_name": None, - "app_template": None, - "app_file": None, - "squashfs_only": False, - }, - } - return _MAP[compose_type]
      - -
      [docs]def move_compose_results(cfg, results_dir): - """Move the final image to the results_dir and cleanup the unneeded compose files - - :param cfg: Build configuration - :type cfg: DataHolder - :param results_dir: Directory to put the results into - :type results_dir: str - """ - if cfg["make_tar"]: - shutil.move(joinpaths(cfg["result_dir"], cfg["image_name"]), results_dir) - elif cfg["make_iso"]: - # Output from live iso is always a boot.iso under images/, move and rename it - shutil.move(joinpaths(cfg["result_dir"], cfg["iso_name"]), joinpaths(results_dir, cfg["image_name"])) - elif cfg["make_disk"] or cfg["make_fsimage"]: - shutil.move(joinpaths(cfg["result_dir"], cfg["image_name"]), joinpaths(results_dir, cfg["image_name"])) - - - # Cleanup the compose directory, but only if it looks like a compose directory - if os.path.basename(cfg["result_dir"]) == "compose": - shutil.rmtree(cfg["result_dir"]) - else: - log.error("Incorrect compose directory, not cleaning up")
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/config.html b/docs/html/_modules/pylorax/api/config.html deleted file mode 100644 index 3e0f0c56..00000000 --- a/docs/html/_modules/pylorax/api/config.html +++ /dev/null @@ -1,340 +0,0 @@ - - - - - - - - - - - pylorax.api.config — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.config

      -#
      -# Copyright (C) 2017  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import configparser
      -import grp
      -import os
      -import pwd
      -
      -from pylorax.sysutils import joinpaths
      -
      -
      [docs]class ComposerConfig(configparser.ConfigParser): -
      [docs] def get_default(self, section, option, default): - try: - return self.get(section, option) - except configparser.Error: - return default
      - - -
      [docs]def configure(conf_file="/etc/lorax/composer.conf", root_dir="/", test_config=False): - """lorax-composer configuration - - :param conf_file: Path to the config file overriding the default settings - :type conf_file: str - :param root_dir: Directory to prepend to paths, defaults to / - :type root_dir: str - :param test_config: Set to True to skip reading conf_file - :type test_config: bool - :returns: Configuration - :rtype: ComposerConfig - """ - conf = ComposerConfig() - - # set defaults - conf.add_section("composer") - conf.set("composer", "share_dir", os.path.realpath(joinpaths(root_dir, "/usr/share/lorax/"))) - conf.set("composer", "lib_dir", os.path.realpath(joinpaths(root_dir, "/var/lib/lorax/composer/"))) - conf.set("composer", "repo_dir", os.path.realpath(joinpaths(root_dir, "/var/lib/lorax/composer/repos.d/"))) - conf.set("composer", "dnf_conf", os.path.realpath(joinpaths(root_dir, "/var/tmp/composer/dnf.conf"))) - conf.set("composer", "dnf_root", os.path.realpath(joinpaths(root_dir, "/var/tmp/composer/dnf/root/"))) - conf.set("composer", "cache_dir", os.path.realpath(joinpaths(root_dir, "/var/tmp/composer/cache/"))) - conf.set("composer", "tmp", os.path.realpath(joinpaths(root_dir, "/var/tmp/"))) - - conf.add_section("users") - conf.set("users", "root", "1") - - # Enable all available repo files by default - conf.add_section("repos") - conf.set("repos", "use_system_repos", "1") - conf.set("repos", "enabled", "*") - - conf.add_section("dnf") - - if not test_config: - # read the config file - if os.path.isfile(conf_file): - conf.read(conf_file) - - return conf
      - -
      [docs]def make_owned_dir(p_dir, uid, gid): - """Make a directory and its parents, setting owner and group - - :param p_dir: path to directory to create - :type p_dir: string - :param uid: uid of owner - :type uid: int - :param gid: gid of owner - :type gid: int - :returns: list of errors - :rtype: list of str - - Check to make sure it does not have o+rw permissions and that it is owned by uid:gid - """ - errors = [] - if not os.path.isdir(p_dir): - # Make sure no o+rw permissions are set - orig_umask = os.umask(0o006) - os.makedirs(p_dir, 0o771) - os.chown(p_dir, uid, gid) - os.umask(orig_umask) - else: - p_stat = os.stat(p_dir) - if p_stat.st_mode & 0o006 != 0: - errors.append("Incorrect permissions on %s, no o+rw permissions are allowed." % p_dir) - - if p_stat.st_gid != gid or p_stat.st_uid != 0: - gr_name = grp.getgrgid(gid).gr_name - u_name = pwd.getpwuid(uid) - errors.append("%s should be owned by %s:%s" % (p_dir, u_name, gr_name)) - - return errors
      - -
      [docs]def make_dnf_dirs(conf, uid, gid): - """Make any missing dnf directories owned by user:group - - :param conf: The configuration to use - :type conf: ComposerConfig - :param uid: uid of owner - :type uid: int - :param gid: gid of owner - :type gid: int - :returns: list of errors - :rtype: list of str - """ - errors = [] - for p in ["dnf_conf", "repo_dir", "cache_dir", "dnf_root"]: - p_dir = os.path.abspath(conf.get("composer", p)) - if p == "dnf_conf": - p_dir = os.path.dirname(p_dir) - errors.extend(make_owned_dir(p_dir, uid, gid))
      - -
      [docs]def make_queue_dirs(conf, gid): - """Make any missing queue directories - - :param conf: The configuration to use - :type conf: ComposerConfig - :param gid: Group ID that has access to the queue directories - :type gid: int - :returns: list of errors - :rtype: list of str - """ - errors = [] - lib_dir = conf.get("composer", "lib_dir") - for p in ["queue/run", "queue/new", "results"]: - p_dir = joinpaths(lib_dir, p) - errors.extend(make_owned_dir(p_dir, 0, gid)) - return errors
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/crossdomain.html b/docs/html/_modules/pylorax/api/crossdomain.html deleted file mode 100644 index d8f653fe..00000000 --- a/docs/html/_modules/pylorax/api/crossdomain.html +++ /dev/null @@ -1,264 +0,0 @@ - - - - - - - - - - - pylorax.api.crossdomain — Lorax 31.7 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.crossdomain

      -#
      -# Copyright (C) 2017  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -
      -# crossdomain decorator from - http://flask.pocoo.org/snippets/56/
      -from datetime import timedelta
      -from flask import make_response, request, current_app
      -from functools import update_wrapper
      -
      -
      -
      [docs]def crossdomain(origin, methods=None, headers=None, - max_age=21600, attach_to_all=True, - automatic_options=True): - if methods is not None: - methods = ', '.join(sorted(x.upper() for x in methods)) - if headers is not None and not isinstance(headers, str): - headers = ', '.join(x.upper() for x in headers) - if not isinstance(origin, list): - origin = [origin] - if isinstance(max_age, timedelta): - max_age = int(max_age.total_seconds()) - - def get_methods(): - if methods is not None: - return methods - - options_resp = current_app.make_default_options_response() - return options_resp.headers['allow'] - - def decorator(f): - def wrapped_function(*args, **kwargs): - if automatic_options and request.method == 'OPTIONS': - resp = current_app.make_default_options_response() - else: - resp = make_response(f(*args, **kwargs)) - if not attach_to_all and request.method != 'OPTIONS': - return resp - - h = resp.headers - - h.extend([("Access-Control-Allow-Origin", orig) for orig in origin]) - h['Access-Control-Allow-Methods'] = get_methods() - h['Access-Control-Max-Age'] = str(max_age) - if headers is not None: - h['Access-Control-Allow-Headers'] = headers - return resp - - f.provide_automatic_options = False - f.required_methods = ['OPTIONS'] - return update_wrapper(wrapped_function, f) - return decorator
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/dnfbase.html b/docs/html/_modules/pylorax/api/dnfbase.html deleted file mode 100644 index 7928b359..00000000 --- a/docs/html/_modules/pylorax/api/dnfbase.html +++ /dev/null @@ -1,386 +0,0 @@ - - - - - - - - - - - pylorax.api.dnfbase — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.dnfbase

      -#
      -# Copyright (C) 2017-2018 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -# pylint: disable=bad-preconf-access
      -
      -import logging
      -log = logging.getLogger("lorax-composer")
      -
      -import dnf
      -import dnf.logging
      -from glob import glob
      -import os
      -import shutil
      -from threading import Lock
      -import time
      -
      -from pylorax import DEFAULT_PLATFORM_ID
      -from pylorax.sysutils import flatconfig
      -
      -
      [docs]class DNFLock(object): - """Hold the dnf.Base object and a Lock to control access to it. - - self.dbo is a property that returns the dnf.Base object, but it *may* change - from one call to the next if the upstream repositories have changed. - """ - def __init__(self, conf, expire_secs=6*60*60): - self._conf = conf - self._lock = Lock() - self.dbo = get_base_object(self._conf) - self._expire_secs = expire_secs - self._expire_time = time.time() + self._expire_secs - - @property - def lock(self): - """Check for repo updates (using expiration time) and return the lock - - If the repository has been updated, tear down the old dnf.Base and - create a new one. This is the only way to force dnf to use the new - metadata. - """ - if time.time() > self._expire_time: - return self.lock_check - return self._lock - - @property - def lock_check(self): - """Force a check for repo updates and return the lock - - Use this method sparingly, it removes the repodata and downloads a new copy every time. - """ - self._expire_time = time.time() + self._expire_secs - self.dbo.update_cache() - return self._lock
      - -
      [docs]def get_base_object(conf): - """Get the DNF object with settings from the config file - - :param conf: configuration object - :type conf: ComposerParser - :returns: A DNF Base object - :rtype: dnf.Base - """ - cachedir = os.path.abspath(conf.get("composer", "cache_dir")) - dnfconf = os.path.abspath(conf.get("composer", "dnf_conf")) - dnfroot = os.path.abspath(conf.get("composer", "dnf_root")) - repodir = os.path.abspath(conf.get("composer", "repo_dir")) - - # Setup the config for the DNF Base object - dbo = dnf.Base() - dbc = dbo.conf -# TODO - Handle this -# dbc.logdir = logdir - dbc.installroot = dnfroot - if not os.path.isdir(dnfroot): - os.makedirs(dnfroot) - if not os.path.isdir(repodir): - os.makedirs(repodir) - - dbc.cachedir = cachedir - dbc.reposdir = [repodir] - dbc.install_weak_deps = False - dbc.prepend_installroot('persistdir') - # this is a weird 'AppendOption' thing that, when you set it, - # actually appends. Doing this adds 'nodocs' to the existing list - # of values, over in libdnf, it does not replace the existing values. - dbc.tsflags = ['nodocs'] - - if conf.get_default("dnf", "proxy", None): - dbc.proxy = conf.get("dnf", "proxy") - - if conf.has_option("dnf", "sslverify") and not conf.getboolean("dnf", "sslverify"): - dbc.sslverify = False - - # If the system repos are enabled read the dnf vars from /etc/dnf/vars/ - if not conf.has_option("repos", "use_system_repos") or conf.getboolean("repos", "use_system_repos"): - dbc.substitutions.update_from_etc("/") - log.info("dnf vars: %s", dbc.substitutions) - - _releasever = conf.get_default("composer", "releasever", None) - if not _releasever: - # Use the releasever of the host system - _releasever = dnf.rpm.detect_releasever("/") - log.info("releasever = %s", _releasever) - dbc.releasever = _releasever - - # DNF 3.2 needs to have module_platform_id set, otherwise depsolve won't work correctly - if not os.path.exists("/etc/os-release"): - log.warning("/etc/os-release is missing, cannot determine platform id, falling back to %s", DEFAULT_PLATFORM_ID) - platform_id = DEFAULT_PLATFORM_ID - else: - os_release = flatconfig("/etc/os-release") - platform_id = os_release.get("PLATFORM_ID", DEFAULT_PLATFORM_ID) - log.info("Using %s for module_platform_id", platform_id) - dbc.module_platform_id = platform_id - - # Make sure metadata is always current - dbc.metadata_expire = 0 - dbc.metadata_expire_filter = "never" - - # write the dnf configuration file - with open(dnfconf, "w") as f: - f.write(dbc.dump()) - - # dnf needs the repos all in one directory, composer uses repodir for this - # if system repos are supposed to be used, copy them into repodir, overwriting any previous copies - if not conf.has_option("repos", "use_system_repos") or conf.getboolean("repos", "use_system_repos"): - for repo_file in glob("/etc/yum.repos.d/*.repo"): - shutil.copy2(repo_file, repodir) - dbo.read_all_repos() - - # Remove any duplicate repo entries. These can cause problems with Anaconda, which will fail - # with space problems. - repos = sorted(list(r.id for r in dbo.repos.iter_enabled())) - seen = {"baseurl": [], "mirrorlist": [], "metalink": []} - for source_name in repos: - remove = False - repo = dbo.repos.get(source_name, None) - if repo is None: - log.warning("repo %s vanished while removing duplicates", source_name) - continue - if repo.baseurl: - if repo.baseurl[0] in seen["baseurl"]: - log.info("Removing duplicate repo: %s baseurl=%s", source_name, repo.baseurl[0]) - remove = True - else: - seen["baseurl"].append(repo.baseurl[0]) - elif repo.mirrorlist: - if repo.mirrorlist in seen["mirrorlist"]: - log.info("Removing duplicate repo: %s mirrorlist=%s", source_name, repo.mirrorlist) - remove = True - else: - seen["mirrorlist"].append(repo.mirrorlist) - elif repo.metalink: - if repo.metalink in seen["metalink"]: - log.info("Removing duplicate repo: %s metalink=%s", source_name, repo.metalink) - remove = True - else: - seen["metalink"].append(repo.metalink) - - if remove: - del dbo.repos[source_name] - - # Update the metadata from the enabled repos to speed up later operations - log.info("Updating repository metadata") - try: - dbo.fill_sack(load_system_repo=False) - dbo.read_comps() - dbo.update_cache() - except dnf.exceptions.Error as e: - log.error("Failed to update metadata: %s", str(e)) - raise RuntimeError("Fetching metadata failed: %s" % str(e)) - - return dbo
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/flask_blueprint.html b/docs/html/_modules/pylorax/api/flask_blueprint.html deleted file mode 100644 index c1bf832e..00000000 --- a/docs/html/_modules/pylorax/api/flask_blueprint.html +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - - - - - - pylorax.api.flask_blueprint — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.flask_blueprint

      -#
      -# Copyright (C) 2019 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -""" Flask Blueprints that support skipping routes
      -
      -When using Blueprints for API versioning you will usually want to fall back
      -to the previous version's rules for routes that have no new behavior. To do
      -this we add a 'skip_rule' list to the Blueprint's options dictionary. It lists
      -all of the routes that you do not want to register.
      -
      -For example:
      -    from pylorax.api.v0 import v0
      -    from pylorax.api.v1 import v1
      -
      -    server.register_blueprint(v0, url_prefix="/api/v0/")
      -    server.register_blueprint(v0, url_prefix="/api/v1/", skip_rules=["/blueprints/list"]
      -    server.register_blueprint(v1, url_prefix="/api/v1/")
      -
      -This will register all of v0's routes under `/api/v0`, and all but `/blueprints/list` under /api/v1,
      -and then register v1's version of `/blueprints/list` under `/api/v1`
      -
      -"""
      -from flask import Blueprint
      -from flask.blueprints import BlueprintSetupState
      -
      -
      [docs]class BlueprintSetupStateSkip(BlueprintSetupState): - def __init__(self, blueprint, app, options, first_registration, skip_rules): - self._skip_rules = skip_rules - super(BlueprintSetupStateSkip, self).__init__(blueprint, app, options, first_registration) - -
      [docs] def add_url_rule(self, rule, endpoint=None, view_func=None, **options): - if rule not in self._skip_rules: - super(BlueprintSetupStateSkip, self).add_url_rule(rule, endpoint, view_func, **options)
      - -
      [docs]class BlueprintSkip(Blueprint): - def __init__(self, *args, **kwargs): - super(BlueprintSkip, self).__init__(*args, **kwargs) - -
      [docs] def make_setup_state(self, app, options, first_registration=False): - skip_rules = options.pop("skip_rules", []) - return BlueprintSetupStateSkip(self, app, options, first_registration, skip_rules)
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/gitrpm.html b/docs/html/_modules/pylorax/api/gitrpm.html deleted file mode 100644 index 052e01d0..00000000 --- a/docs/html/_modules/pylorax/api/gitrpm.html +++ /dev/null @@ -1,422 +0,0 @@ - - - - - - - - - - - pylorax.api.gitrpm — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.gitrpm

      -# Copyright (C) 2019 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -""" Clone a git repository and package it as an rpm
      -
      -This module contains functions for cloning a git repo, creating a tar archive of
      -the selected commit, branch, or tag, and packaging the files into an rpm that will
      -be installed by anaconda when creating the image.
      -"""
      -import logging
      -log = logging.getLogger("lorax-composer")
      -
      -import os
      -from rpmfluff import SimpleRpmBuild
      -import shutil
      -import subprocess
      -import tempfile
      -import time
      -
      -from pylorax.sysutils import joinpaths
      -
      -
      [docs]def get_repo_description(gitRepo): - """ Return a description including the git repo and reference - - :param gitRepo: A dict with the repository details - :type gitRepo: dict - :returns: A string with the git repo url and reference - :rtype: str - """ - return "Created from %s, reference '%s', on %s" % (gitRepo["repo"], gitRepo["ref"], time.ctime())
      - -
      [docs]class GitArchiveTarball: - """Create a git archive of the selected git repo and reference""" - def __init__(self, gitRepo): - self._gitRepo = gitRepo - self.sourceName = self._gitRepo["rpmname"]+".tar.xz" - -
      [docs] def write_file(self, sourcesDir): - """ Create the tar archive - - :param sourcesDir: Path to use for creating the archive - :type sourcesDir: str - - This clones the git repository and creates a git archive from the specified reference. - The result is in RPMNAME.tar.xz under the sourcesDir - """ - # Clone the repository into a temporary location - cmd = ["git", "clone", self._gitRepo["repo"], joinpaths(sourcesDir, "gitrepo")] - log.debug(cmd) - try: - subprocess.check_output(cmd, stderr=subprocess.STDOUT) - except subprocess.CalledProcessError as e: - log.error("Failed to clone %s: %s", self._gitRepo["repo"], e.output) - raise RuntimeError("Failed to clone %s" % self._gitRepo["repo"]) - - oldcwd = os.getcwd() - try: - os.chdir(joinpaths(sourcesDir, "gitrepo")) - - # Configure archive to create a .tar.xz - cmd = ["git", "config", "tar.tar.xz.command", "xz -c"] - log.debug(cmd) - subprocess.check_call(cmd) - - cmd = ["git", "archive", "--prefix", self._gitRepo["rpmname"] + "/", "-o", joinpaths(sourcesDir, self.sourceName), self._gitRepo["ref"]] - log.debug(cmd) - try: - subprocess.check_output(cmd, stderr=subprocess.STDOUT) - except subprocess.CalledProcessError as e: - log.error("Failed to archive %s: %s", self._gitRepo["repo"], e.output) - raise RuntimeError('Failed to archive %s from ref "%s"' % (self._gitRepo["repo"], - self._gitRepo["ref"])) - finally: - # Cleanup even if there was an error - os.chdir(oldcwd) - shutil.rmtree(joinpaths(sourcesDir, "gitrepo"))
      - -
      [docs]class GitRpmBuild(SimpleRpmBuild): - """Build an rpm containing files from a git repository""" - def __init__(self, *args, **kwargs): - self._base_dir = None - super().__init__(*args, **kwargs) - -
      [docs] def check(self): - raise NotImplementedError
      - -
      [docs] def get_base_dir(self): - """Place all the files under a temporary directory + rpmbuild/ - """ - if not self._base_dir: - self._base_dir = tempfile.mkdtemp(prefix="lorax-git-rpm.") - return joinpaths(self._base_dir, "rpmbuild")
      - -
      [docs] def cleanup_tmpdir(self): - """Remove the temporary directory and all of its contents - """ - if len(self._base_dir) < 5: - raise RuntimeError("Invalid base_dir: %s" % self.get_base_dir()) - - shutil.rmtree(self._base_dir)
      - -
      [docs] def clean(self): - """Remove the base directory from inside the tmpdir""" - if len(self.get_base_dir()) < 5: - raise RuntimeError("Invalid base_dir: %s" % self.get_base_dir()) - shutil.rmtree(self.get_base_dir(), ignore_errors=True)
      - -
      [docs] def add_git_tarball(self, gitRepo): - """Add a tar archive of a git repository to the rpm - - :param gitRepo: A dict with the repository details - :type gitRepo: dict - - This populates the rpm with the URL of the git repository, the summary - describing the repo, the description of the repository and reference used, - and sets up the rpm to install the archive contents into the destination - path. - """ - self.addUrl(gitRepo["repo"]) - self.add_summary(gitRepo["summary"]) - self.add_description(get_repo_description(gitRepo)) - self.addLicense("Unknown") - sourceIndex = self.add_source(GitArchiveTarball(gitRepo)) - self.section_build += "tar -xvf %s\n" % self.sources[sourceIndex].sourceName - dest = os.path.normpath(gitRepo["destination"]) - # Prevent double slash root - if dest == "/": - dest = "" - self.create_parent_dirs(dest) - self.section_install += "cp -r %s/. $RPM_BUILD_ROOT/%s\n" % (gitRepo["rpmname"], dest) - sub = self.get_subpackage(None) - if not dest: - # / is special, we don't want to include / itself, just what's under it - sub.section_files += "/*\n" - else: - sub.section_files += "%s/\n" % dest
      - -
      [docs]def make_git_rpm(gitRepo, dest): - """ Create an rpm from the specified git repo - - :param gitRepo: A dict with the repository details - :type gitRepo: dict - - This will clone the git repository, create an archive of the selected reference, - and build an rpm that will install the files from the repository under the destination - directory. The gitRepo dict should have the following fields:: - - rpmname: "server-config" - rpmversion: "1.0" - rpmrelease: "1" - summary: "Setup files for server deployment" - repo: "PATH OF GIT REPO TO CLONE" - ref: "v1.0" - destination: "/opt/server/" - - * rpmname: Name of the rpm to create, also used as the prefix name in the tar archive - * rpmversion: Version of the rpm, eg. "1.0.0" - * rpmrelease: Release of the rpm, eg. "1" - * summary: Summary string for the rpm - * repo: URL of the get repo to clone and create the archive from - * ref: Git reference to check out. eg. origin/branch-name, git tag, or git commit hash - * destination: Path to install the / of the git repo at when installing the rpm - """ - gitRpm = GitRpmBuild(gitRepo["rpmname"], gitRepo["rpmversion"], gitRepo["rpmrelease"], ["noarch"]) - try: - gitRpm.add_git_tarball(gitRepo) - gitRpm.do_make() - rpmfile = gitRpm.get_built_rpm("noarch") - shutil.move(rpmfile, dest) - except Exception as e: - log.error("Creating git repo rpm: %s", e) - raise RuntimeError("Creating git repo rpm: %s" % e) - finally: - gitRpm.cleanup_tmpdir() - - return os.path.basename(rpmfile)
      - -# Create the git rpms, if any, and return the path to the repo under results_dir -
      [docs]def create_gitrpm_repo(results_dir, recipe): - """Create a dnf repository with the rpms from the recipe - - :param results_dir: Path to create the repository under - :type results_dir: str - :param recipe: The recipe to get the repos.git entries from - :type recipe: Recipe - :returns: Path to the dnf repository or "" - :rtype: str - - This function creates a dnf repository directory at results_dir+"repo/", - creates rpms for all of the repos.git entries in the recipe, runs createrepo_c - on the dnf repository so that Anaconda can use it, and returns the path to the - repository to the caller. - """ - if "repos" not in recipe or "git" not in recipe["repos"]: - return "" - - gitrepo = joinpaths(results_dir, "repo/") - if not os.path.exists(gitrepo): - os.makedirs(gitrepo) - for r in recipe["repos"]["git"]: - make_git_rpm(r, gitrepo) - cmd = ["createrepo_c", gitrepo] - log.debug(cmd) - try: - subprocess.check_output(cmd, stderr=subprocess.STDOUT) - except subprocess.CalledProcessError as e: - log.error("Failed to create repo at %s: %s", gitrepo, e.output) - raise RuntimeError("Failed to create repo at %s" % gitrepo) - - return gitrepo
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/projects.html b/docs/html/_modules/pylorax/api/projects.html deleted file mode 100644 index 9e76aed7..00000000 --- a/docs/html/_modules/pylorax/api/projects.html +++ /dev/null @@ -1,897 +0,0 @@ - - - - - - - - - - - pylorax.api.projects — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.projects

      -#
      -# Copyright (C) 2017  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("lorax-composer")
      -
      -from configparser import ConfigParser
      -import dnf
      -from glob import glob
      -import os
      -import time
      -
      -from pylorax.api.bisect import insort_left
      -from pylorax.sysutils import joinpaths
      -
      -TIME_FORMAT = "%Y-%m-%dT%H:%M:%S"
      -
      -
      -
      [docs]class ProjectsError(Exception): - pass
      - - -
      [docs]def api_time(t): - """Convert time since epoch to a string - - :param t: Seconds since epoch - :type t: int - :returns: Time string - :rtype: str - """ - return time.strftime(TIME_FORMAT, time.localtime(t))
      - - -
      [docs]def api_changelog(changelog): - """Convert the changelog to a string - - :param changelog: A list of time, author, string tuples. - :type changelog: tuple - :returns: The most recent changelog text or "" - :rtype: str - - This returns only the most recent changelog entry. - """ - try: - entry = changelog[0][2] - except IndexError: - entry = "" - return entry
      - - -
      [docs]def pkg_to_project(pkg): - """Extract the details from a hawkey.Package object - - :param pkgs: hawkey.Package object with package details - :type pkgs: hawkey.Package - :returns: A dict with the name, summary, description, and url. - :rtype: dict - - upstream_vcs is hard-coded to UPSTREAM_VCS - """ - return {"name": pkg.name, - "summary": pkg.summary, - "description": pkg.description, - "homepage": pkg.url, - "upstream_vcs": "UPSTREAM_VCS"}
      - - -
      [docs]def pkg_to_build(pkg): - """Extract the build details from a hawkey.Package object - - :param pkg: hawkey.Package object with package details - :type pkg: hawkey.Package - :returns: A dict with the build details, epoch, release, arch, build_time, changelog, ... - :rtype: dict - - metadata entries are hard-coded to {} - - Note that this only returns the build dict, it does not include the name, description, etc. - """ - return {"epoch": pkg.epoch, - "release": pkg.release, - "arch": pkg.arch, - "build_time": api_time(pkg.buildtime), - "changelog": "CHANGELOG_NEEDED", # XXX Not in hawkey.Package - "build_config_ref": "BUILD_CONFIG_REF", - "build_env_ref": "BUILD_ENV_REF", - "metadata": {}, - "source": {"license": pkg.license, - "version": pkg.version, - "source_ref": "SOURCE_REF", - "metadata": {}}}
      - - -
      [docs]def pkg_to_project_info(pkg): - """Extract the details from a hawkey.Package object - - :param pkg: hawkey.Package object with package details - :type pkg: hawkey.Package - :returns: A dict with the project details, as well as epoch, release, arch, build_time, changelog, ... - :rtype: dict - - metadata entries are hard-coded to {} - """ - return {"name": pkg.name, - "summary": pkg.summary, - "description": pkg.description, - "homepage": pkg.url, - "upstream_vcs": "UPSTREAM_VCS", - "builds": [pkg_to_build(pkg)]}
      - - -
      [docs]def pkg_to_dep(pkg): - """Extract the info from a hawkey.Package object - - :param pkg: A hawkey.Package object - :type pkg: hawkey.Package - :returns: A dict with name, epoch, version, release, arch - :rtype: dict - """ - return {"name": pkg.name, - "epoch": pkg.epoch, - "version": pkg.version, - "release": pkg.release, - "arch": pkg.arch}
      - - -
      [docs]def proj_to_module(proj): - """Extract the name from a project_info dict - - :param pkg: dict with package details - :type pkg: dict - :returns: A dict with name, and group_type - :rtype: dict - - group_type is hard-coded to "rpm" - """ - return {"name": proj["name"], - "group_type": "rpm"}
      - - -
      [docs]def dep_evra(dep): - """Return the epoch:version-release.arch for the dep - - :param dep: dependency dict - :type dep: dict - :returns: epoch:version-release.arch - :rtype: str - """ - if dep["epoch"] == 0: - return dep["version"]+"-"+dep["release"]+"."+dep["arch"] - else: - return str(dep["epoch"])+":"+dep["version"]+"-"+dep["release"]+"."+dep["arch"]
      - -
      [docs]def dep_nevra(dep): - """Return the name-epoch:version-release.arch""" - return dep["name"]+"-"+dep_evra(dep)
      - - -
      [docs]def projects_list(dbo): - """Return a list of projects - - :param dbo: dnf base object - :type dbo: dnf.Base - :returns: List of project info dicts with name, summary, description, homepage, upstream_vcs - :rtype: list of dicts - """ - return projects_info(dbo, None)
      - - -
      [docs]def projects_info(dbo, project_names): - """Return details about specific projects - - :param dbo: dnf base object - :type dbo: dnf.Base - :param project_names: List of names of projects to get info about - :type project_names: str - :returns: List of project info dicts with pkg_to_project as well as epoch, version, release, etc. - :rtype: list of dicts - - If project_names is None it will return the full list of available packages - """ - if project_names: - pkgs = dbo.sack.query().available().filter(name__glob=project_names) - else: - pkgs = dbo.sack.query().available() - - # iterate over pkgs - # - if pkg.name isn't in the results yet, add pkg_to_project_info in sorted position - # - if pkg.name is already in results, get its builds. If the build for pkg is different - # in any way (version, arch, etc.) add it to the entry's builds list. If it is the same, - # skip it. - results = [] - results_names = {} - for p in pkgs: - if p.name.lower() not in results_names: - idx = insort_left(results, pkg_to_project_info(p), key=lambda p: p["name"].lower()) - results_names[p.name.lower()] = idx - else: - build = pkg_to_build(p) - if build not in results[results_names[p.name.lower()]]["builds"]: - results[results_names[p.name.lower()]]["builds"].append(build) - - return results
      - -def _depsolve(dbo, projects, groups): - """Add projects to a new transaction - - :param dbo: dnf base object - :type dbo: dnf.Base - :param projects: The projects and version globs to find the dependencies for - :type projects: List of tuples - :param groups: The groups to include in dependency solving - :type groups: List of str - :returns: None - :rtype: None - :raises: ProjectsError if there was a problem installing something - """ - # This resets the transaction and updates the cache. - # It is important that the cache always be synchronized because Anaconda will grab its own copy - # and if that is different the NEVRAs will not match and the build will fail. - dbo.reset(goal=True) - install_errors = [] - for name in groups: - try: - dbo.group_install(name, ["mandatory", "default"]) - except dnf.exceptions.MarkingError as e: - install_errors.append(("Group %s" % (name), str(e))) - - for name, version in projects: - # Find the best package matching the name + version glob - # dnf can return multiple packages if it is in more than 1 repository - query = dbo.sack.query().filterm(provides__glob=name) - if version: - query.filterm(version__glob=version) - - query.filterm(latest=1) - if not query: - install_errors.append(("%s-%s" % (name, version), "No match")) - continue - sltr = dnf.selector.Selector(dbo.sack).set(pkg=query) - - # NOTE: dnf says in near future there will be a "goal" attribute of Base class - # so yes, we're using a 'private' attribute here on purpose and with permission. - dbo._goal.install(select=sltr, optional=False) - - if install_errors: - raise ProjectsError("The following package(s) had problems: %s" % ",".join(["%s (%s)" % (pattern, err) for pattern, err in install_errors])) - -
      [docs]def projects_depsolve(dbo, projects, groups): - """Return the dependencies for a list of projects - - :param dbo: dnf base object - :type dbo: dnf.Base - :param projects: The projects to find the dependencies for - :type projects: List of Strings - :param groups: The groups to include in dependency solving - :type groups: List of str - :returns: NEVRA's of the project and its dependencies - :rtype: list of dicts - :raises: ProjectsError if there was a problem installing something - """ - _depsolve(dbo, projects, groups) - - try: - dbo.resolve() - except dnf.exceptions.DepsolveError as e: - raise ProjectsError("There was a problem depsolving %s: %s" % (projects, str(e))) - - if len(dbo.transaction) == 0: - return [] - - return sorted(map(pkg_to_dep, dbo.transaction.install_set), key=lambda p: p["name"].lower())
      - - -
      [docs]def estimate_size(packages, block_size=6144): - """Estimate the installed size of a package list - - :param packages: The packages to be installed - :type packages: list of hawkey.Package objects - :param block_size: The block size to use for rounding up file sizes. - :type block_size: int - :returns: The estimated size of installed packages - :rtype: int - - Estimating actual requirements is difficult without the actual file sizes, which - dnf doesn't provide access to. So use the file count and block size to estimate - a minimum size for each package. - """ - installed_size = 0 - for p in packages: - installed_size += len(p.files) * block_size - installed_size += p.installsize - return installed_size
      - - -
      [docs]def projects_depsolve_with_size(dbo, projects, groups, with_core=True): - """Return the dependencies and installed size for a list of projects - - :param dbo: dnf base object - :type dbo: dnf.Base - :param project_names: The projects to find the dependencies for - :type project_names: List of Strings - :param groups: The groups to include in dependency solving - :type groups: List of str - :returns: installed size and a list of NEVRA's of the project and its dependencies - :rtype: tuple of (int, list of dicts) - :raises: ProjectsError if there was a problem installing something - """ - _depsolve(dbo, projects, groups) - - if with_core: - dbo.group_install("core", ['mandatory', 'default', 'optional']) - - try: - dbo.resolve() - except dnf.exceptions.DepsolveError as e: - raise ProjectsError("There was a problem depsolving %s: %s" % (projects, str(e))) - - if len(dbo.transaction) == 0: - return (0, []) - - installed_size = estimate_size(dbo.transaction.install_set) - deps = sorted(map(pkg_to_dep, dbo.transaction.install_set), key=lambda p: p["name"].lower()) - return (installed_size, deps)
      - - -
      [docs]def modules_list(dbo, module_names): - """Return a list of modules - - :param dbo: dnf base object - :type dbo: dnf.Base - :param offset: Number of modules to skip - :type limit: int - :param limit: Maximum number of modules to return - :type limit: int - :returns: List of module information and total count - :rtype: tuple of a list of dicts and an Int - - Modules don't exist in RHEL7 so this only returns projects - and sets the type to "rpm" - - """ - # TODO - Figure out what to do with this for Fedora 'modules' - return list(map(proj_to_module, projects_info(dbo, module_names)))
      - -
      [docs]def modules_info(dbo, module_names): - """Return details about a module, including dependencies - - :param dbo: dnf base object - :type dbo: dnf.Base - :param module_names: Names of the modules to get info about - :type module_names: str - :returns: List of dicts with module details and dependencies. - :rtype: list of dicts - """ - modules = projects_info(dbo, module_names) - - # Add the dependency info to each one - for module in modules: - module["dependencies"] = projects_depsolve(dbo, [(module["name"], "*.*")], []) - - return modules
      - -
      [docs]def dnf_repo_to_file_repo(repo): - """Return a string representation of a DNF Repo object suitable for writing to a .repo file - - :param repo: DNF Repository - :type repo: dnf.RepoDict - :returns: A string - :rtype: str - - The DNF Repo.dump() function does not produce a string that can be used as a dnf .repo file, - it ouputs baseurl and gpgkey as python lists which DNF cannot read. So do this manually with - only the attributes we care about. - """ - repo_str = "[%s]\nname = %s\n" % (repo.id, repo.name) - if repo.metalink: - repo_str += "metalink = %s\n" % repo.metalink - elif repo.mirrorlist: - repo_str += "mirrorlist = %s\n" % repo.mirrorlist - elif repo.baseurl: - repo_str += "baseurl = %s\n" % repo.baseurl[0] - else: - raise RuntimeError("Repo has no baseurl, metalink, or mirrorlist") - - # proxy is optional - if repo.proxy: - repo_str += "proxy = %s\n" % repo.proxy - - repo_str += "sslverify = %s\n" % repo.sslverify - repo_str += "gpgcheck = %s\n" % repo.gpgcheck - if repo.gpgkey: - repo_str += "gpgkey = %s\n" % ",".join(repo.gpgkey) - - if repo.skip_if_unavailable: - repo_str += "skip_if_unavailable=1\n" - - return repo_str
      - -
      [docs]def repo_to_source(repo, system_source, api=1): - """Return a Weldr Source dict created from the DNF Repository - - :param repo: DNF Repository - :type repo: dnf.RepoDict - :param system_source: True if this source is an immutable system source - :type system_source: bool - :param api: Select which api version of the dict to return (default 1) - :type api: int - :returns: A dict with Weldr Source fields filled in - :rtype: dict - - Example:: - - { - "check_gpg": true, - "check_ssl": true, - "gpgkey_url": [ - "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-28-x86_64" - ], - "id": "fedora", - "name": "Fedora $releasever - $basearch", - "proxy": "http://proxy.brianlane.com:8123", - "system": true - "type": "yum-metalink", - "url": "https://mirrors.fedoraproject.org/metalink?repo=fedora-28&arch=x86_64" - } - - The ``name`` field has changed in v1 of the API. - In v0 of the API ``name`` is the repo.id, in v1 it is the repo.name and a new field, - ``id`` has been added for the repo.id - - """ - if api==0: - source = {"name": repo.id, "system": system_source} - else: - source = {"id": repo.id, "name": repo.name, "system": system_source} - if repo.baseurl: - source["url"] = repo.baseurl[0] - source["type"] = "yum-baseurl" - elif repo.metalink: - source["url"] = repo.metalink - source["type"] = "yum-metalink" - elif repo.mirrorlist: - source["url"] = repo.mirrorlist - source["type"] = "yum-mirrorlist" - else: - raise RuntimeError("Repo has no baseurl, metalink, or mirrorlist") - - # proxy is optional - if repo.proxy: - source["proxy"] = repo.proxy - - if not repo.sslverify: - source["check_ssl"] = False - else: - source["check_ssl"] = True - - if not repo.gpgcheck: - source["check_gpg"] = False - else: - source["check_gpg"] = True - - if repo.gpgkey: - source["gpgkey_urls"] = list(repo.gpgkey) - - return source
      - -
      [docs]def source_to_repodict(source): - """Return a tuple suitable for use with dnf.add_new_repo - - :param source: A Weldr source dict - :type source: dict - :returns: A tuple of dnf.Repo attributes - :rtype: (str, list, dict) - - Return a tuple with (id, baseurl|(), kwargs) that can be used - with dnf.repos.add_new_repo - """ - kwargs = {} - if "id" in source: - # This is an API v1 source definition - repoid = source["id"] - if "name" in source: - kwargs["name"] = source["name"] - else: - repoid = source["name"] - - # This will allow errors to be raised so we can catch them - # without this they are logged, but the repo is silently disabled - kwargs["skip_if_unavailable"] = False - - if source["type"] == "yum-baseurl": - baseurl = [source["url"]] - elif source["type"] == "yum-metalink": - kwargs["metalink"] = source["url"] - baseurl = () - elif source["type"] == "yum-mirrorlist": - kwargs["mirrorlist"] = source["url"] - baseurl = () - - if "proxy" in source: - kwargs["proxy"] = source["proxy"] - - if source["check_ssl"]: - kwargs["sslverify"] = True - else: - kwargs["sslverify"] = False - - if source["check_gpg"]: - kwargs["gpgcheck"] = True - else: - kwargs["gpgcheck"] = False - - if "gpgkey_urls" in source: - kwargs["gpgkey"] = tuple(source["gpgkey_urls"]) - - return (repoid, baseurl, kwargs)
      - - -
      [docs]def source_to_repo(source, dnf_conf): - """Return a dnf Repo object created from a source dict - - :param source: A Weldr source dict - :type source: dict - :param dnf_conf: The dnf Config object - :type dnf_conf: dnf.conf - :returns: A dnf Repo object - :rtype: dnf.Repo - - Example:: - - { - "check_gpg": True, - "check_ssl": True, - "gpgkey_urls": [ - "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-28-x86_64" - ], - "id": "fedora", - "name": "Fedora $releasever - $basearch", - "proxy": "http://proxy.brianlane.com:8123", - "system": True - "type": "yum-metalink", - "url": "https://mirrors.fedoraproject.org/metalink?repo=fedora-28&arch=x86_64" - } - - If the ``id`` field is included it is used for the repo id, otherwise ``name`` is used. - v0 of the API only used ``name``, v1 added the distinction between ``id`` and ``name``. - """ - repoid, baseurl, kwargs = source_to_repodict(source) - repo = dnf.repo.Repo(repoid, dnf_conf) - if baseurl: - repo.baseurl = baseurl - - # Apply the rest of the kwargs to the Repo object - for k, v in kwargs.items(): - setattr(repo, k, v) - - repo.enable() - - return repo
      - -
      [docs]def get_source_ids(source_path): - """Return a list of the source ids in a file - - :param source_path: Full path and filename of the source (yum repo) file - :type source_path: str - :returns: A list of source id strings - :rtype: list of str - """ - if not os.path.exists(source_path): - return [] - - cfg = ConfigParser() - cfg.read(source_path) - return cfg.sections()
      - -
      [docs]def get_repo_sources(source_glob): - """Return a list of sources from a directory of yum repositories - - :param source_glob: A glob to use to match the source files, including full path - :type source_glob: str - :returns: A list of the source ids in all of the matching files - :rtype: list of str - """ - sources = [] - for f in glob(source_glob): - sources.extend(get_source_ids(f)) - return sources
      - -
      [docs]def delete_repo_source(source_glob, source_id): - """Delete a source from a repo file - - :param source_glob: A glob of the repo sources to search - :type source_glob: str - :param source_id: The repo id to delete - :type source_id: str - :returns: None - :raises: ProjectsError if there was a problem - - A repo file may have multiple sources in it, delete only the selected source. - If it is the last one in the file, delete the file. - - WARNING: This will delete ANY source, the caller needs to ensure that a system - source_id isn't passed to it. - """ - found = False - for f in glob(source_glob): - try: - cfg = ConfigParser() - cfg.read(f) - if source_id in cfg.sections(): - found = True - cfg.remove_section(source_id) - # If there are other sections, rewrite the file without the deleted one - if len(cfg.sections()) > 0: - with open(f, "w") as cfg_file: - cfg.write(cfg_file) - else: - # No sections left, just delete the file - os.unlink(f) - except Exception as e: - raise ProjectsError("Problem deleting repo source %s: %s" % (source_id, str(e))) - if not found: - raise ProjectsError("source %s not found" % source_id)
      - -
      [docs]def new_repo_source(dbo, repoid, source, repo_dir): - """Add a new repo source from a Weldr source dict - - :param dbo: dnf base object - :type dbo: dnf.Base - :param id: The repo id (API v0 uses the name, v1 uses the id) - :type id: str - :param source: A Weldr source dict - :type source: dict - :returns: None - :raises: ... - - Make sure access to the dbo has been locked before calling this. - The `id` parameter will the the 'name' field for API v0, and the 'id' field for API v1 - - DNF variables will be substituted at load time, and on restart. - """ - try: - # Remove it from the RepoDict (NOTE that this isn't explicitly supported by the DNF API) - # If this repo already exists, delete it and replace it with the new one - repos = list(r.id for r in dbo.repos.iter_enabled()) - if repoid in repos: - del dbo.repos[repoid] - - # Add the repo and substitute any dnf variables - _, baseurl, kwargs = source_to_repodict(source) - log.debug("repoid=%s, baseurl=%s, kwargs=%s", repoid, baseurl, kwargs) - r = dbo.repos.add_new_repo(repoid, dbo.conf, baseurl, **kwargs) - r.enable() - - log.info("Updating repository metadata after adding %s", repoid) - dbo.fill_sack(load_system_repo=False) - dbo.read_comps() - - # Remove any previous sources with this id, ignore it if it isn't found - try: - delete_repo_source(joinpaths(repo_dir, "*.repo"), repoid) - except ProjectsError: - pass - - # Make sure the source id can't contain a path traversal by taking the basename - source_path = joinpaths(repo_dir, os.path.basename("%s.repo" % repoid)) - # Write the un-substituted version of the repo to disk - with open(source_path, "w") as f: - repo = source_to_repo(source, dbo.conf) - f.write(dnf_repo_to_file_repo(repo)) - except Exception as e: - log.error("(new_repo_source) adding %s failed: %s", repoid, str(e)) - - # Cleanup the mess, if loading it failed we don't want to leave it in memory - repos = list(r.id for r in dbo.repos.iter_enabled()) - if repoid in repos: - del dbo.repos[repoid] - - log.info("Updating repository metadata after adding %s failed", repoid) - dbo.fill_sack(load_system_repo=False) - dbo.read_comps() - - raise
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/queue.html b/docs/html/_modules/pylorax/api/queue.html deleted file mode 100644 index 63471094..00000000 --- a/docs/html/_modules/pylorax/api/queue.html +++ /dev/null @@ -1,1063 +0,0 @@ - - - - - - - - - - - pylorax.api.queue — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.queue

      -# Copyright (C) 2018 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -""" Functions to monitor compose queue and run anaconda"""
      -import logging
      -log = logging.getLogger("pylorax")
      -program_log = logging.getLogger("program")
      -dnf_log = logging.getLogger("dnf")
      -
      -import os
      -import grp
      -from glob import glob
      -import multiprocessing as mp
      -import pwd
      -import shutil
      -import subprocess
      -from subprocess import Popen, PIPE
      -import time
      -
      -from pylorax import find_templates
      -from pylorax.api.compose import move_compose_results
      -from pylorax.api.recipes import recipe_from_file
      -from pylorax.api.timestamp import TS_CREATED, TS_STARTED, TS_FINISHED, write_timestamp, timestamp_dict
      -import pylorax.api.toml as toml
      -from pylorax.base import DataHolder
      -from pylorax.creator import run_creator
      -from pylorax.sysutils import joinpaths, read_tail
      -
      -from lifted.queue import create_upload, get_uploads, ready_upload, delete_upload
      -
      -
      [docs]def check_queues(cfg): - """Check to make sure the new and run queue symlinks are correct - - :param cfg: Configuration settings - :type cfg: DataHolder - - Also check all of the existing results and make sure any with WAITING - set in STATUS have a symlink in queue/new/ - """ - # Remove broken symlinks from the new and run queues - queue_symlinks = glob(joinpaths(cfg.composer_dir, "queue/new/*")) + \ - glob(joinpaths(cfg.composer_dir, "queue/run/*")) - for link in queue_symlinks: - if not os.path.isdir(os.path.realpath(link)): - log.info("Removing broken symlink %s", link) - os.unlink(link) - - # Write FAILED to the STATUS of any run queue symlinks and remove them - for link in glob(joinpaths(cfg.composer_dir, "queue/run/*")): - log.info("Setting build %s to FAILED, and removing symlink from queue/run/", os.path.basename(link)) - open(joinpaths(link, "STATUS"), "w").write("FAILED\n") - os.unlink(link) - - # Check results STATUS messages - # - If STATUS is missing, set it to FAILED - # - RUNNING should be changed to FAILED - # - WAITING should have a symlink in the new queue - for link in glob(joinpaths(cfg.composer_dir, "results/*")): - if not os.path.exists(joinpaths(link, "STATUS")): - open(joinpaths(link, "STATUS"), "w").write("FAILED\n") - continue - - status = open(joinpaths(link, "STATUS")).read().strip() - if status == "RUNNING": - log.info("Setting build %s to FAILED", os.path.basename(link)) - open(joinpaths(link, "STATUS"), "w").write("FAILED\n") - elif status == "WAITING": - if not os.path.islink(joinpaths(cfg.composer_dir, "queue/new/", os.path.basename(link))): - log.info("Creating missing symlink to new build %s", os.path.basename(link)) - os.symlink(link, joinpaths(cfg.composer_dir, "queue/new/", os.path.basename(link)))
      - -
      [docs]def start_queue_monitor(cfg, uid, gid): - """Start the queue monitor as a mp process - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uid: User ID that owns the queue - :type uid: int - :param gid: Group ID that owns the queue - :type gid: int - :returns: None - """ - lib_dir = cfg.get("composer", "lib_dir") - share_dir = cfg.get("composer", "share_dir") - tmp = cfg.get("composer", "tmp") - monitor_cfg = DataHolder(cfg=cfg, composer_dir=lib_dir, share_dir=share_dir, uid=uid, gid=gid, tmp=tmp) - p = mp.Process(target=monitor, args=(monitor_cfg,)) - p.daemon = True - p.start()
      - -
      [docs]def monitor(cfg): - """Monitor the queue for new compose requests - - :param cfg: Configuration settings - :type cfg: DataHolder - :returns: Does not return - - The queue has 2 subdirectories, new and run. When a compose is ready to be run - a symlink to the uniquely named results directory should be placed in ./queue/new/ - - When the it is ready to be run (it is checked every 30 seconds or after a previous - compose is finished) the symlink will be moved into ./queue/run/ and a STATUS file - will be created in the results directory. - - STATUS can contain one of: WAITING, RUNNING, FINISHED, FAILED - - If the system is restarted while a compose is running it will move any old symlinks - from ./queue/run/ to ./queue/new/ and rerun them. - """ - def queue_sort(uuid): - """Sort the queue entries by their mtime, not their names""" - return os.stat(joinpaths(cfg.composer_dir, "queue/new", uuid)).st_mtime - - check_queues(cfg) - while True: - uuids = sorted(os.listdir(joinpaths(cfg.composer_dir, "queue/new")), key=queue_sort) - - # Pick the oldest and move it into ./run/ - if not uuids: - # No composes left to process, sleep for a bit - time.sleep(5) - else: - src = joinpaths(cfg.composer_dir, "queue/new", uuids[0]) - dst = joinpaths(cfg.composer_dir, "queue/run", uuids[0]) - try: - os.rename(src, dst) - except OSError: - # The symlink may vanish if uuid_cancel() has been called - continue - - # The anaconda logs are also copied into ./anaconda/ in this directory - os.makedirs(joinpaths(dst, "logs"), exist_ok=True) - - def open_handler(loggers, file_name): - handler = logging.FileHandler(joinpaths(dst, "logs", file_name)) - handler.setLevel(logging.DEBUG) - handler.setFormatter(logging.Formatter("%(asctime)s %(levelname)s: %(message)s")) - for logger in loggers: - logger.addHandler(handler) - return (handler, loggers) - - loggers = (((log, program_log, dnf_log), "combined.log"), - ((log,), "composer.log"), - ((program_log,), "program.log"), - ((dnf_log,), "dnf.log")) - handlers = [open_handler(loggers, file_name) for loggers, file_name in loggers] - - log.info("Starting new compose: %s", dst) - open(joinpaths(dst, "STATUS"), "w").write("RUNNING\n") - - try: - make_compose(cfg, os.path.realpath(dst)) - log.info("Finished building %s, results are in %s", dst, os.path.realpath(dst)) - open(joinpaths(dst, "STATUS"), "w").write("FINISHED\n") - write_timestamp(dst, TS_FINISHED) - - upload_cfg = cfg.cfg["upload"] - for upload in get_uploads(upload_cfg, uuid_get_uploads(cfg.cfg, uuids[0])): - log.info("Readying upload %s", upload.uuid) - uuid_ready_upload(cfg.cfg, uuids[0], upload.uuid) - except Exception: - import traceback - log.error("traceback: %s", traceback.format_exc()) - -# TODO - Write the error message to an ERROR-LOG file to include with the status -# log.error("Error running compose: %s", e) - open(joinpaths(dst, "STATUS"), "w").write("FAILED\n") - write_timestamp(dst, TS_FINISHED) - finally: - for handler, loggers in handlers: - for logger in loggers: - logger.removeHandler(handler) - handler.close() - - os.unlink(dst)
      - -
      [docs]def make_compose(cfg, results_dir): - """Run anaconda with the final-kickstart.ks from results_dir - - :param cfg: Configuration settings - :type cfg: DataHolder - :param results_dir: The directory containing the metadata and results for the build - :type results_dir: str - :returns: Nothing - :raises: May raise various exceptions - - This takes the final-kickstart.ks, and the settings in config.toml and runs Anaconda - in no-virt mode (directly on the host operating system). Exceptions should be caught - at the higer level. - - If there is a failure, the build artifacts will be cleaned up, and any logs will be - moved into logs/anaconda/ and their ownership will be set to the user from the cfg - object. - """ - - # Check on the ks's presence - ks_path = joinpaths(results_dir, "final-kickstart.ks") - if not os.path.exists(ks_path): - raise RuntimeError("Missing kickstart file at %s" % ks_path) - - # Load the compose configuration - cfg_path = joinpaths(results_dir, "config.toml") - if not os.path.exists(cfg_path): - raise RuntimeError("Missing config.toml for %s" % results_dir) - cfg_dict = toml.loads(open(cfg_path, "r").read()) - - # The keys in cfg_dict correspond to the arguments setup in livemedia-creator - # keys that define what to build should be setup in compose_args, and keys with - # defaults should be setup here. - - # Make sure that image_name contains no path components - cfg_dict["image_name"] = os.path.basename(cfg_dict["image_name"]) - - # Only support novirt installation, set some other defaults - cfg_dict["no_virt"] = True - cfg_dict["disk_image"] = None - cfg_dict["fs_image"] = None - cfg_dict["keep_image"] = False - cfg_dict["domacboot"] = False - cfg_dict["anaconda_args"] = "" - cfg_dict["proxy"] = "" - cfg_dict["armplatform"] = "" - cfg_dict["squashfs_args"] = None - - cfg_dict["lorax_templates"] = find_templates(cfg.share_dir) - cfg_dict["tmp"] = cfg.tmp - # Use default args for dracut - cfg_dict["dracut_conf"] = None - cfg_dict["dracut_args"] = None - - # TODO How to support other arches? - cfg_dict["arch"] = None - - # Compose things in a temporary directory inside the results directory - cfg_dict["result_dir"] = joinpaths(results_dir, "compose") - os.makedirs(cfg_dict["result_dir"]) - - install_cfg = DataHolder(**cfg_dict) - - # Some kludges for the 99-copy-logs %post, failure in it will crash the build - for f in ["/tmp/NOSAVE_INPUT_KS", "/tmp/NOSAVE_LOGS"]: - open(f, "w") - - # Placing a CANCEL file in the results directory will make execWithRedirect send anaconda a SIGTERM - def cancel_build(): - return os.path.exists(joinpaths(results_dir, "CANCEL")) - - log.debug("cfg = %s", install_cfg) - try: - test_path = joinpaths(results_dir, "TEST") - write_timestamp(results_dir, TS_STARTED) - if os.path.exists(test_path): - # Pretend to run the compose - time.sleep(5) - try: - test_mode = int(open(test_path, "r").read()) - except Exception: - test_mode = 1 - if test_mode == 1: - raise RuntimeError("TESTING FAILED compose") - else: - open(joinpaths(results_dir, install_cfg.image_name), "w").write("TEST IMAGE") - else: - run_creator(install_cfg, cancel_func=cancel_build) - - # Extract the results of the compose into results_dir and cleanup the compose directory - move_compose_results(install_cfg, results_dir) - finally: - # Make sure any remaining temporary directories are removed (eg. if there was an exception) - for d in glob(joinpaths(cfg.tmp, "lmc-*")): - if os.path.isdir(d): - shutil.rmtree(d) - elif os.path.isfile(d): - os.unlink(d) - - # Make sure that everything under the results directory is owned by the user - user = pwd.getpwuid(cfg.uid).pw_name - group = grp.getgrgid(cfg.gid).gr_name - log.debug("Install finished, chowning results to %s:%s", user, group) - subprocess.call(["chown", "-R", "%s:%s" % (user, group), results_dir])
      - -
      [docs]def get_compose_type(results_dir): - """Return the type of composition. - - :param results_dir: The directory containing the metadata and results for the build - :type results_dir: str - :returns: The type of compose (eg. 'tar') - :rtype: str - :raises: RuntimeError if no kickstart template can be found. - """ - # Should only be 2 kickstarts, the final-kickstart.ks and the template - t = [os.path.basename(ks)[:-3] for ks in glob(joinpaths(results_dir, "*.ks")) - if "final-kickstart" not in ks] - if len(t) != 1: - raise RuntimeError("Cannot find ks template for build %s" % os.path.basename(results_dir)) - return t[0]
      - -
      [docs]def compose_detail(cfg, results_dir, api=1): - """Return details about the build. - - :param cfg: Configuration settings (required for api=1) - :type cfg: ComposerConfig - :param results_dir: The directory containing the metadata and results for the build - :type results_dir: str - :param api: Select which api version of the dict to return (default 1) - :type api: int - :returns: A dictionary with details about the compose - :rtype: dict - :raises: IOError if it cannot read the directory, STATUS, or blueprint file. - - The following details are included in the dict: - - * id - The uuid of the comoposition - * queue_status - The final status of the composition (FINISHED or FAILED) - * compose_type - The type of output generated (tar, iso, etc.) - * blueprint - Blueprint name - * version - Blueprint version - * image_size - Size of the image, if finished. 0 otherwise. - * uploads - For API v1 details about uploading the image are included - - Various timestamps are also included in the dict. These are all Unix UTC timestamps. - It is possible for these timestamps to not always exist, in which case they will be - None in Python (or null in JSON). The following timestamps are included: - - * job_created - When the user submitted the compose - * job_started - Anaconda started running - * job_finished - Job entered FINISHED or FAILED state - """ - build_id = os.path.basename(os.path.abspath(results_dir)) - status = open(joinpaths(results_dir, "STATUS")).read().strip() - blueprint = recipe_from_file(joinpaths(results_dir, "blueprint.toml")) - - compose_type = get_compose_type(results_dir) - - image_path = get_image_name(results_dir)[1] - if status == "FINISHED" and os.path.exists(image_path): - image_size = os.stat(image_path).st_size - else: - image_size = 0 - - times = timestamp_dict(results_dir) - - detail = {"id": build_id, - "queue_status": status, - "job_created": times.get(TS_CREATED), - "job_started": times.get(TS_STARTED), - "job_finished": times.get(TS_FINISHED), - "compose_type": compose_type, - "blueprint": blueprint["name"], - "version": blueprint["version"], - "image_size": image_size, - } - - if api == 1: - # Get uploads for this build_id - upload_uuids = uuid_get_uploads(cfg, build_id) - summaries = [upload.summary() for upload in get_uploads(cfg["upload"], upload_uuids)] - detail["uploads"] = summaries - return detail
      - -
      [docs]def queue_status(cfg, api=1): - """Return details about what is in the queue. - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param api: Select which api version of the dict to return (default 1) - :type api: int - :returns: A list of the new composes, and a list of the running composes - :rtype: dict - - This returns a dict with 2 lists. "new" is the list of uuids that are waiting to be built, - and "run" has the uuids that are being built (currently limited to 1 at a time). - """ - queue_dir = joinpaths(cfg.get("composer", "lib_dir"), "queue") - new_queue = [os.path.realpath(p) for p in glob(joinpaths(queue_dir, "new/*"))] - run_queue = [os.path.realpath(p) for p in glob(joinpaths(queue_dir, "run/*"))] - - new_details = [] - for n in new_queue: - try: - d = compose_detail(cfg, n, api) - except IOError: - continue - new_details.append(d) - - run_details = [] - for r in run_queue: - try: - d = compose_detail(cfg, r, api) - except IOError: - continue - run_details.append(d) - - return { - "new": new_details, - "run": run_details - }
      - -
      [docs]def uuid_status(cfg, uuid, api=1): - """Return the details of a specific UUID compose - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uuid: The UUID of the build - :type uuid: str - :param api: Select which api version of the dict to return (default 1) - :type api: int - :returns: Details about the build - :rtype: dict or None - - Returns the same dict as `compose_detail()` - """ - uuid_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid) - try: - return compose_detail(cfg, uuid_dir, api) - except IOError: - return None
      - -
      [docs]def build_status(cfg, status_filter=None, api=1): - """Return the details of finished or failed builds - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param status_filter: What builds to return. None == all, "FINISHED", or "FAILED" - :type status_filter: str - :param api: Select which api version of the dict to return (default 1) - :type api: int - :returns: A list of the build details (from compose_detail) - :rtype: list of dicts - - This returns a list of build details for each of the matching builds on the - system. It does not return the status of builds that have not been finished. - Use queue_status() for those. - """ - if status_filter: - status_filter = [status_filter] - else: - status_filter = ["FINISHED", "FAILED"] - - results = [] - result_dir = joinpaths(cfg.get("composer", "lib_dir"), "results") - for build in glob(result_dir + "/*"): - log.debug("Checking status of build %s", build) - - try: - status = open(joinpaths(build, "STATUS"), "r").read().strip() - if status in status_filter: - results.append(compose_detail(cfg, build, api)) - except IOError: - pass - return results
      - -def _upload_list_path(cfg, uuid): - """Return the path to the UPLOADS file - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uuid: The UUID of the build - :type uuid: str - :returns: Path to the UPLOADS file listing the build's associated uploads - :rtype: str - :raises: RuntimeError if the uuid is not found - """ - results_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid) - if not os.path.isdir(results_dir): - raise RuntimeError(f'"{uuid}" is not a valid build uuid!') - return joinpaths(results_dir, "UPLOADS") - -
      [docs]def uuid_schedule_upload(cfg, uuid, provider_name, image_name, settings): - """Schedule an upload of an image - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uuid: The UUID of the build - :type uuid: str - :param provider_name: The name of the cloud provider, e.g. "azure" - :type provider_name: str - :param image_name: Path of the image to upload - :type image_name: str - :param settings: Settings to use for the selected provider - :type settings: dict - :returns: uuid of the upload - :rtype: str - :raises: RuntimeError if the uuid is not a valid build uuid - """ - status = uuid_status(cfg, uuid) - if status is None: - raise RuntimeError(f'"{uuid}" is not a valid build uuid!') - - upload = create_upload(cfg["upload"], provider_name, image_name, settings) - uuid_add_upload(cfg, uuid, upload.uuid) - return upload.uuid
      - -
      [docs]def uuid_get_uploads(cfg, uuid): - """Return the list of uploads for a build uuid - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uuid: The UUID of the build - :type uuid: str - :returns: The upload UUIDs associated with the build UUID - :rtype: frozenset - """ - try: - with open(_upload_list_path(cfg, uuid)) as uploads_file: - return frozenset(uploads_file.read().split()) - except FileNotFoundError: - return frozenset()
      - -
      [docs]def uuid_add_upload(cfg, uuid, upload_uuid): - """Add an upload UUID to a build - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uuid: The UUID of the build - :type uuid: str - :param upload_uuid: The UUID of the upload - :type upload_uuid: str - :returns: None - :rtype: None - """ - if upload_uuid not in uuid_get_uploads(cfg, uuid): - with open(_upload_list_path(cfg, uuid), "a") as uploads_file: - print(upload_uuid, file=uploads_file) - status = uuid_status(cfg, uuid) - if status and status["queue_status"] == "FINISHED": - uuid_ready_upload(cfg, uuid, upload_uuid)
      - -
      [docs]def uuid_remove_upload(cfg, upload_uuid): - """Remove an upload UUID from the build - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param upload_uuid: The UUID of the upload - :type upload_uuid: str - :returns: None - :rtype: None - :raises: RuntimeError if the upload_uuid is not found - """ - for build_uuid in (os.path.basename(b) for b in glob(joinpaths(cfg.get("composer", "lib_dir"), "results/*"))): - uploads = uuid_get_uploads(cfg, build_uuid) - if upload_uuid not in uploads: - continue - - uploads = uploads - frozenset((upload_uuid,)) - with open(_upload_list_path(cfg, build_uuid), "w") as uploads_file: - for upload in uploads: - print(upload, file=uploads_file) - return - - raise RuntimeError(f"{upload_uuid} is not a valid upload id!")
      - -
      [docs]def uuid_ready_upload(cfg, uuid, upload_uuid): - """Set an upload to READY if the build is in FINISHED state - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uuid: The UUID of the build - :type uuid: str - :param upload_uuid: The UUID of the upload - :type upload_uuid: str - :returns: None - :rtype: None - :raises: RuntimeError if the build uuid is invalid or not in FINISHED state. - """ - status = uuid_status(cfg, uuid) - if not status: - raise RuntimeError(f"{uuid} is not a valid build id!") - if status["queue_status"] != "FINISHED": - raise RuntimeError(f"Build {uuid} is not finished!") - _, image_path = uuid_image(cfg, uuid) - ready_upload(cfg["upload"], upload_uuid, image_path)
      - -
      [docs]def uuid_cancel(cfg, uuid): - """Cancel a build and delete its results - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uuid: The UUID of the build - :type uuid: str - :returns: True if it was canceled and deleted - :rtype: bool - - Only call this if the build status is WAITING or RUNNING - """ - cancel_path = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid, "CANCEL") - if os.path.exists(cancel_path): - log.info("Cancel has already been requested for %s", uuid) - return False - - # This status can change (and probably will) while it is in the middle of doing this: - # It can move from WAITING -> RUNNING or it can move from RUNNING -> FINISHED|FAILED - - # If it is in WAITING remove the symlink and then check to make sure it didn't show up - # in the run queue - queue_dir = joinpaths(cfg.get("composer", "lib_dir"), "queue") - uuid_new = joinpaths(queue_dir, "new", uuid) - if os.path.exists(uuid_new): - try: - os.unlink(uuid_new) - except OSError: - # The symlink may vanish if the queue monitor started the build - pass - uuid_run = joinpaths(queue_dir, "run", uuid) - if not os.path.exists(uuid_run): - # Make sure the build is still in the waiting state - status = uuid_status(cfg, uuid) - if status is None or status["queue_status"] == "WAITING": - # Successfully removed it before the build started - return uuid_delete(cfg, uuid) - - # At this point the build has probably started. Write to the CANCEL file. - open(cancel_path, "w").write("\n") - - # Wait for status to move to FAILED or FINISHED - started = time.time() - while True: - status = uuid_status(cfg, uuid) - if status is None or status["queue_status"] == "FAILED": - break - elif status is not None and status["queue_status"] == "FINISHED": - # The build finished successfully, no point in deleting it now - return False - - # Is this taking too long? Exit anyway and try to cleanup. - if time.time() > started + (10 * 60): - log.error("Failed to cancel the build of %s", uuid) - break - - time.sleep(5) - - # Remove the partial results - uuid_delete(cfg, uuid)
      - -
      [docs]def uuid_delete(cfg, uuid): - """Delete all of the results from a compose - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uuid: The UUID of the build - :type uuid: str - :returns: True if it was deleted - :rtype: bool - :raises: This will raise an error if the delete failed - """ - uuid_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid) - if not uuid_dir or len(uuid_dir) < 10: - raise RuntimeError("Directory length is too short: %s" % uuid_dir) - - for upload in get_uploads(cfg["upload"], uuid_get_uploads(cfg, uuid)): - delete_upload(cfg["upload"], upload.uuid) - - shutil.rmtree(uuid_dir) - return True
      - -
      [docs]def uuid_info(cfg, uuid, api=1): - """Return information about the composition - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uuid: The UUID of the build - :type uuid: str - :returns: dictionary of information about the composition or None - :rtype: dict - :raises: RuntimeError if there was a problem - - This will return a dict with the following fields populated: - - * id - The uuid of the comoposition - * config - containing the configuration settings used to run Anaconda - * blueprint - The depsolved blueprint used to generate the kickstart - * commit - The (local) git commit hash for the blueprint used - * deps - The NEVRA of all of the dependencies used in the composition - * compose_type - The type of output generated (tar, iso, etc.) - * queue_status - The final status of the composition (FINISHED or FAILED) - """ - uuid_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid) - if not os.path.exists(uuid_dir): - return None - - # Load the compose configuration - cfg_path = joinpaths(uuid_dir, "config.toml") - if not os.path.exists(cfg_path): - raise RuntimeError("Missing config.toml for %s" % uuid) - cfg_dict = toml.loads(open(cfg_path, "r").read()) - - frozen_path = joinpaths(uuid_dir, "frozen.toml") - if not os.path.exists(frozen_path): - raise RuntimeError("Missing frozen.toml for %s" % uuid) - frozen_dict = toml.loads(open(frozen_path, "r").read()) - - deps_path = joinpaths(uuid_dir, "deps.toml") - if not os.path.exists(deps_path): - raise RuntimeError("Missing deps.toml for %s" % uuid) - deps_dict = toml.loads(open(deps_path, "r").read()) - - details = compose_detail(cfg, uuid_dir, api) - - commit_path = joinpaths(uuid_dir, "COMMIT") - if not os.path.exists(commit_path): - raise RuntimeError("Missing commit hash for %s" % uuid) - commit_id = open(commit_path, "r").read().strip() - - info = {"id": uuid, - "config": cfg_dict, - "blueprint": frozen_dict, - "commit": commit_id, - "deps": deps_dict, - "compose_type": details["compose_type"], - "queue_status": details["queue_status"], - "image_size": details["image_size"], - } - if api == 1: - upload_uuids = uuid_get_uploads(cfg, uuid) - summaries = [upload.summary() for upload in get_uploads(cfg["upload"], upload_uuids)] - info["uploads"] = summaries - return info
      - -
      [docs]def uuid_tar(cfg, uuid, metadata=False, image=False, logs=False): - """Return a tar of the build data - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uuid: The UUID of the build - :type uuid: str - :param metadata: Set to true to include all the metadata needed to reproduce the build - :type metadata: bool - :param image: Set to true to include the output image - :type image: bool - :param logs: Set to true to include the logs from the build - :type logs: bool - :returns: A stream of bytes from tar - :rtype: A generator - :raises: RuntimeError if there was a problem (eg. missing config file) - - This yields an uncompressed tar's data to the caller. It includes - the selected data to the caller by returning the Popen stdout from the tar process. - """ - uuid_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid) - if not os.path.exists(uuid_dir): - raise RuntimeError("%s is not a valid build_id" % uuid) - - # Load the compose configuration - cfg_path = joinpaths(uuid_dir, "config.toml") - if not os.path.exists(cfg_path): - raise RuntimeError("Missing config.toml for %s" % uuid) - cfg_dict = toml.loads(open(cfg_path, "r").read()) - image_name = cfg_dict["image_name"] - - def include_file(f): - if f.endswith("/logs"): - return logs - if f.endswith(image_name): - return image - return metadata - filenames = [os.path.basename(f) for f in glob(joinpaths(uuid_dir, "*")) if include_file(f)] - - tar = Popen(["tar", "-C", uuid_dir, "-cf-"] + filenames, stdout=PIPE) - return tar.stdout
      - -
      [docs]def uuid_image(cfg, uuid): - """Return the filename and full path of the build's image file - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uuid: The UUID of the build - :type uuid: str - :returns: The image filename and full path - :rtype: tuple of strings - :raises: RuntimeError if there was a problem (eg. invalid uuid, missing config file) - """ - uuid_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid) - return get_image_name(uuid_dir)
      - -
      [docs]def get_image_name(uuid_dir): - """Return the filename and full path of the build's image file - - :param uuid: The UUID of the build - :type uuid: str - :returns: The image filename and full path - :rtype: tuple of strings - :raises: RuntimeError if there was a problem (eg. invalid uuid, missing config file) - """ - uuid = os.path.basename(os.path.abspath(uuid_dir)) - if not os.path.exists(uuid_dir): - raise RuntimeError("%s is not a valid build_id" % uuid) - - # Load the compose configuration - cfg_path = joinpaths(uuid_dir, "config.toml") - if not os.path.exists(cfg_path): - raise RuntimeError("Missing config.toml for %s" % uuid) - cfg_dict = toml.loads(open(cfg_path, "r").read()) - image_name = cfg_dict["image_name"] - - return (image_name, joinpaths(uuid_dir, image_name))
      - -
      [docs]def uuid_log(cfg, uuid, size=1024): - """Return `size` KiB from the end of the most currently relevant log for a - given compose - - :param cfg: Configuration settings - :type cfg: ComposerConfig - :param uuid: The UUID of the build - :type uuid: str - :param size: Number of KiB to read. Default is 1024 - :type size: int - :returns: Up to `size` KiB from the end of the log - :rtype: str - :raises: RuntimeError if there was a problem (eg. no log file available) - - This function will return the end of either the anaconda log, the packaging - log, or the combined composer logs, depending on the progress of the - compose. It tries to return lines from the end of the log, it will attempt - to start on a line boundary, and it may return less than `size` kbytes. - """ - uuid_dir = joinpaths(cfg.get("composer", "lib_dir"), "results", uuid) - if not os.path.exists(uuid_dir): - raise RuntimeError("%s is not a valid build_id" % uuid) - - # While a build is running the logs will be in /tmp/anaconda.log and when it - # has finished they will be in the results directory - status = uuid_status(cfg, uuid) - if status is None: - raise RuntimeError("Status is missing for %s" % uuid) - - def get_log_path(): - # Try to return the most relevant log at any given time during the - # compose. If the compose is not running, return the composer log. - anaconda_log = "/tmp/anaconda.log" - packaging_log = "/tmp/packaging.log" - combined_log = joinpaths(uuid_dir, "logs", "combined.log") - if status["queue_status"] != "RUNNING" or not os.path.isfile(anaconda_log): - return combined_log - if not os.path.isfile(packaging_log): - return anaconda_log - try: - anaconda_mtime = os.stat(anaconda_log).st_mtime - packaging_mtime = os.stat(packaging_log).st_mtime - # If the packaging log exists and its last message is at least 15 - # seconds newer than the anaconda log, return the packaging log. - if packaging_mtime > anaconda_mtime + 15: - return packaging_log - return anaconda_log - except OSError: - # Return the combined log if anaconda_log or packaging_log disappear - return combined_log - try: - tail = read_tail(get_log_path(), size) - except OSError as e: - raise RuntimeError("No log available.") from e - return tail
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/recipes.html b/docs/html/_modules/pylorax/api/recipes.html deleted file mode 100644 index cdd543fd..00000000 --- a/docs/html/_modules/pylorax/api/recipes.html +++ /dev/null @@ -1,1476 +0,0 @@ - - - - - - - - - - - pylorax.api.recipes — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.recipes

      -#
      -# Copyright (C) 2017-2019  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -
      -import gi
      -gi.require_version("Ggit", "1.0")
      -from gi.repository import Ggit as Git
      -from gi.repository import Gio
      -from gi.repository import GLib
      -
      -import os
      -import semantic_version as semver
      -
      -from pylorax.api.projects import dep_evra
      -from pylorax.base import DataHolder
      -from pylorax.sysutils import joinpaths
      -import pylorax.api.toml as toml
      -
      -
      -
      [docs]class CommitTimeValError(Exception): - pass
      - -
      [docs]class RecipeFileError(Exception): - pass
      - -
      [docs]class RecipeError(Exception): - pass
      - - -
      [docs]class Recipe(dict): - """A Recipe of package and modules - - This is a subclass of dict that enforces the constructor arguments - and adds a .filename property to return the recipe's filename, - and a .toml() function to return the recipe as a TOML string. - """ - def __init__(self, name, description, version, modules, packages, groups, customizations=None, gitrepos=None): - # Check that version is empty or semver compatible - if version: - semver.Version(version) - - # Make sure modules, packages, and groups are listed by their case-insensitive names - if modules is not None: - modules = sorted(modules, key=lambda m: m["name"].lower()) - if packages is not None: - packages = sorted(packages, key=lambda p: p["name"].lower()) - if groups is not None: - groups = sorted(groups, key=lambda g: g["name"].lower()) - - # Only support [[repos.git]] for now - if gitrepos is not None: - repos = {"git": sorted(gitrepos, key=lambda g: g["repo"].lower())} - else: - repos = None - dict.__init__(self, name=name, - description=description, - version=version, - modules=modules, - packages=packages, - groups=groups, - customizations=customizations, - repos=repos) - - # We don't want customizations=None to show up in the TOML so remove it - if customizations is None: - del self["customizations"] - - # Don't include empty repos or repos.git - if repos is None or not repos["git"]: - del self["repos"] - - @property - def package_names(self): - """Return the names of the packages""" - return [p["name"] for p in self["packages"] or []] - - @property - def package_nver(self): - """Return the names and version globs of the packages""" - return [(p["name"], p["version"]) for p in self["packages"] or []] - - @property - def module_names(self): - """Return the names of the modules""" - return [m["name"] for m in self["modules"] or []] - - @property - def module_nver(self): - """Return the names and version globs of the modules""" - return [(m["name"], m["version"]) for m in self["modules"] or []] - - @property - def group_names(self): - """Return the names of the groups. Groups do not have versions.""" - return map(lambda g: g["name"], self["groups"] or []) - - @property - def filename(self): - """Return the Recipe's filename - - Replaces spaces in the name with '-' and appends .toml - """ - return recipe_filename(self.get("name")) - -
      [docs] def toml(self): - """Return the Recipe in TOML format""" - return toml.dumps(self)
      - -
      [docs] def bump_version(self, old_version=None): - """semver recipe version number bump - - :param old_version: An optional old version number - :type old_version: str - :returns: The new version number or None - :rtype: str - :raises: ValueError - - If neither have a version, 0.0.1 is returned - If there is no old version the new version is checked and returned - If there is no new version, but there is a old one, bump its patch level - If the old and new versions are the same, bump the patch level - If they are different, check and return the new version - """ - new_version = self.get("version") - if not new_version and not old_version: - self["version"] = "0.0.1" - - elif new_version and not old_version: - semver.Version(new_version) - self["version"] = new_version - - elif not new_version or new_version == old_version: - new_version = str(semver.Version(old_version).next_patch()) - self["version"] = new_version - - else: - semver.Version(new_version) - self["version"] = new_version - - # Return the new version - return str(semver.Version(self["version"]))
      - -
      [docs] def freeze(self, deps): - """ Return a new Recipe with full module and package NEVRA - - :param deps: A list of dependency NEVRA to use to fill in the modules and packages - :type deps: list( - :returns: A new Recipe object - :rtype: Recipe - """ - module_names = self.module_names - package_names = self.package_names - group_names = self.group_names - - new_modules = [] - new_packages = [] - new_groups = [] - for dep in deps: - if dep["name"] in package_names: - new_packages.append(RecipePackage(dep["name"], dep_evra(dep))) - elif dep["name"] in module_names: - new_modules.append(RecipeModule(dep["name"], dep_evra(dep))) - elif dep["name"] in group_names: - new_groups.append(RecipeGroup(dep["name"])) - if "customizations" in self: - customizations = self["customizations"] - else: - customizations = None - if "repos" in self and "git" in self["repos"]: - gitrepos = self["repos"]["git"] - else: - gitrepos = None - - return Recipe(self["name"], self["description"], self["version"], - new_modules, new_packages, new_groups, customizations, gitrepos)
      - -
      [docs]class RecipeModule(dict): - def __init__(self, name, version): - dict.__init__(self, name=name, version=version)
      - -
      [docs]class RecipePackage(RecipeModule): - pass
      - -
      [docs]class RecipeGroup(dict): - def __init__(self, name): - dict.__init__(self, name=name)
      - -
      [docs]def NewRecipeGit(toml_dict): - """Create a RecipeGit object from fields in a TOML dict - - :param rpmname: Name of the rpm to create, also used as the prefix name in the tar archive - :type rpmname: str - :param rpmversion: Version of the rpm, eg. "1.0.0" - :type rpmversion: str - :param rpmrelease: Release of the rpm, eg. "1" - :type rpmrelease: str - :param summary: Summary string for the rpm - :type summary: str - :param repo: URL of the get repo to clone and create the archive from - :type repo: str - :param ref: Git reference to check out. eg. origin/branch-name, git tag, or git commit hash - :type ref: str - :param destination: Path to install the / of the git repo at when installing the rpm - :type destination: str - :returns: A populated RecipeGit object - :rtype: RecipeGit - - The TOML should look like this:: - - [[repos.git]] - rpmname="server-config" - rpmversion="1.0" - rpmrelease="1" - summary="Setup files for server deployment" - repo="PATH OF GIT REPO TO CLONE" - ref="v1.0" - destination="/opt/server/" - - Note that the repo path supports anything that git supports, file://, https://, http:// - - Currently there is no support for authentication - """ - return RecipeGit(toml_dict.get("rpmname"), - toml_dict.get("rpmversion"), - toml_dict.get("rpmrelease"), - toml_dict.get("summary", ""), - toml_dict.get("repo"), - toml_dict.get("ref"), - toml_dict.get("destination"))
      - -
      [docs]class RecipeGit(dict): - def __init__(self, rpmname, rpmversion, rpmrelease, summary, repo, ref, destination): - dict.__init__(self, rpmname=rpmname, rpmversion=rpmversion, rpmrelease=rpmrelease, - summary=summary, repo=repo, ref=ref, destination=destination)
      - -
      [docs]def recipe_from_file(recipe_path): - """Return a recipe file as a Recipe object - - :param recipe_path: Path to the recipe fila - :type recipe_path: str - :returns: A Recipe object - :rtype: Recipe - """ - with open(recipe_path, 'rb') as f: - return recipe_from_toml(f.read())
      - -
      [docs]def recipe_from_toml(recipe_str): - """Create a Recipe object from a toml string. - - :param recipe_str: The Recipe TOML string - :type recipe_str: str - :returns: A Recipe object - :rtype: Recipe - :raises: TomlError - """ - recipe_dict = toml.loads(recipe_str) - return recipe_from_dict(recipe_dict)
      - -
      [docs]def check_required_list(lst, fields): - """Check a list of dicts for required fields - - :param lst: A list of dicts with fields - :type lst: list of dict - :param fields: A list of field name strings - :type fields: list of str - :returns: A list of error strings - :rtype: list of str - """ - errors = [] - for i, m in enumerate(lst): - m_errs = [] - errors.extend(check_list_case(fields, m.keys(), prefix="%d " % (i+1))) - for f in fields: - if f not in m: - m_errs.append("'%s'" % f) - if m_errs: - errors.append("%d is missing %s" % (i+1, ", ".join(m_errs))) - return errors
      - -
      [docs]def check_list_case(expected_keys, recipe_keys, prefix=""): - """Check the case of the recipe keys - - :param expected_keys: A list of expected key strings - :type expected_keys: list of str - :param recipe_keys: A list of the recipe's key strings - :type recipe_keys: list of str - :returns: list of errors - :rtype: list of str - """ - errors = [] - for k in recipe_keys: - if k in expected_keys: - continue - if k.lower() in expected_keys: - errors.append(prefix + "%s should be %s" % (k, k.lower())) - return errors
      - -
      [docs]def check_recipe_dict(recipe_dict): - """Check a dict before using it to create a new Recipe - - :param recipe_dict: A plain dict of the recipe - :type recipe_dict: dict - :returns: True if dict is ok - :rtype: bool - :raises: RecipeError - - This checks a dict to make sure required fields are present, - that optional fields are correct, and that other optional fields - are of the correct format, when included. - - This collects all of the errors and returns a single RecipeError with - a string that can be presented to users. - """ - errors = [] - - # Check for wrong case of top level keys - top_keys = ["name", "description", "version", "modules", "packages", "groups", "repos", "customizations"] - errors.extend(check_list_case(recipe_dict.keys(), top_keys)) - - if "name" not in recipe_dict: - errors.append("Missing 'name'") - if "description" not in recipe_dict: - errors.append("Missing 'description'") - if "version" in recipe_dict: - try: - semver.Version(recipe_dict["version"]) - except ValueError: - errors.append("Invalid 'version', must use Semantic Versioning") - - # Examine all the modules - if recipe_dict.get("modules"): - module_errors = check_required_list(recipe_dict["modules"], ["name", "version"]) - if module_errors: - errors.append("'modules' errors:\n%s" % "\n".join(module_errors)) - - # Examine all the packages - if recipe_dict.get("packages"): - package_errors = check_required_list(recipe_dict["packages"], ["name", "version"]) - if package_errors: - errors.append("'packages' errors:\n%s" % "\n".join(package_errors)) - - if recipe_dict.get("groups"): - groups_errors = check_required_list(recipe_dict["groups"], ["name"]) - if groups_errors: - errors.append("'groups' errors:\n%s" % "\n".join(groups_errors)) - - if recipe_dict.get("repos") and recipe_dict.get("repos").get("git"): - repos_errors = check_required_list(recipe_dict.get("repos").get("git"), - ["rpmname", "rpmversion", "rpmrelease", "summary", "repo", "ref", "destination"]) - if repos_errors: - errors.append("'repos.git' errors:\n%s" % "\n".join(repos_errors)) - - # No customizations to check, exit now - c = recipe_dict.get("customizations") - if not c: - return errors - - # Make sure to catch empty sections by testing for keywords, not just looking at .get() result. - if "kernel" in c: - errors.extend(check_list_case(["append"], c["kernel"].keys(), prefix="kernel ")) - if "append" not in c.get("kernel", []): - errors.append("'customizations.kernel': missing append field.") - - if "sshkey" in c: - sshkey_errors = check_required_list(c.get("sshkey"), ["user", "key"]) - if sshkey_errors: - errors.append("'customizations.sshkey' errors:\n%s" % "\n".join(sshkey_errors)) - - if "user" in c: - user_errors = check_required_list(c.get("user"), ["name"]) - if user_errors: - errors.append("'customizations.user' errors:\n%s" % "\n".join(user_errors)) - - if "group" in c: - group_errors = check_required_list(c.get("group"), ["name"]) - if group_errors: - errors.append("'customizations.group' errors:\n%s" % "\n".join(group_errors)) - - if "timezone" in c: - errors.extend(check_list_case(["timezone", "ntpservers"], c["timezone"].keys(), prefix="timezone ")) - if not c.get("timezone"): - errors.append("'customizations.timezone': missing timezone or ntpservers fields.") - - if "locale" in c: - errors.extend(check_list_case(["languages", "keyboard"], c["locale"].keys(), prefix="locale ")) - if not c.get("locale"): - errors.append("'customizations.locale': missing languages or keyboard fields.") - - if "firewall" in c: - errors.extend(check_list_case(["ports"], c["firewall"].keys(), prefix="firewall ")) - if not c.get("firewall"): - errors.append("'customizations.firewall': missing ports field or services section.") - - if "services" in c.get("firewall", []): - errors.extend(check_list_case(["enabled", "disabled"], c["firewall"]["services"].keys(), prefix="firewall.services ")) - if not c.get("firewall").get("services"): - errors.append("'customizations.firewall.services': missing enabled or disabled fields.") - - if "services" in c: - errors.extend(check_list_case(["enabled", "disabled"], c["services"].keys(), prefix="services ")) - if not c.get("services"): - errors.append("'customizations.services': missing enabled or disabled fields.") - - return errors
      - -
      [docs]def recipe_from_dict(recipe_dict): - """Create a Recipe object from a plain dict. - - :param recipe_dict: A plain dict of the recipe - :type recipe_dict: dict - :returns: A Recipe object - :rtype: Recipe - :raises: RecipeError - """ - errors = check_recipe_dict(recipe_dict) - if errors: - msg = "\n".join(errors) - raise RecipeError(msg) - - # Make RecipeModule objects from the toml - # The TOML may not have modules or packages in it. Set them to None in this case - try: - if recipe_dict.get("modules"): - modules = [RecipeModule(m.get("name"), m.get("version")) for m in recipe_dict["modules"]] - else: - modules = [] - if recipe_dict.get("packages"): - packages = [RecipePackage(p.get("name"), p.get("version")) for p in recipe_dict["packages"]] - else: - packages = [] - if recipe_dict.get("groups"): - groups = [RecipeGroup(g.get("name")) for g in recipe_dict["groups"]] - else: - groups = [] - if recipe_dict.get("repos") and recipe_dict.get("repos").get("git"): - gitrepos = [NewRecipeGit(r) for r in recipe_dict["repos"]["git"]] - else: - gitrepos = [] - name = recipe_dict["name"] - description = recipe_dict["description"] - version = recipe_dict.get("version", None) - customizations = recipe_dict.get("customizations", None) - - # [customizations] was incorrectly documented at first, so we have to support using it - # as [[customizations]] by grabbing the first element. - if isinstance(customizations, list): - customizations = customizations[0] - - except KeyError as e: - raise RecipeError("There was a problem parsing the recipe: %s" % str(e)) - - return Recipe(name, description, version, modules, packages, groups, customizations, gitrepos)
      - -
      [docs]def gfile(path): - """Convert a string path to GFile for use with Git""" - return Gio.file_new_for_path(path)
      - -
      [docs]def recipe_filename(name): - """Return the toml filename for a recipe - - Replaces spaces with '-' and appends '.toml' - """ - # XXX Raise and error if this is empty? - return name.replace(" ", "-") + ".toml"
      - -
      [docs]def head_commit(repo, branch): - """Get the branch's HEAD Commit Object - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :returns: Branch's head commit - :rtype: Git.Commit - :raises: Can raise errors from Ggit - """ - branch_obj = repo.lookup_branch(branch, Git.BranchType.LOCAL) - commit_id = branch_obj.get_target() - return repo.lookup(commit_id, Git.Commit)
      - -
      [docs]def prepare_commit(repo, branch, builder): - """Prepare for a commit - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param builder: instance of TreeBuilder - :type builder: TreeBuilder - :returns: (Tree, Sig, Ref) - :rtype: tuple - :raises: Can raise errors from Ggit - """ - tree_id = builder.write() - tree = repo.lookup(tree_id, Git.Tree) - sig = Git.Signature.new_now("bdcs-api-server", "user-email") - ref = "refs/heads/%s" % branch - return (tree, sig, ref)
      - -
      [docs]def open_or_create_repo(path): - """Open an existing repo, or create a new one - - :param path: path to recipe directory - :type path: string - :returns: A repository object - :rtype: Git.Repository - :raises: Can raise errors from Ggit - - A bare git repo will be created in the git directory of the specified path. - If a repo already exists it will be opened and returned instead of - creating a new one. - """ - Git.init() - git_path = joinpaths(path, "git") - if os.path.exists(joinpaths(git_path, "HEAD")): - return Git.Repository.open(gfile(git_path)) - - repo = Git.Repository.init_repository(gfile(git_path), True) - - # Make an initial empty commit - sig = Git.Signature.new_now("bdcs-api-server", "user-email") - tree_id = repo.get_index().write_tree() - tree = repo.lookup(tree_id, Git.Tree) - repo.create_commit("HEAD", sig, sig, "UTF-8", "Initial Recipe repository commit", tree, []) - return repo
      - -
      [docs]def write_commit(repo, branch, filename, message, content): - """Make a new commit to a repository's branch - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param filename: full path of the file to add - :type filename: str - :param message: The commit message - :type message: str - :param content: The data to write - :type content: str - :returns: OId of the new commit - :rtype: Git.OId - :raises: Can raise errors from Ggit - """ - try: - parent_commit = head_commit(repo, branch) - except GLib.GError: - # Branch doesn't exist, make a new one based on master - master_head = head_commit(repo, "master") - repo.create_branch(branch, master_head, 0) - parent_commit = head_commit(repo, branch) - - parent_commit = head_commit(repo, branch) - blob_id = repo.create_blob_from_buffer(content.encode("UTF-8")) - - # Use treebuilder to make a new entry for this filename and blob - parent_tree = parent_commit.get_tree() - builder = repo.create_tree_builder_from_tree(parent_tree) - builder.insert(filename, blob_id, Git.FileMode.BLOB) - (tree, sig, ref) = prepare_commit(repo, branch, builder) - return repo.create_commit(ref, sig, sig, "UTF-8", message, tree, [parent_commit])
      - -
      [docs]def read_commit_spec(repo, spec): - """Return the raw content of the blob specified by the spec - - :param repo: Open repository - :type repo: Git.Repository - :param spec: Git revparse spec - :type spec: str - :returns: Contents of the commit - :rtype: str - :raises: Can raise errors from Ggit - - eg. To read the README file from master the spec is "master:README" - """ - commit_id = repo.revparse(spec).get_id() - blob = repo.lookup(commit_id, Git.Blob) - return blob.get_raw_content()
      - -
      [docs]def read_commit(repo, branch, filename, commit=None): - """Return the contents of a file on a specific branch or commit. - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param filename: filename to read - :type filename: str - :param commit: Optional commit hash - :type commit: str - :returns: The commit id, and the contents of the commit - :rtype: tuple(str, str) - :raises: Can raise errors from Ggit - - If no commit is passed the master:filename is returned, otherwise it will be - commit:filename - """ - if not commit: - # Find the most recent commit for filename on the selected branch - commits = list_commits(repo, branch, filename, 1) - if not commits: - raise RecipeError("No commits for %s on the %s branch." % (filename, branch)) - commit = commits[0].commit - return (commit, read_commit_spec(repo, "%s:%s" % (commit, filename)))
      - -
      [docs]def read_recipe_commit(repo, branch, recipe_name, commit=None): - """Read a recipe commit from git and return a Recipe object - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param recipe_name: Recipe name to read - :type recipe_name: str - :param commit: Optional commit hash - :type commit: str - :returns: A Recipe object - :rtype: Recipe - :raises: Can raise errors from Ggit - - If no commit is passed the master:filename is returned, otherwise it will be - commit:filename - """ - if not repo_file_exists(repo, branch, recipe_filename(recipe_name)): - raise RecipeFileError("Unknown blueprint") - - (_, recipe_toml) = read_commit(repo, branch, recipe_filename(recipe_name), commit) - return recipe_from_toml(recipe_toml)
      - -
      [docs]def read_recipe_and_id(repo, branch, recipe_name, commit=None): - """Read a recipe commit and its id from git - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param recipe_name: Recipe name to read - :type recipe_name: str - :param commit: Optional commit hash - :type commit: str - :returns: The commit id, and a Recipe object - :rtype: tuple(str, Recipe) - :raises: Can raise errors from Ggit - - If no commit is passed the master:filename is returned, otherwise it will be - commit:filename - """ - (commit_id, recipe_toml) = read_commit(repo, branch, recipe_filename(recipe_name), commit) - return (commit_id, recipe_from_toml(recipe_toml))
      - -
      [docs]def list_branch_files(repo, branch): - """Return a sorted list of the files on the branch HEAD - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :returns: A sorted list of the filenames - :rtype: list(str) - :raises: Can raise errors from Ggit - """ - commit = head_commit(repo, branch).get_id().to_string() - return list_commit_files(repo, commit)
      - -
      [docs]def list_commit_files(repo, commit): - """Return a sorted list of the files on a commit - - :param repo: Open repository - :type repo: Git.Repository - :param commit: The commit hash to list - :type commit: str - :returns: A sorted list of the filenames - :rtype: list(str) - :raises: Can raise errors from Ggit - """ - commit_id = Git.OId.new_from_string(commit) - commit_obj = repo.lookup(commit_id, Git.Commit) - tree = commit_obj.get_tree() - return sorted([tree.get(i).get_name() for i in range(0, tree.size())])
      - -
      [docs]def delete_recipe(repo, branch, recipe_name): - """Delete a recipe from a branch. - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param recipe_name: Recipe name to delete - :type recipe_name: str - :returns: OId of the new commit - :rtype: Git.OId - :raises: Can raise errors from Ggit - """ - return delete_file(repo, branch, recipe_filename(recipe_name))
      - -
      [docs]def delete_file(repo, branch, filename): - """Delete a file from a branch. - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param filename: filename to delete - :type filename: str - :returns: OId of the new commit - :rtype: Git.OId - :raises: Can raise errors from Ggit - """ - parent_commit = head_commit(repo, branch) - parent_tree = parent_commit.get_tree() - builder = repo.create_tree_builder_from_tree(parent_tree) - builder.remove(filename) - (tree, sig, ref) = prepare_commit(repo, branch, builder) - message = "Recipe %s deleted" % filename - return repo.create_commit(ref, sig, sig, "UTF-8", message, tree, [parent_commit])
      - -
      [docs]def revert_recipe(repo, branch, recipe_name, commit): - """Revert the contents of a recipe to that of a previous commit - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param recipe_name: Recipe name to revert - :type recipe_name: str - :param commit: Commit hash - :type commit: str - :returns: OId of the new commit - :rtype: Git.OId - :raises: Can raise errors from Ggit - """ - return revert_file(repo, branch, recipe_filename(recipe_name), commit)
      - -
      [docs]def revert_file(repo, branch, filename, commit): - """Revert the contents of a file to that of a previous commit - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param filename: filename to revert - :type filename: str - :param commit: Commit hash - :type commit: str - :returns: OId of the new commit - :rtype: Git.OId - :raises: Can raise errors from Ggit - """ - commit_id = Git.OId.new_from_string(commit) - commit_obj = repo.lookup(commit_id, Git.Commit) - revert_tree = commit_obj.get_tree() - entry = revert_tree.get_by_name(filename) - blob_id = entry.get_id() - parent_commit = head_commit(repo, branch) - - # Use treebuilder to modify the tree - parent_tree = parent_commit.get_tree() - builder = repo.create_tree_builder_from_tree(parent_tree) - builder.insert(filename, blob_id, Git.FileMode.BLOB) - (tree, sig, ref) = prepare_commit(repo, branch, builder) - commit_hash = commit_id.to_string() - message = "%s reverted to commit %s" % (filename, commit_hash) - return repo.create_commit(ref, sig, sig, "UTF-8", message, tree, [parent_commit])
      - -
      [docs]def commit_recipe(repo, branch, recipe): - """Commit a recipe to a branch - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param recipe: Recipe to commit - :type recipe: Recipe - :returns: OId of the new commit - :rtype: Git.OId - :raises: Can raise errors from Ggit - """ - try: - old_recipe = read_recipe_commit(repo, branch, recipe["name"]) - old_version = old_recipe["version"] - except Exception: - old_version = None - - recipe.bump_version(old_version) - recipe_toml = recipe.toml() - message = "Recipe %s, version %s saved." % (recipe["name"], recipe["version"]) - return write_commit(repo, branch, recipe.filename, message, recipe_toml)
      - -
      [docs]def commit_recipe_file(repo, branch, filename): - """Commit a recipe file to a branch - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param filename: Path to the recipe file to commit - :type filename: str - :returns: OId of the new commit - :rtype: Git.OId - :raises: Can raise errors from Ggit or RecipeFileError - """ - try: - recipe = recipe_from_file(filename) - except IOError: - raise RecipeFileError - - return commit_recipe(repo, branch, recipe)
      - -
      [docs]def commit_recipe_directory(repo, branch, directory): - r"""Commit all \*.toml files from a directory, if they aren't already in git. - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param directory: The directory of \*.toml recipes to commit - :type directory: str - :returns: None - :raises: Can raise errors from Ggit or RecipeFileError - - Files with Toml or RecipeFileErrors will be skipped, and the remainder will - be tried. - """ - dir_files = set([e for e in os.listdir(directory) if e.endswith(".toml")]) - branch_files = set(list_branch_files(repo, branch)) - new_files = dir_files.difference(branch_files) - - for f in new_files: - # Skip files with errors, but try the others - try: - commit_recipe_file(repo, branch, joinpaths(directory, f)) - except (RecipeError, RecipeFileError, toml.TomlError): - pass
      - -
      [docs]def tag_recipe_commit(repo, branch, recipe_name): - """Tag a file's most recent commit - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param recipe_name: Recipe name to tag - :type recipe_name: str - :returns: Tag id or None if it failed. - :rtype: Git.OId - :raises: Can raise errors from Ggit - - Uses tag_file_commit() - """ - if not repo_file_exists(repo, branch, recipe_filename(recipe_name)): - raise RecipeFileError("Unknown blueprint") - - return tag_file_commit(repo, branch, recipe_filename(recipe_name))
      - -
      [docs]def tag_file_commit(repo, branch, filename): - """Tag a file's most recent commit - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param filename: Filename to tag - :type filename: str - :returns: Tag id or None if it failed. - :rtype: Git.OId - :raises: Can raise errors from Ggit - - This uses git tags, of the form `refs/tags/<branch>/<filename>/r<revision>` - Only the most recent recipe commit can be tagged to prevent out of order tagging. - Revisions start at 1 and increment for each new commit that is tagged. - If the commit has already been tagged it will return false. - """ - file_commits = list_commits(repo, branch, filename) - if not file_commits: - return None - - # Find the most recently tagged version (may not be one) and add 1 to it. - for details in file_commits: - if details.revision is not None: - new_revision = details.revision + 1 - break - else: - new_revision = 1 - - name = "%s/%s/r%d" % (branch, filename, new_revision) - sig = Git.Signature.new_now("bdcs-api-server", "user-email") - commit_id = Git.OId.new_from_string(file_commits[0].commit) - commit = repo.lookup(commit_id, Git.Commit) - return repo.create_tag(name, commit, sig, name, Git.CreateFlags.NONE)
      - -
      [docs]def find_commit_tag(repo, branch, filename, commit_id): - """Find the tag that matches the commit_id - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param filename: filename to revert - :type filename: str - :param commit_id: The commit id to check - :type commit_id: Git.OId - :returns: The tag or None if there isn't one - :rtype: str or None - - There should be only 1 tag pointing to a commit, but there may not - be a tag at all. - - The tag will look like: 'refs/tags/<branch>/<filename>/r<revision>' - """ - pattern = "%s/%s/r*" % (branch, filename) - tags = [t for t in repo.list_tags_match(pattern) if is_commit_tag(repo, commit_id, t)] - if len(tags) != 1: - return None - else: - return tags[0]
      - -
      [docs]def is_commit_tag(repo, commit_id, tag): - """Check to see if a tag points to a specific commit. - - :param repo: Open repository - :type repo: Git.Repository - :param commit_id: The commit id to check - :type commit_id: Git.OId - :param tag: The tag to check - :type tag: str - :returns: True if the tag points to the commit, False otherwise - :rtype: bool - """ - ref = repo.lookup_reference("refs/tags/" + tag) - tag_id = ref.get_target() - tag = repo.lookup(tag_id, Git.Tag) - target_id = tag.get_target_id() - return commit_id.compare(target_id) == 0
      - -
      [docs]def get_revision_from_tag(tag): - """Return the revision number from a tag - - :param tag: The tag to exract the revision from - :type tag: str - :returns: The integer revision or None - :rtype: int or None - - The revision is the part after the r in 'branch/filename/rXXX' - """ - if tag is None: - return None - try: - return int(tag.rsplit('r', 2)[-1]) - except (ValueError, IndexError): - return None
      - -
      [docs]class CommitDetails(DataHolder): - def __init__(self, commit, timestamp, message, revision=None): - DataHolder.__init__(self, - commit = commit, - timestamp = timestamp, - message = message, - revision = revision)
      - -
      [docs]def list_commits(repo, branch, filename, limit=0): - """List the commit history of a file on a branch. - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param filename: filename to revert - :type filename: str - :param limit: Number of commits to return (0=all) - :type limit: int - :returns: A list of commit details - :rtype: list(CommitDetails) - :raises: Can raise errors from Ggit - """ - revwalk = Git.RevisionWalker.new(repo) - branch_ref = "refs/heads/%s" % branch - revwalk.push_ref(branch_ref) - - commits = [] - while True: - commit_id = revwalk.next() - if not commit_id: - break - commit = repo.lookup(commit_id, Git.Commit) - - parents = commit.get_parents() - # No parents? Must be the first commit. - if parents.get_size() == 0: - continue - - tree = commit.get_tree() - # Is the filename in this tree? If not, move on. - if not tree.get_by_name(filename): - continue - - # Is filename different in all of the parent commits? - parent_commits = list(map(parents.get, range(0, parents.get_size()))) - is_diff = all([is_parent_diff(repo, filename, tree, pc) for pc in parent_commits]) - # No changes from parents, skip it. - if not is_diff: - continue - - tag = find_commit_tag(repo, branch, filename, commit.get_id()) - try: - commits.append(get_commit_details(commit, get_revision_from_tag(tag))) - if limit and len(commits) > limit: - break - except CommitTimeValError: - # Skip any commits that have trouble converting the time - # TODO - log details about this failure - pass - - # These will be in reverse time sort order thanks to revwalk - return commits
      - -
      [docs]def get_commit_details(commit, revision=None): - """Return the details about a specific commit. - - :param commit: The commit to get details from - :type commit: Git.Commit - :param revision: Optional commit revision - :type revision: int - :returns: Details about the commit - :rtype: CommitDetails - :raises: CommitTimeValError or Ggit exceptions - - """ - message = commit.get_message() - commit_str = commit.get_id().to_string() - sig = commit.get_committer() - - datetime = sig.get_time() - # XXX What do we do with timezone? - _timezone = sig.get_time_zone() - time_str = datetime.format_iso8601() - if not time_str: - raise CommitTimeValError - - return CommitDetails(commit_str, time_str, message, revision)
      - -
      [docs]def is_parent_diff(repo, filename, tree, parent): - """Check to see if the commit is different from its parents - - :param repo: Open repository - :type repo: Git.Repository - :param filename: filename to revert - :type filename: str - :param tree: The commit's tree - :type tree: Git.Tree - :param parent: The commit's parent commit - :type parent: Git.Commit - :retuns: True if filename in the commit is different from its parents - :rtype: bool - """ - diff_opts = Git.DiffOptions.new() - diff_opts.set_pathspec([filename]) - diff = Git.Diff.new_tree_to_tree(repo, parent.get_tree(), tree, diff_opts) - return diff.get_num_deltas() > 0
      - -
      [docs]def find_field_value(field, value, lst): - """Find a field matching value in the list of dicts. - - :param field: field to search for - :type field: str - :param value: value to match in the field - :type value: str - :param lst: List of dict's with field - :type lst: list of dict - :returns: First dict with matching field:value, or None - :rtype: dict or None - - Used to return a specific entry from a list that looks like this: - - [{"name": "one", "attr": "green"}, ...] - - find_field_value("name", "one", lst) will return the matching dict. - """ - for d in lst: - if d.get(field) and d.get(field) == value: - return d - return None
      - -
      [docs]def find_name(name, lst): - """Find the dict matching the name in a list and return it. - - :param name: Name to search for - :type name: str - :param lst: List of dict's with "name" field - :type lst: list of dict - :returns: First dict with matching name, or None - :rtype: dict or None - - This is just a wrapper for find_field_value with field set to "name" - """ - return find_field_value("name", name, lst)
      - -
      [docs]def find_recipe_obj(path, recipe, default=None): - """Find a recipe object - - :param path: A list of dict field names - :type path: list of str - :param recipe: The recipe to search - :type recipe: Recipe - :param default: The value to return if it is not found - :type default: Any - - Return the object found by applying the path to the dicts in the recipe, or - return the default if it doesn't exist. - - eg. {"customizations": {"hostname": "foo", "users": [...]}} - - find_recipe_obj(["customizations", "hostname"], recipe, "") - """ - o = recipe - try: - for p in path: - if not o.get(p): - return default - o = o.get(p) - except AttributeError: - return default - - return o
      - -
      [docs]def diff_lists(title, field, old_items, new_items): - """Return the differences between two lists of dicts. - - :param title: Title of the entry - :type title: str - :param field: Field to use as the key for comparisons - :type field: str - :param old_items: List of item dicts with "name" field - :type old_items: list(dict) - :param new_items: List of item dicts with "name" field - :type new_items: list(dict) - :returns: List of diff dicts with old/new entries - :rtype: list(dict) - """ - diffs = [] - old_fields= set(m[field] for m in old_items) - new_fields= set(m[field] for m in new_items) - - added_items = new_fields.difference(old_fields) - added_items = sorted(added_items, key=lambda n: n.lower()) - - removed_items = old_fields.difference(new_fields) - removed_items = sorted(removed_items, key=lambda n: n.lower()) - - same_items = old_fields.intersection(new_fields) - same_items = sorted(same_items, key=lambda n: n.lower()) - - for v in added_items: - diffs.append({"old":None, - "new":{title:find_field_value(field, v, new_items)}}) - - for v in removed_items: - diffs.append({"old":{title:find_field_value(field, v, old_items)}, - "new":None}) - - for v in same_items: - old_item = find_field_value(field, v, old_items) - new_item = find_field_value(field, v, new_items) - if old_item != new_item: - diffs.append({"old":{title:old_item}, - "new":{title:new_item}}) - - return diffs
      - -
      [docs]def customizations_diff(old_recipe, new_recipe): - """Diff the customizations sections from two versions of a recipe - """ - diffs = [] - old_keys = set(old_recipe.get("customizations", {}).keys()) - new_keys = set(new_recipe.get("customizations", {}).keys()) - - added_keys = new_keys.difference(old_keys) - added_keys = sorted(added_keys, key=lambda n: n.lower()) - - removed_keys = old_keys.difference(new_keys) - removed_keys = sorted(removed_keys, key=lambda n: n.lower()) - - same_keys = old_keys.intersection(new_keys) - same_keys = sorted(same_keys, key=lambda n: n.lower()) - - for v in added_keys: - diffs.append({"old": None, - "new": {"Customizations."+v: new_recipe["customizations"][v]}}) - - for v in removed_keys: - diffs.append({"old": {"Customizations."+v: old_recipe["customizations"][v]}, - "new": None}) - - for v in same_keys: - if new_recipe["customizations"][v] == old_recipe["customizations"][v]: - continue - - if type(new_recipe["customizations"][v]) == type([]): - # Lists of dicts need to use diff_lists - # sshkey uses 'user', user and group use 'name' - if "user" in new_recipe["customizations"][v][0]: - field_name = "user" - elif "name" in new_recipe["customizations"][v][0]: - field_name = "name" - else: - raise RuntimeError("%s list has unrecognized key, not 'name' or 'user'" % "customizations."+v) - - diffs.extend(diff_lists("Customizations."+v, field_name, old_recipe["customizations"][v], new_recipe["customizations"][v])) - else: - diffs.append({"old": {"Customizations."+v: old_recipe["customizations"][v]}, - "new": {"Customizations."+v: new_recipe["customizations"][v]}}) - - return diffs
      - - -
      [docs]def recipe_diff(old_recipe, new_recipe): - """Diff two versions of a recipe - - :param old_recipe: The old version of the recipe - :type old_recipe: Recipe - :param new_recipe: The new version of the recipe - :type new_recipe: Recipe - :returns: A list of diff dict entries with old/new - :rtype: list(dict) - """ - - diffs = [] - # These cannot be added or removed, just different - for element in ["name", "description", "version"]: - if old_recipe[element] != new_recipe[element]: - diffs.append({"old":{element.title():old_recipe[element]}, - "new":{element.title():new_recipe[element]}}) - - # These lists always exist - diffs.extend(diff_lists("Module", "name", old_recipe["modules"], new_recipe["modules"])) - diffs.extend(diff_lists("Package", "name", old_recipe["packages"], new_recipe["packages"])) - diffs.extend(diff_lists("Group", "name", old_recipe["groups"], new_recipe["groups"])) - - # The customizations section can contain a number of different types - diffs.extend(customizations_diff(old_recipe, new_recipe)) - - # repos contains keys that are lists (eg. [[repos.git]]) - diffs.extend(diff_lists("Repos.git", "rpmname", - find_recipe_obj(["repos", "git"], old_recipe, []), - find_recipe_obj(["repos", "git"], new_recipe, []))) - - return diffs
      - -
      [docs]def repo_file_exists(repo, branch, filename): - """Return True if the filename exists on the branch - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param filename: Filename to check - :type filename: str - :returns: True if the filename exists on the HEAD of the branch, False otherwise. - :rtype: bool - """ - commit = head_commit(repo, branch).get_id().to_string() - commit_id = Git.OId.new_from_string(commit) - commit_obj = repo.lookup(commit_id, Git.Commit) - tree = commit_obj.get_tree() - return tree.get_by_name(filename) is not None
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/server.html b/docs/html/_modules/pylorax/api/server.html deleted file mode 100644 index 20debaa8..00000000 --- a/docs/html/_modules/pylorax/api/server.html +++ /dev/null @@ -1,303 +0,0 @@ - - - - - - - - - - - pylorax.api.server — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.server

      -#
      -# Copyright (C) 2017-2019 Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import logging
      -log = logging.getLogger("lorax-composer")
      -
      -from collections import namedtuple
      -from flask import Flask, jsonify, redirect, send_from_directory
      -from glob import glob
      -import os
      -import werkzeug
      -
      -from pylorax import vernum
      -from pylorax.api.errors import HTTP_ERROR
      -from pylorax.api.v0 import v0_api
      -from pylorax.api.v1 import v1_api
      -from pylorax.sysutils import joinpaths
      -
      -GitLock = namedtuple("GitLock", ["repo", "lock", "dir"])
      -
      -server = Flask(__name__)
      -
      -__all__ = ["server", "GitLock"]
      -
      -@server.route('/')
      -def server_root():
      -    redirect("/api/docs/")
      -
      -@server.route("/api/docs/")
      -@server.route("/api/docs/<path:path>")
      -def api_docs(path=None):
      -    # Find the html docs
      -    try:
      -        # This assumes it is running from the source tree
      -        docs_path = os.path.abspath(joinpaths(os.path.dirname(__file__), "../../../docs/html"))
      -    except IndexError:
      -        docs_path = glob("/usr/share/doc/lorax-*/html/")[0]
      -
      -    if not path:
      -        path="index.html"
      -    return send_from_directory(docs_path, path)
      -
      -@server.route("/api/status")
      -def api_status():
      -    """
      -    `/api/status`
      -    ^^^^^^^^^^^^^^^^
      -    Return the status of the API Server::
      -
      -          { "api": "0",
      -            "build": "devel",
      -            "db_supported": true,
      -            "db_version": "0",
      -            "schema_version": "0",
      -            "backend": "lorax-composer",
      -            "msgs": []}
      -
      -    The 'msgs' field can be a list of strings describing startup problems or status that
      -    should be displayed to the user. eg. if the compose templates are not depsolving properly
      -    the errors will be in 'msgs'.
      -    """
      -    return jsonify(backend="lorax-composer",
      -                   build=vernum,
      -                   api="1",
      -                   db_version="0",
      -                   schema_version="0",
      -                   db_supported=True,
      -                   msgs=server.config["TEMPLATE_ERRORS"])
      -
      -@server.errorhandler(werkzeug.exceptions.HTTPException)
      -def bad_request(error):
      -    return jsonify(status=False, errors=[{ "id": HTTP_ERROR, "code": error.code, "msg": error.name }]), error.code
      -
      -# Register the v0 API on /api/v0/
      -server.register_blueprint(v0_api, url_prefix="/api/v0/")
      -
      -# Register the v1 API on /api/v1/
      -# Use v0 routes by default
      -skip_rules = [
      -    "/compose",
      -    "/compose/queue",
      -    "/compose/finished",
      -    "/compose/failed",
      -    "/compose/status/<uuids>",
      -    "/compose/info/<uuid>",
      -    "/projects/source/info/<source_names>",
      -    "/projects/source/new",
      -]
      -server.register_blueprint(v0_api, url_prefix="/api/v1/", skip_rules=skip_rules)
      -server.register_blueprint(v1_api, url_prefix="/api/v1/")
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/timestamp.html b/docs/html/_modules/pylorax/api/timestamp.html deleted file mode 100644 index 068de384..00000000 --- a/docs/html/_modules/pylorax/api/timestamp.html +++ /dev/null @@ -1,251 +0,0 @@ - - - - - - - - - - - pylorax.api.timestamp — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.timestamp

      -#
      -# Copyright (C) 2018  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -
      -import time
      -
      -from pylorax.sysutils import joinpaths
      -import pylorax.api.toml as toml
      -
      -TS_CREATED  = "created"
      -TS_STARTED  = "started"
      -TS_FINISHED = "finished"
      -
      -
      [docs]def write_timestamp(destdir, ty): - path = joinpaths(destdir, "times.toml") - - try: - contents = toml.loads(open(path, "r").read()) - except IOError: - contents = toml.loads("") - - if ty == TS_CREATED: - contents[TS_CREATED] = time.time() - elif ty == TS_STARTED: - contents[TS_STARTED] = time.time() - elif ty == TS_FINISHED: - contents[TS_FINISHED] = time.time() - - with open(path, "w") as f: - f.write(toml.dumps(contents))
      - -
      [docs]def timestamp_dict(destdir): - path = joinpaths(destdir, "times.toml") - - try: - return toml.loads(open(path, "r").read()) - except IOError: - return toml.loads("")
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/toml.html b/docs/html/_modules/pylorax/api/toml.html deleted file mode 100644 index 2fcb6931..00000000 --- a/docs/html/_modules/pylorax/api/toml.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - - - - - - pylorax.api.toml — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.toml

      -#
      -# Copyright (C) 2019  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -
      -import toml
      -
      -
      [docs]class TomlError(toml.TomlDecodeError): - pass
      - -
      [docs]def loads(s): - if isinstance(s, bytes): - s = s.decode('utf-8') - try: - return toml.loads(s) - except toml.TomlDecodeError as e: - raise TomlError(e.msg, e.doc, e.pos)
      - -
      [docs]def dumps(o): - # strip the result, because `toml.dumps` adds a lot of newlines - return toml.dumps(o, encoder=toml.TomlEncoder(dict)).strip()
      - -
      [docs]def load(file): - try: - return toml.load(file) - except toml.TomlDecodeError as e: - raise TomlError(e.msg, e.doc, e.pos)
      - -
      [docs]def dump(o, file): - return toml.dump(o, file)
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/utils.html b/docs/html/_modules/pylorax/api/utils.html deleted file mode 100644 index 4653e5d6..00000000 --- a/docs/html/_modules/pylorax/api/utils.html +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - - - - - - pylorax.api.utils — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.utils

      -#
      -# Copyright (C) 2019  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -""" API utility functions
      -"""
      -from pylorax.api.recipes import RecipeError, RecipeFileError, read_recipe_commit
      -
      -
      [docs]def take_limits(iterable, offset, limit): - """ Apply offset and limit to an iterable object - - :param iterable: The object to limit - :type iterable: iter - :param offset: The number of items to skip - :type offset: int - :param limit: The total number of items to return - :type limit: int - :returns: A subset of the iterable - """ - return iterable[offset:][:limit]
      - -
      [docs]def blueprint_exists(api, branch, blueprint_name): - """Return True if the blueprint exists - - :param api: flask object - :type api: Flask - :param branch: Branch name - :type branch: str - :param recipe_name: Recipe name to read - :type recipe_name: str - """ - try: - with api.config["GITLOCK"].lock: - read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) - - return True - except (RecipeError, RecipeFileError): - return False
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/v0.html b/docs/html/_modules/pylorax/api/v0.html deleted file mode 100644 index 9360665a..00000000 --- a/docs/html/_modules/pylorax/api/v0.html +++ /dev/null @@ -1,2197 +0,0 @@ - - - - - - - - - - - pylorax.api.v0 — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.v0

      -#
      -# Copyright (C) 2017-2019  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -""" Setup v0 of the API server
      -
      -v0_api() must be called to setup the API routes for Flask
      -
      -Status Responses
      -----------------
      -
      -Some requests only return a status/error response.
      -
      -  The response will be a status response with `status` set to true, or an
      -  error response with it set to false and an error message included.
      -
      -  Example response::
      -
      -      {
      -        "status": true
      -      }
      -
      -  Error response::
      -
      -      {
      -        "errors": ["ggit-error: Failed to remove entry. File isn't in the tree - jboss.toml (-1)"]
      -        "status": false
      -      }
      -
      -API Routes
      -----------
      -
      -All of the blueprints routes support the optional `branch` argument. If it is not
      -used then the API will use the `master` branch for blueprints. If you want to create
      -a new branch use the `new` or `workspace` routes with ?branch=<branch-name> to
      -store the new blueprint on the new branch.
      -"""
      -
      -import logging
      -log = logging.getLogger("lorax-composer")
      -
      -import os
      -from flask import jsonify, request, Response, send_file
      -from flask import current_app as api
      -
      -from pylorax.sysutils import joinpaths
      -from pylorax.api.checkparams import checkparams
      -from pylorax.api.compose import start_build, compose_types
      -from pylorax.api.errors import *                               # pylint: disable=wildcard-import,unused-wildcard-import
      -from pylorax.api.flask_blueprint import BlueprintSkip
      -from pylorax.api.projects import projects_list, projects_info, projects_depsolve
      -from pylorax.api.projects import modules_list, modules_info, ProjectsError, repo_to_source
      -from pylorax.api.projects import get_repo_sources, delete_repo_source, new_repo_source
      -from pylorax.api.queue import queue_status, build_status, uuid_delete, uuid_status, uuid_info
      -from pylorax.api.queue import uuid_tar, uuid_image, uuid_cancel, uuid_log
      -from pylorax.api.recipes import list_branch_files, read_recipe_commit, recipe_filename, list_commits
      -from pylorax.api.recipes import recipe_from_dict, recipe_from_toml, commit_recipe, delete_recipe, revert_recipe
      -from pylorax.api.recipes import tag_recipe_commit, recipe_diff, RecipeFileError
      -from pylorax.api.regexes import VALID_API_STRING, VALID_BLUEPRINT_NAME
      -import pylorax.api.toml as toml
      -from pylorax.api.utils import take_limits, blueprint_exists
      -from pylorax.api.workspace import workspace_read, workspace_write, workspace_delete, workspace_exists
      -
      -# The API functions don't actually get called by any code here
      -# pylint: disable=unused-variable
      -
      -# Create the v0 routes Blueprint with skip_routes support
      -v0_api = BlueprintSkip("v0_routes", __name__)
      -
      -
      [docs]@v0_api.route("/blueprints/list") -def v0_blueprints_list(): - """List the available blueprints on a branch. - - **/api/v0/blueprints/list** - - List the available blueprints:: - - { "limit": 20, - "offset": 0, - "blueprints": [ - "atlas", - "development", - "glusterfs", - "http-server", - "jboss", - "kubernetes" ], - "total": 6 } - """ - branch = request.args.get("branch", "master") - if VALID_API_STRING.match(branch) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in branch argument"}]), 400 - - try: - limit = int(request.args.get("limit", "20")) - offset = int(request.args.get("offset", "0")) - except ValueError as e: - return jsonify(status=False, errors=[{"id": BAD_LIMIT_OR_OFFSET, "msg": str(e)}]), 400 - - with api.config["GITLOCK"].lock: - blueprints = [f[:-5] for f in list_branch_files(api.config["GITLOCK"].repo, branch)] - limited_blueprints = take_limits(blueprints, offset, limit) - return jsonify(blueprints=limited_blueprints, limit=limit, offset=offset, total=len(blueprints))
      - -
      [docs]@v0_api.route("/blueprints/info", defaults={'blueprint_names': ""}) -@v0_api.route("/blueprints/info/<blueprint_names>") -@checkparams([("blueprint_names", "", "no blueprint names given")]) -def v0_blueprints_info(blueprint_names): - """Return the contents of the blueprint, or a list of blueprints - - **/api/v0/blueprints/info/<blueprint_names>[?format=<json|toml>]** - - Return the JSON representation of the blueprint. This includes 3 top level - objects. `changes` which lists whether or not the workspace is different from - the most recent commit. `blueprints` which lists the JSON representation of the - blueprint, and `errors` which will list any errors, like non-existant blueprints. - - By default the response is JSON, but if `?format=toml` is included in the URL's - arguments it will return the response as the blueprint's raw TOML content. - *Unless* there is an error which will only return a 400 and a standard error - `Status Responses`_. - - If there is an error when JSON is requested the successful blueprints and the - errors will both be returned. - - Example of json response:: - - { - "changes": [ - { - "changed": false, - "name": "glusterfs" - } - ], - "errors": [], - "blueprints": [ - { - "description": "An example GlusterFS server with samba", - "modules": [ - { - "name": "glusterfs", - "version": "3.7.*" - }, - { - "name": "glusterfs-cli", - "version": "3.7.*" - } - ], - "name": "glusterfs", - "packages": [ - { - "name": "2ping", - "version": "3.2.1" - }, - { - "name": "samba", - "version": "4.2.*" - } - ], - "version": "0.0.6" - } - ] - } - - Error example:: - - { - "changes": [], - "errors": ["ggit-error: the path 'missing.toml' does not exist in the given tree (-3)"] - "blueprints": [] - } - """ - if any(VALID_BLUEPRINT_NAME.match(blueprint_name) is None for blueprint_name in blueprint_names.split(',')): - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - branch = request.args.get("branch", "master") - if VALID_API_STRING.match(branch) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in branch argument"}]), 400 - - out_fmt = request.args.get("format", "json") - if VALID_API_STRING.match(out_fmt) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in format argument"}]), 400 - - blueprints = [] - changes = [] - errors = [] - for blueprint_name in [n.strip() for n in blueprint_names.split(",")]: - exceptions = [] - # Get the workspace version (if it exists) - try: - with api.config["GITLOCK"].lock: - ws_blueprint = workspace_read(api.config["GITLOCK"].repo, branch, blueprint_name) - except Exception as e: - ws_blueprint = None - exceptions.append(str(e)) - log.error("(v0_blueprints_info) %s", str(e)) - - # Get the git version (if it exists) - try: - with api.config["GITLOCK"].lock: - git_blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) - except RecipeFileError as e: - # Adding an exception would be redundant, skip it - git_blueprint = None - log.error("(v0_blueprints_info) %s", str(e)) - except Exception as e: - git_blueprint = None - exceptions.append(str(e)) - log.error("(v0_blueprints_info) %s", str(e)) - - if not ws_blueprint and not git_blueprint: - # Neither blueprint, return an error - errors.append({"id": UNKNOWN_BLUEPRINT, "msg": "%s: %s" % (blueprint_name, ", ".join(exceptions))}) - elif ws_blueprint and not git_blueprint: - # No git blueprint, return the workspace blueprint - changes.append({"name":blueprint_name, "changed":True}) - blueprints.append(ws_blueprint) - elif not ws_blueprint and git_blueprint: - # No workspace blueprint, no change, return the git blueprint - changes.append({"name":blueprint_name, "changed":False}) - blueprints.append(git_blueprint) - else: - # Both exist, maybe changed, return the workspace blueprint - changes.append({"name":blueprint_name, "changed":ws_blueprint != git_blueprint}) - blueprints.append(ws_blueprint) - - # Sort all the results by case-insensitive blueprint name - changes = sorted(changes, key=lambda c: c["name"].lower()) - blueprints = sorted(blueprints, key=lambda r: r["name"].lower()) - - if out_fmt == "toml": - if errors: - # If there are errors they need to be reported, use JSON and 400 for this - return jsonify(status=False, errors=errors), 400 - else: - # With TOML output we just want to dump the raw blueprint, skipping the rest. - return "\n\n".join([r.toml() for r in blueprints]) - else: - return jsonify(changes=changes, blueprints=blueprints, errors=errors)
      - -
      [docs]@v0_api.route("/blueprints/changes", defaults={'blueprint_names': ""}) -@v0_api.route("/blueprints/changes/<blueprint_names>") -@checkparams([("blueprint_names", "", "no blueprint names given")]) -def v0_blueprints_changes(blueprint_names): - """Return the changes to a blueprint or list of blueprints - - **/api/v0/blueprints/changes/<blueprint_names>[?offset=0&limit=20]** - - Return the commits to a blueprint. By default it returns the first 20 commits, this - can be changed by passing `offset` and/or `limit`. The response will include the - commit hash, summary, timestamp, and optionally the revision number. The commit - hash can be passed to `/api/v0/blueprints/diff/` to retrieve the exact changes. - - Example:: - - { - "errors": [], - "limit": 20, - "offset": 0, - "blueprints": [ - { - "changes": [ - { - "commit": "e083921a7ed1cf2eec91ad12b9ad1e70ef3470be", - "message": "blueprint glusterfs, version 0.0.6 saved.", - "revision": null, - "timestamp": "2017-11-23T00:18:13Z" - }, - { - "commit": "cee5f4c20fc33ea4d54bfecf56f4ad41ad15f4f3", - "message": "blueprint glusterfs, version 0.0.5 saved.", - "revision": null, - "timestamp": "2017-11-11T01:00:28Z" - }, - { - "commit": "29b492f26ed35d80800b536623bafc51e2f0eff2", - "message": "blueprint glusterfs, version 0.0.4 saved.", - "revision": null, - "timestamp": "2017-11-11T00:28:30Z" - }, - { - "commit": "03374adbf080fe34f5c6c29f2e49cc2b86958bf2", - "message": "blueprint glusterfs, version 0.0.3 saved.", - "revision": null, - "timestamp": "2017-11-10T23:15:52Z" - }, - { - "commit": "0e08ecbb708675bfabc82952599a1712a843779d", - "message": "blueprint glusterfs, version 0.0.2 saved.", - "revision": null, - "timestamp": "2017-11-10T23:14:56Z" - }, - { - "commit": "3e11eb87a63d289662cba4b1804a0947a6843379", - "message": "blueprint glusterfs, version 0.0.1 saved.", - "revision": null, - "timestamp": "2017-11-08T00:02:47Z" - } - ], - "name": "glusterfs", - "total": 6 - } - ] - } - """ - if any(VALID_BLUEPRINT_NAME.match(blueprint_name) is None for blueprint_name in blueprint_names.split(',')): - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - branch = request.args.get("branch", "master") - if VALID_API_STRING.match(branch) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in branch argument"}]), 400 - - try: - limit = int(request.args.get("limit", "20")) - offset = int(request.args.get("offset", "0")) - except ValueError as e: - return jsonify(status=False, errors=[{"id": BAD_LIMIT_OR_OFFSET, "msg": str(e)}]), 400 - - blueprints = [] - errors = [] - for blueprint_name in [n.strip() for n in blueprint_names.split(",")]: - filename = recipe_filename(blueprint_name) - try: - with api.config["GITLOCK"].lock: - commits = list_commits(api.config["GITLOCK"].repo, branch, filename) - except Exception as e: - errors.append({"id": BLUEPRINTS_ERROR, "msg": "%s: %s" % (blueprint_name, str(e))}) - log.error("(v0_blueprints_changes) %s", str(e)) - else: - if commits: - limited_commits = take_limits(commits, offset, limit) - blueprints.append({"name":blueprint_name, "changes":limited_commits, "total":len(commits)}) - else: - # no commits means there is no blueprint in the branch - errors.append({"id": UNKNOWN_BLUEPRINT, "msg": "%s" % blueprint_name}) - - blueprints = sorted(blueprints, key=lambda r: r["name"].lower()) - - return jsonify(blueprints=blueprints, errors=errors, offset=offset, limit=limit)
      - -
      [docs]@v0_api.route("/blueprints/new", methods=["POST"]) -def v0_blueprints_new(): - """Commit a new blueprint - - **POST /api/v0/blueprints/new** - - Create a new blueprint, or update an existing blueprint. This supports both JSON and TOML - for the blueprint format. The blueprint should be in the body of the request with the - `Content-Type` header set to either `application/json` or `text/x-toml`. - - The response will be a status response with `status` set to true, or an - error response with it set to false and an error message included. - """ - branch = request.args.get("branch", "master") - if VALID_API_STRING.match(branch) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in branch argument"}]), 400 - - try: - if request.headers['Content-Type'] == "text/x-toml": - blueprint = recipe_from_toml(request.data) - else: - blueprint = recipe_from_dict(request.get_json(cache=False)) - - if VALID_BLUEPRINT_NAME.match(blueprint["name"]) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - with api.config["GITLOCK"].lock: - commit_recipe(api.config["GITLOCK"].repo, branch, blueprint) - - # Read the blueprint with new version and write it to the workspace - blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint["name"]) - workspace_write(api.config["GITLOCK"].repo, branch, blueprint) - except Exception as e: - log.error("(v0_blueprints_new) %s", str(e)) - return jsonify(status=False, errors=[{"id": BLUEPRINTS_ERROR, "msg": str(e)}]), 400 - else: - return jsonify(status=True)
      - -
      [docs]@v0_api.route("/blueprints/delete", defaults={'blueprint_name': ""}, methods=["DELETE"]) -@v0_api.route("/blueprints/delete/<blueprint_name>", methods=["DELETE"]) -@checkparams([("blueprint_name", "", "no blueprint name given")]) -def v0_blueprints_delete(blueprint_name): - """Delete a blueprint from git - - **DELETE /api/v0/blueprints/delete/<blueprint_name>** - - Delete a blueprint. The blueprint is deleted from the branch, and will no longer - be listed by the `list` route. A blueprint can be undeleted using the `undo` route - to revert to a previous commit. This will also delete the workspace copy of the - blueprint. - - The response will be a status response with `status` set to true, or an - error response with it set to false and an error message included. - """ - if VALID_BLUEPRINT_NAME.match(blueprint_name) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - branch = request.args.get("branch", "master") - if VALID_API_STRING.match(branch) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in branch argument"}]), 400 - - try: - with api.config["GITLOCK"].lock: - workspace_delete(api.config["GITLOCK"].repo, branch, blueprint_name) - delete_recipe(api.config["GITLOCK"].repo, branch, blueprint_name) - except Exception as e: - log.error("(v0_blueprints_delete) %s", str(e)) - return jsonify(status=False, errors=[{"id": BLUEPRINTS_ERROR, "msg": str(e)}]), 400 - else: - return jsonify(status=True)
      - -
      [docs]@v0_api.route("/blueprints/workspace", methods=["POST"]) -def v0_blueprints_workspace(): - """Write a blueprint to the workspace - - **POST /api/v0/blueprints/workspace** - - Write a blueprint to the temporary workspace. This works exactly the same as `new` except - that it does not create a commit. JSON and TOML bodies are supported. - - The workspace is meant to be used as a temporary blueprint storage for clients. - It will be read by the `info` and `diff` routes if it is different from the - most recent commit. - - The response will be a status response with `status` set to true, or an - error response with it set to false and an error message included. - """ - branch = request.args.get("branch", "master") - if VALID_API_STRING.match(branch) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in branch argument"}]), 400 - - try: - if request.headers['Content-Type'] == "text/x-toml": - blueprint = recipe_from_toml(request.data) - else: - blueprint = recipe_from_dict(request.get_json(cache=False)) - - if VALID_BLUEPRINT_NAME.match(blueprint["name"]) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - with api.config["GITLOCK"].lock: - workspace_write(api.config["GITLOCK"].repo, branch, blueprint) - except Exception as e: - log.error("(v0_blueprints_workspace) %s", str(e)) - return jsonify(status=False, errors=[{"id": BLUEPRINTS_ERROR, "msg": str(e)}]), 400 - else: - return jsonify(status=True)
      - -
      [docs]@v0_api.route("/blueprints/workspace", defaults={'blueprint_name': ""}, methods=["DELETE"]) -@v0_api.route("/blueprints/workspace/<blueprint_name>", methods=["DELETE"]) -@checkparams([("blueprint_name", "", "no blueprint name given")]) -def v0_blueprints_delete_workspace(blueprint_name): - """Delete a blueprint from the workspace - - **DELETE /api/v0/blueprints/workspace/<blueprint_name>** - - Remove the temporary workspace copy of a blueprint. The `info` route will now - return the most recent commit of the blueprint. Any changes that were in the - workspace will be lost. - - The response will be a status response with `status` set to true, or an - error response with it set to false and an error message included. - """ - if VALID_BLUEPRINT_NAME.match(blueprint_name) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - branch = request.args.get("branch", "master") - if VALID_API_STRING.match(branch) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in branch argument"}]), 400 - - try: - with api.config["GITLOCK"].lock: - if not workspace_exists(api.config["GITLOCK"].repo, branch, blueprint_name): - raise Exception("Unknown blueprint: %s" % blueprint_name) - - workspace_delete(api.config["GITLOCK"].repo, branch, blueprint_name) - except Exception as e: - log.error("(v0_blueprints_delete_workspace) %s", str(e)) - return jsonify(status=False, errors=[{"id": BLUEPRINTS_ERROR, "msg": str(e)}]), 400 - else: - return jsonify(status=True)
      - -
      [docs]@v0_api.route("/blueprints/undo", defaults={'blueprint_name': "", 'commit': ""}, methods=["POST"]) -@v0_api.route("/blueprints/undo/<blueprint_name>", defaults={'commit': ""}, methods=["POST"]) -@v0_api.route("/blueprints/undo/<blueprint_name>/<commit>", methods=["POST"]) -@checkparams([("blueprint_name", "", "no blueprint name given"), - ("commit", "", "no commit ID given")]) -def v0_blueprints_undo(blueprint_name, commit): - """Undo changes to a blueprint by reverting to a previous commit. - - **POST /api/v0/blueprints/undo/<blueprint_name>/<commit>** - - This will revert the blueprint to a previous commit. The commit hash from the `changes` - route can be used in this request. - - The response will be a status response with `status` set to true, or an - error response with it set to false and an error message included. - """ - if VALID_BLUEPRINT_NAME.match(blueprint_name) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - if VALID_BLUEPRINT_NAME.match(commit) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - branch = request.args.get("branch", "master") - if VALID_API_STRING.match(branch) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in branch argument"}]), 400 - - try: - with api.config["GITLOCK"].lock: - revert_recipe(api.config["GITLOCK"].repo, branch, blueprint_name, commit) - - # Read the new recipe and write it to the workspace - blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) - workspace_write(api.config["GITLOCK"].repo, branch, blueprint) - except Exception as e: - log.error("(v0_blueprints_undo) %s", str(e)) - return jsonify(status=False, errors=[{"id": UNKNOWN_COMMIT, "msg": str(e)}]), 400 - else: - return jsonify(status=True)
      - -
      [docs]@v0_api.route("/blueprints/tag", defaults={'blueprint_name': ""}, methods=["POST"]) -@v0_api.route("/blueprints/tag/<blueprint_name>", methods=["POST"]) -@checkparams([("blueprint_name", "", "no blueprint name given")]) -def v0_blueprints_tag(blueprint_name): - """Tag a blueprint's latest blueprint commit as a 'revision' - - **POST /api/v0/blueprints/tag/<blueprint_name>** - - Tag a blueprint as a new release. This uses git tags with a special format. - `refs/tags/<branch>/<filename>/r<revision>`. Only the most recent blueprint commit - can be tagged. Revisions start at 1 and increment for each new tag - (per-blueprint). If the commit has already been tagged it will return false. - - The response will be a status response with `status` set to true, or an - error response with it set to false and an error message included. - """ - if VALID_BLUEPRINT_NAME.match(blueprint_name) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - branch = request.args.get("branch", "master") - if VALID_API_STRING.match(branch) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in branch argument"}]), 400 - - try: - with api.config["GITLOCK"].lock: - tag_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) - except RecipeFileError as e: - log.error("(v0_blueprints_tag) %s", str(e)) - return jsonify(status=False, errors=[{"id": UNKNOWN_BLUEPRINT, "msg": str(e)}]), 400 - except Exception as e: - log.error("(v0_blueprints_tag) %s", str(e)) - return jsonify(status=False, errors=[{"id": BLUEPRINTS_ERROR, "msg": str(e)}]), 400 - else: - return jsonify(status=True)
      - -
      [docs]@v0_api.route("/blueprints/diff", defaults={'blueprint_name': "", 'from_commit': "", 'to_commit': ""}) -@v0_api.route("/blueprints/diff/<blueprint_name>", defaults={'from_commit': "", 'to_commit': ""}) -@v0_api.route("/blueprints/diff/<blueprint_name>/<from_commit>", defaults={'to_commit': ""}) -@v0_api.route("/blueprints/diff/<blueprint_name>/<from_commit>/<to_commit>") -@checkparams([("blueprint_name", "", "no blueprint name given"), - ("from_commit", "", "no from commit ID given"), - ("to_commit", "", "no to commit ID given")]) -def v0_blueprints_diff(blueprint_name, from_commit, to_commit): - """Return the differences between two commits of a blueprint - - **/api/v0/blueprints/diff/<blueprint_name>/<from_commit>/<to_commit>** - - Return the differences between two commits, or the workspace. The commit hash - from the `changes` response can be used here, or several special strings: - - - NEWEST will select the newest git commit. This works for `from_commit` or `to_commit` - - WORKSPACE will select the workspace copy. This can only be used in `to_commit` - - eg. `/api/v0/blueprints/diff/glusterfs/NEWEST/WORKSPACE` will return the differences - between the most recent git commit and the contents of the workspace. - - Each entry in the response's diff object contains the old blueprint value and the new one. - If old is null and new is set, then it was added. - If new is null and old is set, then it was removed. - If both are set, then it was changed. - - The old/new entries will have the name of the blueprint field that was changed. This - can be one of: Name, Description, Version, Module, or Package. - The contents for these will be the old/new values for them. - - In the example below the version was changed and the ping package was added. - - Example:: - - { - "diff": [ - { - "new": { - "Version": "0.0.6" - }, - "old": { - "Version": "0.0.5" - } - }, - { - "new": { - "Package": { - "name": "ping", - "version": "3.2.1" - } - }, - "old": null - } - ] - } - """ - for s in [blueprint_name, from_commit, to_commit]: - if VALID_API_STRING.match(s) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - branch = request.args.get("branch", "master") - if VALID_API_STRING.match(branch) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in branch argument"}]), 400 - - if not blueprint_exists(api, branch, blueprint_name): - return jsonify(status=False, errors=[{"id": UNKNOWN_BLUEPRINT, "msg": "Unknown blueprint name: %s" % blueprint_name}]) - - try: - if from_commit == "NEWEST": - with api.config["GITLOCK"].lock: - old_blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) - else: - with api.config["GITLOCK"].lock: - old_blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name, from_commit) - except Exception as e: - log.error("(v0_blueprints_diff) %s", str(e)) - return jsonify(status=False, errors=[{"id": UNKNOWN_COMMIT, "msg": str(e)}]), 400 - - try: - if to_commit == "WORKSPACE": - with api.config["GITLOCK"].lock: - new_blueprint = workspace_read(api.config["GITLOCK"].repo, branch, blueprint_name) - # If there is no workspace, use the newest commit instead - if not new_blueprint: - with api.config["GITLOCK"].lock: - new_blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) - elif to_commit == "NEWEST": - with api.config["GITLOCK"].lock: - new_blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) - else: - with api.config["GITLOCK"].lock: - new_blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name, to_commit) - except Exception as e: - log.error("(v0_blueprints_diff) %s", str(e)) - return jsonify(status=False, errors=[{"id": UNKNOWN_COMMIT, "msg": str(e)}]), 400 - - diff = recipe_diff(old_blueprint, new_blueprint) - return jsonify(diff=diff)
      - -
      [docs]@v0_api.route("/blueprints/freeze", defaults={'blueprint_names': ""}) -@v0_api.route("/blueprints/freeze/<blueprint_names>") -@checkparams([("blueprint_names", "", "no blueprint names given")]) -def v0_blueprints_freeze(blueprint_names): - """Return the blueprint with the exact modules and packages selected by depsolve - - **/api/v0/blueprints/freeze/<blueprint_names>** - - Return a JSON representation of the blueprint with the package and module versions set - to the exact versions chosen by depsolving the blueprint. - - Example:: - - { - "errors": [], - "blueprints": [ - { - "blueprint": { - "description": "An example GlusterFS server with samba", - "modules": [ - { - "name": "glusterfs", - "version": "3.8.4-18.4.el7.x86_64" - }, - { - "name": "glusterfs-cli", - "version": "3.8.4-18.4.el7.x86_64" - } - ], - "name": "glusterfs", - "packages": [ - { - "name": "ping", - "version": "2:3.2.1-2.el7.noarch" - }, - { - "name": "samba", - "version": "4.6.2-8.el7.x86_64" - } - ], - "version": "0.0.6" - } - } - ] - } - """ - if any(VALID_BLUEPRINT_NAME.match(blueprint_name) is None for blueprint_name in blueprint_names.split(',')): - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - branch = request.args.get("branch", "master") - if VALID_API_STRING.match(branch) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in branch argument"}]), 400 - - out_fmt = request.args.get("format", "json") - if VALID_API_STRING.match(out_fmt) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in format argument"}]), 400 - - blueprints = [] - errors = [] - for blueprint_name in [n.strip() for n in sorted(blueprint_names.split(","), key=lambda n: n.lower())]: - # get the blueprint - # Get the workspace version (if it exists) - blueprint = None - try: - with api.config["GITLOCK"].lock: - blueprint = workspace_read(api.config["GITLOCK"].repo, branch, blueprint_name) - except Exception: - pass - - if not blueprint: - # No workspace version, get the git version (if it exists) - try: - with api.config["GITLOCK"].lock: - blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) - except RecipeFileError as e: - # adding an error here would be redundant, skip it - log.error("(v0_blueprints_freeze) %s", str(e)) - except Exception as e: - errors.append({"id": BLUEPRINTS_ERROR, "msg": "%s: %s" % (blueprint_name, str(e))}) - log.error("(v0_blueprints_freeze) %s", str(e)) - - # No blueprint found, skip it. - if not blueprint: - errors.append({"id": UNKNOWN_BLUEPRINT, "msg": "%s: blueprint_not_found" % blueprint_name}) - continue - - # Combine modules and packages and depsolve the list - # TODO include the version/glob in the depsolving - module_nver = blueprint.module_nver - package_nver = blueprint.package_nver - projects = sorted(set(module_nver+package_nver), key=lambda p: p[0].lower()) - deps = [] - try: - with api.config["DNFLOCK"].lock: - deps = projects_depsolve(api.config["DNFLOCK"].dbo, projects, blueprint.group_names) - except ProjectsError as e: - errors.append({"id": BLUEPRINTS_ERROR, "msg": "%s: %s" % (blueprint_name, str(e))}) - log.error("(v0_blueprints_freeze) %s", str(e)) - - blueprints.append({"blueprint": blueprint.freeze(deps)}) - - if out_fmt == "toml": - # With TOML output we just want to dump the raw blueprint, skipping the rest. - return "\n\n".join([e["blueprint"].toml() for e in blueprints]) - else: - return jsonify(blueprints=blueprints, errors=errors)
      - -
      [docs]@v0_api.route("/blueprints/depsolve", defaults={'blueprint_names': ""}) -@v0_api.route("/blueprints/depsolve/<blueprint_names>") -@checkparams([("blueprint_names", "", "no blueprint names given")]) -def v0_blueprints_depsolve(blueprint_names): - """Return the dependencies for a blueprint - - **/api/v0/blueprints/depsolve/<blueprint_names>** - - Depsolve the blueprint using yum, return the blueprint used, and the NEVRAs of the packages - chosen to satisfy the blueprint's requirements. The response will include a list of results, - with the full dependency list in `dependencies`, the NEVRAs for the blueprint's direct modules - and packages in `modules`, and any error will be in `errors`. - - Example:: - - { - "errors": [], - "blueprints": [ - { - "dependencies": [ - { - "arch": "noarch", - "epoch": "0", - "name": "2ping", - "release": "2.el7", - "version": "3.2.1" - }, - { - "arch": "x86_64", - "epoch": "0", - "name": "acl", - "release": "12.el7", - "version": "2.2.51" - }, - { - "arch": "x86_64", - "epoch": "0", - "name": "audit-libs", - "release": "3.el7", - "version": "2.7.6" - }, - { - "arch": "x86_64", - "epoch": "0", - "name": "avahi-libs", - "release": "17.el7", - "version": "0.6.31" - }, - ... - ], - "modules": [ - { - "arch": "noarch", - "epoch": "0", - "name": "2ping", - "release": "2.el7", - "version": "3.2.1" - }, - { - "arch": "x86_64", - "epoch": "0", - "name": "glusterfs", - "release": "18.4.el7", - "version": "3.8.4" - }, - ... - ], - "blueprint": { - "description": "An example GlusterFS server with samba", - "modules": [ - { - "name": "glusterfs", - "version": "3.7.*" - }, - ... - } - } - ] - } - """ - if any(VALID_BLUEPRINT_NAME.match(blueprint_name) is None for blueprint_name in blueprint_names.split(',')): - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - branch = request.args.get("branch", "master") - if VALID_API_STRING.match(branch) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in branch argument"}]), 400 - - blueprints = [] - errors = [] - for blueprint_name in [n.strip() for n in sorted(blueprint_names.split(","), key=lambda n: n.lower())]: - # get the blueprint - # Get the workspace version (if it exists) - blueprint = None - try: - with api.config["GITLOCK"].lock: - blueprint = workspace_read(api.config["GITLOCK"].repo, branch, blueprint_name) - except Exception: - pass - - if not blueprint: - # No workspace version, get the git version (if it exists) - try: - with api.config["GITLOCK"].lock: - blueprint = read_recipe_commit(api.config["GITLOCK"].repo, branch, blueprint_name) - except RecipeFileError as e: - # adding an error here would be redundant, skip it - log.error("(v0_blueprints_depsolve) %s", str(e)) - except Exception as e: - errors.append({"id": BLUEPRINTS_ERROR, "msg": "%s: %s" % (blueprint_name, str(e))}) - log.error("(v0_blueprints_depsolve) %s", str(e)) - - # No blueprint found, skip it. - if not blueprint: - errors.append({"id": UNKNOWN_BLUEPRINT, "msg": "%s: blueprint not found" % blueprint_name}) - continue - - # Combine modules and packages and depsolve the list - # TODO include the version/glob in the depsolving - module_nver = blueprint.module_nver - package_nver = blueprint.package_nver - projects = sorted(set(module_nver+package_nver), key=lambda p: p[0].lower()) - deps = [] - try: - with api.config["DNFLOCK"].lock: - deps = projects_depsolve(api.config["DNFLOCK"].dbo, projects, blueprint.group_names) - except ProjectsError as e: - errors.append({"id": BLUEPRINTS_ERROR, "msg": "%s: %s" % (blueprint_name, str(e))}) - log.error("(v0_blueprints_depsolve) %s", str(e)) - - # Get the NEVRA's of the modules and projects, add as "modules" - modules = [] - for dep in deps: - if dep["name"] in projects: - modules.append(dep) - modules = sorted(modules, key=lambda m: m["name"].lower()) - - blueprints.append({"blueprint":blueprint, "dependencies":deps, "modules":modules}) - - return jsonify(blueprints=blueprints, errors=errors)
      - -
      [docs]@v0_api.route("/projects/list") -def v0_projects_list(): - """List all of the available projects/packages - - **/api/v0/projects/list[?offset=0&limit=20]** - - List all of the available projects. By default this returns the first 20 items, - but this can be changed by setting the `offset` and `limit` arguments. - - Example:: - - { - "limit": 20, - "offset": 0, - "projects": [ - { - "description": "0 A.D. (pronounced \"zero ey-dee\") is a ...", - "homepage": "http://play0ad.com", - "name": "0ad", - "summary": "Cross-Platform RTS Game of Ancient Warfare", - "upstream_vcs": "UPSTREAM_VCS" - }, - ... - ], - "total": 21770 - } - """ - try: - limit = int(request.args.get("limit", "20")) - offset = int(request.args.get("offset", "0")) - except ValueError as e: - return jsonify(status=False, errors=[{"id": BAD_LIMIT_OR_OFFSET, "msg": str(e)}]), 400 - - try: - with api.config["DNFLOCK"].lock: - available = projects_list(api.config["DNFLOCK"].dbo) - except ProjectsError as e: - log.error("(v0_projects_list) %s", str(e)) - return jsonify(status=False, errors=[{"id": PROJECTS_ERROR, "msg": str(e)}]), 400 - - projects = take_limits(available, offset, limit) - return jsonify(projects=projects, offset=offset, limit=limit, total=len(available))
      - -
      [docs]@v0_api.route("/projects/info", defaults={'project_names': ""}) -@v0_api.route("/projects/info/<project_names>") -@checkparams([("project_names", "", "no project names given")]) -def v0_projects_info(project_names): - """Return detailed information about the listed projects - - **/api/v0/projects/info/<project_names>** - - Return information about the comma-separated list of projects. It includes the description - of the package along with the list of available builds. - - Example:: - - { - "projects": [ - { - "builds": [ - { - "arch": "x86_64", - "build_config_ref": "BUILD_CONFIG_REF", - "build_env_ref": "BUILD_ENV_REF", - "build_time": "2017-03-01T08:39:23", - "changelog": "- restore incremental backups correctly, files ...", - "epoch": "2", - "metadata": {}, - "release": "32.el7", - "source": { - "license": "GPLv3+", - "metadata": {}, - "source_ref": "SOURCE_REF", - "version": "1.26" - } - } - ], - "description": "The GNU tar program saves many ...", - "homepage": "http://www.gnu.org/software/tar/", - "name": "tar", - "summary": "A GNU file archiving program", - "upstream_vcs": "UPSTREAM_VCS" - } - ] - } - """ - if VALID_API_STRING.match(project_names) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - try: - with api.config["DNFLOCK"].lock: - projects = projects_info(api.config["DNFLOCK"].dbo, project_names.split(",")) - except ProjectsError as e: - log.error("(v0_projects_info) %s", str(e)) - return jsonify(status=False, errors=[{"id": PROJECTS_ERROR, "msg": str(e)}]), 400 - - if not projects: - msg = "one of the requested projects does not exist: %s" % project_names - log.error("(v0_projects_info) %s", msg) - return jsonify(status=False, errors=[{"id": UNKNOWN_PROJECT, "msg": msg}]), 400 - - return jsonify(projects=projects)
      - -
      [docs]@v0_api.route("/projects/depsolve", defaults={'project_names': ""}) -@v0_api.route("/projects/depsolve/<project_names>") -@checkparams([("project_names", "", "no project names given")]) -def v0_projects_depsolve(project_names): - """Return detailed information about the listed projects - - **/api/v0/projects/depsolve/<project_names>** - - Depsolve the comma-separated list of projects and return the list of NEVRAs needed - to satisfy the request. - - Example:: - - { - "projects": [ - { - "arch": "noarch", - "epoch": "0", - "name": "basesystem", - "release": "7.el7", - "version": "10.0" - }, - { - "arch": "x86_64", - "epoch": "0", - "name": "bash", - "release": "28.el7", - "version": "4.2.46" - }, - { - "arch": "x86_64", - "epoch": "0", - "name": "filesystem", - "release": "21.el7", - "version": "3.2" - }, - ... - ] - } - """ - if VALID_API_STRING.match(project_names) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - try: - with api.config["DNFLOCK"].lock: - deps = projects_depsolve(api.config["DNFLOCK"].dbo, [(n, "*") for n in project_names.split(",")], []) - except ProjectsError as e: - log.error("(v0_projects_depsolve) %s", str(e)) - return jsonify(status=False, errors=[{"id": PROJECTS_ERROR, "msg": str(e)}]), 400 - - if not deps: - msg = "one of the requested projects does not exist: %s" % project_names - log.error("(v0_projects_depsolve) %s", msg) - return jsonify(status=False, errors=[{"id": UNKNOWN_PROJECT, "msg": msg}]), 400 - - return jsonify(projects=deps)
      - -
      [docs]@v0_api.route("/projects/source/list") -def v0_projects_source_list(): - """Return the list of source names - - **/api/v0/projects/source/list** - - Return the list of repositories used for depsolving and installing packages. - - Example:: - - { - "sources": [ - "fedora", - "fedora-cisco-openh264", - "fedora-updates-testing", - "fedora-updates" - ] - } - """ - with api.config["DNFLOCK"].lock: - repos = list(api.config["DNFLOCK"].dbo.repos.iter_enabled()) - sources = sorted([r.id for r in repos]) - return jsonify(sources=sources)
      - -
      [docs]@v0_api.route("/projects/source/info", defaults={'source_names': ""}) -@v0_api.route("/projects/source/info/<source_names>") -@checkparams([("source_names", "", "no source names given")]) -def v0_projects_source_info(source_names): - """Return detailed info about the list of sources - - **/api/v0/projects/source/info/<source-names>** - - Return information about the comma-separated list of source names. Or all of the - sources if '*' is passed. Note that general globbing is not supported, only '*'. - - immutable system sources will have the "system" field set to true. User added sources - will have it set to false. System sources cannot be changed or deleted. - - Example:: - - { - "errors": [], - "sources": { - "fedora": { - "check_gpg": true, - "check_ssl": true, - "gpgkey_urls": [ - "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-28-x86_64" - ], - "name": "fedora", - "proxy": "http://proxy.brianlane.com:8123", - "system": true, - "type": "yum-metalink", - "url": "https://mirrors.fedoraproject.org/metalink?repo=fedora-28&arch=x86_64" - } - } - } - """ - if VALID_API_STRING.match(source_names) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - out_fmt = request.args.get("format", "json") - if VALID_API_STRING.match(out_fmt) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in format argument"}]), 400 - - # Return info on all of the sources - if source_names == "*": - with api.config["DNFLOCK"].lock: - source_names = ",".join(r.id for r in api.config["DNFLOCK"].dbo.repos.iter_enabled()) - - sources = {} - errors = [] - system_sources = get_repo_sources("/etc/yum.repos.d/*.repo") - for source in source_names.split(","): - with api.config["DNFLOCK"].lock: - repo = api.config["DNFLOCK"].dbo.repos.get(source, None) - if not repo: - errors.append({"id": UNKNOWN_SOURCE, "msg": "%s is not a valid source" % source}) - continue - sources[repo.id] = repo_to_source(repo, repo.id in system_sources, api=0) - - if out_fmt == "toml" and not errors: - # With TOML output we just want to dump the raw sources, skipping the errors - return toml.dumps(sources) - elif out_fmt == "toml" and errors: - # TOML requested, but there was an error - return jsonify(status=False, errors=errors), 400 - else: - return jsonify(sources=sources, errors=errors)
      - -
      [docs]@v0_api.route("/projects/source/new", methods=["POST"]) -def v0_projects_source_new(): - """Add a new package source. Or change an existing one - - **POST /api/v0/projects/source/new** - - Add (or change) a source for use when depsolving blueprints and composing images. - - The ``proxy`` and ``gpgkey_urls`` entries are optional. All of the others are required. The supported - types for the urls are: - - * ``yum-baseurl`` is a URL to a yum repository. - * ``yum-mirrorlist`` is a URL for a mirrorlist. - * ``yum-metalink`` is a URL for a metalink. - - If ``check_ssl`` is true the https certificates must be valid. If they are self-signed you can either set - this to false, or add your Certificate Authority to the host system. - - If ``check_gpg`` is true the GPG key must either be installed on the host system, or ``gpgkey_urls`` - should point to it. - - You can edit an existing source (other than system sources), by doing a POST - of the new version of the source. It will overwrite the previous one. - - Example:: - - { - "name": "custom-source-1", - "url": "https://url/path/to/repository/", - "type": "yum-baseurl", - "check_ssl": true, - "check_gpg": true, - "gpgkey_urls": [ - "https://url/path/to/gpg-key" - ] - } - - - """ - if request.headers['Content-Type'] == "text/x-toml": - source = toml.loads(request.data) - else: - source = request.get_json(cache=False) - - system_sources = get_repo_sources("/etc/yum.repos.d/*.repo") - if source["name"] in system_sources: - return jsonify(status=False, errors=[{"id": SYSTEM_SOURCE, "msg": "%s is a system source, it cannot be changed." % source["name"]}]), 400 - - try: - # Remove it from the RepoDict (NOTE that this isn't explicitly supported by the DNF API) - with api.config["DNFLOCK"].lock: - repo_dir = api.config["COMPOSER_CFG"].get("composer", "repo_dir") - new_repo_source(api.config["DNFLOCK"].dbo, source["name"], source, repo_dir) - except Exception as e: - return jsonify(status=False, errors=[{"id": PROJECTS_ERROR, "msg": str(e)}]), 400 - - return jsonify(status=True)
      - -
      [docs]@v0_api.route("/projects/source/delete", defaults={'source_name': ""}, methods=["DELETE"]) -@v0_api.route("/projects/source/delete/<source_name>", methods=["DELETE"]) -@checkparams([("source_name", "", "no source name given")]) -def v0_projects_source_delete(source_name): - """Delete the named source and return a status response - - **DELETE /api/v0/projects/source/delete/<source-name>** - - Delete a user added source. This will fail if a system source is passed to - it. - - The response will be a status response with `status` set to true, or an - error response with it set to false and an error message included. - """ - if VALID_API_STRING.match(source_name) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - system_sources = get_repo_sources("/etc/yum.repos.d/*.repo") - if source_name in system_sources: - return jsonify(status=False, errors=[{"id": SYSTEM_SOURCE, "msg": "%s is a system source, it cannot be deleted." % source_name}]), 400 - share_dir = api.config["COMPOSER_CFG"].get("composer", "repo_dir") - try: - # Remove the file entry for the source - delete_repo_source(joinpaths(share_dir, "*.repo"), source_name) - - # Remove it from the RepoDict (NOTE that this isn't explicitly supported by the DNF API) - with api.config["DNFLOCK"].lock: - if source_name in api.config["DNFLOCK"].dbo.repos: - del api.config["DNFLOCK"].dbo.repos[source_name] - log.info("Updating repository metadata after removing %s", source_name) - api.config["DNFLOCK"].dbo.fill_sack(load_system_repo=False) - api.config["DNFLOCK"].dbo.read_comps() - - except ProjectsError as e: - log.error("(v0_projects_source_delete) %s", str(e)) - return jsonify(status=False, errors=[{"id": UNKNOWN_SOURCE, "msg": str(e)}]), 400 - - return jsonify(status=True)
      - -
      [docs]@v0_api.route("/modules/list") -@v0_api.route("/modules/list/<module_names>") -def v0_modules_list(module_names=None): - """List available modules, filtering by module_names - - **/api/v0/modules/list[?offset=0&limit=20]** - - Return a list of all of the available modules. This includes the name and the - group_type, which is always "rpm" for lorax-composer. By default this returns - the first 20 items. This can be changed by setting the `offset` and `limit` - arguments. - - Example:: - - { - "limit": 20, - "modules": [ - { - "group_type": "rpm", - "name": "0ad" - }, - { - "group_type": "rpm", - "name": "0ad-data" - }, - { - "group_type": "rpm", - "name": "0install" - }, - { - "group_type": "rpm", - "name": "2048-cli" - }, - ... - ] - "total": 21770 - } - - **/api/v0/modules/list/<module_names>[?offset=0&limit=20]** - - Return the list of comma-separated modules. Output is the same as `/modules/list` - - Example:: - - { - "limit": 20, - "modules": [ - { - "group_type": "rpm", - "name": "tar" - } - ], - "offset": 0, - "total": 1 - } - """ - if module_names and VALID_API_STRING.match(module_names) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - try: - limit = int(request.args.get("limit", "20")) - offset = int(request.args.get("offset", "0")) - except ValueError as e: - return jsonify(status=False, errors=[{"id": BAD_LIMIT_OR_OFFSET, "msg": str(e)}]), 400 - - if module_names: - module_names = module_names.split(",") - - try: - with api.config["DNFLOCK"].lock: - available = modules_list(api.config["DNFLOCK"].dbo, module_names) - except ProjectsError as e: - log.error("(v0_modules_list) %s", str(e)) - return jsonify(status=False, errors=[{"id": MODULES_ERROR, "msg": str(e)}]), 400 - - if module_names and not available: - msg = "one of the requested modules does not exist: %s" % module_names - log.error("(v0_modules_list) %s", msg) - return jsonify(status=False, errors=[{"id": UNKNOWN_MODULE, "msg": msg}]), 400 - - modules = take_limits(available, offset, limit) - return jsonify(modules=modules, offset=offset, limit=limit, total=len(available))
      - -
      [docs]@v0_api.route("/modules/info", defaults={'module_names': ""}) -@v0_api.route("/modules/info/<module_names>") -@checkparams([("module_names", "", "no module names given")]) -def v0_modules_info(module_names): - """Return detailed information about the listed modules - - **/api/v0/modules/info/<module_names>** - - Return the module's dependencies, and the information about the module. - - Example:: - - { - "modules": [ - { - "dependencies": [ - { - "arch": "noarch", - "epoch": "0", - "name": "basesystem", - "release": "7.el7", - "version": "10.0" - }, - { - "arch": "x86_64", - "epoch": "0", - "name": "bash", - "release": "28.el7", - "version": "4.2.46" - }, - ... - ], - "description": "The GNU tar program saves ...", - "homepage": "http://www.gnu.org/software/tar/", - "name": "tar", - "summary": "A GNU file archiving program", - "upstream_vcs": "UPSTREAM_VCS" - } - ] - } - """ - if VALID_API_STRING.match(module_names) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - try: - with api.config["DNFLOCK"].lock: - modules = modules_info(api.config["DNFLOCK"].dbo, module_names.split(",")) - except ProjectsError as e: - log.error("(v0_modules_info) %s", str(e)) - return jsonify(status=False, errors=[{"id": MODULES_ERROR, "msg": str(e)}]), 400 - - if not modules: - msg = "one of the requested modules does not exist: %s" % module_names - log.error("(v0_modules_info) %s", msg) - return jsonify(status=False, errors=[{"id": UNKNOWN_MODULE, "msg": msg}]), 400 - - return jsonify(modules=modules)
      - -
      [docs]@v0_api.route("/compose", methods=["POST"]) -def v0_compose_start(): - """Start a compose - - The body of the post should have these fields: - blueprint_name - The blueprint name from /blueprints/list/ - compose_type - The type of output to create, from /compose/types - branch - Optional, defaults to master, selects the git branch to use for the blueprint. - - **POST /api/v0/compose** - - Start a compose. The content type should be 'application/json' and the body of the POST - should look like this - - Example:: - - { - "blueprint_name": "http-server", - "compose_type": "tar", - "branch": "master" - } - - Pass it the name of the blueprint, the type of output (from '/api/v0/compose/types'), and the - blueprint branch to use. 'branch' is optional and will default to master. It will create a new - build and add it to the queue. It returns the build uuid and a status if it succeeds - - Example:: - - { - "build_id": "e6fa6db4-9c81-4b70-870f-a697ca405cdf", - "status": true - } - """ - # Passing ?test=1 will generate a fake FAILED compose. - # Passing ?test=2 will generate a fake FINISHED compose. - try: - test_mode = int(request.args.get("test", "0")) - except ValueError: - test_mode = 0 - - compose = request.get_json(cache=False) - - errors = [] - if not compose: - return jsonify(status=False, errors=[{"id": MISSING_POST, "msg": "Missing POST body"}]), 400 - - if "blueprint_name" not in compose: - errors.append({"id": UNKNOWN_BLUEPRINT,"msg": "No 'blueprint_name' in the JSON request"}) - else: - blueprint_name = compose["blueprint_name"] - - if "branch" not in compose or not compose["branch"]: - branch = "master" - else: - branch = compose["branch"] - - if "compose_type" not in compose: - errors.append({"id": BAD_COMPOSE_TYPE, "msg": "No 'compose_type' in the JSON request"}) - else: - compose_type = compose["compose_type"] - - if VALID_BLUEPRINT_NAME.match(blueprint_name) is None: - errors.append({"id": INVALID_CHARS, "msg": "Invalid characters in API path"}) - - if not blueprint_exists(api, branch, blueprint_name): - errors.append({"id": UNKNOWN_BLUEPRINT, "msg": "Unknown blueprint name: %s" % blueprint_name}) - - if errors: - return jsonify(status=False, errors=errors), 400 - - try: - build_id = start_build(api.config["COMPOSER_CFG"], api.config["DNFLOCK"], api.config["GITLOCK"], - branch, blueprint_name, compose_type, test_mode) - except Exception as e: - if "Invalid compose type" in str(e): - return jsonify(status=False, errors=[{"id": BAD_COMPOSE_TYPE, "msg": str(e)}]), 400 - else: - return jsonify(status=False, errors=[{"id": BUILD_FAILED, "msg": str(e)}]), 400 - - return jsonify(status=True, build_id=build_id)
      - -
      [docs]@v0_api.route("/compose/types") -def v0_compose_types(): - """Return the list of enabled output types - - (only enabled types are returned) - - **/api/v0/compose/types** - - Returns the list of supported output types that are valid for use with 'POST /api/v0/compose' - - Example:: - - { - "types": [ - { - "enabled": true, - "name": "tar" - } - ] - } - """ - share_dir = api.config["COMPOSER_CFG"].get("composer", "share_dir") - return jsonify(types=[{"name": t, "enabled": e} for t, e in compose_types(share_dir)])
      - -
      [docs]@v0_api.route("/compose/queue") -def v0_compose_queue(): - """Return the status of the new and running queues - - **/api/v0/compose/queue** - - Return the status of the build queue. It includes information about the builds waiting, - and the build that is running. - - Example:: - - { - "new": [ - { - "id": "45502a6d-06e8-48a5-a215-2b4174b3614b", - "blueprint": "glusterfs", - "queue_status": "WAITING", - "job_created": 1517362647.4570868, - "version": "0.0.6" - }, - { - "id": "6d292bd0-bec7-4825-8d7d-41ef9c3e4b73", - "blueprint": "kubernetes", - "queue_status": "WAITING", - "job_created": 1517362659.0034983, - "version": "0.0.1" - } - ], - "run": [ - { - "id": "745712b2-96db-44c0-8014-fe925c35e795", - "blueprint": "glusterfs", - "queue_status": "RUNNING", - "job_created": 1517362633.7965999, - "job_started": 1517362633.8001345, - "version": "0.0.6" - } - ] - } - """ - return jsonify(queue_status(api.config["COMPOSER_CFG"], api=0))
      - -
      [docs]@v0_api.route("/compose/finished") -def v0_compose_finished(): - """Return the list of finished composes - - **/api/v0/compose/finished** - - Return the details on all of the finished composes on the system. - - Example:: - - { - "finished": [ - { - "id": "70b84195-9817-4b8a-af92-45e380f39894", - "blueprint": "glusterfs", - "queue_status": "FINISHED", - "job_created": 1517351003.8210032, - "job_started": 1517351003.8230415, - "job_finished": 1517359234.1003145, - "version": "0.0.6" - }, - { - "id": "e695affd-397f-4af9-9022-add2636e7459", - "blueprint": "glusterfs", - "queue_status": "FINISHED", - "job_created": 1517362289.7193348, - "job_started": 1517362289.9751132, - "job_finished": 1517363500.1234567, - "version": "0.0.6" - } - ] - } - """ - return jsonify(finished=build_status(api.config["COMPOSER_CFG"], "FINISHED", api=0))
      - -
      [docs]@v0_api.route("/compose/failed") -def v0_compose_failed(): - """Return the list of failed composes - - **/api/v0/compose/failed** - - Return the details on all of the failed composes on the system. - - Example:: - - { - "failed": [ - { - "id": "8c8435ef-d6bd-4c68-9bf1-a2ef832e6b1a", - "blueprint": "http-server", - "queue_status": "FAILED", - "job_created": 1517523249.9301329, - "job_started": 1517523249.9314211, - "job_finished": 1517523255.5623411, - "version": "0.0.2" - } - ] - } - """ - return jsonify(failed=build_status(api.config["COMPOSER_CFG"], "FAILED", api=0))
      - -
      [docs]@v0_api.route("/compose/status", defaults={'uuids': ""}) -@v0_api.route("/compose/status/<uuids>") -@checkparams([("uuids", "", "no UUIDs given")]) -def v0_compose_status(uuids): - """Return the status of the listed uuids - - **/api/v0/compose/status/<uuids>[?blueprint=<blueprint_name>&status=<compose_status>&type=<compose_type>]** - - Return the details for each of the comma-separated list of uuids. A uuid of '*' will return - details for all composes. - - Example:: - - { - "uuids": [ - { - "id": "8c8435ef-d6bd-4c68-9bf1-a2ef832e6b1a", - "blueprint": "http-server", - "queue_status": "FINISHED", - "job_created": 1517523644.2384307, - "job_started": 1517523644.2551234, - "job_finished": 1517523689.9864314, - "version": "0.0.2" - }, - { - "id": "45502a6d-06e8-48a5-a215-2b4174b3614b", - "blueprint": "glusterfs", - "queue_status": "FINISHED", - "job_created": 1517363442.188399, - "job_started": 1517363442.325324, - "job_finished": 1517363451.653621, - "version": "0.0.6" - } - ] - } - """ - if VALID_API_STRING.match(uuids) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - blueprint = request.args.get("blueprint", None) - status = request.args.get("status", None) - compose_type = request.args.get("type", None) - - # Check the arguments for invalid characters - for a in [blueprint, status, compose_type]: - if a is not None and VALID_API_STRING.match(a) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - results = [] - errors = [] - - if uuids.strip() == '*': - queue_status_dict = queue_status(api.config["COMPOSER_CFG"], api=0) - queue_new = queue_status_dict["new"] - queue_running = queue_status_dict["run"] - candidates = queue_new + queue_running + build_status(api.config["COMPOSER_CFG"], api=0) - else: - candidates = [] - for uuid in [n.strip().lower() for n in uuids.split(",")]: - details = uuid_status(api.config["COMPOSER_CFG"], uuid, api=0) - if details is None: - errors.append({"id": UNKNOWN_UUID, "msg": "%s is not a valid build uuid" % uuid}) - else: - candidates.append(details) - - for details in candidates: - if blueprint is not None and details['blueprint'] != blueprint: - continue - - if status is not None and details['queue_status'] != status: - continue - - if compose_type is not None and details['compose_type'] != compose_type: - continue - - results.append(details) - - return jsonify(uuids=results, errors=errors)
      - -
      [docs]@v0_api.route("/compose/cancel", defaults={'uuid': ""}, methods=["DELETE"]) -@v0_api.route("/compose/cancel/<uuid>", methods=["DELETE"]) -@checkparams([("uuid", "", "no UUID given")]) -def v0_compose_cancel(uuid): - """Cancel a running compose and delete its results directory - - **DELETE /api/v0/compose/cancel/<uuid>** - - Cancel the build, if it is not finished, and delete the results. It will return a - status of True if it is successful. - - Example:: - - { - "status": true, - "uuid": "03397f8d-acff-4cdb-bd31-f629b7a948f5" - } - """ - if VALID_API_STRING.match(uuid) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - status = uuid_status(api.config["COMPOSER_CFG"], uuid, api=0) - if status is None: - return jsonify(status=False, errors=[{"id": UNKNOWN_UUID, "msg": "%s is not a valid build uuid" % uuid}]), 400 - - if status["queue_status"] not in ["WAITING", "RUNNING"]: - return jsonify(status=False, errors=[{"id": BUILD_IN_WRONG_STATE, "msg": "Build %s is not in WAITING or RUNNING." % uuid}]) - - try: - uuid_cancel(api.config["COMPOSER_CFG"], uuid) - except Exception as e: - return jsonify(status=False, errors=[{"id": COMPOSE_ERROR, "msg": "%s: %s" % (uuid, str(e))}]),400 - else: - return jsonify(status=True, uuid=uuid)
      - -
      [docs]@v0_api.route("/compose/delete", defaults={'uuids': ""}, methods=["DELETE"]) -@v0_api.route("/compose/delete/<uuids>", methods=["DELETE"]) -@checkparams([("uuids", "", "no UUIDs given")]) -def v0_compose_delete(uuids): - """Delete the compose results for the listed uuids - - **DELETE /api/v0/compose/delete/<uuids>** - - Delete the list of comma-separated uuids from the compose results. - - Example:: - - { - "errors": [], - "uuids": [ - { - "status": true, - "uuid": "ae1bf7e3-7f16-4c9f-b36e-3726a1093fd0" - } - ] - } - """ - if VALID_API_STRING.match(uuids) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - results = [] - errors = [] - for uuid in [n.strip().lower() for n in uuids.split(",")]: - status = uuid_status(api.config["COMPOSER_CFG"], uuid, api=0) - if status is None: - errors.append({"id": UNKNOWN_UUID, "msg": "%s is not a valid build uuid" % uuid}) - elif status["queue_status"] not in ["FINISHED", "FAILED"]: - errors.append({"id": BUILD_IN_WRONG_STATE, "msg": "Build %s is not in FINISHED or FAILED." % uuid}) - else: - try: - uuid_delete(api.config["COMPOSER_CFG"], uuid) - except Exception as e: - errors.append({"id": COMPOSE_ERROR, "msg": "%s: %s" % (uuid, str(e))}) - else: - results.append({"uuid":uuid, "status":True}) - return jsonify(uuids=results, errors=errors)
      - -
      [docs]@v0_api.route("/compose/info", defaults={'uuid': ""}) -@v0_api.route("/compose/info/<uuid>") -@checkparams([("uuid", "", "no UUID given")]) -def v0_compose_info(uuid): - """Return detailed info about a compose - - **/api/v0/compose/info/<uuid>** - - Get detailed information about the compose. The returned JSON string will - contain the following information: - - * id - The uuid of the comoposition - * config - containing the configuration settings used to run Anaconda - * blueprint - The depsolved blueprint used to generate the kickstart - * commit - The (local) git commit hash for the blueprint used - * deps - The NEVRA of all of the dependencies used in the composition - * compose_type - The type of output generated (tar, iso, etc.) - * queue_status - The final status of the composition (FINISHED or FAILED) - - Example:: - - { - "commit": "7078e521a54b12eae31c3fd028680da7a0815a4d", - "compose_type": "tar", - "config": { - "anaconda_args": "", - "armplatform": "", - "compress_args": [], - "compression": "xz", - "image_name": "root.tar.xz", - ... - }, - "deps": { - "packages": [ - { - "arch": "x86_64", - "epoch": "0", - "name": "acl", - "release": "14.el7", - "version": "2.2.51" - } - ] - }, - "id": "c30b7d80-523b-4a23-ad52-61b799739ce8", - "queue_status": "FINISHED", - "blueprint": { - "description": "An example kubernetes master", - ... - } - } - """ - if VALID_API_STRING.match(uuid) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - try: - info = uuid_info(api.config["COMPOSER_CFG"], uuid, api=0) - except Exception as e: - return jsonify(status=False, errors=[{"id": COMPOSE_ERROR, "msg": str(e)}]), 400 - - if info is None: - return jsonify(status=False, errors=[{"id": UNKNOWN_UUID, "msg": "%s is not a valid build uuid" % uuid}]), 400 - else: - return jsonify(**info)
      - -
      [docs]@v0_api.route("/compose/metadata", defaults={'uuid': ""}) -@v0_api.route("/compose/metadata/<uuid>") -@checkparams([("uuid","", "no UUID given")]) -def v0_compose_metadata(uuid): - """Return a tar of the metadata for the build - - **/api/v0/compose/metadata/<uuid>** - - Returns a .tar of the metadata used for the build. This includes all the - information needed to reproduce the build, including the final kickstart - populated with repository and package NEVRA. - - The mime type is set to 'application/x-tar' and the filename is set to - UUID-metadata.tar - - The .tar is uncompressed, but is not large. - """ - if VALID_API_STRING.match(uuid) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - status = uuid_status(api.config["COMPOSER_CFG"], uuid, api=0) - if status is None: - return jsonify(status=False, errors=[{"id": UNKNOWN_UUID, "msg": "%s is not a valid build uuid" % uuid}]), 400 - if status["queue_status"] not in ["FINISHED", "FAILED"]: - return jsonify(status=False, errors=[{"id": BUILD_IN_WRONG_STATE, "msg": "Build %s not in FINISHED or FAILED state." % uuid}]), 400 - else: - return Response(uuid_tar(api.config["COMPOSER_CFG"], uuid, metadata=True, image=False, logs=False), - mimetype="application/x-tar", - headers=[("Content-Disposition", "attachment; filename=%s-metadata.tar;" % uuid)], - direct_passthrough=True)
      - -
      [docs]@v0_api.route("/compose/results", defaults={'uuid': ""}) -@v0_api.route("/compose/results/<uuid>") -@checkparams([("uuid","", "no UUID given")]) -def v0_compose_results(uuid): - """Return a tar of the metadata and the results for the build - - **/api/v0/compose/results/<uuid>** - - Returns a .tar of the metadata, logs, and output image of the build. This - includes all the information needed to reproduce the build, including the - final kickstart populated with repository and package NEVRA. The output image - is already in compressed form so the returned tar is not compressed. - - The mime type is set to 'application/x-tar' and the filename is set to - UUID.tar - """ - if VALID_API_STRING.match(uuid) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - status = uuid_status(api.config["COMPOSER_CFG"], uuid, api=0) - if status is None: - return jsonify(status=False, errors=[{"id": UNKNOWN_UUID, "msg": "%s is not a valid build uuid" % uuid}]), 400 - elif status["queue_status"] not in ["FINISHED", "FAILED"]: - return jsonify(status=False, errors=[{"id": BUILD_IN_WRONG_STATE, "msg": "Build %s not in FINISHED or FAILED state." % uuid}]), 400 - else: - return Response(uuid_tar(api.config["COMPOSER_CFG"], uuid, metadata=True, image=True, logs=True), - mimetype="application/x-tar", - headers=[("Content-Disposition", "attachment; filename=%s.tar;" % uuid)], - direct_passthrough=True)
      - -
      [docs]@v0_api.route("/compose/logs", defaults={'uuid': ""}) -@v0_api.route("/compose/logs/<uuid>") -@checkparams([("uuid","", "no UUID given")]) -def v0_compose_logs(uuid): - """Return a tar of the metadata for the build - - **/api/v0/compose/logs/<uuid>** - - Returns a .tar of the anaconda build logs. The tar is not compressed, but is - not large. - - The mime type is set to 'application/x-tar' and the filename is set to - UUID-logs.tar - """ - if VALID_API_STRING.match(uuid) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - status = uuid_status(api.config["COMPOSER_CFG"], uuid, api=0) - if status is None: - return jsonify(status=False, errors=[{"id": UNKNOWN_UUID, "msg": "%s is not a valid build uuid" % uuid}]), 400 - elif status["queue_status"] not in ["FINISHED", "FAILED"]: - return jsonify(status=False, errors=[{"id": BUILD_IN_WRONG_STATE, "msg": "Build %s not in FINISHED or FAILED state." % uuid}]), 400 - else: - return Response(uuid_tar(api.config["COMPOSER_CFG"], uuid, metadata=False, image=False, logs=True), - mimetype="application/x-tar", - headers=[("Content-Disposition", "attachment; filename=%s-logs.tar;" % uuid)], - direct_passthrough=True)
      - -
      [docs]@v0_api.route("/compose/image", defaults={'uuid': ""}) -@v0_api.route("/compose/image/<uuid>") -@checkparams([("uuid","", "no UUID given")]) -def v0_compose_image(uuid): - """Return the output image for the build - - **/api/v0/compose/image/<uuid>** - - Returns the output image from the build. The filename is set to the filename - from the build with the UUID as a prefix. eg. UUID-root.tar.xz or UUID-boot.iso. - """ - if VALID_API_STRING.match(uuid) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - status = uuid_status(api.config["COMPOSER_CFG"], uuid, api=0) - if status is None: - return jsonify(status=False, errors=[{"id": UNKNOWN_UUID, "msg": "%s is not a valid build uuid" % uuid}]), 400 - elif status["queue_status"] not in ["FINISHED", "FAILED"]: - return jsonify(status=False, errors=[{"id": BUILD_IN_WRONG_STATE, "msg": "Build %s not in FINISHED or FAILED state." % uuid}]), 400 - else: - image_name, image_path = uuid_image(api.config["COMPOSER_CFG"], uuid) - - # Make sure it really exists - if not os.path.exists(image_path): - return jsonify(status=False, errors=[{"id": BUILD_MISSING_FILE, "msg": "Build %s is missing image file %s" % (uuid, image_name)}]), 400 - - # Make the image name unique - image_name = uuid + "-" + image_name - # XXX - Will mime type guessing work for all our output? - return send_file(image_path, as_attachment=True, attachment_filename=image_name, add_etags=False)
      - -
      [docs]@v0_api.route("/compose/log", defaults={'uuid': ""}) -@v0_api.route("/compose/log/<uuid>") -@checkparams([("uuid","", "no UUID given")]) -def v0_compose_log_tail(uuid): - """Return the tail of the most currently relevant log - - **/api/v0/compose/log/<uuid>[?size=KiB]** - - Returns the end of either the anaconda log, the packaging log, or the - composer logs, depending on the progress of the compose. The size - parameter is optional and defaults to 1 MiB if it is not included. The - returned data is raw text from the end of the log file, starting on a - line boundary. - - Example:: - - 12:59:24,222 INFO anaconda: Running Thread: AnaConfigurationThread (140629395244800) - 12:59:24,223 INFO anaconda: Configuring installed system - 12:59:24,912 INFO anaconda: Configuring installed system - 12:59:24,912 INFO anaconda: Creating users - 12:59:24,913 INFO anaconda: Clearing libuser.conf at /tmp/libuser.Dyy8Gj - 12:59:25,154 INFO anaconda: Creating users - 12:59:25,155 INFO anaconda: Configuring addons - 12:59:25,155 INFO anaconda: Configuring addons - 12:59:25,155 INFO anaconda: Generating initramfs - 12:59:49,467 INFO anaconda: Generating initramfs - 12:59:49,467 INFO anaconda: Running post-installation scripts - 12:59:49,467 INFO anaconda: Running kickstart %%post script(s) - 12:59:50,782 INFO anaconda: All kickstart %%post script(s) have been run - 12:59:50,782 INFO anaconda: Running post-installation scripts - 12:59:50,784 INFO anaconda: Thread Done: AnaConfigurationThread (140629395244800) - """ - if VALID_API_STRING.match(uuid) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - try: - size = int(request.args.get("size", "1024")) - except ValueError as e: - return jsonify(status=False, errors=[{"id": COMPOSE_ERROR, "msg": str(e)}]), 400 - - status = uuid_status(api.config["COMPOSER_CFG"], uuid, api=0) - if status is None: - return jsonify(status=False, errors=[{"id": UNKNOWN_UUID, "msg": "%s is not a valid build uuid" % uuid}]), 400 - elif status["queue_status"] == "WAITING": - return jsonify(status=False, errors=[{"id": BUILD_IN_WRONG_STATE, "msg": "Build %s has not started yet. No logs to view" % uuid}]) - try: - return Response(uuid_log(api.config["COMPOSER_CFG"], uuid, size), direct_passthrough=True) - except RuntimeError as e: - return jsonify(status=False, errors=[{"id": COMPOSE_ERROR, "msg": str(e)}]), 400
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/v1.html b/docs/html/_modules/pylorax/api/v1.html deleted file mode 100644 index c8bf8eb0..00000000 --- a/docs/html/_modules/pylorax/api/v1.html +++ /dev/null @@ -1,1242 +0,0 @@ - - - - - - - - - - - pylorax.api.v1 — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.v1

      -#
      -# Copyright (C) 2019  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -""" Setup v1 of the API server
      -
      -"""
      -import logging
      -log = logging.getLogger("lorax-composer")
      -
      -from flask import jsonify, request
      -from flask import current_app as api
      -
      -from lifted.queue import get_upload, reset_upload, cancel_upload, delete_upload
      -from lifted.providers import list_providers, resolve_provider, load_profiles, validate_settings, save_settings
      -from lifted.providers import load_settings, delete_profile
      -from pylorax.api.checkparams import checkparams
      -from pylorax.api.compose import start_build
      -from pylorax.api.errors import BAD_COMPOSE_TYPE, BUILD_FAILED, INVALID_CHARS, MISSING_POST, PROJECTS_ERROR
      -from pylorax.api.errors import SYSTEM_SOURCE, UNKNOWN_BLUEPRINT, UNKNOWN_SOURCE, UNKNOWN_UUID, UPLOAD_ERROR
      -from pylorax.api.errors import COMPOSE_ERROR
      -from pylorax.api.flask_blueprint import BlueprintSkip
      -from pylorax.api.queue import queue_status, build_status, uuid_status, uuid_schedule_upload, uuid_remove_upload
      -from pylorax.api.queue import uuid_info
      -from pylorax.api.projects import get_repo_sources, repo_to_source
      -from pylorax.api.projects import new_repo_source
      -from pylorax.api.regexes import VALID_API_STRING, VALID_BLUEPRINT_NAME
      -import pylorax.api.toml as toml
      -from pylorax.api.utils import blueprint_exists
      -
      -
      -# Create the v1 routes Blueprint with skip_routes support
      -v1_api = BlueprintSkip("v1_routes", __name__)
      -
      -
      [docs]@v1_api.route("/projects/source/info", defaults={'source_ids': ""}) -@v1_api.route("/projects/source/info/<source_ids>") -@checkparams([("source_ids", "", "no source names given")]) -def v1_projects_source_info(source_ids): - """Return detailed info about the list of sources - - **/api/v1/projects/source/info/<source-ids>** - - Return information about the comma-separated list of source ids. Or all of the - sources if '*' is passed. Note that general globbing is not supported, only '*'. - - Immutable system sources will have the "system" field set to true. User added sources - will have it set to false. System sources cannot be changed or deleted. - - Example:: - - { - "errors": [], - "sources": { - "fedora": { - "check_gpg": true, - "check_ssl": true, - "gpgkey_urls": [ - "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-28-x86_64" - ], - "id": "fedora", - "name": "Fedora $releasever - $basearch", - "proxy": "http://proxy.brianlane.com:8123", - "system": true, - "type": "yum-metalink", - "url": "https://mirrors.fedoraproject.org/metalink?repo=fedora-28&arch=x86_64" - } - } - } - - In v0 the ``name`` field was used for the id (a short name for the repo). In v1 ``name`` changed - to ``id`` and ``name`` is now used for the longer descriptive name of the repository. - """ - if VALID_API_STRING.match(source_ids) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - out_fmt = request.args.get("format", "json") - if VALID_API_STRING.match(out_fmt) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in format argument"}]), 400 - - # Return info on all of the sources - if source_ids == "*": - with api.config["DNFLOCK"].lock: - source_ids = ",".join(r.id for r in api.config["DNFLOCK"].dbo.repos.iter_enabled()) - - sources = {} - errors = [] - system_sources = get_repo_sources("/etc/yum.repos.d/*.repo") - for source in source_ids.split(","): - with api.config["DNFLOCK"].lock: - repo = api.config["DNFLOCK"].dbo.repos.get(source, None) - if not repo: - errors.append({"id": UNKNOWN_SOURCE, "msg": "%s is not a valid source" % source}) - continue - sources[repo.id] = repo_to_source(repo, repo.id in system_sources, api=1) - - if out_fmt == "toml" and not errors: - # With TOML output we just want to dump the raw sources, skipping the errors - return toml.dumps(sources) - elif out_fmt == "toml" and errors: - # TOML requested, but there was an error - return jsonify(status=False, errors=errors), 400 - else: - return jsonify(sources=sources, errors=errors)
      - -
      [docs]@v1_api.route("/projects/source/new", methods=["POST"]) -def v1_projects_source_new(): - """Add a new package source. Or change an existing one - - **POST /api/v1/projects/source/new** - - Add (or change) a source for use when depsolving blueprints and composing images. - - The ``proxy`` and ``gpgkey_urls`` entries are optional. All of the others are required. The supported - types for the urls are: - - * ``yum-baseurl`` is a URL to a yum repository. - * ``yum-mirrorlist`` is a URL for a mirrorlist. - * ``yum-metalink`` is a URL for a metalink. - - If ``check_ssl`` is true the https certificates must be valid. If they are self-signed you can either set - this to false, or add your Certificate Authority to the host system. - - If ``check_gpg`` is true the GPG key must either be installed on the host system, or ``gpgkey_urls`` - should point to it. - - You can edit an existing source (other than system sources), by doing a POST - of the new version of the source. It will overwrite the previous one. - - Example:: - - { - "id": "custom-source-1", - "name": "Custom Package Source #1", - "url": "https://url/path/to/repository/", - "type": "yum-baseurl", - "check_ssl": true, - "check_gpg": true, - "gpgkey_urls": [ - "https://url/path/to/gpg-key" - ] - } - - In v0 the ``name`` field was used for the id (a short name for the repo). In v1 ``name`` changed - to ``id`` and ``name`` is now used for the longer descriptive name of the repository. - """ - if request.headers['Content-Type'] == "text/x-toml": - source = toml.loads(request.data) - else: - source = request.get_json(cache=False) - - # Check for id in source, return error if not - if "id" not in source: - return jsonify(status=False, errors=[{"id": UNKNOWN_SOURCE, "msg": "'id' field is missing from API v1 request."}]), 400 - - system_sources = get_repo_sources("/etc/yum.repos.d/*.repo") - if source["id"] in system_sources: - return jsonify(status=False, errors=[{"id": SYSTEM_SOURCE, "msg": "%s is a system source, it cannot be changed." % source["id"]}]), 400 - - try: - # Remove it from the RepoDict (NOTE that this isn't explicitly supported by the DNF API) - with api.config["DNFLOCK"].lock: - repo_dir = api.config["COMPOSER_CFG"].get("composer", "repo_dir") - new_repo_source(api.config["DNFLOCK"].dbo, source["id"], source, repo_dir) - except Exception as e: - return jsonify(status=False, errors=[{"id": PROJECTS_ERROR, "msg": str(e)}]), 400 - - return jsonify(status=True)
      - -
      [docs]@v1_api.route("/compose", methods=["POST"]) -def v1_compose_start(): - """Start a compose - - The body of the post should have these fields: - blueprint_name - The blueprint name from /blueprints/list/ - compose_type - The type of output to create, from /compose/types - branch - Optional, defaults to master, selects the git branch to use for the blueprint. - - **POST /api/v1/compose** - - Start a compose. The content type should be 'application/json' and the body of the POST - should look like this. The "upload" object is optional. - - The upload object can specify either a pre-existing profile to use (as returned by - `/uploads/providers`) or one-time use settings for the provider. - - Example with upload profile:: - - { - "blueprint_name": "http-server", - "compose_type": "tar", - "branch": "master", - "upload": { - "image_name": "My Image", - "provider": "azure", - "profile": "production-azure-settings" - } - } - - Example with upload settings:: - - { - "blueprint_name": "http-server", - "compose_type": "tar", - "branch": "master", - "upload": { - "image_name": "My Image", - "provider": "azure", - "settings": { - "resource_group": "SOMEBODY", - "storage_account_name": "ONCE", - "storage_container": "TOLD", - "location": "ME", - "subscription_id": "THE", - "client_id": "WORLD", - "secret": "IS", - "tenant": "GONNA" - } - } - } - - Pass it the name of the blueprint, the type of output (from - '/api/v1/compose/types'), and the blueprint branch to use. 'branch' is - optional and will default to master. It will create a new build and add - it to the queue. It returns the build uuid and a status if it succeeds. - If an "upload" is given, it will schedule an upload to run when the build - finishes. - - Example response:: - - { - "build_id": "e6fa6db4-9c81-4b70-870f-a697ca405cdf", - "upload_id": "572eb0d0-5348-4600-9666-14526ba628bb", - "status": true - } - """ - # Passing ?test=1 will generate a fake FAILED compose. - # Passing ?test=2 will generate a fake FINISHED compose. - try: - test_mode = int(request.args.get("test", "0")) - except ValueError: - test_mode = 0 - - compose = request.get_json(cache=False) - - errors = [] - if not compose: - return jsonify(status=False, errors=[{"id": MISSING_POST, "msg": "Missing POST body"}]), 400 - - if "blueprint_name" not in compose: - errors.append({"id": UNKNOWN_BLUEPRINT, "msg": "No 'blueprint_name' in the JSON request"}) - else: - blueprint_name = compose["blueprint_name"] - - if "branch" not in compose or not compose["branch"]: - branch = "master" - else: - branch = compose["branch"] - - if "compose_type" not in compose: - errors.append({"id": BAD_COMPOSE_TYPE, "msg": "No 'compose_type' in the JSON request"}) - else: - compose_type = compose["compose_type"] - - if VALID_BLUEPRINT_NAME.match(blueprint_name) is None: - errors.append({"id": INVALID_CHARS, "msg": "Invalid characters in API path"}) - - if not blueprint_exists(api, branch, blueprint_name): - errors.append({"id": UNKNOWN_BLUEPRINT, "msg": "Unknown blueprint name: %s" % blueprint_name}) - - if "upload" in compose: - try: - image_name = compose["upload"]["image_name"] - - if "profile" in compose["upload"]: - # Load a specific profile for this provider - profile = compose["upload"]["profile"] - provider_name = compose["upload"]["provider"] - settings = load_settings(api.config["COMPOSER_CFG"]["upload"], provider_name, profile) - else: - provider_name = compose["upload"]["provider"] - settings = compose["upload"]["settings"] - except KeyError as e: - errors.append({"id": UPLOAD_ERROR, "msg": f'Missing parameter {str(e)}!'}) - try: - provider = resolve_provider(api.config["COMPOSER_CFG"]["upload"], provider_name) - if "supported_types" in provider and compose_type not in provider["supported_types"]: - raise RuntimeError(f'Type "{compose_type}" is not supported by provider "{provider_name}"!') - validate_settings(api.config["COMPOSER_CFG"]["upload"], provider_name, settings, image_name) - except Exception as e: - errors.append({"id": UPLOAD_ERROR, "msg": str(e)}) - - if errors: - return jsonify(status=False, errors=errors), 400 - - try: - build_id = start_build(api.config["COMPOSER_CFG"], api.config["DNFLOCK"], api.config["GITLOCK"], - branch, blueprint_name, compose_type, test_mode) - except Exception as e: - if "Invalid compose type" in str(e): - return jsonify(status=False, errors=[{"id": BAD_COMPOSE_TYPE, "msg": str(e)}]), 400 - else: - return jsonify(status=False, errors=[{"id": BUILD_FAILED, "msg": str(e)}]), 400 - - if "upload" in compose: - upload_id = uuid_schedule_upload( - api.config["COMPOSER_CFG"], - build_id, - provider_name, - image_name, - settings - ) - else: - upload_id = "" - - return jsonify(status=True, build_id=build_id, upload_id=upload_id)
      - -
      [docs]@v1_api.route("/compose/queue") -def v1_compose_queue(): - """Return the status of the new and running queues - - **/api/v1/compose/queue** - - Return the status of the build queue. It includes information about the builds waiting, - and the build that is running. - - Example:: - - { - "new": [ - { - "id": "45502a6d-06e8-48a5-a215-2b4174b3614b", - "blueprint": "glusterfs", - "queue_status": "WAITING", - "job_created": 1517362647.4570868, - "version": "0.0.6" - }, - { - "id": "6d292bd0-bec7-4825-8d7d-41ef9c3e4b73", - "blueprint": "kubernetes", - "queue_status": "WAITING", - "job_created": 1517362659.0034983, - "version": "0.0.1" - } - ], - "run": [ - { - "id": "745712b2-96db-44c0-8014-fe925c35e795", - "blueprint": "glusterfs", - "queue_status": "RUNNING", - "job_created": 1517362633.7965999, - "job_started": 1517362633.8001345, - "version": "0.0.6", - "uploads": [ - { - "creation_time": 1568150660.524401, - "image_name": "glusterfs server", - "image_path": null, - "provider_name": "azure", - "settings": { - "client_id": "need", - "location": "need", - "resource_group": "group", - "secret": "need", - "storage_account_name": "need", - "storage_container": "need", - "subscription_id": "need", - "tenant": "need" - }, - "status": "WAITING", - "uuid": "21898dfd-9ac9-4e22-bb1d-7f12d0129e65" - } - ] - } - ] - } - """ - return jsonify(queue_status(api.config["COMPOSER_CFG"], api=1))
      - -
      [docs]@v1_api.route("/compose/finished") -def v1_compose_finished(): - """Return the list of finished composes - - **/api/v1/compose/finished** - - Return the details on all of the finished composes on the system. - - Example:: - - { - "finished": [ - { - "id": "70b84195-9817-4b8a-af92-45e380f39894", - "blueprint": "glusterfs", - "queue_status": "FINISHED", - "job_created": 1517351003.8210032, - "job_started": 1517351003.8230415, - "job_finished": 1517359234.1003145, - "version": "0.0.6" - }, - { - "id": "e695affd-397f-4af9-9022-add2636e7459", - "blueprint": "glusterfs", - "queue_status": "FINISHED", - "job_created": 1517362289.7193348, - "job_started": 1517362289.9751132, - "job_finished": 1517363500.1234567, - "version": "0.0.6", - "uploads": [ - { - "creation_time": 1568150660.524401, - "image_name": "glusterfs server", - "image_path": "/var/lib/lorax/composer/results/e695affd-397f-4af9-9022-add2636e7459/disk.vhd", - "provider_name": "azure", - "settings": { - "client_id": "need", - "location": "need", - "resource_group": "group", - "secret": "need", - "storage_account_name": "need", - "storage_container": "need", - "subscription_id": "need", - "tenant": "need" - }, - "status": "WAITING", - "uuid": "21898dfd-9ac9-4e22-bb1d-7f12d0129e65" - } - ] - } - ] - } - """ - return jsonify(finished=build_status(api.config["COMPOSER_CFG"], "FINISHED", api=1))
      - -
      [docs]@v1_api.route("/compose/failed") -def v1_compose_failed(): - """Return the list of failed composes - - **/api/v1/compose/failed** - - Return the details on all of the failed composes on the system. - - Example:: - - { - "failed": [ - { - "id": "8c8435ef-d6bd-4c68-9bf1-a2ef832e6b1a", - "blueprint": "http-server", - "queue_status": "FAILED", - "job_created": 1517523249.9301329, - "job_started": 1517523249.9314211, - "job_finished": 1517523255.5623411, - "version": "0.0.2", - "uploads": [ - { - "creation_time": 1568150660.524401, - "image_name": "http-server", - "image_path": null, - "provider_name": "azure", - "settings": { - "client_id": "need", - "location": "need", - "resource_group": "group", - "secret": "need", - "storage_account_name": "need", - "storage_container": "need", - "subscription_id": "need", - "tenant": "need" - }, - "status": "WAITING", - "uuid": "21898dfd-9ac9-4e22-bb1d-7f12d0129e65" - } - ] - } - ] - } - """ - return jsonify(failed=build_status(api.config["COMPOSER_CFG"], "FAILED", api=1))
      - -
      [docs]@v1_api.route("/compose/status", defaults={'uuids': ""}) -@v1_api.route("/compose/status/<uuids>") -@checkparams([("uuids", "", "no UUIDs given")]) -def v1_compose_status(uuids): - """Return the status of the listed uuids - - **/api/v1/compose/status/<uuids>[?blueprint=<blueprint_name>&status=<compose_status>&type=<compose_type>]** - - Return the details for each of the comma-separated list of uuids. A uuid of '*' will return - details for all composes. - - Example:: - - { - "uuids": [ - { - "id": "8c8435ef-d6bd-4c68-9bf1-a2ef832e6b1a", - "blueprint": "http-server", - "queue_status": "FINISHED", - "job_created": 1517523644.2384307, - "job_started": 1517523644.2551234, - "job_finished": 1517523689.9864314, - "version": "0.0.2" - }, - { - "id": "45502a6d-06e8-48a5-a215-2b4174b3614b", - "blueprint": "glusterfs", - "queue_status": "FINISHED", - "job_created": 1517363442.188399, - "job_started": 1517363442.325324, - "job_finished": 1517363451.653621, - "version": "0.0.6", - "uploads": [ - { - "creation_time": 1568150660.524401, - "image_name": "glusterfs server", - "image_path": null, - "provider_name": "azure", - "settings": { - "client_id": "need", - "location": "need", - "resource_group": "group", - "secret": "need", - "storage_account_name": "need", - "storage_container": "need", - "subscription_id": "need", - "tenant": "need" - }, - "status": "WAITING", - "uuid": "21898dfd-9ac9-4e22-bb1d-7f12d0129e65" - } - ] - } - ] - } - """ - if VALID_API_STRING.match(uuids) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - blueprint = request.args.get("blueprint", None) - status = request.args.get("status", None) - compose_type = request.args.get("type", None) - - results = [] - errors = [] - - if uuids.strip() == '*': - queue_status_dict = queue_status(api.config["COMPOSER_CFG"], api=1) - queue_new = queue_status_dict["new"] - queue_running = queue_status_dict["run"] - candidates = queue_new + queue_running + build_status(api.config["COMPOSER_CFG"], api=1) - else: - candidates = [] - for uuid in [n.strip().lower() for n in uuids.split(",")]: - details = uuid_status(api.config["COMPOSER_CFG"], uuid, api=1) - if details is None: - errors.append({"id": UNKNOWN_UUID, "msg": "%s is not a valid build uuid" % uuid}) - else: - candidates.append(details) - - for details in candidates: - if blueprint is not None and details['blueprint'] != blueprint: - continue - - if status is not None and details['queue_status'] != status: - continue - - if compose_type is not None and details['compose_type'] != compose_type: - continue - - results.append(details) - - return jsonify(uuids=results, errors=errors)
      - -
      [docs]@v1_api.route("/compose/info", defaults={'uuid': ""}) -@v1_api.route("/compose/info/<uuid>") -@checkparams([("uuid", "", "no UUID given")]) -def v1_compose_info(uuid): - """Return detailed info about a compose - - **/api/v1/compose/info/<uuid>** - - Get detailed information about the compose. The returned JSON string will - contain the following information: - - * id - The uuid of the comoposition - * config - containing the configuration settings used to run Anaconda - * blueprint - The depsolved blueprint used to generate the kickstart - * commit - The (local) git commit hash for the blueprint used - * deps - The NEVRA of all of the dependencies used in the composition - * compose_type - The type of output generated (tar, iso, etc.) - * queue_status - The final status of the composition (FINISHED or FAILED) - - Example:: - - { - "commit": "7078e521a54b12eae31c3fd028680da7a0815a4d", - "compose_type": "tar", - "config": { - "anaconda_args": "", - "armplatform": "", - "compress_args": [], - "compression": "xz", - "image_name": "root.tar.xz", - ... - }, - "deps": { - "packages": [ - { - "arch": "x86_64", - "epoch": "0", - "name": "acl", - "release": "14.el7", - "version": "2.2.51" - } - ] - }, - "id": "c30b7d80-523b-4a23-ad52-61b799739ce8", - "queue_status": "FINISHED", - "blueprint": { - "description": "An example kubernetes master", - ... - }, - "uploads": [ - { - "creation_time": 1568150660.524401, - "image_name": "glusterfs server", - "image_path": "/var/lib/lorax/composer/results/c30b7d80-523b-4a23-ad52-61b799739ce8/disk.vhd", - "provider_name": "azure", - "settings": { - "client_id": "need", - "location": "need", - "resource_group": "group", - "secret": "need", - "storage_account_name": "need", - "storage_container": "need", - "subscription_id": "need", - "tenant": "need" - }, - "status": "FAILED", - "uuid": "21898dfd-9ac9-4e22-bb1d-7f12d0129e65" - } - ] - } - """ - if VALID_API_STRING.match(uuid) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - try: - info = uuid_info(api.config["COMPOSER_CFG"], uuid, api=1) - except Exception as e: - return jsonify(status=False, errors=[{"id": COMPOSE_ERROR, "msg": str(e)}]), 400 - - if info is None: - return jsonify(status=False, errors=[{"id": UNKNOWN_UUID, "msg": "%s is not a valid build uuid" % uuid}]), 400 - else: - return jsonify(**info)
      - -
      [docs]@v1_api.route("/compose/uploads/schedule", defaults={'compose_uuid': ""}, methods=["POST"]) -@v1_api.route("/compose/uploads/schedule/<compose_uuid>", methods=["POST"]) -@checkparams([("compose_uuid", "", "no compose UUID given")]) -def v1_compose_uploads_schedule(compose_uuid): - """Schedule an upload of a compose to a given cloud provider - - **POST /api/v1/uploads/schedule/<compose_uuid>** - - The body can specify either a pre-existing profile to use (as returned by - `/uploads/providers`) or one-time use settings for the provider. - - Example with upload profile:: - - { - "image_name": "My Image", - "provider": "azure", - "profile": "production-azure-settings" - } - - Example with upload settings:: - - { - "image_name": "My Image", - "provider": "azure", - "settings": { - "resource_group": "SOMEBODY", - "storage_account_name": "ONCE", - "storage_container": "TOLD", - "location": "ME", - "subscription_id": "THE", - "client_id": "WORLD", - "secret": "IS", - "tenant": "GONNA" - } - } - - Example response:: - - { - "status": true, - "upload_id": "572eb0d0-5348-4600-9666-14526ba628bb" - } - """ - if VALID_API_STRING.match(compose_uuid) is None: - error = {"id": INVALID_CHARS, "msg": "Invalid characters in API path"} - return jsonify(status=False, errors=[error]), 400 - - parsed = request.get_json(cache=False) - if not parsed: - return jsonify(status=False, errors=[{"id": MISSING_POST, "msg": "Missing POST body"}]), 400 - - try: - image_name = parsed["image_name"] - provider_name = parsed["provider"] - if "profile" in parsed: - # Load a specific profile for this provider - profile = parsed["profile"] - settings = load_settings(api.config["COMPOSER_CFG"]["upload"], provider_name, profile) - else: - settings = parsed["settings"] - except KeyError as e: - error = {"id": UPLOAD_ERROR, "msg": f'Missing parameter {str(e)}!'} - return jsonify(status=False, errors=[error]), 400 - try: - compose_type = uuid_status(api.config["COMPOSER_CFG"], compose_uuid)["compose_type"] - provider = resolve_provider(api.config["COMPOSER_CFG"]["upload"], provider_name) - if "supported_types" in provider and compose_type not in provider["supported_types"]: - raise RuntimeError( - f'Type "{compose_type}" is not supported by provider "{provider_name}"!' - ) - except Exception as e: - return jsonify(status=False, errors=[{"id": UPLOAD_ERROR, "msg": str(e)}]), 400 - - try: - upload_id = uuid_schedule_upload( - api.config["COMPOSER_CFG"], - compose_uuid, - provider_name, - image_name, - settings - ) - except RuntimeError as e: - return jsonify(status=False, errors=[{"id": UPLOAD_ERROR, "msg": str(e)}]), 400 - return jsonify(status=True, upload_id=upload_id)
      - -
      [docs]@v1_api.route("/upload/delete", defaults={"upload_uuid": ""}, methods=["DELETE"]) -@v1_api.route("/upload/delete/<upload_uuid>", methods=["DELETE"]) -@checkparams([("upload_uuid", "", "no upload UUID given")]) -def v1_compose_uploads_delete(upload_uuid): - """Delete an upload and disassociate it from its compose - - **DELETE /api/v1/upload/delete/<upload_uuid>** - - Example response:: - - { - "status": true, - "upload_id": "572eb0d0-5348-4600-9666-14526ba628bb" - } - """ - if VALID_API_STRING.match(upload_uuid) is None: - error = {"id": INVALID_CHARS, "msg": "Invalid characters in API path"} - return jsonify(status=False, errors=[error]), 400 - - try: - uuid_remove_upload(api.config["COMPOSER_CFG"], upload_uuid) - delete_upload(api.config["COMPOSER_CFG"]["upload"], upload_uuid) - except RuntimeError as error: - return jsonify(status=False, errors=[{"id": UPLOAD_ERROR, "msg": str(error)}]) - return jsonify(status=True, upload_id=upload_uuid)
      - -
      [docs]@v1_api.route("/upload/info", defaults={"upload_uuid": ""}) -@v1_api.route("/upload/info/<upload_uuid>") -@checkparams([("upload_uuid", "", "no UUID given")]) -def v1_upload_info(upload_uuid): - """Returns information about a given upload - - **GET /api/v1/upload/info/<upload_uuid>** - - Example response:: - - { - "status": true, - "upload": { - "creation_time": 1565620940.069004, - "image_name": "My Image", - "image_path": "/var/lib/lorax/composer/results/b6218e8f-0fa2-48ec-9394-f5c2918544c4/disk.vhd", - "provider_name": "azure", - "settings": { - "resource_group": "SOMEBODY", - "storage_account_name": "ONCE", - "storage_container": "TOLD", - "location": "ME", - "subscription_id": "THE", - "client_id": "WORLD", - "secret": "IS", - "tenant": "GONNA" - }, - "status": "FAILED", - "uuid": "b637c411-9d9d-4279-b067-6c8d38e3b211" - } - } - """ - if VALID_API_STRING.match(upload_uuid) is None: - return jsonify(status=False, errors=[{"id": INVALID_CHARS, "msg": "Invalid characters in API path"}]), 400 - - try: - upload = get_upload(api.config["COMPOSER_CFG"]["upload"], upload_uuid).summary() - except RuntimeError as error: - return jsonify(status=False, errors=[{"id": UPLOAD_ERROR, "msg": str(error)}]) - return jsonify(status=True, upload=upload)
      - -
      [docs]@v1_api.route("/upload/log", defaults={"upload_uuid": ""}) -@v1_api.route("/upload/log/<upload_uuid>") -@checkparams([("upload_uuid", "", "no UUID given")]) -def v1_upload_log(upload_uuid): - """Returns an upload's log - - **GET /api/v1/upload/log/<upload_uuid>** - - Example response:: - - { - "status": true, - "upload_id": "b637c411-9d9d-4279-b067-6c8d38e3b211", - "log": "< PLAY [localhost] >..." - } - """ - if VALID_API_STRING.match(upload_uuid) is None: - error = {"id": INVALID_CHARS, "msg": "Invalid characters in API path"} - return jsonify(status=False, errors=[error]), 400 - - try: - upload = get_upload(api.config["COMPOSER_CFG"]["upload"], upload_uuid) - except RuntimeError as error: - return jsonify(status=False, errors=[{"id": UPLOAD_ERROR, "msg": str(error)}]) - return jsonify(status=True, upload_id=upload_uuid, log=upload.upload_log)
      - -
      [docs]@v1_api.route("/upload/reset", defaults={"upload_uuid": ""}, methods=["POST"]) -@v1_api.route("/upload/reset/<upload_uuid>", methods=["POST"]) -@checkparams([("upload_uuid", "", "no UUID given")]) -def v1_upload_reset(upload_uuid): - """Reset an upload so it can be attempted again - - **POST /api/v1/upload/reset/<upload_uuid>** - - Optionally pass in a new image name and/or new settings. - - Example request:: - - { - "image_name": "My renamed image", - "settings": { - "resource_group": "ROLL", - "storage_account_name": "ME", - "storage_container": "I", - "location": "AIN'T", - "subscription_id": "THE", - "client_id": "SHARPEST", - "secret": "TOOL", - "tenant": "IN" - } - } - - Example response:: - - { - "status": true, - "upload_id": "c75d5d62-9d26-42fc-a8ef-18bb14679fc7" - } - """ - if VALID_API_STRING.match(upload_uuid) is None: - error = {"id": INVALID_CHARS, "msg": "Invalid characters in API path"} - return jsonify(status=False, errors=[error]), 400 - - parsed = request.get_json(cache=False) - image_name = parsed.get("image_name") if parsed else None - settings = parsed.get("settings") if parsed else None - - try: - reset_upload(api.config["COMPOSER_CFG"]["upload"], upload_uuid, image_name, settings) - except RuntimeError as error: - return jsonify(status=False, errors=[{"id": UPLOAD_ERROR, "msg": str(error)}]) - return jsonify(status=True, upload_id=upload_uuid)
      - -
      [docs]@v1_api.route("/upload/cancel", defaults={"upload_uuid": ""}, methods=["DELETE"]) -@v1_api.route("/upload/cancel/<upload_uuid>", methods=["DELETE"]) -@checkparams([("upload_uuid", "", "no UUID given")]) -def v1_upload_cancel(upload_uuid): - """Cancel an upload that is either queued or in progress - - **DELETE /api/v1/upload/cancel/<upload_uuid>** - - Example response:: - - { - "status": true, - "upload_id": "037a3d56-b421-43e9-9935-c98350c89996" - } - """ - if VALID_API_STRING.match(upload_uuid) is None: - error = {"id": INVALID_CHARS, "msg": "Invalid characters in API path"} - return jsonify(status=False, errors=[error]), 400 - - try: - cancel_upload(api.config["COMPOSER_CFG"]["upload"], upload_uuid) - except RuntimeError as error: - return jsonify(status=False, errors=[{"id": UPLOAD_ERROR, "msg": str(error)}]) - return jsonify(status=True, upload_id=upload_uuid)
      - -
      [docs]@v1_api.route("/upload/providers") -def v1_upload_providers(): - """Return the information about all upload providers, including their - display names, expected settings, and saved profiles. Refer to the - `resolve_provider` function. - - **GET /api/v1/upload/providers** - - Example response:: - - { - "providers": { - "azure": { - "display": "Azure", - "profiles": { - "default": { - "client_id": "example", - ... - } - }, - "settings-info": { - "client_id": { - "display": "Client ID", - "placeholder": "", - "regex": "", - "type": "string" - }, - ... - }, - "supported_types": ["vhd"] - }, - ... - } - } - """ - - ucfg = api.config["COMPOSER_CFG"]["upload"] - - provider_names = list_providers(ucfg) - - def get_provider_info(provider_name): - provider = resolve_provider(ucfg, provider_name) - provider["profiles"] = load_profiles(ucfg, provider_name) - return provider - - providers = {provider_name: get_provider_info(provider_name) - for provider_name in provider_names} - return jsonify(status=True, providers=providers)
      - -
      [docs]@v1_api.route("/upload/providers/save", methods=["POST"]) -def v1_providers_save(): - """Save provider settings as a profile for later use - - **POST /api/v1/upload/providers/save** - - Example request:: - - { - "provider": "azure", - "profile": "my-profile", - "settings": { - "resource_group": "SOMEBODY", - "storage_account_name": "ONCE", - "storage_container": "TOLD", - "location": "ME", - "subscription_id": "THE", - "client_id": "WORLD", - "secret": "IS", - "tenant": "GONNA" - } - } - - Saving to an existing profile will overwrite it. - - Example response:: - - { - "status": true - } - """ - parsed = request.get_json(cache=False) - - if parsed is None: - return jsonify(status=False, errors=[{"id": MISSING_POST, "msg": "Missing POST body"}]), 400 - - try: - provider_name = parsed["provider"] - profile = parsed["profile"] - settings = parsed["settings"] - except KeyError as e: - error = {"id": UPLOAD_ERROR, "msg": f'Missing parameter {str(e)}!'} - return jsonify(status=False, errors=[error]), 400 - try: - save_settings(api.config["COMPOSER_CFG"]["upload"], provider_name, profile, settings) - except Exception as e: - error = {"id": UPLOAD_ERROR, "msg": str(e)} - return jsonify(status=False, errors=[error]) - return jsonify(status=True)
      - -
      [docs]@v1_api.route("/upload/providers/delete", defaults={"provider_name": "", "profile": ""}, methods=["DELETE"]) -@v1_api.route("/upload/providers/delete/<provider_name>/<profile>", methods=["DELETE"]) -@checkparams([("provider_name", "", "no provider name given"), ("profile", "", "no profile given")]) -def v1_providers_delete(provider_name, profile): - """Delete a provider's profile settings - - **DELETE /api/v1/upload/providers/delete/<provider_name>/<profile>** - - Example response:: - - { - "status": true - } - """ - if None in (VALID_API_STRING.match(provider_name), VALID_API_STRING.match(profile)): - error = {"id": INVALID_CHARS, "msg": "Invalid characters in API path"} - return jsonify(status=False, errors=[error]), 400 - - try: - delete_profile(api.config["COMPOSER_CFG"]["upload"], provider_name, profile) - except Exception as e: - error = {"id": UPLOAD_ERROR, "msg": str(e)} - return jsonify(status=False, errors=[error]) - return jsonify(status=True)
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/api/workspace.html b/docs/html/_modules/pylorax/api/workspace.html deleted file mode 100644 index 45a81757..00000000 --- a/docs/html/_modules/pylorax/api/workspace.html +++ /dev/null @@ -1,329 +0,0 @@ - - - - - - - - - - - pylorax.api.workspace — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -

      Source code for pylorax.api.workspace

      -#
      -# Copyright (C) 2017  Red Hat, 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, see <http://www.gnu.org/licenses/>.
      -#
      -import os
      -
      -from pylorax.api.recipes import recipe_filename, recipe_from_toml, RecipeFileError
      -from pylorax.sysutils import joinpaths
      -
      -
      -
      [docs]def workspace_dir(repo, branch): - """Create the workspace's path from a Repository and branch - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :returns: The path to the branch's workspace directory - :rtype: str - - """ - repo_path = repo.get_location().get_path() - return joinpaths(repo_path, "workspace", branch)
      - - -
      [docs]def workspace_read(repo, branch, recipe_name): - """Read a Recipe from the branch's workspace - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param recipe_name: The name of the recipe - :type recipe_name: str - :returns: The workspace copy of the recipe, or None if it doesn't exist - :rtype: Recipe or None - :raises: RecipeFileError - """ - ws_dir = workspace_dir(repo, branch) - if not os.path.isdir(ws_dir): - os.makedirs(ws_dir) - filename = joinpaths(ws_dir, recipe_filename(recipe_name)) - if not os.path.exists(filename): - return None - try: - f = open(filename, 'rb') - recipe = recipe_from_toml(f.read().decode("UTF-8")) - except IOError: - raise RecipeFileError - return recipe
      - - -
      [docs]def workspace_write(repo, branch, recipe): - """Write a recipe to the workspace - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param recipe: The recipe to write to the workspace - :type recipe: Recipe - :returns: None - :raises: IO related errors - """ - ws_dir = workspace_dir(repo, branch) - if not os.path.isdir(ws_dir): - os.makedirs(ws_dir) - filename = joinpaths(ws_dir, recipe.filename) - open(filename, 'wb').write(recipe.toml().encode("UTF-8"))
      - - -
      [docs]def workspace_filename(repo, branch, recipe_name): - """Return the path and filename of the workspace recipe - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param recipe_name: The name of the recipe - :type recipe_name: str - :returns: workspace recipe path and filename - :rtype: str - """ - ws_dir = workspace_dir(repo, branch) - return joinpaths(ws_dir, recipe_filename(recipe_name))
      - - -
      [docs]def workspace_exists(repo, branch, recipe_name): - """Return true of the workspace recipe exists - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param recipe_name: The name of the recipe - :type recipe_name: str - :returns: True if the file exists - :rtype: bool - """ - return os.path.exists(workspace_filename(repo, branch, recipe_name))
      - - -
      [docs]def workspace_delete(repo, branch, recipe_name): - """Delete the recipe from the workspace - - :param repo: Open repository - :type repo: Git.Repository - :param branch: Branch name - :type branch: str - :param recipe_name: The name of the recipe - :type recipe_name: str - :returns: None - :raises: IO related errors - """ - filename = workspace_filename(repo, branch, recipe_name) - if os.path.exists(filename): - os.unlink(filename)
      -
      - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/_modules/pylorax/base.html b/docs/html/_modules/pylorax/base.html index 664607c6..9e846c70 100644 --- a/docs/html/_modules/pylorax/base.html +++ b/docs/html/_modules/pylorax/base.html @@ -1,38 +1,38 @@ - - + - + - + + + pylorax.base — Lorax 34.10 documentation + + + + + + - pylorax.base — Lorax 34.3 documentation - + - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
      - @@ -251,7 +259,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
      - @@ -250,7 +258,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
        -
      • Docs »
      • +
      • »
      • Module code »
      • @@ -464,7 +467,7 @@ parser.add_argument("--project", default="Linux", help="substituted for @PROJECT@ in bootloader config files") - parser.add_argument("--releasever", default="32", + parser.add_argument("--releasever", default="34", help="substituted for @VERSION@ in bootloader config files") parser.add_argument("--volid", default=None, help="volume id") parser.add_argument("--squashfs-only", action="store_true", default=False, @@ -483,20 +486,25 @@
      - @@ -505,7 +513,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
        -
      • Docs »
      • +
      • »
      • Module code »
      • @@ -307,7 +310,7 @@
        [docs]def make_appliance(disk_img, name, template, outfile, networks=None, ram=1024, vcpus=1, arch=None, title="Linux", project="Linux", - releasever="32"): + releasever="34"): """ Generate an appliance description file @@ -321,7 +324,7 @@ :param str arch: CPU architecture. Default is 'x86_64' :param str title: Title, passed to template. Default is 'Linux' :param str project: Project, passed to template. Default is 'Linux' - :param str releasever: Release version, passed to template. Default is 32 + :param str releasever: Release version, passed to template. Default is 34 """ if not (disk_img and template and outfile): return None @@ -918,20 +921,25 @@
        -
      @@ -940,7 +948,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
      - @@ -214,7 +222,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
      - @@ -229,7 +237,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
        -
      • Docs »
      • +
      • »
      • Module code »
      • @@ -183,7 +186,7 @@
        [docs]def get_dnf_base_object(installroot, sources, mirrorlists=None, repos=None, enablerepos=None, disablerepos=None, - tempdir="/var/tmp", proxy=None, releasever="32", + tempdir="/var/tmp", proxy=None, releasever="34", cachedir=None, logdir=None, sslverify=True, dnfplugins=None): """ Create a dnf Base object and setup the repositories and installroot @@ -349,20 +352,25 @@
        -
      @@ -371,7 +379,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
      - @@ -294,7 +302,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
        -
      • Docs »
      • +
      • »
      • Module code »
      • @@ -177,9 +180,11 @@ # import os +import select import subprocess from subprocess import TimeoutExpired import signal +import time import logging log = logging.getLogger("pylorax") @@ -446,6 +451,7 @@ self._proc = proc self._argv = argv self._callback = callback + self._data = "" def __iter__(self): return self @@ -460,22 +466,43 @@ pass def __next__(self): - # Read the next line, blocking if a line is not yet available - line = self._proc.stdout.readline().decode("utf-8") - if line == '' or not self._callback(self._proc): - # Output finished, wait for the process to end - self._proc.communicate() + # Return lines from stdout while also calling _callback + while True: + # Check for input without blocking + if select.select([self._proc.stdout], [], [], 0)[0]: + size = len(self._proc.stdout.peek(1)) + if size > 0: + self._data += self._proc.stdout.read(size).decode("utf-8") - # Check for successful exit - if self._proc.returncode < 0: - raise OSError("process '%s' was killed by signal %s" % - (self._argv, -self._proc.returncode)) - elif self._proc.returncode > 0: - raise OSError("process '%s' exited with status %s" % - (self._argv, self._proc.returncode)) - raise StopIteration + if self._data.find("\n") >= 0: + line = self._data.split("\n", 1) + self._data = line[1] + return line[0] - return line.strip() + if self._proc.poll() is not None or not self._callback(self._proc): + # Output finished, wait 60s for the process to end + try: + self._proc.communicate(timeout=60) + except subprocess.TimeoutExpired: + # Did not exit in 60s, kill it and wait 30s more + self._proc.kill() + try: + self._proc.communicate(timeout=30) + except subprocess.TimeoutExpired: + pass + + if self._proc.returncode is None: + raise OSError("process '%s' failed to be killed" % self._argv) + elif self._proc.returncode < 0: + raise OSError("process '%s' was killed by signal %s" % + (self._argv, -self._proc.returncode)) + elif self._proc.returncode > 0: + raise OSError("process '%s' exited with status %s" % + (self._argv, self._proc.returncode)) + raise StopIteration + + # Don't loop too fast with no input to read + time.sleep(0.5) argv = [command] + argv @@ -511,20 +538,25 @@
      - @@ -533,7 +565,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
        -
      • Docs »
      • +
      • »
      • Module code »
      • @@ -235,9 +238,20 @@ archive.stdin.write(os.path.basename(root).encode("utf-8") + b"\0") archive.stdin.close() - comp = Popen([compression] + compressargs, - stdin=archive.stdout, stdout=open(outfile, "wb")) - comp.wait() + with open(outfile, "wb") as fout: + comp = Popen([compression] + compressargs, + stdin=archive.stdout, stdout=fout) + comp.wait() + + # Clean up the open fds and processes + if find: + find.wait() + find.stdout.close() + archive.wait() + if archive.stdin: + archive.stdin.close() + if archive.stdout: + archive.stdout.close() return comp.returncode except OSError as e: logger.error(e) @@ -287,8 +301,8 @@
        [docs]def mksparse(outfile, size): '''use os.ftruncate to create a sparse file of the given size.''' - fobj = open(outfile, "w") - os.ftruncate(fobj.fileno(), size)
        + with open(outfile, "w") as fobj: + os.ftruncate(fobj.fileno(), size)
      [docs]def mkqcow2(outfile, size, options=None): '''use qemu-img to create a file of the given size. @@ -716,20 +730,25 @@
      - @@ -738,7 +757,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
        -
      • Docs »
      • +
      • »
      • Module code »
      • @@ -449,7 +452,12 @@ """ for f in cancel_funcs: if f(): - proc.terminate() + # Anaconda runs from unshare, anaconda doesn't exit correctly so try to + # send TERM to all of them directly + import psutil + for p in psutil.Process(proc.pid).children(recursive=True): + p.terminate() + psutil.Process(proc.pid).terminate() return True return False
      @@ -473,7 +481,7 @@ # Make sure the process is really finished (it should be, since it was started from a subprocess call) # and then remove the pid file. if os.path.exists("/var/run/anaconda.pid"): - # lorax-composer runs anaconda using unshare so the pid is always 1 + # anaconda may be started using unshare so the pid is always 1 if open("/var/run/anaconda.pid").read().strip() == "1": os.unlink("/var/run/anaconda.pid") @@ -513,7 +521,7 @@ if os.path.isdir(path): shutil.rmtree(path) - args = ["--kickstart", opts.ks[0], "--cmdline", "--loglevel", "debug"] + args = ["--kickstart", opts.ks[0], "--cmdline"] if opts.anaconda_args: for arg in opts.anaconda_args: args += arg.split(" ", 1) @@ -556,14 +564,12 @@ cancel_funcs.append(cancel_func) # Make sure anaconda has the right product and release - # Preload libgomp.so.1 to workaround rhbz#1722181 log.info("Running anaconda.") try: - unshare_args = [ "--pid", "--kill-child", "--mount", "--propagation", "unchanged", "anaconda" ] + args + unshare_args = ["--pid", "--kill-child", "--mount", "--propagation", "unchanged", "anaconda"] + args for line in execReadlines("unshare", unshare_args, reset_lang=False, env_add={"ANACONDA_PRODUCTNAME": opts.project, - "ANACONDA_PRODUCTVERSION": opts.releasever, - "LD_PRELOAD": "libgomp.so.1"}, + "ANACONDA_PRODUCTVERSION": opts.releasever}, callback=lambda p: not novirt_cancel_check(cancel_funcs, p)): log.info(line) @@ -840,20 +846,25 @@ - @@ -862,7 +873,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
        -
      • Docs »
      • +
      • »
      • Module code »
      • @@ -875,7 +878,7 @@ to search and one KEEPGLOB to keep. The KEEPGLOB is expanded to be *KEEPGLOB* so that it will match anywhere in the path. - This only removes files from under /lib/modules/\*/kernel/ + This only removes files from under /lib/modules/\\*/kernel/ Examples: removekmod sound drivers/media drivers/hwmon drivers/video @@ -1046,20 +1049,25 @@
      - @@ -1068,7 +1076,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
        -
      • Docs »
      • +
      • »
      • Module code »
      • @@ -204,7 +207,8 @@ "crashed on signal", "packaging: Missed: NoSuchPackage", "packaging: Installation failed", - "The following error occurred while installing. This is a fatal error" + "The following error occurred while installing. This is a fatal error", + "Error in POSTIN scriptlet in rpm package" ] re_tests = [ @@ -365,20 +369,25 @@
      - @@ -387,7 +396,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
      - @@ -288,7 +296,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
        -
      • Docs »
      • +
      • »
      • Module code »
      • @@ -203,8 +206,8 @@
        [docs]def touch(fname): - # python closes the file when it goes out of scope - open(fname, "w").write("")
        + with open(fname, "w") as f: + f.write("")
      [docs]def replace(fname, find, sub): @@ -322,20 +325,25 @@
      - @@ -344,7 +352,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
      - @@ -607,7 +615,6 @@ - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.10
      @@ -75,6 +75,7 @@ + + @@ -130,11 +131,13 @@ + +
      - @@ -247,7 +255,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -
      -

      composer-cli

      -
      -
      Authors
      -

      Brian C. Lane <bcl@redhat.com>

      -
      -
      -

      composer-cli is an interactive tool for use with a WELDR API server, -managing blueprints, exploring available packages, and building new images. As -of Fedora 34, osbuild-composer <https://osbuild.org> is the recommended -server.

      -

      It requires the server to be installed on the local system, and the user -running it needs to be a member of the weldr group.

      -
      -

      composer-cli cmdline arguments

      -

      Lorax Composer commandline tool

      -

      -
      usage: composer-cli [-h] [-j] [-s SOCKET] [--log LOG] [-a APIVER] [--test TESTMODE] [-V] ...
      -
      -
      -
      -

      Positional Arguments

      -
      -
      args
      -
      -
      -
      -
      -

      Named Arguments

      -
      -
      -j, --json
      -

      Output the raw JSON response instead of the normal output.

      -

      Default: False

      -
      -
      -s, --socket
      -

      Path to the socket file to listen on

      -

      Default: "/run/weldr/api.socket"

      -
      -
      --log
      -

      Path to logfile (./composer-cli.log)

      -
      -
      -a, --api
      -

      API Version to use

      -

      Default: "1"

      -
      -
      --test
      -

      Pass test mode to compose. 1=Mock compose with fail. 2=Mock compose with finished.

      -

      Default: 0

      -
      -
      -V
      -

      show program's version number and exit

      -

      Default: False

      -
      -
      -
      -

      -
      compose start [--size XXXX] <BLUEPRINT> <TYPE> [<IMAGE-NAME> <PROVIDER> <PROFILE> | <IMAGE-NAME> <PROFILE.TOML>]

      Start a compose using the selected blueprint and output type. Optionally start an upload. ---size is supported by osbuild-composer, and is in MiB.

      -
      -
      compose start-ostree [--size XXXX] [--parent PARENT] [--ref REF] <BLUEPRINT> <TYPE> [<IMAGE-NAME> <PROFILE.TOML>]

      Start an ostree compose using the selected blueprint and output type. Optionally start an upload. This command -is only supported by osbuild-composer. --size is in MiB.

      -
      -
      compose types

      List the supported output types.

      -
      -
      compose status

      List the status of all running and finished composes.

      -
      -
      compose list [waiting|running|finished|failed]

      List basic information about composes.

      -
      -
      compose log <UUID> [<SIZE>]

      Show the last SIZE kB of the compose log.

      -
      -
      compose cancel <UUID>

      Cancel a running compose and delete any intermediate results.

      -
      -
      compose delete <UUID,...>

      Delete the listed compose results.

      -
      -
      compose info <UUID>

      Show detailed information on the compose.

      -
      -
      compose metadata <UUID>

      Download the metadata use to create the compose to <uuid>-metadata.tar

      -
      -
      compose logs <UUID>

      Download the compose logs to <uuid>-logs.tar

      -
      -
      compose results <UUID>

      Download all of the compose results; metadata, logs, and image to <uuid>.tar

      -
      -
      compose image <UUID>

      Download the output image from the compose. Filename depends on the type.

      -
      -
      blueprints list

      List the names of the available blueprints.

      -
      -
      blueprints show <BLUEPRINT,...>

      Display the blueprint in TOML format.

      -
      -
      blueprints changes <BLUEPRINT,...>

      Display the changes for each blueprint.

      -
      -
      blueprints diff <BLUEPRINT> <FROM-COMMIT> <TO-COMMIT>

      Display the differences between 2 versions of a blueprint. -FROM-COMMIT can be a commit hash or NEWEST -TO-COMMIT can be a commit hash, NEWEST, or WORKSPACE

      -
      -
      blueprints save <BLUEPRINT,...>

      Save the blueprint to a file, <BLUEPRINT>.toml

      -
      -
      blueprints delete <BLUEPRINT>

      Delete a blueprint from the server

      -
      -
      blueprints depsolve <BLUEPRINT,...>

      Display the packages needed to install the blueprint.

      -
      -
      blueprints push <BLUEPRINT>

      Push a blueprint TOML file to the server.

      -
      -
      blueprints freeze <BLUEPRINT,...>

      Display the frozen blueprint's modules and packages.

      -
      -
      blueprints freeze show <BLUEPRINT,...>

      Display the frozen blueprint in TOML format.

      -
      -
      blueprints freeze save <BLUEPRINT,...>

      Save the frozen blueprint to a file, <blueprint-name>.frozen.toml.

      -
      -
      blueprints tag <BLUEPRINT>

      Tag the most recent blueprint commit as a release.

      -
      -
      blueprints undo <BLUEPRINT> <COMMIT>

      Undo changes to a blueprint by reverting to the selected commit.

      -
      -
      blueprints workspace <BLUEPRINT>

      Push the blueprint TOML to the temporary workspace storage.

      -
      -
      modules list

      List the available modules.

      -
      -
      projects list

      List the available projects.

      -
      -
      projects info <PROJECT,...>

      Show details about the listed projects.

      -
      -
      sources list

      List the available sources

      -
      -
      sources info <SOURCE-NAME,...>

      Details about the source.

      -
      -
      sources add <SOURCE.TOML>

      Add a package source to the server.

      -
      -
      sources change <SOURCE.TOML>

      Change an existing source

      -
      -
      sources delete <SOURCE-NAME>

      Delete a package source.

      -
      -
      -

      status show Show API server status.

      -
      -
      upload info <UPLOAD-UUID>

      Details about an upload

      -
      -
      upload start <BUILD-UUID> <IMAGE-NAME> [<PROVIDER> <PROFILE>|<PROFILE.TOML>]

      Upload a build image to the selected provider.

      -
      -
      upload log <UPLOAD-UUID>

      Show the upload log

      -
      -
      upload cancel <UPLOAD-UUID>

      Cancel an upload with that is queued or in progress

      -
      -
      upload delete <UPLOAD-UUID>

      Delete the upload and remove it from the build

      -
      -
      upload reset <UPLOAD-UUID>

      Reset the upload so that it can be tried again

      -
      -
      providers list <PROVIDER>

      List the available providers, or list the <provider's> available profiles

      -
      -
      providers show <PROVIDER> <PROFILE>

      show the details of a specific provider's profile

      -
      -
      providers push <PROFILE.TOML>

      Add a new profile, or overwrite an existing one

      -
      -
      providers save <PROVIDER> <PROFILE>

      Save the profile's details to a TOML file named <PROFILE>.toml

      -
      -
      providers delete <PROVIDER> <PROFILE>

      Delete a profile from a provider

      -
      -
      -

      -
      -
      -

      Edit a Blueprint

      -

      Start out by listing the available blueprints using composer-cli blueprints -list, pick one and save it to the local directory by running composer-cli -blueprints save http-server.

      -

      Edit the file (it will be saved with a .toml extension) and change the -description, add a package or module to it. Send it back to the server by -running composer-cli blueprints push http-server.toml. You can verify that it was -saved by viewing the changelog - composer-cli blueprints changes http-server.

      -

      See the Example Blueprint for an example.

      -
      -
      -

      Build an image

      -

      Build a qcow2 disk image from this blueprint by running composer-cli -compose start http-server qcow2. It will print a UUID that you can use to -keep track of the build. You can also cancel the build if needed.

      -

      The available types of images is displayed by composer-cli compose types. -Currently this consists of: alibaba, ami, ext4-filesystem, google, hyper-v, -live-iso, openstack, partitioned-disk, qcow2, tar, vhd, vmdk

      -

      You can optionally start an upload of the finished image, see Image Uploads for -more information.

      -
      -
      -

      Monitor the build status

      -

      Monitor it using composer-cli compose status, which will show the status of -all the builds on the system. You can view the end of the anaconda build logs -once it is in the RUNNING state using composer-cli compose log UUID -where UUID is the UUID returned by the start command.

      -

      Once the build is in the FINISHED state you can download the image.

      -
      -
      -

      Download the image

      -

      Downloading the final image is done with composer-cli compose image UUID and it will -save the qcow2 image as UUID-disk.qcow2 which you can then use to boot a VM like this:

      -
      qemu-kvm --name test-image -m 1024 -hda ./UUID-disk.qcow2
      -
      -
      -
      -
      -

      Image Uploads

      -

      composer-cli can upload the images to a number of services, including AWS, -OpenStack, and vSphere. The upload can be started when the build is finished, -by using composer-cli compose start ... or an existing image can be uploaded -with composer-cli upload start .... In order to access the service you need -to pass authentication details to composer-cli using a TOML file, or reference -a previously saved profile.

      -
      -

      Note

      -

      With osbuild-composer you can only specify upload targets during -the compose process.

      -
      -
      -
      -

      Providers

      -

      Providers are the services providers with Ansible playbook support under -/usr/share/lorax/lifted/providers/, you will need to gather some provider -specific information in order to authenticate with it. You can view the -required fields using composer-cli providers template <PROVIDER>, eg. for AWS -you would run:

      -
      composer-cli upload template aws
      -
      -
      -

      The output looks like this:

      -
      provider = "aws"
      -
      -[settings]
      -aws_access_key = "AWS Access Key"
      -aws_bucket = "AWS Bucket"
      -aws_region = "AWS Region"
      -aws_secret_key = "AWS Secret Key"
      -
      -
      -

      Save this into an aws-credentials.toml file and use it when running start.

      -
      -

      AWS

      -

      The access key and secret key can be created by going to the -IAM->Users->Security Credentials section and creating a new access key. The -secret key will only be shown when it is first created so make sure to record -it in a secure place. The region should be the region that you want to use the -AMI in, and the bucket can be an existing bucket, or a new one, following the -normal AWS bucket naming rules. It will be created if it doesn't already exist.

      -

      When uploading the image it is first uploaded to the s3 bucket, and then -converted to an AMI. If the conversion is successful the s3 object will be -deleted. If it fails, re-trying after correcting the problem will re-use the -object if you have not deleted it in the meantime, speeding up the process.

      -
      -
      -
      -

      Profiles

      -

      Profiles store the authentication settings associated with a specific provider. -Providers can have multiple profiles, as long as their names are unique. For -example, you may have one profile for testing and another for production -uploads.

      -

      Profiles are created by pushing the provider settings template to the server using -composer-cli providers push <PROFILE.TOML> where PROFILE.TOML is the same as the -provider template, but with the addition of a profile field. For example, an AWS -profile named test-uploads would look like this:

      -
      provider = "aws"
      -profile = "test-uploads"
      -
      -[settings]
      -aws_access_key = "AWS Access Key"
      -aws_bucket = "AWS Bucket"
      -aws_region = "AWS Region"
      -aws_secret_key = "AWS Secret Key"
      -
      -
      -

      You can view the profile by using composer-cli providers aws test-uploads.

      -
      -
      -

      Build an image and upload results

      -

      If you have a profile named test-uploads:

      -
      composer-cli compose start example-http-server ami "http image" aws test-uploads
      -
      -
      -

      Or if you have the settings stored in a TOML file:

      -
      composer-cli compose start example-http-server ami "http image" aws-settings.toml
      -
      -
      -

      It will return the UUID of the image build, and the UUID of the upload. Once -the build has finished successfully it will start the upload process, which you -can monitor with composer-cli upload info <UPLOAD-UUID>

      -

      You can also view the upload logs from the Ansible playbook with:

      -
      ``composer-cli upload log <UPLOAD-UUID>``
      -
      -
      -

      The type of the image must match the type supported by the provider.

      -
      -
      -

      Upload an existing image

      -

      You can upload previously built images, as long as they are in the FINISHED state, using composer-cli upload start ...`. If you have a profile named test-uploads:

      -
      composer-cli upload start <UUID> "http-image" aws test-uploads
      -
      -
      -

      Or if you have the settings stored in a TOML file:

      -
      composer-cli upload start <UUID> "http-image" aws-settings.toml
      -
      -
      -

      This will output the UUID of the upload, which can then be used to monitor the status in the same way -described above.

      -
      -
      -

      Debugging

      -

      There are a couple of arguments that can be helpful when debugging problems. -These are only meant for debugging and should not be used to script access to -the API. If you need to do that you can communicate with it directly in the -language of your choice.

      -

      --json will return the server's response as a nicely formatted json output -instead of printing what the command would usually print.

      -

      --test=1 will cause a compose start to start creating an image, and then -end with a failed state.

      -

      --test=2 will cause a compose to start and then end with a finished state, -without actually composing anything.

      -
      -
      -

      Blueprint Reference

      -

      Blueprints are simple text files in TOML format that describe -which packages, and what versions, to install into the image. They can also define a limited set -of customizations to make to the final image.

      -

      A basic blueprint looks like this:

      -
      name = "base"
      -description = "A base system with bash"
      -version = "0.0.1"
      -
      -[[packages]]
      -name = "bash"
      -version = "4.4.*"
      -
      -
      -

      The name field is the name of the blueprint. It can contain spaces, but they will be converted to - -when it is written to disk. It should be short and descriptive.

      -

      description can be a longer description of the blueprint, it is only used for display purposes.

      -

      version is a semver compatible version number. If -a new blueprint is uploaded with the same version the server will -automatically bump the PATCH level of the version. If the version -doesn't match it will be used as is. eg. Uploading a blueprint with version -set to 0.1.0 when the existing blueprint version is 0.0.1 will -result in the new blueprint being stored as version 0.1.0.

      -
      -

      [[packages]] and [[modules]]

      -

      These entries describe the package names and matching version glob to be installed into the image.

      -

      The names must match the names exactly, and the versions can be an exact match -or a filesystem-like glob of the version using * wildcards and ? -character matching.

      -
      -

      Note

      -

      Currently there are no differences between packages and modules -in osbuild-composer. Both are treated like an rpm package dependency.

      -
      -

      For example, to install tmux-2.9a and openssh-server-8.*, you would add -this to your blueprint:

      -
      [[packages]]
      -name = "tmux"
      -version = "2.9a"
      -
      -[[packages]]
      -name = "openssh-server"
      -version = "8.*"
      -
      -
      -
      -
      -

      [[groups]]

      -

      The groups entries describe a group of packages to be installed into the image. Package groups are -defined in the repository metadata. Each group has a descriptive name used primarily for display -in user interfaces and an ID more commonly used in kickstart files. Here, the ID is the expected -way of listing a group.

      -

      Groups have three different ways of categorizing their packages: mandatory, default, and optional. -For purposes of blueprints, mandatory and default packages will be installed. There is no mechanism -for selecting optional packages.

      -

      For example, if you want to install the anaconda-tools group you would add this to your -blueprint:

      -
      [[groups]]
      -name="anaconda-tools"
      -
      -
      -

      groups is a TOML list, so each group needs to be listed separately, like packages but with -no version number.

      -
      -
      -

      Customizations

      -

      The [customizations] section can be used to configure the hostname of the final image. eg.:

      -
      [customizations]
      -hostname = "baseimage"
      -
      -
      -

      This is optional and may be left out to use the defaults.

      -
      -

      [customizations.kernel]

      -

      This allows you to append arguments to the bootloader's kernel commandline. This will not have any -effect on tar or ext4-filesystem images since they do not include a bootloader.

      -

      For example:

      -
      [customizations.kernel]
      -append = "nosmt=force"
      -
      -
      -
      -
      -

      [[customizations.sshkey]]

      -

      Set an existing user's ssh key in the final image:

      -
      [[customizations.sshkey]]
      -user = "root"
      -key = "PUBLIC SSH KEY"
      -
      -
      -

      The key will be added to the user's authorized_keys file.

      -
      -

      Warning

      -

      key expects the entire content of ~/.ssh/id_rsa.pub

      -
      -
      -
      -

      [[customizations.user]]

      -

      Add a user to the image, and/or set their ssh key. -All fields for this section are optional except for the name, here is a complete example:

      -
      [[customizations.user]]
      -name = "admin"
      -description = "Administrator account"
      -password = "$6$CHO2$3rN8eviE2t50lmVyBYihTgVRHcaecmeCk31L..."
      -key = "PUBLIC SSH KEY"
      -home = "/srv/widget/"
      -shell = "/usr/bin/bash"
      -groups = ["widget", "users", "wheel"]
      -uid = 1200
      -gid = 1200
      -
      -
      -

      If the password starts with $6$, $5$, or $2b$ it will be stored as -an encrypted password. Otherwise it will be treated as a plain text password.

      -
      -

      Warning

      -

      key expects the entire content of ~/.ssh/id_rsa.pub

      -
      -
      -
      -

      [[customizations.group]]

      -

      Add a group to the image. name is required and gid is optional:

      -
      [[customizations.group]]
      -name = "widget"
      -gid = 1130
      -
      -
      -
      -
      -

      [customizations.timezone]

      -

      Customizing the timezone and the NTP servers to use for the system:

      -
      [customizations.timezone]
      -timezone = "US/Eastern"
      -ntpservers = ["0.north-america.pool.ntp.org", "1.north-america.pool.ntp.org"]
      -
      -
      -

      The values supported by timezone can be listed by running timedatectl list-timezones.

      -

      If no timezone is setup the system will default to using UTC. The ntp servers are also -optional and will default to using the distribution defaults which are fine for most uses.

      -

      In some image types there are already NTP servers setup, eg. Google cloud image, and they -cannot be overridden because they are required to boot in the selected environment. But the -timezone will be updated to the one selected in the blueprint.

      -
      -
      -

      [customizations.locale]

      -

      Customize the locale settings for the system:

      -
      [customizations.locale]
      -languages = ["en_US.UTF-8"]
      -keyboard = "us"
      -
      -
      -

      The values supported by languages can be listed by running localectl list-locales from -the command line.

      -

      The values supported by keyboard can be listed by running localectl list-keymaps from -the command line.

      -

      Multiple languages can be added. The first one becomes the -primary, and the others are added as secondary. One or the other of languages -or keyboard must be included (or both) in the section.

      -
      -
      -

      [customizations.firewall]

      -

      By default the firewall blocks all access except for services that enable their ports explicitly, -like sshd. This command can be used to open other ports or services. Ports are configured using -the port:protocol format:

      -
      [customizations.firewall]
      -ports = ["22:tcp", "80:tcp", "imap:tcp", "53:tcp", "53:udp"]
      -
      -
      -

      Numeric ports, or their names from /etc/services can be used in the ports enabled/disabled lists.

      -

      The blueprint settings extend any existing settings in the image templates, so if sshd is -already enabled it will extend the list of ports with the ones listed by the blueprint.

      -

      If the distribution uses firewalld you can specify services listed by firewall-cmd --get-services -in a customizations.firewall.services section:

      -
      [customizations.firewall.services]
      -enabled = ["ftp", "ntp", "dhcp"]
      -disabled = ["telnet"]
      -
      -
      -

      Remember that the firewall.services are different from the names in /etc/services.

      -

      Both are optional, if they are not used leave them out or set them to an empty list []. If you -only want the default firewall setup this section can be omitted from the blueprint.

      -

      NOTE: The Google and OpenStack templates explicitly disable the firewall for their environment. -This cannot be overridden by the blueprint.

      -
      -
      -

      [customizations.services]

      -

      This section can be used to control which services are enabled at boot time. -Some image types already have services enabled or disabled in order for the -image to work correctly, and cannot be overridden. eg. ami requires -sshd, chronyd, and cloud-init. Without them the image will not -boot. Blueprint services are added to, not replacing, the list already in the -templates, if any.

      -

      The service names are systemd service units. You may specify any systemd unit -file accepted by systemctl enable eg. cockpit.socket:

      -
      [customizations.services]
      -enabled = ["sshd", "cockpit.socket", "httpd"]
      -disabled = ["postfix", "telnetd"]
      -
      -
      -
      -
      [[repos.git]]
      -
      -

      Note

      -

      Currently osbuild-composer does not support repos.git

      -
      -

      The [[repos.git]] entries are used to add files from a git repository -repository to the created image. The repository is cloned, the specified ref is checked out -and an rpm is created to install the files to a destination path. The rpm includes a summary -with the details of the repository and reference used to create it. The rpm is also included in the -image build metadata.

      -

      To create an rpm named server-config-1.0-1.noarch.rpm you would add this to your blueprint:

      -
      [[repos.git]]
      -rpmname="server-config"
      -rpmversion="1.0"
      -rpmrelease="1"
      -summary="Setup files for server deployment"
      -repo="PATH OF GIT REPO TO CLONE"
      -ref="v1.0"
      -destination="/opt/server/"
      -
      -
      -
        -
      • rpmname: Name of the rpm to create, also used as the prefix name in the tar archive

      • -
      • rpmversion: Version of the rpm, eg. "1.0.0"

      • -
      • rpmrelease: Release of the rpm, eg. "1"

      • -
      • summary: Summary string for the rpm

      • -
      • repo: URL of the get repo to clone and create the archive from

      • -
      • ref: Git reference to check out. eg. origin/branch-name, git tag, or git commit hash

      • -
      • destination: Path to install the / of the git repo at when installing the rpm

      • -
      -

      An rpm will be created with the contents of the git repository referenced, with the files -being installed under /opt/server/ in this case.

      -

      ref can be any valid git reference for use with git archive. eg. to use the head -of a branch set it to origin/branch-name, a tag name, or a commit hash.

      -

      Note that the repository is cloned in full each time a build is started, so pointing to a -repository with a large amount of history may take a while to clone and use a significant -amount of disk space. The clone is temporary and is removed once the rpm is created.

      -
      -
      -
      -
      -
      -

      Example Blueprint

      -

      This example blueprint will install the tmux, git, and vim-enhanced -packages. It will set the root ssh key, add the widget and admin -users as well as a students group:

      -
      name = "example-custom-base"
      -description = "A base system with customizations"
      -version = "0.0.1"
      -
      -[[packages]]
      -name = "tmux"
      -version = "*"
      -
      -[[packages]]
      -name = "git"
      -version = "*"
      -
      -[[packages]]
      -name = "vim-enhanced"
      -version = "*"
      -
      -[customizations]
      -hostname = "custombase"
      -
      -[[customizations.sshkey]]
      -user = "root"
      -key = "A SSH KEY FOR ROOT"
      -
      -[[customizations.user]]
      -name = "widget"
      -description = "Widget process user account"
      -home = "/srv/widget/"
      -shell = "/usr/bin/false"
      -groups = ["dialout", "users"]
      -
      -[[customizations.user]]
      -name = "admin"
      -description = "Widget admin account"
      -password = "$6$CHO2$3rN8eviE2t50lmVyBYihTgVRHcaecmeCk31LeOUleVK/R/aeWVHVZDi26zAH.o0ywBKH9Tc0/wm7sW/q39uyd1"
      -home = "/srv/widget/"
      -shell = "/usr/bin/bash"
      -groups = ["widget", "users", "students"]
      -uid = 1200
      -
      -[[customizations.user]]
      -name = "plain"
      -password = "simple plain password"
      -
      -[[customizations.user]]
      -name = "bart"
      -key = "SSH KEY FOR BART"
      -groups = ["students"]
      -
      -[[customizations.group]]
      -name = "widget"
      -
      -[[customizations.group]]
      -name = "students"
      -
      -
      -
      -
      - - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/composer.cli.html b/docs/html/composer.cli.html deleted file mode 100644 index aa542a7f..00000000 --- a/docs/html/composer.cli.html +++ /dev/null @@ -1,1503 +0,0 @@ - - - - - - - - - - - composer.cli package — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -
      -

      composer.cli package

      -
      -

      Submodules

      -
      -
      -

      composer.cli.blueprints module

      -
      -
      -composer.cli.blueprints.blueprints_changes(socket_path, api_version, args, show_json=False)[source]
      -

      Display the changes for each of the blueprints

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      blueprints changes <blueprint,...> Display the changes for each blueprint.

      -
      - -
      -
      -composer.cli.blueprints.blueprints_cmd(opts)[source]
      -

      Process blueprints commands

      -
      -
      Parameters
      -

      opts (argparse.Namespace) -- Cmdline arguments

      -
      -
      Returns
      -

      Value to return from sys.exit()

      -
      -
      Return type
      -

      int

      -
      -
      -

      This dispatches the blueprints commands to a function

      -
      - -
      -
      -composer.cli.blueprints.blueprints_delete(socket_path, api_version, args, show_json=False)[source]
      -

      Delete a blueprint from the server

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      delete <blueprint> Delete a blueprint from the server

      -
      - -
      -
      -composer.cli.blueprints.blueprints_depsolve(socket_path, api_version, args, show_json=False)[source]
      -

      Display the packages needed to install the blueprint

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      blueprints depsolve <blueprint,...> Display the packages needed to install the blueprint.

      -
      - -
      -
      -composer.cli.blueprints.blueprints_diff(socket_path, api_version, args, show_json=False)[source]
      -

      Display the differences between 2 versions of a blueprint

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -
      -
      blueprints diff <blueprint-name> Display the differences between 2 versions of a blueprint.

      <from-commit> Commit hash or NEWEST -<to-commit> Commit hash, NEWEST, or WORKSPACE

      -
      -
      -
      - -
      -
      -composer.cli.blueprints.blueprints_freeze(socket_path, api_version, args, show_json=False)[source]
      -

      Handle the blueprints freeze commands

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      blueprints freeze <blueprint,...> Display the frozen blueprint's modules and packages. -blueprints freeze show <blueprint,...> Display the frozen blueprint in TOML format. -blueprints freeze save <blueprint,...> Save the frozen blueprint to a file, <blueprint-name>.frozen.toml.

      -
      - -
      -
      -composer.cli.blueprints.blueprints_freeze_save(socket_path, api_version, args, show_json=False)[source]
      -

      Save the frozen blueprint to a TOML file

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      blueprints freeze save <blueprint,...> Save the frozen blueprint to a file, <blueprint-name>.frozen.toml.

      -
      - -
      -
      -composer.cli.blueprints.blueprints_freeze_show(socket_path, api_version, args, show_json=False)[source]
      -

      Show the frozen blueprint in TOML format

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      blueprints freeze show <blueprint,...> Display the frozen blueprint in TOML format.

      -
      - -
      -
      -composer.cli.blueprints.blueprints_list(socket_path, api_version, args, show_json=False)[source]
      -

      Output the list of available blueprints

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      blueprints list

      -
      - -
      -
      -composer.cli.blueprints.blueprints_push(socket_path, api_version, args, show_json=False)[source]
      -

      Push a blueprint TOML file to the server, updating the blueprint

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      push <blueprint> Push a blueprint TOML file to the server.

      -
      - -
      -
      -composer.cli.blueprints.blueprints_save(socket_path, api_version, args, show_json=False)[source]
      -

      Save the blueprint to a TOML file

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      blueprints save <blueprint,...> Save the blueprint to a file, <blueprint-name>.toml

      -
      - -
      -
      -composer.cli.blueprints.blueprints_show(socket_path, api_version, args, show_json=False)[source]
      -

      Show the blueprints, in TOML format

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      blueprints show <blueprint,...> Display the blueprint in TOML format.

      -

      Multiple blueprints will be separated by

      -
      - -
      -
      -composer.cli.blueprints.blueprints_tag(socket_path, api_version, args, show_json=False)[source]
      -

      Tag the most recent blueprint commit as a release

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      blueprints tag <blueprint> Tag the most recent blueprint commit as a release.

      -
      - -
      -
      -composer.cli.blueprints.blueprints_undo(socket_path, api_version, args, show_json=False)[source]
      -

      Undo changes to a blueprint

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      blueprints undo <blueprint> <commit> Undo changes to a blueprint by reverting to the selected commit.

      -
      - -
      -
      -composer.cli.blueprints.blueprints_workspace(socket_path, api_version, args, show_json=False)[source]
      -

      Push the blueprint TOML to the temporary workspace storage

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      blueprints workspace <blueprint> Push the blueprint TOML to the temporary workspace storage.

      -
      - -
      -
      -composer.cli.blueprints.dict_names(lst)[source]
      -

      Return comma-separated list of the dict's name/user fields

      -
      -
      Parameters
      -

      d (dict) -- key/values

      -
      -
      Returns
      -

      String of the dict's keys and values

      -
      -
      Return type
      -

      str

      -
      -
      -

      root, norm

      -
      - -
      -
      -composer.cli.blueprints.prettyCommitDetails(change, indent=4)[source]
      -

      Print the blueprint's change in a nice way

      -
      -
      Parameters
      -
        -
      • change (dict) -- The individual blueprint change dict

      • -
      • indent (int) -- Number of spaces to indent

      • -
      -
      -
      -
      - -
      -
      -composer.cli.blueprints.pretty_dict(d)[source]
      -

      Return the dict as a human readable single line

      -
      -
      Parameters
      -

      d (dict) -- key/values

      -
      -
      Returns
      -

      String of the dict's keys and values

      -
      -
      Return type
      -

      str

      -
      -
      -

      key="str", key="str1,str2", ...

      -
      - -
      -
      -composer.cli.blueprints.pretty_diff_entry(diff)[source]
      -

      Generate nice diff entry string.

      -
      -
      Parameters
      -

      diff (dict) -- Difference entry dict

      -
      -
      Returns
      -

      Nice string

      -
      -
      -
      - -
      -
      -

      composer.cli.cmdline module

      -
      -
      -composer.cli.cmdline.composer_cli_parser()[source]
      -

      Return the ArgumentParser for composer-cli

      -
      - -
      -
      -

      composer.cli.compose module

      -
      -
      -composer.cli.compose.compose_cancel(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Cancel a running compose

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      compose cancel <uuid>

      -

      This will cancel a running compose. It does nothing if the compose has finished.

      -
      - -
      -
      -composer.cli.compose.compose_cmd(opts)[source]
      -

      Process compose commands

      -
      -
      Parameters
      -

      opts (argparse.Namespace) -- Cmdline arguments

      -
      -
      Returns
      -

      Value to return from sys.exit()

      -
      -
      Return type
      -

      int

      -
      -
      -

      This dispatches the compose commands to a function

      -

      compose_cmd expects api to be passed. eg.

      -
      -

      {"version": 1, "backend": "lorax-composer"}

      -
      -
      - -
      -
      -composer.cli.compose.compose_delete(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Delete a finished compose's results

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      compose delete <uuid,...>

      -

      Delete the listed compose results. It will only delete results for composes that have finished -or failed, not a running compose.

      -
      - -
      -
      -composer.cli.compose.compose_image(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Download the compose's output image

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      compose image <uuid>

      -

      This downloads only the result image, saving it as the image name, which depends on the type -of compose that was selected.

      -
      - -
      -
      -composer.cli.compose.compose_info(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Return detailed information about the compose

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      compose info <uuid>

      -

      This returns information about the compose, including the blueprint and the dependencies.

      -
      - -
      -
      -composer.cli.compose.compose_list(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Return a simple list of compose identifiers

      -
      - -
      -
      -composer.cli.compose.compose_log(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Show the last part of the compose log

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      compose log <uuid> [<size>kB]

      -

      This will display the last 1kB of the compose's log file. Can be used to follow progress -during the build.

      -
      - -
      -
      -composer.cli.compose.compose_logs(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Download a tar of the compose's logs

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      compose logs <uuid>

      -

      Saves the logs as uuid-logs.tar

      -
      - -
      -
      -composer.cli.compose.compose_metadata(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Download a tar file of the compose's metadata

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      compose metadata <uuid>

      -

      Saves the metadata as uuid-metadata.tar

      -
      - -
      -
      -composer.cli.compose.compose_ostree(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Start a new ostree compose using the selected blueprint and type

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- Set to 1 to simulate a failed compose, set to 2 to simulate a finished one.

      • -
      • api (dict) -- Details about the API server, "version" and "backend"

      • -
      -
      -
      -

      compose start-ostree [--size XXXX] [--parent PARENT] [--ref REF] <BLUEPRINT> <TYPE> [<IMAGE-NAME> <PROFILE.TOML>]

      -
      - -
      -
      -composer.cli.compose.compose_results(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Download a tar file of the compose's results

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      compose results <uuid>

      -

      The results includes the metadata, output image, and logs. -It is saved as uuid.tar

      -
      - -
      -
      -composer.cli.compose.compose_start(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Start a new compose using the selected blueprint and type

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- Set to 1 to simulate a failed compose, set to 2 to simulate a finished one.

      • -
      • api (dict) -- Details about the API server, "version" and "backend"

      • -
      -
      -
      -

      compose start [--size XXX] <blueprint-name> <compose-type> [<image-name> <provider> <profile> | <image-name> <profile.toml>]

      -
      - -
      -
      -composer.cli.compose.compose_status(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Return the status of all known composes

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      This doesn't map directly to an API command, it combines the results from queue, finished, -and failed so raw JSON output is not available.

      -
      - -
      -
      -composer.cli.compose.compose_types(socket_path, api_version, args, show_json=False, testmode=0, api=None)[source]
      -

      Return information about the supported compose types

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      Add additional details to types that are known to composer-cli. Raw JSON output does not -include this extra information.

      -
      - -
      -
      -composer.cli.compose.get_parent(args)[source]
      -

      Return optional --parent argument, and remaining args

      -
      -
      Parameters
      -

      args (list of strings) -- list of arguments

      -
      -
      Returns
      -

      (args, parent)

      -
      -
      Return type
      -

      tuple

      -
      -
      -
      - -
      -
      -composer.cli.compose.get_ref(args)[source]
      -

      Return optional --ref argument, and remaining args

      -
      -
      Parameters
      -

      args (list of strings) -- list of arguments

      -
      -
      Returns
      -

      (args, parent)

      -
      -
      Return type
      -

      tuple

      -
      -
      -
      - -
      -
      -composer.cli.compose.get_size(args)[source]
      -

      Return optional --size argument, and remaining args

      -
      -
      Parameters
      -

      args (list of strings) -- list of arguments

      -
      -
      Returns
      -

      (args, size)

      -
      -
      Return type
      -

      tuple

      -
      -
      -
        -
      • check size argument for int

      • -
      • check other args for --size in wrong place

      • -
      • raise error? Or just return 0?

      • -
      • no size returns 0 in size

      • -
      • multiply by 1024**2 to make it easier on users to specify large sizes

      • -
      -
      - -
      -
      -

      composer.cli.help module

      -
      -
      -

      composer.cli.modules module

      -
      -
      -composer.cli.modules.modules_cmd(opts)[source]
      -

      Process modules commands

      -
      -
      Parameters
      -

      opts (argparse.Namespace) -- Cmdline arguments

      -
      -
      Returns
      -

      Value to return from sys.exit()

      -
      -
      Return type
      -

      int

      -
      -
      -
      - -
      -
      -

      composer.cli.projects module

      -
      -
      -composer.cli.projects.projects_cmd(opts)[source]
      -

      Process projects commands

      -
      -
      Parameters
      -

      opts (argparse.Namespace) -- Cmdline arguments

      -
      -
      Returns
      -

      Value to return from sys.exit()

      -
      -
      Return type
      -

      int

      -
      -
      -
      - -
      -
      -composer.cli.projects.projects_info(socket_path, api_version, args, show_json=False)[source]
      -

      Output info on a list of projects

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      projects info <project,...>

      -
      - -
      -
      -composer.cli.projects.projects_list(socket_path, api_version, args, show_json=False)[source]
      -

      Output the list of available projects

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      projects list

      -
      - -
      -
      -

      composer.cli.providers module

      -
      -
      -composer.cli.providers.providers_cmd(opts)[source]
      -

      Process providers commands

      -
      -
      Parameters
      -

      opts (argparse.Namespace) -- Cmdline arguments

      -
      -
      Returns
      -

      Value to return from sys.exit()

      -
      -
      Return type
      -

      int

      -
      -
      -

      This dispatches the providers commands to a function

      -
      - -
      -
      -composer.cli.providers.providers_delete(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Delete a profile from a provider

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      providers delete <provider> <profile>

      -
      - -
      -
      -composer.cli.providers.providers_info(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Show information about each provider

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      providers info <PROVIDER>

      -
      - -
      -
      -composer.cli.providers.providers_list(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Return the list of providers

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      providers list

      -
      - -
      -
      -composer.cli.providers.providers_push(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Add a new provider profile or overwrite an existing one

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      providers push <profile.toml>

      -
      - -
      -
      -composer.cli.providers.providers_save(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Save a provider's profile to a TOML file

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      providers save <provider> <profile>

      -
      - -
      -
      -composer.cli.providers.providers_show(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Return details about a provider

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      providers show <provider> <profile>

      -
      - -
      -
      -composer.cli.providers.providers_template(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Return a TOML template for setting the provider's fields

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      providers template <provider>

      -
      - -
      -
      -

      composer.cli.sources module

      -
      -
      -composer.cli.sources.sources_add(socket_path, api_version, args, show_json=False)[source]
      -

      Add or change a source

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      sources add <source.toml>

      -
      - -
      -
      -composer.cli.sources.sources_cmd(opts)[source]
      -

      Process sources commands

      -
      -
      Parameters
      -

      opts (argparse.Namespace) -- Cmdline arguments

      -
      -
      Returns
      -

      Value to return from sys.exit()

      -
      -
      Return type
      -

      int

      -
      -
      -
      - -
      -
      -composer.cli.sources.sources_delete(socket_path, api_version, args, show_json=False)[source]
      -

      Delete a source

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      sources delete <source-name>

      -
      - -
      -
      -composer.cli.sources.sources_info(socket_path, api_version, args, show_json=False)[source]
      -

      Output info on a list of projects

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      sources info <source-name>

      -
      - -
      -
      -composer.cli.sources.sources_list(socket_path, api_version, args, show_json=False)[source]
      -

      Output the list of available sources

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      -
      -
      -

      sources list

      -
      - -
      -
      -

      composer.cli.status module

      -
      -
      -composer.cli.status.status_cmd(opts)[source]
      -

      Process status commands

      -
      -
      Parameters
      -

      opts (argparse.Namespace) -- Cmdline arguments

      -
      -
      Returns
      -

      Value to return from sys.exit()

      -
      -
      Return type
      -

      int

      -
      -
      -
      - -
      -
      -

      composer.cli.upload module

      -
      -
      -composer.cli.upload.upload_cancel(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Cancel the queued or running upload

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      upload cancel <build-uuid>

      -
      - -
      -
      -composer.cli.upload.upload_cmd(opts)[source]
      -

      Process upload commands

      -
      -
      Parameters
      -

      opts (argparse.Namespace) -- Cmdline arguments

      -
      -
      Returns
      -

      Value to return from sys.exit()

      -
      -
      Return type
      -

      int

      -
      -
      -

      This dispatches the upload commands to a function

      -
      - -
      -
      -composer.cli.upload.upload_delete(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Delete an upload and remove it from the build

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      upload delete <build-uuid>

      -
      - -
      -
      -composer.cli.upload.upload_info(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Return detailed information about the upload

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      upload info <uuid>

      -

      This returns information about the upload, including uuid, name, status, service, and image.

      -
      - -
      -
      -composer.cli.upload.upload_list(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Return the composes and their associated upload uuids and status

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      upload list

      -
      - -
      -
      -composer.cli.upload.upload_log(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Return the upload log

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      upload log <build-uuid>

      -
      - -
      -
      -composer.cli.upload.upload_reset(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Reset the upload and execute it again

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      upload reset <build-uuid>

      -
      - -
      -
      -composer.cli.upload.upload_start(socket_path, api_version, args, show_json=False, testmode=0)[source]
      -

      Start upload up a build uuid image

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • api_version (str) -- Version of the API to talk to. eg. "0"

      • -
      • args (list of str) -- List of remaining arguments from the cmdline

      • -
      • show_json (bool) -- Set to True to show the JSON output instead of the human readable output

      • -
      • testmode (int) -- unused in this function

      • -
      -
      -
      -

      upload start <build-uuid> <image-name> [<provider> <profile> | <profile.toml>]

      -
      - -
      -
      -

      composer.cli.utilities module

      -
      -
      -composer.cli.utilities.argify(args)[source]
      -

      Take a list of human args and return a list with each item

      -
      -
      Parameters
      -

      args (list of str) -- list of strings with possible commas and spaces

      -
      -
      Returns
      -

      List of all the items

      -
      -
      Return type
      -

      list of str

      -
      -
      -

      Examples:

      -

      ["one,two", "three", ",four", ",five,"] returns ["one", "two", "three", "four", "five"]

      -
      - -
      -
      -composer.cli.utilities.frozen_toml_filename(blueprint_name)[source]
      -

      Convert a blueprint name into a filename.toml

      -
      -
      Parameters
      -

      blueprint_name (str) -- The blueprint's name

      -
      -
      Returns
      -

      The blueprint name with ' ' converted to - and .toml appended

      -
      -
      Return type
      -

      str

      -
      -
      -
      - -
      -
      -composer.cli.utilities.get_arg(args, name, argtype=None)[source]
      -

      Return optional value from args, and remaining args

      -
      -
      Parameters
      -
        -
      • args (list of strings) -- list of arguments

      • -
      • name (string) -- The argument to remove from the args list

      • -
      • argtype (type) -- Type to use for checking the argument value

      • -
      -
      -
      Returns
      -

      (args, value)

      -
      -
      Return type
      -

      tuple

      -
      -
      -

      This removes the optional argument and value from the argument list, returns the new list, -and the value of the argument.

      -
      - -
      -
      -composer.cli.utilities.handle_api_result(result, show_json=False)[source]
      -

      Log any errors, return the correct value

      -
      -
      Parameters
      -

      result (dict) -- JSON result from the http query

      -
      -
      Return type
      -

      tuple

      -
      -
      Returns
      -

      (rc, should_exit_now)

      -
      -
      -

      Return the correct rc for the program (0 or 1), and whether or -not to continue processing the results.

      -
      - -
      -
      -composer.cli.utilities.packageNEVRA(pkg)[source]
      -

      Return the package info as a NEVRA

      -
      -
      Parameters
      -

      pkg (dict) -- The package details

      -
      -
      Returns
      -

      name-[epoch:]version-release-arch

      -
      -
      Return type
      -

      str

      -
      -
      -
      - -
      -
      -composer.cli.utilities.toml_filename(blueprint_name)[source]
      -

      Convert a blueprint name into a filename.toml

      -
      -
      Parameters
      -

      blueprint_name (str) -- The blueprint's name

      -
      -
      Returns
      -

      The blueprint name with ' ' converted to - and .toml appended

      -
      -
      Return type
      -

      str

      -
      -
      -
      - -
      -
      -

      Module contents

      -
      -
      -composer.cli.main(opts)[source]
      -

      Main program execution

      -
      -
      Parameters
      -

      opts (argparse.Namespace) -- Cmdline arguments

      -
      -
      -
      - -
      -
      - - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/composer.html b/docs/html/composer.html deleted file mode 100644 index 7499cbfe..00000000 --- a/docs/html/composer.html +++ /dev/null @@ -1,504 +0,0 @@ - - - - - - - - - - - composer package — Lorax 34.3 documentation - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -
      -

      composer package

      - -
      -

      Submodules

      -
      -
      -

      composer.http_client module

      -
      -
      -composer.http_client.api_url(api_version, url)[source]
      -

      Return the versioned path to the API route

      -
      -
      Parameters
      -
        -
      • api_version (str) -- The version of the API to talk to. eg. "0"

      • -
      • url (str) -- The API route to talk to

      • -
      -
      -
      Returns
      -

      The full url to use for the route and API version

      -
      -
      Return type
      -

      str

      -
      -
      -
      - -
      -
      -composer.http_client.append_query(url, query)[source]
      -

      Add a query argument to a URL

      -

      The query should be of the form "param1=what&param2=ever", i.e., no -leading '?'. The new query data will be appended to any existing -query string.

      -
      -
      Parameters
      -
        -
      • url (str) -- The original URL

      • -
      • query (str) -- The query to append

      • -
      -
      -
      Returns
      -

      The new URL with the query argument included

      -
      -
      Return type
      -

      str

      -
      -
      -
      - -
      -
      -composer.http_client.delete_url_json(socket_path, url)[source]
      -

      Send a DELETE request to the url and return JSON response

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • url (str) -- URL to send DELETE to

      • -
      -
      -
      Returns
      -

      The json response from the server

      -
      -
      Return type
      -

      dict

      -
      -
      -
      - -
      -
      -composer.http_client.download_file(socket_path, url, progress=True)[source]
      -

      Download a file, saving it to the CWD with the included filename

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • url (str) -- URL to send POST to

      • -
      -
      -
      -
      - -
      -
      -composer.http_client.get_filename(headers)[source]
      -

      Get the filename from the response header

      -
      -
      Parameters
      -

      response (Response) -- The urllib3 response object

      -
      -
      Raises
      -

      RuntimeError if it cannot find a filename in the header

      -
      -
      Returns
      -

      Filename from content-disposition header

      -
      -
      Return type
      -

      str

      -
      -
      -
      - -
      -
      -composer.http_client.get_url_json(socket_path, url)[source]
      -

      Return the JSON results of a GET request

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • url (str) -- URL to request

      • -
      -
      -
      Returns
      -

      The json response from the server

      -
      -
      Return type
      -

      dict

      -
      -
      -
      - -
      -
      -composer.http_client.get_url_json_unlimited(socket_path, url, total_fn=None)[source]
      -

      Return the JSON results of a GET request

      -

      For URLs that use offset/limit arguments, this command will -fetch all results for the given request.

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • url (str) -- URL to request

      • -
      -
      -
      Returns
      -

      The json response from the server

      -
      -
      Return type
      -

      dict

      -
      -
      -
      - -
      -
      -composer.http_client.get_url_raw(socket_path, url)[source]
      -

      Return the raw results of a GET request

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • url (str) -- URL to request

      • -
      -
      -
      Returns
      -

      The raw response from the server

      -
      -
      Return type
      -

      str

      -
      -
      -
      - -
      -
      -composer.http_client.post_url(socket_path, url, body)[source]
      -

      POST raw data to the URL

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • url (str) -- URL to send POST to

      • -
      • body (str) -- The data for the body of the POST

      • -
      -
      -
      Returns
      -

      The json response from the server

      -
      -
      Return type
      -

      dict

      -
      -
      -
      - -
      -
      -composer.http_client.post_url_json(socket_path, url, body)[source]
      -

      POST some JSON data to the URL

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • url (str) -- URL to send POST to

      • -
      • body (str) -- The data for the body of the POST

      • -
      -
      -
      Returns
      -

      The json response from the server

      -
      -
      Return type
      -

      dict

      -
      -
      -
      - -
      -
      -composer.http_client.post_url_toml(socket_path, url, body)[source]
      -

      POST a TOML string to the URL

      -
      -
      Parameters
      -
        -
      • socket_path (str) -- Path to the Unix socket to use for API communication

      • -
      • url (str) -- URL to send POST to

      • -
      • body (str) -- The data for the body of the POST

      • -
      -
      -
      Returns
      -

      The json response from the server

      -
      -
      Return type
      -

      dict

      -
      -
      -
      - -
      -
      -

      composer.unix_socket module

      -
      -
      -class composer.unix_socket.UnixHTTPConnection(socket_path, timeout=300)[source]
      -

      Bases: http.client.HTTPConnection, object

      -
      -
      -connect()[source]
      -

      Connect to the host and port specified in __init__.

      -
      - -
      - -
      -
      -class composer.unix_socket.UnixHTTPConnectionPool(socket_path, timeout=300)[source]
      -

      Bases: urllib3.connectionpool.HTTPConnectionPool

      -
      - -
      -
      -

      Module contents

      -
      -
      - - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/genindex.html b/docs/html/genindex.html index 56c0b078..74c2dce1 100644 --- a/docs/html/genindex.html +++ b/docs/html/genindex.html @@ -1,38 +1,38 @@ - - + - + - + + + Index — Lorax 34.9.0 documentation + + + + + + - Index — Lorax 34.3 documentation - + - - - - - - @@ -58,7 +58,7 @@
      - 34.3 + 34.9.0
      @@ -75,6 +75,7 @@ + + @@ -130,18 +131,20 @@ + +
      - + + - @@ -559,8 +365,6 @@ @@ -679,8 +483,6 @@

      M

      -
    1. composer-cli
    2. -
    3. Blueprint Reference
    4. -
    5. Example Blueprint
    6. mkksiso
    7. Product and Updates Images
    8. src
    9. @@ -136,6 +134,7 @@ + @@ -170,18 +169,20 @@ + +
        -
      • Docs »
      • +
      • »
      • livemedia-creator
      • - + View page source @@ -229,20 +230,25 @@ you have the anaconda-tui package installed.

        usage: livemedia-creator [-h]
                                  (--make-iso | --make-disk | --make-fsimage | --make-appliance | --make-ami | --make-tar | --make-tar-disk | --make-pxe-live | --make-ostree-live | --make-oci | --make-vagrant)
        -                         [--iso ISO] [--iso-only] [--iso-name ISO_NAME] [--ks KS] [--image-only] [--no-virt]
        -                         [--proxy PROXY] [--anaconda-arg ANACONDA_ARGS] [--armplatform ARMPLATFORM]
        -                         [--location LOCATION] [--logfile LOGFILE] [--lorax-templates LORAX_TEMPLATES] [--tmp TMP]
        -                         [--resultdir RESULT_DIR] [--macboot] [--nomacboot] [--extra-boot-args EXTRA_BOOT_ARGS]
        -                         [--disk-image DISK_IMAGE] [--keep-image] [--fs-image FS_IMAGE] [--image-name IMAGE_NAME]
        -                         [--tar-disk-name TAR_DISK_NAME] [--fs-label FS_LABEL] [--image-size-align IMAGE_SIZE_ALIGN]
        -                         [--image-type IMAGE_TYPE] [--qemu-arg QEMU_ARGS] [--qcow2] [--qcow2-arg QEMU_ARGS]
        -                         [--compression COMPRESSION] [--compress-arg COMPRESS_ARGS] [--app-name APP_NAME]
        -                         [--app-template APP_TEMPLATE] [--app-file APP_FILE] [--ram MEMORY] [--vcpus VCPUS]
        -                         [--vnc VNC] [--arch ARCH] [--kernel-args KERNEL_ARGS] [--ovmf-path OVMF_PATH] [--virt-uefi]
        -                         [--no-kvm] [--with-rng WITH_RNG] [--dracut-conf DRACUT_CONF] [--dracut-arg DRACUT_ARGS]
        -                         [--live-rootfs-size LIVE_ROOTFS_SIZE] [--live-rootfs-keep-size] [--oci-config OCI_CONFIG]
        -                         [--oci-runtime OCI_RUNTIME] [--vagrant-metadata VAGRANT_METADATA]
        -                         [--vagrantfile VAGRANTFILE] [--project PROJECT] [--releasever RELEASEVER] [--volid VOLID]
        +                         [--iso ISO] [--iso-only] [--iso-name ISO_NAME] [--ks KS] [--image-only]
        +                         [--no-virt] [--proxy PROXY] [--anaconda-arg ANACONDA_ARGS]
        +                         [--armplatform ARMPLATFORM] [--location LOCATION] [--logfile LOGFILE]
        +                         [--lorax-templates LORAX_TEMPLATES] [--tmp TMP] [--resultdir RESULT_DIR]
        +                         [--macboot] [--nomacboot] [--extra-boot-args EXTRA_BOOT_ARGS]
        +                         [--disk-image DISK_IMAGE] [--keep-image] [--fs-image FS_IMAGE]
        +                         [--image-name IMAGE_NAME] [--tar-disk-name TAR_DISK_NAME]
        +                         [--fs-label FS_LABEL] [--image-size-align IMAGE_SIZE_ALIGN]
        +                         [--image-type IMAGE_TYPE] [--qemu-arg QEMU_ARGS] [--qcow2]
        +                         [--qcow2-arg QEMU_ARGS] [--compression COMPRESSION]
        +                         [--compress-arg COMPRESS_ARGS] [--app-name APP_NAME]
        +                         [--app-template APP_TEMPLATE] [--app-file APP_FILE] [--ram MEMORY]
        +                         [--vcpus VCPUS] [--vnc VNC] [--arch ARCH] [--kernel-args KERNEL_ARGS]
        +                         [--ovmf-path OVMF_PATH] [--virt-uefi] [--no-kvm] [--with-rng WITH_RNG]
        +                         [--dracut-conf DRACUT_CONF] [--dracut-arg DRACUT_ARGS]
        +                         [--live-rootfs-size LIVE_ROOTFS_SIZE] [--live-rootfs-keep-size]
        +                         [--oci-config OCI_CONFIG] [--oci-runtime OCI_RUNTIME]
        +                         [--vagrant-metadata VAGRANT_METADATA] [--vagrantfile VAGRANTFILE]
        +                         [--project PROJECT] [--releasever RELEASEVER] [--volid VOLID]
                                  [--squashfs-only] [--timeout TIMEOUT] [-V]
         
        @@ -358,7 +364,7 @@ you have the anaconda-tui package installed.

        --releasever

        substituted for @VERSION@ in bootloader config files

        -

        Default: "32"

        +

        Default: "34"

        --volid

        volume id

        @@ -1056,29 +1062,29 @@ report bugs against the lorax component.

      - @@ -1087,7 +1093,6 @@ report bugs against the lorax component.

      - - - - - - - - - - - - - - - - - - - - - - - -
      - - - -
      - - - - - -
      - -
      - - - - - - - - - - - - - - - - - -
      - - - - -
      -
      -
      -
      - -
      -

      lorax-composer

      -

      lorax-composer has been replaced by the osbuild-composer WELDR API -server which implements more features (eg. ostree, image uploads, etc.) You -can still use composer-cli and cockpit-composer with -osbuild-composer. See the documentation or the osbuild website for more information.

      -
      - - -
      - -
      - - -
      -
      - -
      - -
      - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/lorax.html b/docs/html/lorax.html index d5e69e88..246fa454 100644 --- a/docs/html/lorax.html +++ b/docs/html/lorax.html @@ -1,38 +1,38 @@ - - + - + - + + + Lorax — Lorax 34.9.0 documentation + + + + + + - Lorax — Lorax 34.3 documentation - + - - - - - - @@ -60,7 +60,7 @@
      - 34.3 + 34.9.0
      @@ -77,6 +77,7 @@ + + @@ -160,18 +159,20 @@ + +
        -
      • Docs »
      • +
      • »
      • Lorax
      • - + View page source @@ -205,15 +206,15 @@ repositories.

        lorax cmdline arguments

        Create the Anaconda boot.iso

        -
        usage: lorax [-h] -p PRODUCT -v VERSION -r RELEASE [-s REPOSITORY] [--repo REPOSITORY] [-m REPOSITORY] [-t VARIANT]
        -             [-b URL] [--isfinal] [-c CONFIGFILE] [--proxy HOST] [-i PACKAGE] [-e PACKAGE] [--buildarch ARCH]
        -             [--volid VOLID] [--macboot] [--nomacboot] [--noupgrade] [--logfile LOGFILE] [--tmp TMP]
        -             [--cachedir CACHEDIR] [--workdir WORKDIR] [--force] [--add-template ADD_TEMPLATES]
        -             [--add-template-var ADD_TEMPLATE_VARS] [--add-arch-template ADD_ARCH_TEMPLATES]
        -             [--add-arch-template-var ADD_ARCH_TEMPLATE_VARS] [--noverify] [--sharedir SHAREDIR]
        -             [--enablerepo [repo]] [--disablerepo [repo]] [--rootfs-size ROOTFS_SIZE] [--noverifyssl]
        -             [--dnfplugin DNFPLUGINS] [--squashfs-only] [--skip-branding] [--dracut-conf DRACUT_CONF]
        -             [--dracut-arg DRACUT_ARGS] [-V]
        +
        usage: lorax [-h] -p PRODUCT -v VERSION -r RELEASE [-s REPOSITORY] [--repo REPOSITORY] [-m REPOSITORY]
        +             [-t VARIANT] [-b URL] [--isfinal] [-c CONFIGFILE] [--proxy HOST] [-i PACKAGE] [-e PACKAGE]
        +             [--buildarch ARCH] [--volid VOLID] [--macboot] [--nomacboot] [--noupgrade]
        +             [--logfile LOGFILE] [--tmp TMP] [--cachedir CACHEDIR] [--workdir WORKDIR] [--force]
        +             [--add-template ADD_TEMPLATES] [--add-template-var ADD_TEMPLATE_VARS]
        +             [--add-arch-template ADD_ARCH_TEMPLATES] [--add-arch-template-var ADD_ARCH_TEMPLATE_VARS]
        +             [--noverify] [--sharedir SHAREDIR] [--enablerepo [repo]] [--disablerepo [repo]]
        +             [--rootfs-size ROOTFS_SIZE] [--noverifyssl] [--dnfplugin DNFPLUGINS] [--squashfs-only]
        +             [--skip-branding] [--dracut-conf DRACUT_CONF] [--dracut-arg DRACUT_ARGS] [-V]
                      OUTPUTDIR
         
        @@ -355,8 +356,8 @@ repositories.

        Default: []

        --rootfs-size
        -

        Size of root filesystem in GiB. Defaults to 2.

        -

        Default: 2

        +

        Size of root filesystem in GiB. Defaults to 3.

        +

        Default: 3

        --noverifyssl

        Do not verify SSL certificates

        @@ -535,29 +536,29 @@ should) select the specific template directory by passing - - - - - - + +
        -

        - © Copyright 2018, Red Hat, Inc. + © Copyright 2018, Red Hat, Inc..

        - Built with Sphinx using a theme provided by Read the Docs. + + + + Built with Sphinx using a + + theme + + provided by Read the Docs. -
      @@ -566,7 +567,6 @@ should) select the specific template directory by passing jQuery(function () { SphinxRtdTheme.Navigation.enable(true); diff --git a/docs/html/mkksiso.html b/docs/html/mkksiso.html index 95f9ad33..05ba94e9 100644 --- a/docs/html/mkksiso.html +++ b/docs/html/mkksiso.html @@ -1,42 +1,42 @@ - - + - + - + + + mkksiso — Lorax 34.9.0 documentation + + + + + + - mkksiso — Lorax 34.3 documentation - + - - - - - - - + @@ -60,7 +60,7 @@
      - 34.3 + 34.9.0
      @@ -77,6 +77,7 @@ + + @@ -145,18 +144,20 @@ + +
      - @@ -341,7 +342,6 @@ will pass.

      - - - - - - - + @@ -60,7 +60,7 @@
      - 34.3 + 34.9.0
      @@ -77,6 +77,7 @@ + + @@ -136,18 +136,20 @@ + +
      @@ -254,7 +230,6 @@ - - - - - - @@ -60,7 +60,7 @@
      - 34.3 + 34.9.0
      @@ -77,6 +77,7 @@ + + @@ -134,18 +133,20 @@ + +
      -

      - © Copyright 2018, Red Hat, Inc. + © Copyright 2018, Red Hat, Inc..

      - Built with Sphinx using a theme provided by Read the Docs. + + + + Built with Sphinx using a + + theme + + provided by Read the Docs. - @@ -219,7 +220,6 @@ command or the installpkgs paramater of jQuery(function () { SphinxRtdTheme.Navigation.enable(true); diff --git a/docs/html/py-modindex.html b/docs/html/py-modindex.html index a9e50993..90cc673e 100644 --- a/docs/html/py-modindex.html +++ b/docs/html/py-modindex.html @@ -1,38 +1,38 @@ - - + - + - + + + Python Module Index — Lorax 34.9.0 documentation + + + + + + - Python Module Index — Lorax 34.3 documentation - + - - - - - - @@ -61,7 +61,7 @@
      - 34.3 + 34.9.0
      @@ -78,6 +78,7 @@ +
      + @@ -133,11 +134,13 @@ + +
        -
      • Docs »
      • +
      • »
      • Python Module Index
      • @@ -158,185 +161,105 @@

        Python Module Index

        - c | p
        - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + id="toggle-1" style="display: none" alt="-" /> - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - +
         
        - c
        - composer -
            - composer.cli -
            - composer.cli.blueprints -
            - composer.cli.cmdline -
            - composer.cli.compose -
            - composer.cli.help -
            - composer.cli.modules -
            - composer.cli.projects -
            - composer.cli.providers -
            - composer.cli.sources -
            - composer.cli.status -
            - composer.cli.upload -
            - composer.cli.utilities -
            - composer.http_client -
            - composer.unix_socket -
         
        p
        pylorax
            pylorax.base
            pylorax.buildstamp
            pylorax.cmdline
            pylorax.creator
            pylorax.decorators
            pylorax.discinfo
            pylorax.dnfbase
            pylorax.dnfhelper
            pylorax.executils
            pylorax.imgutils
            pylorax.installer
            pylorax.ltmpl
            pylorax.monitor
            pylorax.mount
            pylorax.output
            pylorax.sysutils
            pylorax.treebuilder
            pylorax.treeinfo @@ -348,20 +271,25 @@ - @@ -370,7 +298,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - -
        - - - -
        - - - - - -
        - -
        - - - - - - - - - - - - - - - - - -
        - - - - -
        -
        -
        -
        - -
        -

        pylorax.api package

        -
        -

        Submodules

        -
        -
        -

        pylorax.api.bisect module

        -
        -
        -pylorax.api.bisect.insort_left(a, x, key=None, lo=0, hi=None)[source]
        -

        Insert item x in list a, and keep it sorted assuming a is sorted.

        -
        -
        Parameters
        -
          -
        • a (list) -- sorted list

        • -
        • x (object) -- item to insert into the list

        • -
        • key (function) -- Function to use to compare items in the list

        • -
        -
        -
        Returns
        -

        index where the item was inserted

        -
        -
        Return type
        -

        int

        -
        -
        -

        If x is already in a, insert it to the left of the leftmost x. -Optional args lo (default 0) and hi (default len(a)) bound the -slice of a to be searched.

        -

        This is a modified version of bisect.insort_left that can use a -function for the compare, and returns the index position where it -was inserted.

        -
        - -
        -
        -

        pylorax.api.checkparams module

        -
        -
        -pylorax.api.checkparams.checkparams(tuples)[source]
        -
        - -
        -
        -

        pylorax.api.cmdline module

        -
        -
        -pylorax.api.cmdline.lorax_composer_parser()[source]
        -

        Return the ArgumentParser for lorax-composer

        -
        - -
        -
        -

        pylorax.api.compose module

        -

        Setup for composing an image

        -
        -

        Adding New Output Types

        -

        The new output type must add a kickstart template to ./share/composer/ where the -name of the kickstart (without the trailing .ks) matches the entry in compose_args.

        -

        The kickstart should not have any url or repo entries, these will be added at build -time. The %packages section should be the last thing, and while it can contain mandatory -packages required by the output type, it should not have the trailing %end because the -package NEVRAs will be appended to it at build time.

        -

        compose_args should have a name matching the kickstart, and it should set the novirt_install -parameters needed to generate the desired output. Other types should be set to False.

        -
        -
        -pylorax.api.compose.add_customizations(f, recipe)[source]
        -

        Add customizations to the kickstart file

        -
        -
        Parameters
        -
          -
        • f (open file object) -- kickstart file object

        • -
        • recipe (Recipe object) --

        • -
        -
        -
        Returns
        -

        None

        -
        -
        Raises
        -

        RuntimeError if there was a problem writing to the kickstart

        -
        -
        -
        - -
        -
        -pylorax.api.compose.bootloader_append(line, kernel_append)[source]
        -

        Insert the kernel_append string into the --append argument

        -
        -
        Parameters
        -
          -
        • line (str) -- The bootloader ... line

        • -
        • kernel_append (str) -- The arguments to append to the --append section

        • -
        -
        -
        -

        Using pykickstart to process the line is the best way to make sure it -is parsed correctly, and re-assembled for inclusion into the final kickstart

        -
        - -
        -
        -pylorax.api.compose.compose_args(compose_type)[source]
        -

        Returns the settings to pass to novirt_install for the compose type

        -
        -
        Parameters
        -

        compose_type (str) -- The type of compose to create, from compose_types()

        -
        -
        -

        This will return a dict of options that match the ArgumentParser options for livemedia-creator. -These are the ones the define the type of output, it's filename, etc. -Other options will be filled in by make_compose()

        -
        - -
        -
        -pylorax.api.compose.compose_types(share_dir)[source]
        -

        Returns a list of tuples of the supported output types, and their state

        -

        The output types come from the kickstart names in /usr/share/lorax/composer/*ks

        -

        If they are disabled on the current arch their state is False. If enabled, it is True. -eg. [("alibaba", False), ("ext4-filesystem", True), ...]

        -
        - -
        -
        -pylorax.api.compose.customize_ks_template(ks_template, recipe)[source]
        -

        Customize the kickstart template and return it

        -
        -
        Parameters
        -
          -
        • ks_template (str) -- The kickstart template

        • -
        • recipe (Recipe object) --

        • -
        -
        -
        -

        Apply customizations to existing template commands, or add defaults for ones that are -missing and required.

        -

        Apply customizations.kernel.append to the bootloader argument in the template. -Add bootloader line if it is missing.

        -

        Add default timezone if needed. It does NOT replace an existing timezone entry

        -
        - -
        -
        -pylorax.api.compose.firewall_cmd(line, settings)[source]
        -

        Update the firewall line with the new ports and services

        -
        -
        Parameters
        -
          -
        • line (str) -- The firewall ... line

        • -
        • settings (dict) -- A dict with the list of services and ports to enable and disable

        • -
        -
        -
        -

        Using pykickstart to process the line is the best way to make sure it -is parsed correctly, and re-assembled for inclusion into the final kickstart

        -
        - -
        -
        -pylorax.api.compose.get_default_services(recipe)[source]
        -

        Get the default string for services, based on recipe -:param recipe: The recipe

        -
        -
        Returns
        -

        string with "services" or ""

        -
        -
        Return type
        -

        str

        -
        -
        -

        When no services have been selected we don't need to add anything to the kickstart -so return an empty string. Otherwise return "services" which will be updated with -the settings.

        -
        - -
        -
        -pylorax.api.compose.get_extra_pkgs(dbo, share_dir, compose_type)[source]
        -

        Return extra packages needed for the output type

        -
        -
        Parameters
        -
          -
        • dbo (dnf.Base) -- dnf base object

        • -
        • share_dir (str) -- Path to the top level share directory

        • -
        • compose_type (str) -- The type of output to create from the recipe

        • -
        -
        -
        Returns
        -

        List of package names (name only, not NEVRA)

        -
        -
        Return type
        -

        list

        -
        -
        -

        Currently this is only needed by live-iso, it reads ./live/live-install.tmpl and -processes only the installpkg lines. It lists the packages needed to complete creation of the -iso using the templates such as x86.tmpl

        -

        Keep in mind that the live-install.tmpl is shared between livemedia-creator and lorax-composer, -even though the results are applied differently.

        -
        - -
        -
        -pylorax.api.compose.get_firewall_settings(recipe)[source]
        -

        Return the customizations.firewall settings

        -
        -
        Parameters
        -

        recipe (Recipe object) -- The recipe

        -
        -
        Returns
        -

        A dict of settings

        -
        -
        Return type
        -

        dict

        -
        -
        -
        - -
        -
        -pylorax.api.compose.get_kernel_append(recipe)[source]
        -

        Return the customizations.kernel append value

        -
        -
        Parameters
        -

        recipe (Recipe object) --

        -
        -
        Returns
        -

        append value or empty string

        -
        -
        Return type
        -

        str

        -
        -
        -
        - -
        -
        -pylorax.api.compose.get_keyboard_layout(recipe)[source]
        -

        Return the customizations.locale.keyboard list

        -
        -
        Parameters
        -

        recipe (Recipe object) -- The recipe

        -
        -
        Returns
        -

        The keyboard layout string

        -
        -
        Return type
        -

        str

        -
        -
        -
        - -
        -
        -pylorax.api.compose.get_languages(recipe)[source]
        -

        Return the customizations.locale.languages list

        -
        -
        Parameters
        -

        recipe (Recipe object) -- The recipe

        -
        -
        Returns
        -

        list of language strings

        -
        -
        Return type
        -

        list

        -
        -
        -
        - -
        -
        -pylorax.api.compose.get_services(recipe)[source]
        -

        Return the customizations.services settings

        -
        -
        Parameters
        -

        recipe (Recipe object) -- The recipe

        -
        -
        Returns
        -

        A dict of settings

        -
        -
        Return type
        -

        dict

        -
        -
        -
        - -
        -
        -pylorax.api.compose.get_timezone_settings(recipe)[source]
        -

        Return the customizations.timezone dict

        -
        -
        Parameters
        -

        recipe (Recipe object) --

        -
        -
        Returns
        -

        append value or empty string

        -
        -
        Return type
        -

        dict

        -
        -
        -
        - -
        -
        -pylorax.api.compose.keyboard_cmd(line, layout)[source]
        -

        Update the keyboard line with the layout

        -
        -
        Parameters
        -
          -
        • line (str) -- The keyboard ... line

        • -
        • settings (str) -- The keyboard layout

        • -
        -
        -
        -

        Using pykickstart to process the line is the best way to make sure it -is parsed correctly, and re-assembled for inclusion into the final kickstart

        -
        - -
        -
        -pylorax.api.compose.lang_cmd(line, languages)[source]
        -

        Update the lang line with the languages

        -
        -
        Parameters
        -
          -
        • line (str) -- The lang ... line

        • -
        • settings (list) -- The list of languages

        • -
        -
        -
        -

        Using pykickstart to process the line is the best way to make sure it -is parsed correctly, and re-assembled for inclusion into the final kickstart

        -
        - -
        -
        -pylorax.api.compose.move_compose_results(cfg, results_dir)[source]
        -

        Move the final image to the results_dir and cleanup the unneeded compose files

        -
        -
        Parameters
        -
          -
        • cfg (DataHolder) -- Build configuration

        • -
        • results_dir (str) -- Directory to put the results into

        • -
        -
        -
        -
        - -
        -
        -pylorax.api.compose.repo_to_ks(r, url='url')[source]
        -

        Return a kickstart line with the correct args. -:param r: DNF repository information -:type r: dnf.Repo -:param url: "url" or "baseurl" to use for the baseurl parameter -:type url: str -:returns: kickstart command arguments for url/repo command -:rtype: str

        -

        Set url to "baseurl" if it is a repo, leave it as "url" for the installation url.

        -
        - -
        -
        -pylorax.api.compose.services_cmd(line, settings)[source]
        -

        Update the services line with additional services to enable/disable

        -
        -
        Parameters
        -
          -
        • line (str) -- The services ... line

        • -
        • settings (dict) -- A dict with the list of services to enable and disable

        • -
        -
        -
        -

        Using pykickstart to process the line is the best way to make sure it -is parsed correctly, and re-assembled for inclusion into the final kickstart

        -
        - -
        -
        -pylorax.api.compose.start_build(cfg, dnflock, gitlock, branch, recipe_name, compose_type, test_mode=0)[source]
        -

        Start the build

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration object

        • -
        • dnflock (YumLock) -- Lock and YumBase for depsolving

        • -
        • recipe (str) -- The recipe to build

        • -
        • compose_type (str) -- The type of output to create from the recipe

        • -
        -
        -
        Returns
        -

        Unique ID for the build that can be used to track its status

        -
        -
        Return type
        -

        str

        -
        -
        -
        - -
        -
        -pylorax.api.compose.test_templates(dbo, share_dir)[source]
        -

        Try depsolving each of the the templates and report any errors

        -
        -
        Parameters
        -

        dbo (dnf.Base) -- dnf base object

        -
        -
        Returns
        -

        List of template types and errors

        -
        -
        Return type
        -

        List of errors

        -
        -
        -

        Return a list of templates and errors encountered or an empty list

        -
        - -
        -
        -pylorax.api.compose.timezone_cmd(line, settings)[source]
        -

        Update the timezone line with the settings

        -
        -
        Parameters
        -
          -
        • line (str) -- The timezone ... line

        • -
        • settings (dict) -- A dict with timezone and/or ntpservers list

        • -
        -
        -
        -

        Using pykickstart to process the line is the best way to make sure it -is parsed correctly, and re-assembled for inclusion into the final kickstart

        -
        - -
        -
        -pylorax.api.compose.write_ks_group(f, group)[source]
        -

        Write kickstart group entry

        -
        -
        Parameters
        -
          -
        • f (open file object) -- kickstart file object

        • -
        • group -- A blueprint group dictionary

        • -
        -
        -
        -

        gid is optional

        -
        - -
        -
        -pylorax.api.compose.write_ks_root(f, user)[source]
        -

        Write kickstart root password and sshkey entry

        -
        -
        Parameters
        -
          -
        • f (open file object) -- kickstart file object

        • -
        • user (dict) -- A blueprint user dictionary

        • -
        -
        -
        Returns
        -

        True if it wrote a rootpw command to the kickstart

        -
        -
        Return type
        -

        bool

        -
        -
        -

        If the entry contains a ssh key, use sshkey to write it -If it contains password, use rootpw to set it

        -

        root cannot be used with the user command. So only key and password are supported -for root.

        -
        - -
        -
        -pylorax.api.compose.write_ks_user(f, user)[source]
        -

        Write kickstart user and sshkey entry

        -
        -
        Parameters
        -
          -
        • f (open file object) -- kickstart file object

        • -
        • user (dict) -- A blueprint user dictionary

        • -
        -
        -
        -

        If the entry contains a ssh key, use sshkey to write it -All of the user fields are optional, except name, write out a kickstart user entry -with whatever options are relevant.

        -
        - -
        -
        -
        -

        pylorax.api.config module

        -
        -
        -class pylorax.api.config.ComposerConfig(defaults=None, dict_type=<class 'dict'>, allow_no_value=False, *, delimiters=('=', ':'), comment_prefixes=('#', ';'), inline_comment_prefixes=None, strict=True, empty_lines_in_values=True, default_section='DEFAULT', interpolation=<object object>, converters=<object object>)[source]
        -

        Bases: configparser.ConfigParser

        -
        -
        -get_default(section, option, default)[source]
        -
        - -
        - -
        -
        -pylorax.api.config.configure(conf_file='/etc/lorax/composer.conf', root_dir='/', test_config=False)[source]
        -

        lorax-composer configuration

        -
        -
        Parameters
        -
          -
        • conf_file (str) -- Path to the config file overriding the default settings

        • -
        • root_dir (str) -- Directory to prepend to paths, defaults to /

        • -
        • test_config (bool) -- Set to True to skip reading conf_file

        • -
        -
        -
        Returns
        -

        Configuration

        -
        -
        Return type
        -

        ComposerConfig

        -
        -
        -
        - -
        -
        -pylorax.api.config.make_dnf_dirs(conf, uid, gid)[source]
        -

        Make any missing dnf directories owned by user:group

        -
        -
        Parameters
        -
          -
        • conf (ComposerConfig) -- The configuration to use

        • -
        • uid (int) -- uid of owner

        • -
        • gid (int) -- gid of owner

        • -
        -
        -
        Returns
        -

        list of errors

        -
        -
        Return type
        -

        list of str

        -
        -
        -
        - -
        -
        -pylorax.api.config.make_owned_dir(p_dir, uid, gid)[source]
        -

        Make a directory and its parents, setting owner and group

        -
        -
        Parameters
        -
          -
        • p_dir (string) -- path to directory to create

        • -
        • uid (int) -- uid of owner

        • -
        • gid (int) -- gid of owner

        • -
        -
        -
        Returns
        -

        list of errors

        -
        -
        Return type
        -

        list of str

        -
        -
        -

        Check to make sure it does not have o+rw permissions and that it is owned by uid:gid

        -
        - -
        -
        -pylorax.api.config.make_queue_dirs(conf, gid)[source]
        -

        Make any missing queue directories

        -
        -
        Parameters
        -
          -
        • conf (ComposerConfig) -- The configuration to use

        • -
        • gid (int) -- Group ID that has access to the queue directories

        • -
        -
        -
        Returns
        -

        list of errors

        -
        -
        Return type
        -

        list of str

        -
        -
        -
        - -
        -
        -

        pylorax.api.dnfbase module

        -
        -
        -class pylorax.api.dnfbase.DNFLock(conf, expire_secs=21600)[source]
        -

        Bases: object

        -

        Hold the dnf.Base object and a Lock to control access to it.

        -

        self.dbo is a property that returns the dnf.Base object, but it may change -from one call to the next if the upstream repositories have changed.

        -
        -
        -property lock
        -

        Check for repo updates (using expiration time) and return the lock

        -

        If the repository has been updated, tear down the old dnf.Base and -create a new one. This is the only way to force dnf to use the new -metadata.

        -
        - -
        -
        -property lock_check
        -

        Force a check for repo updates and return the lock

        -

        Use this method sparingly, it removes the repodata and downloads a new copy every time.

        -
        - -
        - -
        -
        -pylorax.api.dnfbase.get_base_object(conf)[source]
        -

        Get the DNF object with settings from the config file

        -
        -
        Parameters
        -

        conf (ComposerParser) -- configuration object

        -
        -
        Returns
        -

        A DNF Base object

        -
        -
        Return type
        -

        dnf.Base

        -
        -
        -
        - -
        -
        -

        pylorax.api.errors module

        -
        -
        -

        pylorax.api.flask_blueprint module

        -

        Flask Blueprints that support skipping routes

        -

        When using Blueprints for API versioning you will usually want to fall back -to the previous version's rules for routes that have no new behavior. To do -this we add a 'skip_rule' list to the Blueprint's options dictionary. It lists -all of the routes that you do not want to register.

        -
        -
        For example:

        from pylorax.api.v0 import v0 -from pylorax.api.v1 import v1

        -

        server.register_blueprint(v0, url_prefix="/api/v0/") -server.register_blueprint(v0, url_prefix="/api/v1/", skip_rules=["/blueprints/list"] -server.register_blueprint(v1, url_prefix="/api/v1/")

        -
        -
        -

        This will register all of v0's routes under /api/v0, and all but /blueprints/list under /api/v1, -and then register v1's version of /blueprints/list under /api/v1

        -
        -
        -class pylorax.api.flask_blueprint.BlueprintSetupStateSkip(blueprint, app, options, first_registration, skip_rules)[source]
        -

        Bases: flask.blueprints.BlueprintSetupState

        -
        -
        -add_url_rule(rule, endpoint=None, view_func=None, **options)[source]
        -

        A helper method to register a rule (and optionally a view function) -to the application. The endpoint is automatically prefixed with the -blueprint's name.

        -
        - -
        - -
        -
        -class pylorax.api.flask_blueprint.BlueprintSkip(*args, **kwargs)[source]
        -

        Bases: flask.blueprints.Blueprint

        -
        -
        -make_setup_state(app, options, first_registration=False)[source]
        -

        Creates an instance of BlueprintSetupState() -object that is later passed to the register callback functions. -Subclasses can override this to return a subclass of the setup state.

        -
        - -
        - -
        -
        -

        pylorax.api.gitrpm module

        -

        Clone a git repository and package it as an rpm

        -

        This module contains functions for cloning a git repo, creating a tar archive of -the selected commit, branch, or tag, and packaging the files into an rpm that will -be installed by anaconda when creating the image.

        -
        -
        -class pylorax.api.gitrpm.GitArchiveTarball(gitRepo)[source]
        -

        Bases: object

        -

        Create a git archive of the selected git repo and reference

        -
        -
        -write_file(sourcesDir)[source]
        -

        Create the tar archive

        -
        -
        Parameters
        -

        sourcesDir (str) -- Path to use for creating the archive

        -
        -
        -

        This clones the git repository and creates a git archive from the specified reference. -The result is in RPMNAME.tar.xz under the sourcesDir

        -
        - -
        - -
        -
        -class pylorax.api.gitrpm.GitRpmBuild(*args, **kwargs)[source]
        -

        Bases: rpmfluff.rpmbuild.SimpleRpmBuild

        -

        Build an rpm containing files from a git repository

        -
        -
        -add_git_tarball(gitRepo)[source]
        -

        Add a tar archive of a git repository to the rpm

        -
        -
        Parameters
        -

        gitRepo (dict) -- A dict with the repository details

        -
        -
        -

        This populates the rpm with the URL of the git repository, the summary -describing the repo, the description of the repository and reference used, -and sets up the rpm to install the archive contents into the destination -path.

        -
        - -
        -
        -check()[source]
        -
        - -
        -
        -clean()[source]
        -

        Remove the base directory from inside the tmpdir

        -
        - -
        -
        -cleanup_tmpdir()[source]
        -

        Remove the temporary directory and all of its contents

        -
        - -
        -
        -get_base_dir()[source]
        -

        Place all the files under a temporary directory + rpmbuild/

        -
        - -
        - -
        -
        -pylorax.api.gitrpm.create_gitrpm_repo(results_dir, recipe)[source]
        -

        Create a dnf repository with the rpms from the recipe

        -
        -
        Parameters
        -
          -
        • results_dir (str) -- Path to create the repository under

        • -
        • recipe (Recipe) -- The recipe to get the repos.git entries from

        • -
        -
        -
        Returns
        -

        Path to the dnf repository or ""

        -
        -
        Return type
        -

        str

        -
        -
        -

        This function creates a dnf repository directory at results_dir+"repo/", -creates rpms for all of the repos.git entries in the recipe, runs createrepo_c -on the dnf repository so that Anaconda can use it, and returns the path to the -repository to the caller.

        -
        - -
        -
        -pylorax.api.gitrpm.get_repo_description(gitRepo)[source]
        -

        Return a description including the git repo and reference

        -
        -
        Parameters
        -

        gitRepo (dict) -- A dict with the repository details

        -
        -
        Returns
        -

        A string with the git repo url and reference

        -
        -
        Return type
        -

        str

        -
        -
        -
        - -
        -
        -pylorax.api.gitrpm.make_git_rpm(gitRepo, dest)[source]
        -

        Create an rpm from the specified git repo

        -
        -
        Parameters
        -

        gitRepo (dict) -- A dict with the repository details

        -
        -
        -

        This will clone the git repository, create an archive of the selected reference, -and build an rpm that will install the files from the repository under the destination -directory. The gitRepo dict should have the following fields:

        -
        rpmname: "server-config"
        -rpmversion: "1.0"
        -rpmrelease: "1"
        -summary: "Setup files for server deployment"
        -repo: "PATH OF GIT REPO TO CLONE"
        -ref: "v1.0"
        -destination: "/opt/server/"
        -
        -
        -
          -
        • rpmname: Name of the rpm to create, also used as the prefix name in the tar archive

        • -
        • rpmversion: Version of the rpm, eg. "1.0.0"

        • -
        • rpmrelease: Release of the rpm, eg. "1"

        • -
        • summary: Summary string for the rpm

        • -
        • repo: URL of the get repo to clone and create the archive from

        • -
        • ref: Git reference to check out. eg. origin/branch-name, git tag, or git commit hash

        • -
        • destination: Path to install the / of the git repo at when installing the rpm

        • -
        -
        - -
        -
        -

        pylorax.api.projects module

        -
        -
        -exception pylorax.api.projects.ProjectsError[source]
        -

        Bases: Exception

        -
        - -
        -
        -pylorax.api.projects.api_changelog(changelog)[source]
        -

        Convert the changelog to a string

        -
        -
        Parameters
        -

        changelog (tuple) -- A list of time, author, string tuples.

        -
        -
        Returns
        -

        The most recent changelog text or ""

        -
        -
        Return type
        -

        str

        -
        -
        -

        This returns only the most recent changelog entry.

        -
        - -
        -
        -pylorax.api.projects.api_time(t)[source]
        -

        Convert time since epoch to a string

        -
        -
        Parameters
        -

        t (int) -- Seconds since epoch

        -
        -
        Returns
        -

        Time string

        -
        -
        Return type
        -

        str

        -
        -
        -
        - -
        -
        -pylorax.api.projects.delete_repo_source(source_glob, source_id)[source]
        -

        Delete a source from a repo file

        -
        -
        Parameters
        -
          -
        • source_glob (str) -- A glob of the repo sources to search

        • -
        • source_id (str) -- The repo id to delete

        • -
        -
        -
        Returns
        -

        None

        -
        -
        Raises
        -

        ProjectsError if there was a problem

        -
        -
        -

        A repo file may have multiple sources in it, delete only the selected source. -If it is the last one in the file, delete the file.

        -

        WARNING: This will delete ANY source, the caller needs to ensure that a system -source_id isn't passed to it.

        -
        - -
        -
        -pylorax.api.projects.dep_evra(dep)[source]
        -

        Return the epoch:version-release.arch for the dep

        -
        -
        Parameters
        -

        dep (dict) -- dependency dict

        -
        -
        Returns
        -

        epoch:version-release.arch

        -
        -
        Return type
        -

        str

        -
        -
        -
        - -
        -
        -pylorax.api.projects.dep_nevra(dep)[source]
        -

        Return the name-epoch:version-release.arch

        -
        - -
        -
        -pylorax.api.projects.dnf_repo_to_file_repo(repo)[source]
        -

        Return a string representation of a DNF Repo object suitable for writing to a .repo file

        -
        -
        Parameters
        -

        repo (dnf.RepoDict) -- DNF Repository

        -
        -
        Returns
        -

        A string

        -
        -
        Return type
        -

        str

        -
        -
        -

        The DNF Repo.dump() function does not produce a string that can be used as a dnf .repo file, -it ouputs baseurl and gpgkey as python lists which DNF cannot read. So do this manually with -only the attributes we care about.

        -
        - -
        -
        -pylorax.api.projects.estimate_size(packages, block_size=6144)[source]
        -

        Estimate the installed size of a package list

        -
        -
        Parameters
        -
          -
        • packages (list of hawkey.Package objects) -- The packages to be installed

        • -
        • block_size (int) -- The block size to use for rounding up file sizes.

        • -
        -
        -
        Returns
        -

        The estimated size of installed packages

        -
        -
        Return type
        -

        int

        -
        -
        -

        Estimating actual requirements is difficult without the actual file sizes, which -dnf doesn't provide access to. So use the file count and block size to estimate -a minimum size for each package.

        -
        - -
        -
        -pylorax.api.projects.get_repo_sources(source_glob)[source]
        -

        Return a list of sources from a directory of yum repositories

        -
        -
        Parameters
        -

        source_glob (str) -- A glob to use to match the source files, including full path

        -
        -
        Returns
        -

        A list of the source ids in all of the matching files

        -
        -
        Return type
        -

        list of str

        -
        -
        -
        - -
        -
        -pylorax.api.projects.get_source_ids(source_path)[source]
        -

        Return a list of the source ids in a file

        -
        -
        Parameters
        -

        source_path (str) -- Full path and filename of the source (yum repo) file

        -
        -
        Returns
        -

        A list of source id strings

        -
        -
        Return type
        -

        list of str

        -
        -
        -
        - -
        -
        -pylorax.api.projects.modules_info(dbo, module_names)[source]
        -

        Return details about a module, including dependencies

        -
        -
        Parameters
        -
          -
        • dbo (dnf.Base) -- dnf base object

        • -
        • module_names (str) -- Names of the modules to get info about

        • -
        -
        -
        Returns
        -

        List of dicts with module details and dependencies.

        -
        -
        Return type
        -

        list of dicts

        -
        -
        -
        - -
        -
        -pylorax.api.projects.modules_list(dbo, module_names)[source]
        -

        Return a list of modules

        -
        -
        Parameters
        -
          -
        • dbo (dnf.Base) -- dnf base object

        • -
        • offset -- Number of modules to skip

        • -
        • limit (int) -- Maximum number of modules to return

        • -
        -
        -
        Returns
        -

        List of module information and total count

        -
        -
        Return type
        -

        tuple of a list of dicts and an Int

        -
        -
        -

        Modules don't exist in RHEL7 so this only returns projects -and sets the type to "rpm"

        -
        - -
        -
        -pylorax.api.projects.new_repo_source(dbo, repoid, source, repo_dir)[source]
        -

        Add a new repo source from a Weldr source dict

        -
        -
        Parameters
        -
          -
        • dbo (dnf.Base) -- dnf base object

        • -
        • id (str) -- The repo id (API v0 uses the name, v1 uses the id)

        • -
        • source (dict) -- A Weldr source dict

        • -
        -
        -
        Returns
        -

        None

        -
        -
        Raises
        -

        ...

        -
        -
        -

        Make sure access to the dbo has been locked before calling this. -The id parameter will the the 'name' field for API v0, and the 'id' field for API v1

        -

        DNF variables will be substituted at load time, and on restart.

        -
        - -
        -
        -pylorax.api.projects.pkg_to_build(pkg)[source]
        -

        Extract the build details from a hawkey.Package object

        -
        -
        Parameters
        -

        pkg (hawkey.Package) -- hawkey.Package object with package details

        -
        -
        Returns
        -

        A dict with the build details, epoch, release, arch, build_time, changelog, ...

        -
        -
        Return type
        -

        dict

        -
        -
        -

        metadata entries are hard-coded to {}

        -

        Note that this only returns the build dict, it does not include the name, description, etc.

        -
        - -
        -
        -pylorax.api.projects.pkg_to_dep(pkg)[source]
        -

        Extract the info from a hawkey.Package object

        -
        -
        Parameters
        -

        pkg (hawkey.Package) -- A hawkey.Package object

        -
        -
        Returns
        -

        A dict with name, epoch, version, release, arch

        -
        -
        Return type
        -

        dict

        -
        -
        -
        - -
        -
        -pylorax.api.projects.pkg_to_project(pkg)[source]
        -

        Extract the details from a hawkey.Package object

        -
        -
        Parameters
        -

        pkgs (hawkey.Package) -- hawkey.Package object with package details

        -
        -
        Returns
        -

        A dict with the name, summary, description, and url.

        -
        -
        Return type
        -

        dict

        -
        -
        -

        upstream_vcs is hard-coded to UPSTREAM_VCS

        -
        - -
        -
        -pylorax.api.projects.pkg_to_project_info(pkg)[source]
        -

        Extract the details from a hawkey.Package object

        -
        -
        Parameters
        -

        pkg (hawkey.Package) -- hawkey.Package object with package details

        -
        -
        Returns
        -

        A dict with the project details, as well as epoch, release, arch, build_time, changelog, ...

        -
        -
        Return type
        -

        dict

        -
        -
        -

        metadata entries are hard-coded to {}

        -
        - -
        -
        -pylorax.api.projects.proj_to_module(proj)[source]
        -

        Extract the name from a project_info dict

        -
        -
        Parameters
        -

        pkg (dict) -- dict with package details

        -
        -
        Returns
        -

        A dict with name, and group_type

        -
        -
        Return type
        -

        dict

        -
        -
        -

        group_type is hard-coded to "rpm"

        -
        - -
        -
        -pylorax.api.projects.projects_depsolve(dbo, projects, groups)[source]
        -

        Return the dependencies for a list of projects

        -
        -
        Parameters
        -
          -
        • dbo (dnf.Base) -- dnf base object

        • -
        • projects (List of Strings) -- The projects to find the dependencies for

        • -
        • groups (List of str) -- The groups to include in dependency solving

        • -
        -
        -
        Returns
        -

        NEVRA's of the project and its dependencies

        -
        -
        Return type
        -

        list of dicts

        -
        -
        Raises
        -

        ProjectsError if there was a problem installing something

        -
        -
        -
        - -
        -
        -pylorax.api.projects.projects_depsolve_with_size(dbo, projects, groups, with_core=True)[source]
        -

        Return the dependencies and installed size for a list of projects

        -
        -
        Parameters
        -
          -
        • dbo (dnf.Base) -- dnf base object

        • -
        • project_names (List of Strings) -- The projects to find the dependencies for

        • -
        • groups (List of str) -- The groups to include in dependency solving

        • -
        -
        -
        Returns
        -

        installed size and a list of NEVRA's of the project and its dependencies

        -
        -
        Return type
        -

        tuple of (int, list of dicts)

        -
        -
        Raises
        -

        ProjectsError if there was a problem installing something

        -
        -
        -
        - -
        -
        -pylorax.api.projects.projects_info(dbo, project_names)[source]
        -

        Return details about specific projects

        -
        -
        Parameters
        -
          -
        • dbo (dnf.Base) -- dnf base object

        • -
        • project_names (str) -- List of names of projects to get info about

        • -
        -
        -
        Returns
        -

        List of project info dicts with pkg_to_project as well as epoch, version, release, etc.

        -
        -
        Return type
        -

        list of dicts

        -
        -
        -

        If project_names is None it will return the full list of available packages

        -
        - -
        -
        -pylorax.api.projects.projects_list(dbo)[source]
        -

        Return a list of projects

        -
        -
        Parameters
        -

        dbo (dnf.Base) -- dnf base object

        -
        -
        Returns
        -

        List of project info dicts with name, summary, description, homepage, upstream_vcs

        -
        -
        Return type
        -

        list of dicts

        -
        -
        -
        - -
        -
        -pylorax.api.projects.repo_to_source(repo, system_source, api=1)[source]
        -

        Return a Weldr Source dict created from the DNF Repository

        -
        -
        Parameters
        -
          -
        • repo (dnf.RepoDict) -- DNF Repository

        • -
        • system_source (bool) -- True if this source is an immutable system source

        • -
        • api (int) -- Select which api version of the dict to return (default 1)

        • -
        -
        -
        Returns
        -

        A dict with Weldr Source fields filled in

        -
        -
        Return type
        -

        dict

        -
        -
        -

        Example:

        -
        {
        -  "check_gpg": true,
        -  "check_ssl": true,
        -  "gpgkey_url": [
        -    "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-28-x86_64"
        -  ],
        -  "id": "fedora",
        -  "name": "Fedora $releasever - $basearch",
        -  "proxy": "http://proxy.brianlane.com:8123",
        -  "system": true
        -  "type": "yum-metalink",
        -  "url": "https://mirrors.fedoraproject.org/metalink?repo=fedora-28&arch=x86_64"
        -}
        -
        -
        -

        The name field has changed in v1 of the API. -In v0 of the API name is the repo.id, in v1 it is the repo.name and a new field, -id has been added for the repo.id

        -
        - -
        -
        -pylorax.api.projects.source_to_repo(source, dnf_conf)[source]
        -

        Return a dnf Repo object created from a source dict

        -
        -
        Parameters
        -
          -
        • source (dict) -- A Weldr source dict

        • -
        • dnf_conf (dnf.conf) -- The dnf Config object

        • -
        -
        -
        Returns
        -

        A dnf Repo object

        -
        -
        Return type
        -

        dnf.Repo

        -
        -
        -

        Example:

        -
        {
        -  "check_gpg": True,
        -  "check_ssl": True,
        -  "gpgkey_urls": [
        -    "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-28-x86_64"
        -  ],
        -  "id": "fedora",
        -  "name": "Fedora $releasever - $basearch",
        -  "proxy": "http://proxy.brianlane.com:8123",
        -  "system": True
        -  "type": "yum-metalink",
        -  "url": "https://mirrors.fedoraproject.org/metalink?repo=fedora-28&arch=x86_64"
        -}
        -
        -
        -

        If the id field is included it is used for the repo id, otherwise name is used. -v0 of the API only used name, v1 added the distinction between id and name.

        -
        - -
        -
        -pylorax.api.projects.source_to_repodict(source)[source]
        -

        Return a tuple suitable for use with dnf.add_new_repo

        -
        -
        Parameters
        -

        source (dict) -- A Weldr source dict

        -
        -
        Returns
        -

        A tuple of dnf.Repo attributes

        -
        -
        Return type
        -

        (str, list, dict)

        -
        -
        -

        Return a tuple with (id, baseurl|(), kwargs) that can be used -with dnf.repos.add_new_repo

        -
        - -
        -
        -

        pylorax.api.queue module

        -

        Functions to monitor compose queue and run anaconda

        -
        -
        -pylorax.api.queue.build_status(cfg, status_filter=None, api=1)[source]
        -

        Return the details of finished or failed builds

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • status_filter (str) -- What builds to return. None == all, "FINISHED", or "FAILED"

        • -
        • api (int) -- Select which api version of the dict to return (default 1)

        • -
        -
        -
        Returns
        -

        A list of the build details (from compose_detail)

        -
        -
        Return type
        -

        list of dicts

        -
        -
        -

        This returns a list of build details for each of the matching builds on the -system. It does not return the status of builds that have not been finished. -Use queue_status() for those.

        -
        - -
        -
        -pylorax.api.queue.check_queues(cfg)[source]
        -

        Check to make sure the new and run queue symlinks are correct

        -
        -
        Parameters
        -

        cfg (DataHolder) -- Configuration settings

        -
        -
        -

        Also check all of the existing results and make sure any with WAITING -set in STATUS have a symlink in queue/new/

        -
        - -
        -
        -pylorax.api.queue.compose_detail(cfg, results_dir, api=1)[source]
        -

        Return details about the build.

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings (required for api=1)

        • -
        • results_dir (str) -- The directory containing the metadata and results for the build

        • -
        • api (int) -- Select which api version of the dict to return (default 1)

        • -
        -
        -
        Returns
        -

        A dictionary with details about the compose

        -
        -
        Return type
        -

        dict

        -
        -
        Raises
        -

        IOError if it cannot read the directory, STATUS, or blueprint file.

        -
        -
        -

        The following details are included in the dict:

        -
          -
        • id - The uuid of the comoposition

        • -
        • queue_status - The final status of the composition (FINISHED or FAILED)

        • -
        • compose_type - The type of output generated (tar, iso, etc.)

        • -
        • blueprint - Blueprint name

        • -
        • version - Blueprint version

        • -
        • image_size - Size of the image, if finished. 0 otherwise.

        • -
        • uploads - For API v1 details about uploading the image are included

        • -
        -

        Various timestamps are also included in the dict. These are all Unix UTC timestamps. -It is possible for these timestamps to not always exist, in which case they will be -None in Python (or null in JSON). The following timestamps are included:

        -
          -
        • job_created - When the user submitted the compose

        • -
        • job_started - Anaconda started running

        • -
        • job_finished - Job entered FINISHED or FAILED state

        • -
        -
        - -
        -
        -pylorax.api.queue.get_compose_type(results_dir)[source]
        -

        Return the type of composition.

        -
        -
        Parameters
        -

        results_dir (str) -- The directory containing the metadata and results for the build

        -
        -
        Returns
        -

        The type of compose (eg. 'tar')

        -
        -
        Return type
        -

        str

        -
        -
        Raises
        -

        RuntimeError if no kickstart template can be found.

        -
        -
        -
        - -
        -
        -pylorax.api.queue.get_image_name(uuid_dir)[source]
        -

        Return the filename and full path of the build's image file

        -
        -
        Parameters
        -

        uuid (str) -- The UUID of the build

        -
        -
        Returns
        -

        The image filename and full path

        -
        -
        Return type
        -

        tuple of strings

        -
        -
        Raises
        -

        RuntimeError if there was a problem (eg. invalid uuid, missing config file)

        -
        -
        -
        - -
        -
        -pylorax.api.queue.make_compose(cfg, results_dir)[source]
        -

        Run anaconda with the final-kickstart.ks from results_dir

        -
        -
        Parameters
        -
          -
        • cfg (DataHolder) -- Configuration settings

        • -
        • results_dir (str) -- The directory containing the metadata and results for the build

        • -
        -
        -
        Returns
        -

        Nothing

        -
        -
        Raises
        -

        May raise various exceptions

        -
        -
        -

        This takes the final-kickstart.ks, and the settings in config.toml and runs Anaconda -in no-virt mode (directly on the host operating system). Exceptions should be caught -at the higer level.

        -

        If there is a failure, the build artifacts will be cleaned up, and any logs will be -moved into logs/anaconda/ and their ownership will be set to the user from the cfg -object.

        -
        - -
        -
        -pylorax.api.queue.monitor(cfg)[source]
        -

        Monitor the queue for new compose requests

        -
        -
        Parameters
        -

        cfg (DataHolder) -- Configuration settings

        -
        -
        Returns
        -

        Does not return

        -
        -
        -

        The queue has 2 subdirectories, new and run. When a compose is ready to be run -a symlink to the uniquely named results directory should be placed in ./queue/new/

        -

        When the it is ready to be run (it is checked every 30 seconds or after a previous -compose is finished) the symlink will be moved into ./queue/run/ and a STATUS file -will be created in the results directory.

        -

        STATUS can contain one of: WAITING, RUNNING, FINISHED, FAILED

        -

        If the system is restarted while a compose is running it will move any old symlinks -from ./queue/run/ to ./queue/new/ and rerun them.

        -
        - -
        -
        -pylorax.api.queue.queue_status(cfg, api=1)[source]
        -

        Return details about what is in the queue.

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • api (int) -- Select which api version of the dict to return (default 1)

        • -
        -
        -
        Returns
        -

        A list of the new composes, and a list of the running composes

        -
        -
        Return type
        -

        dict

        -
        -
        -

        This returns a dict with 2 lists. "new" is the list of uuids that are waiting to be built, -and "run" has the uuids that are being built (currently limited to 1 at a time).

        -
        - -
        -
        -pylorax.api.queue.start_queue_monitor(cfg, uid, gid)[source]
        -

        Start the queue monitor as a mp process

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • uid (int) -- User ID that owns the queue

        • -
        • gid (int) -- Group ID that owns the queue

        • -
        -
        -
        Returns
        -

        None

        -
        -
        -
        - -
        -
        -pylorax.api.queue.uuid_add_upload(cfg, uuid, upload_uuid)[source]
        -

        Add an upload UUID to a build

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • uuid (str) -- The UUID of the build

        • -
        • upload_uuid (str) -- The UUID of the upload

        • -
        -
        -
        Returns
        -

        None

        -
        -
        Return type
        -

        None

        -
        -
        -
        - -
        -
        -pylorax.api.queue.uuid_cancel(cfg, uuid)[source]
        -

        Cancel a build and delete its results

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • uuid (str) -- The UUID of the build

        • -
        -
        -
        Returns
        -

        True if it was canceled and deleted

        -
        -
        Return type
        -

        bool

        -
        -
        -

        Only call this if the build status is WAITING or RUNNING

        -
        - -
        -
        -pylorax.api.queue.uuid_delete(cfg, uuid)[source]
        -

        Delete all of the results from a compose

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • uuid (str) -- The UUID of the build

        • -
        -
        -
        Returns
        -

        True if it was deleted

        -
        -
        Return type
        -

        bool

        -
        -
        Raises
        -

        This will raise an error if the delete failed

        -
        -
        -
        - -
        -
        -pylorax.api.queue.uuid_get_uploads(cfg, uuid)[source]
        -

        Return the list of uploads for a build uuid

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • uuid (str) -- The UUID of the build

        • -
        -
        -
        Returns
        -

        The upload UUIDs associated with the build UUID

        -
        -
        Return type
        -

        frozenset

        -
        -
        -
        - -
        -
        -pylorax.api.queue.uuid_image(cfg, uuid)[source]
        -

        Return the filename and full path of the build's image file

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • uuid (str) -- The UUID of the build

        • -
        -
        -
        Returns
        -

        The image filename and full path

        -
        -
        Return type
        -

        tuple of strings

        -
        -
        Raises
        -

        RuntimeError if there was a problem (eg. invalid uuid, missing config file)

        -
        -
        -
        - -
        -
        -pylorax.api.queue.uuid_info(cfg, uuid, api=1)[source]
        -

        Return information about the composition

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • uuid (str) -- The UUID of the build

        • -
        -
        -
        Returns
        -

        dictionary of information about the composition or None

        -
        -
        Return type
        -

        dict

        -
        -
        Raises
        -

        RuntimeError if there was a problem

        -
        -
        -

        This will return a dict with the following fields populated:

        -
          -
        • id - The uuid of the comoposition

        • -
        • config - containing the configuration settings used to run Anaconda

        • -
        • blueprint - The depsolved blueprint used to generate the kickstart

        • -
        • commit - The (local) git commit hash for the blueprint used

        • -
        • deps - The NEVRA of all of the dependencies used in the composition

        • -
        • compose_type - The type of output generated (tar, iso, etc.)

        • -
        • queue_status - The final status of the composition (FINISHED or FAILED)

        • -
        -
        - -
        -
        -pylorax.api.queue.uuid_log(cfg, uuid, size=1024)[source]
        -

        Return size KiB from the end of the most currently relevant log for a -given compose

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • uuid (str) -- The UUID of the build

        • -
        • size (int) -- Number of KiB to read. Default is 1024

        • -
        -
        -
        Returns
        -

        Up to size KiB from the end of the log

        -
        -
        Return type
        -

        str

        -
        -
        Raises
        -

        RuntimeError if there was a problem (eg. no log file available)

        -
        -
        -

        This function will return the end of either the anaconda log, the packaging -log, or the combined composer logs, depending on the progress of the -compose. It tries to return lines from the end of the log, it will attempt -to start on a line boundary, and it may return less than size kbytes.

        -
        - -
        -
        -pylorax.api.queue.uuid_ready_upload(cfg, uuid, upload_uuid)[source]
        -

        Set an upload to READY if the build is in FINISHED state

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • uuid (str) -- The UUID of the build

        • -
        • upload_uuid (str) -- The UUID of the upload

        • -
        -
        -
        Returns
        -

        None

        -
        -
        Return type
        -

        None

        -
        -
        Raises
        -

        RuntimeError if the build uuid is invalid or not in FINISHED state.

        -
        -
        -
        - -
        -
        -pylorax.api.queue.uuid_remove_upload(cfg, upload_uuid)[source]
        -

        Remove an upload UUID from the build

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • upload_uuid (str) -- The UUID of the upload

        • -
        -
        -
        Returns
        -

        None

        -
        -
        Return type
        -

        None

        -
        -
        Raises
        -

        RuntimeError if the upload_uuid is not found

        -
        -
        -
        - -
        -
        -pylorax.api.queue.uuid_schedule_upload(cfg, uuid, provider_name, image_name, settings)[source]
        -

        Schedule an upload of an image

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • uuid (str) -- The UUID of the build

        • -
        • provider_name (str) -- The name of the cloud provider, e.g. "azure"

        • -
        • image_name (str) -- Path of the image to upload

        • -
        • settings (dict) -- Settings to use for the selected provider

        • -
        -
        -
        Returns
        -

        uuid of the upload

        -
        -
        Return type
        -

        str

        -
        -
        Raises
        -

        RuntimeError if the uuid is not a valid build uuid

        -
        -
        -
        - -
        -
        -pylorax.api.queue.uuid_status(cfg, uuid, api=1)[source]
        -

        Return the details of a specific UUID compose

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • uuid (str) -- The UUID of the build

        • -
        • api (int) -- Select which api version of the dict to return (default 1)

        • -
        -
        -
        Returns
        -

        Details about the build

        -
        -
        Return type
        -

        dict or None

        -
        -
        -

        Returns the same dict as compose_detail()

        -
        - -
        -
        -pylorax.api.queue.uuid_tar(cfg, uuid, metadata=False, image=False, logs=False)[source]
        -

        Return a tar of the build data

        -
        -
        Parameters
        -
          -
        • cfg (ComposerConfig) -- Configuration settings

        • -
        • uuid (str) -- The UUID of the build

        • -
        • metadata (bool) -- Set to true to include all the metadata needed to reproduce the build

        • -
        • image (bool) -- Set to true to include the output image

        • -
        • logs (bool) -- Set to true to include the logs from the build

        • -
        -
        -
        Returns
        -

        A stream of bytes from tar

        -
        -
        Return type
        -

        A generator

        -
        -
        Raises
        -

        RuntimeError if there was a problem (eg. missing config file)

        -
        -
        -

        This yields an uncompressed tar's data to the caller. It includes -the selected data to the caller by returning the Popen stdout from the tar process.

        -
        - -
        -
        -

        pylorax.api.recipes module

        -
        -
        -class pylorax.api.recipes.CommitDetails(commit, timestamp, message, revision=None)[source]
        -

        Bases: pylorax.base.DataHolder

        -
        - -
        -
        -exception pylorax.api.recipes.CommitTimeValError[source]
        -

        Bases: Exception

        -
        - -
        -
        -pylorax.api.recipes.NewRecipeGit(toml_dict)[source]
        -

        Create a RecipeGit object from fields in a TOML dict

        -
        -
        Parameters
        -
          -
        • rpmname (str) -- Name of the rpm to create, also used as the prefix name in the tar archive

        • -
        • rpmversion (str) -- Version of the rpm, eg. "1.0.0"

        • -
        • rpmrelease (str) -- Release of the rpm, eg. "1"

        • -
        • summary (str) -- Summary string for the rpm

        • -
        • repo (str) -- URL of the get repo to clone and create the archive from

        • -
        • ref (str) -- Git reference to check out. eg. origin/branch-name, git tag, or git commit hash

        • -
        • destination (str) -- Path to install the / of the git repo at when installing the rpm

        • -
        -
        -
        Returns
        -

        A populated RecipeGit object

        -
        -
        Return type
        -

        RecipeGit

        -
        -
        -

        The TOML should look like this:

        -
        [[repos.git]]
        -rpmname="server-config"
        -rpmversion="1.0"
        -rpmrelease="1"
        -summary="Setup files for server deployment"
        -repo="PATH OF GIT REPO TO CLONE"
        -ref="v1.0"
        -destination="/opt/server/"
        -
        -
        -

        Note that the repo path supports anything that git supports, file://, https://, http://

        -

        Currently there is no support for authentication

        -
        - -
        -
        -class pylorax.api.recipes.Recipe(name, description, version, modules, packages, groups, customizations=None, gitrepos=None)[source]
        -

        Bases: dict

        -

        A Recipe of package and modules

        -

        This is a subclass of dict that enforces the constructor arguments -and adds a .filename property to return the recipe's filename, -and a .toml() function to return the recipe as a TOML string.

        -
        -
        -bump_version(old_version=None)[source]
        -

        semver recipe version number bump

        -
        -
        Parameters
        -

        old_version (str) -- An optional old version number

        -
        -
        Returns
        -

        The new version number or None

        -
        -
        Return type
        -

        str

        -
        -
        Raises
        -

        ValueError

        -
        -
        -

        If neither have a version, 0.0.1 is returned -If there is no old version the new version is checked and returned -If there is no new version, but there is a old one, bump its patch level -If the old and new versions are the same, bump the patch level -If they are different, check and return the new version

        -
        - -
        -
        -property filename
        -

        Return the Recipe's filename

        -

        Replaces spaces in the name with '-' and appends .toml

        -
        - -
        -
        -freeze(deps)[source]
        -

        Return a new Recipe with full module and package NEVRA

        -
        -
        Parameters
        -

        deps (list() -- A list of dependency NEVRA to use to fill in the modules and packages

        -
        -
        Returns
        -

        A new Recipe object

        -
        -
        Return type
        -

        Recipe

        -
        -
        -
        - -
        -
        -property group_names
        -

        Return the names of the groups. Groups do not have versions.

        -
        - -
        -
        -property module_names
        -

        Return the names of the modules

        -
        - -
        -
        -property module_nver
        -

        Return the names and version globs of the modules

        -
        - -
        -
        -property package_names
        -

        Return the names of the packages

        -
        - -
        -
        -property package_nver
        -

        Return the names and version globs of the packages

        -
        - -
        -
        -toml()[source]
        -

        Return the Recipe in TOML format

        -
        - -
        - -
        -
        -exception pylorax.api.recipes.RecipeError[source]
        -

        Bases: Exception

        -
        - -
        -
        -exception pylorax.api.recipes.RecipeFileError[source]
        -

        Bases: Exception

        -
        - -
        -
        -class pylorax.api.recipes.RecipeGit(rpmname, rpmversion, rpmrelease, summary, repo, ref, destination)[source]
        -

        Bases: dict

        -
        - -
        -
        -class pylorax.api.recipes.RecipeGroup(name)[source]
        -

        Bases: dict

        -
        - -
        -
        -class pylorax.api.recipes.RecipeModule(name, version)[source]
        -

        Bases: dict

        -
        - -
        -
        -class pylorax.api.recipes.RecipePackage(name, version)[source]
        -

        Bases: pylorax.api.recipes.RecipeModule

        -
        - -
        -
        -pylorax.api.recipes.check_list_case(expected_keys, recipe_keys, prefix='')[source]
        -

        Check the case of the recipe keys

        -
        -
        Parameters
        -
          -
        • expected_keys (list of str) -- A list of expected key strings

        • -
        • recipe_keys (list of str) -- A list of the recipe's key strings

        • -
        -
        -
        Returns
        -

        list of errors

        -
        -
        Return type
        -

        list of str

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.check_recipe_dict(recipe_dict)[source]
        -

        Check a dict before using it to create a new Recipe

        -
        -
        Parameters
        -

        recipe_dict (dict) -- A plain dict of the recipe

        -
        -
        Returns
        -

        True if dict is ok

        -
        -
        Return type
        -

        bool

        -
        -
        Raises
        -

        RecipeError

        -
        -
        -

        This checks a dict to make sure required fields are present, -that optional fields are correct, and that other optional fields -are of the correct format, when included.

        -

        This collects all of the errors and returns a single RecipeError with -a string that can be presented to users.

        -
        - -
        -
        -pylorax.api.recipes.check_required_list(lst, fields)[source]
        -

        Check a list of dicts for required fields

        -
        -
        Parameters
        -
          -
        • lst (list of dict) -- A list of dicts with fields

        • -
        • fields (list of str) -- A list of field name strings

        • -
        -
        -
        Returns
        -

        A list of error strings

        -
        -
        Return type
        -

        list of str

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.commit_recipe(repo, branch, recipe)[source]
        -

        Commit a recipe to a branch

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • recipe (Recipe) -- Recipe to commit

        • -
        -
        -
        Returns
        -

        OId of the new commit

        -
        -
        Return type
        -

        Git.OId

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.commit_recipe_directory(repo, branch, directory)[source]
        -

        Commit all *.toml files from a directory, if they aren't already in git.

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • directory (str) -- The directory of *.toml recipes to commit

        • -
        -
        -
        Returns
        -

        None

        -
        -
        Raises
        -

        Can raise errors from Ggit or RecipeFileError

        -
        -
        -

        Files with Toml or RecipeFileErrors will be skipped, and the remainder will -be tried.

        -
        - -
        -
        -pylorax.api.recipes.commit_recipe_file(repo, branch, filename)[source]
        -

        Commit a recipe file to a branch

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • filename (str) -- Path to the recipe file to commit

        • -
        -
        -
        Returns
        -

        OId of the new commit

        -
        -
        Return type
        -

        Git.OId

        -
        -
        Raises
        -

        Can raise errors from Ggit or RecipeFileError

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.customizations_diff(old_recipe, new_recipe)[source]
        -

        Diff the customizations sections from two versions of a recipe

        -
        - -
        -
        -pylorax.api.recipes.delete_file(repo, branch, filename)[source]
        -

        Delete a file from a branch.

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • filename (str) -- filename to delete

        • -
        -
        -
        Returns
        -

        OId of the new commit

        -
        -
        Return type
        -

        Git.OId

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.delete_recipe(repo, branch, recipe_name)[source]
        -

        Delete a recipe from a branch.

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • recipe_name (str) -- Recipe name to delete

        • -
        -
        -
        Returns
        -

        OId of the new commit

        -
        -
        Return type
        -

        Git.OId

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.diff_lists(title, field, old_items, new_items)[source]
        -

        Return the differences between two lists of dicts.

        -
        -
        Parameters
        -
          -
        • title (str) -- Title of the entry

        • -
        • field (str) -- Field to use as the key for comparisons

        • -
        • old_items (list(dict)) -- List of item dicts with "name" field

        • -
        • new_items (list(dict)) -- List of item dicts with "name" field

        • -
        -
        -
        Returns
        -

        List of diff dicts with old/new entries

        -
        -
        Return type
        -

        list(dict)

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.find_commit_tag(repo, branch, filename, commit_id)[source]
        -

        Find the tag that matches the commit_id

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • filename (str) -- filename to revert

        • -
        • commit_id (Git.OId) -- The commit id to check

        • -
        -
        -
        Returns
        -

        The tag or None if there isn't one

        -
        -
        Return type
        -

        str or None

        -
        -
        -

        There should be only 1 tag pointing to a commit, but there may not -be a tag at all.

        -

        The tag will look like: 'refs/tags/<branch>/<filename>/r<revision>'

        -
        - -
        -
        -pylorax.api.recipes.find_field_value(field, value, lst)[source]
        -

        Find a field matching value in the list of dicts.

        -
        -
        Parameters
        -
          -
        • field (str) -- field to search for

        • -
        • value (str) -- value to match in the field

        • -
        • lst (list of dict) -- List of dict's with field

        • -
        -
        -
        Returns
        -

        First dict with matching field:value, or None

        -
        -
        Return type
        -

        dict or None

        -
        -
        -

        Used to return a specific entry from a list that looks like this:

        -

        [{"name": "one", "attr": "green"}, ...]

        -

        find_field_value("name", "one", lst) will return the matching dict.

        -
        - -
        -
        -pylorax.api.recipes.find_name(name, lst)[source]
        -

        Find the dict matching the name in a list and return it.

        -
        -
        Parameters
        -
          -
        • name (str) -- Name to search for

        • -
        • lst (list of dict) -- List of dict's with "name" field

        • -
        -
        -
        Returns
        -

        First dict with matching name, or None

        -
        -
        Return type
        -

        dict or None

        -
        -
        -

        This is just a wrapper for find_field_value with field set to "name"

        -
        - -
        -
        -pylorax.api.recipes.find_recipe_obj(path, recipe, default=None)[source]
        -

        Find a recipe object

        -
        -
        Parameters
        -
          -
        • path (list of str) -- A list of dict field names

        • -
        • recipe (Recipe) -- The recipe to search

        • -
        • default (Any) -- The value to return if it is not found

        • -
        -
        -
        -

        Return the object found by applying the path to the dicts in the recipe, or -return the default if it doesn't exist.

        -

        eg. {"customizations": {"hostname": "foo", "users": [...]}}

        -

        find_recipe_obj(["customizations", "hostname"], recipe, "")

        -
        - -
        -
        -pylorax.api.recipes.get_commit_details(commit, revision=None)[source]
        -

        Return the details about a specific commit.

        -
        -
        Parameters
        -
          -
        • commit (Git.Commit) -- The commit to get details from

        • -
        • revision (int) -- Optional commit revision

        • -
        -
        -
        Returns
        -

        Details about the commit

        -
        -
        Return type
        -

        CommitDetails

        -
        -
        Raises
        -

        CommitTimeValError or Ggit exceptions

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.get_revision_from_tag(tag)[source]
        -

        Return the revision number from a tag

        -
        -
        Parameters
        -

        tag (str) -- The tag to exract the revision from

        -
        -
        Returns
        -

        The integer revision or None

        -
        -
        Return type
        -

        int or None

        -
        -
        -

        The revision is the part after the r in 'branch/filename/rXXX'

        -
        - -
        -
        -pylorax.api.recipes.gfile(path)[source]
        -

        Convert a string path to GFile for use with Git

        -
        - -
        -
        -pylorax.api.recipes.head_commit(repo, branch)[source]
        -

        Get the branch's HEAD Commit Object

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        -
        -
        Returns
        -

        Branch's head commit

        -
        -
        Return type
        -

        Git.Commit

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.is_commit_tag(repo, commit_id, tag)[source]
        -

        Check to see if a tag points to a specific commit.

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • commit_id (Git.OId) -- The commit id to check

        • -
        • tag (str) -- The tag to check

        • -
        -
        -
        Returns
        -

        True if the tag points to the commit, False otherwise

        -
        -
        Return type
        -

        bool

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.is_parent_diff(repo, filename, tree, parent)[source]
        -

        Check to see if the commit is different from its parents

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • filename (str) -- filename to revert

        • -
        • tree (Git.Tree) -- The commit's tree

        • -
        • parent (Git.Commit) -- The commit's parent commit

        • -
        -
        -
        Retuns
        -

        True if filename in the commit is different from its parents

        -
        -
        Return type
        -

        bool

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.list_branch_files(repo, branch)[source]
        -

        Return a sorted list of the files on the branch HEAD

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        -
        -
        Returns
        -

        A sorted list of the filenames

        -
        -
        Return type
        -

        list(str)

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.list_commit_files(repo, commit)[source]
        -

        Return a sorted list of the files on a commit

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • commit (str) -- The commit hash to list

        • -
        -
        -
        Returns
        -

        A sorted list of the filenames

        -
        -
        Return type
        -

        list(str)

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.list_commits(repo, branch, filename, limit=0)[source]
        -

        List the commit history of a file on a branch.

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • filename (str) -- filename to revert

        • -
        • limit (int) -- Number of commits to return (0=all)

        • -
        -
        -
        Returns
        -

        A list of commit details

        -
        -
        Return type
        -

        list(CommitDetails)

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.open_or_create_repo(path)[source]
        -

        Open an existing repo, or create a new one

        -
        -
        Parameters
        -

        path (string) -- path to recipe directory

        -
        -
        Returns
        -

        A repository object

        -
        -
        Return type
        -

        Git.Repository

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -

        A bare git repo will be created in the git directory of the specified path. -If a repo already exists it will be opened and returned instead of -creating a new one.

        -
        - -
        -
        -pylorax.api.recipes.prepare_commit(repo, branch, builder)[source]
        -

        Prepare for a commit

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • builder (TreeBuilder) -- instance of TreeBuilder

        • -
        -
        -
        Returns
        -

        (Tree, Sig, Ref)

        -
        -
        Return type
        -

        tuple

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.read_commit(repo, branch, filename, commit=None)[source]
        -

        Return the contents of a file on a specific branch or commit.

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • filename (str) -- filename to read

        • -
        • commit (str) -- Optional commit hash

        • -
        -
        -
        Returns
        -

        The commit id, and the contents of the commit

        -
        -
        Return type
        -

        tuple(str, str)

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -

        If no commit is passed the master:filename is returned, otherwise it will be -commit:filename

        -
        - -
        -
        -pylorax.api.recipes.read_commit_spec(repo, spec)[source]
        -

        Return the raw content of the blob specified by the spec

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • spec (str) -- Git revparse spec

        • -
        -
        -
        Returns
        -

        Contents of the commit

        -
        -
        Return type
        -

        str

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -

        eg. To read the README file from master the spec is "master:README"

        -
        - -
        -
        -pylorax.api.recipes.read_recipe_and_id(repo, branch, recipe_name, commit=None)[source]
        -

        Read a recipe commit and its id from git

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • recipe_name (str) -- Recipe name to read

        • -
        • commit (str) -- Optional commit hash

        • -
        -
        -
        Returns
        -

        The commit id, and a Recipe object

        -
        -
        Return type
        -

        tuple(str, Recipe)

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -

        If no commit is passed the master:filename is returned, otherwise it will be -commit:filename

        -
        - -
        -
        -pylorax.api.recipes.read_recipe_commit(repo, branch, recipe_name, commit=None)[source]
        -

        Read a recipe commit from git and return a Recipe object

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • recipe_name (str) -- Recipe name to read

        • -
        • commit (str) -- Optional commit hash

        • -
        -
        -
        Returns
        -

        A Recipe object

        -
        -
        Return type
        -

        Recipe

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -

        If no commit is passed the master:filename is returned, otherwise it will be -commit:filename

        -
        - -
        -
        -pylorax.api.recipes.recipe_diff(old_recipe, new_recipe)[source]
        -

        Diff two versions of a recipe

        -
        -
        Parameters
        -
          -
        • old_recipe (Recipe) -- The old version of the recipe

        • -
        • new_recipe (Recipe) -- The new version of the recipe

        • -
        -
        -
        Returns
        -

        A list of diff dict entries with old/new

        -
        -
        Return type
        -

        list(dict)

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.recipe_filename(name)[source]
        -

        Return the toml filename for a recipe

        -

        Replaces spaces with '-' and appends '.toml'

        -
        - -
        -
        -pylorax.api.recipes.recipe_from_dict(recipe_dict)[source]
        -

        Create a Recipe object from a plain dict.

        -
        -
        Parameters
        -

        recipe_dict (dict) -- A plain dict of the recipe

        -
        -
        Returns
        -

        A Recipe object

        -
        -
        Return type
        -

        Recipe

        -
        -
        Raises
        -

        RecipeError

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.recipe_from_file(recipe_path)[source]
        -

        Return a recipe file as a Recipe object

        -
        -
        Parameters
        -

        recipe_path (str) -- Path to the recipe fila

        -
        -
        Returns
        -

        A Recipe object

        -
        -
        Return type
        -

        Recipe

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.recipe_from_toml(recipe_str)[source]
        -

        Create a Recipe object from a toml string.

        -
        -
        Parameters
        -

        recipe_str (str) -- The Recipe TOML string

        -
        -
        Returns
        -

        A Recipe object

        -
        -
        Return type
        -

        Recipe

        -
        -
        Raises
        -

        TomlError

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.repo_file_exists(repo, branch, filename)[source]
        -

        Return True if the filename exists on the branch

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • filename (str) -- Filename to check

        • -
        -
        -
        Returns
        -

        True if the filename exists on the HEAD of the branch, False otherwise.

        -
        -
        Return type
        -

        bool

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.revert_file(repo, branch, filename, commit)[source]
        -

        Revert the contents of a file to that of a previous commit

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • filename (str) -- filename to revert

        • -
        • commit (str) -- Commit hash

        • -
        -
        -
        Returns
        -

        OId of the new commit

        -
        -
        Return type
        -

        Git.OId

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.revert_recipe(repo, branch, recipe_name, commit)[source]
        -

        Revert the contents of a recipe to that of a previous commit

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • recipe_name (str) -- Recipe name to revert

        • -
        • commit (str) -- Commit hash

        • -
        -
        -
        Returns
        -

        OId of the new commit

        -
        -
        Return type
        -

        Git.OId

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -
        - -
        -
        -pylorax.api.recipes.tag_file_commit(repo, branch, filename)[source]
        -

        Tag a file's most recent commit

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • filename (str) -- Filename to tag

        • -
        -
        -
        Returns
        -

        Tag id or None if it failed.

        -
        -
        Return type
        -

        Git.OId

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -

        This uses git tags, of the form refs/tags/<branch>/<filename>/r<revision> -Only the most recent recipe commit can be tagged to prevent out of order tagging. -Revisions start at 1 and increment for each new commit that is tagged. -If the commit has already been tagged it will return false.

        -
        - -
        -
        -pylorax.api.recipes.tag_recipe_commit(repo, branch, recipe_name)[source]
        -

        Tag a file's most recent commit

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • recipe_name (str) -- Recipe name to tag

        • -
        -
        -
        Returns
        -

        Tag id or None if it failed.

        -
        -
        Return type
        -

        Git.OId

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -

        Uses tag_file_commit()

        -
        - -
        -
        -pylorax.api.recipes.write_commit(repo, branch, filename, message, content)[source]
        -

        Make a new commit to a repository's branch

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • filename (str) -- full path of the file to add

        • -
        • message (str) -- The commit message

        • -
        • content (str) -- The data to write

        • -
        -
        -
        Returns
        -

        OId of the new commit

        -
        -
        Return type
        -

        Git.OId

        -
        -
        Raises
        -

        Can raise errors from Ggit

        -
        -
        -
        - -
        -
        -

        pylorax.api.regexes module

        -
        -
        -

        pylorax.api.server module

        -
        -
        -class pylorax.api.server.GitLock(repo, lock, dir)
        -

        Bases: tuple

        -
        -
        -dir
        -

        Alias for field number 2

        -
        - -
        -
        -lock
        -

        Alias for field number 1

        -
        - -
        -
        -repo
        -

        Alias for field number 0

        -
        - -
        - -
        -
        -

        pylorax.api.timestamp module

        -
        -
        -pylorax.api.timestamp.timestamp_dict(destdir)[source]
        -
        - -
        -
        -pylorax.api.timestamp.write_timestamp(destdir, ty)[source]
        -
        - -
        -
        -

        pylorax.api.toml module

        -
        -
        -exception pylorax.api.toml.TomlError(msg, doc, pos)[source]
        -

        Bases: toml.decoder.TomlDecodeError

        -
        - -
        -
        -pylorax.api.toml.dump(o, file)[source]
        -
        - -
        -
        -pylorax.api.toml.dumps(o)[source]
        -
        - -
        -
        -pylorax.api.toml.load(file)[source]
        -
        - -
        -
        -pylorax.api.toml.loads(s)[source]
        -
        - -
        -
        -

        pylorax.api.utils module

        -

        API utility functions

        -
        -
        -pylorax.api.utils.blueprint_exists(api, branch, blueprint_name)[source]
        -

        Return True if the blueprint exists

        -
        -
        Parameters
        -
          -
        • api (Flask) -- flask object

        • -
        • branch (str) -- Branch name

        • -
        • recipe_name (str) -- Recipe name to read

        • -
        -
        -
        -
        - -
        -
        -pylorax.api.utils.take_limits(iterable, offset, limit)[source]
        -

        Apply offset and limit to an iterable object

        -
        -
        Parameters
        -
          -
        • iterable (iter) -- The object to limit

        • -
        • offset (int) -- The number of items to skip

        • -
        • limit (int) -- The total number of items to return

        • -
        -
        -
        Returns
        -

        A subset of the iterable

        -
        -
        -
        - -
        -
        -

        pylorax.api.v0 module

        -

        Setup v0 of the API server

        -

        v0_api() must be called to setup the API routes for Flask

        -
        -

        Status Responses

        -

        Some requests only return a status/error response.

        -
        -

        The response will be a status response with status set to true, or an -error response with it set to false and an error message included.

        -

        Example response:

        -
        {
        -  "status": true
        -}
        -
        -
        -

        Error response:

        -
        {
        -  "errors": ["ggit-error: Failed to remove entry. File isn't in the tree - jboss.toml (-1)"]
        -  "status": false
        -}
        -
        -
        -
        -
        -
        -

        API Routes

        -

        All of the blueprints routes support the optional branch argument. If it is not -used then the API will use the master branch for blueprints. If you want to create -a new branch use the new or workspace routes with ?branch=<branch-name> to -store the new blueprint on the new branch.

        -
        -
        -pylorax.api.v0.v0_blueprints_changes(blueprint_names)[source]
        -

        Return the changes to a blueprint or list of blueprints

        -

        /api/v0/blueprints/changes/<blueprint_names>[?offset=0&limit=20]

        -
        -

        Return the commits to a blueprint. By default it returns the first 20 commits, this -can be changed by passing offset and/or limit. The response will include the -commit hash, summary, timestamp, and optionally the revision number. The commit -hash can be passed to /api/v0/blueprints/diff/ to retrieve the exact changes.

        -

        Example:

        -
        {
        -  "errors": [],
        -  "limit": 20,
        -  "offset": 0,
        -  "blueprints": [
        -    {
        -      "changes": [
        -        {
        -          "commit": "e083921a7ed1cf2eec91ad12b9ad1e70ef3470be",
        -          "message": "blueprint glusterfs, version 0.0.6 saved.",
        -          "revision": null,
        -          "timestamp": "2017-11-23T00:18:13Z"
        -        },
        -        {
        -          "commit": "cee5f4c20fc33ea4d54bfecf56f4ad41ad15f4f3",
        -          "message": "blueprint glusterfs, version 0.0.5 saved.",
        -          "revision": null,
        -          "timestamp": "2017-11-11T01:00:28Z"
        -        },
        -        {
        -          "commit": "29b492f26ed35d80800b536623bafc51e2f0eff2",
        -          "message": "blueprint glusterfs, version 0.0.4 saved.",
        -          "revision": null,
        -          "timestamp": "2017-11-11T00:28:30Z"
        -        },
        -        {
        -          "commit": "03374adbf080fe34f5c6c29f2e49cc2b86958bf2",
        -          "message": "blueprint glusterfs, version 0.0.3 saved.",
        -          "revision": null,
        -          "timestamp": "2017-11-10T23:15:52Z"
        -        },
        -        {
        -          "commit": "0e08ecbb708675bfabc82952599a1712a843779d",
        -          "message": "blueprint glusterfs, version 0.0.2 saved.",
        -          "revision": null,
        -          "timestamp": "2017-11-10T23:14:56Z"
        -        },
        -        {
        -          "commit": "3e11eb87a63d289662cba4b1804a0947a6843379",
        -          "message": "blueprint glusterfs, version 0.0.1 saved.",
        -          "revision": null,
        -          "timestamp": "2017-11-08T00:02:47Z"
        -        }
        -      ],
        -      "name": "glusterfs",
        -      "total": 6
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_blueprints_delete(blueprint_name)[source]
        -

        Delete a blueprint from git

        -

        DELETE /api/v0/blueprints/delete/<blueprint_name>

        -
        -

        Delete a blueprint. The blueprint is deleted from the branch, and will no longer -be listed by the list route. A blueprint can be undeleted using the undo route -to revert to a previous commit. This will also delete the workspace copy of the -blueprint.

        -

        The response will be a status response with status set to true, or an -error response with it set to false and an error message included.

        -
        -
        - -
        -
        -pylorax.api.v0.v0_blueprints_delete_workspace(blueprint_name)[source]
        -

        Delete a blueprint from the workspace

        -

        DELETE /api/v0/blueprints/workspace/<blueprint_name>

        -
        -

        Remove the temporary workspace copy of a blueprint. The info route will now -return the most recent commit of the blueprint. Any changes that were in the -workspace will be lost.

        -

        The response will be a status response with status set to true, or an -error response with it set to false and an error message included.

        -
        -
        - -
        -
        -pylorax.api.v0.v0_blueprints_depsolve(blueprint_names)[source]
        -

        Return the dependencies for a blueprint

        -

        /api/v0/blueprints/depsolve/<blueprint_names>

        -
        -

        Depsolve the blueprint using yum, return the blueprint used, and the NEVRAs of the packages -chosen to satisfy the blueprint's requirements. The response will include a list of results, -with the full dependency list in dependencies, the NEVRAs for the blueprint's direct modules -and packages in modules, and any error will be in errors.

        -

        Example:

        -
        {
        -  "errors": [],
        -  "blueprints": [
        -    {
        -      "dependencies": [
        -        {
        -          "arch": "noarch",
        -          "epoch": "0",
        -          "name": "2ping",
        -          "release": "2.el7",
        -          "version": "3.2.1"
        -        },
        -        {
        -          "arch": "x86_64",
        -          "epoch": "0",
        -          "name": "acl",
        -          "release": "12.el7",
        -          "version": "2.2.51"
        -        },
        -        {
        -          "arch": "x86_64",
        -          "epoch": "0",
        -          "name": "audit-libs",
        -          "release": "3.el7",
        -          "version": "2.7.6"
        -        },
        -        {
        -          "arch": "x86_64",
        -          "epoch": "0",
        -          "name": "avahi-libs",
        -          "release": "17.el7",
        -          "version": "0.6.31"
        -        },
        -        ...
        -      ],
        -      "modules": [
        -        {
        -          "arch": "noarch",
        -          "epoch": "0",
        -          "name": "2ping",
        -          "release": "2.el7",
        -          "version": "3.2.1"
        -        },
        -        {
        -          "arch": "x86_64",
        -          "epoch": "0",
        -          "name": "glusterfs",
        -          "release": "18.4.el7",
        -          "version": "3.8.4"
        -        },
        -        ...
        -      ],
        -      "blueprint": {
        -        "description": "An example GlusterFS server with samba",
        -        "modules": [
        -          {
        -            "name": "glusterfs",
        -            "version": "3.7.*"
        -          },
        -       ...
        -      }
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_blueprints_diff(blueprint_name, from_commit, to_commit)[source]
        -

        Return the differences between two commits of a blueprint

        -

        /api/v0/blueprints/diff/<blueprint_name>/<from_commit>/<to_commit>

        -
        -

        Return the differences between two commits, or the workspace. The commit hash -from the changes response can be used here, or several special strings:

        -
          -
        • NEWEST will select the newest git commit. This works for from_commit or to_commit

        • -
        • WORKSPACE will select the workspace copy. This can only be used in to_commit

        • -
        -

        eg. /api/v0/blueprints/diff/glusterfs/NEWEST/WORKSPACE will return the differences -between the most recent git commit and the contents of the workspace.

        -

        Each entry in the response's diff object contains the old blueprint value and the new one. -If old is null and new is set, then it was added. -If new is null and old is set, then it was removed. -If both are set, then it was changed.

        -

        The old/new entries will have the name of the blueprint field that was changed. This -can be one of: Name, Description, Version, Module, or Package. -The contents for these will be the old/new values for them.

        -

        In the example below the version was changed and the ping package was added.

        -

        Example:

        -
        {
        -  "diff": [
        -    {
        -      "new": {
        -        "Version": "0.0.6"
        -      },
        -      "old": {
        -        "Version": "0.0.5"
        -      }
        -    },
        -    {
        -      "new": {
        -        "Package": {
        -          "name": "ping",
        -          "version": "3.2.1"
        -        }
        -      },
        -      "old": null
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_blueprints_freeze(blueprint_names)[source]
        -

        Return the blueprint with the exact modules and packages selected by depsolve

        -

        /api/v0/blueprints/freeze/<blueprint_names>

        -
        -

        Return a JSON representation of the blueprint with the package and module versions set -to the exact versions chosen by depsolving the blueprint.

        -

        Example:

        -
        {
        -  "errors": [],
        -  "blueprints": [
        -    {
        -      "blueprint": {
        -        "description": "An example GlusterFS server with samba",
        -        "modules": [
        -          {
        -            "name": "glusterfs",
        -            "version": "3.8.4-18.4.el7.x86_64"
        -          },
        -          {
        -            "name": "glusterfs-cli",
        -            "version": "3.8.4-18.4.el7.x86_64"
        -          }
        -        ],
        -        "name": "glusterfs",
        -        "packages": [
        -          {
        -            "name": "ping",
        -            "version": "2:3.2.1-2.el7.noarch"
        -          },
        -          {
        -            "name": "samba",
        -            "version": "4.6.2-8.el7.x86_64"
        -          }
        -        ],
        -        "version": "0.0.6"
        -      }
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_blueprints_info(blueprint_names)[source]
        -

        Return the contents of the blueprint, or a list of blueprints

        -

        /api/v0/blueprints/info/<blueprint_names>[?format=<json|toml>]

        -
        -

        Return the JSON representation of the blueprint. This includes 3 top level -objects. changes which lists whether or not the workspace is different from -the most recent commit. blueprints which lists the JSON representation of the -blueprint, and errors which will list any errors, like non-existant blueprints.

        -

        By default the response is JSON, but if ?format=toml is included in the URL's -arguments it will return the response as the blueprint's raw TOML content. -Unless there is an error which will only return a 400 and a standard error -Status Responses.

        -

        If there is an error when JSON is requested the successful blueprints and the -errors will both be returned.

        -

        Example of json response:

        -
        {
        -  "changes": [
        -    {
        -      "changed": false,
        -      "name": "glusterfs"
        -    }
        -  ],
        -  "errors": [],
        -  "blueprints": [
        -    {
        -      "description": "An example GlusterFS server with samba",
        -      "modules": [
        -        {
        -          "name": "glusterfs",
        -          "version": "3.7.*"
        -        },
        -        {
        -          "name": "glusterfs-cli",
        -          "version": "3.7.*"
        -        }
        -      ],
        -      "name": "glusterfs",
        -      "packages": [
        -        {
        -          "name": "2ping",
        -          "version": "3.2.1"
        -        },
        -        {
        -          "name": "samba",
        -          "version": "4.2.*"
        -        }
        -      ],
        -      "version": "0.0.6"
        -    }
        -  ]
        -}
        -
        -
        -

        Error example:

        -
        {
        -  "changes": [],
        -  "errors": ["ggit-error: the path 'missing.toml' does not exist in the given tree (-3)"]
        -  "blueprints": []
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_blueprints_list()[source]
        -

        List the available blueprints on a branch.

        -

        /api/v0/blueprints/list

        -
        -

        List the available blueprints:

        -
        { "limit": 20,
        -  "offset": 0,
        -  "blueprints": [
        -    "atlas",
        -    "development",
        -    "glusterfs",
        -    "http-server",
        -    "jboss",
        -    "kubernetes" ],
        -  "total": 6 }
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_blueprints_new()[source]
        -

        Commit a new blueprint

        -

        POST /api/v0/blueprints/new

        -
        -

        Create a new blueprint, or update an existing blueprint. This supports both JSON and TOML -for the blueprint format. The blueprint should be in the body of the request with the -Content-Type header set to either application/json or text/x-toml.

        -

        The response will be a status response with status set to true, or an -error response with it set to false and an error message included.

        -
        -
        - -
        -
        -pylorax.api.v0.v0_blueprints_tag(blueprint_name)[source]
        -

        Tag a blueprint's latest blueprint commit as a 'revision'

        -

        POST /api/v0/blueprints/tag/<blueprint_name>

        -
        -

        Tag a blueprint as a new release. This uses git tags with a special format. -refs/tags/<branch>/<filename>/r<revision>. Only the most recent blueprint commit -can be tagged. Revisions start at 1 and increment for each new tag -(per-blueprint). If the commit has already been tagged it will return false.

        -

        The response will be a status response with status set to true, or an -error response with it set to false and an error message included.

        -
        -
        - -
        -
        -pylorax.api.v0.v0_blueprints_undo(blueprint_name, commit)[source]
        -

        Undo changes to a blueprint by reverting to a previous commit.

        -

        POST /api/v0/blueprints/undo/<blueprint_name>/<commit>

        -
        -

        This will revert the blueprint to a previous commit. The commit hash from the changes -route can be used in this request.

        -

        The response will be a status response with status set to true, or an -error response with it set to false and an error message included.

        -
        -
        - -
        -
        -pylorax.api.v0.v0_blueprints_workspace()[source]
        -

        Write a blueprint to the workspace

        -

        POST /api/v0/blueprints/workspace

        -
        -

        Write a blueprint to the temporary workspace. This works exactly the same as new except -that it does not create a commit. JSON and TOML bodies are supported.

        -

        The workspace is meant to be used as a temporary blueprint storage for clients. -It will be read by the info and diff routes if it is different from the -most recent commit.

        -

        The response will be a status response with status set to true, or an -error response with it set to false and an error message included.

        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_cancel(uuid)[source]
        -

        Cancel a running compose and delete its results directory

        -

        DELETE /api/v0/compose/cancel/<uuid>

        -
        -

        Cancel the build, if it is not finished, and delete the results. It will return a -status of True if it is successful.

        -

        Example:

        -
        {
        -  "status": true,
        -  "uuid": "03397f8d-acff-4cdb-bd31-f629b7a948f5"
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_delete(uuids)[source]
        -

        Delete the compose results for the listed uuids

        -

        DELETE /api/v0/compose/delete/<uuids>

        -
        -

        Delete the list of comma-separated uuids from the compose results.

        -

        Example:

        -
        {
        -  "errors": [],
        -  "uuids": [
        -    {
        -      "status": true,
        -      "uuid": "ae1bf7e3-7f16-4c9f-b36e-3726a1093fd0"
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_failed()[source]
        -

        Return the list of failed composes

        -

        /api/v0/compose/failed

        -
        -

        Return the details on all of the failed composes on the system.

        -

        Example:

        -
        {
        -  "failed": [
        -     {
        -      "id": "8c8435ef-d6bd-4c68-9bf1-a2ef832e6b1a",
        -      "blueprint": "http-server",
        -      "queue_status": "FAILED",
        -      "job_created": 1517523249.9301329,
        -      "job_started": 1517523249.9314211,
        -      "job_finished": 1517523255.5623411,
        -      "version": "0.0.2"
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_finished()[source]
        -

        Return the list of finished composes

        -

        /api/v0/compose/finished

        -
        -

        Return the details on all of the finished composes on the system.

        -

        Example:

        -
        {
        -  "finished": [
        -    {
        -      "id": "70b84195-9817-4b8a-af92-45e380f39894",
        -      "blueprint": "glusterfs",
        -      "queue_status": "FINISHED",
        -      "job_created": 1517351003.8210032,
        -      "job_started": 1517351003.8230415,
        -      "job_finished": 1517359234.1003145,
        -      "version": "0.0.6"
        -    },
        -    {
        -      "id": "e695affd-397f-4af9-9022-add2636e7459",
        -      "blueprint": "glusterfs",
        -      "queue_status": "FINISHED",
        -      "job_created": 1517362289.7193348,
        -      "job_started": 1517362289.9751132,
        -      "job_finished": 1517363500.1234567,
        -      "version": "0.0.6"
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_image(uuid)[source]
        -

        Return the output image for the build

        -

        /api/v0/compose/image/<uuid>

        -
        -

        Returns the output image from the build. The filename is set to the filename -from the build with the UUID as a prefix. eg. UUID-root.tar.xz or UUID-boot.iso.

        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_info(uuid)[source]
        -

        Return detailed info about a compose

        -

        /api/v0/compose/info/<uuid>

        -
        -

        Get detailed information about the compose. The returned JSON string will -contain the following information:

        -
        -
          -
        • id - The uuid of the comoposition

        • -
        • config - containing the configuration settings used to run Anaconda

        • -
        • blueprint - The depsolved blueprint used to generate the kickstart

        • -
        • commit - The (local) git commit hash for the blueprint used

        • -
        • deps - The NEVRA of all of the dependencies used in the composition

        • -
        • compose_type - The type of output generated (tar, iso, etc.)

        • -
        • queue_status - The final status of the composition (FINISHED or FAILED)

        • -
        -
        -

        Example:

        -
        {
        -  "commit": "7078e521a54b12eae31c3fd028680da7a0815a4d",
        -  "compose_type": "tar",
        -  "config": {
        -    "anaconda_args": "",
        -    "armplatform": "",
        -    "compress_args": [],
        -    "compression": "xz",
        -    "image_name": "root.tar.xz",
        -    ...
        -  },
        -  "deps": {
        -    "packages": [
        -      {
        -        "arch": "x86_64",
        -        "epoch": "0",
        -        "name": "acl",
        -        "release": "14.el7",
        -        "version": "2.2.51"
        -      }
        -    ]
        -  },
        -  "id": "c30b7d80-523b-4a23-ad52-61b799739ce8",
        -  "queue_status": "FINISHED",
        -  "blueprint": {
        -    "description": "An example kubernetes master",
        -    ...
        -  }
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_log_tail(uuid)[source]
        -

        Return the tail of the most currently relevant log

        -

        /api/v0/compose/log/<uuid>[?size=KiB]

        -
        -

        Returns the end of either the anaconda log, the packaging log, or the -composer logs, depending on the progress of the compose. The size -parameter is optional and defaults to 1 MiB if it is not included. The -returned data is raw text from the end of the log file, starting on a -line boundary.

        -

        Example:

        -
        12:59:24,222 INFO anaconda: Running Thread: AnaConfigurationThread (140629395244800)
        -12:59:24,223 INFO anaconda: Configuring installed system
        -12:59:24,912 INFO anaconda: Configuring installed system
        -12:59:24,912 INFO anaconda: Creating users
        -12:59:24,913 INFO anaconda: Clearing libuser.conf at /tmp/libuser.Dyy8Gj
        -12:59:25,154 INFO anaconda: Creating users
        -12:59:25,155 INFO anaconda: Configuring addons
        -12:59:25,155 INFO anaconda: Configuring addons
        -12:59:25,155 INFO anaconda: Generating initramfs
        -12:59:49,467 INFO anaconda: Generating initramfs
        -12:59:49,467 INFO anaconda: Running post-installation scripts
        -12:59:49,467 INFO anaconda: Running kickstart %%post script(s)
        -12:59:50,782 INFO anaconda: All kickstart %%post script(s) have been run
        -12:59:50,782 INFO anaconda: Running post-installation scripts
        -12:59:50,784 INFO anaconda: Thread Done: AnaConfigurationThread (140629395244800)
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_logs(uuid)[source]
        -

        Return a tar of the metadata for the build

        -

        /api/v0/compose/logs/<uuid>

        -
        -

        Returns a .tar of the anaconda build logs. The tar is not compressed, but is -not large.

        -

        The mime type is set to 'application/x-tar' and the filename is set to -UUID-logs.tar

        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_metadata(uuid)[source]
        -

        Return a tar of the metadata for the build

        -

        /api/v0/compose/metadata/<uuid>

        -
        -

        Returns a .tar of the metadata used for the build. This includes all the -information needed to reproduce the build, including the final kickstart -populated with repository and package NEVRA.

        -

        The mime type is set to 'application/x-tar' and the filename is set to -UUID-metadata.tar

        -

        The .tar is uncompressed, but is not large.

        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_queue()[source]
        -

        Return the status of the new and running queues

        -

        /api/v0/compose/queue

        -
        -

        Return the status of the build queue. It includes information about the builds waiting, -and the build that is running.

        -

        Example:

        -
        {
        -  "new": [
        -    {
        -      "id": "45502a6d-06e8-48a5-a215-2b4174b3614b",
        -      "blueprint": "glusterfs",
        -      "queue_status": "WAITING",
        -      "job_created": 1517362647.4570868,
        -      "version": "0.0.6"
        -    },
        -    {
        -      "id": "6d292bd0-bec7-4825-8d7d-41ef9c3e4b73",
        -      "blueprint": "kubernetes",
        -      "queue_status": "WAITING",
        -      "job_created": 1517362659.0034983,
        -      "version": "0.0.1"
        -    }
        -  ],
        -  "run": [
        -    {
        -      "id": "745712b2-96db-44c0-8014-fe925c35e795",
        -      "blueprint": "glusterfs",
        -      "queue_status": "RUNNING",
        -      "job_created": 1517362633.7965999,
        -      "job_started": 1517362633.8001345,
        -      "version": "0.0.6"
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_results(uuid)[source]
        -

        Return a tar of the metadata and the results for the build

        -

        /api/v0/compose/results/<uuid>

        -
        -

        Returns a .tar of the metadata, logs, and output image of the build. This -includes all the information needed to reproduce the build, including the -final kickstart populated with repository and package NEVRA. The output image -is already in compressed form so the returned tar is not compressed.

        -

        The mime type is set to 'application/x-tar' and the filename is set to -UUID.tar

        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_start()[source]
        -

        Start a compose

        -
        -
        The body of the post should have these fields:

        blueprint_name - The blueprint name from /blueprints/list/ -compose_type - The type of output to create, from /compose/types -branch - Optional, defaults to master, selects the git branch to use for the blueprint.

        -
        -
        -

        POST /api/v0/compose

        -
        -

        Start a compose. The content type should be 'application/json' and the body of the POST -should look like this

        -

        Example:

        -
        {
        -  "blueprint_name": "http-server",
        -  "compose_type": "tar",
        -  "branch": "master"
        -}
        -
        -
        -

        Pass it the name of the blueprint, the type of output (from '/api/v0/compose/types'), and the -blueprint branch to use. 'branch' is optional and will default to master. It will create a new -build and add it to the queue. It returns the build uuid and a status if it succeeds

        -

        Example:

        -
        {
        -  "build_id": "e6fa6db4-9c81-4b70-870f-a697ca405cdf",
        -  "status": true
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_status(uuids)[source]
        -

        Return the status of the listed uuids

        -

        /api/v0/compose/status/<uuids>[?blueprint=<blueprint_name>&status=<compose_status>&type=<compose_type>]

        -
        -

        Return the details for each of the comma-separated list of uuids. A uuid of '*' will return -details for all composes.

        -

        Example:

        -
        {
        -  "uuids": [
        -    {
        -      "id": "8c8435ef-d6bd-4c68-9bf1-a2ef832e6b1a",
        -      "blueprint": "http-server",
        -      "queue_status": "FINISHED",
        -      "job_created": 1517523644.2384307,
        -      "job_started": 1517523644.2551234,
        -      "job_finished": 1517523689.9864314,
        -      "version": "0.0.2"
        -    },
        -    {
        -      "id": "45502a6d-06e8-48a5-a215-2b4174b3614b",
        -      "blueprint": "glusterfs",
        -      "queue_status": "FINISHED",
        -      "job_created": 1517363442.188399,
        -      "job_started": 1517363442.325324,
        -      "job_finished": 1517363451.653621,
        -      "version": "0.0.6"
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_compose_types()[source]
        -

        Return the list of enabled output types

        -

        (only enabled types are returned)

        -

        /api/v0/compose/types

        -
        -

        Returns the list of supported output types that are valid for use with 'POST /api/v0/compose'

        -

        Example:

        -
        {
        -  "types": [
        -    {
        -      "enabled": true,
        -      "name": "tar"
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_modules_info(module_names)[source]
        -

        Return detailed information about the listed modules

        -

        /api/v0/modules/info/<module_names>

        -
        -

        Return the module's dependencies, and the information about the module.

        -

        Example:

        -
        {
        -  "modules": [
        -    {
        -      "dependencies": [
        -        {
        -          "arch": "noarch",
        -          "epoch": "0",
        -          "name": "basesystem",
        -          "release": "7.el7",
        -          "version": "10.0"
        -        },
        -        {
        -          "arch": "x86_64",
        -          "epoch": "0",
        -          "name": "bash",
        -          "release": "28.el7",
        -          "version": "4.2.46"
        -        },
        -        ...
        -      ],
        -      "description": "The GNU tar program saves ...",
        -      "homepage": "http://www.gnu.org/software/tar/",
        -      "name": "tar",
        -      "summary": "A GNU file archiving program",
        -      "upstream_vcs": "UPSTREAM_VCS"
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_modules_list(module_names=None)[source]
        -

        List available modules, filtering by module_names

        -

        /api/v0/modules/list[?offset=0&limit=20]

        -
        -

        Return a list of all of the available modules. This includes the name and the -group_type, which is always "rpm" for lorax-composer. By default this returns -the first 20 items. This can be changed by setting the offset and limit -arguments.

        -

        Example:

        -
        {
        -  "limit": 20,
        -  "modules": [
        -    {
        -      "group_type": "rpm",
        -      "name": "0ad"
        -    },
        -    {
        -      "group_type": "rpm",
        -      "name": "0ad-data"
        -    },
        -    {
        -      "group_type": "rpm",
        -      "name": "0install"
        -    },
        -    {
        -      "group_type": "rpm",
        -      "name": "2048-cli"
        -    },
        -    ...
        -  ]
        -  "total": 21770
        -}
        -
        -
        -
        -

        /api/v0/modules/list/<module_names>[?offset=0&limit=20]

        -
        -

        Return the list of comma-separated modules. Output is the same as /modules/list

        -

        Example:

        -
        {
        -  "limit": 20,
        -  "modules": [
        -    {
        -      "group_type": "rpm",
        -      "name": "tar"
        -    }
        -  ],
        -  "offset": 0,
        -  "total": 1
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_projects_depsolve(project_names)[source]
        -

        Return detailed information about the listed projects

        -

        /api/v0/projects/depsolve/<project_names>

        -
        -

        Depsolve the comma-separated list of projects and return the list of NEVRAs needed -to satisfy the request.

        -

        Example:

        -
        {
        -  "projects": [
        -    {
        -      "arch": "noarch",
        -      "epoch": "0",
        -      "name": "basesystem",
        -      "release": "7.el7",
        -      "version": "10.0"
        -    },
        -    {
        -      "arch": "x86_64",
        -      "epoch": "0",
        -      "name": "bash",
        -      "release": "28.el7",
        -      "version": "4.2.46"
        -    },
        -    {
        -      "arch": "x86_64",
        -      "epoch": "0",
        -      "name": "filesystem",
        -      "release": "21.el7",
        -      "version": "3.2"
        -    },
        -    ...
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_projects_info(project_names)[source]
        -

        Return detailed information about the listed projects

        -

        /api/v0/projects/info/<project_names>

        -
        -

        Return information about the comma-separated list of projects. It includes the description -of the package along with the list of available builds.

        -

        Example:

        -
        {
        -  "projects": [
        -    {
        -      "builds": [
        -        {
        -          "arch": "x86_64",
        -          "build_config_ref": "BUILD_CONFIG_REF",
        -          "build_env_ref": "BUILD_ENV_REF",
        -          "build_time": "2017-03-01T08:39:23",
        -          "changelog": "- restore incremental backups correctly, files ...",
        -          "epoch": "2",
        -          "metadata": {},
        -          "release": "32.el7",
        -          "source": {
        -            "license": "GPLv3+",
        -            "metadata": {},
        -            "source_ref": "SOURCE_REF",
        -            "version": "1.26"
        -          }
        -        }
        -      ],
        -      "description": "The GNU tar program saves many ...",
        -      "homepage": "http://www.gnu.org/software/tar/",
        -      "name": "tar",
        -      "summary": "A GNU file archiving program",
        -      "upstream_vcs": "UPSTREAM_VCS"
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_projects_list()[source]
        -

        List all of the available projects/packages

        -

        /api/v0/projects/list[?offset=0&limit=20]

        -
        -

        List all of the available projects. By default this returns the first 20 items, -but this can be changed by setting the offset and limit arguments.

        -

        Example:

        -
        {
        -  "limit": 20,
        -  "offset": 0,
        -  "projects": [
        -    {
        -      "description": "0 A.D. (pronounced "zero ey-dee") is a ...",
        -      "homepage": "http://play0ad.com",
        -      "name": "0ad",
        -      "summary": "Cross-Platform RTS Game of Ancient Warfare",
        -      "upstream_vcs": "UPSTREAM_VCS"
        -    },
        -    ...
        -  ],
        -  "total": 21770
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_projects_source_delete(source_name)[source]
        -

        Delete the named source and return a status response

        -

        DELETE /api/v0/projects/source/delete/<source-name>

        -
        -

        Delete a user added source. This will fail if a system source is passed to -it.

        -

        The response will be a status response with status set to true, or an -error response with it set to false and an error message included.

        -
        -
        - -
        -
        -pylorax.api.v0.v0_projects_source_info(source_names)[source]
        -

        Return detailed info about the list of sources

        -

        /api/v0/projects/source/info/<source-names>

        -
        -

        Return information about the comma-separated list of source names. Or all of the -sources if '*' is passed. Note that general globbing is not supported, only '*'.

        -

        immutable system sources will have the "system" field set to true. User added sources -will have it set to false. System sources cannot be changed or deleted.

        -

        Example:

        -
        {
        -  "errors": [],
        -  "sources": {
        -    "fedora": {
        -      "check_gpg": true,
        -      "check_ssl": true,
        -      "gpgkey_urls": [
        -        "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-28-x86_64"
        -      ],
        -      "name": "fedora",
        -      "proxy": "http://proxy.brianlane.com:8123",
        -      "system": true,
        -      "type": "yum-metalink",
        -      "url": "https://mirrors.fedoraproject.org/metalink?repo=fedora-28&arch=x86_64"
        -    }
        -  }
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_projects_source_list()[source]
        -

        Return the list of source names

        -

        /api/v0/projects/source/list

        -
        -

        Return the list of repositories used for depsolving and installing packages.

        -

        Example:

        -
        {
        -  "sources": [
        -    "fedora",
        -    "fedora-cisco-openh264",
        -    "fedora-updates-testing",
        -    "fedora-updates"
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v0.v0_projects_source_new()[source]
        -

        Add a new package source. Or change an existing one

        -

        POST /api/v0/projects/source/new

        -
        -

        Add (or change) a source for use when depsolving blueprints and composing images.

        -

        The proxy and gpgkey_urls entries are optional. All of the others are required. The supported -types for the urls are:

        -
          -
        • yum-baseurl is a URL to a yum repository.

        • -
        • yum-mirrorlist is a URL for a mirrorlist.

        • -
        • yum-metalink is a URL for a metalink.

        • -
        -

        If check_ssl is true the https certificates must be valid. If they are self-signed you can either set -this to false, or add your Certificate Authority to the host system.

        -

        If check_gpg is true the GPG key must either be installed on the host system, or gpgkey_urls -should point to it.

        -

        You can edit an existing source (other than system sources), by doing a POST -of the new version of the source. It will overwrite the previous one.

        -

        Example:

        -
        {
        -    "name": "custom-source-1",
        -    "url": "https://url/path/to/repository/",
        -    "type": "yum-baseurl",
        -    "check_ssl": true,
        -    "check_gpg": true,
        -    "gpgkey_urls": [
        -        "https://url/path/to/gpg-key"
        -    ]
        -}
        -
        -
        -
        -
        - -
        -
        -
        -

        pylorax.api.v1 module

        -

        Setup v1 of the API server

        -
        -
        -pylorax.api.v1.v1_compose_failed()[source]
        -

        Return the list of failed composes

        -

        /api/v1/compose/failed

        -
        -

        Return the details on all of the failed composes on the system.

        -

        Example:

        -
        {
        -  "failed": [
        -     {
        -      "id": "8c8435ef-d6bd-4c68-9bf1-a2ef832e6b1a",
        -      "blueprint": "http-server",
        -      "queue_status": "FAILED",
        -      "job_created": 1517523249.9301329,
        -      "job_started": 1517523249.9314211,
        -      "job_finished": 1517523255.5623411,
        -      "version": "0.0.2",
        -      "uploads": [
        -          {
        -              "creation_time": 1568150660.524401,
        -              "image_name": "http-server",
        -              "image_path": null,
        -              "provider_name": "azure",
        -              "settings": {
        -                  "client_id": "need",
        -                  "location": "need",
        -                  "resource_group": "group",
        -                  "secret": "need",
        -                  "storage_account_name": "need",
        -                  "storage_container": "need",
        -                  "subscription_id": "need",
        -                  "tenant": "need"
        -              },
        -              "status": "WAITING",
        -              "uuid": "21898dfd-9ac9-4e22-bb1d-7f12d0129e65"
        -          }
        -      ]
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_compose_finished()[source]
        -

        Return the list of finished composes

        -

        /api/v1/compose/finished

        -
        -

        Return the details on all of the finished composes on the system.

        -

        Example:

        -
        {
        -  "finished": [
        -    {
        -      "id": "70b84195-9817-4b8a-af92-45e380f39894",
        -      "blueprint": "glusterfs",
        -      "queue_status": "FINISHED",
        -      "job_created": 1517351003.8210032,
        -      "job_started": 1517351003.8230415,
        -      "job_finished": 1517359234.1003145,
        -      "version": "0.0.6"
        -    },
        -    {
        -      "id": "e695affd-397f-4af9-9022-add2636e7459",
        -      "blueprint": "glusterfs",
        -      "queue_status": "FINISHED",
        -      "job_created": 1517362289.7193348,
        -      "job_started": 1517362289.9751132,
        -      "job_finished": 1517363500.1234567,
        -      "version": "0.0.6",
        -      "uploads": [
        -          {
        -              "creation_time": 1568150660.524401,
        -              "image_name": "glusterfs server",
        -              "image_path": "/var/lib/lorax/composer/results/e695affd-397f-4af9-9022-add2636e7459/disk.vhd",
        -              "provider_name": "azure",
        -              "settings": {
        -                  "client_id": "need",
        -                  "location": "need",
        -                  "resource_group": "group",
        -                  "secret": "need",
        -                  "storage_account_name": "need",
        -                  "storage_container": "need",
        -                  "subscription_id": "need",
        -                  "tenant": "need"
        -              },
        -              "status": "WAITING",
        -              "uuid": "21898dfd-9ac9-4e22-bb1d-7f12d0129e65"
        -          }
        -      ]
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_compose_info(uuid)[source]
        -

        Return detailed info about a compose

        -

        /api/v1/compose/info/<uuid>

        -
        -

        Get detailed information about the compose. The returned JSON string will -contain the following information:

        -
        -
          -
        • id - The uuid of the comoposition

        • -
        • config - containing the configuration settings used to run Anaconda

        • -
        • blueprint - The depsolved blueprint used to generate the kickstart

        • -
        • commit - The (local) git commit hash for the blueprint used

        • -
        • deps - The NEVRA of all of the dependencies used in the composition

        • -
        • compose_type - The type of output generated (tar, iso, etc.)

        • -
        • queue_status - The final status of the composition (FINISHED or FAILED)

        • -
        -
        -

        Example:

        -
        {
        -  "commit": "7078e521a54b12eae31c3fd028680da7a0815a4d",
        -  "compose_type": "tar",
        -  "config": {
        -    "anaconda_args": "",
        -    "armplatform": "",
        -    "compress_args": [],
        -    "compression": "xz",
        -    "image_name": "root.tar.xz",
        -    ...
        -  },
        -  "deps": {
        -    "packages": [
        -      {
        -        "arch": "x86_64",
        -        "epoch": "0",
        -        "name": "acl",
        -        "release": "14.el7",
        -        "version": "2.2.51"
        -      }
        -    ]
        -  },
        -  "id": "c30b7d80-523b-4a23-ad52-61b799739ce8",
        -  "queue_status": "FINISHED",
        -  "blueprint": {
        -    "description": "An example kubernetes master",
        -    ...
        -  },
        -  "uploads": [
        -      {
        -          "creation_time": 1568150660.524401,
        -          "image_name": "glusterfs server",
        -          "image_path": "/var/lib/lorax/composer/results/c30b7d80-523b-4a23-ad52-61b799739ce8/disk.vhd",
        -          "provider_name": "azure",
        -          "settings": {
        -              "client_id": "need",
        -              "location": "need",
        -              "resource_group": "group",
        -              "secret": "need",
        -              "storage_account_name": "need",
        -              "storage_container": "need",
        -              "subscription_id": "need",
        -              "tenant": "need"
        -          },
        -          "status": "FAILED",
        -          "uuid": "21898dfd-9ac9-4e22-bb1d-7f12d0129e65"
        -      }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_compose_queue()[source]
        -

        Return the status of the new and running queues

        -

        /api/v1/compose/queue

        -
        -

        Return the status of the build queue. It includes information about the builds waiting, -and the build that is running.

        -

        Example:

        -
        {
        -  "new": [
        -    {
        -      "id": "45502a6d-06e8-48a5-a215-2b4174b3614b",
        -      "blueprint": "glusterfs",
        -      "queue_status": "WAITING",
        -      "job_created": 1517362647.4570868,
        -      "version": "0.0.6"
        -    },
        -    {
        -      "id": "6d292bd0-bec7-4825-8d7d-41ef9c3e4b73",
        -      "blueprint": "kubernetes",
        -      "queue_status": "WAITING",
        -      "job_created": 1517362659.0034983,
        -      "version": "0.0.1"
        -    }
        -  ],
        -  "run": [
        -    {
        -      "id": "745712b2-96db-44c0-8014-fe925c35e795",
        -      "blueprint": "glusterfs",
        -      "queue_status": "RUNNING",
        -      "job_created": 1517362633.7965999,
        -      "job_started": 1517362633.8001345,
        -      "version": "0.0.6",
        -      "uploads": [
        -          {
        -              "creation_time": 1568150660.524401,
        -              "image_name": "glusterfs server",
        -              "image_path": null,
        -              "provider_name": "azure",
        -              "settings": {
        -                  "client_id": "need",
        -                  "location": "need",
        -                  "resource_group": "group",
        -                  "secret": "need",
        -                  "storage_account_name": "need",
        -                  "storage_container": "need",
        -                  "subscription_id": "need",
        -                  "tenant": "need"
        -              },
        -              "status": "WAITING",
        -              "uuid": "21898dfd-9ac9-4e22-bb1d-7f12d0129e65"
        -          }
        -      ]
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_compose_start()[source]
        -

        Start a compose

        -
        -
        The body of the post should have these fields:

        blueprint_name - The blueprint name from /blueprints/list/ -compose_type - The type of output to create, from /compose/types -branch - Optional, defaults to master, selects the git branch to use for the blueprint.

        -
        -
        -

        POST /api/v1/compose

        -
        -

        Start a compose. The content type should be 'application/json' and the body of the POST -should look like this. The "upload" object is optional.

        -

        The upload object can specify either a pre-existing profile to use (as returned by -/uploads/providers) or one-time use settings for the provider.

        -

        Example with upload profile:

        -
        {
        -  "blueprint_name": "http-server",
        -  "compose_type": "tar",
        -  "branch": "master",
        -  "upload": {
        -    "image_name": "My Image",
        -    "provider": "azure",
        -    "profile": "production-azure-settings"
        -  }
        -}
        -
        -
        -

        Example with upload settings:

        -
        {
        -  "blueprint_name": "http-server",
        -  "compose_type": "tar",
        -  "branch": "master",
        -  "upload": {
        -    "image_name": "My Image",
        -    "provider": "azure",
        -    "settings": {
        -      "resource_group": "SOMEBODY",
        -      "storage_account_name": "ONCE",
        -      "storage_container": "TOLD",
        -      "location": "ME",
        -      "subscription_id": "THE",
        -      "client_id": "WORLD",
        -      "secret": "IS",
        -      "tenant": "GONNA"
        -    }
        -  }
        -}
        -
        -
        -

        Pass it the name of the blueprint, the type of output (from -'/api/v1/compose/types'), and the blueprint branch to use. 'branch' is -optional and will default to master. It will create a new build and add -it to the queue. It returns the build uuid and a status if it succeeds. -If an "upload" is given, it will schedule an upload to run when the build -finishes.

        -

        Example response:

        -
        {
        -  "build_id": "e6fa6db4-9c81-4b70-870f-a697ca405cdf",
        -  "upload_id": "572eb0d0-5348-4600-9666-14526ba628bb",
        -  "status": true
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_compose_status(uuids)[source]
        -

        Return the status of the listed uuids

        -

        /api/v1/compose/status/<uuids>[?blueprint=<blueprint_name>&status=<compose_status>&type=<compose_type>]

        -
        -

        Return the details for each of the comma-separated list of uuids. A uuid of '*' will return -details for all composes.

        -

        Example:

        -
        {
        -  "uuids": [
        -    {
        -      "id": "8c8435ef-d6bd-4c68-9bf1-a2ef832e6b1a",
        -      "blueprint": "http-server",
        -      "queue_status": "FINISHED",
        -      "job_created": 1517523644.2384307,
        -      "job_started": 1517523644.2551234,
        -      "job_finished": 1517523689.9864314,
        -      "version": "0.0.2"
        -    },
        -    {
        -      "id": "45502a6d-06e8-48a5-a215-2b4174b3614b",
        -      "blueprint": "glusterfs",
        -      "queue_status": "FINISHED",
        -      "job_created": 1517363442.188399,
        -      "job_started": 1517363442.325324,
        -      "job_finished": 1517363451.653621,
        -      "version": "0.0.6",
        -      "uploads": [
        -          {
        -              "creation_time": 1568150660.524401,
        -              "image_name": "glusterfs server",
        -              "image_path": null,
        -              "provider_name": "azure",
        -              "settings": {
        -                  "client_id": "need",
        -                  "location": "need",
        -                  "resource_group": "group",
        -                  "secret": "need",
        -                  "storage_account_name": "need",
        -                  "storage_container": "need",
        -                  "subscription_id": "need",
        -                  "tenant": "need"
        -              },
        -              "status": "WAITING",
        -              "uuid": "21898dfd-9ac9-4e22-bb1d-7f12d0129e65"
        -          }
        -      ]
        -    }
        -  ]
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_compose_uploads_delete(upload_uuid)[source]
        -

        Delete an upload and disassociate it from its compose

        -

        DELETE /api/v1/upload/delete/<upload_uuid>

        -
        -

        Example response:

        -
        {
        -  "status": true,
        -  "upload_id": "572eb0d0-5348-4600-9666-14526ba628bb"
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_compose_uploads_schedule(compose_uuid)[source]
        -

        Schedule an upload of a compose to a given cloud provider

        -

        POST /api/v1/uploads/schedule/<compose_uuid>

        -
        -

        The body can specify either a pre-existing profile to use (as returned by -/uploads/providers) or one-time use settings for the provider.

        -

        Example with upload profile:

        -
        {
        -  "image_name": "My Image",
        -  "provider": "azure",
        -  "profile": "production-azure-settings"
        -}
        -
        -
        -

        Example with upload settings:

        -
        {
        -  "image_name": "My Image",
        -  "provider": "azure",
        -  "settings": {
        -    "resource_group": "SOMEBODY",
        -    "storage_account_name": "ONCE",
        -    "storage_container": "TOLD",
        -    "location": "ME",
        -    "subscription_id": "THE",
        -    "client_id": "WORLD",
        -    "secret": "IS",
        -    "tenant": "GONNA"
        -  }
        -}
        -
        -
        -

        Example response:

        -
        {
        -  "status": true,
        -  "upload_id": "572eb0d0-5348-4600-9666-14526ba628bb"
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_projects_source_info(source_ids)[source]
        -

        Return detailed info about the list of sources

        -

        /api/v1/projects/source/info/<source-ids>

        -
        -

        Return information about the comma-separated list of source ids. Or all of the -sources if '*' is passed. Note that general globbing is not supported, only '*'.

        -

        Immutable system sources will have the "system" field set to true. User added sources -will have it set to false. System sources cannot be changed or deleted.

        -

        Example:

        -
        {
        -  "errors": [],
        -  "sources": {
        -    "fedora": {
        -      "check_gpg": true,
        -      "check_ssl": true,
        -      "gpgkey_urls": [
        -        "file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-28-x86_64"
        -      ],
        -      "id": "fedora",
        -      "name": "Fedora $releasever - $basearch",
        -      "proxy": "http://proxy.brianlane.com:8123",
        -      "system": true,
        -      "type": "yum-metalink",
        -      "url": "https://mirrors.fedoraproject.org/metalink?repo=fedora-28&arch=x86_64"
        -    }
        -  }
        -}
        -
        -
        -
        -

        In v0 the name field was used for the id (a short name for the repo). In v1 name changed -to id and name is now used for the longer descriptive name of the repository.

        -
        - -
        -
        -pylorax.api.v1.v1_projects_source_new()[source]
        -

        Add a new package source. Or change an existing one

        -

        POST /api/v1/projects/source/new

        -
        -

        Add (or change) a source for use when depsolving blueprints and composing images.

        -

        The proxy and gpgkey_urls entries are optional. All of the others are required. The supported -types for the urls are:

        -
          -
        • yum-baseurl is a URL to a yum repository.

        • -
        • yum-mirrorlist is a URL for a mirrorlist.

        • -
        • yum-metalink is a URL for a metalink.

        • -
        -

        If check_ssl is true the https certificates must be valid. If they are self-signed you can either set -this to false, or add your Certificate Authority to the host system.

        -

        If check_gpg is true the GPG key must either be installed on the host system, or gpgkey_urls -should point to it.

        -

        You can edit an existing source (other than system sources), by doing a POST -of the new version of the source. It will overwrite the previous one.

        -

        Example:

        -
        {
        -    "id": "custom-source-1",
        -    "name": "Custom Package Source #1",
        -    "url": "https://url/path/to/repository/",
        -    "type": "yum-baseurl",
        -    "check_ssl": true,
        -    "check_gpg": true,
        -    "gpgkey_urls": [
        -        "https://url/path/to/gpg-key"
        -    ]
        -}
        -
        -
        -
        -

        In v0 the name field was used for the id (a short name for the repo). In v1 name changed -to id and name is now used for the longer descriptive name of the repository.

        -
        - -
        -
        -pylorax.api.v1.v1_providers_delete(provider_name, profile)[source]
        -

        Delete a provider's profile settings

        -

        DELETE /api/v1/upload/providers/delete/<provider_name>/<profile>

        -
        -

        Example response:

        -
        {
        -  "status": true
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_providers_save()[source]
        -

        Save provider settings as a profile for later use

        -

        POST /api/v1/upload/providers/save

        -
        -

        Example request:

        -
        {
        -  "provider": "azure",
        -  "profile": "my-profile",
        -  "settings": {
        -    "resource_group": "SOMEBODY",
        -    "storage_account_name": "ONCE",
        -    "storage_container": "TOLD",
        -    "location": "ME",
        -    "subscription_id": "THE",
        -    "client_id": "WORLD",
        -    "secret": "IS",
        -    "tenant": "GONNA"
        -  }
        -}
        -
        -
        -

        Saving to an existing profile will overwrite it.

        -

        Example response:

        -
        {
        -  "status": true
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_upload_cancel(upload_uuid)[source]
        -

        Cancel an upload that is either queued or in progress

        -

        DELETE /api/v1/upload/cancel/<upload_uuid>

        -
        -

        Example response:

        -
        {
        -  "status": true,
        -  "upload_id": "037a3d56-b421-43e9-9935-c98350c89996"
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_upload_info(upload_uuid)[source]
        -

        Returns information about a given upload

        -

        GET /api/v1/upload/info/<upload_uuid>

        -
        -

        Example response:

        -
        {
        -  "status": true,
        -  "upload": {
        -    "creation_time": 1565620940.069004,
        -    "image_name": "My Image",
        -    "image_path": "/var/lib/lorax/composer/results/b6218e8f-0fa2-48ec-9394-f5c2918544c4/disk.vhd",
        -    "provider_name": "azure",
        -    "settings": {
        -      "resource_group": "SOMEBODY",
        -      "storage_account_name": "ONCE",
        -      "storage_container": "TOLD",
        -      "location": "ME",
        -      "subscription_id": "THE",
        -      "client_id": "WORLD",
        -      "secret": "IS",
        -      "tenant": "GONNA"
        -    },
        -    "status": "FAILED",
        -    "uuid": "b637c411-9d9d-4279-b067-6c8d38e3b211"
        -  }
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_upload_log(upload_uuid)[source]
        -

        Returns an upload's log

        -

        GET /api/v1/upload/log/<upload_uuid>

        -
        -

        Example response:

        -
        {
        -  "status": true,
        -  "upload_id": "b637c411-9d9d-4279-b067-6c8d38e3b211",
        -  "log": "< PLAY [localhost] >..."
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_upload_providers()[source]
        -

        Return the information about all upload providers, including their -display names, expected settings, and saved profiles. Refer to the -resolve_provider function.

        -

        GET /api/v1/upload/providers

        -
        -

        Example response:

        -
        {
        -  "providers": {
        -    "azure": {
        -      "display": "Azure",
        -      "profiles": {
        -        "default": {
        -          "client_id": "example",
        -          ...
        -        }
        -      },
        -      "settings-info": {
        -        "client_id": {
        -          "display": "Client ID",
        -          "placeholder": "",
        -          "regex": "",
        -          "type": "string"
        -        },
        -        ...
        -      },
        -      "supported_types": ["vhd"]
        -    },
        -    ...
        -  }
        -}
        -
        -
        -
        -
        - -
        -
        -pylorax.api.v1.v1_upload_reset(upload_uuid)[source]
        -

        Reset an upload so it can be attempted again

        -

        POST /api/v1/upload/reset/<upload_uuid>

        -
        -

        Optionally pass in a new image name and/or new settings.

        -

        Example request:

        -
        {
        -  "image_name": "My renamed image",
        -  "settings": {
        -    "resource_group": "ROLL",
        -    "storage_account_name": "ME",
        -    "storage_container": "I",
        -    "location": "AIN'T",
        -    "subscription_id": "THE",
        -    "client_id": "SHARPEST",
        -    "secret": "TOOL",
        -    "tenant": "IN"
        -  }
        -}
        -
        -
        -

        Example response:

        -
        {
        -  "status": true,
        -  "upload_id": "c75d5d62-9d26-42fc-a8ef-18bb14679fc7"
        -}
        -
        -
        -
        -
        - -
        -
        -

        pylorax.api.workspace module

        -
        -
        -pylorax.api.workspace.workspace_delete(repo, branch, recipe_name)[source]
        -

        Delete the recipe from the workspace

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • recipe_name (str) -- The name of the recipe

        • -
        -
        -
        Returns
        -

        None

        -
        -
        Raises
        -

        IO related errors

        -
        -
        -
        - -
        -
        -pylorax.api.workspace.workspace_dir(repo, branch)[source]
        -

        Create the workspace's path from a Repository and branch

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        -
        -
        Returns
        -

        The path to the branch's workspace directory

        -
        -
        Return type
        -

        str

        -
        -
        -
        - -
        -
        -pylorax.api.workspace.workspace_exists(repo, branch, recipe_name)[source]
        -

        Return true of the workspace recipe exists

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • recipe_name (str) -- The name of the recipe

        • -
        -
        -
        Returns
        -

        True if the file exists

        -
        -
        Return type
        -

        bool

        -
        -
        -
        - -
        -
        -pylorax.api.workspace.workspace_filename(repo, branch, recipe_name)[source]
        -

        Return the path and filename of the workspace recipe

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • recipe_name (str) -- The name of the recipe

        • -
        -
        -
        Returns
        -

        workspace recipe path and filename

        -
        -
        Return type
        -

        str

        -
        -
        -
        - -
        -
        -pylorax.api.workspace.workspace_read(repo, branch, recipe_name)[source]
        -

        Read a Recipe from the branch's workspace

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • recipe_name (str) -- The name of the recipe

        • -
        -
        -
        Returns
        -

        The workspace copy of the recipe, or None if it doesn't exist

        -
        -
        Return type
        -

        Recipe or None

        -
        -
        Raises
        -

        RecipeFileError

        -
        -
        -
        - -
        -
        -pylorax.api.workspace.workspace_write(repo, branch, recipe)[source]
        -

        Write a recipe to the workspace

        -
        -
        Parameters
        -
          -
        • repo (Git.Repository) -- Open repository

        • -
        • branch (str) -- Branch name

        • -
        • recipe (Recipe) -- The recipe to write to the workspace

        • -
        -
        -
        Returns
        -

        None

        -
        -
        Raises
        -

        IO related errors

        -
        -
        -
        - -
        -
        -

        Module contents

        -
        -
        - - -
        - -
        - - -
        -
        - -
        - -
        - - - - - - - - - - - - \ No newline at end of file diff --git a/docs/html/pylorax.html b/docs/html/pylorax.html index 6afe8e3f..8983723d 100644 --- a/docs/html/pylorax.html +++ b/docs/html/pylorax.html @@ -1,41 +1,41 @@ - - + - + - + + + pylorax package — Lorax 34.9.0 documentation + + + + + + - pylorax package — Lorax 34.3 documentation - + - - - - - - - + @@ -59,7 +59,7 @@
        - 34.3 + 34.9.0
        @@ -76,6 +76,7 @@ + + @@ -157,11 +157,13 @@ + +
          -
        • Docs »
        • +
        • »
        • src »
        • @@ -170,7 +172,7 @@
        • - + View page source @@ -193,42 +195,42 @@

          pylorax.base module

          -class pylorax.base.BaseLoraxClass[source]
          -

          Bases: object

          +class pylorax.base.BaseLoraxClass[source] +

          Bases: object

          -pcritical(msg, fobj=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>)[source]
          +pcritical(msg, fobj=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>)[source]
          -pdebug(msg, fobj=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>)[source]
          +pdebug(msg, fobj=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>)[source]
          -perror(msg, fobj=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>)[source]
          +perror(msg, fobj=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>)[source]
          -pinfo(msg, fobj=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>)[source]
          +pinfo(msg, fobj=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>)[source]
          -pwarning(msg, fobj=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>)[source]
          +pwarning(msg, fobj=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>)[source]
          -class pylorax.base.DataHolder(**kwargs)[source]
          -

          Bases: dict

          +class pylorax.base.DataHolder(**kwargs)[source] +

          Bases: dict

          -copy() → a shallow copy of D[source]
          +copy()a shallow copy of D[source]
          @@ -238,11 +240,11 @@

          pylorax.buildstamp module

          -class pylorax.buildstamp.BuildStamp(product, version, bugurl, isfinal, buildarch, variant='')[source]
          -

          Bases: object

          +class pylorax.buildstamp.BuildStamp(product, version, bugurl, isfinal, buildarch, variant='')[source] +

          Bases: object

          -write(outfile)[source]
          +write(outfile)[source]
          @@ -252,13 +254,13 @@

          pylorax.cmdline module

          -pylorax.cmdline.lmc_parser(dracut_default='')[source]
          +pylorax.cmdline.lmc_parser(dracut_default='')[source]

          Return a ArgumentParser object for live-media-creator.

          -pylorax.cmdline.lorax_parser(dracut_default='')[source]
          +pylorax.cmdline.lorax_parser(dracut_default='')[source]

          Return the ArgumentParser for lorax

          @@ -267,35 +269,35 @@

          pylorax.creator module

          -class pylorax.creator.FakeDNF(conf)[source]
          -

          Bases: object

          +class pylorax.creator.FakeDNF(conf)[source] +

          Bases: object

          A minimal DNF object suitable for passing to RuntimeBuilder

          lmc uses RuntimeBuilder to run the arch specific iso creation templates, so the the installroot config value is the important part of this. Everything else should be a nop.

          -reset()[source]
          +reset()[source]
          -pylorax.creator.calculate_disk_size(opts, ks)[source]
          +pylorax.creator.calculate_disk_size(opts, ks)[source]

          Calculate the disk size from the kickstart

          Parameters
          • opts (argparse options) -- options passed to livemedia-creator

          • -
          • ks (str) -- Path to the kickstart to use for the installation

          • +
          • ks (str) -- Path to the kickstart to use for the installation

          Returns

          Disk size in MiB

          Return type
          -

          int

          +

          int

          Also takes into account the use of reqpart or reqpart --add-boot

          @@ -303,7 +305,7 @@ this. Everything else should be a nop.

          -pylorax.creator.check_kickstart(ks, opts)[source]
          +pylorax.creator.check_kickstart(ks, opts)[source]

          Check the parsed kickstart object for errors

          Parameters
          @@ -316,21 +318,21 @@ this. Everything else should be a nop.

          List of error strings or empty list

          Return type
          -

          list

          +

          list

          -pylorax.creator.create_pxe_config(template, images_dir, live_image_name, add_args=None)[source]
          +pylorax.creator.create_pxe_config(template, images_dir, live_image_name, add_args=None)[source]

          Create template for pxe to live configuration

          Parameters
            -
          • images_dir (str) -- Path of directory with images to be used

          • -
          • live_image_name (str) -- Name of live rootfs image file

          • -
          • add_args (list) -- Arguments to be added to initrd= pxe config

          • +
          • images_dir (str) -- Path of directory with images to be used

          • +
          • live_image_name (str) -- Name of live rootfs image file

          • +
          • add_args (list) -- Arguments to be added to initrd= pxe config

          @@ -338,7 +340,7 @@ this. Everything else should be a nop.

          -pylorax.creator.dracut_args(opts)[source]
          +pylorax.creator.dracut_args(opts)[source]

          Return a list of the args to pass to dracut

          Return the default argument list unless one of the dracut cmdline arguments has been used.

          @@ -346,70 +348,70 @@ has been used.

          -pylorax.creator.find_ostree_root(phys_root)[source]
          +pylorax.creator.find_ostree_root(phys_root)[source]

          Find root of ostree deployment

          Parameters
          -

          phys_root (str) -- Path to physical root

          +

          phys_root (str) -- Path to physical root

          Returns

          Relative path of ostree deployment root

          Return type
          -

          str

          +

          str

          Raises
          -

          Exception -- More than one deployment roots were found

          +

          Exception -- More than one deployment roots were found

          -pylorax.creator.get_arch(mount_dir)[source]
          +pylorax.creator.get_arch(mount_dir)[source]

          Get the kernel arch

          Returns

          Arch of first kernel found at mount_dir/boot/ or i386

          Return type
          -

          str

          +

          str

          -pylorax.creator.is_image_mounted(disk_img)[source]
          +pylorax.creator.is_image_mounted(disk_img)[source]

          Check to see if the disk_img is mounted

          Returns

          True if disk_img is in /proc/mounts

          Return type
          -

          bool

          +

          bool

          -pylorax.creator.make_appliance(disk_img, name, template, outfile, networks=None, ram=1024, vcpus=1, arch=None, title='Linux', project='Linux', releasever='32')[source]
          +pylorax.creator.make_appliance(disk_img, name, template, outfile, networks=None, ram=1024, vcpus=1, arch=None, title='Linux', project='Linux', releasever='34')[source]

          Generate an appliance description file

          Parameters
            -
          • disk_img (str) -- Full path of the disk image

          • -
          • name (str) -- Name of the appliance, passed to the template

          • -
          • template (str) -- Full path of Mako template

          • -
          • outfile (str) -- Full path of file to write, using template

          • -
          • networks (list) -- List of networks(str) from the kickstart

          • -
          • ram (int) -- Ram, in MiB, passed to template. Default is 1024

          • -
          • vcpus (int) -- CPUs, passed to template. Default is 1

          • -
          • arch (str) -- CPU architecture. Default is 'x86_64'

          • -
          • title (str) -- Title, passed to template. Default is 'Linux'

          • -
          • project (str) -- Project, passed to template. Default is 'Linux'

          • -
          • releasever (str) -- Release version, passed to template. Default is 32

          • +
          • disk_img (str) -- Full path of the disk image

          • +
          • name (str) -- Name of the appliance, passed to the template

          • +
          • template (str) -- Full path of Mako template

          • +
          • outfile (str) -- Full path of file to write, using template

          • +
          • networks (list) -- List of networks(str) from the kickstart

          • +
          • ram (int) -- Ram, in MiB, passed to template. Default is 1024

          • +
          • vcpus (int) -- CPUs, passed to template. Default is 1

          • +
          • arch (str) -- CPU architecture. Default is 'x86_64'

          • +
          • title (str) -- Title, passed to template. Default is 'Linux'

          • +
          • project (str) -- Project, passed to template. Default is 'Linux'

          • +
          • releasever (str) -- Release version, passed to template. Default is 34

          @@ -417,13 +419,13 @@ has been used.

          -pylorax.creator.make_image(opts, ks, cancel_func=None)[source]
          +pylorax.creator.make_image(opts, ks, cancel_func=None)[source]

          Install to a disk image

          Parameters
          • opts (argparse options) -- options passed to livemedia-creator

          • -
          • ks (str) -- Path to the kickstart to use for the installation

          • +
          • ks (str) -- Path to the kickstart to use for the installation

          • cancel_func (function) -- Function that returns True to cancel build

          @@ -431,7 +433,7 @@ has been used.

          Path of the image created

          Return type
          -

          str

          +

          str

          Use qemu+boot.iso or anaconda to install to a disk image.

          @@ -439,21 +441,21 @@ has been used.

          -pylorax.creator.make_live_images(opts, work_dir, disk_img)[source]
          +pylorax.creator.make_live_images(opts, work_dir, disk_img)[source]

          Create live images from direcory or rootfs image

          Parameters
          • opts (argparse options) -- options passed to livemedia-creator

          • -
          • work_dir (str) -- Directory for storing results

          • -
          • disk_img (str) -- Path to disk image (fsimage or partitioned)

          • +
          • work_dir (str) -- Directory for storing results

          • +
          • disk_img (str) -- Path to disk image (fsimage or partitioned)

          Returns

          Path of directory with created images or None

          Return type
          -

          str

          +

          str

          fsck.ext4 is run on the rootfs_image to make sure there are no errors and to zero @@ -463,14 +465,14 @@ it will return None and log the error.

          -pylorax.creator.make_livecd(opts, mount_dir, work_dir)[source]
          +pylorax.creator.make_livecd(opts, mount_dir, work_dir)[source]

          Take the content from the disk image and make a livecd out of it

          Parameters
          • opts (argparse options) -- options passed to livemedia-creator

          • -
          • mount_dir (str) -- Directory tree to compress

          • -
          • work_dir (str) -- Output compressed image to work_dir+images/install.img

          • +
          • mount_dir (str) -- Directory tree to compress

          • +
          • work_dir (str) -- Output compressed image to work_dir+images/install.img

          @@ -487,29 +489,29 @@ root=live:CDLABEL=<volid> rd.live.image

        • -pylorax.creator.make_runtime(opts, mount_dir, work_dir, size=None)[source]
          +pylorax.creator.make_runtime(opts, mount_dir, work_dir, size=None)[source]

          Make the squashfs image from a directory

          Parameters
          • opts (argparse options) -- options passed to livemedia-creator

          • -
          • mount_dir (str) -- Directory tree to compress

          • -
          • work_dir (str) -- Output compressed image to work_dir+images/install.img

          • -
          • size (int) -- Size of disk image, in GiB

          • +
          • mount_dir (str) -- Directory tree to compress

          • +
          • work_dir (str) -- Output compressed image to work_dir+images/install.img

          • +
          • size (int) -- Size of disk image, in GiB

          Returns

          rc of squashfs creation

          Return type
          -

          int

          +

          int

          -pylorax.creator.mount_boot_part_over_root(img_mount)[source]
          +pylorax.creator.mount_boot_part_over_root(img_mount)[source]

          Mount boot partition to /boot of root fs mounted in img_mount

          Used for OSTree so it finds deployment configurations on live rootfs

          param img_mount: object with mounted disk image root partition @@ -518,14 +520,14 @@ type img_mount: imgutils.PartitionMount

          -pylorax.creator.rebuild_initrds_for_live(opts, sys_root_dir, results_dir)[source]
          +pylorax.creator.rebuild_initrds_for_live(opts, sys_root_dir, results_dir)[source]

          Rebuild intrds for pxe live image (root=live:http://)

          Parameters
          • opts (argparse options) -- options passed to livemedia-creator

          • -
          • sys_root_dir (str) -- Path to root of the system

          • -
          • results_dir (str) -- Path of directory for storing results

          • +
          • sys_root_dir (str) -- Path to root of the system

          • +
          • results_dir (str) -- Path of directory for storing results

          @@ -533,7 +535,7 @@ type img_mount: imgutils.PartitionMount

          -pylorax.creator.run_creator(opts, cancel_func=None)[source]
          +pylorax.creator.run_creator(opts, cancel_func=None)[source]

          Run the image creator process

          Parameters
          @@ -556,7 +558,7 @@ See the cmdline --help for livemedia-creator for the possible options

          -pylorax.creator.squashfs_args(opts)[source]
          +pylorax.creator.squashfs_args(opts)[source]

          Returns the compression type and args to use when making squashfs

          Parameters
          @@ -566,7 +568,7 @@ See the cmdline --help for livemedia-creator for the possible options

          tuple of compression type and args

          Return type
          -

          tuple

          +

          tuple

          @@ -576,7 +578,7 @@ See the cmdline --help for livemedia-creator for the possible options

          pylorax.decorators module

          -pylorax.decorators.singleton(cls)[source]
          +pylorax.decorators.singleton(cls)[source]
        @@ -584,11 +586,11 @@ See the cmdline --help for livemedia-creator for the possible options

        pylorax.discinfo module

        -class pylorax.discinfo.DiscInfo(release, basearch)[source]
        -

        Bases: object

        +class pylorax.discinfo.DiscInfo(release, basearch)[source] +

        Bases: object

        -write(outfile)[source]
        +write(outfile)[source]
        @@ -598,21 +600,21 @@ See the cmdline --help for livemedia-creator for the possible options

        pylorax.dnfbase module

        -pylorax.dnfbase.get_dnf_base_object(installroot, sources, mirrorlists=None, repos=None, enablerepos=None, disablerepos=None, tempdir='/var/tmp', proxy=None, releasever='32', cachedir=None, logdir=None, sslverify=True, dnfplugins=None)[source]
        +pylorax.dnfbase.get_dnf_base_object(installroot, sources, mirrorlists=None, repos=None, enablerepos=None, disablerepos=None, tempdir='/var/tmp', proxy=None, releasever='34', cachedir=None, logdir=None, sslverify=True, dnfplugins=None)[source]

        Create a dnf Base object and setup the repositories and installroot

        Parameters
        • installroot (string) -- Full path to the installroot

        • -
        • sources (list) -- List of source repo urls to use for the installation

        • -
        • enablerepos (list) -- List of repo names to enable

        • -
        • disablerepos (list) -- List of repo names to disable

        • -
        • mirrorlist (list) -- List of mirrors to use

        • +
        • sources (list) -- List of source repo urls to use for the installation

        • +
        • enablerepos (list) -- List of repo names to enable

        • +
        • disablerepos (list) -- List of repo names to disable

        • +
        • mirrorlist (list) -- List of mirrors to use

        • tempdir (string) -- Path of temporary directory

        • proxy (string) -- http proxy to use when fetching packages

        • releasever (string) -- Release version to pass to dnf

        • cachedir (string) -- Directory to use for caching packages

        • -
        • noverifyssl (bool) -- Set to True to ignore the CA of ssl certs. eg. use self-signed ssl for https repos.

        • +
        • noverifyssl (bool) -- Set to True to ignore the CA of ssl certs. eg. use self-signed ssl for https repos.

        @@ -625,37 +627,37 @@ If cachedir is None a dnf.cache directory is created inside tmpdir

        pylorax.dnfhelper module

        -class pylorax.dnfhelper.LoraxDownloadCallback[source]
        +class pylorax.dnfhelper.LoraxDownloadCallback[source]

        Bases: DownloadProgress

        -end(payload, status, msg)[source]
        +end(payload, status, msg)[source]
        -progress(payload, done)[source]
        +progress(payload, done)[source]
        -start(total_files, total_size, total_drpms=0)[source]
        +start(total_files, total_size, total_drpms=0)[source]
        -class pylorax.dnfhelper.LoraxRpmCallback[source]
        +class pylorax.dnfhelper.LoraxRpmCallback[source]

        Bases: TransactionProgress

        -error(message)[source]
        +error(message)[source]
        -progress(package, action, ti_done, ti_total, ts_done, ts_total)[source]
        +progress(package, action, ti_done, ti_total, ts_done, ts_total)[source]
        @@ -665,18 +667,18 @@ If cachedir is None a dnf.cache directory is created inside tmpdir

        pylorax.executils module

        -class pylorax.executils.ExecProduct(rc, stdout, stderr)[source]
        -

        Bases: object

        +class pylorax.executils.ExecProduct(rc, stdout, stderr)[source] +

        Bases: object

        -pylorax.executils.augmentEnv()[source]
        +pylorax.executils.augmentEnv()[source]
        -pylorax.executils.execReadlines(command, argv, stdin=None, root='/', env_prune=None, filter_stderr=False, callback=<function <lambda>>, env_add=None, reset_handlers=True, reset_lang=True)[source]
        +pylorax.executils.execReadlines(command, argv, stdin=None, root='/', env_prune=None, filter_stderr=False, callback=<function <lambda>>, env_add=None, reset_handlers=True, reset_lang=True)[source]

        Execute an external command and return the line output of the command in real-time.

        This method assumes that there is a reasonably low delay between the @@ -712,7 +714,7 @@ This returns an iterator with the lines from the command until it has finished

        -pylorax.executils.execWithCapture(command, argv, stdin=None, root='/', log_output=True, filter_stderr=False, raise_err=False, callback=None, env_add=None, reset_handlers=True, reset_lang=True)[source]
        +pylorax.executils.execWithCapture(command, argv, stdin=None, root='/', log_output=True, filter_stderr=False, raise_err=False, callback=None, env_add=None, reset_handlers=True, reset_lang=True)[source]

        Run an external program and capture standard out and err.

        Parameters
        @@ -737,7 +739,7 @@ This returns an iterator with the lines from the command until it has finished
        -pylorax.executils.execWithRedirect(command, argv, stdin=None, stdout=None, root='/', env_prune=None, log_output=True, binary_output=False, raise_err=False, callback=None, env_add=None, reset_handlers=True, reset_lang=True)[source]
        +pylorax.executils.execWithRedirect(command, argv, stdin=None, stdout=None, root='/', env_prune=None, log_output=True, binary_output=False, raise_err=False, callback=None, env_add=None, reset_handlers=True, reset_lang=True)[source]

        Run an external program and redirect the output to a file.

        Parameters
        @@ -765,19 +767,19 @@ This returns an iterator with the lines from the command until it has finished
        -pylorax.executils.runcmd(cmd, **kwargs)[source]
        +pylorax.executils.runcmd(cmd, **kwargs)[source]

        run execWithRedirect with raise_err=True

        -pylorax.executils.runcmd_output(cmd, **kwargs)[source]
        +pylorax.executils.runcmd_output(cmd, **kwargs)[source]

        run execWithCapture with raise_err=True

        -pylorax.executils.setenv(name, value)[source]
        +pylorax.executils.setenv(name, value)[source]

        Set an environment variable to be used by child processes.

        This method does not modify os.environ for the running process, which is not thread-safe. If setenv has already been called for a particular @@ -785,8 +787,8 @@ variable name, the old value is overwritten.

        Parameters
          -
        • name (str) -- The name of the environment variable

        • -
        • value (str) -- The value of the environment variable

        • +
        • name (str) -- The name of the environment variable

        • +
        • value (str) -- The value of the environment variable

        @@ -794,7 +796,7 @@ variable name, the old value is overwritten.

        -pylorax.executils.startProgram(argv, root='/', stdin=None, stdout=- 1, stderr=- 2, env_prune=None, env_add=None, reset_handlers=True, reset_lang=True, **kwargs)[source]
        +pylorax.executils.startProgram(argv, root='/', stdin=None, stdout=- 1, stderr=- 2, env_prune=None, env_add=None, reset_handlers=True, reset_lang=True, **kwargs)[source]

        Start an external program and return the Popen object.

        The root and reset_handlers arguments are handled by passing a preexec_fn argument to subprocess.Popen, but an additional preexec_fn @@ -827,32 +829,32 @@ last.

        pylorax.imgutils module

        -class pylorax.imgutils.DMDev(dev, size, name=None)[source]
        -

        Bases: object

        +class pylorax.imgutils.DMDev(dev, size, name=None)[source] +

        Bases: object

        -class pylorax.imgutils.LoopDev(filename, size=None)[source]
        -

        Bases: object

        +class pylorax.imgutils.LoopDev(filename, size=None)[source] +

        Bases: object

        -class pylorax.imgutils.Mount(dev, opts='', mnt=None)[source]
        -

        Bases: object

        +class pylorax.imgutils.Mount(dev, opts='', mnt=None)[source] +

        Bases: object

        -class pylorax.imgutils.PartitionMount(disk_img, mount_ok=None, submount=None)[source]
        -

        Bases: object

        +class pylorax.imgutils.PartitionMount(disk_img, mount_ok=None, submount=None)[source] +

        Bases: object

        Mount a partitioned image file using kpartx

        -pylorax.imgutils.compress(command, root, outfile, compression='xz', compressargs=None)[source]
        +pylorax.imgutils.compress(command, root, outfile, compression='xz', compressargs=None)[source]

        Make a compressed archive of the given rootdir or file. command is a list of the archiver commands to run compression should be "xz", "gzip", "lzma", "bzip2", or None. @@ -861,7 +863,7 @@ compressargs will be used on the compression commandline.

        -pylorax.imgutils.copytree(src, dest, preserve=True)[source]
        +pylorax.imgutils.copytree(src, dest, preserve=True)[source]

        Copy a tree of files using cp -a, thus preserving modes, timestamps, links, acls, sparse files, xattrs, selinux contexts, etc. If preserve is False, uses cp -R (useful for modeless filesystems) @@ -870,13 +872,13 @@ raises CalledProcessError if copy fails.

        -pylorax.imgutils.default_image_name(compression, basename)[source]
        +pylorax.imgutils.default_image_name(compression, basename)[source]

        Return a default image name with the correct suffix for the compression type.

        Parameters
          -
        • compression (str) -- Compression type

        • -
        • basename (str) -- Base filename

        • +
        • compression (str) -- Compression type

        • +
        • basename (str) -- Base filename

        Returns
        @@ -888,7 +890,7 @@ raises CalledProcessError if copy fails.

        -pylorax.imgutils.dm_attach(dev, size, name=None)[source]
        +pylorax.imgutils.dm_attach(dev, size, name=None)[source]

        Attach a devicemapper device to the given device, with the given size. If name is None, a random name will be chosen. Returns the device name. raises CalledProcessError if dmsetup fails.

        @@ -896,13 +898,13 @@ raises CalledProcessError if dmsetup fails.

        -pylorax.imgutils.dm_detach(dev)[source]
        +pylorax.imgutils.dm_detach(dev)[source]

        Detach the named devicemapper device. Returns False if dmsetup fails.

        -pylorax.imgutils.do_grafts(grafts, dest, preserve=True)[source]
        +pylorax.imgutils.do_grafts(grafts, dest, preserve=True)[source]

        Copy each of the items listed in grafts into dest. If the key ends with '/' it's assumed to be a directory which should be created, otherwise just the leading directories will be created.

        @@ -910,23 +912,23 @@ created, otherwise just the leading directories will be created.

        -pylorax.imgutils.estimate_size(rootdir, graft=None, fstype=None, blocksize=4096, overhead=256)[source]
        +pylorax.imgutils.estimate_size(rootdir, graft=None, fstype=None, blocksize=4096, overhead=256)[source]
        -pylorax.imgutils.get_loop_name(path)[source]
        +pylorax.imgutils.get_loop_name(path)[source]

        Return the loop device associated with the path. Raises RuntimeError if more than one loop is associated

        -pylorax.imgutils.kpartx_disk_img(disk_img)[source]
        +pylorax.imgutils.kpartx_disk_img(disk_img)[source]

        Attach a disk image's partitions to /dev/loopX using kpartx

        Parameters
        -

        disk_img (str) -- The full path to a partitioned disk image

        +

        disk_img (str) -- The full path to a partitioned disk image

        Returns

        list of (loopXpN, size)

        @@ -939,7 +941,7 @@ Raises RuntimeError if more than one loop is associated

        -pylorax.imgutils.loop_attach(outfile)[source]
        +pylorax.imgutils.loop_attach(outfile)[source]

        Attach a loop device to the given file. Return the loop device name.

        On rare occasions it appears that the device never shows up, some experiments seem to indicate that it may be a race with another process using /dev/loop* devices.

        @@ -949,13 +951,13 @@ seem to indicate that it may be a race with another process using /dev/loop* dev
        -pylorax.imgutils.loop_detach(loopdev)[source]
        +pylorax.imgutils.loop_detach(loopdev)[source]

        Detach the given loop device. Return False on failure.

        -pylorax.imgutils.loop_waitfor(loop_dev, outfile)[source]
        +pylorax.imgutils.loop_waitfor(loop_dev, outfile)[source]

        Make sure the loop device is attached to the outfile.

        It seems that on rare occasions losetup can return before the /dev/loopX is ready for use, causing problems with mkfs. This tries to make sure that the @@ -965,27 +967,27 @@ loop device really is associated with the backing file before continuing.

        -pylorax.imgutils.mkbtrfsimg(rootdir, outfile, size=None, label='', mountargs='', graft=None)[source]
        +pylorax.imgutils.mkbtrfsimg(rootdir, outfile, size=None, label='', mountargs='', graft=None)[source]
        -pylorax.imgutils.mkcpio(root, outfile, compression='xz', compressargs=None)[source]
        +pylorax.imgutils.mkcpio(root, outfile, compression='xz', compressargs=None)[source]
        -pylorax.imgutils.mkdosimg(rootdir, outfile, size=None, label='', mountargs='shortname=winnt,umask=0077', graft=None)[source]
        +pylorax.imgutils.mkdosimg(rootdir, outfile, size=None, label='', mountargs='shortname=winnt,umask=0077', graft=None)[source]
        -pylorax.imgutils.mkext4img(rootdir, outfile, size=None, label='', mountargs='', graft=None)[source]
        +pylorax.imgutils.mkext4img(rootdir, outfile, size=None, label='', mountargs='', graft=None)[source]
        -pylorax.imgutils.mkfsimage(fstype, rootdir, outfile, size=None, mkfsargs=None, mountargs='', graft=None)[source]
        +pylorax.imgutils.mkfsimage(fstype, rootdir, outfile, size=None, mkfsargs=None, mountargs='', graft=None)[source]

        Generic filesystem image creation function. fstype should be a filesystem type - "mkfs.${fstype}" must exist. graft should be a dict: {"some/path/in/image": "local/file/or/dir"}; @@ -995,17 +997,17 @@ Will raise CalledProcessError if something goes wrong.

        -pylorax.imgutils.mkfsimage_from_disk(diskimage, fsimage, img_size=None, label='Anaconda')[source]
        +pylorax.imgutils.mkfsimage_from_disk(diskimage, fsimage, img_size=None, label='Anaconda')[source]

        Copy the / partition of a partitioned disk image to an un-partitioned disk image.

        Parameters
          -
        • diskimage (str) -- The full path to partitioned disk image with a /

        • -
        • fsimage (str) -- The full path of the output fs image file

        • -
        • img_size (int) -- Optional size of the fsimage in MiB or None to make +

        • diskimage (str) -- The full path to partitioned disk image with a /

        • +
        • fsimage (str) -- The full path of the output fs image file

        • +
        • img_size (int) -- Optional size of the fsimage in MiB or None to make it as small as possible

        • -
        • label (str) -- The label to apply to the image. Defaults to "Anaconda"

        • +
        • label (str) -- The label to apply to the image. Defaults to "Anaconda"

        @@ -1013,12 +1015,12 @@ it as small as possible

        -pylorax.imgutils.mkhfsimg(rootdir, outfile, size=None, label='', mountargs='', graft=None)[source]
        +pylorax.imgutils.mkhfsimg(rootdir, outfile, size=None, label='', mountargs='', graft=None)[source]
        -pylorax.imgutils.mkqcow2(outfile, size, options=None)[source]
        +pylorax.imgutils.mkqcow2(outfile, size, options=None)[source]

        use qemu-img to create a file of the given size. options is a list of options passed to qemu-img

        Default format is qcow2, override by passing "-f", fmt @@ -1027,7 +1029,7 @@ in options.

        -pylorax.imgutils.mkqemu_img(outfile, size, options=None)[source]
        +pylorax.imgutils.mkqemu_img(outfile, size, options=None)[source]

        use qemu-img to create a file of the given size. options is a list of options passed to qemu-img

        Default format is qcow2, override by passing "-f", fmt @@ -1036,16 +1038,16 @@ in options.

        -pylorax.imgutils.mkrootfsimg(rootdir, outfile, label, size=2, sysroot='')[source]
        +pylorax.imgutils.mkrootfsimg(rootdir, outfile, label, size=2, sysroot='')[source]

        Make rootfs image from a directory

        Parameters
          -
        • rootdir (str) -- Root directory

        • -
        • outfile (str) -- Path of output image file

        • -
        • label (str) -- Filesystem label

        • -
        • size (int) -- Size of the image in GiB, if None computed automatically

        • -
        • sysroot (str) -- path to system (deployment) root relative to physical root

        • +
        • rootdir (str) -- Root directory

        • +
        • outfile (str) -- Path of output image file

        • +
        • label (str) -- Filesystem label

        • +
        • size (int) -- Size of the image in GiB, if None computed automatically

        • +
        • sysroot (str) -- path to system (deployment) root relative to physical root

        @@ -1053,24 +1055,24 @@ in options.

        -pylorax.imgutils.mksparse(outfile, size)[source]
        +pylorax.imgutils.mksparse(outfile, size)[source]

        use os.ftruncate to create a sparse file of the given size.

        -pylorax.imgutils.mksquashfs(rootdir, outfile, compression='default', compressargs=None)[source]
        +pylorax.imgutils.mksquashfs(rootdir, outfile, compression='default', compressargs=None)[source]

        Make a squashfs image containing the given rootdir.

        -pylorax.imgutils.mktar(root, outfile, compression='xz', compressargs=None, selinux=True)[source]
        +pylorax.imgutils.mktar(root, outfile, compression='xz', compressargs=None, selinux=True)[source]
        -pylorax.imgutils.mount(dev, opts='', mnt=None)[source]
        +pylorax.imgutils.mount(dev, opts='', mnt=None)[source]

        Mount the given device at the given mountpoint, using the given opts. opts should be a comma-separated string of mount options. if mnt is none, a temporary directory will be created and its path will be @@ -1080,13 +1082,13 @@ raises CalledProcessError if mount fails.

        -pylorax.imgutils.round_to_blocks(size, blocksize)[source]
        +pylorax.imgutils.round_to_blocks(size, blocksize)[source]

        If size isn't a multiple of blocksize, round up to the next multiple

        -pylorax.imgutils.umount(mnt, lazy=False, maxretry=3, retrysleep=1.0, delete=True)[source]
        +pylorax.imgutils.umount(mnt, lazy=False, maxretry=3, retrysleep=1.0, delete=True)[source]

        Unmount the given mountpoint. If lazy is True, do a lazy umount (-l). If the mount was a temporary dir created by mount, it will be deleted. raises CalledProcessError if umount fails.

        @@ -1097,29 +1099,29 @@ raises CalledProcessError if umount fails.

        pylorax.installer module

        -exception pylorax.installer.InstallError[source]
        -

        Bases: Exception

        +exception pylorax.installer.InstallError[source] +

        Bases: Exception

        -class pylorax.installer.QEMUInstall(opts, iso, ks_paths, disk_img, img_size=2048, kernel_args=None, memory=1024, vcpus=None, vnc=None, arch=None, cancel_func=None, virtio_host='127.0.0.1', virtio_port=6080, image_type=None, boot_uefi=False, ovmf_path=None)[source]
        -

        Bases: object

        +class pylorax.installer.QEMUInstall(opts, iso, ks_paths, disk_img, img_size=2048, kernel_args=None, memory=1024, vcpus=None, vnc=None, arch=None, cancel_func=None, virtio_host='127.0.0.1', virtio_port=6080, image_type=None, boot_uefi=False, ovmf_path=None)[source] +

        Bases: object

        Run qemu using an iso and a kickstart

        -QEMU_CMDS = {'aarch64': 'qemu-system-aarch64', 'arm': 'qemu-system-arm', 'i386': 'qemu-system-i386', 'ppc64le': 'qemu-system-ppc64', 'x86_64': 'qemu-system-x86_64'}
        +QEMU_CMDS = {'aarch64': 'qemu-system-aarch64', 'arm': 'qemu-system-arm', 'i386': 'qemu-system-i386', 'ppc64le': 'qemu-system-ppc64', 'x86_64': 'qemu-system-x86_64'}
        -pylorax.installer.anaconda_cleanup(dirinstall_path)[source]
        +pylorax.installer.anaconda_cleanup(dirinstall_path)[source]

        Cleanup any leftover mounts from anaconda

        Parameters
        -

        dirinstall_path (str) -- Path where anaconda mounts things

        +

        dirinstall_path (str) -- Path where anaconda mounts things

        Returns

        True if cleanups were successful. False if any of them failed.

        @@ -1134,20 +1136,20 @@ other mountpoints.

        -pylorax.installer.append_initrd(initrd, files)[source]
        +pylorax.installer.append_initrd(initrd, files)[source]

        Append files to an initrd.

        Parameters
          -
        • initrd (str) -- Path to initrd

        • -
        • files (list) -- list of file paths to add

        • +
        • initrd (str) -- Path to initrd

        • +
        • files (list) -- list of file paths to add

        Returns

        Path to a new initrd

        Return type
        -

        str

        +

        str

        The files are added to the initrd by creating a cpio image @@ -1159,13 +1161,13 @@ cpio archive.

        -pylorax.installer.create_vagrant_metadata(path, size=0)[source]
        +pylorax.installer.create_vagrant_metadata(path, size=0)[source]

        Create a default Vagrant metadata.json file

        Parameters
          -
        • path (str) -- Path to metadata.json file

        • -
        • size (int) -- Disk size in MiB

        • +
        • path (str) -- Path to metadata.json file

        • +
        • size (int) -- Disk size in MiB

        @@ -1173,34 +1175,34 @@ cpio archive.

        -pylorax.installer.find_free_port(start=5900, end=5999, host='127.0.0.1')[source]
        +pylorax.installer.find_free_port(start=5900, end=5999, host='127.0.0.1')[source]

        Return first free port in range.

        Parameters
          -
        • start (int) -- Starting port number

        • -
        • end (int) -- Ending port number

        • -
        • host (str) -- Host IP to search

        • +
        • start (int) -- Starting port number

        • +
        • end (int) -- Ending port number

        • +
        • host (str) -- Host IP to search

        Returns

        First free port or -1 if none found

        Return type
        -

        int

        +

        int

        -pylorax.installer.novirt_cancel_check(cancel_funcs, proc)[source]
        +pylorax.installer.novirt_cancel_check(cancel_funcs, proc)[source]

        Check to see if there has been an error in the logs

        Parameters
          -
        • cancel_funcs (list) -- list of functions to call, True from any one cancels the build

        • -
        • proc (subprocess.Popen) -- Popen object for the anaconda process

        • +
        • cancel_funcs (list) -- list of functions to call, True from any one cancels the build

        • +
        • proc (subprocess.Popen) -- Popen object for the anaconda process

        Returns
        @@ -1213,16 +1215,16 @@ When an error is detected the process is terminated and this returns True

        -pylorax.installer.novirt_install(opts, disk_img, disk_size, cancel_func=None, tar_img=None)[source]
        +pylorax.installer.novirt_install(opts, disk_img, disk_size, cancel_func=None, tar_img=None)[source]

        Use Anaconda to install to a disk image

        Parameters
        • opts (argparse options) -- options passed to livemedia-creator

        • -
        • disk_img (str) -- The full path to the disk image to be created

        • -
        • disk_size (int) -- The size of the disk_img in MiB

        • +
        • disk_img (str) -- The full path to the disk image to be created

        • +
        • disk_size (int) -- The size of the disk_img in MiB

        • cancel_func (function) -- Function that returns True to cancel build

        • -
        • tar_img (str) -- For make_tar_disk, the path to final tarball to be created

        • +
        • tar_img (str) -- For make_tar_disk, the path to final tarball to be created

        @@ -1232,13 +1234,13 @@ passed creates a qemu disk image or tarfile.

        -pylorax.installer.update_vagrant_metadata(path, size)[source]
        +pylorax.installer.update_vagrant_metadata(path, size)[source]

        Update the Vagrant metadata.json file

        Parameters
          -
        • path (str) -- Path to metadata.json file

        • -
        • size (int) -- Disk size in MiB

        • +
        • path (str) -- Path to metadata.json file

        • +
        • size (int) -- Disk size in MiB

        @@ -1248,17 +1250,17 @@ metadata file are set correctly. All other values are left untouched.

        -pylorax.installer.virt_install(opts, install_log, disk_img, disk_size, cancel_func=None, tar_img=None)[source]
        +pylorax.installer.virt_install(opts, install_log, disk_img, disk_size, cancel_func=None, tar_img=None)[source]

        Use qemu to install to a disk image

        Parameters
        • opts (argparse options) -- options passed to livemedia-creator

        • -
        • install_log (str) -- The path to write the log from qemu

        • -
        • disk_img (str) -- The full path to the disk image to be created

        • -
        • disk_size (int) -- The size of the disk_img in MiB

        • +
        • install_log (str) -- The path to write the log from qemu

        • +
        • disk_img (str) -- The full path to the disk image to be created

        • +
        • disk_size (int) -- The size of the disk_img in MiB

        • cancel_func (function) -- Function that returns True to cancel build

        • -
        • tar_img (str) -- For make_tar_disk, the path to final tarball to be created

        • +
        • tar_img (str) -- For make_tar_disk, the path to final tarball to be created

        @@ -1271,7 +1273,7 @@ image and then optionally, based on the opts passed, creates tarfile.

        pylorax.ltmpl module

        -class pylorax.ltmpl.LiveTemplateRunner(dbo, fatalerrors=True, templatedir=None, defaults=None)[source]
        +class pylorax.ltmpl.LiveTemplateRunner(dbo, fatalerrors=True, templatedir=None, defaults=None)[source]

        Bases: pylorax.ltmpl.TemplateRunner

        This class parses and executes a limited Lorax template. Sample usage:

        @@ -1283,7 +1285,7 @@ pacages needed to build the live-iso output.

        -installpkg(*pkgs)[source]
        +installpkg(*pkgs)[source]
        installpkg [--required|--optional] [--except PKGGLOB [--except PKGGLOB ...]] PKGGLOB [PKGGLOB ...]

        Request installation of all packages matching the given globs. Note that this is just a request - nothing is actually installed @@ -1297,18 +1299,18 @@ until the 'run_pkg_transaction' command is given.

        -class pylorax.ltmpl.LoraxTemplate(directories=None)[source]
        -

        Bases: object

        +class pylorax.ltmpl.LoraxTemplate(directories=None)[source] +

        Bases: object

        -parse(template_file, variables)[source]
        +parse(template_file, variables)[source]
        -class pylorax.ltmpl.LoraxTemplateRunner(inroot, outroot, dbo=None, fatalerrors=True, templatedir=None, defaults=None)[source]
        +class pylorax.ltmpl.LoraxTemplateRunner(inroot, outroot, dbo=None, fatalerrors=True, templatedir=None, defaults=None)[source]

        Bases: pylorax.ltmpl.TemplateRunner

        This class parses and executes Lorax templates. Sample usage:

        @@ -1337,7 +1339,7 @@ on that line (after word splitting and brace expansion)

        -append(filename, data)[source]
        +append(filename, data)[source]
        append FILE STRING

        Append STRING (followed by a newline character) to FILE. Python character escape sequences ('n', 't', etc.) will be @@ -1353,7 +1355,7 @@ append /etc/resolv.conf ""

        -chmod(fileglob, mode)[source]
        +chmod(fileglob, mode)[source]
        chmod FILEGLOB OCTALMODE

        Change the mode of all the files matching FILEGLOB to OCTALMODE.

        @@ -1362,7 +1364,7 @@ append /etc/resolv.conf ""

        -copy(src, dest)[source]
        +copy(src, dest)[source]
        copy SRC DEST

        Copy SRC to DEST. If DEST is a directory, SRC will be copied inside it. @@ -1374,7 +1376,7 @@ that name, if the path leading to it exists.

        -createaddrsize(addr, src, dest)[source]
        +createaddrsize(addr, src, dest)[source]
        createaddrsize INITRD_ADDRESS INITRD ADDRSIZE

        Create the initrd.addrsize file required in LPAR boot process.

        @@ -1387,7 +1389,7 @@ that name, if the path leading to it exists.

        +hardlink(src, dest)[source]
        hardlink SRC DEST

        Create a hardlink at DEST which is linked to SRC.

        @@ -1396,7 +1398,7 @@ that name, if the path leading to it exists.

        -install(srcglob, dest)[source]
        +install(srcglob, dest)[source]
        install SRC DEST

        Copy the given file (or files, if a glob is used) from the input tree to the given destination in the output tree. @@ -1416,7 +1418,7 @@ install /usr/share/myconfig/grub.conf.in /boot/grub.conf

        -installimg(*args)[source]
        +installimg(*args)[source]
        installimg [--xz|--gzip|--bzip2|--lzma] [-ARG|--ARG=OPTION] SRCDIR DESTFILE

        Create a compressed cpio archive of the contents of SRCDIR and place it in DESTFILE.

        @@ -1436,7 +1438,7 @@ passed to it. The default is xz -9

        -installinitrd(section, src, dest)[source]
        +installinitrd(section, src, dest)[source]
        installinitrd SECTION SRC DEST

        Same as installkernel, but for "initrd".

        @@ -1445,7 +1447,7 @@ passed to it. The default is xz -9

        -installkernel(section, src, dest)[source]
        +installkernel(section, src, dest)[source]
        installkernel SECTION SRC DEST

        Install the kernel from SRC in the input tree to DEST in the output tree, and then add an item to the treeinfo data store, in the named @@ -1461,7 +1463,7 @@ treeinfo SECTION kernel DEST

        -installpkg(*pkgs)[source]
        +installpkg(*pkgs)[source]
        installpkg [--required|--optional] [--except PKGGLOB [--except PKGGLOB ...]] PKGGLOB [PKGGLOB ...]

        Request installation of all packages matching the given globs. Note that this is just a request - nothing is actually installed @@ -1473,7 +1475,7 @@ until the 'run_pkg_transaction' command is given.

        -installupgradeinitrd(section, src, dest)[source]
        +installupgradeinitrd(section, src, dest)[source]
        installupgradeinitrd SECTION SRC DEST

        Same as installkernel, but for "upgrade".

        @@ -1482,7 +1484,7 @@ until the 'run_pkg_transaction' command is given.

        -log(msg)[source]
        +log(msg)[source]
        log MESSAGE

        Emit the given log message. Be sure to put it in quotes!

        @@ -1495,7 +1497,7 @@ until the 'run_pkg_transaction' command is given.

        -mkdir(*dirs)[source]
        +mkdir(*dirs)[source]
        mkdir DIR [DIR ...]

        Create the named DIR(s). Will create leading directories as needed.

        @@ -1508,7 +1510,7 @@ until the 'run_pkg_transaction' command is given.

        -move(src, dest)[source]
        +move(src, dest)[source]
        move SRC DEST

        Move SRC to DEST.

        @@ -1517,7 +1519,7 @@ until the 'run_pkg_transaction' command is given.

        -remove(*fileglobs)[source]
        +remove(*fileglobs)[source]
        remove FILEGLOB [FILEGLOB ...]

        Remove all the named files or directories. Will not raise exceptions if the file(s) are not found.

        @@ -1527,7 +1529,7 @@ Will not raise exceptions if the file(s) are not found.

        -removefrom(pkg, *globs)[source]
        +removefrom(pkg, *globs)[source]
        removefrom PKGGLOB [--allbut] FILEGLOB [FILEGLOB...]

        Remove all files matching the given file globs from the package (or packages) named. @@ -1544,7 +1546,7 @@ removefrom xfsprogs --allbut /sbin/*

        -removekmod(*globs)[source]
        +removekmod(*globs)[source]
        removekmod GLOB [GLOB...] [--allbut] KEEPGLOB [KEEPGLOB...]

        Remove all files and directories matching the given file globs from the kernel modules directory.

        @@ -1564,7 +1566,7 @@ removekmod drivers/char --allbut virtio_console hw_random

        -removepkg(*pkgs)[source]
        +removepkg(*pkgs)[source]
        removepkg PKGGLOB [PKGGLOB...]

        Delete the named package(s).

        @@ -1578,7 +1580,7 @@ Files are deleted, but directories are left behind.

        -replace(pat, repl, *fileglobs)[source]
        +replace(pat, repl, *fileglobs)[source]
        replace PATTERN REPLACEMENT FILEGLOB [FILEGLOB ...]

        Find-and-replace the given PATTERN (Python-style regex) with the given REPLACEMENT string for each of the files listed.

        @@ -1592,14 +1594,14 @@ REPLACEMENT string for each of the files listed.

        -run_pkg_transaction()[source]
        +run_pkg_transaction()[source]

        Actually install all the packages requested by previous 'installpkg' commands.

        -runcmd(*cmdlist)[source]
        +runcmd(*cmdlist)[source]
        runcmd CMD [ARG ...]

        Run the given command with the given arguments.

        NOTE: All paths given MUST be COMPLETE, ABSOLUTE PATHS to the file @@ -1622,7 +1624,7 @@ remove ${f}

        +symlink(target, dest)[source]
        symlink SRC DEST

        Create a symlink at DEST which points to SRC.

        @@ -1631,7 +1633,7 @@ remove ${f}
        -systemctl(cmd, *units)[source]
        +systemctl(cmd, *units)[source]
        systemctl [enable|disable|mask] UNIT [UNIT...]

        Enable, disable, or mask the given systemd units.

        @@ -1645,7 +1647,7 @@ systemctl mask fedora-storage-init.service fedora-configure.service

        -treeinfo(section, key, *valuetoks)[source]
        +treeinfo(section, key, *valuetoks)[source]
        treeinfo SECTION KEY ARG [ARG ...]

        Add an item to the treeinfo data store. The given SECTION will have a new item added where @@ -1662,8 +1664,8 @@ KEY = ARG ARG ...

        -class pylorax.ltmpl.TemplateRunner(fatalerrors=True, templatedir=None, defaults=None, builtins=None)[source]
        -

        Bases: object

        +class pylorax.ltmpl.TemplateRunner(fatalerrors=True, templatedir=None, defaults=None, builtins=None)[source] +

        Bases: object

        This class parses and executes Lorax templates. Sample usage:

        # install a bunch of packages @@ -1689,29 +1691,29 @@ of a command in an %if statement (or any other control statements)!

        -run(templatefile, **variables)[source]
        +run(templatefile, **variables)[source]
        -pylorax.ltmpl.brace_expand(s)[source]
        +pylorax.ltmpl.brace_expand(s)[source]
        -pylorax.ltmpl.rexists(pathname, root='')[source]
        +pylorax.ltmpl.rexists(pathname, root='')[source]
        -pylorax.ltmpl.rglob(pathname, root='/', fatal=False)[source]
        +pylorax.ltmpl.rglob(pathname, root='/', fatal=False)[source]
        -pylorax.ltmpl.split_and_expand(line)[source]
        +pylorax.ltmpl.split_and_expand(line)[source]
        @@ -1719,14 +1721,14 @@ of a command in an %if statement (or any other control statements)!

        pylorax.monitor module

        -class pylorax.monitor.LogMonitor(log_path=None, host='localhost', port=0, timeout=None, log_request_handler_class=<class 'pylorax.monitor.LogRequestHandler'>)[source]
        -

        Bases: object

        +class pylorax.monitor.LogMonitor(log_path=None, host='localhost', port=0, timeout=None, log_request_handler_class=<class 'pylorax.monitor.LogRequestHandler'>)[source] +

        Bases: object

        Setup a server to monitor the logs output by the installation

        This needs to be running before the virt-install runs, it expects there to be a listener on the port used for the virtio log port.

        -shutdown()[source]
        +shutdown()[source]

        Force shutdown of the monitoring thread

        @@ -1734,20 +1736,20 @@ there to be a listener on the port used for the virtio log port.

        -class pylorax.monitor.LogRequestHandler(request, client_address, server)[source]
        -

        Bases: socketserver.BaseRequestHandler

        +class pylorax.monitor.LogRequestHandler(request, client_address, server)[source] +

        Bases: socketserver.BaseRequestHandler

        Handle monitoring and saving the logfiles from the virtual install

        Incoming data is written to self.server.log_path and each line is checked for patterns that would indicate that the installation failed. self.server.log_error is set True when this happens.

        -finish()[source]
        +finish()[source]
        -handle()[source]
        +handle()[source]

        Write incoming data to a logfile and check for errors

        Split incoming data into lines and check for any Tracebacks or other errors that indicate that the install failed.

        @@ -1756,11 +1758,11 @@ errors that indicate that the install failed.

        -iserror(line)[source]
        +iserror(line)[source]

        Check a line to see if it contains an error indicating installation failure

        Parameters
        -

        line (str) -- log line to check for failure

        +

        line (str) -- log line to check for failure

        If the line contains IGNORED it will be skipped.

        @@ -1768,44 +1770,44 @@ errors that indicate that the install failed.

        -re_tests = ['packaging: base repo .* not valid', 'packaging: .* requires .*']
        +re_tests = ['packaging: base repo .* not valid', 'packaging: .* requires .*']
        -setup()[source]
        +setup()[source]

        Start writing to self.server.log_path

        -simple_tests = ['Traceback (', 'traceback script(s) have been run', 'Out of memory:', 'Call Trace:', 'insufficient disk space:', 'Not enough disk space to download the packages', 'error populating transaction after', 'crashed on signal', 'packaging: Missed: NoSuchPackage', 'packaging: Installation failed', 'The following error occurred while installing. This is a fatal error']
        +simple_tests = ['Traceback (', 'traceback script(s) have been run', 'Out of memory:', 'Call Trace:', 'insufficient disk space:', 'Not enough disk space to download the packages', 'error populating transaction after', 'crashed on signal', 'packaging: Missed: NoSuchPackage', 'packaging: Installation failed', 'The following error occurred while installing.  This is a fatal error', 'Error in POSTIN scriptlet in rpm package']
        -class pylorax.monitor.LogServer(log_path, *args, **kwargs)[source]
        -

        Bases: socketserver.TCPServer

        +class pylorax.monitor.LogServer(log_path, *args, **kwargs)[source] +

        Bases: socketserver.TCPServer

        A TCP Server that listens for log data

        -log_check()[source]
        +log_check()[source]

        Check to see if an error has been found in the log

        Returns

        True if there has been an error

        Return type
        -

        bool

        +

        bool

        -timeout = 60
        +timeout = 60
        @@ -1815,22 +1817,22 @@ errors that indicate that the install failed.

        pylorax.mount module

        -class pylorax.mount.IsoMountpoint(iso_path, initrd_path=None)[source]
        -

        Bases: object

        +class pylorax.mount.IsoMountpoint(iso_path, initrd_path=None)[source] +

        Bases: object

        Mount the iso and check to make sure the vmlinuz and initrd.img files exist

        Also check the iso for a a stage2 image and set a flag and extract the iso's label.

        stage2 can be either LiveOS/squashfs.img or images/install.img

        -get_iso_label()[source]
        +get_iso_label()[source]

        Get the iso's label using isoinfo

        Sets self.label if one is found

        -umount()[source]
        +umount()[source]

        Unmount the iso

        @@ -1844,37 +1846,37 @@ iso's label.

        pylorax.sysutils module

        -pylorax.sysutils.chmod_(path, mode, recursive=False)[source]
        +pylorax.sysutils.chmod_(path, mode, recursive=False)[source]
        -pylorax.sysutils.chown_(path, user=None, group=None, recursive=False)[source]
        +pylorax.sysutils.chown_(path, user=None, group=None, recursive=False)[source]
        -pylorax.sysutils.joinpaths(*args, **kwargs)[source]
        +pylorax.sysutils.joinpaths(*args, **kwargs)[source]
        -pylorax.sysutils.linktree(src, dst)[source]
        +pylorax.sysutils.linktree(src, dst)[source]
        -pylorax.sysutils.remove(target)[source]
        +pylorax.sysutils.remove(target)[source]
        -pylorax.sysutils.replace(fname, find, sub)[source]
        +pylorax.sysutils.replace(fname, find, sub)[source]
        -pylorax.sysutils.touch(fname)[source]
        +pylorax.sysutils.touch(fname)[source]
        @@ -1882,66 +1884,66 @@ iso's label.

        pylorax.treebuilder module

        -class pylorax.treebuilder.RuntimeBuilder(product, arch, dbo, templatedir=None, installpkgs=None, excludepkgs=None, add_templates=None, add_template_vars=None, skip_branding=False)[source]
        -

        Bases: object

        +class pylorax.treebuilder.RuntimeBuilder(product, arch, dbo, templatedir=None, installpkgs=None, excludepkgs=None, add_templates=None, add_template_vars=None, skip_branding=False)[source] +

        Bases: object

        Builds the anaconda runtime image.

        -cleanup()[source]
        +cleanup()[source]

        Remove unneeded packages and files with runtime-cleanup.tmpl

        -create_ext4_runtime(outfile='/var/tmp/squashfs.img', compression='xz', compressargs=None, size=2)[source]
        +create_ext4_runtime(outfile='/var/tmp/squashfs.img', compression='xz', compressargs=None, size=2)[source]

        Create a squashfs compressed ext4 runtime

        -create_squashfs_runtime(outfile='/var/tmp/squashfs.img', compression='xz', compressargs=None, size=2)[source]
        +create_squashfs_runtime(outfile='/var/tmp/squashfs.img', compression='xz', compressargs=None, size=2)[source]

        Create a plain squashfs runtime

        -finished()[source]
        +finished()[source]

        Done using RuntimeBuilder

        Close the dnf base object

        -generate_module_data()[source]
        +generate_module_data()[source]
        -install()[source]
        +install()[source]

        Install packages and do initial setup with runtime-install.tmpl

        -postinstall()[source]
        +postinstall()[source]

        Do some post-install setup work with runtime-postinstall.tmpl

        -verify()[source]
        +verify()[source]

        Ensure that contents of the installroot can run

        -writepkglists(pkglistdir)[source]
        +writepkglists(pkglistdir)[source]

        debugging data: write out lists of package contents

        -writepkgsizes(pkgsizefile)[source]
        +writepkgsizes(pkgsizefile)[source]

        debugging data: write a big list of pkg sizes

        @@ -1949,18 +1951,18 @@ iso's label.

        -class pylorax.treebuilder.TreeBuilder(product, arch, inroot, outroot, runtime, isolabel, domacboot=True, doupgrade=True, templatedir=None, add_templates=None, add_template_vars=None, workdir=None, extra_boot_args='')[source]
        -

        Bases: object

        +class pylorax.treebuilder.TreeBuilder(product, arch, inroot, outroot, runtime, isolabel, domacboot=True, doupgrade=True, templatedir=None, add_templates=None, add_template_vars=None, workdir=None, extra_boot_args='')[source] +

        Bases: object

        Builds the arch-specific boot images. inroot should be the installtree root (the newly-built runtime dir)

        -build()[source]
        +build()[source]
        -copy_dracut_hooks(hooks)[source]
        +copy_dracut_hooks(hooks)[source]

        Copy the hook scripts in hooks into the installroot's /tmp/ and return a list of commands to pass to dracut when creating the initramfs

        @@ -1971,7 +1973,7 @@ target dracut hook directory
        -property dracut_hooks_path
        +property dracut_hooks_path

        Return the path to the lorax dracut hooks scripts

        Use the configured share dir if it is setup, otherwise default to /usr/share/lorax/dracut_hooks

        @@ -1979,17 +1981,17 @@ otherwise default to /usr/share/lorax/dracut_hooks

        -implantisomd5()[source]
        +implantisomd5()[source]
        -property kernels
        +property kernels
        -rebuild_initrds(add_args=None, backup='', prefix='')[source]
        +rebuild_initrds(add_args=None, backup='', prefix='')[source]

        Rebuild all the initrds in the tree. If backup is specified, each initrd will be renamed with backup as a suffix before rebuilding. If backup is empty, the existing initrd files will be overwritten. @@ -2003,17 +2005,17 @@ name of the kernel.

        -pylorax.treebuilder.findkernels(root='/', kdir='boot')[source]
        +pylorax.treebuilder.findkernels(root='/', kdir='boot')[source]
        -pylorax.treebuilder.generate_module_info(moddir, outfile=None)[source]
        +pylorax.treebuilder.generate_module_info(moddir, outfile=None)[source]
        -pylorax.treebuilder.string_lower(string)[source]
        +pylorax.treebuilder.string_lower(string)[source]

        Return a lowercase string.

        Parameters
        @@ -2025,7 +2027,7 @@ name of the kernel.

        -pylorax.treebuilder.udev_escape(label)[source]
        +pylorax.treebuilder.udev_escape(label)[source]
        @@ -2033,16 +2035,16 @@ name of the kernel.

        pylorax.treeinfo module

        -class pylorax.treeinfo.TreeInfo(product, version, variant, basearch, packagedir='')[source]
        -

        Bases: object

        +class pylorax.treeinfo.TreeInfo(product, version, variant, basearch, packagedir='')[source] +

        Bases: object

        -add_section(section, data)[source]
        +add_section(section, data)[source]
        -write(outfile)[source]
        +write(outfile)[source]
        @@ -2052,47 +2054,47 @@ name of the kernel.

        Module contents

        -class pylorax.ArchData(buildarch)[source]
        +class pylorax.ArchData(buildarch)[source]

        Bases: pylorax.base.DataHolder

        -bcj_arch = {'arm': 'arm', 'armhfp': 'arm', 'i386': 'x86', 'ppc64le': 'powerpc', 'x86_64': 'x86'}
        +bcj_arch = {'arm': 'arm', 'armhfp': 'arm', 'i386': 'x86', 'ppc64le': 'powerpc', 'x86_64': 'x86'}
        -lib64_arches = ('x86_64', 'ppc64le', 's390x', 'ia64', 'aarch64')
        +lib64_arches = ('x86_64', 'ppc64le', 's390x', 'ia64', 'aarch64')
        -class pylorax.Lorax[source]
        +class pylorax.Lorax[source]

        Bases: pylorax.base.BaseLoraxClass

        -configure(conf_file='/etc/lorax/lorax.conf')[source]
        +configure(conf_file='/etc/lorax/lorax.conf')[source]
        -init_file_logging(logdir, logname='pylorax.log')[source]
        +init_file_logging(logdir, logname='pylorax.log')[source]
        -init_stream_logging()[source]
        +init_stream_logging()[source]
        -run(dbo, product, version, release, variant='', bugurl='', isfinal=False, workdir=None, outputdir=None, buildarch=None, volid=None, domacboot=True, doupgrade=True, remove_temp=False, installpkgs=None, excludepkgs=None, size=2, add_templates=None, add_template_vars=None, add_arch_templates=None, add_arch_template_vars=None, verify=True, user_dracut_args=None, squashfs_only=False, skip_branding=False)[source]
        +run(dbo, product, version, release, variant='', bugurl='', isfinal=False, workdir=None, outputdir=None, buildarch=None, volid=None, domacboot=True, doupgrade=True, remove_temp=False, installpkgs=None, excludepkgs=None, size=2, add_templates=None, add_template_vars=None, add_arch_templates=None, add_arch_template_vars=None, verify=True, user_dracut_args=None, squashfs_only=False, skip_branding=False)[source]
        -property templatedir
        +property templatedir

        Find the template directory.

        Pick the first directory under sharedir/templates.d/ if it exists. Otherwise use the sharedir

        @@ -2102,17 +2104,17 @@ Otherwise use the sharedir

        -pylorax.find_templates(templatedir='/usr/share/lorax')[source]
        +pylorax.find_templates(templatedir='/usr/share/lorax')[source]

        Find the templates to use.

        Parameters
        -

        templatedir (str) -- Top directory to search for templates

        +

        templatedir (str) -- Top directory to search for templates

        Returns

        Path to templates

        Return type
        -

        str

        +

        str

        If there is a templates.d directory under templatedir the @@ -2122,24 +2124,24 @@ lowest numbered directory entry is returned.

        -pylorax.get_buildarch(dbo)[source]
        +pylorax.get_buildarch(dbo)[source]
        -pylorax.log_selinux_state()[source]
        +pylorax.log_selinux_state()[source]

        Log the current state of selinux

        -pylorax.setup_logging(logfile, theLogger)[source]
        +pylorax.setup_logging(logfile, theLogger)[source]

        Setup the various logs

        Parameters
        • logfile (string) -- filename to write the log to

        • -
        • theLogger (logging.Logger) -- top-level logger

        • +
        • theLogger (logging.Logger) -- top-level logger

        @@ -2153,27 +2155,28 @@ lowest numbered directory entry is returned.

        - @@ -2182,7 +2185,6 @@ lowest numbered directory entry is returned.

        - - - - - - + @@ -60,7 +61,7 @@
        - 34.3 + 34.9.0
        @@ -77,6 +78,7 @@ + + @@ -132,19 +134,19 @@ + +
          -
        • Docs »
        • +
        • »
        • Search
        • - -
        @@ -158,8 +160,7 @@ @@ -173,20 +174,25 @@
        - @@ -195,7 +201,6 @@ -

      i*DP=yX&UKNPH~V_^C!Nm?gP=n^!?@Y4WRDM7<6 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

    wE%Q~3jRk_sI*=lY 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