HEX
Server: nginx/1.22.0
System: Linux iZuf6jdxbygmf6cco977lcZ 5.10.84-10.4.al8.x86_64 #1 SMP Tue Apr 12 12:31:07 CST 2022 x86_64
User: root (0)
PHP: 7.4.29
Disabled: passthru,exec,system,chroot,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_restore,dl,readlink,symlink,popepassthru,stream_socket_server,fsocket,popen
Upload Files
File: //lib/python3.6/site-packages/cloudinit/sources/DataSourceAliYun.py
# This file is part of cloud-init. See LICENSE file for license information.

from cloudinit import sources
from cloudinit.sources import DataSourceEc2 as EC2
from cloudinit.distros.aliyun import ImageType
from cloudinit import util
from cloudinit.event import EventType
from cloudinit import log as logging

LOG = logging.getLogger(__name__)

ALIYUN_PRODUCT = "Alibaba Cloud ECS"


class DataSourceAliYun(EC2.DataSourceEc2):

    dsname = 'AliYun'
    metadata_urls = ['http://100.100.100.200']

    # The minimum supported metadata_version from the ec2 metadata apis
    min_metadata_version = '2016-01-01'
    extended_metadata_versions = []
    version_url_suffix = '/cloudinit/version'
    report_url_suffix = '/cloudinit/report'

    def get_ntp_conf(self):
        if not self.metadata:
            return {}
        return self.metadata.get('ntp-conf')

    def get_source_address(self):
        if not self.metadata or not self.metadata.get('source-address'):
            return []
        source_address = self.metadata.get('source-address')
        if isinstance(source_address, str):
            source_address = [source_address]
        return source_address

    @property
    def version_url(self):
        return self.metadata_address + self.version_url_suffix

    @property
    def report_url(self):
        return self.metadata_address + self.report_url_suffix

    def __init__(self, sys_cfg, distro, paths):
        super(DataSourceAliYun, self).__init__(sys_cfg, distro, paths)
        self.update_events['network'].add(EventType.BOOT)

    def get_hostname(self, fqdn=False, resolve_ip=False, metadata_only=False):
        return self.metadata.get('hostname', 'localhost.localdomain')

    def get_public_ssh_keys(self):
        return parse_public_keys(self.metadata.get('public-keys', {}))

    # ebmhfg5.2xlarge / ebmhfg4.4xlarge this instance type product name not Alibaba Cloud ECS
    #def _get_cloud_name(self):
    #    if _is_aliyun():
    #        return EC2.CloudNames.ALIYUN
    #    else:
    #        return EC2.CloudNames.NO_EC2_METADATA

    def _get_cloud_name(self):
        return EC2.CloudNames.ALIYUN


def _is_aliyun():
    return util.read_dmi_data('system-product-name') == ALIYUN_PRODUCT


def parse_public_keys(public_keys):
    keys = []
    for _key_id, key_body in public_keys.items():
        if isinstance(key_body, str):
            keys.append(key_body.strip())
        elif isinstance(key_body, list):
            keys.extend(key_body)
        elif isinstance(key_body, dict):
            key = key_body.get('openssh-key', [])
            if isinstance(key, str):
                keys.append(key.strip())
            elif isinstance(key, list):
                keys.extend(key)
    return keys


class DataSourceAliYun2Local(DataSourceAliYun):
    """Datasource run at init-local which sets up network to query metadata.

    In init-local, no network is available. This subclass sets up minimal
    networking with dhclient on a viable nic so that it can talk to the
    metadata service. If the metadata service provides network configuration
    then render the network configuration for that instance based on metadata.
    """
    perform_dhcp_setup = True

    def get_data(self):
        if self.distro.cname == "aliyunlinux" and self.distro.get_image_type() == ImageType.IMAGE_QBOOT:
            self.perform_dhcp_setup = False  # Use dhcp before querying metadata

        if self.distro == "aliyun" :
            return False

        supported_platforms = (EC2.CloudNames.ALIYUN,)
        if self.cloud_name not in supported_platforms:
            LOG.debug("Local AliYun mode only supported on %s, not %s",
                      supported_platforms, self.cloud_name)
            return False
        return super(DataSourceAliYun2Local, self).get_data()


# Used to match classes to dependencies
datasources = [
    (DataSourceAliYun2Local, (sources.DEP_FILESYSTEM,)),  # Run at init-local
    (DataSourceAliYun, (sources.DEP_FILESYSTEM, sources.DEP_NETWORK)),
]


# Return a list of data sources that match this set of dependencies
def get_datasource_list(depends):
    return sources.list_from_depends(depends, datasources)

# vi: ts=4 expandtab