go-bgp

a collection of golang BGP tools to monitor, archive and serve
git clone git://git.2f30.org/go-bgp.git
Log | Files | Refs | README

commit 79ac02c08a89dee807291078ab8353ab2193c375
parent b279623885dd86032d8478f50aa68dd50a36b2f7
Author: dsp <dsp@2f30.org>
Date:   Tue Feb 17 18:44:54 -0700

commiting dummy cmd/bgpmon.go that is bgpd.go from osrg

Diffstat:
cmd/bgpmon.go | 169+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 169 insertions(+), 0 deletions(-)
diff --git a/cmd/bgpmon.go b/cmd/bgpmon.go @@ -0,0 +1,169 @@ +package main + +import ( + log "github.com/Sirupsen/logrus" + "github.com/Sirupsen/logrus/hooks/syslog" + "github.com/jessevdk/go-flags" + "github.com/osrg/gobgp/api" + "github.com/osrg/gobgp/config" + "github.com/osrg/gobgp/packet" + "github.com/osrg/gobgp/server" + "io/ioutil" + "log/syslog" + "os" + "os/signal" + "runtime" + "strings" + "syscall" +) + +func main() { + runtime.GOMAXPROCS(runtime.NumCPU()) + + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, syscall.SIGHUP) + + var opts struct { + ConfigFile string `short:"f" long:"config-file" description:"specifying a config file"` + LogLevel string `short:"l" long:"log-level" description:"specifying log level"` + LogPlain bool `short:"p" long:"log-plain" description:"use plain format for logging (json by default)"` + UseSyslog string `short:"s" long:"syslog" description:"use syslogd"` + Facility string `long:"syslog-facility" description:"specify syslog facility"` + DisableStdlog bool `long:"disable-stdlog" description:"disable standard logging"` + } + _, err := flags.Parse(&opts) + if err != nil { + os.Exit(1) + } + + switch opts.LogLevel { + case "debug": + log.SetLevel(log.DebugLevel) + case "info": + log.SetLevel(log.InfoLevel) + default: + log.SetLevel(log.InfoLevel) + } + + if opts.DisableStdlog == true { + log.SetOutput(ioutil.Discard) + } else { + log.SetOutput(os.Stdout) + } + + if opts.UseSyslog != "" { + dst := strings.SplitN(opts.UseSyslog, ":", 2) + network := "" + addr := "" + if len(dst) == 2 { + network = dst[0] + addr = dst[1] + } + + facility := syslog.Priority(0) + switch opts.Facility { + case "kern": + facility = syslog.LOG_KERN + case "user": + facility = syslog.LOG_USER + case "mail": + facility = syslog.LOG_MAIL + case "daemon": + facility = syslog.LOG_DAEMON + case "auth": + facility = syslog.LOG_AUTH + case "syslog": + facility = syslog.LOG_SYSLOG + case "lpr": + facility = syslog.LOG_LPR + case "news": + facility = syslog.LOG_NEWS + case "uucp": + facility = syslog.LOG_UUCP + case "cron": + facility = syslog.LOG_CRON + case "authpriv": + facility = syslog.LOG_AUTHPRIV + case "ftp": + facility = syslog.LOG_FTP + case "local0": + facility = syslog.LOG_LOCAL0 + case "local1": + facility = syslog.LOG_LOCAL1 + case "local2": + facility = syslog.LOG_LOCAL2 + case "local3": + facility = syslog.LOG_LOCAL3 + case "local4": + facility = syslog.LOG_LOCAL4 + case "local5": + facility = syslog.LOG_LOCAL5 + case "local6": + facility = syslog.LOG_LOCAL6 + case "local7": + facility = syslog.LOG_LOCAL7 + } + + hook, err := logrus_syslog.NewSyslogHook(network, addr, syslog.LOG_INFO|facility, "bgpd") + if err != nil { + log.Error("Unable to connect to syslog daemon, ", opts.UseSyslog) + os.Exit(1) + } else { + log.AddHook(hook) + } + } + + if opts.LogPlain == false { + log.SetFormatter(&log.JSONFormatter{}) + } + + if opts.ConfigFile == "" { + opts.ConfigFile = "gobgpd.conf" + } + + configCh := make(chan config.BgpType) + reloadCh := make(chan bool) + go config.ReadConfigfileServe(opts.ConfigFile, configCh, reloadCh) + reloadCh <- true + + bgpServer := server.NewBgpServer(bgp.BGP_PORT) + go bgpServer.Serve() + + // start Rest Server + restServer := api.NewRestServer(api.REST_PORT, bgpServer.RestReqCh) + go restServer.Serve() + + var bgpConfig *config.BgpType = nil + for { + select { + case newConfig := <-configCh: + var added []config.NeighborType + var deleted []config.NeighborType + + if bgpConfig == nil { + bgpServer.SetGlobalType(newConfig.Global) + bgpConfig = &newConfig + added = newConfig.NeighborList + deleted = []config.NeighborType{} + } else { + bgpConfig, added, deleted = config.UpdateConfig(bgpConfig, &newConfig) + } + + for _, p := range added { + log.Infof("Peer %v is added", p.NeighborAddress) + bgpServer.PeerAdd(p) + } + for _, p := range deleted { + log.Infof("Peer %v is deleted", p.NeighborAddress) + bgpServer.PeerDelete(p) + } + case sig := <-sigCh: + switch sig { + case syscall.SIGHUP: + log.Info("reload the config file") + reloadCh <- true + } + } + } +} +