zabbix监控vmware的数据结构、业务逻辑和最简单原型代码

 

一、数据结构:

 

二、业务逻辑

什么时候什么条件下更新?
    zbx_vmware_init的时候初始化了zbx_vmware_t的实例vmware和其唯一的属性vector services

    zbx_vmware_loop处理vmware->services列表中的service,间隔5s
        如果service的now-lastaccess > 1天
            从services中删除该service
        如果service的now-lastcheck >= vmware更新间隔
            标记state为更新

        如果state为更新则调用vmware_service_update来更新

vmware->services的内容怎么来的呢?
    checks_simple_vmware.c中get_vmware_service调用vmware.c中的zbx_vmware_get_service
    从vmware->services中查找url,username和password相同的,如果已经有数据则返回,没有数据则返回null
    如果vmware->services中没有,则添加

 

更新时是先填充一个data,然后将原先的释放,然后指向这个data

 

三、最简单原型代码

编译: gcc simple.c -lcurl

#include <curl/curl.h>

typedef struct
{
        char    *data;
        size_t  alloc;
        size_t  offset;
}
ZBX_HTTPPAGE;

static ZBX_HTTPPAGE     page;

#define zbx_malloc(old, size)           zbx_malloc2(__FILE__, __LINE__, old, size)
#define zbx_realloc(src, size)          zbx_realloc2(__FILE__, __LINE__, src, size)

#define ZBX_XML_HEADER1         "Soapaction:urn:vim25/4.1"
#define ZBX_XML_HEADER2         "Content-Type:text/xml; charset=utf-8"

void    *zbx_malloc2(const char *filename, int line, void *old, size_t size)
{
        int     max_attempts;
        void    *ptr = NULL;

        /* old pointer must be NULL */
        if (NULL != old)
        {
        }

        for (
                max_attempts = 10, size = size;
                0 < max_attempts && NULL == ptr;
                ptr = malloc(size), max_attempts--
        );

	if (NULL != ptr)
                return ptr;

        exit(-1);
}

void    *zbx_realloc2(const char *filename, int line, void *old, size_t size)
{
        int     max_attempts;
        void    *ptr = NULL;

        for (
                max_attempts = 10;
                0 < max_attempts && NULL == ptr;
                ptr = realloc(old, size), max_attempts--
        );

        if (NULL != ptr)
                return ptr;

        exit(-1);
}

void    zbx_strncpy_alloc(char **str, size_t *alloc_len, size_t *offset, const char *src, size_t n)
{
        if (NULL == *str)
        {
                *alloc_len = n + 1;
                *offset = 0;
                *str = zbx_malloc(*str, *alloc_len);
        }
        else if (*offset + n >= *alloc_len)
        {
                while (*offset + n >= *alloc_len)
                        *alloc_len *= 2;
                *str = zbx_realloc(*str, *alloc_len);
        }

        while (0 != n && '\0' != *src)
        {
                (*str)[(*offset)++] = *src++;
                n--;
        }

        (*str)[*offset] = '\0';
}

static size_t   WRITEFUNCTION2(void *ptr, size_t size, size_t nmemb, void *userdata)
{
	size_t  r_size = size * nmemb;

        zbx_strncpy_alloc(&page.data, &page.alloc, &page.offset, ptr, r_size);

        return r_size;
}

static size_t   HEADERFUNCTION2(void *ptr, size_t size, size_t nmemb, void *userdata)
{
        return size * nmemb;
}

int main(void)
{
	int		err, opt;
	CURL            *easyhandle;
	struct curl_slist       *headers = NULL;

	if (NULL == (easyhandle = curl_easy_init()))
	{
		goto clean;
	}
	headers = curl_slist_append(headers, ZBX_XML_HEADER1);
        headers = curl_slist_append(headers, ZBX_XML_HEADER2);

	curl_easy_setopt(easyhandle, opt = CURLOPT_HTTPHEADER, headers);	

	if (CURLE_OK != (err = curl_easy_setopt(easyhandle, opt = CURLOPT_COOKIEFILE, "" )) ||
		CURLE_OK != (err = curl_easy_setopt(easyhandle, opt = CURLOPT_FOLLOWLOCATION, 1L)) ||
		CURLE_OK != (err = curl_easy_setopt(easyhandle, opt = CURLOPT_URL, "https://192.168.30.222/sdk")) ||
		CURLE_OK != (err = curl_easy_setopt(easyhandle, opt = CURLOPT_WRITEFUNCTION, WRITEFUNCTION2)) ||
		CURLE_OK != (err = curl_easy_setopt(easyhandle, opt = CURLOPT_HEADERFUNCTION, HEADERFUNCTION2)) ||
		CURLE_OK != (err = curl_easy_setopt(easyhandle, opt = CURLOPT_POST, 1L)) ||
		CURLE_OK != (err = curl_easy_setopt(easyhandle, opt = CURLOPT_SSL_VERIFYPEER, 0L)) ||
		CURLE_OK != (err = curl_easy_setopt(easyhandle, opt = CURLOPT_SSL_VERIFYHOST, 0L))) 
	{
		goto clean;
	}

	char * xml;
	xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><SOAP-ENV:Envelope xmlns:ns0=\"urn:vim25\" xmlns:ns1=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"><SOAP-ENV:Header/><ns1:Body><ns0:Login xsi:type=\"ns0:LoginRequestType\"><ns0:_this type=\"SessionManager\">SessionManager</ns0:_this><ns0:userName>Administrator</ns0:userName><ns0:password>qwerASDF</ns0:password></ns0:Login></ns1:Body></SOAP-ENV:Envelope>";

	curl_easy_setopt(easyhandle, opt = CURLOPT_POSTFIELDS, xml);
	err = curl_easy_perform(easyhandle);	

	char *xml1;
	xml1 = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><SOAP-ENV:Envelope xmlns:ns0=\"urn:vim25\" xmlns:ns1=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\"><SOAP-ENV:Header/><ns1:Body><ns0:RetrievePropertiesEx><ns0:_this type=\"PropertyCollector\">propertyCollector</ns0:_this><ns0:specSet><ns0:propSet><ns0:type>VirtualMachine</ns0:type><ns0:pathSet>config</ns0:pathSet><ns0:pathSet>summary</ns0:pathSet><ns0:pathSet>guest</ns0:pathSet></ns0:propSet><ns0:objectSet><ns0:obj type=\"VirtualMachine\">vm-21</ns0:obj></ns0:objectSet></ns0:specSet><ns0:options></ns0:options></ns0:RetrievePropertiesEx></ns1:Body></SOAP-ENV:Envelope>";

	curl_easy_setopt(easyhandle, opt = CURLOPT_POSTFIELDS, xml1);
	page.offset = 0;
	err = curl_easy_perform(easyhandle);
	if (NULL == page.data) {
		printf("error");
	}
	printf("%s", page.data);
clean:
	curl_easy_cleanup(easyhandle);

	return 0;
}


 如果不想编码,也可以,直接用curl -i -k --data "" https://192.168.30.222/sdk 也行,只要data里的内容填对了,就可以。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值