Skip to content

Commit

Permalink
Init state from DB instead of script
Browse files Browse the repository at this point in the history
  • Loading branch information
mame82 committed Nov 15, 2018
1 parent e85e618 commit 5a08364
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 28 deletions.
Binary file added dist/db/init.db
Binary file not shown.
13 changes: 10 additions & 3 deletions service/bluetooth.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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...")
Expand Down Expand Up @@ -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())
}
Expand All @@ -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 {
Expand Down
30 changes: 26 additions & 4 deletions service/datastore/store.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down Expand Up @@ -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
Expand Down
56 changes: 47 additions & 9 deletions service/rpc_server.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
}

Expand Down Expand Up @@ -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{}
Expand Down Expand Up @@ -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
Expand All @@ -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
}
Expand Down
19 changes: 7 additions & 12 deletions service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down Expand Up @@ -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
}
Expand Down Expand Up @@ -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 ...")
Expand Down

0 comments on commit 5a08364

Please sign in to comment.