本程序使用python脚本完成,核心模块使用的是pyqt5(gui图形化)和elasticsearch,通过kibana的dev tools调用elasticsearch集群的api,Don’s say so much,上代码:
# -*- coding: utf-8 -*-
import json
import os
import sys
import threading
import webbrowser
from datetime import date
from urllib.parse import quote, unquote
import base64 as b64
import prettytable as pt
import pandas as pd
import requests
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QDate,QRectF,Qt
from PyQt5.QtWidgets import QWidget, QMessageBox, QCompleter, QApplication
from PyQt5.QtGui import QPainterPath, QPainter, QBrush, QColor, QCursor
from elasticsearch import Elasticsearch
from pandas import read_excel
from datetime import datetime, timedelta
help_txt = '''
_cat/indices?help 查看命令帮助
_cat/indices?v&h=index,storeSize&s=storeSize:desc 按照索引大小倒序排列
_cat/indices?s=ss:desc 查看所有索引信息
_cat/templates?v 查看模板名称列表
_template/logstash 查看logstash模板的内容
_cat/plugins?v 查看所有插件信息
_cat/nodes?v 查看所有ES节点信息
_cat/indices?v&h=i,tm&s=tm:desc 查看索引占用内存
_nodes/stats/jvm?pretty 查看节点jvm状态信息
'''
cat_list = [
"_cat/allocation?v",
"_cat/shards",
"_cat/shards/{index}",
"_cat/master",
"_cat/nodes",
"_cat/tasks",
"_cat/indices",
"_cat/indices/{index}",
"_cat/segments",
"_cat/segments/{index}",
"_cat/count",
"_cat/count/{index}",
"_cat/recovery",
"_cat/recovery/{index}",
"_cat/health",
"_cat/pending_tasks",
"_cat/aliases",
"_cat/aliases/{alias}",
"_cat/thread_pool",
"_cat/thread_pool/{thread_pools}",
"_cat/plugins?v",
"_cat/fielddata",
"_cat/fielddata/{fields}",
"_cat/nodeattrs",
"_cat/repositories",
"_cat/snapshots/{repository}",
"_cat/templates" ]
keep_indices=[".kibana_1", ".opendistro_security"]
normal_list = [
"_cat/indices?help",
"_cat/allocation?v&s=node:asc",
"_template/logstash",
"_cat/indices?v&h=index,storeSize&s=storeSize:desc",
"_cat/shards/*?v&h=index,shard,prirep,state,docs,store,ip,node&s=store:desc",
"_nodes?filter_path=**.mlockall",
"_nodes/stats/process?filter_path=**.max_file_descriptors",
"_cat/shards?v&h=index,shard,prirep,state,store&s=store:desc",
"_cat/nodes?format=json&filter_path=ip,name",
"_cluster/allocation/explain?pretty&filter_path=index,node_allocation_decisions.node_name,node_allocation_decisions.deciders.*",
"_cat/nodes?v=true&h=name,node*,heap*",
"_cluster/settings?pretty",
"_cat/indices?v&h=index,docs.count,store.size,segments.count&s=ss:desc",
"_cat/thread_pool?v&h=node_name,name,type,active,size,queue,queue_size,rejected,keep_alive,completed",
"_cat/thread_pool/bulk?v&h=node_name,name,type,active,size,queue,queue_size,rejected,keep_alive,completed",
"_tasks?detailed=true",
"_nodes/hot_threads",
"_cat/pending_tasks",
"_tasks?detailed=true&actions=*reindex",
"_tasks/node_id:task_id/_cancel",
"_cat/indices?v&h=i,tm&s=tm:desc",
"_cluster/allocation/explain",
"_cat/shards?v&h=index,shard,prirep,state,unassigned.reason",
"_cat/indices?s=ss:desc",
"_cluster/settings?flat_settings=true&filter_path=transient",
"_cat/shards?v&s=i:desc,n:asc",
"_nodes/stats/jvm?pretty",
"_cat/nodes?v&pretty",
"_nodes/stats/breaker?pretty",
"_cluster/stats?pretty",
"_cat/health?v&h=status",
"_cluster/health?level=indices",
"_cluster/health?level=shards",
"_flush",
"_cat/templates?v&pretty", "_cat/plugins?v" ]
normal_list.extend(cat_list)
method_list = ["GET","PUT","DELETE"]
button_style = '''
QPushButton
{text-align : center;
background-color : white;
font: bold;
border-color: gray;
border-width: 1px;
border-radius: 3px;
padding: 2px;
height : 14px;
border-style: outset;
font : 12px;}
QPushButton:hover
{text-align : center;
background-color : red;
font: bold;
border-color: gray;
border-width: 1px;
border-radius: 5px;
padding: 1px;
height : 14px;
border-style: outset;
font : 12px;}
QPushButton:pressed
{text-align : center;
background-color : yellow;
font: bold;
border-color: gray;
border-width: 1px;
border-radius: 5px;
padding: 1px;
height : 14px;
border-style: outset;
font : 12px;}
'''
end_time = datetime.utcnow().strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
start_time = (datetime.utcnow() - timedelta(minutes=15)).strftime('%Y-%m-%dT%H:%M:%S.%f')[:-3] + 'Z'
last_15m_json = {
"params": {
"index": "*",
"body": {
"sort": [
{
"@timestamp": {
"order": "desc",
"unmapped_type": "boolean"
}
}
],
"aggs": {
"2": {
"date_histogram": {
"field": "@timestamp",
"fixed_interval": "30s",
"time_zone": "Asia/Shanghai",
"min_doc_count": 1
}
}
},
"stored_fields": [
"*"
],
"query": {
"bool": {
"must": [
],
"filter": [
{
"match_all": {
}
},
{
"range": {
"@timestamp": {
"gte": start_time,
"lte": end_time,
"format": "strict_date_optional_time"
}
}
}
],
}
}
}
}
}
class RoundShadow(QWidget):
"""圆角边框类"""
def __init__(self, parent=None):
super(RoundShadow, self).__init__(parent)
self.border_width = 8
# 设置 窗口无边框和背景透明 *必须
self.setWindowOpacity(0.9) # 设置窗口透明度
self.setAttribute(Qt.WA_TranslucentBackground)
self.setWindowFlags(Qt.FramelessWindowHint)
def paintEvent(self, event):
# 阴影
path = QPainterPath()
path.setFillRule(Qt.WindingFill)
pat = QPainter(self)
pat.setRenderHint(pat.Antialiasing)
pat.fillPath(path, QBrush(Qt.white))
color = QColor(192, 192, 192, 50)
for i in range(10):
i_path = QPainterPath()
i_path.setFillRule(Qt.WindingFill)
ref = QRectF(10 - i, 10 - i, self.width() - (10 - i) * 2, self.height() - (10 - i) * 2)
# i_path.addRect(ref)
i_path.addRoundedRect(ref, self.border_width, self.border_width)
color.setAlpha(int(150 - i ** 0.5 * 50))
pat.setPen(color)
pat.drawPath(i_path)
# 圆角
pat2 = QPainter(self)
pat2.setRenderHint(pat2.Antialiasing) # 抗锯齿
pat2.setBrush(Qt.cyan)
pat2.setPen(Qt.transparent)
rect = self.rect()
rect.setLeft(-1)
rect.setTop(-1)
rect.setWidth(rect.width() - 1 )
rect.setHeight(rect.height() -1 )
pat2.drawRoundedRect(rect, 8, 8)
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.m_flag = True
self.m_Position = event.globalPos() - self.pos() # 获取鼠标相对窗口的位置
event.accept()
self.setCursor(QCursor(Qt.OpenHandCursor)) # 更改鼠标图标
def mouseMoveEvent(self, QMouseEvent):
try:
if Qt.LeftButton and self.m_flag:
self.move(QMouseEvent.globalPos() - self.m_Position) # 更改窗口位置
QMouseEvent.accept()
except:
pass
def mouseReleaseEvent(self, QMouseEvent):
self.m_flag = False
self.setCursor(QCursor(Qt.ArrowCursor))
class Ui_elktookits(RoundShadow,QWidget):
def __init__(self):
self.req_headers = {
"Accept": "text/plain, */*; q=0.01",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36",
"Accept-Encoding": "gzip, deflate",
"kbn-xsrf": "true",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "close"
}
data = read_excel('./password.xlsx').to_dict(orient ='list') #password.xlsx为存放用户名和密码的表格文件,内容见文末;
self.iplist = data['kibana_url']
self.user_pass_lst = data['user_pass']
self.name_lst = data['name']
self.ip_user_pass_dict = dict(zip(self.iplist,self.user_pass_lst))
self.name_ip_dict = dict(zip(self.name_lst,self.iplist))
super(Ui_elktookits, self).__init__()
self.setupUi()
def setupUi(self):
self.setObjectName("elktookits")
self.resize(754, 408)
self.pushButton = QtWidgets.QPushButton(self)
self.pushButton.setGeometry(QtCore.QRect(315, 100, 75, 22))
self.pushButton.setStyleSheet(button_style)
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPointSize(10)
self.pushButton.setFont(font)
self.pushButton.setObjectName("pushButton")
self.comboBox = QtWidgets.QComboBox(self)
self.comboBox.setGeometry(QtCore.QRect(100, 70, 291, 22))
self.comboBox.setObjectName("comboBox")
self.comboBox.addItems(normal_list)
self.comboBox.setEditable(True)
self.completer = QCompleter(normal_list)
self.completer.setCompletionMode(QCompleter.PopupCompletion)
self.comboBox.setCompleter(self.completer)
self.comboBox_2 = QtWidgets.QComboBox(self)
self.comboBox_2.setGeometry(QtCore.QRect(100, 40, 291, 22))
self.comboBox_2.setObjectName("comboBox_2")
self.comboBox_2.addItems(self.name_ip_dict.keys())
#self.comboBox_2.setEditable(True)
self.textBrowser = QtWidgets.QTextBrowser(self)
self.textBrowser.setGeometry(QtCore.QRect(2, 130, 748, 272))
self.textBrowser.setObjectName("textBrowser")
# self.textBrowser.setOpenExternalLinks(True)
# self.textBrowser.setReadOnly(True)
self.textBrowser.setText(help_txt)
self.label = QtWidgets.QLabel(self)
self.label.setGeometry(QtCore.QRect(170, 10, 321, 21))
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPointSize(14)
font.setBold(True)
font.setWeight(75)
self.label.setFont(font)
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(self)
self.label_2.setGeometry(QtCore.QRect(20, 40, 81, 20))
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPointSize(10)
font.setBold(False)
font.setWeight(50)
self.label_2.setFont(font)
self.label_2.setObjectName("label_2")
self.label_3 = QtWidgets.QLabel(self)
self.label_3.setGeometry(QtCore.QRect(20, 70, 81, 20))
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPointSize(10)
font.setBold(False)
font.setWeight(50)
self.label_3.setFont(font)
self.label_3.setObjectName("label_3")
self.label_4 = QtWidgets.QLabel(self)
self.label_4.setGeometry(QtCore.QRect(20, 100, 81, 20))
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPointSize(10)
font.setBold(False)
font.setWeight(50)
self.label_4.setFont(font)
self.label_4.setObjectName("label_4")
self.label_5 = QtWidgets.QLabel(self)
self.label_5.setGeometry(QtCore.QRect(400, 20, 331, 101))
self.label_5.setObjectName("label_5")
self.comboBox_3 = QtWidgets.QComboBox(self)
self.comboBox_3.setGeometry(QtCore.QRect(100, 100, 50, 20))
self.comboBox_3.setObjectName("comboBox_3")
self.comboBox_3.addItems(method_list)
self.pushButton_2 = QtWidgets.QPushButton(self)
self.pushButton_2.setGeometry(QtCore.QRect(730, 0, 23, 23))
self.pushButton_2.setStyleSheet(button_style)
self.pushButton_2.setAutoDefault(False)
self.pushButton_2.setFlat(False)
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_3 = QtWidgets.QPushButton(self)
self.pushButton_3.setGeometry(QtCore.QRect(245, 100, 75, 22))
self.pushButton_3.setStyleSheet(button_style)
self.pushButton_3.setAutoDefault(False)
self.pushButton_3.setFlat(False)
self.pushButton_3.setObjectName("pushButton_3")
self.dateEdit = QtWidgets.QDateEdit(self)
self.dateEdit.setGeometry(QtCore.QRect(150, 100, 95, 20))
self.dateEdit.setObjectName("dateEdit")
self.dateEdit.setMinimumDate(QtCore.QDate(2019, 1, 1))
self.dateEdit.setCalendarPopup(True)
self.dateEdit.setDate(QDate.currentDate())
self.commandLinkButton = QtWidgets.QCommandLinkButton(self)
self.commandLinkButton.setGeometry(QtCore.QRect(320, 5, 59, 31))
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPointSize(8)
self.commandLinkButton.setFont(font)
self.commandLinkButton.setIconSize(QtCore.QSize(10, 10))
self.commandLinkButton.setAutoDefault(False)
self.commandLinkButton.setDefault(False)
self.commandLinkButton.setObjectName("commandLinkButton")
self.retranslateUi(self)
QtCore.QMetaObject.connectSlotsByName(self)
self.pushButton.clicked.connect(self.exec_command)
self.pushButton_2.clicked.connect(self.exitapp)
self.pushButton_3.clicked.connect(self.GenerateResult)
self.dateEdit.dateChanged.connect(self.getindexinfo)
self.commandLinkButton.clicked.connect(self.show_image)
# self.comboBox_3.currentIndexChanged.connect(self.put_hook) # 点击下拉列表,触发对应事件
def retranslateUi(self, elktookits):
_translate = QtCore.QCoreApplication.translate
elktookits.setWindowTitle(_translate("elktookits", "elktookits"))
self.pushButton.setText(_translate("elktookits", "执行命令"))
self.pushButton_3.setText(_translate("elktookits", "导出结果"))
self.label.setText(_translate("elktookits", "ELK命令执行工具"))
self.label_2.setText(_translate("elktookits", "选择IP地址:"))
self.label_3.setText(_translate("elktookits", "选择命令:"))
self.label_4.setText(_translate("elktookits", "选择方法:"))
self.label_5.setText(_translate("elktookits", "_cat/indices?help 查看命令帮助\n"
"_cat/indices?v&h=index,storeSize&s=storeSize:desc \n"
" 按照索引大小倒序排列\n"
"_cat/indices?s=ss:desc 查看所有索引信息\n"
"_cat/templates?v 查看模板名称列表\n"
" _template/logstash 查看logstash模板的内容\n"
" _nodes 查看所有ES节点IP(仅支持云上ES)"))
self.pushButton_2.setText(_translate("elktookits", chr(9633)))
self.commandLinkButton.setText(_translate("elktookits", "帮助"))
def exitapp(self):
sys.exit(0)
# def put_hook(self):
# if self.comboBox_3.currentText() == 'PUT':
# self.textBrowser.setReadOnly(False)
# else:
# self.textBrowser.setReadOnly(True)
def get_security_authentication(self, ip, username, password):
kibana_url = "http://" + ip + "/api/v1/auth/login"
kibana_headers = {
"kbn-version": "7.6.2",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36",
"Content-Type": "application/json",
"Accept": "*/*",
"Origin": "http://{0}".format(ip),
"Referer": "http://{0}/app/login?nextUrl=%2Fapp%2Fhome".format(ip),
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "close"
}
kibana_json = {
"password": password,
"username": username
}
try:
response = requests.post(kibana_url, headers = kibana_headers, json=kibana_json)
self.security_authentication = response.cookies.items()[0][1]
return self.security_authentication
except Exception as e:
self.textBrowser.setText(str(e))
def get_req_content(self,kibana_ip):
self.username = self.ip_user_pass_dict[kibana_ip].split('/')[0]
self.password = self.ip_user_pass_dict[kibana_ip].split('/')[1]
self.basicauth = b64.b64encode("{0}:{1}".format(self.username,self.password).encode('utf-8')).decode('utf-8')
self.req_headers = {
"Accept": "text/plain, */*; q=0.01",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.82 Safari/537.36",
"kbn-xsrf": "kibana",
"Origin": "http://{0}".format(kibana_ip),
"Referer": "http://{0}/app/dev_tools".format(kibana_ip),
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "close",
"Authorization": "Basic {0}".format(self.basicauth)
}
def get_cluster_nodes(self, kibana_ip):
api_url = "http://" + kibana_ip + "/api/console/proxy?path=_nodes?format=json&method=GET"
try:
result = requests.post(api_url, headers=self.req_headers, timeout=10)
result = json.loads(result.text)['nodes']
return result
except Exception as e:
self.textBrowser.setText(str(e))
def get_polices_lst(self,ip):
api_url = 'http://{}/api/ism/policies?from=0&search=&size=20&sortDirection=desc&sortField=id'.format(ip)
headers = {
"Accept": "application/json, text/plain, */*",
"kbn-version": "7.6.2",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.134 Safari/537.36",
"Referer": "http://{}/app/opendistro_index_management_kibana".format(ip),
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "close"
}
result = requests.get(api_url, headers=headers)
result = result.content.decode()
policies = json.loads(result)['response']['policies']
return [ policy['id'] for policy in policies ]
def get_doc_count(self,hostlst,username,password):
self.hostlst = hostlst
self.username = username
self.password = password
self.es = Elasticsearch(
self.hostlst,
verify_certs=True,
ca_certs='Service.cer', # 证书文件,集群开启ssl安全协议
http_auth=(self.username, self.password),
scheme="https",
port=9200,
)
self.keep_indices = [".kibana_1", ".opendistro_security"]
today = date.today()
tomorror = date.today() + timedelta(days=1)
self.keep_days = [str(today).replace("-", "."), str(tomorror).replace("-", ".")]
indics = []
self.sumary = 0
for index in self.es.indices.get('*'): indics.append(index)
def _get_doc_count():
self.cursor = self.textBrowser.textCursor()
try:
for indic_name in indics:
index_date = str(indic_name).split('-')[-1]
count = self.es.cat.count(indic_name, params={"format": "json"})[0]["count"]
self.textBrowser.append(indic_name)
self.textBrowser.moveCursor(self.cursor.End)
if int(count) == 0 and indic_name not in self.keep_indices and index_date not in self.keep_days:
self.sumary += 1
self.textBrowser.append(indic_name + " will be deleted............")
self.es.indices.delete(indic_name)
self.textBrowser.append(indic_name + " has been deleted successfully.")
self.textBrowser.moveCursor(self.cursor.End)
except Exception as e:
self.textBrowser.append(str(e))
t = threading.Thread(target=_get_doc_count, daemon=True)
t.start()
def exec_command(self):
self.textBrowser.setReadOnly(False)
choose_method = self.comboBox_3.currentText()
choose_command=quote(self.comboBox.currentText())
kibana_ip = self.name_ip_dict[self.comboBox_2.currentText()]
self.get_req_content(kibana_ip)
result_nodes_req = self.get_cluster_nodes(kibana_ip)
api_url = "http://" + kibana_ip + "/api/console/proxy?path=" + choose_command + "&method=" + choose_method
if choose_method == "PUT":
txt_data = self.textBrowser.toPlainText()
try:
json_data = json.loads(txt_data)
result = requests.post(api_url, headers=self.req_headers , json = json_data,timeout=10)
self.textBrowser.setText(unquote(api_url,encoding = 'utf-8' ,errors = 'replace'))
self.textBrowser.append(result.text)
except Exception as e:
self.textBrowser.setText(str(e))
elif choose_method == "GET":
self.textBrowser.clear()
try:
if choose_command == "_clearzero":
try:
nodes_iplist = [ result_nodes_req[node_name]['settings']['network']['publish_host'] for node_name in result_nodes_req.keys()]
# start_time = time.time()
self.get_doc_count(nodes_iplist,self.username,self.password)
# self.textBrowser.append(
# 'runtime is:%s,the count is:%d' % (time.time() - start_time, self.sumary))
except Exception as e:
self.textBrowser.append(str(e))
elif choose_command == "_last15m":
req_url = "http://" + kibana_ip + "/internal/search/es"
req_headers = {
"kbn-version": "7.6.2",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.5304.107 Safari/537.36",
"Content-Type": "application/json",
"Accept": "*/*",
"Origin": kibana_ip,
"Referer": kibana_ip + "/app/discover",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
"Connection": "close"
}
try:
result = requests.post(req_url, headers=req_headers,
json=last_15m_json,
timeout=10)
result = json.loads(result.text)['rawResponse']['_shards']
self.textBrowser.append(json.dumps(result))
except Exception as e:
self.textBrowser.setText(str(e))
else:
nodes_iplist = [ 'https://' + result_nodes_req[node_name]['settings']['network']['publish_host'] + ':9200' for node_name in result_nodes_req.keys()]
result = requests.post(api_url, headers=self.req_headers , timeout=10)
if "_nodes" == choose_command:
self.textBrowser.setReadOnly(True)
self.textBrowser.setOpenExternalLinks(True)
tb = pt.PrettyTable()
for node_name in result_nodes_req.keys():
tb.field_names = ["节点名称", "通讯地址", "ip地址"]
tb.add_row([result_nodes_req[node_name]['name'] , result_nodes_req[node_name]['transport_address'], result_nodes_req[node_name]['settings']['network']['publish_host']])
kibana_link = "http://" + kibana_ip
self.textBrowser.append(str(tb))
self.textBrowser.append("Es Cluster: {0}".format(str(nodes_iplist)))
self.textBrowser.append('-' * 100 )
self.textBrowser.append('Account: {0} | {1}'.format(self.username,self.password))
self.textBrowser.append("<style>a{TEXT-DECORATION:none}a:hover{TEXT-DECORATION:underline}a:active{color:#0000FF}</style><a href=" + kibana_link + ">" + "Kibana: " + kibana_link + "</a>")
elif "_policies" == choose_command:
policy_lst = self.get_polices_lst(kibana_ip)
for policy_id in policy_lst:
self.textBrowser.append(policy_id)
else:
self.textBrowser.setText("api_command: {0}".format("curl -k -XGET -u \'" + self.ip_user_pass_dict[kibana_ip].replace('/',':') + '\' ' + unquote(nodes_iplist[0] + '/' + choose_command ,encoding = 'utf-8' ,errors = 'replace')))
self.textBrowser.append(result.text)
except Exception as e:
self.textBrowser.setText(str(e))
elif choose_method == "DELETE":
choose_command = self.comboBox.currentText()
api_url = "http://" + kibana_ip + "/api/console/proxy?path=" + choose_command + "&method=" + choose_method
if choose_command in ["*","logstash*","logstash-*"] or "PROD" in self.comboBox_2.currentText():
self.textBrowser.setText("不允许此操作")
self.textBrowser.append("curl -H 'kbn-xsrf:false' -XPOST" + api_url)
else:
A = QMessageBox.question(self, '确认', '是否确定删除索引' + choose_command, QMessageBox.Yes | QMessageBox.No)
if A == QMessageBox.Yes:
try:
result = requests.post(api_url, headers=self.req_headers ,timeout=10)
self.textBrowser.setText("api_url: {0}".format(unquote(api_url,encoding = 'utf-8' ,errors = 'replace')))
self.textBrowser.append(str(result.text))
except Exception as e:
self.textBrowser.setText("api_url: {0}".format(unquote(api_url,encoding = 'utf-8' ,errors = 'replace')))
self.textBrowser.append(str(e))
else:
self.textBrowser.setText('取消删除操作' + '\n')
def GenerateResult(self):
self.textBrowser.setText("Generating excel result......")
userhome = os.getenv("USERPROFILE")
savepath = userhome + "\\Desktop\\"
save_data = []
kibana_ip = self.name_ip_dict[self.comboBox_2.currentText()]
self.get_req_content(kibana_ip)
api_url = "http://" + kibana_ip + "/api/console/proxy?path=" + quote(self.comboBox.currentText() + "&format=json") + "&method=" + self.comboBox_3.currentText()
try:
result = requests.post(api_url, headers=self.req_headers, timeout=10)
result = json.loads(result.text)
title = result[0].keys()
title_lst = [ x for x in title]
for record in result:
save_data.append(record)
data = pd.DataFrame(save_data)
data = data[title_lst]
data.to_excel(savepath + self.comboBox_2.currentText() + "_elktookit_result.xlsx", sheet_name='统计结果', index=False) # 生成表格文件,方便查阅,查看所有分片信息时比较实用。
self.textBrowser.append("Generate excel result file successfully on your desktop.")
except Exception as e:
self.textBrowser.append(str(e))
def getindexinfo(self):
self.textBrowser.clear()
kibana_ip = self.name_ip_dict[self.comboBox_2.currentText()]
self.get_req_content(kibana_ip)
choose_day = self.dateEdit.text()
year = choose_day.split('/')[0]
month = choose_day.split('/')[1]
day = choose_day.split('/')[2]
if int(month) < 10:
month = '0' + str(month)
if int(day) < 10:
day = '0' + str(day)
choose_day = year +'.' + str(month) + '.' + str(day)
choose_command = "_cat/indices/" + self.comboBox.currentText() + "*" + str(choose_day) + "*?v"
try:
api_url = "http://" + kibana_ip + "/api/console/proxy?path=" + choose_command + "&method=GET"
result = requests.post(api_url, headers=self.req_headers , timeout=10)
self.textBrowser.setText("api_url: {0}".format(unquote(api_url,encoding = 'utf-8' ,errors = 'replace')))
self.textBrowser.append(result.text)
except Exception as e:
self.textBrowser.setText(str(e))
def show_image(self):
webbrowser.open('help.html') #help.html帮助文档,可以自己发挥
if __name__ == '__main__':
app = QApplication(sys.argv)
form = QWidget()
w = Ui_elktookits()
w.show()
sys.exit(app.exec_())
password.xlsx内容:

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




