cmd

package
v0.0.0-...-c29a6f0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 27, 2019 License: MIT Imports: 19 Imported by: 0

Documentation

Overview

Package cmd defines all sub-commands of the command line interface provided by mqtt-home-controller

Index

Constants

This section is empty.

Variables

View Source
var RootCmd = &cobra.Command{
	Short: "MQTT Home Controller",
	Run: func(cmd *cobra.Command, args []string) {
		var l config.LogLevel
		switch logLevel {
		case "debug":
			l = config.LogDebug
		case "info":
			l = config.LogInfo
		case "warn":
			l = config.LogWarn
		case "error":
			l = config.LogError
		case "":
		default:
			logrus.Fatal("invalid log level")
		}

		if l != config.LogLevel("") {
			cfg.LogLevel = l
		}

		if configFile != "" {
			data, err := ioutil.ReadFile(configFile)
			if err != nil {
				logrus.Fatal(err)
			}

			jsonBlob, err := yaml.YAMLToJSON(data)
			if err != nil {
				logrus.Fatal(err)
			}

			var fromFile config.Config
			if err := json.Unmarshal(jsonBlob, &fromFile); err != nil {
				logrus.Fatal(err)
			}

			cfg.Merge(&fromFile)
		}

		switch cfg.LogLevel {
		case config.LogDebug:
			logrus.SetLevel(logrus.DebugLevel)
		case config.LogInfo:
			logrus.SetLevel(logrus.InfoLevel)
		case config.LogWarn:
			logrus.SetLevel(logrus.WarnLevel)
		case config.LogError:
			logrus.SetLevel(logrus.ErrorLevel)
		}
		logger := logrus.New()
		logger.SetLevel(logrus.GetLevel())

		if listener.Address == "" && !cfg.HTTP.HasListener() {
			logrus.Debug("Using default configuration for HTTP server")
			listener = server.ListenerConfig{
				Address: "tcp://127.0.0.1:4300",
			}
		}

		if listener.Address != "" {
			cfg.HTTP.Listen = ""
			cfg.HTTP.Listeners = []server.ListenerConfig{listener}
		}

		srv, err := server.New(server.Config{
			Listeners: cfg.HTTP.ListenerConfigs(),
			Logger:    logger,
		})

		if err != nil {
			logger.Fatal(err)
		}

		m := macaron.Classic()

		store, err := registry.Open("memory", "")
		if err != nil {
			logger.Fatal(err)
		}

		render.Bind(m)

		m.MapTo(store, (*registry.Registry)(nil))

		m.Use(macaron.Renderer())

		routes.Install(m)

		opts := mqtt.NewClientOptions()
		if cfg.MQTT.Username != "" {
			opts.SetUsername(cfg.MQTT.Username)
		}

		if cfg.MQTT.Password != "" {
			opts.SetPassword(cfg.MQTT.Password)
		}

		opts.SetAutoReconnect(true).SetCleanSession(true).SetClientID(cfg.MQTT.ClientID)

		for _, broker := range cfg.MQTT.Brokers {
			opts.AddBroker(broker)
		}

		if len(opts.Servers) == 0 {
			logger.Fatal("Missing MQTT hostname")
		}

		cli := mqtt.NewClient(opts)

		if token := cli.Connect(); token.Wait() && token.Error() != nil {
			logger.Fatalf("failed to connect: %s", token.Error())
		}
		logger.Infof("Successfully connected to MQTT brokers")

		controller, err := control.New(
			control.WithLogger(logger),
			control.WithMQTTClient(cli),
			control.WithRegistry(store),
		)
		if err != nil {
			logger.Fatal(err)
		}

		m.Map(controller)

		if cfg.ThingsDir != "" {
			things, err := config.ReadThingsFromDirectory(cfg.ThingsDir)
			if err != nil {
				logger.Fatal(err)
			}

			ctx := context.Background()

			for _, t := range things {
				t.ApplyDefaults()

				if err := spec.ValidateThing(t); err != nil {
					logger.Fatal(err)
				}

				if err := store.Create(ctx, t); err != nil {
					logger.Fatal(err)
				}
			}
		}

		if err := srv.Listen(m); err != nil {
			logger.Fatal(err)
		}

		controller.Run(context.Background())
	},
}

RootCmd is the root command of mqtt-home-controller

Functions

This section is empty.

Types

This section is empty.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL