func Run(ctx *cli.Context) { configFilename := ctx.String(config.CFG_FILE) err := config.Parse(configFilename) if err != nil { log.Fatal("Unable to parse configuration file " + configFilename) os.Exit(1) } d := daemon.NewDaemon() d.Run(ctx) }
func isBootstrapNode(ctx *cli.Context) bool { if ctx.App != nil && !ctx.IsSet(config.CFG_BOOTSTRAP) { return config.Daemon.Bootstrap } return ctx.Bool(config.CFG_BOOTSTRAP) }
func (d *Daemon) Run(ctx *cli.Context) { if isDebugEnabled(ctx) { log.SetLevel(log.DebugLevel) } d.bootstrapNode = isBootstrapNode(ctx) if err := os.Mkdir("/var/run/netns", 0777); err != nil { fmt.Println("mkdir /var/run/netns failed", err) } go ServeAPI(d) go func() { var bindInterface string if ctx.String("iface") != "auto" { bindInterface = ctx.String("iface") } else { intf := d.identifyInterfaceToBind() if intf != nil { bindInterface = intf.Name } } if bindInterface != "" { log.Printf("Binding to %s", bindInterface) d.clusterListener = bindInterface } else { log.Errorf("Unable to identify any Interface to Bind to. Going with Defaults") } InitDatastore(bindInterface, d.bootstrapNode) Bonjour(bindInterface) if !d.bootstrapNode { d.serialChan <- true } }() go ClusterRPCHandler(d) go func() { if !d.bootstrapNode { log.Printf("Non-Bootstrap node waiting on peer discovery") <-d.serialChan log.Printf("Non-Bootstrap node admitted into cluster") } err := CreateBridge() if err != nil { log.Error(err.Error) } d.populateConnections() _, err = CreateDefaultNetwork() if err != nil { log.Error(err.Error) } }() go ConnectionRPCHandler(d) c := make(chan os.Signal, 1) signal.Notify(c, os.Interrupt) go func() { for _ = range c { os.Exit(0) } }() select {} }
func isDebugEnabled(ctx *cli.Context) bool { if ctx.App != nil && !ctx.IsSet(config.CFG_DEBUG) { return config.Daemon.Debug } return ctx.Bool(config.CFG_DEBUG) }