#!/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''' {server["name"]} {server["name"]} {server["desc"]} java -jar {server["args"]} {server["jar"]} Automatic {os.path.abspath(os.path.dirname(__file__))}\{server["dir"]}\logs\winsw ''' 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()