diff -rupN cloud-init-0.7.9/cloudinit/sources/DataSourceVmxGuestinfo.py cloud-init-0.7.9-new/cloudinit/sources/DataSourceVmxGuestinfo.py --- cloud-init-0.7.9/cloudinit/sources/DataSourceVmxGuestinfo.py 1969-12-31 16:00:00.000000000 -0800 +++ cloud-init-0.7.9-new/cloudinit/sources/DataSourceVmxGuestinfo.py 2017-05-08 07:47:27.388662680 -0700 @@ -0,0 +1,145 @@ +# vi: ts=4 expandtab +# +# Copyright (C) 2017 VMware Inc. +# +# Author: Anish Swaminathan <anishs@vmware.com> +# +import os +import base64 + +from cloudinit import log as logging +from cloudinit import sources +from cloudinit import util + +from distutils.spawn import find_executable + +LOG = logging.getLogger(__name__) + +class DataSourceVmxGuestinfo(sources.DataSource): + def __init__(self, sys_cfg, distro, paths, ud_proc=None): + sources.DataSource.__init__(self, sys_cfg, distro, paths, ud_proc) + self.metadata = {} + self.userdata_raw = '' + self.vmtoolsd = find_executable("vmtoolsd") + if not self.vmtoolsd: + LOG.error("Failed to find vmtoolsd") + + def get_data(self): + if not self.vmtoolsd: + LOG.error("vmtoolsd is required to fetch guestinfo value") + return False + hostname = self._get_guestinfo_value('hostname') + if hostname: + self.distro.set_hostname(hostname) + ud = self._get_guestinfo_value('userdata') + if ud: + LOG.debug("Decoding base64 format guestinfo.userdata") + self.userdata_raw = base64.b64decode(ud) + found = True + dev_index = 0 + network_settings = '' + while found: + key_begin = 'interface.' + str(dev_index) + key_iname = key_begin + '.name' + interface_name = self._get_guestinfo_value(key_iname) + if interface_name: + network_settings += 'auto ' + interface_name + '\n' + network_settings += 'iface ' + interface_name + key_proto = key_begin + '.dhcp' + dhcp_enabled = self._get_guestinfo_value(key_proto) + key_address = key_begin + '.address' + address = self._get_guestinfo_value(key_address) + bootproto = 'dhcp' + if dhcp_enabled: + if dhcp_enabled == 'yes': + network_settings += ' dhcp\n' + elif dhcp_enabled == 'no': + network_settings += ' static\n' + bootproto = 'static' + else: + LOG.warning("Invalid value for yes/no parameter for %s, setting to dhcp", key_proto) + elif address: + bootproto = 'static' + dhcp_enabled == 'no' + network_settings += ' static\n' + else: + dhcp_enabled == 'yes' + network_settings += ' dhcp\n' + LOG.debug("Setting network bootproto to dhcp by default") + key_mac = key_begin + '.mac' + mac = self._get_guestinfo_value(key_mac) + if address: + network_settings += 'address ' + address + '\n' + if mac: + network_settings += 'hwaddress ' + mac + '\n' + key_netmask = key_begin + '.netmask' + netmask = self._get_guestinfo_value(key_netmask) + if netmask: + network_settings += 'netmask ' + netmask + '\n' + key_dnsserver = 'dns.servers' + dnsserver = self._get_guestinfo_value(key_dnsserver) + if dnsserver: + network_settings += 'dns-nameservers ' + dnsserver = dnsserver.split(',') + for d in dnsserver: + network_settings += d + ' ' + network_settings += '\n' + key_dnsdomain = 'dns.domains' + dnsdomain = self._get_guestinfo_value(key_dnsdomain) + if dnsdomain: + network_settings += 'dns-search ' + dnsdomain = dnsdomain.split(',') + for d in dnsdomain: + network_settings += d + ' ' + network_settings += '\n' + route_index = 0 + default_destination_set = False + while True: + key_route = key_begin + '.route.' + str(route_index) + route = self._get_guestinfo_value(key_route) + if route: + network_settings += "routes.%s " % (route_index) + route = route.split(',') + if len(route) > 2: + LOG.debug("Route information for %s route in %s device incorrect - ", + "expected 2 values", route_index, dev_index) + continue + elif len(route) == 2: + network_settings += route[0] + ' ' + route[1] + '\n'# Gateway Destination + else: #length = 1 + if not default_destination_set: + network_settings += route[0] + ' 0.0.0.0/0' + '\n' + default_destination_set = True + else: + LOG.debug("Default destination set previously, not setting route %s", route_index) + else: + break + route_index += 1 + else: + found = False + dev_index += 1 + self.distro.apply_network(network_settings, False) + return True + + def _get_guestinfo_value(self, key): + LOG.debug("Getting guestinfo value for key %s", key) + value = '' + try: + (value, _err) = util.subp([self.vmtoolsd, "--cmd", "info-get guestinfo." + key]) + if _err: + LOG.error("Failed to get guestinfo value for key %s", key) + except util.ProcessExecutionError as error: + util.logexc(LOG,"Failed to get guestinfo value for key %s: %s", key, error) + except Exception: + util.logexc(LOG,"Unexpected error while trying to get guestinfo value for key %s", key) + return value.rstrip() + + def get_instance_id(self): + with open('/sys/class/dmi/id/product_uuid', 'r') as id_file: + return str(id_file.read()).rstrip() + +def get_datasource_list(depends): + """ + Return a list of data sources that match this set of dependencies + """ + return [DataSourceVmxGuestinfo]