diff --git a/.gitignore b/.gitignore index 5d947ca..cb2ac14 100644 --- a/.gitignore +++ b/.gitignore @@ -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/ diff --git a/WinSW-x64.exe b/WinSW-x64.exe new file mode 100644 index 0000000..c3fa517 Binary files /dev/null and b/WinSW-x64.exe differ diff --git a/build.bat b/build.bat new file mode 100644 index 0000000..9219886 --- /dev/null +++ b/build.bat @@ -0,0 +1 @@ +pyinstaller -F -w index.py -n winServerManage --distpath ./ \ No newline at end of file diff --git a/index.py b/index.py new file mode 100644 index 0000000..da3a911 --- /dev/null +++ b/index.py @@ -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''' + + {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() diff --git a/server.json b/server.json new file mode 100644 index 0000000..c5ae49a --- /dev/null +++ b/server.json @@ -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" + } + ] +} \ No newline at end of file