You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
270 lines
5.6 KiB
Go
270 lines
5.6 KiB
Go
package icsutil
|
|
|
|
import (
|
|
"fmt"
|
|
"io/ioutil"
|
|
"os"
|
|
"os/signal"
|
|
"strings"
|
|
"syscall"
|
|
|
|
"gitlab.com/ics_cinnamon/voicegateway/icsconf"
|
|
"gitlab.com/ics_cinnamon/voicegateway/icserror"
|
|
)
|
|
|
|
func Deamonize() (int, error) {
|
|
pid, _, sysErr := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
|
|
if sysErr != 0 {
|
|
//fmt.Println("fail to call fork")
|
|
return -1, fmt.Errorf("fail to call fork - %d", sysErr)
|
|
}
|
|
if pid > 0 { //parent
|
|
//return int(pid), nil
|
|
//fmt.Printf("Parent PID %d\n", int(pid))
|
|
os.Exit(0)
|
|
} else if int(pid) < 0 {
|
|
//fmt.Println("child id is incorrect")
|
|
return int(pid), fmt.Errorf("child id is incorrect")
|
|
} /* else if int(pid) == 0 { //child
|
|
p := os.Getpid()
|
|
fmt.Printf("Child Process PID %d\n", p)
|
|
}*/
|
|
|
|
//p1 := os.Getpid()
|
|
//fmt.Printf("Child Process PID %d\n", p1)
|
|
|
|
ret, err := syscall.Setsid()
|
|
if err != nil || ret < 0 {
|
|
//fmt.Println("fail to call setsid", pid, err)
|
|
return int(pid), fmt.Errorf("fail to call setsid")
|
|
}
|
|
|
|
signal.Ignore(syscall.SIGHUP)
|
|
syscall.Umask(0)
|
|
|
|
conf := icsconf.GetIcsConfig()
|
|
homeDir := conf.GetHomeDir()
|
|
cmdline := fmt.Sprintf("%s/bin/voicegateway", homeDir)
|
|
attr := &os.ProcAttr{Env: os.Environ()}
|
|
p, perr := os.StartProcess(cmdline, []string{""}, attr)
|
|
if perr != nil {
|
|
return -1, perr
|
|
}
|
|
|
|
if werr := WritePID(p.Pid); werr != nil {
|
|
fmt.Println("Error Write PID :", werr)
|
|
}
|
|
|
|
return p.Pid, nil
|
|
}
|
|
|
|
func CloseSTDIO() {
|
|
for iter := 0; iter < 3; iter++ {
|
|
syscall.Close(iter)
|
|
}
|
|
}
|
|
|
|
func WritePID(pid int) *icserror.IcsError {
|
|
isStop := false
|
|
var homeDir string
|
|
for _, e := range os.Environ() {
|
|
s := strings.SplitN(e, "=", 2)
|
|
if strings.Compare(s[0], "ICSVG_ROOT") == 0 {
|
|
homeDir = s[1]
|
|
//service.SetHomeDir(s[1])
|
|
isStop = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if isStop {
|
|
pidFilename := fmt.Sprintf("%s/voicegateway.pid", homeDir)
|
|
spid := fmt.Sprintf("%d", pid)
|
|
ioutil.WriteFile(pidFilename, []byte(spid), 0666)
|
|
} else {
|
|
return icserror.ICSERRNotFoundHome
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func CheckPID() bool {
|
|
isStop := false
|
|
var homeDir string
|
|
for _, e := range os.Environ() {
|
|
s := strings.SplitN(e, "=", 2)
|
|
if strings.Compare(s[0], "ICSVG_ROOT") == 0 {
|
|
homeDir = s[1]
|
|
//service.SetHomeDir(s[1])
|
|
isStop = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if isStop {
|
|
pidFilename := fmt.Sprintf("%s/voicegateway.pid", homeDir)
|
|
fd, err := os.Open(pidFilename)
|
|
if err != nil {
|
|
fd.Close()
|
|
return false
|
|
}
|
|
pid := make([]byte, 12)
|
|
rlen, rerr := fd.Read(pid)
|
|
if rerr != nil {
|
|
return false
|
|
}
|
|
fd.Close()
|
|
|
|
cmdline := fmt.Sprintf("/proc/%s/exe", string(pid[:rlen]))
|
|
//cmdline := fmt.Sprintf("/proc/%s/cmdline", string(pid[:rlen]))
|
|
/*
|
|
cfd, cerr := os.Open(cmdline)
|
|
if cerr != nil {
|
|
cfd.Close()
|
|
return false
|
|
}
|
|
pname := make([]byte, 128)
|
|
rlen, rerr = cfd.Read(pname)
|
|
if rerr != nil {
|
|
return false
|
|
}
|
|
cfd.Close()
|
|
*/
|
|
pname, rlerr := os.Readlink(cmdline)
|
|
if rlerr != nil {
|
|
return false
|
|
}
|
|
|
|
//fmt.Println(pname)
|
|
|
|
if strings.Contains(pname, "voicegateway") {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// Process Check
|
|
const PNAMEC = "voicegatewayCheck"
|
|
|
|
func DeamonizeProcessCheck() (int, error) {
|
|
pid, _, sysErr := syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0)
|
|
if sysErr != 0 {
|
|
//fmt.Println("fail to call fork")
|
|
return -1, fmt.Errorf("fail to call fork - %d", sysErr)
|
|
}
|
|
if pid > 0 { //parent
|
|
//return int(pid), nil
|
|
//fmt.Printf("Child Process Created %d\n", int(pid))
|
|
os.Exit(0)
|
|
} else if int(pid) < 0 {
|
|
//fmt.Println("child id is incorrect")
|
|
return int(pid), fmt.Errorf("child id is incorrect")
|
|
} /* else if int(pid) == 0 { //child
|
|
p := os.Getpid()
|
|
fmt.Printf("Child Process PID %d\n", p)
|
|
}*/
|
|
|
|
ret, err := syscall.Setsid()
|
|
if err != nil || ret < 0 {
|
|
//fmt.Println("fail to call setsid", pid, err)
|
|
return int(pid), fmt.Errorf("Fail to call setsid")
|
|
}
|
|
|
|
signal.Ignore(syscall.SIGHUP)
|
|
syscall.Umask(0)
|
|
|
|
conf := icsconf.GetIcsConfig()
|
|
homeDir := conf.GetHomeDir()
|
|
cmdline := fmt.Sprintf("%s/bin/%s", homeDir, PNAMEC)
|
|
attr := &os.ProcAttr{Env: os.Environ()}
|
|
p, perr := os.StartProcess(cmdline, []string{""}, attr)
|
|
if perr != nil {
|
|
return -1, perr
|
|
}
|
|
|
|
return p.Pid, nil
|
|
}
|
|
|
|
func PWritePID(pid int) *icserror.IcsError {
|
|
isStop := false
|
|
var homeDir string
|
|
for _, e := range os.Environ() {
|
|
s := strings.SplitN(e, "=", 2)
|
|
if strings.Compare(s[0], "ICSVG_ROOT") == 0 {
|
|
homeDir = s[1]
|
|
//service.SetHomeDir(s[1])
|
|
isStop = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if isStop {
|
|
pidFilename := fmt.Sprintf("%s/voicegateway.pid", homeDir)
|
|
spid := fmt.Sprintf("%d", pid)
|
|
ioutil.WriteFile(pidFilename, []byte(spid), 0666)
|
|
} else {
|
|
return icserror.ICSERRNotFoundHome
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func PCheckPID() bool {
|
|
isStop := false
|
|
var homeDir string
|
|
for _, e := range os.Environ() {
|
|
s := strings.SplitN(e, "=", 2)
|
|
if strings.Compare(s[0], "ICSVG_ROOT") == 0 {
|
|
homeDir = s[1]
|
|
//service.SetHomeDir(s[1])
|
|
isStop = true
|
|
break
|
|
}
|
|
}
|
|
|
|
if isStop {
|
|
pidFilename := fmt.Sprintf("%s/voicegatewayP.pid", homeDir)
|
|
fd, err := os.Open(pidFilename)
|
|
if err != nil {
|
|
fd.Close()
|
|
return false
|
|
}
|
|
pid := make([]byte, 12)
|
|
rlen, rerr := fd.Read(pid)
|
|
if rerr != nil {
|
|
return false
|
|
}
|
|
fd.Close()
|
|
|
|
cmdline := fmt.Sprintf("/proc/%s/exe", string(pid[:rlen]))
|
|
//cmdline := fmt.Sprintf("/proc/%s/cmdline", string(pid[:rlen]))
|
|
/*
|
|
cfd, cerr := os.Open(cmdline)
|
|
if cerr != nil {
|
|
cfd.Close()
|
|
return false
|
|
}
|
|
pname := make([]byte, 128)
|
|
rlen, rerr = cfd.Read(pname)
|
|
if rerr != nil {
|
|
return false
|
|
}
|
|
cfd.Close()
|
|
*/
|
|
pname, rlerr := os.Readlink(cmdline)
|
|
if rlerr != nil {
|
|
return false
|
|
}
|
|
|
|
fmt.Println(pname)
|
|
|
|
if strings.Contains(pname, PNAMEC) {
|
|
return true
|
|
}
|
|
}
|
|
|
|
return false
|
|
}
|