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 {} }