diff --git a/go.sum b/go.sum index ef55f98..6f492d1 100644 --- a/go.sum +++ b/go.sum @@ -30,8 +30,6 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/c-bata/go-prompt v0.2.5 h1:3zg6PecEywxNn0xiqcXHD96fkbxghD+gdB2tbsYfl+Y= github.com/c-bata/go-prompt v0.2.5/go.mod h1:vFnjEGDIIA/Lib7giyE4E9c50Lvl8j0S+7FVlAwDAVw= -github.com/c-bata/go-prompt v0.2.6 h1:POP+nrHE+DfLYx370bedwNhsqmpCUynWPxuHi0C5vZI= -github.com/c-bata/go-prompt v0.2.6/go.mod h1:/LMAke8wD2FsNu9EXNdHxNLbd9MedkPnCdfpU9wwHfY= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= @@ -177,8 +175,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk= github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= -github.com/pkg/term v1.2.0-beta.2 h1:L3y/h2jkuBVFdWiJvNfYfKmzcCnILw7mJWm2JQuMppw= -github.com/pkg/term v1.2.0-beta.2/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= github.com/plar/go-adaptive-radix-tree v1.0.4 h1:Ucd8R6RH2E7RW8ZtDKrsWyOD3paG2qqJO0I20WQ8oWQ= github.com/plar/go-adaptive-radix-tree v1.0.4/go.mod h1:Ot8d28EII3i7Lv4PSvBlF8ejiD/CtRYDuPsySJbSaK8= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/src/eros/eros.go b/src/eros/eros.go index a184cf7..32ba398 100644 --- a/src/eros/eros.go +++ b/src/eros/eros.go @@ -27,12 +27,16 @@ import ( ) var ( - // deviceDb will hold details about devices discovered - deviceDb *bitcask.Bitcask - // attackDb will hold details about exploits to be used against BLE devices - attackDb *bitcask.Bitcask - // serviceDb will hold definitions of various bluetook services and will ultimately be updated via an HTTP repository - serviceDb *bitcask.Bitcask + // devices will hold details about devices discovered + // exploits will hold details about exploits to be used against BLE devices + // services will hold definitions of various bluetook services and will ultimately be updated via an HTTP repository + // manufacturers will hold manufacturer to UUID correlations + dbs = []string { + "devices", + "exploits", + "services", + "manufacturers", + } err error Manufacturers ManufData @@ -41,9 +45,10 @@ var ( DataDir string = "./.eros-data/" ) +var DB map[string]*bitcask.Bitcask + // Ingest UUID will add the UUID to the manufacturer if it doesn't already exist func (manuf *Manufacturer) IngestUUID(uuid bluetooth.UUID) bool { - contains := func(s []bluetooth.UUID, v bluetooth.UUID) bool { for _, a := range s { if a == v { @@ -72,8 +77,8 @@ func ManufLoad() { f, err := os.Open(path) if err != nil { - log.Debug().Msg(err.Error()) - os.Exit(1) + log.Error().Err(err). + Msg("Failed to open JSON file") } defer f.Close() @@ -132,44 +137,49 @@ func ManufLoad() { Manufacturers.Entries = append(Manufacturers.Entries, *mf) } } + + for _, manuf := range Manufacturers.Entries { + var jsonData []byte + jsonData, err = json.Marshal(manuf) + if err != nil { + log.Fatal().Err(err). + Msg("EROS_FATAL_MANUFACTURER_JSON_MARSHAL") + } + + err := DB["manufacturers"].Put([]byte(manuf.Name), jsonData) + if err != nil { + log.Fatal().Err(err). + Msg("EROS_FATAL_MANUFACTURER_JSON_STORE") + } + + log.Debug().Str("Name", manuf.Name). + Msg("EROS_MANUFACTURER_STORE") + } } // Awaken - create the data directory if it does not exist; initialize bitcask in this directory func Awaken() { - //log.Debug().Str("DataDir",DataDir).Msg("Initializing eros...") - - deviceDb, err = bitcask.Open(DataDir + "devices") - if err != nil { - panic(err.Error) - } - - attackDb, err = bitcask.Open(DataDir + "exploits") - if err != nil { - panic(err.Error) - } - - serviceDb, err = bitcask.Open(DataDir + "services") - if err != nil { - panic(err.Error) + DB = make(map[string]*bitcask.Bitcask) + for _, name := range dbs { + DB[name], err = bitcask.Open(DataDir + name) + if err != nil { + panic(err.Error()) + } } } // Slumber - Clean up database entries, sync them to persistent storage, and safelty close the database. func Slumber() { - rest := func(db *bitcask.Bitcask) { + for _, db := range DB { db.Merge() db.Sync() db.Close() } - - rest(deviceDb) - rest(attackDb) - rest(serviceDb) } // Exists - check if a device is present in the Database func Exists(Addr string) bool { - if deviceDb.Has([]byte(Addr)) { + if DB["devices"].Has([]byte(Addr)) { return true } @@ -200,7 +210,7 @@ func Remember(dev Device) error { return err } - err = deviceDb.Put([]byte(dev.Addr), jsonData) + err = DB["devices"].Put([]byte(dev.Addr), jsonData) return err } @@ -210,7 +220,7 @@ func Recall(Addr string) (Device, error) { var bytes []byte var member Device - bytes, err = deviceDb.Get([]byte(Addr)) + bytes, err = DB["devices"].Get([]byte(Addr)) if err != nil { member = Device{} @@ -221,6 +231,18 @@ func Recall(Addr string) (Device, error) { return member, err } +func Backup(path string) { + for _, db := range DB { + db.Merge() + db.Sync() + err := db.Backup(path) + if err != nil { + panic(err.Error()) + } + } + +} + // Hypnosis - retrieve new exploits/attacks from a remote http repository func Hypnosis(repo string) { // placeholder