404

[ Avaa Bypassed ]




Upload:

Command:

elspacio@3.144.254.149: ~ $
# Copyright (C) 2018 Canonical Ltd.
#
# This file is part of cloud-init. See LICENSE file for license information.

"""Snap: Install, configure and manage snapd and snap packages."""

import logging
import os
import sys
from textwrap import dedent

from cloudinit import subp, util
from cloudinit.cloud import Cloud
from cloudinit.config import Config
from cloudinit.config.schema import MetaSchema, get_meta_doc
from cloudinit.settings import PER_INSTANCE
from cloudinit.subp import prepend_base_command

distros = ["ubuntu"]
frequency = PER_INSTANCE

LOG = logging.getLogger(__name__)

meta: MetaSchema = {
    "id": "cc_snap",
    "name": "Snap",
    "title": "Install, configure and manage snapd and snap packages",
    "description": dedent(
        """\
        This module provides a simple configuration namespace in cloud-init to
        both setup snapd and install snaps.

        .. note::
            Both ``assertions`` and ``commands`` values can be either a
            dictionary or a list. If these configs are provided as a
            dictionary, the keys are only used to order the execution of the
            assertions or commands and the dictionary is merged with any
            vendor-data snap configuration provided. If a list is provided by
            the user instead of a dict, any vendor-data snap configuration is
            ignored.

        The ``assertions`` configuration option is a dictionary or list of
        properly-signed snap assertions which will run before any snap
        ``commands``. They will be added to snapd's assertion database by
        invoking ``snap ack <aggregate_assertion_file>``.

        Snap ``commands`` is a dictionary or list of individual snap
        commands to run on the target system. These commands can be used to
        create snap users, install snaps and provide snap configuration.

        .. note::
            If 'side-loading' private/unpublished snaps on an instance, it is
            best to create a snap seed directory and seed.yaml manifest in
            **/var/lib/snapd/seed/** which snapd automatically installs on
            startup.
        """
    ),
    "distros": distros,
    "examples": [
        dedent(
            """\
        snap:
            assertions:
              00: |
                signed_assertion_blob_here
              02: |
                signed_assertion_blob_here
            commands:
              00: snap create-user --sudoer --known <snap-user>@mydomain.com
              01: snap install canonical-livepatch
              02: canonical-livepatch enable <AUTH_TOKEN>
    """
        ),
        dedent(
            """\
        # Convenience: the snap command can be omitted when specifying commands
        # as a list and 'snap' will automatically be prepended.
        # The following commands are equivalent:
        snap:
          commands:
            00: ['install', 'vlc']
            01: ['snap', 'install', 'vlc']
            02: snap install vlc
            03: 'snap install vlc'
    """
        ),
        dedent(
            """\
        # You can use a list of commands
        snap:
          commands:
            - ['install', 'vlc']
            - ['snap', 'install', 'vlc']
            - snap install vlc
            - 'snap install vlc'
    """
        ),
        dedent(
            """\
        # You can use a list of assertions
        snap:
          assertions:
            - signed_assertion_blob_here
            - |
              signed_assertion_blob_here
    """
        ),
    ],
    "frequency": PER_INSTANCE,
    "activate_by_schema_keys": ["snap"],
}


__doc__ = get_meta_doc(meta)

SNAP_CMD = "snap"


def add_assertions(assertions, assertions_file):
    """Import list of assertions.

    Import assertions by concatenating each assertion into a
    string separated by a '\n'.  Write this string to a instance file and
    then invoke `snap ack /path/to/file` and check for errors.
    If snap exits 0, then all assertions are imported.
    """
    if not assertions:
        return
    LOG.debug("Importing user-provided snap assertions")
    if isinstance(assertions, dict):
        assertions = assertions.values()
    elif not isinstance(assertions, list):
        raise TypeError(
            "assertion parameter was not a list or dict: {assertions}".format(
                assertions=assertions
            )
        )

    snap_cmd = [SNAP_CMD, "ack", assertions_file]
    combined = "\n".join(assertions)

    for asrt in assertions:
        LOG.debug("Snap acking: %s", asrt.split("\n")[0:2])

    util.write_file(assertions_file, combined.encode("utf-8"))
    subp.subp(snap_cmd, capture=True)


