From 3cfcaf8a935a9f913f3e0e14a88e531e0ff35efa Mon Sep 17 00:00:00 2001 From: James Reategui Date: Fri, 31 May 2024 13:40:40 -0400 Subject: [PATCH] SM-637 delete all settings when get VIN over BLE (#79) --- ble_chars.go | 21 ++++++--- certificate/certificate.go | 13 +++--- certificate/certificate_test.go | 13 +++--- commands/vehicle_test.go | 9 ++-- config/config.go | 3 +- internal/gateways/identity_api.go | 3 +- internal/gateways/vehicle_signal_decoding.go | 3 +- internal/loggers/mocks/template_store_mock.go | 16 ++++++- internal/loggers/passive_can_dumper.go | 3 +- internal/loggers/template_store.go | 46 +++++++++++++++++++ internal/loggers/vin_logger.go | 5 +- internal/models/network.go | 3 +- internal/network/data_sender.go | 3 +- internal/network/data_sender_test.go | 3 +- 14 files changed, 111 insertions(+), 33 deletions(-) diff --git a/ble_chars.go b/ble_chars.go index 76a68ee5..af6b2cb7 100644 --- a/ble_chars.go +++ b/ble_chars.go @@ -418,7 +418,7 @@ func setupBluetoothApplication(logger zerolog.Logger, coldBoot bool, vinLogger l vinChar.OnRead(func(_ *service.Char, _ map[string]interface{}) (resp []byte, err error) { defer func() { if err != nil { - logger.Err(err).Ctx(context.WithValue(context.Background(), internal.LogToMqtt, "true")).Msgf("Error retrieving VIN: %s", err) + logger.Err(err).Ctx(context.WithValue(context.Background(), internal.LogToMqtt, "true")).Msgf("error retrieving VIN via BLE: %s", err) } }() @@ -427,25 +427,32 @@ func setupBluetoothApplication(logger zerolog.Logger, coldBoot bool, vinLogger l logger.Info().Msgf("Returning cached VIN: %s", lastVIN) return } + // clear all settings since this is most likely a brand new pairing + errDel := lss.DeleteAllSettings() + if errDel != nil { + logger.Err(errDel).Msgf("there was one or more errors deleting settings from disk, continuing") + } vinResp, err := vinLogger.GetVIN(unitID, nil) if err != nil { - err = nil logger.Err(err).Msgf("Unable to get VIN") resp = []byte("00000000000000000") return } - logger.Info().Msgf("Got Protocol: %s", vinResp.Protocol) // need to do something with protocol to set right template - logger.Info().Msgf("Got VIN: %s", vinResp.VIN) + logger.Info().Msgf("Got Protocol: %s", vinResp.Protocol) // verify using protocol when requesting template + logger.Info().Ctx(context.WithValue(context.Background(), internal.LogToMqtt, "true")).Msg("Got VIN via BLE") //note we don't send the VIN to cloud logs for PII + logger.Info().Msgf(vinResp.VIN) lastVIN = vinResp.VIN lastProtocol = vinResp.Protocol resp = []byte(lastVIN) // we want to do this each time in case the device is being paired to a different vehicle - err = lss.WriteVINConfig(models.VINLoggerSettings{VINQueryName: vinResp.QueryName, VIN: lastVIN}) - if err != nil { - logger.Err(err).Msgf("failed to save vin query name in settings: %s", err) + errSaveCfg := lss.WriteVINConfig(models.VINLoggerSettings{VINQueryName: vinResp.QueryName, VIN: lastVIN}) + if errSaveCfg != nil { + logger.Err(errSaveCfg).Ctx(context.WithValue(context.Background(), internal.LogToMqtt, "true")). + Msgf("failed to save vin query name in settings: %s", err) } + // todo restart the application? return }) diff --git a/certificate/certificate.go b/certificate/certificate.go index 37e5638b..6189a86b 100644 --- a/certificate/certificate.go +++ b/certificate/certificate.go @@ -11,6 +11,13 @@ import ( "encoding/json" "encoding/pem" "fmt" + "io" + "net/http" + "net/url" + "os" + "strings" + "time" + "github.com/DIMO-Network/edge-network/commands" "github.com/DIMO-Network/edge-network/config" "github.com/ethereum/go-ethereum/common" @@ -23,12 +30,6 @@ import ( "github.com/smallstep/certificates/ca" "go.step.sm/crypto/jose" "go.step.sm/crypto/x509util" - "io" - "net/http" - "net/url" - "os" - "strings" - "time" ) const domain = "http://127.0.0.1:10000" diff --git a/certificate/certificate_test.go b/certificate/certificate_test.go index 651109fb..18bf61c3 100644 --- a/certificate/certificate_test.go +++ b/certificate/certificate_test.go @@ -7,6 +7,13 @@ import ( "crypto/x509" "crypto/x509/pkix" "fmt" + "math/big" + "net/http" + "os" + "reflect" + "testing" + "time" + dimoConfig "github.com/DIMO-Network/edge-network/config" "github.com/google/uuid" "github.com/jarcoal/httpmock" @@ -14,12 +21,6 @@ import ( "github.com/smallstep/certificates/api" "github.com/stretchr/testify/assert" "go.uber.org/mock/gomock" - "math/big" - "net/http" - "os" - "reflect" - "testing" - "time" ) func TestCertificateService_GetOauthToken(t *testing.T) { diff --git a/commands/vehicle_test.go b/commands/vehicle_test.go index 1045e730..5aa582f1 100644 --- a/commands/vehicle_test.go +++ b/commands/vehicle_test.go @@ -3,6 +3,11 @@ package commands import ( "encoding/json" "fmt" + "io" + "net/http" + "os" + "testing" + "github.com/DIMO-Network/edge-network/internal/api" "github.com/DIMO-Network/edge-network/internal/models" "github.com/google/uuid" @@ -10,10 +15,6 @@ import ( "github.com/rs/zerolog" "github.com/stretchr/testify/assert" "go.uber.org/mock/gomock" - "io" - "net/http" - "os" - "testing" ) func Test_isValidHex(t *testing.T) { diff --git a/config/config.go b/config/config.go index ff4d1b21..c56df269 100644 --- a/config/config.go +++ b/config/config.go @@ -3,9 +3,10 @@ package config import ( "embed" "fmt" - "github.com/DIMO-Network/shared" "io/fs" "os" + + "github.com/DIMO-Network/shared" ) // Config represents the configuration for the edge-network diff --git a/internal/gateways/identity_api.go b/internal/gateways/identity_api.go index c888c3ae..7ab35c80 100644 --- a/internal/gateways/identity_api.go +++ b/internal/gateways/identity_api.go @@ -3,10 +3,11 @@ package gateways import ( "encoding/json" "fmt" - "github.com/DIMO-Network/edge-network/config" "io" "time" + "github.com/DIMO-Network/edge-network/config" + "github.com/DIMO-Network/edge-network/internal/models" "github.com/DIMO-Network/shared" "github.com/ethereum/go-ethereum/common" diff --git a/internal/gateways/vehicle_signal_decoding.go b/internal/gateways/vehicle_signal_decoding.go index 382984e4..83a9a73d 100644 --- a/internal/gateways/vehicle_signal_decoding.go +++ b/internal/gateways/vehicle_signal_decoding.go @@ -3,10 +3,11 @@ package gateways import ( "encoding/json" "fmt" - "github.com/DIMO-Network/edge-network/config" "io" "time" + "github.com/DIMO-Network/edge-network/config" + "github.com/rs/zerolog" "github.com/DIMO-Network/edge-network/internal/models" diff --git a/internal/loggers/mocks/template_store_mock.go b/internal/loggers/mocks/template_store_mock.go index 40be4860..4b6fe028 100644 --- a/internal/loggers/mocks/template_store_mock.go +++ b/internal/loggers/mocks/template_store_mock.go @@ -38,6 +38,20 @@ func (m *MockTemplateStore) EXPECT() *MockTemplateStoreMockRecorder { return m.recorder } +// DeleteAllSettings mocks base method. +func (m *MockTemplateStore) DeleteAllSettings() error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "DeleteAllSettings") + ret0, _ := ret[0].(error) + return ret0 +} + +// DeleteAllSettings indicates an expected call of DeleteAllSettings. +func (mr *MockTemplateStoreMockRecorder) DeleteAllSettings() *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DeleteAllSettings", reflect.TypeOf((*MockTemplateStore)(nil).DeleteAllSettings)) +} + // ReadPIDsConfig mocks base method. func (m *MockTemplateStore) ReadPIDsConfig() (*models.TemplatePIDs, error) { m.ctrl.T.Helper() @@ -178,7 +192,7 @@ func (m *MockTemplateStore) WriteVehicleInfo(settings models.VehicleInfo) error } // WriteVehicleInfo indicates an expected call of WriteVehicleInfo. -func (mr *MockTemplateStoreMockRecorder) WriteVehicleInfo(settings interface{}) *gomock.Call { +func (mr *MockTemplateStoreMockRecorder) WriteVehicleInfo(settings any) *gomock.Call { mr.mock.ctrl.T.Helper() return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WriteVehicleInfo", reflect.TypeOf((*MockTemplateStore)(nil).WriteVehicleInfo), settings) } diff --git a/internal/loggers/passive_can_dumper.go b/internal/loggers/passive_can_dumper.go index e618a3e1..e738a063 100644 --- a/internal/loggers/passive_can_dumper.go +++ b/internal/loggers/passive_can_dumper.go @@ -7,11 +7,12 @@ import ( "encoding/base64" "encoding/json" "errors" - dimoConfig "github.com/DIMO-Network/edge-network/config" "os" "strconv" "time" + dimoConfig "github.com/DIMO-Network/edge-network/config" + "github.com/DIMO-Network/edge-network/internal/models" "github.com/DIMO-Network/edge-network/internal/network" diff --git a/internal/loggers/template_store.go b/internal/loggers/template_store.go index 186c7a90..202aed78 100644 --- a/internal/loggers/template_store.go +++ b/internal/loggers/template_store.go @@ -4,8 +4,11 @@ import ( "encoding/json" "fmt" "os" + "strings" "sync" + "github.com/pkg/errors" + "github.com/DIMO-Network/edge-network/internal/models" ) @@ -33,6 +36,7 @@ type TemplateStore interface { ReadVehicleInfo() (*models.VehicleInfo, error) WriteVehicleInfo(settings models.VehicleInfo) error + DeleteAllSettings() error } // templateStore wraps reading and writing different configurations locally @@ -40,6 +44,22 @@ type templateStore struct { mu sync.Mutex } +func (ts *templateStore) DeleteAllSettings() error { + var errs []error + // Call each method and collect any errors + errs = append(errs, ts.deleteConfig(VINLoggerFile)) + errs = append(errs, ts.deleteConfig(PIDConfigFile)) + errs = append(errs, ts.deleteConfig(DeviceSettingsFile)) + errs = append(errs, ts.deleteConfig(VehicleInfoFile)) + errs = append(errs, ts.deleteConfig(TemplateURLsFile)) + + // Combine errors and print the result + if combinedErr := combineErrors(errs); combinedErr != nil { + return combinedErr + } + return nil +} + func (ts *templateStore) ReadTemplateURLs() (*models.TemplateURLs, error) { data, err := ts.readConfig(TemplateURLsFile) if err != nil { @@ -204,3 +224,29 @@ func (ts *templateStore) writeConfig(filePath string, settings interface{}) erro } return nil } + +func (ts *templateStore) deleteConfig(filePath string) error { + ts.mu.Lock() + defer ts.mu.Unlock() + // Open the file for writing (create if it doesn't exist) + err := os.Remove(filePath) + if err != nil { + return fmt.Errorf("error deleting file: %s", err) + } + + return nil +} + +// CombineErrors combines multiple errors into a single error +func combineErrors(errorList []error) error { + var errorMessages []string + for _, err := range errorList { + if err != nil { + errorMessages = append(errorMessages, err.Error()) + } + } + if len(errorMessages) == 0 { + return nil + } + return errors.New(strings.Join(errorMessages, "; ")) +} diff --git a/internal/loggers/vin_logger.go b/internal/loggers/vin_logger.go index 5a4209a5..fb214f5c 100644 --- a/internal/loggers/vin_logger.go +++ b/internal/loggers/vin_logger.go @@ -3,14 +3,15 @@ package loggers import ( "encoding/hex" "fmt" - "github.com/DIMO-Network/edge-network/commands" - "github.com/DIMO-Network/edge-network/internal/models" "regexp" "strconv" "sync" "time" "unicode" + "github.com/DIMO-Network/edge-network/commands" + "github.com/DIMO-Network/edge-network/internal/models" + "github.com/rs/zerolog" "github.com/google/uuid" diff --git a/internal/models/network.go b/internal/models/network.go index d7e8b7c2..d2f6371b 100644 --- a/internal/models/network.go +++ b/internal/models/network.go @@ -1,8 +1,9 @@ package models import ( - "github.com/DIMO-Network/edge-network/internal/api" "time" + + "github.com/DIMO-Network/edge-network/internal/api" ) type CanDumpData struct { diff --git a/internal/network/data_sender.go b/internal/network/data_sender.go index 2cdcc068..8572ad4f 100644 --- a/internal/network/data_sender.go +++ b/internal/network/data_sender.go @@ -9,12 +9,13 @@ import ( "encoding/hex" "encoding/json" "fmt" - "github.com/DIMO-Network/edge-network/config" "os" "strconv" "strings" "time" + "github.com/DIMO-Network/edge-network/config" + "github.com/DIMO-Network/edge-network/internal/models" "github.com/rs/zerolog" diff --git a/internal/network/data_sender_test.go b/internal/network/data_sender_test.go index f7b20684..756b6f37 100644 --- a/internal/network/data_sender_test.go +++ b/internal/network/data_sender_test.go @@ -6,7 +6,6 @@ import ( "encoding/base64" "encoding/json" "fmt" - dimoConfig "github.com/DIMO-Network/edge-network/config" "io" "net/http" "os" @@ -14,6 +13,8 @@ import ( "testing" "time" + dimoConfig "github.com/DIMO-Network/edge-network/config" + "github.com/DIMO-Network/edge-network/internal/models" "github.com/stretchr/testify/assert"