# pip install requests drf-httpsig
import requests
import json
import hashlib
import os
class JumpServer:
"""
jumpserver APi接口哦
定时任务:每隔 10 分钟执行 把 jumpserver里的机器自动注册到 prometheus
待优化:
如果jumpserver机器 > 1000 请重写 assets 获取接口, 必须分页
"""
def __init__(self):
self.jms_url = 'http://xxxxxxx'
self.username = "xxxxx"
self.password = "xxxxxx"
self.headers = {
"Authorization": 'Bearer ' + self.get_token(),
'X-JMS-ORG': '00000000-0000-0000-0000-000000000002'
}
@staticmethod
def get_file_md5(filename):
if not os.path.isfile(filename):
return
my_hash = hashlib.md5()
f = open(filename, 'rb')
while True:
b = f.read(8096)
if not b:
break
my_hash.update(b)
f.close()
return my_hash.hexdigest()
def get_token(self):
url = self.jms_url + '/api/v1/authentication/auth/'
query_args = {
"username": self.username,
"password": self.password
}
response = requests.post(url, data=query_args)
return json.loads(response.text)['token']
def get_user_info(self):
url = self.jms_url + '/api/v1/users/users/'
response = requests.get(url, headers=self.headers)
return json.loads(response.text)
def get_assets_label(self, labels_id):
url = self.jms_url + '/api/v1/assets/labels/' + labels_id + '/'
response = requests.get(url, headers=self.headers)
data_json = json.loads(response.text)
label = {
data_json.get("name"): data_json.get("value")
}
return label
def get_assets_list(self):
"""
:return: prometheus jons配置文件
"""
url = self.jms_url + '/api/v1/assets/assets/'
response = requests.get(url, headers=self.headers)
data_json = json.loads(response.text)
all_list = []
for i in data_json:
hostname = i.get("hostname")
instance_ip = i.get("ip")
instance = instance_ip + ":9100"
targets_value = [instance]
prom_data = {
"targets": targets_value,
}
labels_ids = i.get("labels")
labels = {}
for la in labels_ids:
label = self.get_assets_label(la)
for k in label:
v = label.get(k)
labels[k] = v
labels["instance"] = hostname
labels["addr"] = instance_ip
prom_data["labels"] = labels
# 判断非Linux机器:
if "system" in labels:
continue
#if labels.get("dept") != "qz":
# continue
print(prom_data)
all_list.append(prom_data)
# return prom_data
return all_list
jms = JumpServer()
data = jms.get_assets_list()
json_str = json.dumps(data, ensure_ascii=False)
with open('/data/prometheus/conf.d/jumpserver_new.json', 'w', encoding='utf-8') as json_file:
json_file.write(json_str)
json_file.close()
jumpserver_md5 = jms.get_file_md5("/data/prometheus/conf.d/jumpserver.json")
jumpserver_new_md5 = jms.get_file_md5("/data/prometheus/conf.d/jumpserver_new.json")
if jumpserver_md5 == jumpserver_new_md5:
print("no update")
else:
with open('/data/prometheus/conf.d/jumpserver.json', 'w', encoding='utf-8') as json_file:
print("reload jumpserver.json")
json_file.write(json_str)
json_file.close()