1
0
mirror of https://github.com/bgp/stayrtr.git synced 2024-05-06 15:54:54 +00:00
bgp-stayrtr/cmd/rtrdump/rtrdump.go
Louis Poinsignon eb025127a0 Finalized handler
2018-11-12 20:45:28 -08:00

125 lines
2.5 KiB
Go

package main
import (
"flag"
"fmt"
rtr "github.com/cloudflare/gortr/lib"
"github.com/cloudflare/gortr/prefixfile"
log "github.com/sirupsen/logrus"
"os"
"runtime"
"encoding/json"
"time"
"io"
"crypto/tls"
)
const AppVersion = "RTRdump 0.9.4"
var (
Connect = flag.String("connect", "127.0.0.1:8282", "Connection address")
OutFile = flag.String("file", "output.json", "Output file")
UseTLS = flag.Bool("tls.enable", false, "Use TLS")
ValidateCert = flag.Bool("tls.validate", true, "Validate TLS")
RefreshInterval = flag.Int("refresh", 600, "Refresh interval in seconds")
LogLevel = flag.String("loglevel", "info", "Log level")
Version = flag.Bool("version", false, "Print version")
)
type Client struct {
Data prefixfile.ROAList
}
func (c *Client) HandlePDU(cs *rtr.ClientSession, pdu rtr.PDU) {
log.Debugf("Received: %v", pdu)
switch pdu := pdu.(type) {
case *rtr.PDUIPv4Prefix:
rj := prefixfile.ROAJson{
Prefix: pdu.Prefix.String(),
ASN: fmt.Sprintf("AS%v", pdu.ASN),
Length: pdu.MaxLen,
}
c.Data.Data = append(c.Data.Data, rj)
c.Data.Metadata.Counts++
case *rtr.PDUIPv6Prefix:
rj := prefixfile.ROAJson{
Prefix: pdu.Prefix.String(),
ASN: fmt.Sprintf("AS%v", pdu.ASN),
Length: pdu.MaxLen,
}
c.Data.Data = append(c.Data.Data, rj)
c.Data.Metadata.Counts++
case *rtr.PDUEndOfData:
t := time.Now().UTC().UnixNano()/1000000000
c.Data.Metadata.Generated = int(t)
c.Data.Metadata.Valid = int(pdu.SerialNumber)
cs.Disconnect()
}
}
func (c *Client) ClientConnected(cs *rtr.ClientSession) {
cs.SendResetQuery()
}
func (c *Client) ClientDisconnected(cs *rtr.ClientSession) {
}
func main() {
runtime.GOMAXPROCS(runtime.NumCPU())
flag.Parse()
if *Version {
fmt.Println(AppVersion)
os.Exit(0)
}
lvl, _ := log.ParseLevel(*LogLevel)
log.SetLevel(lvl)
cc := rtr.ClientConfiguration{
ProtocolVersion: rtr.PROTOCOL_VERSION_1,
Log: log.StandardLogger(),
}
client := &Client{
Data: prefixfile.ROAList{
Metadata: prefixfile.MetaData{
},
Data: make([]prefixfile.ROAJson, 0),
},
}
clientSession := rtr.NewClientSession(cc, client)
config := &tls.Config{
InsecureSkipVerify: !*ValidateCert,
}
err := clientSession.Start(*Connect, *UseTLS, config)
if err != nil {
log.Fatal(err)
}
var f io.Writer
if *OutFile != "" {
ff, err := os.Create(*OutFile)
defer ff.Close()
if err != nil {
log.Fatal(err)
}
f = ff
} else {
f = os.Stdout
}
enc := json.NewEncoder(f)
err = enc.Encode(client.Data)
if err != nil {
log.Fatal(err)
}
}