-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
124 lines (101 loc) · 2.52 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package main
import (
"encoding/json"
"fmt"
"log"
"strings"
"github.com/thejff/go-chucklechain/api"
"github.com/thejff/go-chucklechain/config"
"github.com/thejff/go-chucklechain/datastore"
"github.com/thejff/go-chucklechain/key"
"github.com/thejff/go-chucklechain/structs"
)
func main() {
fileCfg, err := config.Get()
if err != nil {
log.Fatalln(err)
}
ds := datastore.NewDatastore[any](fileCfg.Me.DatastorePath)
cfg, err := initialise(ds, fileCfg)
if err != nil {
log.Fatalln(err)
}
pkey, err := key.LoadRSA[any](cfg.Self.Identity.PrivateKey)
if err != nil {
log.Fatalln(err)
}
a := api.New(cfg, pkey)
if err := a.Start(); err != nil {
log.Fatalln(err)
}
}
func initialise(ds datastore.Datastore[any], cfg *config.Config) (structs.DsConfig, error) {
dsConf, err := ds.Read("config")
if err != nil {
if strings.ToLower(err.Error()) == "key not found" {
return structs.DsConfig{}, onboardConfig(ds, cfg)
}
return structs.DsConfig{}, err
}
bCfg, err := json.Marshal(dsConf.Data)
if err != nil {
return structs.DsConfig{}, err
}
storedCfg := structs.DsConfig{}
if err := json.Unmarshal(bCfg, &storedCfg); err != nil {
return structs.DsConfig{}, err
}
fmt.Println("Config already exists")
return storedCfg, nil
}
func onboardConfig(ds datastore.Datastore[any], cfg *config.Config) error {
// Create a new config object
// Store it in the datastore
key, err := key.NewRSA[any]()
if err != nil {
return err
}
pem := key.GetPrivatePEM()
neighbours := []structs.DsConfigNeighbour{}
for _, n := range cfg.NearestNeighbours {
neighbours = append(neighbours, structs.DsConfigNeighbour{
Name: n.Name,
Protocol: n.Protocol,
URL: n.URL,
Port: n.Port,
Identity: structs.DsConfigIdentity{
Type: n.Identity.Type,
PublicKey: n.Identity.PublicKey,
},
})
}
data := structs.DsConfig{
Self: structs.DsConfigSelf{
Name: cfg.Me.Name,
Protocol: cfg.Me.Protocol,
URL: cfg.Me.URL,
Port: cfg.Me.Port,
ApiPort: cfg.Me.ApiPort,
Identity: structs.DsConfigPrivateIdentity{
Type: "rsa",
PrivateKey: pem,
},
},
Network: structs.DsConfigNetwork{
ConsensusThreshold: cfg.Network.ConsensusThreshold,
Consensus: cfg.Network.Consensus,
},
Neighbours: neighbours,
}
confObj, err := datastore.NewObject[any](data)
if err != nil {
return err
}
confObj.UUID = "config"
confObj.Environment = "self"
confObj.Type = "config"
if err := ds.Write("config", confObj); err != nil {
return err
}
return nil
}