88 lines
1.9 KiB
Go
88 lines
1.9 KiB
Go
package main
|
|
|
|
import (
|
|
"flag"
|
|
"fmt"
|
|
"log"
|
|
"net"
|
|
"net/url"
|
|
"os"
|
|
"syscall"
|
|
|
|
"git.higgsboson.tk/Mic92/kapacitor-scale/handler"
|
|
"git.higgsboson.tk/Mic92/kapacitor-scale/rancher"
|
|
"git.higgsboson.tk/Mic92/kapacitor-scale/scaling"
|
|
"github.com/influxdata/kapacitor/udf/agent"
|
|
)
|
|
|
|
var (
|
|
socketPath = flag.String("socket", "/tmp/kapacitor-scale.sock", "Where to create the unix socket")
|
|
)
|
|
|
|
type acceptor struct {
|
|
count int64
|
|
scaleAgent scaling.Agent
|
|
}
|
|
|
|
// Create a new agent/handler for each new connection.
|
|
// Count and log each new connection and termination.
|
|
func (acc *acceptor) Accept(conn net.Conn) {
|
|
count := acc.count
|
|
acc.count++
|
|
a := agent.New(conn, conn)
|
|
h := handler.New(a, &acc.scaleAgent)
|
|
a.Handler = h
|
|
|
|
log.Println("Starting agent for connection", count)
|
|
a.Start()
|
|
go func() {
|
|
err := a.Wait()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Printf("Agent for connection %d finished", count)
|
|
}()
|
|
}
|
|
|
|
func parseArgs() *url.URL {
|
|
flag.Parse()
|
|
if len(os.Args) < 2 {
|
|
fmt.Fprintf(os.Stderr, "USAGE: %s rancherurl\n", os.Args[0])
|
|
fmt.Fprintf(os.Stderr, "rancher url is expected as first argument, for example: http://accesskey:secretkey@localhost:8080")
|
|
os.Exit(1)
|
|
}
|
|
url, err := url.Parse(os.Args[1])
|
|
if err != nil {
|
|
fmt.Fprintf(os.Stderr, "provided url '%s' is malformed: %v", os.Args[1], err)
|
|
os.Exit(1)
|
|
}
|
|
return url
|
|
}
|
|
|
|
func main() {
|
|
rancherUrl := parseArgs()
|
|
|
|
// Create unix socket
|
|
addr, err := net.ResolveUnixAddr("unix", *socketPath)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
l, err := net.ListenUnix("unix", addr)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
// Create server that listens on the socket
|
|
s := agent.NewServer(l, &acceptor{0, *scaling.New(rancher.New(*rancherUrl))})
|
|
|
|
// Setup signal handler to stop Server on various signals
|
|
s.StopOnSignals(os.Interrupt, syscall.SIGTERM)
|
|
|
|
log.Println("Server listening on", addr.String())
|
|
err = s.Serve()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
log.Println("Server stopped")
|
|
}
|