def run_commands(commands):
    """Run the provided commands provided in snap:commands configuration.

    Commands are run individually. Any errors are collected and reported
    after attempting all commands.

    @param commands: A list or dict containing commands to run. Keys of a
        dict will be used to order the commands provided as dict values.
    """
    if not commands:
        return
    LOG.debug("Running user-provided snap commands")
    if isinstance(commands, dict):
        # Sort commands based on dictionary key
        commands = [v for _, v in sorted(commands.items())]
    elif not isinstance(commands, list):
        raise TypeError(
            "commands parameter was not a list or dict: {commands}".format(
                commands=commands
            )
        )

    fixed_snap_commands = prepend_base_command("snap", commands)

    cmd_failures = []
    for command in fixed_snap_commands:
        shell = isinstance(command, str)
        try:
            subp.subp(command, shell=shell, status_cb=sys.stderr.write)
        except subp.ProcessExecutionError as e:
            cmd_failures.append(str(e))
    if cmd_failures:
        msg = "Failures running snap commands:\n{cmd_failures}".format(
            cmd_failures=cmd_failures
        )
        util.logexc(LOG, msg)
        raise RuntimeError(msg)


def handle(name: str, cfg: Config, cloud: Cloud, args: list) -> None:
    cfgin = cfg.get("snap", {})
    if not cfgin:
        LOG.debug(
            "Skipping module named %s, no 'snap' key in configuration", name
        )
        return

    add_assertions(
        cfgin.get("assertions", []),
        os.path.join(cloud.paths.get_ipath_cur(), "snapd.assertions"),
    )
    run_commands(cfgin.get("commands", []))

Filemanager

Name Type Size Permission Actions
__pycache__ Folder 0755
schemas Folder 0755
__init__.py File 14 B 0644
cc_ansible.py File 8.69 KB 0644
cc_apk_configure.py File 5.66 KB 0644
cc_apt_configure.py File 41.99 KB 0644
cc_apt_pipelining.py File 2.71 KB 0644
cc_bootcmd.py File 2.85 KB 0644
cc_byobu.py File 3.65 KB 0644
cc_ca_certs.py File 9.13 KB 0644
cc_chef.py File 13.77 KB 0644
cc_disable_ec2_metadata.py File 2.03 KB 0644
cc_disk_setup.py File 32.36 KB 0644
cc_fan.py File 3.02 KB 0644
cc_final_message.py File 3.39 KB 0644
cc_growpart.py File 21.03 KB 0644
cc_grub_dpkg.py File 6.65 KB 0644
cc_install_hotplug.py File 3.81 KB 0644
cc_keyboard.py File 2.38 KB 0644
cc_keys_to_console.py File 3.61 KB 0644
cc_landscape.py File 5.31 KB 0644
cc_locale.py File 1.86 KB 0644
cc_lxd.py File 18.14 KB 0644
cc_mcollective.py File 6.1 KB 0644
cc_migrator.py File 3.49 KB 0644
cc_mounts.py File 19.71 KB 0644
cc_ntp.py File 20.69 KB 0644
cc_package_update_upgrade_install.py File 4.54 KB 0644
cc_phone_home.py File 5.48 KB 0644
cc_power_state_change.py File 7.41 KB 0644
cc_puppet.py File 14.1 KB 0644
cc_reset_rmc.py File 4.47 KB 0644
cc_resizefs.py File 10.73 KB 0644
cc_resolv_conf.py File 4.98 KB 0644
cc_rh_subscription.py File 16.97 KB 0644
cc_rightscale_userdata.py File 4.28 KB 0644
cc_rsyslog.py File 13.48 KB 0644
cc_runcmd.py File 2.9 KB 0644
cc_salt_minion.py File 5.88 KB 0644
cc_scripts_per_boot.py File 1.66 KB 0644
cc_scripts_per_instance.py File 1.81 KB 0644
cc_scripts_per_once.py File 1.76 KB 0644
cc_scripts_user.py File 1.85 KB 0644
cc_scripts_vendor.py File 2.29 KB 0644
cc_seed_random.py File 4.72 KB 0644
cc_set_hostname.py File 5.13 KB 0644
cc_set_passwords.py File 10.97 KB 0644
cc_snap.py File 6.3 KB 0644
cc_spacewalk.py File 3.43 KB 0644
cc_ssh.py File 14.86 KB 0644
cc_ssh_authkey_fingerprints.py File 4.22 KB 0644
cc_ssh_import_id.py File 6.12 KB 0644
cc_timezone.py File 1.46 KB 0644
cc_ubuntu_advantage.py File 17 KB 0644
cc_ubuntu_autoinstall.py File 4.5 KB 0644
cc_ubuntu_drivers.py File 4.56 KB 0644
cc_update_etc_hosts.py File 5.16 KB 0644
cc_update_hostname.py File 3.87 KB 0644
cc_users_groups.py File 8.57 KB 0644
cc_wireguard.py File 9.22 KB 0644
cc_write_files.py File 6.66 KB 0644
cc_write_files_deferred.py File 1.68 KB 0644
cc_yum_add_repo.py File 7.45 KB 0644
cc_zypper_add_repo.py File 6.59 KB 0644
modules.py File 11.74 KB 0644
schema.py File 54.85 KB 0644