delangG-win-server/index.py
gongdelang 7d2fac006c 修改
2022-11-02 11:31:07 +08:00

266 lines
7.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/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 startCenter():
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%
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 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["name"]}.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["name"]}.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('900x250') # 这里的乘是小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)
stratCenterButton = Button(buttonFrame, text='启动(服务中心)', command=startCenter)
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)
stratCenterButton.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()