HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux WebLive 5.15.0-79-generic #86-Ubuntu SMP Mon Jul 10 16:07:21 UTC 2023 x86_64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: //usr/local/qcloud/monitor/barad/plugin/collector/vm/cloud_init.py
#!/usr/bin/env python
#-*- coding:utf-8 -*-

import sys
import os, time
sys.path.append(os.getcwd() + '/../../../comm/')
import constant
from cutils import CommUtils
from plugin_base import VmBaseCollector
from utils.metric_handler import MetricHandler


class CloudinitCollect(object):
    SR_0_PATH = "/dev/sr0"
    CLOUD_CONFIG_PATH = "/etc/cloud/cloud.cfg"

    @staticmethod
    def get_system_manager():
        cmd = "ps -p1 | grep \"init\|upstart\|systemd\" | awk '{print $4}'"
        return CommUtils.ExecuteTimeoutCommand(cmd, 3).strip()

    @staticmethod
    def get_cloud_init_exec_path_from_system_ctl():
        cmd = "systemctl show cloud-init-local.service -p ExecStart | grep cloud-init"

        r = CommUtils.ExecuteTimeoutCommand(cmd, 3).strip()
        try:
            return r.split("path=")[1].split(";")[0].strip()
        except Exception as e:  # noqa
            return ''

    @staticmethod
    def check_sr0():
        return os.path.exists(CloudinitCollect.SR_0_PATH)

    @staticmethod
    def check_config_exists():
        return os.path.exists(CloudinitCollect.CLOUD_CONFIG_PATH)

    @staticmethod
    def check_config_source():
        with open(CloudinitCollect.CLOUD_CONFIG_PATH) as f:
            for content in f.readlines():
                tmp = content.split(":")
                if tmp[0] == 'datasource_list' and 'ConfigDrive' in tmp[1]:
                    return True

        return False

    @staticmethod
    def check_cloud_init():
        system_manager = CloudinitCollect.get_system_manager()

        if system_manager == 'systemd':
            cloud_init_bin_path = CloudinitCollect.get_cloud_init_exec_path_from_system_ctl()
        elif system_manager == 'init':
            # use system path
            cloud_init_bin_path = 'cloud-init'
        else:
            cloud_init_bin_path = ''

        if not cloud_init_bin_path:
            # not found cloud-init, maybe we don't konw this case yet, just
            # treat it as works fine
            return True

        # Notes(eliqiao): cloud-init --version will print version to stderr
        cmd = "%s -h" % cloud_init_bin_path
        res = CommUtils.ExecuteTimeoutCommand(cmd, 3)
        if not res:
            return False
        return True

    def Cloudinit(self):
        if not self.check_sr0():
            return -1

        if not self.check_config_exists():
            return 1

        if not self.check_config_source():
            return 2

        if not self.check_cloud_init():
            return 3

        return 100


class CloudinitCollector(VmBaseCollector):
    def init(self):
        self.set_frequency(86400)
        self.collector = CloudinitCollect()
        self.handler = MetricHandler()
        self.handler.namespace = 'qce/cvm'
        self.handler.dimensions = ['vm_uuid', 'vmip']

    def do_collect(self):
        now = int(time.time())
        cld_available = self.collector.Cloudinit()

        vm_uuid = self.get_vm_uuid()
        vmip = self.get_vmip()

        dimensions = {'vm_uuid': vm_uuid, 'vmip': vmip}

        batch_metric = [
            {'name': 'CloudinitAvailable', 'value': cld_available},
        ]
        self.handler.add_batch_metric(
            batch=batch_metric, dimensions=dimensions, timestamp=now)

        if (len(self.handler.get_metrics()) > 0):
            data = {'sender': 'nws_sender',
                    'datas': self.handler.pop_metrics()}
            self.put_data(data)


def main():
    collector = CloudinitCollector()
    collector.init()
    collector.collect()
    collector.dump_data()


if __name__ == '__main__':
    main()