|
@@ -13,6 +13,7 @@ import (
|
|
|
"github.com/ccding/go-stun/stun"
|
|
|
"github.com/kardianos/service"
|
|
|
"os"
|
|
|
+ "os/exec"
|
|
|
"runtime"
|
|
|
"strings"
|
|
|
"sync"
|
|
@@ -37,31 +38,6 @@ var (
|
|
|
pprofAddr = flag.String("pprof", "", "PProf debug addr (ip:port)")
|
|
|
)
|
|
|
|
|
|
-const systemdScript = `[Unit]
|
|
|
-Description={{.Description}}
|
|
|
-ConditionFileIsExecutable={{.Path|cmdEscape}}
|
|
|
-{{range $i, $dep := .Dependencies}}
|
|
|
-{{$dep}} {{end}}
|
|
|
-[Service]
|
|
|
-LimitNOFILE=65536
|
|
|
-StartLimitInterval=5
|
|
|
-StartLimitBurst=10
|
|
|
-ExecStart={{.Path|cmdEscape}}{{range .Arguments}} {{.|cmd}}{{end}}
|
|
|
-{{if .ChRoot}}RootDirectory={{.ChRoot|cmd}}{{end}}
|
|
|
-{{if .WorkingDirectory}}WorkingDirectory={{.WorkingDirectory|cmdEscape}}{{end}}
|
|
|
-{{if .UserName}}User={{.UserName}}{{end}}
|
|
|
-{{if .ReloadSignal}}ExecReload=/bin/kill -{{.ReloadSignal}} "$MAINPID"{{end}}
|
|
|
-{{if .PIDFile}}PIDFile={{.PIDFile|cmd}}{{end}}
|
|
|
-{{if and .LogOutput .HasOutputFileSupport -}}
|
|
|
-StandardOutput=file:/var/log/{{.Name}}.out
|
|
|
-StandardError=file:/var/log/{{.Name}}.err
|
|
|
-{{- end}}
|
|
|
-Restart=always
|
|
|
-RestartSec=120
|
|
|
-[Install]
|
|
|
-WantedBy=multi-user.target
|
|
|
-`
|
|
|
-
|
|
|
func main() {
|
|
|
flag.Parse()
|
|
|
logs.Reset()
|
|
@@ -91,7 +67,8 @@ func main() {
|
|
|
svcConfig.Dependencies = []string{
|
|
|
"Requires=network.target",
|
|
|
"After=network-online.target syslog.target"}
|
|
|
- svcConfig.Option["SystemdScript"] = systemdScript
|
|
|
+ svcConfig.Option["SystemdScript"] = install.SystemdScript
|
|
|
+ svcConfig.Option["SysvScript"] = install.SysvScript
|
|
|
}
|
|
|
for _, v := range os.Args[1:] {
|
|
|
switch v {
|
|
@@ -137,16 +114,47 @@ func main() {
|
|
|
}
|
|
|
fmt.Printf("nat type: %s \npublic address: %s\n", nat.String(), host.String())
|
|
|
os.Exit(0)
|
|
|
- case "install", "start", "stop", "uninstall", "restart":
|
|
|
- if os.Args[1] == "install" {
|
|
|
- service.Control(s, "stop")
|
|
|
- service.Control(s, "uninstall")
|
|
|
- install.InstallNpc()
|
|
|
+ case "start", "stop", "restart":
|
|
|
+ // support busyBox and sysV, for openWrt
|
|
|
+ if service.Platform() == "unix-systemv" {
|
|
|
+ logs.Info("unix-systemv service")
|
|
|
+ cmd := exec.Command("/etc/init.d/"+svcConfig.Name, os.Args[1])
|
|
|
+ err := cmd.Run()
|
|
|
+ if err != nil {
|
|
|
+ logs.Error(err)
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+ err := service.Control(s, os.Args[1])
|
|
|
+ if err != nil {
|
|
|
+ logs.Error("Valid actions: %q\n%s", service.ControlAction, err.Error())
|
|
|
}
|
|
|
+ return
|
|
|
+ case "install":
|
|
|
+ service.Control(s, "stop")
|
|
|
+ service.Control(s, "uninstall")
|
|
|
+ install.InstallNpc()
|
|
|
err := service.Control(s, os.Args[1])
|
|
|
if err != nil {
|
|
|
logs.Error("Valid actions: %q\n%s", service.ControlAction, err.Error())
|
|
|
}
|
|
|
+ if service.Platform() == "unix-systemv" {
|
|
|
+ logs.Info("unix-systemv service")
|
|
|
+ confPath := "/etc/init.d/" + svcConfig.Name
|
|
|
+ os.Symlink(confPath, "/etc/rc.d/S90"+svcConfig.Name)
|
|
|
+ os.Symlink(confPath, "/etc/rc.d/K02"+svcConfig.Name)
|
|
|
+ }
|
|
|
+ return
|
|
|
+ case "uninstall":
|
|
|
+ err := service.Control(s, os.Args[1])
|
|
|
+ if err != nil {
|
|
|
+ logs.Error("Valid actions: %q\n%s", service.ControlAction, err.Error())
|
|
|
+ }
|
|
|
+ if service.Platform() == "unix-systemv" {
|
|
|
+ logs.Info("unix-systemv service")
|
|
|
+ os.Remove("/etc/rc.d/S90" + svcConfig.Name)
|
|
|
+ os.Remove("/etc/rc.d/K02" + svcConfig.Name)
|
|
|
+ }
|
|
|
return
|
|
|
}
|
|
|
}
|