mirror of
https://github.com/xxjwxc/public.git
synced 2025-09-26 20:01:19 +08:00
170 lines
3.8 KiB
Go
170 lines
3.8 KiB
Go
package server
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/xxjwxc/public/dev"
|
|
|
|
"github.com/gookit/color"
|
|
"github.com/jander/golog/logger"
|
|
"github.com/kardianos/service"
|
|
)
|
|
|
|
type Service struct {
|
|
name string
|
|
displayName string
|
|
desc string
|
|
}
|
|
|
|
func On(n, dn, d string) *Service {
|
|
return &Service{
|
|
name: n,
|
|
displayName: dn,
|
|
desc: d,
|
|
}
|
|
|
|
}
|
|
|
|
func (sv *Service) Start(callBack func()) {
|
|
if len(sv.name) == 0 {
|
|
fmt.Println(color.Error.Render("Service init faild,must first call On."))
|
|
return
|
|
}
|
|
//name, displayName, desc := config.GetServiceConfig()
|
|
p := &program{callBack}
|
|
sc := &service.Config{
|
|
Name: sv.name,
|
|
DisplayName: sv.displayName,
|
|
Description: sv.desc,
|
|
}
|
|
s, err := service.New(p, sc)
|
|
//var s, err = service.NewService(name, displayName, desc)
|
|
if err != nil {
|
|
fmt.Print(color.Error.Render(fmt.Sprintf("%s unable to start: %s", sv.displayName, err)))
|
|
return
|
|
}
|
|
|
|
fmt.Print(color.Info.Render(fmt.Sprintf("Service \"%s\" do.\n", sv.displayName)))
|
|
|
|
if len(os.Args) > 1 {
|
|
var err error
|
|
verb := os.Args[1]
|
|
switch verb {
|
|
case "install":
|
|
{
|
|
err = s.Install()
|
|
if err != nil {
|
|
fmt.Print(color.Error.Render(fmt.Sprintf("Failed to install: %s\n", err)))
|
|
return
|
|
}
|
|
fmt.Print(color.Info.Render(fmt.Sprintf("Service \"%s\" installed.\n", sv.displayName)))
|
|
}
|
|
case "remove":
|
|
{
|
|
err = s.Uninstall()
|
|
if err != nil {
|
|
fmt.Print(color.Error.Render(fmt.Sprintf("Failed to remove: %s\n", err)))
|
|
return
|
|
}
|
|
fmt.Print(color.Info.Render(fmt.Sprintf("Service \"%s\" removed.\n", sv.displayName)))
|
|
}
|
|
case "run":
|
|
{
|
|
err = s.Run()
|
|
if err != nil {
|
|
fmt.Print(color.Error.Render(fmt.Sprintf("Failed to run: %s\n", err)))
|
|
return
|
|
}
|
|
fmt.Print(color.Info.Render(fmt.Sprintf("Service \"%s\" run.\n", sv.displayName)))
|
|
}
|
|
case "debug":
|
|
{
|
|
dev.OnSetDev(true)
|
|
err = s.Run()
|
|
if err != nil {
|
|
fmt.Print(color.Error.Render(fmt.Sprintf("Failed to debug: %s\n", err)))
|
|
return
|
|
}
|
|
fmt.Print(color.Info.Render(fmt.Sprintf("Service \"%s\" run.\n", sv.displayName)))
|
|
}
|
|
case "start":
|
|
{
|
|
err = s.Start()
|
|
if err != nil {
|
|
fmt.Print(color.Error.Render(fmt.Sprintf("Failed to start: %s\n", err)))
|
|
return
|
|
}
|
|
fmt.Print(color.Info.Render(fmt.Sprintf("starting check service:%v\n", sv.displayName)))
|
|
|
|
ticker := time.NewTicker(1 * time.Second)
|
|
<-ticker.C
|
|
|
|
var sit ServiceTools
|
|
st, err := sit.IsStart(sv.name)
|
|
if err != nil {
|
|
color.Error.Render(err)
|
|
return
|
|
}
|
|
|
|
if st == Stopped || st == StopPending {
|
|
fmt.Print(color.Error.Render(fmt.Sprintf("Service \"%s\" is Stopped.\n", sv.displayName)))
|
|
fmt.Print(color.Error.Render("can't to start service."))
|
|
return
|
|
}
|
|
|
|
fmt.Print(color.Info.Render(fmt.Sprintf("Service \"%s\" started.\n", sv.displayName)))
|
|
}
|
|
case "stop":
|
|
{
|
|
err = s.Stop()
|
|
if err != nil {
|
|
fmt.Print(color.Error.Render(fmt.Sprintf("Failed to stop: %s\n", err)))
|
|
return
|
|
}
|
|
var sit ServiceTools
|
|
st, err := sit.IsStart(sv.name)
|
|
if err != nil {
|
|
fmt.Println(err)
|
|
return
|
|
}
|
|
|
|
if st == Running || st == StartPending {
|
|
fmt.Print(color.Error.Render(fmt.Sprintf("Service \"%s\" is Started.\n", sv.displayName)))
|
|
fmt.Print(color.Error.Render("can't to stop service."))
|
|
return
|
|
}
|
|
|
|
fmt.Print(color.Info.Render(fmt.Sprintf("Service \"%s\" stopped.\n", sv.displayName)))
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
fmt.Print(color.Note.Render("Failed to read args\n"))
|
|
|
|
if err = s.Run(); err != nil {
|
|
logger.Error(err)
|
|
}
|
|
}
|
|
|
|
type program struct {
|
|
callBack func()
|
|
}
|
|
|
|
func (p *program) Start(s service.Service) error {
|
|
go p.run()
|
|
return nil
|
|
}
|
|
func (p *program) run() {
|
|
p.callBack()
|
|
}
|
|
func (p *program) Stop(s service.Service) error {
|
|
return nil
|
|
}
|
|
|
|
type IServiceTools interface {
|
|
IsStart(name string) (status int, err error)
|
|
}
|