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/versioninfo.py
# -*- coding: UTF-8 -*-
import sys
import os,time
sys.path.append(os.getcwd() + '/../../../comm/')
sys.path.append(os.getcwd() + '/../utils/')
import constant
from plugin_base import VmBaseCollector



class VersionInfoCollector(VmBaseCollector):
    def init(self):
        self.set_frequency(60)
        self.last_time = 0
        self.uuid= self.get_vm_uuid()
        self.barad_version = self.get_barad_version()
        self.region = self.get_vm_region()
        self.report_time = 7*24*60*60

    def get_os_name(self):
        try:
            # 尝试读取标准系统文件
            with open("/etc/os-release") as f:
                for line in f:
                    if line.startswith("PRETTY_NAME="):
                        return line.split("=", 1)[1].strip().strip('"')
        except IOError:
            # 尝试读取/etc/*-release文件
            try:
                release_files = [f for f in os.listdir('/etc') if f.endswith('-release')]
                for file in release_files:
                    with open(os.path.join('/etc', file)) as f:
                        content = f.read().strip()
                        if content:
                            return content.split('\n')[0]
            except IOError:
                return "Unknown"
        return "Unknown"
    
    def get_kernel_version(self):
        try:
            with open("/proc/version", "r") as file:
                version_info = file.read().strip()
                parts = version_info.split()
                kernel_version = parts[2]
                return kernel_version
        except Exception:
            self.logger().error("get kernel_version failed!  /proc/version not found")
            return "Unknown"

    def do_collect(self):
        #重启上报 或者 每周上报一次
        now = int(time.time())
        if now - self.last_time < self.report_time:
            return
               
        kernel_version = self.get_kernel_version()
        os_version = self.get_os_name()
        current_time = time.strftime("%Y-%m-%d %H:%M:%S")

        if not self.region:
            self.logger().error("get region is None!")
            return

        # 构造上报数据
        data = {
            "region": self.region,
            "data": {
                "meta": {
                    "namespace": "qce/cvm",
                    "domain": "version_info"
                },
                "values": [
                    {
                        "uuid": self.uuid,
                        "kernel_version": kernel_version,
                        "os_version": os_version,
                        "barad_version": self.barad_version,
                        "reported_at": current_time,
                        "__region__": self.region
                    }
                ]
            }
        }

        datas = {'sender':'versioninfo_sender', 'datas': data}
        self.put_data(datas)
        self.last_time = now


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

if __name__ == '__main__':
    main()