warren/cmd/warrend/main.go

161 lines
2.9 KiB
Go
Raw Normal View History

2014-12-14 19:55:56 +00:00
package main
import (
"fmt"
"github.com/dballard/warren/cmd/warrend/conf"
"github.com/dballard/warren/lib/warren"
2014-12-14 19:55:56 +00:00
"log"
"net"
"os"
"os/signal"
2015-01-27 16:19:38 +00:00
"strings"
"syscall"
2014-12-14 19:55:56 +00:00
)
var cmdSock net.Listener
type SockCommand struct {
warren.Command
Run func(cmd *SockCommand, c net.Conn, path string, args ...string)
}
func (cmd *SockCommand) GetName() string {
return cmd.Name
}
2015-02-14 19:42:02 +00:00
func (cmd *SockCommand) GetSummary() string {
return cmd.Summary
}
func (cmd *SockCommand) Exec(c net.Conn, path string, args []string) {
cmd.Flag.Usage = func() {
// helpFunc(c, c.Name)
}
cmd.Flag.Parse(args)
cmd.Run(cmd, c, path, cmd.Flag.Args()...)
}
func sockCmdHandle(c net.Conn) {
2014-12-14 19:55:56 +00:00
defer c.Close()
2014-12-30 17:32:11 +00:00
fmt.Println("cmdHandle")
data, err := warren.ReadStringz(c)
2014-12-14 19:55:56 +00:00
if err != nil {
2014-12-30 17:32:11 +00:00
fmt.Println(err)
warren.WriteStringz(c, "read error:"+err.Error())
2014-12-14 19:55:56 +00:00
return
}
fmt.Println("cmdHandle got command:", string(data))
2015-01-27 16:19:38 +00:00
// BAD: TODO: handle quotes "
// path|arg1|arg2|...
args := strings.Split(data, "|")
if len(args) < 2 {
warren.WriteStringz(c, "Format error")
return
}
2015-01-27 16:19:38 +00:00
// parse args
var icmd = warren.GetCommand(args[1])
// get and run cmd
2015-01-27 16:19:38 +00:00
if icmd == nil {
warren.WriteStringz(c, "Unknown command "+args[1])
2015-01-27 16:19:38 +00:00
// usage ?
2015-01-27 16:19:38 +00:00
return
}
icmd.(*SockCommand).Exec(c, args[0], args[2:])
2014-12-14 19:55:56 +00:00
}
// determine if warrend is already running
func checkRunning() bool {
2015-02-05 18:58:17 +00:00
if pfile, err := os.Open(warren.WarrendPidFile); err == nil {
// pid file exists
var pid int
n, err := fmt.Fscanf(pfile, "%d", &pid)
if n == 0 || err != nil {
// read error
return false
}
// is there a runnign process with the pid?
err = syscall.Kill(pid, 0)
return err == nil
} else {
// pid file does not exist
return false
}
}
func initRunning() {
// rm old sock
2015-02-05 18:58:17 +00:00
os.Remove(warren.CmdSockAddr)
// incase gone
os.Mkdir(warren.WarrendRunDir, 0775)
// drop down pid
2015-02-05 18:58:17 +00:00
pidfile, err := os.Create(warren.WarrendPidFile)
2014-12-14 19:55:56 +00:00
if err != nil {
2015-02-14 19:42:02 +00:00
log.Fatal("Could not create pidfile: ", warren.WarrendPidFile, " : ", err)
}
pid := os.Getpid()
fmt.Fprintf(pidfile, "%d", pid)
pidfile.Close()
2015-02-05 18:58:17 +00:00
cmdSock, err = net.Listen(warren.CmdSockType, warren.CmdSockAddr)
if err != nil {
fmt.Println(cmdSock)
Shutdown()
2014-12-14 19:55:56 +00:00
log.Fatal("Listen on sock error:", err)
}
}
func Shutdown() {
2015-02-05 18:58:17 +00:00
os.Remove(warren.WarrendPidFile)
if cmdSock != nil {
cmdSock.Close()
}
}
func main() {
if checkRunning() {
log.Fatal("warrend instance already running")
}
go conf.Run()
if cinit := <-conf.Init; !cinit {
return
2015-02-14 19:42:02 +00:00
}
initRunning()
warren.RegisterCommand(statusCmd)
2015-02-14 19:42:02 +00:00
warren.RegisterCommand(regCmd)
// Handle signals
c := make(chan os.Signal, 1)
signal.Notify(c,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT,
syscall.SIGHUP,
)
go func() {
<-c
Shutdown()
}()
// Listen
2014-12-14 19:55:56 +00:00
for {
fd, err := cmdSock.Accept()
fmt.Println("accept")
if err != nil {
Shutdown()
2014-12-14 19:55:56 +00:00
log.Fatal("accpet error:", err)
}
go sockCmdHandle(fd)
2014-12-14 19:55:56 +00:00
}
Shutdown()
2014-12-14 19:55:56 +00:00
}