import urllib3 import requests import time import PyQt5 import base64 import json import linecache from bwh_add_host import bwh_add_host #from PyQt5.QtWidgets import * from PyQt5.Qt import * from PyQt5.QtGui import * from PyQt5.QtCore import * class bwh_controls(QWidget): ''' 控制窗口 参数说明: 与主窗体类相同(参见bwh_ma.py) ''' def __init__(self,fa,TAR,head,web_payload,trans): super().__init__() self.fa = fa self.TAR = TAR self.head = head self.web_payload = web_payload self.timer = QTimer(self)#用于定时隐藏按钮的QTimer类 self.trans = trans self.initUI() def initUI(self): self.shell_url = self.TAR+'basicShell/exec'#shell API的URL #布局初始化 self.lft_main_layout = QVBoxLayout() self.lft_down_layout = QGridLayout() self.lft_layout = QFormLayout() self.rht_layout = QVBoxLayout() self.send_layout = QHBoxLayout() self.mainlayout = QGridLayout() #控件初始化 self.lft_layout.setFormAlignment(Qt.AlignAbsolute) self.start_btn = QPushButton(self.tr("Start")) self.start_btn.resize(50,50) self.start_lab = QLabel(self.tr("Start success")) self.start_lab.setVisible(False) self.stop_btn = QPushButton(self.tr("Stop")) self.stop_lab = QLabel(self.tr("Stop success")) self.stop_lab.setVisible(False) self.kill_btn = QPushButton(self.tr("Kill")) self.kill_lab = QLabel(self.tr("Kill success")) self.kill_lab.setVisible(False) self.restart_btn = QPushButton(self.tr("Restart")) self.restart_lab = QLabel(self.tr("Restart success")) self.restart_lab.setVisible(False) self.shell_label = QLabel(self.tr("Basic shell")) self.shell_btn = QPushButton(self.tr("Send")) self.lan_label = QLabel(self.tr("Language")) self.lan_input = QComboBox() self.lan_input.addItem("English") self.lan_input.addItem("简体中文") self.lan_input.setCurrentIndex(self.trans) self.lan_btn = QPushButton(self.tr("Confirm")) self.shell_output = QTextEdit() self.shell_input = QLineEdit() self.shell_output.setReadOnly(True) self.dual_host_view = QListWidget() self.dual_host_delete = QPushButton(self.tr("delete")) self.dual_host_add = QPushButton(self.tr("add host")) self.dual_host_select = QPushButton(self.tr("select")) self.current_host_label = QLabel(self.tr("current host:")) self.current_host = QLabel() self.lft_layout.setWidget(0,QFormLayout.LabelRole,self.start_btn) self.lft_layout.setWidget(0,QFormLayout.FieldRole,self.start_lab) self.lft_layout.setWidget(1,QFormLayout.LabelRole,self.stop_btn) self.lft_layout.setWidget(1,QFormLayout.FieldRole,self.stop_lab) self.lft_layout.setWidget(2,QFormLayout.LabelRole,self.kill_btn) self.lft_layout.setWidget(2,QFormLayout.FieldRole,self.kill_lab) self.lft_layout.setWidget(3,QFormLayout.LabelRole,self.restart_btn) self.lft_layout.setWidget(3,QFormLayout.FieldRole,self.restart_lab) self.lft_layout.setWidget(4,QFormLayout.LabelRole,self.lan_label) self.lft_layout.setWidget(4,QFormLayout.FieldRole,self.lan_input) self.lft_layout.setWidget(5,QFormLayout.FieldRole,self.lan_btn) self.lft_layout.setWidget(6,QFormLayout.LabelRole,self.current_host_label) self.lft_layout.setWidget(6,QFormLayout.FieldRole,self.current_host) self.lft_layout.setRowWrapPolicy(QFormLayout.DontWrapRows) self.lft_down_layout.addWidget(self.dual_host_view,0,0,3,3) self.lft_down_layout.addWidget(self.dual_host_add,3,0,1,1) self.lft_down_layout.addWidget(self.dual_host_delete,3,1,1,1) self.lft_down_layout.addWidget(self.dual_host_select,3,2,1,1) self.lft_main_layout.addLayout(self.lft_layout) self.lft_main_layout.addLayout(self.lft_down_layout) self.send_layout.addWidget(self.shell_input) self.send_layout.addWidget(self.shell_btn) self.mainlayout.setColumnStretch(0,1) self.mainlayout.setColumnStretch(1,4) self.rht_layout.addWidget(self.shell_label) self.rht_layout.addWidget(self.shell_output) self.rht_layout.addLayout(self.send_layout) self.restart_btn.clicked.connect(self.restart_event) self.start_btn.clicked.connect(self.start_event) self.stop_btn.clicked.connect(self.stop_event) self.kill_btn.clicked.connect(self.kill_event) self.shell_btn.clicked.connect(self.shell_event) self.lan_btn.clicked.connect(self.lan_event) self.dual_host_add.clicked.connect(self.dual_host_add_event) self.dual_host_delete.clicked.connect(self.dual_host_delete_event) self.dual_host_select.clicked.connect(self.dual_host_select_event) self.mainlayout.addLayout(self.lft_main_layout,0,0) self.mainlayout.addLayout(self.rht_layout,0,1) self.setLayout(self.mainlayout) self.dual_host_view_update() def restart_event(self): '''重启VPS''' self.timer.timeout.connect(lambda:self.label_event(self.restart_lab))#QTimer与隐藏按钮的方法挂钩 self.timer.start(10*1000)#默认显示10秒 self.restart_data = requests.get(self.TAR+'restart',headers=self.head,params=self.web_payload,timeout=500).json() if(self.restart_data['error'] == 0): self.restart_lab.setVisible(True) else: self.restart_lab.setText(self.tr("Restart failed, error code = %d"%(self.restart_data['error']))) self.restart_lab.setVisible(True) def start_event(self): '''启动VPS''' self.timer.timeout.connect(lambda:self.label_event(self.start_lab)) self.timer.start(10*1000) self.start_data = requests.get(self.TAR+'start',headers=self.head,params=self.web_payload,timeout=500).json() if(self.start_data['error'] == 0): self.start_lab.setVisible(True) else: self.start_lab.setText(self.tr("Start failed, error code = %d"%(self.start_data['error']))) self.start_lab.setVisible(True) def stop_event(self): '''停止VPS''' self.timer.timeout.connect(lambda:self.label_event(self.stop_lab)) self.timer.start(10*1000) self.stop_data = requests.get(self.TAR+'stop',headers=self.head,params=self.web_payload,timeout=500).json() if(self.stop_data['error'] == 0): self.stop_lab.setVisible(True) else: self.stop_lab.setText(self.tr("Stop failed, error code = %d"%(stop_data['error']))) self.stop_lab.setVisible(True) def kill_event(self): '''强制停机''' self.timer.timeout.connect(lambda:self.label_event(self.kill_lab)) self.timer.start(10*1000) self.kill_data = requests.get(self.TAR+'kill',headers=self.head,params=self.web_payload,timeout=500).json() if(self.restart_data['error'] == 0): self.kill_lab.setVisible(True) else: self.kill_lab.setText(self.tr("Kill failed, error code = %d"%(restart_data['error']))) self.kill_lab.setVisible(True) def shell_event(self): '''命令行方法''' script = self.shell_input.text() shell_payload = self.web_payload shell_payload['command'] = script self.shell_output.insertPlainText('[root@#]'+script+'\n')#模拟终端的输出 self.shell_input.clear()#点击发送按钮后清空输入框 data = requests.get(self.shell_url,headers=self.head,params=shell_payload,timeout=500).json() if data['error'] == 0: self.shell_output.insertPlainText(data['message']+'\n') else: self.shell_output.insertPlainText(self.tr("Error!\n, Error_code : %d"%(data['error']))) self.shell_output.moveCursor(QTextCursor.End) def lan_event(self): '''变更语言的方法''' #读取本地配置文件 num = 0 with open(".\data.ini",'rb') as f: self.lan_data = f.readlines() with open(".\data.ini",'wb') as f: for line in self.lan_data: if num == self.dual_host_view.currentRow() + 1: data = base64.b64decode(line) data = json.loads(data.decode()) data['lan'] = self.lan_input.currentIndex() f.write(base64.b64encode(json.dumps(data).encode())) f.write('\n'.encode()) else: f.write(line) num += 1 a = QMessageBox() #写入成功提示 a.information(a,self.tr("Success"),self.tr("Language will be changed after resrart the application")) def label_event(self,label): '''隐藏控件的方法''' label.setVisible(False) def dual_host_view_update(self): self.dual_host_view.clear() self.file = open(".\data.ini",'rb') fr = True tmp_i = 0 for lines in self.file: if not len(lines.strip()): continue if fr: self.dual_host_currentindex = int(base64.b64decode(lines).decode()) fr = False else: tmp_data = json.loads(base64.b64decode(lines).decode()) self.dual_host_view.addItem(tmp_data['name']) if tmp_i == self.dual_host_currentindex: self.current_host.setText(tmp_data['name']) tmp_i += 1 self.dual_host_view.setCurrentRow(self.dual_host_currentindex-1) self.dual_host_view.update() def dual_host_add_event(self): if bwh_add_host(self.trans).exec_() == QDialog.Accepted: self.dual_host_view_update() def dual_host_delete_event(self): num = 0 a = QMessageBox.warning(self,self.tr("Warning"),self.tr("host data will be deleted!"),QMessageBox.Yes|QMessageBox.No) if a == QMessageBox.Yes: with open(".\data.ini",'rb') as f: self.tmp_data = f.readlines() with open(".\data.ini",'wb') as f: for line in self.tmp_data: if not len(line.strip()): pass if num == self.dual_host_view.currentRow() + 1: pass else: f.write(line) num += 1 self.dual_host_view_update() def dual_host_select_event(self): num = 0 with open(".\data.ini",'rb') as f: self.tmp_data = f.readlines() with open(".\data.ini",'wb') as f: for x in self.tmp_data: if not len(x.strip()): pass if num == 0: f.write(base64.b64encode(str(self.dual_host_view.currentRow()+1).encode())) f.write('\n'.encode()) else: f.write(x) num += 1 a = QMessageBox() #写入成功提示 a.information(a,self.tr("Success"),self.tr("host will be changed after resrart the application"))