bird_exporter/client/bird_client.go
2022-01-27 12:20:22 +01:00

97 lines
2.4 KiB
Go

package client
import (
"fmt"
"github.com/czerwonk/bird_exporter/parser"
"github.com/czerwonk/bird_exporter/protocol"
birdsocket "github.com/czerwonk/bird_socket"
)
// BirdClient communicates with the bird socket to retrieve information
type BirdClient struct {
Options *BirdClientOptions
}
// BirdClientOptions defines options to connect to bird
type BirdClientOptions struct {
BirdV2 bool
BirdEnabled bool
Bird6Enabled bool
BirdSocket string
Bird6Socket string
}
// GetProtocols retrieves protocol information and statistics from bird
func (c *BirdClient) GetProtocols() ([]*protocol.Protocol, error) {
ipVersions := make([]string, 0)
if c.Options.BirdV2 {
ipVersions = append(ipVersions, "")
} else {
if c.Options.BirdEnabled {
ipVersions = append(ipVersions, "4")
}
if c.Options.Bird6Enabled {
ipVersions = append(ipVersions, "6")
}
}
return c.protocolsFromBird(ipVersions)
}
// GetOSPFAreas retrieves OSPF specific information from bird
func (c *BirdClient) GetOSPFAreas(protocol *protocol.Protocol) ([]*protocol.OSPFArea, error) {
sock := c.socketFor(protocol.IPVersion)
b, err := birdsocket.Query(sock, fmt.Sprintf("show ospf %s", protocol.Name))
if err != nil {
return nil, err
}
return parser.ParseOSPF(b), nil
}
// GetBFDSessions retrieves BFD specific information from bird
func (c *BirdClient) GetBFDSessions(protocol *protocol.Protocol) ([]*protocol.BFDSession, error) {
sock := c.socketFor(protocol.IPVersion)
b, err := birdsocket.Query(sock, fmt.Sprintf("show bfd sessions %s", protocol.Name))
if err != nil {
return nil, err
}
return parser.ParseBFDSessions(protocol.Name, b), nil
}
func (c *BirdClient) protocolsFromBird(ipVersions []string) ([]*protocol.Protocol, error) {
protocols := make([]*protocol.Protocol, 0)
for _, ipVersion := range ipVersions {
sock := c.socketFor(ipVersion)
s, err := c.protocolsFromSocket(sock, ipVersion)
if err != nil {
return nil, err
}
protocols = append(protocols, s...)
}
return protocols, nil
}
func (c *BirdClient) protocolsFromSocket(socketPath string, ipVersion string) ([]*protocol.Protocol, error) {
b, err := birdsocket.Query(socketPath, "show protocols all")
if err != nil {
return nil, err
}
return parser.ParseProtocols(b, ipVersion), nil
}
func (c *BirdClient) socketFor(ipVersion string) string {
if !c.Options.BirdV2 && ipVersion == "6" {
return c.Options.Bird6Socket
}
return c.Options.BirdSocket
}