Browse Source

实现基本的服务注册及服务启动停止

master
VIVIMAN 3 years ago
parent
commit
62183e4b59
  1. 53
      golang_learn/data_func/go_to_gui/main.go
  2. 2
      golang_learn/data_func/go_to_registry/demo/Demo.go
  3. 89
      golang_learn/data_func/go_to_service2/main.go
  4. 147
      golang_learn/data_func/go_to_windows/main.go
  5. 12
      golang_learn/data_func/go_to_windows/winService.go

53
golang_learn/data_func/go_to_gui/main.go

@ -0,0 +1,53 @@
package main
import (
"github.com/lxn/walk"
"log"
)
func main() {
mw, err := walk.NewMainWindow()
if err != nil {
log.Fatal(err)
}
//托盘图标文件
icon, err := walk.Resources.Icon("E:/icon.ico")
if err != nil {
log.Fatal(err)
}
ni, err := walk.NewNotifyIcon(mw)
if err != nil {
log.Fatal(err)
}
defer ni.Dispose()
if err := ni.SetIcon(icon); err != nil {
log.Fatal(err)
}
if err := ni.SetToolTip("鼠标在icon上悬浮的信息."); err != nil {
log.Fatal(err)
}
ni.MouseDown().Attach(func(x, y int, button walk.MouseButton) {
if button != walk.LeftButton {
return
}
if err := ni.ShowCustom("Walk 任务栏通知标题", "walk 任务栏通知内容", nil); err != nil {
log.Fatal(err)
}
})
exitAction := walk.NewAction()
if err := exitAction.SetText("右键icon的菜单按钮"); err != nil {
log.Fatal(err)
}
//Exit 实现的功能
exitAction.Triggered().Attach(func() { walk.App().Exit(0) })
if err := ni.ContextMenu().Actions().Add(exitAction); err != nil {
log.Fatal(err)
}
if err := ni.SetVisible(true); err != nil {
log.Fatal(err)
}
if err := ni.ShowInfo("Walk NotifyIcon Example", "Click the icon to show again."); err != nil {
log.Fatal(err)
}
mw.Run()
}

2
golang_learn/data_func/go_to_registry/demo/Demo.go

