aboutsummaryrefslogtreecommitdiff
path: root/verifysetup/core/storage.go
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--verifysetup/core/storage.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/verifysetup/core/storage.go b/verifysetup/core/storage.go
new file mode 100644
index 0000000..831d637
--- /dev/null
+++ b/verifysetup/core/storage.go
@@ -0,0 +1,75 @@
+package core
+
+import (
+ "bytes"
+ "encoding/json"
+ "fmt"
+ verify "github.com/axtloss/fsverify/core"
+ bolt "go.etcd.io/bbolt"
+)
+
+var TotalReadBlocks = 0
+
+func ReadBlock(start int, end int, device *bytes.Reader) ([]byte, error) {
+ block := make([]byte, end-start)
+ _, err := device.Seek(int64(start), 0)
+ if err != nil {
+ return []byte{}, err
+ }
+ _, err = device.Read(block)
+ TotalReadBlocks = TotalReadBlocks + (end - start)
+ return block, err
+}
+
+func CreateNode(blockStart int, blockEnd int, block []byte, prevNode *verify.Node) (verify.Node, error) {
+ node := verify.Node{}
+ node.BlockStart = blockStart
+ node.BlockEnd = blockEnd
+ blockHash, err := CalculateBlockHash(block)
+ if err != nil {
+ return verify.Node{}, err
+ }
+ node.BlockSum = blockHash
+ var prevNodeHash string
+ if prevNode.PrevNodeSum != "" {
+ prevNodeHash, err = prevNode.GetHash()
+ if err != nil {
+ return verify.Node{}, err
+ }
+ } else {
+ prevNodeHash = "Entrypoint"
+ }
+ node.PrevNodeSum = prevNodeHash
+ return node, nil
+}
+
+func AddNode(node verify.Node, db *bolt.DB, dbPath string) error {
+ var err error
+ var deferDB bool
+ if db == nil {
+ db, err = bolt.Open(dbPath, 0777, nil)
+ if err != nil {
+ return err
+ }
+ deferDB = true
+ } else if db.IsReadOnly() {
+ return fmt.Errorf("Error: database is opened read only, unable to add nodes")
+ }
+ err = db.Update(func(tx *bolt.Tx) error {
+ nodes, err := tx.CreateBucketIfNotExists([]byte("Nodes"))
+ if err != nil {
+ return err
+ }
+ if buf, err := json.Marshal(node); err != nil {
+ return err
+ } else if err := nodes.Put([]byte(node.PrevNodeSum), buf); err != nil {
+ return err
+ }
+ return nil
+
+ })
+ if deferDB {
+ defer db.Close()
+ }
+ return err
+}