125 lines
2.7 KiB
Go
125 lines
2.7 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"net/http"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/mmcloughlin/professor"
|
|
log "github.com/sirupsen/logrus"
|
|
flag "github.com/spf13/pflag"
|
|
|
|
"git.mills.io/prologic/msgbus"
|
|
)
|
|
|
|
const (
|
|
helpText = `
|
|
msgbus is a self-hosted pub/sub server for publishing
|
|
artbitrary messages onto queues (topics) and subscribing to them with
|
|
a client such as curl or in real-time with websockets (using msgbus).
|
|
|
|
Valid optinos:
|
|
`
|
|
)
|
|
|
|
var (
|
|
version bool
|
|
debug bool
|
|
bind string
|
|
|
|
bufferLength int
|
|
maxQueueSize int
|
|
maxPayloadSize int
|
|
)
|
|
|
|
func init() {
|
|
baseProg := filepath.Base(os.Args[0])
|
|
flag.Usage = func() {
|
|
fmt.Fprintf(os.Stderr, "Usage: %s [options]\n", baseProg)
|
|
fmt.Fprint(os.Stderr, helpText)
|
|
flag.PrintDefaults()
|
|
}
|
|
|
|
flag.BoolVarP(&debug, "debug", "d", false, "enable debug logging")
|
|
flag.StringVarP(&bind, "bind", "b", "0.0.0.0:8000", "[int]:<port> to bind to")
|
|
flag.BoolVarP(&version, "version", "v", false, "display version information")
|
|
|
|
// Basic options
|
|
flag.IntVarP(
|
|
&bufferLength, "buffer-length", "B", msgbus.DefaultBufferLength,
|
|
"set the buffer length for subscribers before messages are dropped",
|
|
)
|
|
flag.IntVarP(
|
|
&maxQueueSize, "max-queue-size", "Q", msgbus.DefaultMaxQueueSize,
|
|
"set the maximum queue size per topic",
|
|
)
|
|
flag.IntVarP(
|
|
&maxPayloadSize, "max-payload-size", "P", msgbus.DefaultMaxPayloadSize,
|
|
"set the maximum payload size per message",
|
|
)
|
|
}
|
|
|
|
func flagNameFromEnvironmentName(s string) string {
|
|
s = strings.ToLower(s)
|
|
s = strings.Replace(s, "_", "-", -1)
|
|
return s
|
|
}
|
|
|
|
func parseArgs() error {
|
|
for _, v := range os.Environ() {
|
|
vals := strings.SplitN(v, "=", 2)
|
|
flagName := flagNameFromEnvironmentName(vals[0])
|
|
fn := flag.CommandLine.Lookup(flagName)
|
|
if fn == nil || fn.Changed {
|
|
continue
|
|
}
|
|
if err := fn.Value.Set(vals[1]); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
flag.Parse()
|
|
return nil
|
|
}
|
|
|
|
func corsMiddleware(next http.Handler) http.Handler {
|
|
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
w.Header().Set("Access-Control-Allow-Origin", "*")
|
|
w.Header().Set("Access-Control-Allow-Headers", "*")
|
|
next.ServeHTTP(w, r)
|
|
})
|
|
}
|
|
|
|
func main() {
|
|
parseArgs()
|
|
|
|
if debug {
|
|
log.SetLevel(log.DebugLevel)
|
|
} else {
|
|
log.SetLevel(log.InfoLevel)
|
|
}
|
|
|
|
if version {
|
|
fmt.Printf("msgbusd %s", msgbus.FullVersion())
|
|
os.Exit(0)
|
|
}
|
|
|
|
if debug {
|
|
go professor.Launch(":6060")
|
|
}
|
|
|
|
opts := msgbus.Options{
|
|
BufferLength: bufferLength,
|
|
MaxQueueSize: maxQueueSize,
|
|
MaxPayloadSize: maxPayloadSize,
|
|
WithMetrics: true,
|
|
}
|
|
mb := msgbus.New(&opts)
|
|
|
|
http.Handle("/", corsMiddleware(mb))
|
|
http.Handle("/metrics", mb.Metrics().Handler())
|
|
log.Infof("msgbusd %s listening on %s", msgbus.FullVersion(), bind)
|
|
log.Fatal(http.ListenAndServe(bind, nil))
|
|
}
|