@ -28,6 +28,8 @@ func main() {
key.SetStringsValue(`字符串数组`, []string{`hello`, `world`})
// 写入:二进制
key.SetBinaryValue(`二进制`, []byte{0x11, 0x23})
// 写入:设置扩展字符串值
key.SetExpandStringValue(`扩展字符串`, `helloBBB`)
//key.SetBinaryValue(`新增123`, []byte{0x02, 0x12})
// 读取:字符串

89
golang_learn/data_func/go_to_service2/main.go

@ -0,0 +1,89 @@
package main
import (
"fmt"
"github.com/shirou/gopsutil/winservices"
"golang.org/x/sys/windows/svc/mgr"
"log"
)
func main() {
s, err := NewWinService("GWY20_Mysql")
// s, err := NewWinService("GWY20_Tomcat")
// s, err := NewWinService("nginx")
if s == nil || err != nil {
log.Print("发生异常:", err)
return
}
err = s.StartService()
if err != nil {
log.Print("启动异常:", err)
} else {
log.Print("启动成功!")
}
}
// 启动一个服务
func (s *Service) StartService() error {
return StartService(s.Name)
}
// 启动一个服务
func StartService(name string) error {
m, err := mgr.Connect()
if err != nil {
return err
}
defer m.Disconnect()
s, err := m.OpenService(name)
if err != nil {
return fmt.Errorf("could not access service: %v", err)
}
defer s.Close()
err = s.Start("is", "manual-started")
if err != nil {
return fmt.Errorf("could not start service: %v", err)
}
return nil
}
// 新建一个Service对象
func NewWinService(serviceName string) (*Service, error) {
winService, err := winservices.NewService(serviceName)
if err != nil {
return nil, err
}
result := &Service{
Name: serviceName,
srv: winService,
}
log.Print("测试问题:", result)
err = result.getServiceDetail()
return result, err
}
// 定义Service对象
type Service struct {
Name string
srv *winservices.Service
Config mgr.Config
Status winservices.ServiceStatus
}
// 得到Service信息
func (s *Service) getServiceDetail() error {
defer func() {
if err := recover(); err != nil {
return
}
}()
err := s.srv.GetServiceDetail()
if err != nil {
// 服务打开失败
return err
}
s.Name = s.srv.Name
s.Status = s.srv.Status
s.Config = s.srv.Config
return nil
}

147
golang_learn/data_func/go_to_windows/main.go

@ -1,5 +1,6 @@
// +build windows
// +build 386
package main
import (
@ -8,6 +9,7 @@ import (
. "github.com/lxn/walk/declarative"
"github.com/lxn/win"
"golang.org/x/sys/windows"
"golang.org/x/sys/windows/registry"
"os/exec"
"syscall"
"time"
@ -23,12 +25,14 @@ type myService struct {
text string
serviceName string
labelState *walk.Label
btnRegister *walk.PushButton
btnStart *walk.PushButton
btnStop *walk.PushButton
}
var app myApp
var service1, service3 myService
var path string
func init() {
app.title = "公务员管理系统-运行监控"
@ -37,25 +41,32 @@ func init() {
serviceName: "GWY20_Mysql",
}
service3 = myService{
text: "公务员系统",
text: "消防系统",
serviceName: "GWY20_Tomcat",
}
path = `D:\hzb2021`
}
func main() {
_ = getWindows()
walk.App().SetProductName(app.title)
walk.App().SetOrganizationName("dwt")
walk.App().SetOrganizationName("网新")
_ = service1.labelState.SetText("未安装")
_ = service3.labelState.SetText("未安装")
service1.btnRegister.Clicked().Attach(func() {
registerService(service1)
})
service1.btnStart.Clicked().Attach(func() {
startService(service1)
})
service1.btnStop.Clicked().Attach(func() {
stopService(service1)
})
service3.btnRegister.Clicked().Attach(func() {
registerService(service3)
})
service3.btnStart.Clicked().Attach(func() {
startService(service3)
})
@ -70,10 +81,11 @@ func main() {
app.mw.Run()
}
func setServiceState(service myService, msg string, btnStartStatus bool, btnStopStatus bool) {
func setServiceState(service myService, msg string, btnStartStatus, btnStopStatus, btnRegisterStatus bool) {
_ = service.labelState.SetText(msg)
service.btnStart.SetEnabled(btnStartStatus)
service.btnStop.SetEnabled(btnStopStatus)
service.btnRegister.SetEnabled(btnRegisterStatus)
}
// 刷新服务状态的协程程序
@ -82,21 +94,60 @@ func flushServiceStat(service myService) {
winService, err := NewWinService(service.serviceName)
if winService == nil || err != nil {
if err == windows.ERROR_SERVICE_DOES_NOT_EXIST {
setServiceState(service, "未安装", false, false)
setServiceState(service, "未安装", false, false, true)
} else {
setServiceState(service, "服务打开失败", false, false)
setServiceState(service, "服务打开失败", false, false, false)
}
} else {
if winService.IsStop() {
setServiceState(service, "已经停止", true, false)
setServiceState(service, "已经停止", true, false, false)
} else if winService.IsRunning() {
setServiceState(service, "正在运行", false, true)
setServiceState(service, "正在运行", false, true, false)
}
}
time.Sleep(time.Second)
}
}
// 注册服务
func registerService(service myService) {
if service.serviceName == "GWY20_Mysql" {
// 注册 MYSQL 服务
registerWindows(service.serviceName,
`SYSTEM\ControlSet001\Services\GWY20_Mysql`,
`LocalSystem`,
`GWY20_Mysql`,
fmt.Sprintf(`%s\mysql\bin\mysqld GWY20_Mysql`, path))
registerWindows(service.serviceName,
`SYSTEM\CurrentControlSet\Services\GWY20_Mysql`,
`LocalSystem`,
`GWY20_Mysql`,
fmt.Sprintf(`%s\mysql\bin\mysqld --defaults-file=%smysql\my.ini GWY20_Mysql`, path, path))
} else {
// 注册 TOMCAT 服务
registerWindows(service.serviceName,
`SYSTEM\ControlSet001\Services\GWY20_Tomcat`,
`NT Authority\LocalService`,
`GWY20_Tomcat`,
fmt.Sprintf(`%s\tomcat8\bin\Tomcat8.exe //RS//GWY20_Tomcat`, path))
registerWindows(service.serviceName,
`SYSTEM\CurrentControlSet\Services\GWY20_Tomcat`,
`NT Authority\LocalService`,
`GWY20_Tomcat`,
fmt.Sprintf(`%s\tomcat8\bin\Tomcat8.exe //RS//GWY20_Tomcat`, path))
registerJava(service.serviceName, path)
registerLog(service.serviceName, path)
registerState(service.serviceName,
`SOFTWARE\WOW6432Node\Apache Software Foundation\Procrun 2.0\GWY20_Tomcat\Parameters\Start`,
`start`, path)
registerState(service.serviceName,
`SOFTWARE\WOW6432Node\Apache Software Foundation\Procrun 2.0\GWY20_Tomcat\Parameters\Stop`,
`stop`, path)
}
showMsg(service.serviceName + " 服务注册成功!")
}
// 启动服务
func startService(service myService) {
s, err := NewWinService(service.serviceName)
@ -153,8 +204,13 @@ func getWindows() error {
Label{AssignTo: &service1.labelState, Text: "正在运行", MinSize: Size{80, 30}},
Composite{
Layout: HBox{},
MaxSize: Size{132, 30},
MaxSize: Size{198, 30},
Children: []Widget{
PushButton{
AssignTo: &service1.btnRegister,
MaxSize: Size{60, 30},
Text: "注册",
},
PushButton{
AssignTo: &service1.btnStop,
MaxSize: Size{60, 30},
@ -177,8 +233,13 @@ func getWindows() error {
Label{AssignTo: &service3.labelState, Text: "正在运行", MinSize: Size{80, 30}},
Composite{
Layout: HBox{},
MaxSize: Size{132, 30},
MaxSize: Size{198, 30},
Children: []Widget{
PushButton{
AssignTo: &service3.btnRegister,
MaxSize: Size{60, 30},
Text: "注册",
},
PushButton{
AssignTo: &service3.btnStop,
MaxSize: Size{60, 30},
@ -233,3 +294,71 @@ func getWindows() error {
_ = app.mw.SetY((int(win.GetSystemMetrics(1)) - app.mw.Height()) / 2 / app.mw.DPI() * 96)
return err
}
/* 注册服务部分 */
func registerWindows(serviceName, regStr, objectName, displayName, imagePath string) {
key, exists, _ := registry.CreateKey(registry.LOCAL_MACHINE, regStr, registry.ALL_ACCESS)
defer key.Close()
// 判断是否已经存在了
if !exists {
showMsg(serviceName + " 新建注册表记录!")
}
_ = key.SetDWordValue(`Type`, uint32(16))
_ = key.SetDWordValue(`Start`, uint32(2))
_ = key.SetDWordValue(`ErrorControl`, uint32(1))
_ = key.SetDWordValue(`WOW64`, uint32(332))
_ = key.SetStringValue(`ObjectName`, objectName)
_ = key.SetStringValue(`DisplayName`, displayName)
_ = key.SetExpandStringValue(`ImagePath`, imagePath)
if serviceName == "GWY20_Tomcat" {
_ = key.SetStringValue(`Description`, `Apache Tomcat 8.5.55 Server - https://tomcat.apache.org/`)
_ = key.SetStringsValue(`DependOnService`, []string{`Tcpip`, `Afd`})
}
}
func registerJava(serviceName, path string) {
key, exists, _ := registry.CreateKey(registry.LOCAL_MACHINE, `SOFTWARE\WOW6432Node\Apache Software Foundation\Procrun 2.0\GWY20_Tomcat\Parameters\Java`, registry.ALL_ACCESS)
defer key.Close()
// 判断是否已经存在了
if !exists {
showMsg(serviceName + " Java 新建注册表记录!")
}
_ = key.SetStringValue(`Jvm`, fmt.Sprintf(`%s\tomcat8/JDK1.8/jre\bin\server\jvm.dll`, path))
_ = key.SetStringValue(`Options`,
fmt.Sprintf(`-Dcatalina.home=%s\tomcat8\0-Dcatalina.base=%s\tomcat8\0-Djava.endorsed.dirs=%s\tomcat8\endorsed\0-Djava.io.tmpdir=%s\tomcat8\temp\0-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager\0-Djava.util.logging.config.file=%s\tomcat8\conf\logging.properties\0-Dfile.encoding=GBK\0-XX:PermSize=128m\0-XX:MaxPermSize=256m`,
path, path, path, path, path))
_ = key.SetStringValue(`Classpath`, fmt.Sprintf(`%s\tomcat8\bin\bootstrap.jar;%s\tomcat8\bin\tomcat-juli.jar`, path, path))
_ = key.SetDWordValue(`JvmMs`, uint32(512))
_ = key.SetDWordValue(`JvmMx`, uint32(512))
}
func registerLog(serviceName, path string) {
key, exists, _ := registry.CreateKey(registry.LOCAL_MACHINE, `SOFTWARE\WOW6432Node\Apache Software Foundation\Procrun 2.0\GWY20_Tomcat\Parameters\Log`, registry.ALL_ACCESS)
defer key.Close()
// 判断是否已经存在了
if !exists {
showMsg(serviceName + " Log 新建注册表记录!")
}
_ = key.SetStringValue(`Path`, fmt.Sprintf(`%s\tomcat8\logs`, path))
_ = key.SetStringValue(`StdErrorStdError`, `auto`)
_ = key.SetStringValue(`StdOutput`, `auto`)
}
func registerState(serviceName, regStr, state, path string) {
key, exists, _ := registry.CreateKey(registry.LOCAL_MACHINE, regStr, registry.ALL_ACCESS)
defer key.Close()
// 判断是否已经存在了
if !exists {
showMsg(serviceName + " " + state + " 新建注册表记录!")
}
_ = key.SetStringValue(`Class`, `org.apache.catalina.startup.Bootstrap`)
_ = key.SetStringValue(`Params`, state)
_ = key.SetStringValue(`Mode`, `jvm`)
_ = key.SetStringValue(`WorkingPath`, fmt.Sprintf(`%s\tomcat8`, path))
}

12
golang_learn/data_func/go_to_windows/winService.go

@ -93,12 +93,12 @@ func StartService(name string) error {
defer m.Disconnect()
s, err := m.OpenService(name)
if err != nil {
return fmt.Errorf("could not access service: %v", err)
return fmt.Errorf("无法访问服务: %v", err)
}
defer s.Close()
err = s.Start("is", "manual-started")
if err != nil {
return fmt.Errorf("could not start service: %v", err)
return fmt.Errorf("无法启动服务:: %v", err)
}
return nil
}
@ -117,22 +117,22 @@ func ControlService(name string, c svc.Cmd, to svc.State) error {
defer m.Disconnect()
s, err := m.OpenService(name)
if err != nil {
return fmt.Errorf("could not access service: %v", err)
return fmt.Errorf("无法访问服务: %v", err)
}
defer s.Close()
status, err := s.Control(c)
if err != nil {
return fmt.Errorf("could not send control=%d: %v", c, err)
return fmt.Errorf("无法发送控制=%d: %v", c, err)
}
timeout := time.Now().Add(10 * time.Second)
for status.State != to {
if timeout.Before(time.Now()) {
return fmt.Errorf("timeout waiting for service to go to state=%d", to)
return fmt.Errorf("等待服务进入状态超时=%d", to)
}
time.Sleep(300 * time.Millisecond)
status, err = s.Query()
if err != nil {
return fmt.Errorf("could not retrieve service status: %v", err)
return fmt.Errorf("无法检索服务状态: %v", err)
}
}
return nil

Loading…
Cancel
Save