97 lines
2.4 KiB
Go
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
|
|
}
|