237 lines
6.8 KiB
Python
237 lines
6.8 KiB
Python
#!/usr/bin/python3
|
||
|
||
# 导入包
|
||
from tkinter import *
|
||
import tkinter.messagebox
|
||
import json
|
||
import socket
|
||
import os
|
||
|
||
|
||
serverConfig = {}
|
||
|
||
# 获取服务状态
|
||
def getState():
|
||
global serverConfig
|
||
for server in serverConfig["serverList"]:
|
||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||
sock.settimeout(1)
|
||
result = sock.connect_ex(('127.0.0.1', server["port"]))
|
||
if result == 0:
|
||
server["starting"] = True
|
||
else:
|
||
server["starting"] = False
|
||
sock.close()
|
||
|
||
# 读取服务配置文件
|
||
with open('server.json', 'rb') as f:
|
||
serverConfig = json.load(f)
|
||
getState()
|
||
|
||
# 获取服务配置信息
|
||
def getServer():
|
||
global listbox
|
||
global serverConfig
|
||
if (len(listbox.curselection()) <= 0):
|
||
tkinter.messagebox.showinfo(title='错误提示', message='请选择服务')
|
||
return
|
||
|
||
index = listbox.curselection()[0]
|
||
return serverConfig["serverList"][index]
|
||
|
||
def showList(isRefresh):
|
||
global listbox
|
||
global serverConfig
|
||
# 读取服务配置文件
|
||
with open('server.json', 'rb') as f:
|
||
serverConfig = json.load(f)
|
||
getState()
|
||
|
||
listbox.delete(0, END)
|
||
for server in (serverConfig['serverList']):
|
||
listbox.insert(END, f' 服务名称:{server["name"]} | 文件位置:{server["dir"]} | 端口:{server["port"]} | 描述:{server["desc"]} | 状态:{ "运行中" if server["starting"] == True else "未启动"}')
|
||
|
||
if isRefresh:
|
||
tkinter.messagebox.showinfo(title='消息提示', message='刷新成功')
|
||
|
||
# 控制台启动
|
||
def start():
|
||
server = getServer()
|
||
|
||
bat = f'''@echo off
|
||
cd {server["dir"]}
|
||
SET port={server["port"]}
|
||
for /f "usebackq tokens=1-5" %%a in (`netstat -ano ^| findstr %port%`) do (
|
||
if [%%d] EQU [LISTENING] (
|
||
set pid=%%e
|
||
)
|
||
)
|
||
echo close : %port% %pid%
|
||
if not "%pid%" == "" taskkill /f /pid %pid%
|
||
|
||
echo start
|
||
PING 127.1 -n 5 >nul
|
||
java -jar {server["args"]} {server["jar"]}
|
||
|
||
pause
|
||
exit'''
|
||
file = open("temp.bat", 'w', encoding='utf-8')
|
||
file.write(bat)
|
||
file.close()
|
||
# 开启cmd来执行bat文件,以便查看执行情况
|
||
os.system("start temp.bat")
|
||
|
||
# 后台启动
|
||
def startw():
|
||
server = getServer()
|
||
|
||
# 构建执行bat
|
||
bat = f'''@echo off
|
||
cd {server["dir"]}
|
||
SET port={server["port"]}
|
||
for /f "usebackq tokens=1-5" %%a in (`netstat -ano ^| findstr %port%`) do (
|
||
if [%%d] EQU [LISTENING] (
|
||
set pid=%%e
|
||
)
|
||
)
|
||
echo close : %port% %pid%
|
||
if not "%pid%" == "" taskkill /f /pid %pid%
|
||
|
||
echo start
|
||
PING 127.1 -n 5 >nul
|
||
javaw -jar {server["args"]} {server["jar"]}
|
||
|
||
pause
|
||
exit'''
|
||
file = open("temp.bat", 'w', encoding='utf-8')
|
||
file.write(bat)
|
||
file.close()
|
||
# 开启cmd来执行bat文件,以便查看执行情况
|
||
os.system("start temp.bat")
|
||
|
||
# 停止服务
|
||
def stop():
|
||
server = getServer()
|
||
|
||
# 构建执行bat
|
||
bat = f'''@echo off
|
||
SET port={server["port"]}
|
||
for /f "usebackq tokens=1-5" %%a in (`netstat -ano ^| findstr %port%`) do (
|
||
if [%%d] EQU [LISTENING] (
|
||
set pid=%%e
|
||
)
|
||
)
|
||
echo close : %port% %pid%
|
||
if not "%pid%" == "" taskkill /f /pid %pid%
|
||
|
||
pause
|
||
exit'''
|
||
|
||
file = open("temp.bat", 'w', encoding='utf-8')
|
||
file.write(bat)
|
||
file.close()
|
||
# 开启cmd来执行bat文件,以便查看执行情况
|
||
os.system("start temp.bat")
|
||
|
||
# 安装服务
|
||
def install():
|
||
server = getServer()
|
||
|
||
# 生成xml配置文件
|
||
xml = f'''
|
||
<service>
|
||
<id>{server["name"]}</id>
|
||
<name>{server["name"]}</name>
|
||
<description>{server["desc"]}</description>
|
||
<executable>java</executable>
|
||
<arguments> -jar {server["args"]} {server["jar"]}</arguments>
|
||
|
||
<!--服务启动方式:Automatic-自动,Manual-手动-->
|
||
<startmode>Automatic</startmode>
|
||
<!-- 日志配置 -->
|
||
<logpath>{os.path.abspath(os.path.dirname(__file__))}\{server["dir"]}\logs\winsw</logpath>
|
||
<log mode="none"/>
|
||
</service>
|
||
'''
|
||
file = open(f'{server["dir"]}/server.xml', 'w', encoding='utf-8')
|
||
file.write(xml)
|
||
file.close()
|
||
|
||
# 构建执行bat
|
||
bat = f'''@echo off
|
||
sc stop {server["name"]}
|
||
echo stop {server["name"]}
|
||
|
||
sc delete {server["name"]}
|
||
echo uninstall {server["name"]}
|
||
|
||
WinSW-x64.exe install {server["dir"]}\server.xml
|
||
echo install {server["name"]}
|
||
|
||
sc start {server["name"]}
|
||
echo start {server["name"]}
|
||
|
||
pause
|
||
exit'''
|
||
|
||
file = open("temp.bat", 'w', encoding='utf-8')
|
||
file.write(bat)
|
||
file.close()
|
||
# 开启cmd来执行bat文件,以便查看执行情况
|
||
os.system("start temp.bat")
|
||
|
||
# 卸载服务
|
||
def unInstall():
|
||
server = getServer()
|
||
|
||
# 构建执行bat
|
||
bat = f'''@echo off
|
||
sc stop {server["name"]}
|
||
echo stop {server["name"]}
|
||
|
||
sc delete {server["name"]}
|
||
echo uninstall {server["name"]}
|
||
|
||
pause
|
||
exit'''
|
||
|
||
file = open("temp.bat", 'w', encoding='utf-8')
|
||
file.write(bat)
|
||
file.close()
|
||
# 开启cmd来执行bat文件,以便查看执行情况
|
||
os.system("start temp.bat")
|
||
|
||
# 第1步,实例化object,建立窗口window
|
||
window = Tk()
|
||
# 第2步,给窗口的可视化起名字
|
||
window.title('window下SpringBoot部署程序')
|
||
# 第3步,设定窗口的大小(长 * 宽)
|
||
window.geometry('850x250') # 这里的乘是小x
|
||
window.configure(bg='#FFFFFF') # 这里的乘是小x
|
||
|
||
## 渲染各个服务 - 设置单选
|
||
Label(window, text='请选择对应服务操作', bg='#CCCCCC', height=2, font=(20)).pack()
|
||
|
||
listbox = Listbox(window, selectmode=SINGLE, font=(28), width=80, height=len(serverConfig['serverList']) + 1, activestyle="none", bd=0)
|
||
listbox.pack(fill=X, pady=10)
|
||
showList(False)
|
||
|
||
# 渲染按钮
|
||
buttonFrame = Frame(window, bg="#FFFFFF")
|
||
buttonFrame.pack(pady=20)
|
||
|
||
stratButton = Button(buttonFrame, text='启动(控制台)', command=start)
|
||
stratwButton = Button(buttonFrame, text='启动(后台)', command=startw)
|
||
stopButton = Button(buttonFrame, text='停止服务', command=stop)
|
||
installButton = Button(buttonFrame, text='安装服务(使用winsw安装到系统服务上)', command=install)
|
||
unInstallButton = Button(buttonFrame, text='卸载服务(从系统服务上卸载)', command=unInstall)
|
||
updateStateButton = Button(buttonFrame, text='刷新服务状态', command=lambda:showList(True))
|
||
|
||
stratButton.pack(side=LEFT, padx=10)
|
||
stratwButton.pack(side=LEFT, padx=10)
|
||
stopButton.pack(side=LEFT, padx=10)
|
||
installButton.pack(side=LEFT, padx=10)
|
||
unInstallButton.pack(side=LEFT, padx=10)
|
||
updateStateButton.pack(side=LEFT, padx=10)
|
||
window.mainloop()
|