diff --git a/Makefile b/Makefile index 1ac805d..6283827 100644 --- a/Makefile +++ b/Makefile @@ -48,6 +48,7 @@ bin/linux/arm/5/${EXECUTABLE}: bindata go build -ldflags "-X main.version=${VERSION:v%=%}" -o ${@} bin/linux/arm/7/${EXECUTABLE}: bindata + CC=arm-linux-gnueabihf-gcc \ CGO_ENABLED=1 \ GOOS=linux \ GOARCH=arm \ diff --git a/cli/root.go b/cli/root.go index ec235c0..f9a87c3 100644 --- a/cli/root.go +++ b/cli/root.go @@ -83,7 +83,7 @@ func preRunError(cmd *cobra.Command, args []string) error { Name: hostname, CreationDate: postgresTimeStamp, }, - DSN: "sqlite3:///var/log/flucky/sqlite.db?cache=shared&mode=memory&FKSupport=True", + DSN: "sqlite3:///var/log/flucky/sqlite.db?cache=shared&mode=memory&foreign_keys=on", } err = config.Write(&cnf, configFile) diff --git a/cli/sensor/sensor.go b/cli/sensor/sensor.go index 3f27246..4199cd7 100644 --- a/cli/sensor/sensor.go +++ b/cli/sensor/sensor.go @@ -164,6 +164,8 @@ func addSensor(cmd *cobra.Command, args []string) error { return err } + sensor.DeviceID = cnf.Device.ID + dsnURL, err := url.Parse(cnf.DSN) if err != nil { return err @@ -290,7 +292,7 @@ func listSensors(cmd *cobra.Command, args []string) error { } // add sensor entry to list - sensors, err := repo.GetSensors() + sensors, err := repo.GetSensorsByDeviceID(cnf.Device.ID) if err != nil { return err } diff --git a/pkg/daemon/daemon.go b/pkg/daemon/daemon.go index b208ecc..35d52ce 100644 --- a/pkg/daemon/daemon.go +++ b/pkg/daemon/daemon.go @@ -2,10 +2,10 @@ package daemon import ( "context" + "fmt" "net/url" "os" "os/signal" - "syscall" "git.cryptic.systems/volker.raschek/flucky/pkg/config" "git.cryptic.systems/volker.raschek/flucky/pkg/repository" @@ -29,17 +29,39 @@ func Start(cnf *config.Config, flogger logger.Logger) error { return err } - repoSensors, err := repo.GetSensors() - if err != nil { + // Add + repoDevice, err := repo.GetDevice(cnf.Device.ID) + switch { + case err != nil: return err + case repoDevice == nil: + err = repo.AddDevices(cnf.Device) + if err != nil { + return err + } + + repoDevice, err = repo.GetDevice(cnf.Device.ID) + if err != nil { + return err + } + } + + repoSensors, err := repo.GetSensorsByDeviceID(repoDevice.ID) + switch { + case err != nil: + return err + case repoSensors == nil, len(repoSensors) <= 0: + return fmt.Errorf("No sensors found") } sensors := make([]sensor.Sensor, 0) for _, repoSensor := range repoSensors { - if !repoSensor.Enabled { + if !repoSensor.Enabled || repoSensor.DeviceID != repoDevice.ID { continue } + flogger.Debug("Found sensor %v", repoSensor.GetName()) + sensor, err := sensor.New(repoSensor) if err != nil { return err @@ -48,7 +70,7 @@ func Start(cnf *config.Config, flogger logger.Logger) error { } interruptChannel := make(chan os.Signal, 1) - signal.Notify(interruptChannel, os.Kill, syscall.SIGTERM) + signal.Notify(interruptChannel, os.Interrupt, os.Kill) // Collection parentCtx := context.Background() @@ -82,7 +104,7 @@ func Start(cnf *config.Config, flogger logger.Logger) error { measuredValues = append(measuredValues, measuredValue) if cap(measuredValues) == len(measuredValues) { - flogger.Debug("Flush cache") + flogger.Debug("Flush cache with %v values", len(measuredValues)) err := repo.AddMeasuredValues(measuredValues...) if err != nil { flogger.Error("%v", err) @@ -90,16 +112,26 @@ func Start(cnf *config.Config, flogger logger.Logger) error { measuredValues = make([]*types.MeasuredValue, 0, 10) } - case <-interruptChannel: + case signal := <-interruptChannel: cancel() close(measuredValueChannel) + flogger.Info("Stopping daemon: Received process signal %v", signal.String()) + + flogger.Debug("Flush cache with %v remaining values", len(measuredValues)) + err := repo.AddMeasuredValues(measuredValues...) if err != nil { flogger.Error("%v", err) } - break + flogger.Debug("Close repository") + err = repo.Close() + if err != nil { + flogger.Error("%v", err) + } + + return nil } } } diff --git a/pkg/repository/db/db.go b/pkg/repository/db/db.go index 5a58b96..c793750 100644 --- a/pkg/repository/db/db.go +++ b/pkg/repository/db/db.go @@ -16,6 +16,7 @@ import ( // Database is a general interface for a database backend like postgres, oracle // or sqlite type Database interface { + Close() error DeleteDevices(ctx context.Context, deviceIDs ...string) error DeleteSensors(ctx context.Context, sensorIDs ...string) error InsertDevices(ctx context.Context, devices ...*types.Device) error @@ -120,5 +121,4 @@ func New(dsnURL *url.URL, flogger logger.Logger) (Database, error) { } return database, nil - } diff --git a/pkg/repository/db/postgres.go b/pkg/repository/db/postgres.go index 315594e..3b40f7f 100644 --- a/pkg/repository/db/postgres.go +++ b/pkg/repository/db/postgres.go @@ -17,6 +17,12 @@ type Postgres struct { queries map[string]string } +// Close closes the database and prevents new queries from starting. Close then +// waits for all queries that have started processing on the server to finish. +func (postgres *Postgres) Close() error { + return postgres.dbo.Close() +} + // DeleteDevices from the database func (postgres *Postgres) DeleteDevices(ctx context.Context, deviceIDs ...string) error { queryFile := "deleteDevice.sql" @@ -228,7 +234,7 @@ func (postgres *Postgres) Scheme(ctx context.Context) error { for _, query := range []string{ postgres.queries["createTableDevices.sql"], postgres.queries["createTableSensors.sql"], - postgres.queries["createTableHumidites.sql"], + postgres.queries["createTableHumidities.sql"], postgres.queries["createTablePressures.sql"], postgres.queries["createTableTemperatures.sql"], } { diff --git a/pkg/repository/db/sqlite.go b/pkg/repository/db/sqlite.go index a89edde..82fa668 100644 --- a/pkg/repository/db/sqlite.go +++ b/pkg/repository/db/sqlite.go @@ -16,6 +16,12 @@ type SQLite struct { queries map[string]string } +// Close closes the database and prevents new queries from starting. Close then +// waits for all queries that have started processing on the server to finish. +func (sqlite *SQLite) Close() error { + return sqlite.dbo.Close() +} + // DeleteDevices from the database func (sqlite *SQLite) DeleteDevices(ctx context.Context, deviceIDs ...string) error { queryFile := "deleteDevice.sql" @@ -227,7 +233,7 @@ func (sqlite *SQLite) Scheme(ctx context.Context) error { for _, query := range []string{ sqlite.queries["createTableDevices.sql"], sqlite.queries["createTableSensors.sql"], - sqlite.queries["createTableHumidites.sql"], + sqlite.queries["createTableHumidities.sql"], sqlite.queries["createTablePressures.sql"], sqlite.queries["createTableTemperatures.sql"], } { diff --git a/pkg/repository/repository.go b/pkg/repository/repository.go index 5250039..21d6379 100644 --- a/pkg/repository/repository.go +++ b/pkg/repository/repository.go @@ -31,6 +31,13 @@ func (repo *Repository) AddSensors(sensors ...*types.Sensor) error { return repo.database.InsertSensors(context.Background(), sensors...) } +// Close closes the repository and prevents new queries from starting. Close +// then waits for all queries that have started processing on the server to +// finish. +func (repo *Repository) Close() error { + return repo.database.Close() +} + // DisableSensorsByNames disable all sensors which match bei their name func (repo *Repository) DisableSensorsByNames(sensorNames ...string) error { sensors, err := repo.GetSensors() diff --git a/pkg/repository/repository_test.go b/pkg/repository/repository_test.go index 9309ef9..afe88d4 100644 --- a/pkg/repository/repository_test.go +++ b/pkg/repository/repository_test.go @@ -278,7 +278,7 @@ func testBackend(t *testing.T, repo *repository.Repository) { { ID: "2e5a297a-3da0-46ae-89d2-0fcab0f1d5f7", Value: 32, - ValueType: "temperature", + ValueType: "humidity", Date: *timeNow(require), SensorID: "8c74397f-8e60-4c9d-960d-3197747cef9a", CreationDate: *timeNow(require), @@ -287,7 +287,7 @@ func testBackend(t *testing.T, repo *repository.Repository) { { ID: "d69f1b62-0c6c-4058-b42c-4a2821bd220c", Value: 38, - ValueType: "temperature", + ValueType: "pressure", Date: *timeNow(require), SensorID: "8c74397f-8e60-4c9d-960d-3197747cef9a", CreationDate: *timeNow(require),