| package main |
| |
| //go:generate packr |
| |
| import ( |
| "context" |
| "flag" |
| "io/ioutil" |
| |
| "code.hackerspace.pl/hscloud/go/mirko" |
| "github.com/digitalocean/go-netbox/netbox" |
| "github.com/digitalocean/go-netbox/netbox/client" |
| "github.com/golang/glog" |
| "github.com/golang/protobuf/proto" |
| |
| "code.hackerspace.pl/hscloud/dc/topo/graph" |
| pb "code.hackerspace.pl/hscloud/dc/topo/proto" |
| "code.hackerspace.pl/hscloud/dc/topo/state" |
| ) |
| |
| var ( |
| flagConfigPath string |
| flagNetboxHost string |
| flagNetboxAPIKey string |
| ) |
| |
| func init() { |
| flag.Set("logtostderr", "true") |
| } |
| |
| func main() { |
| flag.StringVar(&flagConfigPath, "config_path", "./topo.pb.text", "Text proto configuration of Topo (per config.proto)") |
| flag.StringVar(&flagNetboxHost, "netbox_host", "netbox.bgp.wtf", "Netbox host") |
| flag.StringVar(&flagNetboxAPIKey, "netbox_api_key", "", "Netbox API key") |
| flag.Parse() |
| |
| m := mirko.New() |
| if err := m.Listen(); err != nil { |
| glog.Exitf("Listen(): %v", err) |
| } |
| |
| ctx := context.Background() |
| |
| data, err := ioutil.ReadFile(flagConfigPath) |
| if err != nil { |
| glog.Exitf("Could not read config: %v", err) |
| } |
| |
| config := pb.Config{} |
| proto.UnmarshalText(string(data), &config) |
| |
| stm := state.NewManager() |
| err = stm.FetchState(ctx, &config) |
| if err != nil { |
| glog.Exitf("Initial state fetch failed: %v", err) |
| } |
| |
| gr := graph.New() |
| err = gr.LoadConfig(&config) |
| if err != nil { |
| glog.Exitf("Initial config load failed: %v", err) |
| } |
| |
| client.DefaultSchemes = []string{"https"} |
| nb := netbox.NewNetboxWithAPIKey(flagNetboxHost, flagNetboxAPIKey) |
| err = gr.FeedFromNetbox(ctx, nb) |
| if err != nil { |
| glog.Exitf("Initial netbox feed failed: %v", err) |
| } |
| |
| s := NewService(gr, stm) |
| s.Setup(m) |
| |
| if err := m.Serve(); err != nil { |
| glog.Exitf("Serve(): %v", err) |
| } |
| |
| select {} |
| } |