warren/cmd/warrend/main.go

89 lines
1.5 KiB
Go
Raw Normal View History

2014-12-14 19:55:56 +00:00
package main
import (
"fmt"
"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
)
type SockCommand struct {
warren.Command
Run func(cmd *SockCommand, c net.Conn, args ...string)
}
func (cmd *SockCommand) GetName() string {
return cmd.Name
}
func (cmd *SockCommand) Exec(c net.Conn, args []string) {
cmd.Flag.Usage = func() {
// helpFunc(c, c.Name)
}
cmd.Flag.Parse(args)
cmd.Run(cmd, c, 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)
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 "
var args = strings.Split(" ", data)
// parse args
2015-01-27 16:19:38 +00:00
var icmd = warren.GetCommand(args[0])
// get and run cmd
2015-01-27 16:19:38 +00:00
if icmd == nil {
c.Write([]byte("Unknown command " + args[0]))
// usage ?
return
}
icmd.(*SockCommand).Exec(c, args[1:])
2014-12-30 17:32:11 +00:00
c.Write([]byte("echo: " + data))
2014-12-14 19:55:56 +00:00
}
func main() {
warren.RegisterCommand(statusCmd)
cmdSock, err := net.Listen(warren.CmdSockType(), warren.CmdSockAddr())
defer cmdSock.Close()
2014-12-14 19:55:56 +00:00
if err != nil {
log.Fatal("Listen on sock error:", err)
}
// Handle signals
c := make(chan os.Signal, 1)
signal.Notify(c,
syscall.SIGINT,
syscall.SIGTERM,
syscall.SIGQUIT,
syscall.SIGHUP,
)
go func() {
_ = <-c
cmdSock.Close()
}()
2014-12-14 19:55:56 +00:00
for {
fd, err := cmdSock.Accept()
fmt.Println("accept")
if err != nil {
log.Fatal("accpet error:", err)
}
go sockCmdHandle(fd)
2014-12-14 19:55:56 +00:00
}
}