diff --git a/dist/db/init.db b/dist/db/init.db new file mode 100644 index 0000000..4e86b42 Binary files /dev/null and b/dist/db/init.db differ diff --git a/service/bluetooth.go b/service/bluetooth.go index 2e6d4e1..c201cd3 100644 --- a/service/bluetooth.go +++ b/service/bluetooth.go @@ -30,6 +30,8 @@ type BtService struct { BrName string //bridgeIfDeployed bool + defaultSettings *pb.BluetoothSettings //This settings are changed if the BluetoothService isn't up, but settings are deployed (Master Template on startup) + Agent *bluetooth.DefaultAgent serviceAvailableLock *sync.Mutex @@ -70,6 +72,7 @@ func NewBtService(rootService *Service, retryTimeout time.Duration) (res *BtServ Agent: bluetooth.NewDefaultAgent("1337"), BrName: BT_ETHERNET_BRIDGE_NAME, serviceAvailableLock: &sync.Mutex{}, + defaultSettings:GetDefaultBluetoothSettings(), } log.Println("Starting Bluetooth sub system...") @@ -101,12 +104,12 @@ func NewBtService(rootService *Service, retryTimeout time.Duration) (res *BtServ res.Agent.Start(toolz.AGENT_CAP_NO_INPUT_NO_OUTPUT) // Deploy default settings - defaultSettings := GetDefaultBluetoothSettings() - _,err := res.DeployBluetoothControllerInformation(defaultSettings.Ci) + + _,err := res.DeployBluetoothControllerInformation(res.defaultSettings.Ci) if err != nil { log.Println("Not able to deploy default bluetooth settings: ", err.Error()) } else { - _,err = res.DeployBluetoothAgentSettings(defaultSettings.As) + _,err = res.DeployBluetoothAgentSettings(res.defaultSettings.As) if err != nil { log.Println("Not able to deploy default bluetooth agent settings: ", err.Error()) } @@ -119,6 +122,10 @@ func NewBtService(rootService *Service, retryTimeout time.Duration) (res *BtServ return } +func (bt *BtService) ReplaceDefaultSettings(s *pb.BluetoothSettings) { + bt.defaultSettings = s +} + func (bt *BtService) Stop() { bt.Agent.Stop() // unregister the agent again if ci,err := bt.Controller.ReadControllerInformation(); err == nil { diff --git a/service/datastore/store.go b/service/datastore/store.go index 45039f8..df87b57 100644 --- a/service/datastore/store.go +++ b/service/datastore/store.go @@ -32,17 +32,39 @@ type Store struct { serializer Serializer } -func (s *Store) Open() (err error) { +func exists(path string) (bool, error) { + _, err := os.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return true, err +} + +func (s *Store) Open(initDbBackupPath string) (err error) { badgerOpts := badger.DefaultOptions badgerOpts.Dir = s.Path badgerOpts.ValueDir = s.Path badgerOpts.SyncWrites = true badgerOpts.TableLoadingMode = options.FileIO badgerOpts.ValueLogLoadingMode = options.FileIO + + // check if DB dir exists + exists,err := exists(s.Path) + if err != nil { return err } + s.Db, err = badger.Open(badgerOpts) if s.serializer == nil { s.serializer = NewSerializerProtobuf(false) } + + //If the s.Path didn't exist, we have a clean and empty DB at this point and thus restore a initial db + if !exists { + err = s.Restore(initDbBackupPath, true) + } + return err } @@ -314,11 +336,11 @@ func (s *Store) DeleteMulti(keys []string) (err error) { return nil } -func Open(path string) (store *Store, err error) { +func Open(workPath string, initDbBackupPath string) (store *Store, err error) { store = &Store{ - Path: path, + Path: workPath, } - if err = store.Open(); err != nil { + if err = store.Open(initDbBackupPath); err != nil { return nil, err } return diff --git a/service/rpc_server.go b/service/rpc_server.go index 8e98e11..1be4be7 100644 --- a/service/rpc_server.go +++ b/service/rpc_server.go @@ -10,6 +10,7 @@ import ( "github.com/mame82/P4wnP1_go/common" "github.com/mame82/P4wnP1_go/common_web" pb "github.com/mame82/P4wnP1_go/proto" + "github.com/mame82/P4wnP1_go/service/bluetooth" "golang.org/x/net/context" "google.golang.org/grpc" "io" @@ -77,30 +78,64 @@ func (s *server) GetAvailableGpios(context.Context, *pb.Empty) (res *pb.StringMe func (s *server) DeployMasterTemplate(ctx context.Context, mt *pb.MasterTemplate) (e *pb.Empty, err error) { e = &pb.Empty{} + fmt.Println("Deploying master template ...") + //ignore templates with name of length 0 if len(mt.TemplateNameTriggerActions) > 0 { + fmt.Printf("... deploying TriggerActions '%s' ...\n", mt.TemplateNameTriggerActions) _,err = s.DeployStoredTriggerActionSetReplace(ctx, &pb.StringMessage{Msg: mt.TemplateNameTriggerActions}) - if err != nil { return } - + if err != nil { + fmt.Printf("... error deploying TriggerActions '%s'\n", mt.TemplateNameTriggerActions) + return + } + fmt.Printf("... succeeded deploying TriggerActions '%s'\n", mt.TemplateNameTriggerActions) } for _,nnw := range mt.TemplateNamesNetwork { + fmt.Printf("... deploying Network Interface Settings '%s' ...\n", nnw) _,err = s.DeployStoredEthernetInterfaceSettings(ctx, &pb.StringMessage{Msg: nnw}) - if err != nil { return } + if err != nil { + fmt.Printf("... error deploying Network Interface Settings '%s'\n", nnw) + return + } + fmt.Printf("... succeeded deploying Network Interface Settings '%s'\n", nnw) } if len(mt.TemplateNameBluetooth) > 0 { - _, err = s.DeployStoredBluetoothSettings(ctx, &pb.StringMessage{Msg: mt.TemplateNameBluetooth}) - if err != nil { return } + fmt.Printf("... deploying Bluetooth settings '%s' ...\n", mt.TemplateNameBluetooth) + _, btErr := s.DeployStoredBluetoothSettings(ctx, &pb.StringMessage{Msg: mt.TemplateNameBluetooth}) + if btErr != nil { + if btErr == bluetooth.ErrBtSvcNotAvailable { + fmt.Printf("... ignoring Bluetooth error '%s'\n", mt.TemplateNameBluetooth) + + } else { + fmt.Printf("... error deploying Bluetooth settings '%s'\n", mt.TemplateNameBluetooth) + return + } + fmt.Printf("... error deploying Bluetooth settings '%s'\n", mt.TemplateNameBluetooth) + } + fmt.Printf("... succeeded deploying Bluetooth settings '%s'\n", mt.TemplateNameBluetooth) } if len(mt.TemplateNameUsb) > 0 { + fmt.Printf("... deploying USB settings '%s' ...\n", mt.TemplateNameUsb) _, err = s.DeployStoredUSBSettings(ctx, &pb.StringMessage{Msg: mt.TemplateNameUsb}) - if err != nil { return } + if err != nil { + fmt.Printf("... error deploying USB settings '%s'\n", mt.TemplateNameUsb) + return + } + fmt.Printf("... succeeded deploying USB settings '%s'\n", mt.TemplateNameUsb) } if len(mt.TemplateNameWifi) > 0 { + fmt.Printf("... deploying WiFi settings '%s' ...\n", mt.TemplateNameWifi) _, err = s.DeployStoredWifiSettings(ctx, &pb.StringMessage{Msg: mt.TemplateNameWifi}) - if err != nil { return } + if err != nil { + fmt.Printf("... error deploying WiFi settings '%s'\n", mt.TemplateNameWifi) + return + } + fmt.Printf("... succeeded deploying WiFi settings '%s'\n", mt.TemplateNameWifi) } + + fmt.Println("... master template deployed successfully") return } @@ -206,6 +241,9 @@ func (s *server) FireActionGroupSend(ctx context.Context, gs *pb.ActionGroupSend func (s *server) DeployBluetoothSettings(ctx context.Context, settings *pb.BluetoothSettings) (resultSettings *pb.BluetoothSettings, err error) { defer s.rootSvc.SubSysEvent.Emit(ConstructEventNotifyStateChange(common_web.STATE_CHANGE_EVT_TYPE_BLUETOOTH)) + //Overwrite default settings, in case the bluetooth sub system comes up later + s.rootSvc.SubSysBluetooth.ReplaceDefaultSettings(settings) + as := settings.As ci := settings.Ci resultSettings = &pb.BluetoothSettings{} @@ -805,7 +843,7 @@ func (s *server) GetAllDeployedEthernetInterfaceSettings(ctx context.Context, em func (s *server) DeployEthernetInterfaceSettings(ctx context.Context, es *pb.EthernetInterfaceSettings) (empty *pb.Empty, err error) { defer s.rootSvc.SubSysEvent.Emit(ConstructEventNotifyStateChange(common_web.STATE_CHANGE_EVT_TYPE_NETWORK)) - log.Printf("Trying to deploy ethernet interface settings %v", es) + log.Printf("Trying to deploy ethernet interface settings %v\n", es) empty = &pb.Empty{} iname := es.Name @@ -814,7 +852,7 @@ func (s *server) DeployEthernetInterfaceSettings(ctx context.Context, es *pb.Eth err = nim.DeploySettings(es) if err != nil { - log.Printf("Error deploying ethernet interface settings %v", err) + log.Printf("Error deploying ethernet interface settings %v\n", err) } return } diff --git a/service/service.go b/service/service.go index 48dc315..dbebef0 100644 --- a/service/service.go +++ b/service/service.go @@ -3,6 +3,8 @@ package service import ( + "context" + "fmt" "github.com/mame82/P4wnP1_go/common_web" pb "github.com/mame82/P4wnP1_go/proto" "github.com/mame82/P4wnP1_go/service/datastore" @@ -129,7 +131,7 @@ type Service struct { func NewService() (svc *Service, err error) { svc = &Service{} - svc.SubSysDataStore, err = datastore.Open(PATH_DATA_STORE) + svc.SubSysDataStore, err = datastore.Open(PATH_DATA_STORE, PATH_DATA_STORE_BACKUP + "/init.db") if err != nil { return nil, err } @@ -175,20 +177,13 @@ func (s *Service) Start() { s.SubSysTriggerActions.Start() // Register TriggerActions + /* log.Println("Register default TriggerActions ...") RegisterDefaultTriggerActions(s.SubSysTriggerActions) - - /* - // ToDo: 1) Manual start of BT NAP, has to be replaced by settings based approach (same as other subsystems) - // ToDo: 2) create a signal based method s.SubSysBluetooth.WaitTillServiceUp(timeout duration) - go func() { - timeStart := time.Now() - for timeSinceStart := time.Since(timeStart); !s.SubSysBluetooth.IsServiceAvailable() && timeSinceStart < time.Second*120 ;timeSinceStart = time.Since(timeStart) { - time.Sleep(time.Second) - } - s.SubSysBluetooth.StartNAP() - }() */ + fmt.Println("Trying to deploy master template...") + _,err := s.SubSysRPC.DeployStoredMasterTemplate(context.Background(), &pb.StringMessage{Msg:"startup"}) + fmt.Println("...!!!!! MASTER TEMPLATE:", err) // fire service started Event log.Println("Fire service started event ...")