pytbox 0.0.9__tar.gz → 0.1.1__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.1}/PKG-INFO +4 -3
- {pytbox-0.0.9 → pytbox-0.1.1}/pyproject.toml +17 -4
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/base.py +19 -3
- pytbox-0.1.1/src/pytbox/categraf/build_config.py +148 -0
- pytbox-0.1.1/src/pytbox/categraf/instances.toml +36 -0
- pytbox-0.1.1/src/pytbox/categraf/jinja2/input.dns_query/dns_query.toml.j2 +12 -0
- pytbox-0.1.1/src/pytbox/categraf/jinja2/input.net_response/net_response.toml.j2 +9 -0
- pytbox-0.1.1/src/pytbox/categraf/jinja2/input.snmp/cisco_interface.toml.j2 +96 -0
- pytbox-0.1.1/src/pytbox/categraf/jinja2/input.snmp/cisco_system.toml.j2 +41 -0
- pytbox-0.1.1/src/pytbox/categraf/jinja2/input.snmp/h3c_interface.toml.j2 +96 -0
- pytbox-0.1.1/src/pytbox/categraf/jinja2/input.snmp/h3c_system.toml.j2 +41 -0
- pytbox-0.1.1/src/pytbox/categraf/jinja2/input.snmp/huawei_interface.toml.j2 +96 -0
- pytbox-0.1.1/src/pytbox/categraf/jinja2/input.snmp/huawei_system.toml.j2 +41 -0
- pytbox-0.1.1/src/pytbox/categraf/jinja2/input.snmp/ruijie_interface.toml.j2 +96 -0
- pytbox-0.1.1/src/pytbox/categraf/jinja2/input.snmp/ruijie_system.toml.j2 +41 -0
- pytbox-0.1.1/src/pytbox/mail/alimail.py +129 -0
- pytbox-0.1.1/src/pytbox/mail/client.py +221 -0
- pytbox-0.1.1/src/pytbox/network/meraki.py +169 -0
- pytbox-0.1.1/src/pytbox/win/ad.py +30 -0
- {pytbox-0.0.9 → pytbox-0.1.1/src/pytbox.egg-info}/PKG-INFO +4 -3
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox.egg-info/SOURCES.txt +12 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox.egg-info/requires.txt +3 -2
- 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.1}/MANIFEST.in +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/README.md +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/setup.cfg +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/alert/alert_handler.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/alert/ping.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/alicloud/sls.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/categraf/jinja2/__init__.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/categraf/jinja2/input.cpu/cpu.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/categraf/jinja2/input.disk/disk.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/categraf/jinja2/input.diskio/diskio.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/categraf/jinja2/input.http_response/http_response.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/categraf/jinja2/input.mem/mem.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/categraf/jinja2/input.net/net.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/categraf/jinja2/input.ping/ping.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/categraf/jinja2/input.prometheus/prometheus.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/categraf/jinja2/input.vsphere/vsphere.toml.j2 +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/cli/__init__.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/cli/categraf/__init__.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/cli/categraf/commands.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/cli/common/__init__.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/cli/common/options.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/cli/common/utils.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/cli/formatters/__init__.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/cli/formatters/output.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/cli/main.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/cli.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/common/__init__.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/database/mongo.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/database/victoriametrics.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/dida365.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/feishu/client.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/feishu/endpoints.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/feishu/errors.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/feishu/helpers.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/feishu/typing.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/log/logger.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/log/victorialog.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/onepassword_connect.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/onepassword_sa.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/utils/env.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/utils/load_config.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/utils/ping_checker.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/utils/response.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/utils/richutils.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox/utils/timeutils.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox.egg-info/dependency_links.txt +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox.egg-info/entry_points.txt +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/src/pytbox.egg-info/top_level.txt +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/tests/test_base.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/tests/test_feishu.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/tests/test_logger.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/tests/test_onepassword_connect.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/tests/test_onepassword_sa.py +0 -0
- {pytbox-0.0.9 → pytbox-0.1.1}/tests/test_victoriametrics.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: pytbox
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.1.1
|
|
4
4
|
Summary: A collection of Python integrations and utilities (Feishu, Dida365, VictoriaMetrics, ...)
|
|
5
5
|
Author-email: mingming hou <houm01@foxmail.com>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -13,15 +13,16 @@ Requires-Dist: loguru>=0.7.3
|
|
|
13
13
|
Requires-Dist: chinese_calendar>=1.10.0
|
|
14
14
|
Requires-Dist: click>=8.0.0
|
|
15
15
|
Requires-Dist: rich>=12.0.0
|
|
16
|
+
Requires-Dist: jinja2>=3.0.0
|
|
17
|
+
Requires-Dist: toml>=0.10.0
|
|
18
|
+
Requires-Dist: ldap3>=2.9.1
|
|
16
19
|
Provides-Extra: dev
|
|
17
20
|
Requires-Dist: pytest; extra == "dev"
|
|
18
21
|
Requires-Dist: black; extra == "dev"
|
|
19
22
|
Requires-Dist: ruff; extra == "dev"
|
|
20
23
|
Requires-Dist: python-dotenv; extra == "dev"
|
|
21
24
|
Provides-Extra: cli
|
|
22
|
-
Requires-Dist: jinja2>=3.0.0; extra == "cli"
|
|
23
25
|
Requires-Dist: pyyaml>=6.0; extra == "cli"
|
|
24
|
-
Requires-Dist: toml>=0.10.0; extra == "cli"
|
|
25
26
|
|
|
26
27
|
# PytBox
|
|
27
28
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "pytbox"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.1.1"
|
|
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"
|
|
@@ -21,6 +21,9 @@ dependencies = [
|
|
|
21
21
|
"chinese_calendar>=1.10.0",
|
|
22
22
|
"click>=8.0.0", # 添加 click 依赖
|
|
23
23
|
"rich>=12.0.0", # 添加 rich 依赖
|
|
24
|
+
"jinja2>=3.0.0", # 模板渲染
|
|
25
|
+
"toml>=0.10.0", # TOML 输出支持
|
|
26
|
+
"ldap3>=2.9.1", # LDAP 支持
|
|
24
27
|
]
|
|
25
28
|
|
|
26
29
|
[project.scripts]
|
|
@@ -29,9 +32,7 @@ pytbox = "pytbox.cli:main" # 添加命令行入口点
|
|
|
29
32
|
[project.optional-dependencies]
|
|
30
33
|
dev = ["pytest", "black", "ruff", "python-dotenv"]
|
|
31
34
|
cli = [
|
|
32
|
-
"
|
|
33
|
-
"pyyaml>=6.0", # YAML 输出支持
|
|
34
|
-
"toml>=0.10.0", # TOML 输出支持
|
|
35
|
+
"pyyaml>=6.0", # YAML 输出支持
|
|
35
36
|
]
|
|
36
37
|
|
|
37
38
|
[tool.setuptools]
|
|
@@ -39,3 +40,15 @@ include-package-data = true
|
|
|
39
40
|
|
|
40
41
|
[tool.setuptools.packages.find]
|
|
41
42
|
where = ["src"]
|
|
43
|
+
|
|
44
|
+
[tool.pytest.ini_options]
|
|
45
|
+
filterwarnings = [
|
|
46
|
+
"ignore::DeprecationWarning:pyasn1.*",
|
|
47
|
+
"ignore:tagMap is deprecated:DeprecationWarning",
|
|
48
|
+
"ignore:typeMap is deprecated:DeprecationWarning",
|
|
49
|
+
]
|
|
50
|
+
# 显示日志输出
|
|
51
|
+
log_cli = true
|
|
52
|
+
log_cli_level = "INFO"
|
|
53
|
+
log_cli_format = "%(asctime)s [%(levelname)8s] %(name)s: %(message)s"
|
|
54
|
+
log_cli_date_format = "%Y-%m-%d %H:%M:%S"
|
|
@@ -8,11 +8,11 @@ from pytbox.feishu.client import Client as FeishuClient
|
|
|
8
8
|
from pytbox.dida365 import Dida365
|
|
9
9
|
from pytbox.alert.alert_handler import AlertHandler
|
|
10
10
|
from pytbox.log.logger import AppLogger
|
|
11
|
-
|
|
11
|
+
from pytbox.win.ad import ADClient
|
|
12
|
+
from pytbox.network.meraki import Meraki
|
|
12
13
|
|
|
13
14
|
config = load_config_by_file(path='/workspaces/pytbox/tests/alert/config_dev.toml', oc_vault_id=os.environ.get('oc_vault_id'))
|
|
14
15
|
|
|
15
|
-
|
|
16
16
|
def get_mongo(collection):
|
|
17
17
|
return Mongo(
|
|
18
18
|
host=config['mongo']['host'],
|
|
@@ -45,4 +45,20 @@ def get_logger(app):
|
|
|
45
45
|
feishu=feishu,
|
|
46
46
|
dida=dida,
|
|
47
47
|
mongo=get_mongo('alert_program')
|
|
48
|
-
)
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
# ad_dev = ADClient(
|
|
51
|
+
# server=config['ad']['dev']['AD_SERVER'],
|
|
52
|
+
# base_dn=config['ad']['dev']['BASE_DN'],
|
|
53
|
+
# username=config['ad']['dev']['AD_USERNAME'],
|
|
54
|
+
# password=config['ad']['dev']['AD_PASSWORD']
|
|
55
|
+
# )
|
|
56
|
+
|
|
57
|
+
# ad_prod = ADClient(
|
|
58
|
+
# server=config['ad']['prod']['AD_SERVER'],
|
|
59
|
+
# base_dn=config['ad']['prod']['BASE_DN'],
|
|
60
|
+
# username=config['ad']['prod']['AD_USERNAME'],
|
|
61
|
+
# password=config['ad']['prod']['AD_PASSWORD']
|
|
62
|
+
# )
|
|
63
|
+
|
|
64
|
+
meraki = Meraki(api_key=config['meraki']['api_key'], organization_id=config['meraki']['organization_id'])
|
|
@@ -0,0 +1,148 @@
|
|
|
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
|
+
if self.instances.get('ping'):
|
|
45
|
+
instances = self.instances['ping']['instance']
|
|
46
|
+
render_data = ping_template.render(instances=instances)
|
|
47
|
+
target_dir = Path(self.output_dir) / 'input.ping'
|
|
48
|
+
if not target_dir.exists():
|
|
49
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
50
|
+
|
|
51
|
+
with open(Path(self.output_dir) / 'input.ping' / 'ping.toml', 'w', encoding='utf-8') as f:
|
|
52
|
+
f.write(render_data)
|
|
53
|
+
|
|
54
|
+
def prometheus(self):
|
|
55
|
+
if self.instances.get('prometheus'):
|
|
56
|
+
instances = self.instances['prometheus']['urls']
|
|
57
|
+
render_data = prometheus_template.render(instances=instances)
|
|
58
|
+
target_dir = Path(self.output_dir) / 'input.prometheus'
|
|
59
|
+
if not target_dir.exists():
|
|
60
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
61
|
+
with open(Path(self.output_dir) / 'input.prometheus' / 'prometheus.toml', 'w', encoding='utf-8') as f:
|
|
62
|
+
f.write(render_data)
|
|
63
|
+
|
|
64
|
+
def vsphere(self):
|
|
65
|
+
if self.instances.get('vsphere'):
|
|
66
|
+
template = self._get_template('input.vsphere/vsphere.toml.j2')
|
|
67
|
+
instances = self.instances['vsphere']['instance']
|
|
68
|
+
render_data = template.render(instances=instances)
|
|
69
|
+
target_dir = Path(self.output_dir) / 'input.vsphere'
|
|
70
|
+
if not target_dir.exists():
|
|
71
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
72
|
+
with open(Path(self.output_dir) / 'input.vsphere' / 'vsphere.toml', 'w', encoding='utf-8') as f:
|
|
73
|
+
f.write(render_data)
|
|
74
|
+
|
|
75
|
+
def http_response(self):
|
|
76
|
+
template = self._get_template('input.http_response/http_response.toml.j2')
|
|
77
|
+
if self.instances.get('http_response'):
|
|
78
|
+
instances = self.instances['http_response']['instance']
|
|
79
|
+
render_data = template.render(instances=instances)
|
|
80
|
+
target_dir = Path(self.output_dir) / 'input.http_response'
|
|
81
|
+
if not target_dir.exists():
|
|
82
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
83
|
+
with open(Path(self.output_dir) / 'input.http_response' / 'http_response.toml', 'w', encoding='utf-8') as f:
|
|
84
|
+
f.write(render_data)
|
|
85
|
+
|
|
86
|
+
def net_response(self):
|
|
87
|
+
template = self._get_template('input.net_response/net_response.toml.j2')
|
|
88
|
+
if self.instances.get('net_response'):
|
|
89
|
+
instances = self.instances['net_response']['instance']
|
|
90
|
+
render_data = template.render(instances=instances)
|
|
91
|
+
target_dir = Path(self.output_dir) / 'input.net_response'
|
|
92
|
+
if not target_dir.exists():
|
|
93
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
94
|
+
with open(Path(self.output_dir) / 'input.net_response' / 'net_response.toml', 'w', encoding='utf-8') as f:
|
|
95
|
+
f.write(render_data)
|
|
96
|
+
|
|
97
|
+
def dns_query(self):
|
|
98
|
+
template = self._get_template('input.dns_query/dns_query.toml.j2')
|
|
99
|
+
if self.instances.get('dns_query'):
|
|
100
|
+
instances = self.instances['dns_query']['instance']
|
|
101
|
+
render_data = template.render(instances=instances)
|
|
102
|
+
target_dir = Path(self.output_dir) / 'input.dns_query'
|
|
103
|
+
if not target_dir.exists():
|
|
104
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
105
|
+
with open(Path(self.output_dir) / 'input.dns_query' / 'dns_query.toml', 'w', encoding='utf-8') as f:
|
|
106
|
+
f.write(render_data)
|
|
107
|
+
|
|
108
|
+
def snmp(self):
|
|
109
|
+
if self.instances.get('snmp'):
|
|
110
|
+
device_types = self.instances['snmp']['instances']
|
|
111
|
+
for device_type in device_types:
|
|
112
|
+
instances = self.instances['snmp']['instances'][device_type]
|
|
113
|
+
jinja2_dir = Path(jinja2_path) / 'input.snmp'
|
|
114
|
+
device_templates = glob(str(jinja2_dir / f'{device_type}_*.toml.j2'))
|
|
115
|
+
if not device_templates:
|
|
116
|
+
continue
|
|
117
|
+
|
|
118
|
+
for tmpl_path in device_templates:
|
|
119
|
+
tmpl_name = os.path.basename(tmpl_path)
|
|
120
|
+
# 例如 h3c_system.toml.j2 -> h3c_system
|
|
121
|
+
base_name = tmpl_name.replace('.toml.j2', '')
|
|
122
|
+
|
|
123
|
+
template = self._get_template(f'input.snmp/{tmpl_name}')
|
|
124
|
+
# 修复数据结构:模板期望的是数组,每个元素是字典
|
|
125
|
+
# instances 是 [{"udp://10.1.1.1:161": {...}, "udp://10.1.1.2:161": {...}}, ...]
|
|
126
|
+
render_data = template.render(instances=instances)
|
|
127
|
+
|
|
128
|
+
target_dir = Path(self.output_dir) / 'input.snmp'
|
|
129
|
+
if not target_dir.exists():
|
|
130
|
+
target_dir.mkdir(parents=True, exist_ok=True)
|
|
131
|
+
|
|
132
|
+
output_file = target_dir / f'{base_name}.toml'
|
|
133
|
+
with open(output_file, 'w', encoding='utf-8') as f:
|
|
134
|
+
f.write(render_data)
|
|
135
|
+
|
|
136
|
+
def run(self):
|
|
137
|
+
self.common('cpu')
|
|
138
|
+
self.common('mem')
|
|
139
|
+
self.common('net')
|
|
140
|
+
self.common('disk')
|
|
141
|
+
self.common('diskio')
|
|
142
|
+
self.vsphere()
|
|
143
|
+
self.ping()
|
|
144
|
+
self.prometheus()
|
|
145
|
+
self.http_response()
|
|
146
|
+
self.net_response()
|
|
147
|
+
self.dns_query()
|
|
148
|
+
self.snmp()
|
|
@@ -0,0 +1,36 @@
|
|
|
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.1.1.1: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
|
+
# 支持 h3c,huawei,cisco,ruijie
|
|
29
|
+
[[snmp.instances.h3c]]
|
|
30
|
+
"10.1.1.1:161" = { version = 2, community = "public" }
|
|
31
|
+
"10.1.1.2:161" = { version = 2, community = "public" }
|
|
32
|
+
"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" }
|
|
33
|
+
|
|
34
|
+
# [[snmp.instances.huawei]]
|
|
35
|
+
# "udp://172.16.1.1:161" = { version = 2, community = "public"}
|
|
36
|
+
# "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 %}
|
|
@@ -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 %}
|
|
@@ -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 %}
|