/usr/lib/python2.7/dist-packages/maasserver/compose_preseed.py is in python-django-maas 1.5+bzr2252-0ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | # Copyright 2012 Canonical Ltd. This software is licensed under the
# GNU Affero General Public License version 3 (see the file LICENSE).
"""Low-level composition code for preseeds."""
from __future__ import (
absolute_import,
print_function,
unicode_literals,
)
str = None
__metaclass__ = type
__all__ = [
'compose_preseed',
]
from urllib import urlencode
from maasserver.enum import NODE_STATUS
from maasserver.utils import absolute_reverse
import yaml
def compose_cloud_init_preseed(token, base_url=''):
"""Compose the preseed value for a node in any state but Commissioning."""
credentials = urlencode({
'oauth_consumer_key': token.consumer.key,
'oauth_token_key': token.key,
'oauth_token_secret': token.secret,
})
local_config_yaml = yaml.safe_dump({
"manage_etc_hosts": "localhost",
"apt_preserve_sources_list": True,
})
# this is debconf escaping
local_config = local_config_yaml.replace("\\", "\\\\").replace("\n", "\\n")
# Preseed data to send to cloud-init. We set this as MAAS_PRESEED in
# ks_meta, and it gets fed straight into debconf.
preseed_items = [
('datasources', 'multiselect', 'MAAS'),
('maas-metadata-url', 'string', absolute_reverse(
'metadata', base_url=base_url)),
('maas-metadata-credentials', 'string', credentials),
('local-cloud-config', 'string', local_config)
]
return '\n'.join(
"cloud-init cloud-init/%s %s %s" % (
item_name,
item_type,
item_value,
)
for item_name, item_type, item_value in preseed_items)
def compose_commissioning_preseed(token, base_url=''):
"""Compose the preseed value for a Commissioning node."""
metadata_url = absolute_reverse('metadata', base_url=base_url)
return _compose_cloud_init_preseed(token, metadata_url)
def compose_curtin_preseed(token, base_url=''):
"""Compose the preseed value for a node being installed with curtin."""
metadata_url = absolute_reverse('curtin-metadata', base_url=base_url)
return _compose_cloud_init_preseed(token, metadata_url)
def _compose_cloud_init_preseed(token, metadata_url):
return "#cloud-config\n%s" % yaml.safe_dump({
'datasource': {
'MAAS': {
'metadata_url': metadata_url,
'consumer_key': token.consumer.key,
'token_key': token.key,
'token_secret': token.secret,
}
}
})
def compose_preseed(node):
"""Put together preseed data for `node`.
This produces preseed data in different formats depending on the node's
state: if it's Commissioning, it boots into commissioning mode with its
own profile, its own user_data, and also its own preseed format. It's
basically a network boot.
Otherwise, it will get a different format that feeds directly into the
installer.
:param node: The node to compose preseed data for.
:type node: Node
:return: Preseed data containing the information the node needs in order
to access the metadata service: its URL and auth token.
"""
# Circular import.
from metadataserver.models import NodeKey
token = NodeKey.objects.get_token_for_node(node)
base_url = node.nodegroup.maas_url
if node.status == NODE_STATUS.COMMISSIONING:
return compose_commissioning_preseed(token, base_url)
else:
if node.should_use_traditional_installer():
return compose_cloud_init_preseed(token, base_url)
else:
return compose_curtin_preseed(token, base_url)
|