3 \�me0 � @ s� U d Z ddlZddlZddlZddlmZ ddlmZmZ ddl m Z ddlmZ ddl mZmZ ddlmZ dd lmZ d gZeZeje�Zddd ed�eed�ed�ed�ed�gedgd�Zeee�Z dZdd� Zdd� Zeee edd�dd�ZdS )z<Snap: Install, configure and manage snapd and snap packages.� N)�dedent)�subp�util)�Cloud)�Config)� MetaSchema�get_meta_doc)�PER_INSTANCE)�prepend_base_commandZubuntuZcc_snapZSnapz5Install, configure and manage snapd and snap packagesah 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. ax 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> ay # 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' z� # You can use a list of commands snap: commands: - ['install', 'vlc'] - ['snap', 'install', 'vlc'] - snap install vlc - 'snap install vlc' z� # You can use a list of assertions snap: assertions: - signed_assertion_blob_here - | signed_assertion_blob_here �snap)�id�name�title�description�distrosZexamples� frequencyZactivate_by_schema_keysc C s� | sdS t jd� t| t�r&| j� } nt| t�s@tdj| d���td|g}dj | �}x&| D ]}t jd|j d�dd � � qZW tj||j d �� tj|dd� dS ) a Import list of assertions. Import assertions by concatenating each assertion into a string separated by a ' '. 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. Nz'Importing user-provided snap assertionsz8assertion parameter was not a list or dict: {assertions})� assertionsZack� zSnap acking: %sr � zutf-8T)Zcapture)�LOG�debug� isinstance�dict�values�list� TypeError�format�SNAP_CMD�join�splitr Z write_file�encoder )r Zassertions_fileZsnap_cmdZcombinedZasrt� r! �/usr/lib/python3.6/cc_snap.py�add_assertionsw s r# c C s� | sdS t jd� t| t�r4dd� t| j� �D �} nt| t�sNtdj| d���t d| �}g }xb|D ]Z}t|t �}ytj||tj jd� W qb tjk r� } z|jt |�� W Y dd}~X qbX qbW |r�d j|d �}tjt |� t|��dS )aH 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. Nz#Running user-provided snap commandsc S s g | ]\}}|�qS r! r! )�.0�_�vr! r! r"