pytbox 0.0.9__tar.gz → 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of pytbox might be problematic. Click here for more details.
- {pytbox-0.0.9/src/pytbox.egg-info → pytbox-0.1.0}/PKG-INFO +1 -1
- {pytbox-0.0.9 → pytbox-0.1.0}/pyproject.toml +1 -1
- pytbox-0.1.0/src/pytbox/categraf/build_config.py +145 -0
- pytbox-0.1.0/src/pytbox/categraf/instances.toml +35 -0
- pytbox-0.1.0/src/pytbox/categraf/jinja2/input.dns_query/dns_query.toml.j2 +12 -0
- pytbox-0.1.0/src/pytbox/categraf/jinja2/input.net_response/net_response.toml.j2 +9 -0
- pytbox-0.1.0/src/pytbox/categraf/jinja2/input.snmp/h3c_interface.toml.j2 +96 -0
- pytbox-0.1.0/src/pytbox/categraf/jinja2/input.snmp/h3c_system.toml.j2 +41 -0
- {pytbox-0.0.9 → pytbox-0.1.0/src/pytbox.egg-info}/PKG-INFO +1 -1
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox.egg-info/SOURCES.txt +2 -0
- pytbox-0.0.9/src/pytbox/categraf/build_config.py +0 -91
- pytbox-0.0.9/src/pytbox/categraf/instances.toml +0 -16
- pytbox-0.0.9/src/pytbox/categraf/jinja2/input.dns_query/dns_query.toml.j2 +0 -0
- pytbox-0.0.9/src/pytbox/categraf/jinja2/input.net_response/net_response.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/MANIFEST.in +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/README.md +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/setup.cfg +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/alert/alert_handler.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/alert/ping.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/alicloud/sls.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/base.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/categraf/jinja2/__init__.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/categraf/jinja2/input.cpu/cpu.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/categraf/jinja2/input.disk/disk.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/categraf/jinja2/input.diskio/diskio.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/categraf/jinja2/input.http_response/http_response.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/categraf/jinja2/input.mem/mem.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/categraf/jinja2/input.net/net.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/categraf/jinja2/input.ping/ping.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/categraf/jinja2/input.prometheus/prometheus.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/categraf/jinja2/input.vsphere/vsphere.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/cli/__init__.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/cli/categraf/__init__.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/cli/categraf/commands.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/cli/common/__init__.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/cli/common/options.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/cli/common/utils.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/cli/formatters/__init__.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/cli/formatters/output.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/cli/main.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/cli.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/common/__init__.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/database/mongo.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/database/victoriametrics.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/dida365.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/feishu/client.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/feishu/endpoints.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/feishu/errors.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/feishu/helpers.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/feishu/typing.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/log/logger.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/log/victorialog.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/onepassword_connect.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/onepassword_sa.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/utils/env.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/utils/load_config.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/utils/ping_checker.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/utils/response.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/utils/richutils.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/utils/timeutils.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox.egg-info/dependency_links.txt +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox.egg-info/entry_points.txt +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox.egg-info/requires.txt +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox.egg-info/top_level.txt +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/tests/test_base.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/tests/test_feishu.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/tests/test_logger.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/tests/test_onepassword_connect.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/tests/test_onepassword_sa.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.0}/tests/test_victoriametrics.py +0 -0
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pytbox"
|
|
7
|
-
version = "0.0
|
|
7
|
+
version = "0.1.0"
|
|
8
8
|
description = "A collection of Python integrations and utilities (Feishu, Dida365, VictoriaMetrics, ...)"
|
|
9
9
|
authors = [{ name = "mingming hou", email = "houm01@foxmail.com" }]
|
|
10
10
|
license = "MIT"
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
import os
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from pytbox.utils.load_config import load_config_by_file
|
|
6
|
+
from glob import glob
|
|
7
|
+
import os
|
|
8
|
+
from jinja2 import Environment, FileSystemLoader
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
jinja2_path = Path(__file__).parent / 'jinja2'
|
|
12
|
+
env = Environment(loader=FileSystemLoader(jinja2_path))
|
|
13
|
+
|
|
14
|
+
ping_template = env.get_template('input.ping/ping.toml.j2')
|
|
15
|
+
prometheus_template = env.get_template('input.prometheus/prometheus.toml.j2')
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class BuildConfig:
|
|
19
|
+
'''
|
|
20
|
+
生成配置
|
|
21
|
+
|
|
22
|
+
Args:
|
|
23
|
+
instances (_type_): _description_
|
|
24
|
+
output_dir (_type_): _description_
|
|
25
|
+
'''
|
|
26
|
+
def __init__(self, instances, output_dir):
|
|
27
|
+
self.instances = load_config_by_file(instances)
|
|
28
|
+
self.output_dir = output_dir
|
|
29
|
+
|
|
30
|
+
def _get_template(self, template_name):
|
|
31
|
+
return env.get_template(template_name)
|
|
32
|
+
|
|
33
|
+
def common(self, input_name):
|
|
34
|
+
template = self._get_template(f'input.{input_name}/{input_name}.toml.j2')
|
|
35
|
+
render_data = template.render()
|
|
36
|
+
target_dir = Path(self.output_dir) / f'input.{input_name}'
|
|
37
|
+
if not target_dir.exists():
|
|
38
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
39
|
+
|
|
40
|
+
with open(Path(self.output_dir) / f'input.{input_name}' / f'{input_name}.toml', 'w', encoding='utf-8') as f:
|
|
41
|
+
f.write(render_data)
|
|
42
|
+
|
|
43
|
+
def ping(self):
|
|
44
|
+
instances = self.instances['ping']['instance']
|
|
45
|
+
render_data = ping_template.render(instances=instances)
|
|
46
|
+
target_dir = Path(self.output_dir) / 'input.ping'
|
|
47
|
+
if not target_dir.exists():
|
|
48
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
49
|
+
|
|
50
|
+
with open(Path(self.output_dir) / 'input.ping' / 'ping.toml', 'w', encoding='utf-8') as f:
|
|
51
|
+
f.write(render_data)
|
|
52
|
+
|
|
53
|
+
def prometheus(self):
|
|
54
|
+
instances = self.instances['prometheus']['urls']
|
|
55
|
+
render_data = prometheus_template.render(instances=instances)
|
|
56
|
+
target_dir = Path(self.output_dir) / 'input.prometheus'
|
|
57
|
+
if not target_dir.exists():
|
|
58
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
59
|
+
with open(Path(self.output_dir) / 'input.prometheus' / 'prometheus.toml', 'w', encoding='utf-8') as f:
|
|
60
|
+
f.write(render_data)
|
|
61
|
+
|
|
62
|
+
def vsphere(self):
|
|
63
|
+
template = self._get_template('input.vsphere/vsphere.toml.j2')
|
|
64
|
+
instances = self.instances['vsphere']['instance']
|
|
65
|
+
render_data = template.render(instances=instances)
|
|
66
|
+
target_dir = Path(self.output_dir) / 'input.vsphere'
|
|
67
|
+
if not target_dir.exists():
|
|
68
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
69
|
+
with open(Path(self.output_dir) / 'input.vsphere' / 'vsphere.toml', 'w', encoding='utf-8') as f:
|
|
70
|
+
f.write(render_data)
|
|
71
|
+
|
|
72
|
+
def http_response(self):
|
|
73
|
+
template = self._get_template('input.http_response/http_response.toml.j2')
|
|
74
|
+
if self.instances.get('http_response'):
|
|
75
|
+
instances = self.instances['http_response']['instance']
|
|
76
|
+
render_data = template.render(instances=instances)
|
|
77
|
+
target_dir = Path(self.output_dir) / 'input.http_response'
|
|
78
|
+
if not target_dir.exists():
|
|
79
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
80
|
+
with open(Path(self.output_dir) / 'input.http_response' / 'http_response.toml', 'w', encoding='utf-8') as f:
|
|
81
|
+
f.write(render_data)
|
|
82
|
+
|
|
83
|
+
def net_response(self):
|
|
84
|
+
template = self._get_template('input.net_response/net_response.toml.j2')
|
|
85
|
+
if self.instances.get('net_response'):
|
|
86
|
+
instances = self.instances['net_response']['instance']
|
|
87
|
+
render_data = template.render(instances=instances)
|
|
88
|
+
target_dir = Path(self.output_dir) / 'input.net_response'
|
|
89
|
+
if not target_dir.exists():
|
|
90
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
91
|
+
with open(Path(self.output_dir) / 'input.net_response' / 'net_response.toml', 'w', encoding='utf-8') as f:
|
|
92
|
+
f.write(render_data)
|
|
93
|
+
|
|
94
|
+
def dns_query(self):
|
|
95
|
+
template = self._get_template('input.dns_query/dns_query.toml.j2')
|
|
96
|
+
if self.instances.get('dns_query'):
|
|
97
|
+
instances = self.instances['dns_query']['instance']
|
|
98
|
+
render_data = template.render(instances=instances)
|
|
99
|
+
target_dir = Path(self.output_dir) / 'input.dns_query'
|
|
100
|
+
if not target_dir.exists():
|
|
101
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
102
|
+
with open(Path(self.output_dir) / 'input.dns_query' / 'dns_query.toml', 'w', encoding='utf-8') as f:
|
|
103
|
+
f.write(render_data)
|
|
104
|
+
|
|
105
|
+
def snmp(self):
|
|
106
|
+
if self.instances.get('snmp'):
|
|
107
|
+
device_types = self.instances['snmp']['instances']
|
|
108
|
+
for device_type in device_types:
|
|
109
|
+
instances = self.instances['snmp']['instances'][device_type]
|
|
110
|
+
jinja2_dir = Path(jinja2_path) / 'input.snmp'
|
|
111
|
+
device_templates = glob(str(jinja2_dir / f'{device_type}_*.toml.j2'))
|
|
112
|
+
if not device_templates:
|
|
113
|
+
continue
|
|
114
|
+
|
|
115
|
+
for tmpl_path in device_templates:
|
|
116
|
+
tmpl_name = os.path.basename(tmpl_path)
|
|
117
|
+
# 例如 h3c_system.toml.j2 -> h3c_system
|
|
118
|
+
base_name = tmpl_name.replace('.toml.j2', '')
|
|
119
|
+
|
|
120
|
+
template = self._get_template(f'input.snmp/{tmpl_name}')
|
|
121
|
+
# 修复数据结构:模板期望的是数组,每个元素是字典
|
|
122
|
+
# instances 是 [{"udp://10.1.1.1:161": {...}, "udp://10.1.1.2:161": {...}}, ...]
|
|
123
|
+
render_data = template.render(instances=instances)
|
|
124
|
+
|
|
125
|
+
target_dir = Path(self.output_dir) / 'input.snmp'
|
|
126
|
+
if not target_dir.exists():
|
|
127
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
128
|
+
|
|
129
|
+
output_file = target_dir / f'{base_name}.toml'
|
|
130
|
+
with open(output_file, 'w', encoding='utf-8') as f:
|
|
131
|
+
f.write(render_data)
|
|
132
|
+
|
|
133
|
+
def run(self):
|
|
134
|
+
self.common('cpu')
|
|
135
|
+
self.common('mem')
|
|
136
|
+
self.common('net')
|
|
137
|
+
self.common('disk')
|
|
138
|
+
self.common('diskio')
|
|
139
|
+
self.vsphere()
|
|
140
|
+
self.ping()
|
|
141
|
+
self.prometheus()
|
|
142
|
+
self.http_response()
|
|
143
|
+
self.net_response()
|
|
144
|
+
self.dns_query()
|
|
145
|
+
self.snmp()
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
[ping]
|
|
2
|
+
[[ping.instance]]
|
|
3
|
+
"10.1.1.1" = { name = "x", env = "prod" }
|
|
4
|
+
"10.1.1.2" = { name = "demo02", env = "dev" }
|
|
5
|
+
|
|
6
|
+
[prometheus]
|
|
7
|
+
[[prometheus.urls]]
|
|
8
|
+
"http://10.200.12.202:9100" = { name = "x", env = "prod" }
|
|
9
|
+
|
|
10
|
+
[vsphere]
|
|
11
|
+
[[vsphere.instance]]
|
|
12
|
+
"test" = { vcenter = "https://10.1.1.1/sdk", username = "categraf@vsphere.local", password = "xxx" }
|
|
13
|
+
|
|
14
|
+
[http_response]
|
|
15
|
+
[[http_response.instance]]
|
|
16
|
+
"https://www.baidu.com" = { name = "x", env = "prod" }
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
[net_response]
|
|
20
|
+
[[net_response.instance]]
|
|
21
|
+
"124.74.245.90:8443" = { name = "x", env = "prod" }
|
|
22
|
+
|
|
23
|
+
[dns_query]
|
|
24
|
+
[[dns_query.instance]]
|
|
25
|
+
"119.29.29.29_baidu.com" = { dns_server = "119.29.29.29", domains = "www.baidu.com", labels = { name = "x", env = "prod" } }
|
|
26
|
+
|
|
27
|
+
[snmp]
|
|
28
|
+
[[snmp.instances.h3c]]
|
|
29
|
+
"10.1.1.1:161" = { version = 2, community = "public" }
|
|
30
|
+
"10.1.1.2:161" = { version = 2, community = "public" }
|
|
31
|
+
"10.1.1.3:161" = { version = 3, sec_name = "sec", auth_protocol = "SHA", auth_password = "pass01", priv_protocol = "AES", priv_password = "pass02", sec_level = "authPriv" }
|
|
32
|
+
|
|
33
|
+
# [[snmp.instances.huawei]]
|
|
34
|
+
# "udp://172.16.1.1:161" = { version = 2, community = "public"}
|
|
35
|
+
# "udp://172.16.1.2:161" = { version = 2, community = "public"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
{% for instance in instances %}
|
|
2
|
+
{% for name, data in instance.items() %}
|
|
3
|
+
[[instances]]
|
|
4
|
+
# append some labels for series
|
|
5
|
+
labels = { {% for k, v in data['labels'].items() %}{% if not loop.first %}, {% endif %}{% if k.isidentifier() %}{{ k }}{% else %}"{{ k }}"{% endif %} = "{{ v }}"{% endfor %} }
|
|
6
|
+
servers = ["{{ data['dns_server'] }}"]
|
|
7
|
+
## Domains or subdomains to query.
|
|
8
|
+
domains = ["{{ data['domains'] }}"]
|
|
9
|
+
record_type = "A"
|
|
10
|
+
timeout = 2
|
|
11
|
+
{% endfor %}
|
|
12
|
+
{% endfor %}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
{% for instance in instances %}
|
|
2
|
+
{% for target, labels in instance.items() %}
|
|
3
|
+
[[instances]]
|
|
4
|
+
targets = [
|
|
5
|
+
"{{ target }}"
|
|
6
|
+
]
|
|
7
|
+
labels = { {% for k, v in labels.items() %}{% if not loop.first %}, {% endif %}{% if k.isidentifier() %}{{ k }}{% else %}"{{ k }}"{% endif %} = "{{ v }}"{% endfor %} }
|
|
8
|
+
{% endfor %}
|
|
9
|
+
{% endfor %}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
{% for instance in instances %}
|
|
2
|
+
{% for agent, detail in instance.items() %}
|
|
3
|
+
[[instances]]
|
|
4
|
+
agents = [
|
|
5
|
+
"udp://{{agent}}"
|
|
6
|
+
]
|
|
7
|
+
{% if detail.version == 2 %}
|
|
8
|
+
version = {{detail.version}}
|
|
9
|
+
community = "{{detail.community}}"
|
|
10
|
+
{% endif %}
|
|
11
|
+
{% if detail.version == 3 %}
|
|
12
|
+
version = {{detail.version}}
|
|
13
|
+
sec_name = "{{detail.sec_name}}"
|
|
14
|
+
auth_protocol = "{{detail.auth_protocol}}"
|
|
15
|
+
auth_password = "{{detail.auth_password}}"
|
|
16
|
+
priv_protocol = "{{detail.priv_protocol}}"
|
|
17
|
+
priv_password = "{{detail.priv_password}}"
|
|
18
|
+
sec_level = "{{detail.sec_level}}"
|
|
19
|
+
{% endif %}
|
|
20
|
+
timeout = "5s"
|
|
21
|
+
retries = 3
|
|
22
|
+
path = ["/usr/share/snmp/mibs"]
|
|
23
|
+
translator = "gosmi"
|
|
24
|
+
max_repetitions = 50
|
|
25
|
+
|
|
26
|
+
[[instances.field]]
|
|
27
|
+
name = "sysName"
|
|
28
|
+
oid = "1.3.6.1.2.1.1.5.0"
|
|
29
|
+
is_tag = true
|
|
30
|
+
|
|
31
|
+
[[instances.table]]
|
|
32
|
+
name = "interface"
|
|
33
|
+
inherit_tags = ["sysName"]
|
|
34
|
+
index_as_tag = true
|
|
35
|
+
|
|
36
|
+
[[instances.table.field]]
|
|
37
|
+
name = "ifIndex"
|
|
38
|
+
oid = "1.3.6.1.2.1.2.2.1.1"
|
|
39
|
+
is_tag = true
|
|
40
|
+
|
|
41
|
+
[[instances.table.field]]
|
|
42
|
+
name = "ifName"
|
|
43
|
+
oid = "1.3.6.1.2.1.31.1.1.1.1"
|
|
44
|
+
is_tag = true
|
|
45
|
+
|
|
46
|
+
[[instances.table.field]]
|
|
47
|
+
name = "ifDescr"
|
|
48
|
+
oid = "1.3.6.1.2.1.2.2.1.2"
|
|
49
|
+
is_tag = true
|
|
50
|
+
|
|
51
|
+
[[instances.table.field]]
|
|
52
|
+
name = "ifSpeed"
|
|
53
|
+
oid = "1.3.6.1.2.1.2.2.1.5"
|
|
54
|
+
# is_tag = true
|
|
55
|
+
|
|
56
|
+
[[instances.table.field]]
|
|
57
|
+
name = "ifAdminStatus"
|
|
58
|
+
oid = "1.3.6.1.2.1.2.2.1.7"
|
|
59
|
+
# is_tag = true
|
|
60
|
+
|
|
61
|
+
[[instances.table.field]]
|
|
62
|
+
name = "ifOperStatus"
|
|
63
|
+
oid = "1.3.6.1.2.1.2.2.1.8"
|
|
64
|
+
# is_tag = true
|
|
65
|
+
|
|
66
|
+
[[instances.table.field]]
|
|
67
|
+
name = "ifInDiscards"
|
|
68
|
+
oid = "1.3.6.1.2.1.2.2.1.13"
|
|
69
|
+
|
|
70
|
+
[[instances.table.field]]
|
|
71
|
+
name = "ifInErrors"
|
|
72
|
+
oid = "1.3.6.1.2.1.2.2.1.14"
|
|
73
|
+
|
|
74
|
+
[[instances.table.field]]
|
|
75
|
+
name = "ifOutDiscards"
|
|
76
|
+
oid = "1.3.6.1.2.1.2.2.1.19"
|
|
77
|
+
|
|
78
|
+
[[instances.table.field]]
|
|
79
|
+
name = "ifOutErrors"
|
|
80
|
+
oid = "1.3.6.1.2.1.2.2.1.20"
|
|
81
|
+
|
|
82
|
+
[[instances.table.field]]
|
|
83
|
+
name = "ifAlias"
|
|
84
|
+
oid = "1.3.6.1.2.1.31.1.1.1.18"
|
|
85
|
+
is_tag = true
|
|
86
|
+
|
|
87
|
+
[[instances.table.field]]
|
|
88
|
+
name = "ifHCInOctets"
|
|
89
|
+
oid = "1.3.6.1.2.1.31.1.1.1.6"
|
|
90
|
+
|
|
91
|
+
[[instances.table.field]]
|
|
92
|
+
name = "ifHCOutOctets"
|
|
93
|
+
oid = "1.3.6.1.2.1.31.1.1.1.10"
|
|
94
|
+
|
|
95
|
+
{% endfor %}
|
|
96
|
+
{% endfor %}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
{% for instance in instances %}
|
|
2
|
+
{% for agent, detail in instance.items() %}
|
|
3
|
+
[[instances]]
|
|
4
|
+
agents = [
|
|
5
|
+
"udp://{{agent}}"
|
|
6
|
+
]
|
|
7
|
+
{% if detail.version == 2 %}
|
|
8
|
+
version = {{detail.version}}
|
|
9
|
+
community = "{{detail.community}}"
|
|
10
|
+
{% endif %}
|
|
11
|
+
{% if detail.version == 3 %}
|
|
12
|
+
version = {{detail.version}}
|
|
13
|
+
sec_name = "{{detail.sec_name}}"
|
|
14
|
+
auth_protocol = "{{detail.auth_protocol}}"
|
|
15
|
+
auth_password = "{{detail.auth_password}}"
|
|
16
|
+
priv_protocol = "{{detail.priv_protocol}}"
|
|
17
|
+
priv_password = "{{detail.priv_password}}"
|
|
18
|
+
sec_level = "{{detail.sec_level}}"
|
|
19
|
+
{% endif %}
|
|
20
|
+
timeout = "5s"
|
|
21
|
+
retries = 3
|
|
22
|
+
path = ["/usr/share/snmp/mibs"]
|
|
23
|
+
translator = "gosmi"
|
|
24
|
+
max_repetitions = 50
|
|
25
|
+
|
|
26
|
+
[[instances.field]]
|
|
27
|
+
name = "sysName"
|
|
28
|
+
oid = "1.3.6.1.2.1.1.5.0"
|
|
29
|
+
is_tag = true
|
|
30
|
+
|
|
31
|
+
[[instances.field]]
|
|
32
|
+
oid = "1.3.6.1.2.1.1.1.0"
|
|
33
|
+
name = "sysDescr"
|
|
34
|
+
is_tag = true
|
|
35
|
+
|
|
36
|
+
[[instances.field]]
|
|
37
|
+
oid = "1.3.6.1.2.1.1.3.0"
|
|
38
|
+
name = "sysUpTime"
|
|
39
|
+
conversion = "float(2)"
|
|
40
|
+
{% endfor %}
|
|
41
|
+
{% endfor %}
|
|
@@ -28,6 +28,8 @@ src/pytbox/categraf/jinja2/input.net/net.toml.j2
|
|
|
28
28
|
src/pytbox/categraf/jinja2/input.net_response/net_response.toml.j2
|
|
29
29
|
src/pytbox/categraf/jinja2/input.ping/ping.toml.j2
|
|
30
30
|
src/pytbox/categraf/jinja2/input.prometheus/prometheus.toml.j2
|
|
31
|
+
src/pytbox/categraf/jinja2/input.snmp/h3c_interface.toml.j2
|
|
32
|
+
src/pytbox/categraf/jinja2/input.snmp/h3c_system.toml.j2
|
|
31
33
|
src/pytbox/categraf/jinja2/input.vsphere/vsphere.toml.j2
|
|
32
34
|
src/pytbox/cli/__init__.py
|
|
33
35
|
src/pytbox/cli/main.py
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
|
|
3
|
-
import os
|
|
4
|
-
from pathlib import Path
|
|
5
|
-
from pytbox.utils.load_config import load_config_by_file
|
|
6
|
-
|
|
7
|
-
from jinja2 import Environment, FileSystemLoader
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
jinja2_path = Path(__file__).parent / 'jinja2'
|
|
11
|
-
env = Environment(loader=FileSystemLoader(jinja2_path))
|
|
12
|
-
|
|
13
|
-
ping_template = env.get_template('input.ping/ping.toml.j2')
|
|
14
|
-
prometheus_template = env.get_template('input.prometheus/prometheus.toml.j2')
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
class BuildConfig:
|
|
18
|
-
'''
|
|
19
|
-
生成配置
|
|
20
|
-
|
|
21
|
-
Args:
|
|
22
|
-
instances (_type_): _description_
|
|
23
|
-
output_dir (_type_): _description_
|
|
24
|
-
'''
|
|
25
|
-
def __init__(self, instances, output_dir):
|
|
26
|
-
self.instances = load_config_by_file(instances)
|
|
27
|
-
self.output_dir = output_dir
|
|
28
|
-
|
|
29
|
-
def _get_template(self, template_name):
|
|
30
|
-
return env.get_template(template_name)
|
|
31
|
-
|
|
32
|
-
def common(self, input_name):
|
|
33
|
-
template = self._get_template(f'input.{input_name}/{input_name}.toml.j2')
|
|
34
|
-
render_data = template.render()
|
|
35
|
-
target_dir = Path(self.output_dir) / f'input.{input_name}'
|
|
36
|
-
if not target_dir.exists():
|
|
37
|
-
target_dir.mkdir(parents=True, exist_ok=True)
|
|
38
|
-
|
|
39
|
-
with open(Path(self.output_dir) / f'input.{input_name}' / f'{input_name}.toml', 'w', encoding='utf-8') as f:
|
|
40
|
-
f.write(render_data)
|
|
41
|
-
|
|
42
|
-
def ping(self):
|
|
43
|
-
instances = self.instances['ping']['instance']
|
|
44
|
-
render_data = ping_template.render(instances=instances)
|
|
45
|
-
target_dir = Path(self.output_dir) / 'input.ping'
|
|
46
|
-
if not target_dir.exists():
|
|
47
|
-
target_dir.mkdir(parents=True, exist_ok=True)
|
|
48
|
-
|
|
49
|
-
with open(Path(self.output_dir) / 'input.ping' / 'ping.toml', 'w', encoding='utf-8') as f:
|
|
50
|
-
f.write(render_data)
|
|
51
|
-
|
|
52
|
-
def prometheus(self):
|
|
53
|
-
instances = self.instances['prometheus']['urls']
|
|
54
|
-
render_data = prometheus_template.render(instances=instances)
|
|
55
|
-
target_dir = Path(self.output_dir) / 'input.prometheus'
|
|
56
|
-
if not target_dir.exists():
|
|
57
|
-
target_dir.mkdir(parents=True, exist_ok=True)
|
|
58
|
-
with open(Path(self.output_dir) / 'input.prometheus' / 'prometheus.toml', 'w', encoding='utf-8') as f:
|
|
59
|
-
f.write(render_data)
|
|
60
|
-
|
|
61
|
-
def vsphere(self):
|
|
62
|
-
template = self._get_template('input.vsphere/vsphere.toml.j2')
|
|
63
|
-
instances = self.instances['vsphere']['instance']
|
|
64
|
-
print(instances)
|
|
65
|
-
render_data = template.render(instances=instances)
|
|
66
|
-
target_dir = Path(self.output_dir) / 'input.vsphere'
|
|
67
|
-
if not target_dir.exists():
|
|
68
|
-
target_dir.mkdir(parents=True, exist_ok=True)
|
|
69
|
-
with open(Path(self.output_dir) / 'input.vsphere' / 'vsphere.toml', 'w', encoding='utf-8') as f:
|
|
70
|
-
f.write(render_data)
|
|
71
|
-
|
|
72
|
-
def http_response(self):
|
|
73
|
-
template = self._get_template('input.http_response/http_response.toml.j2')
|
|
74
|
-
instances = self.instances['http_response']['instance']
|
|
75
|
-
render_data = template.render(instances=instances)
|
|
76
|
-
target_dir = Path(self.output_dir) / 'input.http_response'
|
|
77
|
-
if not target_dir.exists():
|
|
78
|
-
target_dir.mkdir(parents=True, exist_ok=True)
|
|
79
|
-
with open(Path(self.output_dir) / 'input.http_response' / 'http_response.toml', 'w', encoding='utf-8') as f:
|
|
80
|
-
f.write(render_data)
|
|
81
|
-
|
|
82
|
-
def run(self):
|
|
83
|
-
# self.common('cpu')
|
|
84
|
-
# self.common('mem')
|
|
85
|
-
# self.common('net')
|
|
86
|
-
# self.common('disk')
|
|
87
|
-
# self.common('diskio')
|
|
88
|
-
# self.vsphere()
|
|
89
|
-
# self.ping()
|
|
90
|
-
# self.prometheus()
|
|
91
|
-
self.http_response()
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
[ping]
|
|
2
|
-
[[ping.instance]]
|
|
3
|
-
"10.1.1.1" = { name = "x", env = "prod" }
|
|
4
|
-
"10.1.1.2" = { name = "demo02", env = "dev" }
|
|
5
|
-
|
|
6
|
-
[prometheus]
|
|
7
|
-
[[prometheus.urls]]
|
|
8
|
-
"http://10.200.12.202:9100" = { name = "x", env = "prod" }
|
|
9
|
-
|
|
10
|
-
[vsphere]
|
|
11
|
-
[[vsphere.instance]]
|
|
12
|
-
"test" = { vcenter = "https://10.1.1.1/sdk", username = "categraf@vsphere.local", password = "xxx" }
|
|
13
|
-
|
|
14
|
-
[http_response]
|
|
15
|
-
[[http_response.instance]]
|
|
16
|
-
"https://www.baidu.com" = { name = "x", env = "prod" }
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/categraf/jinja2/input.http_response/http_response.toml.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{pytbox-0.0.9 → pytbox-0.1.0}/src/pytbox/categraf/jinja2/input.prometheus/prometheus.toml.j2
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|