mirror of
https://github.com/bgp/stayrtr.git
synced 2024-05-06 15:54:54 +00:00
125 lines
2.5 KiB
Go
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)
|
|
}
|
|
}
|