This commit is contained in:
gongdelang 2022-10-19 14:41:45 +08:00
parent d056c491a6
commit 85277ad67d
5 changed files with 253 additions and 0 deletions

5
.gitignore vendored
View File

@ -16,3 +16,8 @@ bin-release/
# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties`
# should NOT be excluded as they contain compiler settings and other important
# information for Eclipse / Flash Builder.
temp.bat
winServerManage.exe
winServerManage.spec
build/
peer3/

BIN
WinSW-x64.exe Normal file

Binary file not shown.

1
build.bat Normal file
View File

@ -0,0 +1 @@
pyinstaller -F -w index.py -n winServerManage --distpath ./

235
index.py Normal file
View File

@ -0,0 +1,235 @@
#!/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)
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()

12
server.json Normal file
View File

@ -0,0 +1,12 @@
{
"serverList":[
{
"dir":"peer3",
"name":"kd-peer3",
"port":8763,
"desc":"注册服务3",
"args":"-Xms128m -Xmx128m -Xmn10m -XX:NewSize=10m",
"jar":"eureka-service-0.0.1-SNAPSHOT.jar"
}
]
}