Current File : //lib/python2.7/site-packages/cloudinit/config/cc_seed_random.pyo
�
oB�]c@s�dZddlZddlZddlmZddlmZddlm	Z	ddlm
Z
e	Zeje
�Zdd�Zdd�Zd	�ZdS(
s
Seed Random
-----------
**Summary:** provide random seed data

Since all cloud instances started from the same image will produce very similar
data when they are first booted, as they are all starting with the same seed
for the kernel's entropy keyring. To avoid this, random seed data can be
provided to the instance either as a string or by specifying a command to run
to generate the data.

Configuration for this module is under the ``random_seed`` config key. The
``file`` key specifies the path to write the data to, defaulting to
``/dev/urandom``. Data can be passed in directly with ``data``, and may
optionally be specified in encoded form, with the encoding specified in
``encoding``.

.. note::
    when using a multiline value for ``data`` or specifying binary data, be
    sure to follow yaml syntax and use the ``|`` and ``!binary`` yaml format
    specifiers when appropriate

Instead of specifying a data string, a command can be run to generate/collect
the data to be written. The command should be specified as a list of args in
the ``command`` key. If a command is specified that cannot be run, no error
will be reported unless ``command_required`` is set to true.

For example, to use ``pollinate`` to gather data from a
remote entropy server and write it to ``/dev/urandom``, the following could be
used::

    random_seed:
        file: /dev/urandom
        command: ["pollinate", "--server=http://local.polinate.server"]
        command_required: true

**Internal name:** ``cc_seed_random``

**Module frequency:** per instance

**Supported distros:** all

**Config keys**::

    random_seed:
        file: <file>
        data: <random string>
        encoding: <raw/base64/b64/gzip/gz>
        command: [<cmd name>, <arg1>, <arg2>...]
        command_required: <true/false>
i����N(tBytesIO(tlog(tPER_INSTANCE(tutilcCs�|s
dS|s#|j�d
kr0tj|�S|j�dkrOtj|�S|j�dkrztj|dtdd�Std	|��dS(
Nttrawtbase64tb64tgziptgztquiettdecodes Unknown random_seed encoding: %s(R(sbase64R(RR	(	tlowerRtencode_textRt	b64decodetdecomp_gziptFalsetNonetIOError(tdatatencoding((sC/usr/lib/python2.7/site-packages/cloudinit/config/cc_seed_random.pyt_decodeKs

cCs�|r|rtd��n|s3tjd�dS|d}tj|�s�|rmtdjd|���q�tjd|�dSntj|d|dt�dS(	Ns"no command found but required=truesno command providedis+command '{cmd}' not found but required=truetcmds'command '%s' not found for seed_commandtenvtcapture(t
ValueErrortLOGtdebugRtwhichtformattsubpR(tcommandtrequiredRR((sC/usr/lib/python2.7/site-packages/cloudinit/config/cc_seed_random.pythandle_random_seed_commandXs


cCsy|jdi�}|jdd�}|jdd�}t�}|rj|jt|d|jd���n|jj}	|	r�d|	kr�|jtj|	d��n|j�}t	|�r�|j
d|t	|�|�tj||�n|jdd�}
|jd	t
�}y6tjj�}||d
<td|
d|d|�Wn,tk
rt}
|jd
|
|
�|
�nXdS(Ntrandom_seedtfiles/dev/urandomRRRs0%s: adding %s bytes of random seed entropy to %sRtcommand_requiredtRANDOM_SEED_FILER Rs'handling random command [%s] failed: %s(tgetRtwriteRt
datasourcetmetadataRR
tgetvaluetlenRtappend_fileRRtostenvirontcopyR!Rtwarning(tnametcfgtcloudRt_argstmycfgt	seed_patht	seed_datatseed_bufR)RtreqRte((sC/usr/lib/python2.7/site-packages/cloudinit/config/cc_seed_random.pythandlejs.	%
(t__doc__RR-tsixRt	cloudinitRtloggingtcloudinit.settingsRRt	frequencyt	getLoggert__name__RRRR!R;(((sC/usr/lib/python2.7/site-packages/cloudinit/config/cc_seed_random.pyt<module><s