专栏首页JackeyGao的博客获取 zabbix 挂件数据(widget)

获取 zabbix 挂件数据(widget)

获取 zabbix 挂件数据(widget)

Posted January 03, 2018

Zabbix 有非常丰富的 API ,但没有 widget 的 API。 所以获取 widget 的数据需要通过模拟登录爬取网页的形式来做。虽然我们可以用一定的 API 数据和相应的逻辑计算出此 TABLE 的数据, 但工作量非常大。

#zabbix widget

我用了两个模块来做, 一个逻辑控制 一个解析模块.

main.py

Python

# -*- coding: utf-8 -*-

import sys
import json
import requests
from parse import HTMLTableParser

reload(sys)
sys.setdefaultencoding("utf-8")

HOST = "http://{{ HOST }}:8080/"


def parse(html):
    p = HTMLTableParser()
    p.feed(html)
    table = p.tables[0]
    c = [ {'prop': str(x), 'label': y} \
           for x,y in zip(range(len(table[0])), table[0]) ]
    return { "columns": c }, table[1:]


def login_session():
    s = requests.Session()
    payload = {
        "name": "{{ USER }}",
        "password": "{{ PASSWORD }}",
        "autologin": "1",
        "enter": "Sign in"
    }
    s = requests.Session()
    resp = s.post(HOST + 'index.php', payload)
    return s


def action(action_name):
    session = login_session()

    # 可以通过浏览器的开发者模式获取这里的参数, 一般需要更改 sid.
    params = {
        "action": action_name,
        "sid": "8c09585cdef21c27",  {{ SID }}
        "upd_counter": 0,
        "pmasterid": "dashboard"
    }
    payload = {"widgetRefresh": "syssum", '_': ""}

    resp = session.post(
        HOST + 'zabbix.php', params=params, data=payload)

    data = json.loads(resp.text)
    return data


def usage():
    raise Exception(
        """Arg error, Missing key
        Key choice in:
        \twidget.status.view
        \twidget.hosts.view
        \twidget.system.view
        \twidget.web.view
        \twidget.issues.view"""
    )


if __name__ == '__main__':
    if len(sys.argv) != 2:
        usage()

    data = action(sys.argv[1])
    config, data = parse(data["body"])
    sys.stdout.write(json.dumps(config, indent=2)+'\n')
    sys.stdout.write(json.dumps(data, indent=2)+'\n')

parse.py

Python

from HTMLParser import HTMLParser


class HTMLTableParser(HTMLParser):
    """ This class serves as a html table parser. It is able to parse multiple
    tables which you feed in. You can access the result per .tables field.
    """
    def __init__(
        self,
        decode_html_entities=False,
        data_separator=' ',
    ):

        HTMLParser.__init__(self)

        self._parse_html_entities = decode_html_entities
        self._data_separator = data_separator

        self._in_td = False
        self._in_th = False
        self._in_span = 0
        self._current_table = []
        self._current_row = []
        self._current_cell = []
        self.tables = []

    def handle_starttag(self, tag, attrs):
        """ We need to remember the opening point for the content of interest.
        The other tags (<table>, <tr>) are only handled at the closing point.
        """
        if tag == 'span':
            self._in_span = self._in_span + 1
        if tag == 'td':
            self._in_td = True
        if tag == 'th':
            self._in_th = True

    def handle_data(self, data):
        """ This is where we save content to a cell """
        if self._in_td or self._in_th:
            if self._in_span in (0, 1):
                self._current_cell.append(data.strip())
            else:
                return

    def handle_charref(self, name):
        """ Handle HTML encoded characters """

        if self._parse_html_entities:
            self.handle_data(self.unescape('&#{};'.format(name)))

    def handle_endtag(self, tag):
        """ Here we exit the tags. If the closing tag is </tr>, we know that we
        can save our currently parsed cells to the current table as a row and
        prepare for a new row. If the closing tag is </table>, we save the
        current table and prepare for a new one.
        """
        if tag == 'td':
            self._in_td = False
        elif tag == 'th':
            self._in_th = False
        elif tag == 'span':
            self._in_span = self._in_span - 1

        if self._in_span < 2:
            if tag in ['td', 'th']:
                final_cell = self._data_separator.join(self._current_cell).strip()
                self._current_row.append(final_cell)
                self._current_cell = []
            elif tag == 'tr':
                self._current_table.append(self._current_row)
                self._current_row = []
            elif tag == 'table':
                self.tables.append(self._current_table)
                self._current_table = []

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一个Python3和Python2的range差异

    Python 3 中执行100000000 in range(100000001)会比Python 2快的非常多。

    用户1416054
  • Django小技巧11: 自定义链式Queryset Manager

    在 Django Model 中,Manager是与数据库交互的接口。默认情况下Manager可通过Model.objects属性使用。默认情况下, 每个 Mo...

    用户1416054
  • Django 自定义管理命令

    Django 提供了一组非常实用的命令, 可以通过django-admin.py和pytohn manage.py脚本调用. 关于这个Management Co...

    用户1416054
  • CIFAR10数据集实战-ResNet网络构建(中)

    用户6719124
  • CIFAR-10 数据集实战——构建ResNet18神经网络

    Block中进行了正则化处理,以使train过程更快更稳定。同时要考虑,如果两元素的ch_in和ch_out不匹配,进行加法时会报错,因此需要判断一下,如果不想...

    mathor
  • 图像局部特征提取

    图像特征可以包括颜色特征、纹理特征、形状特征以及局部特征点等。其中局部特点具有很好的稳定性,不容易受外界环境的干扰。图像特征提取是图像分析与图像识别的前提,它是...

    范中豪
  • 用python写gui

    风之小云天
  • pytorch和tensorflow的爱恨情仇之定义可训练的参数

    之前我们就已经了解了pytorch和tensorflow中的变量,本节我们深入了解可训练的参数-变量

    绝命生
  • AlphaGo Zero你也来造一只,PyTorch实现五脏俱全| 附代码

    遥想当年,AlphaGo的Master版本,在完胜柯洁九段之后不久,就被后辈AlphaGo Zero (简称狗零) 击溃了。

    量子位
  • 500行python代码实现飞机大战

    本文实例为大家分享了python代码实现飞机大战的具体代码,供大家参考,具体内容如下

    砸漏

扫码关注云+社区

领取腾讯云代金券