Пример #1
0
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)
}
Пример #2
0
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)
}
Пример #3
0
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 {}
}
Пример #4
0
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)
}