fix: configuration pkg
This commit is contained in:
parent
60fa83244e
commit
c437127531
17
cmd/cmd.go
17
cmd/cmd.go
@ -1,15 +1,11 @@
|
||||
package cmd
|
||||
|
||||
import (
|
||||
"git.cryptic.systems/fh-trier/go-flucky/cmd/config"
|
||||
"git.cryptic.systems/fh-trier/go-flucky/cmd/humidity"
|
||||
"git.cryptic.systems/fh-trier/go-flucky/cmd/remote"
|
||||
"git.cryptic.systems/fh-trier/go-flucky/cmd/sensor"
|
||||
"git.cryptic.systems/fh-trier/go-flucky/cmd/temperature"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var configDir string
|
||||
var cfg string
|
||||
|
||||
var rootCmd = &cobra.Command{
|
||||
Use: "flucky",
|
||||
@ -20,13 +16,12 @@ var rootCmd = &cobra.Command{
|
||||
func Execute(version string) {
|
||||
rootCmd.Version = version
|
||||
|
||||
rootCmd.PersistentFlags().StringVarP(&configDir, "config", "c", "/etc/flucky", "The base directory for all configuration files.")
|
||||
rootCmd.PersistentFlags().StringVar(&cfg, "config", "/etc/flucky/config.json", "Config file")
|
||||
|
||||
config.InitCmd(rootCmd, configDir)
|
||||
humidity.InitCmd(rootCmd, configDir)
|
||||
remote.InitCmd(rootCmd, configDir)
|
||||
sensor.InitCmd(rootCmd, configDir)
|
||||
temperature.InitCmd(rootCmd, configDir)
|
||||
// humidity.InitCmd(rootCmd, configDir)
|
||||
remote.InitCmd(rootCmd, cfg)
|
||||
// sensor.InitCmd(rootCmd, configDir)
|
||||
// temperature.InitCmd(rootCmd, configDir)
|
||||
|
||||
rootCmd.Execute()
|
||||
}
|
||||
|
@ -1,28 +0,0 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/config"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var configDir string
|
||||
|
||||
var configCmd = &cobra.Command{
|
||||
Use: "config",
|
||||
Short: "Manage Configuration",
|
||||
Args: cobra.ExactArgs(2),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if args[0] == "device.name" {
|
||||
config.DeviceName(args[1], configDir)
|
||||
} else if args[0] == "device.location" {
|
||||
config.DeviceLocation(args[1], configDir)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
func InitCmd(cmd *cobra.Command, c string) {
|
||||
configDir = c
|
||||
|
||||
cmd.AddCommand(configCmd)
|
||||
|
||||
}
|
@ -1,28 +0,0 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/config"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var force bool
|
||||
var logDir string
|
||||
|
||||
var createConfigCmd = &cobra.Command{
|
||||
Use: "create",
|
||||
Short: "create",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
if err := config.Create(configDir, logDir, force); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
configCmd.AddCommand(createConfigCmd)
|
||||
createConfigCmd.Flags().BoolVarP(&force, "force", "f", false, "Force the creation of a new configuration")
|
||||
createConfigCmd.Flags().StringVarP(&logDir, "log-dir", "l", "/var/log/flucky", "Directory for logfiles")
|
||||
}
|
@ -3,8 +3,7 @@ package remote
|
||||
import (
|
||||
"log"
|
||||
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/remote"
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/types"
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/config"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
@ -16,19 +15,35 @@ var addRemoteCmd = &cobra.Command{
|
||||
Args: cobra.ExactArgs(2),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
remoteObject := types.Remote{
|
||||
// read configuration
|
||||
fc, err := config.Read(cfg)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
// create new remote struct
|
||||
remote := config.Remote{
|
||||
Name: args[0],
|
||||
Address: args[1],
|
||||
Enabled: enabled,
|
||||
}
|
||||
|
||||
if err := remote.Add(&remoteObject, configDir); err != nil {
|
||||
log.Fatal(err)
|
||||
// // add remote entry to list
|
||||
err = fc.AddRemote(&remote)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
// save new configuration
|
||||
err = config.Write(fc, cfg)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
remoteCmd.AddCommand(addRemoteCmd)
|
||||
addRemoteCmd.Flags().BoolVarP(&enabled, "enabled", "e", true, "Enable Remote Link")
|
||||
addRemoteCmd.Flags().BoolVarP(&enabled, "enable", "e", true, "Enable")
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ package remote
|
||||
import (
|
||||
"log"
|
||||
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/remote"
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/config"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
@ -13,9 +13,24 @@ var disableRemoteCmd = &cobra.Command{
|
||||
Args: cobra.ExactArgs(1),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
if err := remote.Disable(args[0], configDir); err != nil {
|
||||
log.Fatal(err)
|
||||
// read configuration
|
||||
fc, err := config.Read(cfg)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
// disnable remote address
|
||||
err = fc.DisableRemote(args[0])
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
// save new configuration
|
||||
err = config.Write(fc, cfg)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -3,7 +3,7 @@ package remote
|
||||
import (
|
||||
"log"
|
||||
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/remote"
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/config"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
@ -13,8 +13,22 @@ var enableRemoteCmd = &cobra.Command{
|
||||
Args: cobra.ExactArgs(1),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
if err := remote.Enable(args[0], configDir); err != nil {
|
||||
log.Fatal(err)
|
||||
// read configuration
|
||||
fc, err := config.Read(cfg)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
// enable remote address
|
||||
err = fc.EnableRemote(args[0])
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
// save new configuration
|
||||
err = config.Write(fc, cfg)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
@ -4,7 +4,7 @@ import (
|
||||
"log"
|
||||
"os"
|
||||
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/remote"
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/config"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
@ -16,14 +16,26 @@ var listRemoteCmd = &cobra.Command{
|
||||
Aliases: []string{"ls"},
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
if err := remote.Print(os.Stdout, configDir, quiet); err != nil {
|
||||
log.Fatal(err)
|
||||
// read configuration
|
||||
fc, err := config.Read(cfg)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
// print all configured remote addresses on stdout
|
||||
err = fc.PrintRemotes(os.Stdout)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
// save new configuration
|
||||
err = config.Write(fc, cfg)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
remoteCmd.AddCommand(listRemoteCmd)
|
||||
|
||||
listRemoteCmd.Flags().BoolVarP(&quiet, "quiet", "q", false, "List only sensor id's")
|
||||
}
|
||||
|
@ -4,15 +4,15 @@ import (
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var configDir string
|
||||
var cfg string
|
||||
|
||||
var remoteCmd = &cobra.Command{
|
||||
Use: "remote",
|
||||
Short: "Manage Remote Server",
|
||||
}
|
||||
|
||||
func InitCmd(cmd *cobra.Command, cnf string) {
|
||||
configDir = cnf
|
||||
func InitCmd(cmd *cobra.Command, config string) {
|
||||
cfg = config
|
||||
|
||||
cmd.AddCommand(remoteCmd)
|
||||
}
|
||||
|
@ -3,32 +3,37 @@ package remote
|
||||
import (
|
||||
"log"
|
||||
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/remote"
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/config"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var all bool
|
||||
|
||||
var rmRemoteCmd = &cobra.Command{
|
||||
Use: "rm",
|
||||
Short: "Remove Remote Server",
|
||||
Aliases: []string{"remove"},
|
||||
Args: cobra.RangeArgs(0, 1),
|
||||
Args: cobra.ExactArgs(1),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
if all {
|
||||
if err := remote.RemoveAll(configDir); err != nil {
|
||||
log.Fatal(err)
|
||||
// read configuration
|
||||
fc, err := config.Read(cfg)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
} else {
|
||||
if err := remote.Remove(args[0], configDir); err != nil {
|
||||
log.Fatal(err)
|
||||
|
||||
// add remote entry to list
|
||||
err = fc.RemoveRemote(args[0])
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
|
||||
// save new configuration
|
||||
err = config.Write(fc, cfg)
|
||||
if err != nil {
|
||||
log.Fatalln(err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
remoteCmd.AddCommand(rmRemoteCmd)
|
||||
rmRemoteCmd.Flags().BoolVarP(&all, "all", "a", false, "Select all remote connections")
|
||||
}
|
||||
|
@ -1,27 +0,0 @@
|
||||
package remote
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/httpcall"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
var force bool
|
||||
|
||||
var syncRemoteCmd = &cobra.Command{
|
||||
Use: "sync",
|
||||
Aliases: []string{"synchronize"},
|
||||
Short: "Synchronise Device Values with Remote Servers",
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
|
||||
if err := httpcall.SyncDevice(configDir, force); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
},
|
||||
}
|
||||
|
||||
func init() {
|
||||
remoteCmd.AddCommand(syncRemoteCmd)
|
||||
syncRemoteCmd.Flags().BoolVarP(&force, "force", "f", false, "Include disabled remote links")
|
||||
}
|
@ -1,9 +1,6 @@
|
||||
package sensor
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/sensor"
|
||||
"github.com/spf13/cobra"
|
||||
)
|
||||
|
||||
@ -15,9 +12,7 @@ var addSensorCmd = &cobra.Command{
|
||||
Short: "Add Sensor",
|
||||
Args: cobra.ExactArgs(3),
|
||||
Run: func(cmd *cobra.Command, args []string) {
|
||||
if err := sensor.Add(&args[0], &sensorLocation, &args[1], &wireID, &args[2], wirePath, configDir, &enabled); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
},
|
||||
}
|
||||
|
||||
|
@ -1,136 +1,68 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/types"
|
||||
|
||||
"github.com/satori/go.uuid"
|
||||
"git.cryptic.systems/fh-trier/go-flucky-server/pkg/types"
|
||||
)
|
||||
|
||||
var configFilename = "config.json"
|
||||
var humiditiesLogfileName = "humidities.log"
|
||||
var temperatureLogfileName = "temperature.log"
|
||||
var validUUID = regexp.MustCompile("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$")
|
||||
|
||||
func Create(configDir, logDir string, force bool) error {
|
||||
type Config interface {
|
||||
AddSensor(sensor *types.Sensor) error
|
||||
AddRemote(remote *Remote) error
|
||||
DisableRemote(nameOrUUID string) error
|
||||
DisableSensor(nameOrUUID string) error
|
||||
EnableRemote(nameOrUUID string) error
|
||||
EnableSensor(nameOrUUID string) error
|
||||
GetDevice() *Device
|
||||
GetRemotes() []*Remote
|
||||
GetSensors() []*types.Sensor
|
||||
JSONDecoder(r io.Reader) error
|
||||
JSONWriter(w io.Writer) error
|
||||
RemoveSensor(nameOrUUID string) error
|
||||
RemoveRemote(nameOrUUID string) error
|
||||
SetDevice(device *Device)
|
||||
ToJSON() (string, error)
|
||||
}
|
||||
|
||||
configPath := filepath.Join(configDir, configFilename)
|
||||
humiditiesLogfile := filepath.Join(logDir, humiditiesLogfileName)
|
||||
temperaturLogfile := filepath.Join(logDir, temperatureLogfileName)
|
||||
// Read the configuration file
|
||||
func Read(configFile string) (*FluckyConfig, error) {
|
||||
|
||||
config := &types.Config{
|
||||
DeviceID: uuid.NewV4().String(),
|
||||
HumidityLogfile: humiditiesLogfile,
|
||||
TemperatureLogfile: temperaturLogfile,
|
||||
}
|
||||
fc := &FluckyConfig{}
|
||||
|
||||
// If no config file exists, create a new one on the location
|
||||
if !force {
|
||||
if _, err := os.Stat(configPath); !os.IsNotExist(err) {
|
||||
return fmt.Errorf("%v already exists. Use -f to overwrite", configPath)
|
||||
}
|
||||
}
|
||||
|
||||
if _, err := os.Stat(configPath); os.IsNotExist(err) {
|
||||
err := os.MkdirAll(configDir, os.ModePerm)
|
||||
f, err := os.Open(configFile)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Can not create directory: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
f, err := os.Create(configPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Can not create config: %v", err)
|
||||
return nil, fmt.Errorf("Can not open file %v: %v", configFile, err)
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
config.JSONWriter(f)
|
||||
err = fc.JSONDecoder(f)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Can not decode json file %v: %v", configFile, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
return fc, nil
|
||||
|
||||
}
|
||||
|
||||
func DeviceName(deviceName, configDir string) error {
|
||||
cnf, err := Read(configDir)
|
||||
// Write the configuration into a file, specified by the configuration filepath
|
||||
func Write(cfg Config, configFile string) error {
|
||||
|
||||
f, err := os.Create(configFile)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer f.Close()
|
||||
|
||||
cnf.DeviceName = deviceName
|
||||
|
||||
err = Write(cnf, configDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func DeviceLocation(deviceLocation, configDir string) error {
|
||||
cnf, err := Read(configDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
cnf.DeviceLocation = deviceLocation
|
||||
|
||||
err = Write(cnf, configDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func Read(configDir string) (*types.Config, error) {
|
||||
|
||||
configPath := filepath.Join(configDir, configFilename)
|
||||
|
||||
var config types.Config
|
||||
|
||||
// If no config file exists, return an error
|
||||
if _, err := os.Stat(configPath); os.IsNotExist(err) {
|
||||
return nil, fmt.Errorf("Can not find config %v: %v", configPath, err)
|
||||
}
|
||||
|
||||
// open config file
|
||||
jsonFile, err := os.Open(configPath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Can not open file %v: %v", configPath, err)
|
||||
}
|
||||
defer jsonFile.Close()
|
||||
|
||||
jsonParser := json.NewDecoder(jsonFile)
|
||||
if err := jsonParser.Decode(&config); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &config, nil
|
||||
}
|
||||
|
||||
func Write(config *types.Config, configDir string) error {
|
||||
|
||||
configPath := filepath.Join(configDir, configFilename)
|
||||
|
||||
// If no config file exists, return an error
|
||||
if _, err := os.Stat(configPath); os.IsNotExist(err) {
|
||||
return fmt.Errorf("Can not find config %v: %v", configPath, err)
|
||||
}
|
||||
|
||||
// open config file
|
||||
jsonFile, err := os.Create(configPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Can not open file %v: %v", configPath, err)
|
||||
}
|
||||
defer jsonFile.Close()
|
||||
|
||||
err = config.JSONWriter(jsonFile)
|
||||
err = cfg.JSONWriter(f)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
|
||||
}
|
||||
|
7
pkg/config/device.go
Normal file
7
pkg/config/device.go
Normal file
@ -0,0 +1,7 @@
|
||||
package config
|
||||
|
||||
type Device struct {
|
||||
DeviceID string `json:"device_id"`
|
||||
DeviceName string `json:"device_name"`
|
||||
DeviceLocation string `json:"device_location"`
|
||||
}
|
312
pkg/config/fluckyconfig.go
Normal file
312
pkg/config/fluckyconfig.go
Normal file
@ -0,0 +1,312 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"text/tabwriter"
|
||||
|
||||
"github.com/satori/go.uuid"
|
||||
|
||||
"git.cryptic.systems/fh-trier/go-flucky-server/pkg/types"
|
||||
)
|
||||
|
||||
// FluckyConfig dasd
|
||||
type FluckyConfig struct {
|
||||
Device *Device `json:"device"`
|
||||
Sensors []*types.Sensor `json:"sensors"`
|
||||
Remotes []*Remote `json:"remotes"`
|
||||
}
|
||||
|
||||
// AddSensor add a new sensor
|
||||
func (fc *FluckyConfig) AddSensor(sensor *types.Sensor) error {
|
||||
|
||||
// check if sensorID is a valid UUID string
|
||||
if !validUUID.MatchString(sensor.SensorID) {
|
||||
sensor.SensorID = uuid.NewV4().String()
|
||||
}
|
||||
|
||||
// check if sensor name and sensor uuid already exists
|
||||
for _, s := range fc.Sensors {
|
||||
if s.SensorName == sensor.SensorName {
|
||||
return fmt.Errorf("Sensor %v already exists", s.SensorName)
|
||||
}
|
||||
|
||||
if s.SensorID == sensor.SensorID {
|
||||
return fmt.Errorf("Remote %v with UUID %v already exists", s.SensorName, s.SensorID)
|
||||
}
|
||||
}
|
||||
|
||||
fc.Sensors = append(fc.Sensors, sensor)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// AddRemote add a new remote address
|
||||
func (fc *FluckyConfig) AddRemote(remote *Remote) error {
|
||||
|
||||
// check if remoteID is a valid UUID string
|
||||
if !validUUID.MatchString(remote.RemoteID) {
|
||||
remote.RemoteID = uuid.NewV4().String()
|
||||
}
|
||||
|
||||
// check if remote name or remiteid already exists
|
||||
for _, r := range fc.Remotes {
|
||||
if r.Name == remote.Name {
|
||||
return fmt.Errorf("Remote %v -> %v already exists", r.Name, r.Address)
|
||||
}
|
||||
|
||||
if r.RemoteID == remote.RemoteID {
|
||||
return fmt.Errorf("Remote %v with UUID %v already exists", r.Name, r.RemoteID)
|
||||
}
|
||||
}
|
||||
|
||||
fc.Remotes = append(fc.Remotes, remote)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// DisableRemote disables a remote address by its name or its unique UUID
|
||||
func (fc *FluckyConfig) DisableRemote(nameOrUUID string) error {
|
||||
found := false
|
||||
|
||||
for _, remote := range fc.Remotes {
|
||||
|
||||
// disable sensor matched after name
|
||||
if !validUUID.MatchString(nameOrUUID) &&
|
||||
remote.Name == nameOrUUID {
|
||||
remote.Enabled = false
|
||||
found = true
|
||||
break
|
||||
}
|
||||
|
||||
// remove machted uuid
|
||||
if validUUID.MatchString(nameOrUUID) &&
|
||||
remote.RemoteID == nameOrUUID {
|
||||
remote.Enabled = false
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !found {
|
||||
return fmt.Errorf("Can not found sensor %v", nameOrUUID)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// DisableSensor disables a sensor by its name or its unique UUID
|
||||
func (fc *FluckyConfig) DisableSensor(nameOrUUID string) error {
|
||||
found := false
|
||||
|
||||
for _, sensor := range fc.Sensors {
|
||||
|
||||
// disable sensor matched after name
|
||||
if !validUUID.MatchString(nameOrUUID) &&
|
||||
*sensor.SensorName == nameOrUUID {
|
||||
*sensor.SensorEnabled = false
|
||||
found = true
|
||||
break
|
||||
}
|
||||
|
||||
// remove machted uuid
|
||||
if validUUID.MatchString(nameOrUUID) &&
|
||||
sensor.SensorID == nameOrUUID {
|
||||
*sensor.SensorEnabled = false
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !found {
|
||||
return fmt.Errorf("Can not found sensor %v", nameOrUUID)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// EnableRemote enable a remote address by its name or its unique UUID
|
||||
func (fc *FluckyConfig) EnableRemote(nameOrUUID string) error {
|
||||
found := false
|
||||
|
||||
for _, remote := range fc.Remotes {
|
||||
|
||||
// disable sensor matched after name
|
||||
if !validUUID.MatchString(nameOrUUID) &&
|
||||
remote.Name == nameOrUUID {
|
||||
remote.Enabled = true
|
||||
found = true
|
||||
break
|
||||
}
|
||||
|
||||
// remove machted uuid
|
||||
if validUUID.MatchString(nameOrUUID) &&
|
||||
remote.RemoteID == nameOrUUID {
|
||||
remote.Enabled = true
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !found {
|
||||
return fmt.Errorf("Can not found sensor %v", nameOrUUID)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// EnableSensor enables a sensor by its name or its unique UUID
|
||||
func (fc *FluckyConfig) EnableSensor(nameOrUUID string) error {
|
||||
found := false
|
||||
|
||||
for _, sensor := range fc.Sensors {
|
||||
|
||||
// disable sensor matched after name
|
||||
if !validUUID.MatchString(nameOrUUID) &&
|
||||
*sensor.SensorName == nameOrUUID {
|
||||
*sensor.SensorEnabled = true
|
||||
found = true
|
||||
break
|
||||
}
|
||||
|
||||
// remove machted uuid
|
||||
if validUUID.MatchString(nameOrUUID) &&
|
||||
sensor.SensorID == nameOrUUID {
|
||||
*sensor.SensorEnabled = true
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !found {
|
||||
return fmt.Errorf("Can not found sensor %v", nameOrUUID)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// GetDevice returns device informations
|
||||
func (fc *FluckyConfig) GetDevice() *Device {
|
||||
return fc.Device
|
||||
}
|
||||
|
||||
// GetRemotes returns an array if remote struct poniter
|
||||
func (fc *FluckyConfig) GetRemotes() []*Remote {
|
||||
return fc.Remotes
|
||||
}
|
||||
|
||||
// GetSensors returns an array if remote struct poniter
|
||||
func (fc *FluckyConfig) GetSensors() []*types.Sensor {
|
||||
return fc.Sensors
|
||||
}
|
||||
|
||||
// JSONDecoder decode a JSON string from a reader into a struct
|
||||
func (fc *FluckyConfig) JSONDecoder(r io.Reader) error {
|
||||
jsonDecoder := json.NewDecoder(r)
|
||||
if err := jsonDecoder.Decode(&fc); err != nil {
|
||||
return fmt.Errorf("Can not unmarshal JSON: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// JSONWriter needs a writer to write the struct into JSON string
|
||||
func (fc *FluckyConfig) JSONWriter(w io.Writer) error {
|
||||
encoder := json.NewEncoder(w)
|
||||
encoder.SetIndent("", " ")
|
||||
err := encoder.Encode(&fc)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Error in encoding struct to json: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (fc *FluckyConfig) PrintRemotes(w io.Writer) error {
|
||||
|
||||
tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0)
|
||||
|
||||
fmt.Fprint(tw, "name\taddress\tenabled\tregistered\n")
|
||||
|
||||
for _, remote := range fc.Remotes {
|
||||
fmt.Fprintf(tw, "%v\t%v\t%v\t%v\n", remote.Name, remote.Address, remote.Enabled, remote.Registered)
|
||||
}
|
||||
|
||||
tw.Flush()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RemoveSensor deletes a sensor by its name or its unique UUID
|
||||
func (fc *FluckyConfig) RemoveSensor(nameOrUUID string) error {
|
||||
found := false
|
||||
|
||||
for i, sensor := range fc.Sensors {
|
||||
|
||||
// remove machted name
|
||||
if !validUUID.MatchString(nameOrUUID) &&
|
||||
*sensor.SensorName == nameOrUUID {
|
||||
fc.Sensors = append(fc.Sensors[:i], fc.Sensors[i+1:]...)
|
||||
found = true
|
||||
break
|
||||
}
|
||||
|
||||
// remove machted uuid
|
||||
if validUUID.MatchString(nameOrUUID) &&
|
||||
sensor.SensorID == nameOrUUID {
|
||||
fc.Sensors = append(fc.Sensors[:i], fc.Sensors[i+1:]...)
|
||||
found = true
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
if !found {
|
||||
return fmt.Errorf("Can not find remote %v", nameOrUUID)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// RemoveRemote deletes a remote address by its name or its unique UUID
|
||||
func (fc *FluckyConfig) RemoveRemote(nameOrUUID string) error {
|
||||
found := false
|
||||
|
||||
for i, remote := range fc.Remotes {
|
||||
|
||||
// remove machted name
|
||||
if !validUUID.MatchString(nameOrUUID) &&
|
||||
remote.Name == nameOrUUID {
|
||||
fc.Remotes = append(fc.Remotes[:i], fc.Remotes[i+1:]...)
|
||||
found = true
|
||||
}
|
||||
|
||||
// remove machted uuid
|
||||
if validUUID.MatchString(nameOrUUID) &&
|
||||
remote.RemoteID == nameOrUUID {
|
||||
fc.Remotes = append(fc.Remotes[:i], fc.Remotes[i+1:]...)
|
||||
found = true
|
||||
}
|
||||
}
|
||||
|
||||
if !found {
|
||||
return fmt.Errorf("Can not find remote %v", nameOrUUID)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// SetDevice informations, like device name or device location
|
||||
func (fc *FluckyConfig) SetDevice(device *Device) {
|
||||
fc.Device = device
|
||||
}
|
||||
|
||||
// ToJSON returns the struct as JSON string
|
||||
func (fc *FluckyConfig) ToJSON() (string, error) {
|
||||
var b bytes.Buffer
|
||||
err := fc.JSONWriter(&b)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return b.String(), nil
|
||||
}
|
10
pkg/config/remote.go
Normal file
10
pkg/config/remote.go
Normal file
@ -0,0 +1,10 @@
|
||||
package config
|
||||
|
||||
// Remote ...
|
||||
type Remote struct {
|
||||
RemoteID string `json:"remote_id"`
|
||||
Name string `json:"remote_name"`
|
||||
Address string `json:"remote_address"`
|
||||
Registered bool `json:"remote_registered"`
|
||||
Enabled bool `json:"remote_enabled"`
|
||||
}
|
@ -22,6 +22,8 @@ func SyncDevice(configDir string, force bool) error {
|
||||
return err
|
||||
}
|
||||
|
||||
jsonBuffer := bytes.Buffer{}
|
||||
|
||||
// define array of devices
|
||||
device := types.Device{
|
||||
DeviceID: cnf.DeviceID,
|
||||
@ -32,19 +34,23 @@ func SyncDevice(configDir string, force bool) error {
|
||||
}
|
||||
|
||||
// encode to json
|
||||
deviceAsBytes, err := json.Marshal(device)
|
||||
encoder := json.NewEncoder(&jsonBuffer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
deviceAsReader := bytes.NewReader(deviceAsBytes)
|
||||
if err = encoder.Encode(device); err != nil {
|
||||
return fmt.Errorf("Can not encode device to json: %v", err)
|
||||
}
|
||||
|
||||
log.Println(jsonBuffer.String())
|
||||
|
||||
// send array of devices to remote links
|
||||
for _, remote := range cnf.Remotes {
|
||||
if !remote.Registered || force {
|
||||
|
||||
requestURL := fmt.Sprintf("%v/devices/%v", remote.Address, cnf.DeviceID)
|
||||
req, err := http.NewRequest("PUT", requestURL, deviceAsReader)
|
||||
req, err := http.NewRequest("PUT", requestURL, &jsonBuffer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@ -60,7 +66,7 @@ func SyncDevice(configDir string, force bool) error {
|
||||
if resp.StatusCode == 404 {
|
||||
log.Println("test")
|
||||
requestURL := fmt.Sprintf("%v/devices", remote.Address)
|
||||
req, err := http.NewRequest("POST", requestURL, deviceAsReader)
|
||||
req, err := http.NewRequest("POST", requestURL, &jsonBuffer)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -1,158 +1,157 @@
|
||||
package remote
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io"
|
||||
"text/tabwriter"
|
||||
// import (
|
||||
// "fmt"
|
||||
// "io"
|
||||
// "text/tabwriter"
|
||||
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/config"
|
||||
"git.cryptic.systems/fh-trier/go-flucky/pkg/types"
|
||||
)
|
||||
// "git.cryptic.systems/fh-trier/go-flucky/pkg/config"
|
||||
// )
|
||||
|
||||
func Add(remote *types.Remote, configDir string) error {
|
||||
// func Add(remote *types.Remote, configDir string) error {
|
||||
|
||||
configuration, err := config.Read(configDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// configuration, err := config.Read(configDir)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// search after duplicate remote_names
|
||||
for _, r := range configuration.Remotes {
|
||||
if r.Name == remote.Name {
|
||||
return fmt.Errorf("Remote-Name %v already exists", remote.Name)
|
||||
}
|
||||
}
|
||||
// // search after duplicate remote_names
|
||||
// for _, r := range configuration.Remotes {
|
||||
// if r.Name == remote.Name {
|
||||
// return fmt.Errorf("Remote-Name %v already exists", remote.Name)
|
||||
// }
|
||||
// }
|
||||
|
||||
configuration.Remotes = append(configuration.Remotes, remote)
|
||||
// configuration.Remotes = append(configuration.Remotes, remote)
|
||||
|
||||
if err := config.Write(configuration, configDir); err != nil {
|
||||
return err
|
||||
}
|
||||
// if err := config.Write(configuration, configDir); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
return nil
|
||||
}
|
||||
// return nil
|
||||
// }
|
||||
|
||||
// Enable a remote link
|
||||
func Enable(remoteName string, configDir string) error {
|
||||
// // Enable a remote link
|
||||
// func Enable(remoteName string, configDir string) error {
|
||||
|
||||
cnf, err := config.Read(configDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// cnf, err := config.Read(configDir)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// search after duplicate remote_names
|
||||
var found bool
|
||||
for _, r := range cnf.Remotes {
|
||||
if r.Name == remoteName {
|
||||
r.Enabled = true
|
||||
found = true
|
||||
}
|
||||
}
|
||||
// // search after duplicate remote_names
|
||||
// var found bool
|
||||
// for _, r := range cnf.Remotes {
|
||||
// if r.Name == remoteName {
|
||||
// r.Enabled = true
|
||||
// found = true
|
||||
// }
|
||||
// }
|
||||
|
||||
if !found {
|
||||
return fmt.Errorf("Can not find remote %v", remoteName)
|
||||
}
|
||||
// if !found {
|
||||
// return fmt.Errorf("Can not find remote %v", remoteName)
|
||||
// }
|
||||
|
||||
if err := config.Write(cnf, configDir); err != nil {
|
||||
return err
|
||||
}
|
||||
// if err := config.Write(cnf, configDir); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
return nil
|
||||
}
|
||||
// return nil
|
||||
// }
|
||||
|
||||
// Disable a remote link
|
||||
func Disable(remoteName string, configDir string) error {
|
||||
// // Disable a remote link
|
||||
// func Disable(remoteName string, configDir string) error {
|
||||
|
||||
cnf, err := config.Read(configDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// cnf, err := config.Read(configDir)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
// search after duplicate remote_names
|
||||
var found bool
|
||||
for _, r := range cnf.Remotes {
|
||||
if r.Name == remoteName {
|
||||
r.Enabled = false
|
||||
found = true
|
||||
}
|
||||
}
|
||||
// // search after duplicate remote_names
|
||||
// var found bool
|
||||
// for _, r := range cnf.Remotes {
|
||||
// if r.Name == remoteName {
|
||||
// r.Enabled = false
|
||||
// found = true
|
||||
// }
|
||||
// }
|
||||
|
||||
if !found {
|
||||
return fmt.Errorf("Can not find remote %v", remoteName)
|
||||
}
|
||||
// if !found {
|
||||
// return fmt.Errorf("Can not find remote %v", remoteName)
|
||||
// }
|
||||
|
||||
if err := config.Write(cnf, configDir); err != nil {
|
||||
return err
|
||||
}
|
||||
// if err := config.Write(cnf, configDir); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
return nil
|
||||
}
|
||||
// return nil
|
||||
// }
|
||||
|
||||
func Print(w io.Writer, configDir string, quiet bool) error {
|
||||
// func Print(w io.Writer, configDir string, quiet bool) error {
|
||||
|
||||
configuration, err := config.Read(configDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// configuration, err := config.Read(configDir)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0)
|
||||
// tw := tabwriter.NewWriter(w, 0, 0, 3, ' ', 0)
|
||||
|
||||
if !quiet {
|
||||
fmt.Fprint(tw, "name\taddress\tenabled\tregistered\n")
|
||||
}
|
||||
// if !quiet {
|
||||
// fmt.Fprint(tw, "name\taddress\tenabled\tregistered\n")
|
||||
// }
|
||||
|
||||
for _, remote := range configuration.Remotes {
|
||||
if quiet {
|
||||
fmt.Fprintf(tw, "%v\n", remote.Name)
|
||||
} else {
|
||||
fmt.Fprintf(tw, "%v\t%v\t%v\t%v\n", remote.Name, remote.Address, remote.Enabled, remote.Registered)
|
||||
}
|
||||
}
|
||||
// for _, remote := range configuration.Remotes {
|
||||
// if quiet {
|
||||
// fmt.Fprintf(tw, "%v\n", remote.Name)
|
||||
// } else {
|
||||
// fmt.Fprintf(tw, "%v\t%v\t%v\t%v\n", remote.Name, remote.Address, remote.Enabled, remote.Registered)
|
||||
// }
|
||||
// }
|
||||
|
||||
tw.Flush()
|
||||
// tw.Flush()
|
||||
|
||||
return nil
|
||||
}
|
||||
// return nil
|
||||
// }
|
||||
|
||||
func Remove(name string, configDir string) error {
|
||||
// func Remove(name string, configDir string) error {
|
||||
|
||||
con, err := config.Read(configDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// con, err := config.Read(configDir)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
var j int
|
||||
for _, remote := range con.Remotes {
|
||||
if remote.Name == name {
|
||||
con.Remotes = append(con.Remotes[:j], con.Remotes[j+1:]...)
|
||||
// var j int
|
||||
// for _, remote := range con.Remotes {
|
||||
// if remote.Name == name {
|
||||
// con.Remotes = append(con.Remotes[:j], con.Remotes[j+1:]...)
|
||||
|
||||
if j > 0 {
|
||||
j = j - 1
|
||||
}
|
||||
continue
|
||||
}
|
||||
j++
|
||||
}
|
||||
// if j > 0 {
|
||||
// j = j - 1
|
||||
// }
|
||||
// continue
|
||||
// }
|
||||
// j++
|
||||
// }
|
||||
|
||||
if err := config.Write(con, configDir); err != nil {
|
||||
return err
|
||||
}
|
||||
// if err := config.Write(con, configDir); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
return nil
|
||||
}
|
||||
// return nil
|
||||
// }
|
||||
|
||||
func RemoveAll(configDir string) error {
|
||||
// func RemoveAll(configDir string) error {
|
||||
|
||||
con, err := config.Read(configDir)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
// con, err := config.Read(configDir)
|
||||
// if err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
con.Remotes = nil
|
||||
// con.Remotes = nil
|
||||
|
||||
if err := config.Write(con, configDir); err != nil {
|
||||
return err
|
||||
}
|
||||
// if err := config.Write(con, configDir); err != nil {
|
||||
// return err
|
||||
// }
|
||||
|
||||
return nil
|
||||
}
|
||||
// return nil
|
||||
// }
|
||||
|
@ -1,58 +0,0 @@
|
||||
package types
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
|
||||
stypes "git.cryptic.systems/fh-trier/go-flucky-server/pkg/types"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
DeviceID string `json:"device_id"`
|
||||
DeviceName string `json:"device_name"`
|
||||
DeviceLocation string `json:"device_location"`
|
||||
TemperatureLogfile string `json:"temperature_logfile"`
|
||||
HumidityLogfile string `json:"humiditiy_logfile"`
|
||||
Remotes []*Remote `json:"remotes"`
|
||||
Sensors []*stypes.Sensor `json:"sensors"`
|
||||
}
|
||||
|
||||
func (c *Config) ToJSON() (string, error) {
|
||||
var b bytes.Buffer
|
||||
err := c.JSONWriter(&b)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return b.String(), nil
|
||||
}
|
||||
|
||||
// JSONWriter needs a writer to write the struct into json string
|
||||
func (c *Config) JSONWriter(w io.Writer) error {
|
||||
encoder := json.NewEncoder(w)
|
||||
encoder.SetIndent("", " ")
|
||||
err := encoder.Encode(&c)
|
||||
if err != nil {
|
||||
return fmt.Errorf("Error in encoding struct to json: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// JSONDecoder decode a json string from a reader into a struct
|
||||
func (c *Config) JSONDecoder(r io.Reader) error {
|
||||
jsonDecoder := json.NewDecoder(r)
|
||||
if err := jsonDecoder.Decode(&c); err != nil {
|
||||
return fmt.Errorf("Can not unmarshal JSON: %v", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Remote ...
|
||||
type Remote struct {
|
||||
Name string `json:"remote_name"`
|
||||
Address string `json:"remote_address"`
|
||||
Registered bool `json:"remote_registered"`
|
||||
Enabled bool `json:"remote_enabled"`
|
||||
}
|
Loading…
Reference in New Issue
Block a user