Submit
Path:
~
/
/
lib
/
python2.7
/
site-packages
/
cloudinit
/
config
/
File Content:
cc_snap.py
# 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 sys from textwrap import dedent from cloudinit import log as logging from cloudinit.config.schema import ( get_schema_doc, validate_cloudconfig_schema) from cloudinit.settings import PER_INSTANCE from cloudinit.subp import prepend_base_command from cloudinit import util distros = ['ubuntu'] frequency = PER_INSTANCE LOG = logging.getLogger(__name__) schema = { '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. **Development only**: The ``squashfuse_in_container`` boolean can be set true to install squashfuse package when in a container to enable snap installs. Default is false. """), '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("""\ # LXC-based containers require squashfuse before snaps can be installed snap: commands: 00: apt-get install squashfuse -y 11: snap install emoj """), 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' """)], 'frequency': PER_INSTANCE, 'type': 'object', 'properties': { 'snap': { 'type': 'object', 'properties': { 'assertions': { 'type': ['object', 'array'], # Array of strings or dict 'items': {'type': 'string'}, 'additionalItems': False, # Reject items non-string 'minItems': 1, 'minProperties': 1, 'uniqueItems': True }, 'commands': { 'type': ['object', 'array'], # Array of strings or dict 'items': { 'oneOf': [ {'type': 'array', 'items': {'type': 'string'}}, {'type': 'string'}] }, 'additionalItems': False, # Reject non-string & non-list 'minItems': 1, 'minProperties': 1, }, 'squashfuse_in_container': { 'type': 'boolean' } }, 'additionalProperties': False, # Reject keys not in schema 'required': [], 'minProperties': 1 } } } # TODO schema for 'assertions' and 'commands' are too permissive at the moment. # Once python-jsonschema supports schema draft 6 add support for arbitrary # object keys with 'patternProperties' constraint to validate string values. __doc__ = get_schema_doc(schema) # Supplement python help() SNAP_CMD = "snap" ASSERTIONS_FILE = "/var/lib/cloud/instance/snapd.assertions" def add_assertions(assertions): """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'] 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')) util.subp(snap_cmd + [ASSERTIONS_FILE], 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: util.subp(command, shell=shell, status_cb=sys.stderr.write) except util.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) # RELEASE_BLOCKER: Once LP: #1628289 is released on xenial, drop this function. def maybe_install_squashfuse(cloud): """Install squashfuse if we are in a container.""" if not util.is_container(): return try: cloud.distro.update_package_sources() except Exception: util.logexc(LOG, "Package update failed") raise try: cloud.distro.install_packages(['squashfuse']) except Exception: util.logexc(LOG, "Failed to install squashfuse") raise def handle(name, cfg, cloud, log, args): cfgin = cfg.get('snap', {}) if not cfgin: LOG.debug(("Skipping module named %s," " no 'snap' key in configuration"), name) return validate_cloudconfig_schema(cfg, schema) if util.is_true(cfgin.get('squashfuse_in_container', False)): maybe_install_squashfuse(cloud) add_assertions(cfgin.get('assertions', [])) run_commands(cfgin.get('commands', [])) # vi: ts=4 expandtab
Submit
FILE
FOLDER
Name
Size
Permission
Action
__init__.py
1437 bytes
0644
__init__.pyc
1337 bytes
0644
__init__.pyo
1337 bytes
0644
cc_apt_configure.py
33591 bytes
0644
cc_apt_configure.pyc
30924 bytes
0644
cc_apt_configure.pyo
30924 bytes
0644
cc_apt_pipelining.py
2495 bytes
0644
cc_apt_pipelining.pyc
2540 bytes
0644
cc_apt_pipelining.pyo
2540 bytes
0644
cc_bootcmd.py
3588 bytes
0644
cc_bootcmd.pyc
3088 bytes
0644
cc_bootcmd.pyo
3088 bytes
0644
cc_byobu.py
3173 bytes
0644
cc_byobu.pyc
3160 bytes
0644
cc_byobu.pyo
3160 bytes
0644
cc_ca_certs.py
4190 bytes
0644
cc_ca_certs.pyc
4199 bytes
0644
cc_ca_certs.pyo
4199 bytes
0644
cc_chef.py
13490 bytes
0644
cc_chef.pyc
11045 bytes
0644
cc_chef.pyo
11045 bytes
0644
cc_debug.py
3151 bytes
0644
cc_debug.pyc
3428 bytes
0644
cc_debug.pyo
3428 bytes
0644
cc_disable_ec2_metadata.py
1602 bytes
0644
cc_disable_ec2_metadata.pyc
1603 bytes
0644
cc_disable_ec2_metadata.pyo
1603 bytes
0644
cc_disk_setup.py
33590 bytes
0644
cc_disk_setup.pyc
29606 bytes
0644
cc_disk_setup.pyo
29606 bytes
0644
cc_emit_upstart.py
2050 bytes
0644
cc_emit_upstart.pyc
2197 bytes
0644
cc_emit_upstart.pyo
2197 bytes
0644
cc_fan.py
2893 bytes
0644
cc_fan.pyc
3167 bytes
0644
cc_fan.pyo
3167 bytes
0644
cc_final_message.py
2406 bytes
0644
cc_final_message.pyc
2449 bytes
0644
cc_final_message.pyo
2449 bytes
0644
cc_foo.py
2116 bytes
0644
cc_foo.pyc
702 bytes
0644
cc_foo.pyo
702 bytes
0644
cc_growpart.py
11788 bytes
0644
cc_growpart.pyc
11389 bytes
0644
cc_growpart.pyo
11389 bytes
0644
cc_grub_dpkg.py
2940 bytes
0644
cc_grub_dpkg.pyc
2698 bytes
0644
cc_grub_dpkg.pyo
2698 bytes
0644
cc_keys_to_console.py
2417 bytes
0644
cc_keys_to_console.pyc
2449 bytes
0644
cc_keys_to_console.pyo
2449 bytes
0644
cc_landscape.py
4028 bytes
0644
cc_landscape.pyc
4113 bytes
0644
cc_landscape.pyo
4113 bytes
0644
cc_locale.py
1187 bytes
0644
cc_locale.pyc
1189 bytes
0644
cc_locale.pyo
1189 bytes
0644
cc_lxd.py
10521 bytes
0644
cc_lxd.pyc
8531 bytes
0644
cc_lxd.pyo
8531 bytes
0644
cc_mcollective.py
5204 bytes
0644
cc_mcollective.pyc
3891 bytes
0644
cc_mcollective.pyo
3891 bytes
0644
cc_migrator.py
3148 bytes
0644
cc_migrator.pyc
3256 bytes
0644
cc_migrator.pyo
3256 bytes
0644
cc_mounts.py
17653 bytes
0644
cc_mounts.pyc
14941 bytes
0644
cc_mounts.pyo
14941 bytes
0644
cc_ntp.py
20695 bytes
0644
cc_ntp.pyc
16136 bytes
0644
cc_ntp.pyo
16136 bytes
0644
cc_package_update_upgrade_install.py
4208 bytes
0644
cc_package_update_upgrade_install.pyc
4107 bytes
0644
cc_package_update_upgrade_install.pyo
4107 bytes
0644
cc_phone_home.py
4013 bytes
0644
cc_phone_home.pyc
3360 bytes
0644
cc_phone_home.pyo
3360 bytes
0644
cc_power_state_change.py
7838 bytes
0644
cc_power_state_change.pyc
7983 bytes
0644
cc_power_state_change.pyo
7983 bytes
0644
cc_puppet.py
9070 bytes
0644
cc_puppet.pyc
7231 bytes
0644
cc_puppet.pyo
7231 bytes
0644
cc_resizefs.py
11047 bytes
0644
cc_resizefs.pyc
9368 bytes
0644
cc_resizefs.pyo
9368 bytes
0644
cc_resolv_conf.py
3509 bytes
0644
cc_resolv_conf.pyc
3522 bytes
0644
cc_resolv_conf.pyo
3522 bytes
0644
cc_rh_subscription.py
16029 bytes
0644
cc_rh_subscription.pyc
13826 bytes
0644
cc_rh_subscription.pyo
13826 bytes
0644
cc_rightscale_userdata.py
3849 bytes
0644
cc_rightscale_userdata.pyc
2886 bytes
0644
cc_rightscale_userdata.pyo
2886 bytes
0644
cc_rsyslog.py
14435 bytes
0644
cc_rsyslog.pyc
10810 bytes
0644
cc_rsyslog.pyo
10810 bytes
0644
cc_runcmd.py
3185 bytes
0644
cc_runcmd.pyc
2797 bytes
0644
cc_runcmd.pyo
2797 bytes
0644
cc_salt_minion.py
4776 bytes
0644
cc_salt_minion.pyc
3870 bytes
0644
cc_salt_minion.pyo
3870 bytes
0644
cc_scripts_per_boot.py
1232 bytes
0644
cc_scripts_per_boot.pyc
1231 bytes
0644
cc_scripts_per_boot.pyo
1231 bytes
0644
cc_scripts_per_instance.py
1408 bytes
0644
cc_scripts_per_instance.pyc
1413 bytes
0644
cc_scripts_per_instance.pyo
1413 bytes
0644
cc_scripts_per_once.py
1337 bytes
0644
cc_scripts_per_once.pyc
1338 bytes
0644
cc_scripts_per_once.pyo
1338 bytes
0644
cc_scripts_user.py
1456 bytes
0644
cc_scripts_user.pyc
1418 bytes
0644
cc_scripts_user.pyo
1418 bytes
0644
cc_scripts_vendor.py
1418 bytes
0644
cc_scripts_vendor.pyc
1500 bytes
0644
cc_scripts_vendor.pyo
1500 bytes
0644
cc_seed_random.py
4494 bytes
0644
cc_seed_random.pyc
4642 bytes
0644
cc_seed_random.pyo
4642 bytes
0644
cc_set_hostname.py
3022 bytes
0644
cc_set_hostname.pyc
2786 bytes
0644
cc_set_hostname.pyo
2786 bytes
0644
cc_set_passwords.py
8656 bytes
0644
cc_set_passwords.pyc
7800 bytes
0644
cc_set_passwords.pyo
7800 bytes
0644
cc_snap.py
8301 bytes
0644
cc_snap.pyc
7719 bytes
0644
cc_snap.pyo
7719 bytes
0644
cc_snap_config.py
5500 bytes
0644
cc_snap_config.pyc
5150 bytes
0644
cc_snap_config.pyo
5150 bytes
0644
cc_snappy.py
9927 bytes
0644
cc_snappy.pyc
9488 bytes
0644
cc_snappy.pyo
9488 bytes
0644
cc_spacewalk.py
2957 bytes
0644
cc_spacewalk.pyc
2982 bytes
0644
cc_spacewalk.pyo
2982 bytes
0644
cc_ssh.py
10842 bytes
0644
cc_ssh.pyc
9325 bytes
0644
cc_ssh.pyo
9325 bytes
0644
cc_ssh_authkey_fingerprints.py
3513 bytes
0644
cc_ssh_authkey_fingerprints.pyc
4038 bytes
0644
cc_ssh_authkey_fingerprints.pyo
4038 bytes
0644
cc_ssh_import_id.py
2951 bytes
0644
cc_ssh_import_id.pyc
2781 bytes
0644
cc_ssh_import_id.pyo
2781 bytes
0644
cc_timezone.py
1175 bytes
0644
cc_timezone.pyc
1175 bytes
0644
cc_timezone.pyo
1175 bytes
0644
cc_ubuntu_advantage.py
6227 bytes
0644
cc_ubuntu_advantage.pyc
6263 bytes
0644
cc_ubuntu_advantage.pyo
6263 bytes
0644
cc_ubuntu_drivers.py
5800 bytes
0644
cc_ubuntu_drivers.pyc
4745 bytes
0644
cc_ubuntu_drivers.pyo
4745 bytes
0644
cc_update_etc_hosts.py
3414 bytes
0644
cc_update_etc_hosts.pyc
3063 bytes
0644
cc_update_etc_hosts.pyo
3063 bytes
0644
cc_update_hostname.py
1617 bytes
0644
cc_update_hostname.pyc
1704 bytes
0644
cc_update_hostname.pyo
1704 bytes
0644
cc_users_groups.py
7225 bytes
0644
cc_users_groups.pyc
6922 bytes
0644
cc_users_groups.pyo
6922 bytes
0644
cc_write_files.py
5069 bytes
0644
cc_write_files.pyc
5255 bytes
0644
cc_write_files.pyo
5255 bytes
0644
cc_yum_add_repo.py
4403 bytes
0644
cc_yum_add_repo.pyc
4008 bytes
0644
cc_yum_add_repo.pyo
4008 bytes
0644
cc_zypper_add_repo.py
7799 bytes
0644
cc_zypper_add_repo.pyc
7295 bytes
0644
cc_zypper_add_repo.pyo
7295 bytes
0644
schema.py
14401 bytes
0644
schema.pyc
14163 bytes
0644
schema.pyo
14163 bytes
0644
N4ST4R_ID | Naxtarrr