forked from algorand/go-algorand
-
Notifications
You must be signed in to change notification settings - Fork 0
/
system.go
88 lines (80 loc) · 2.59 KB
/
system.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
// Copyright (C) 2019-2021 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// go-algorand is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with go-algorand. If not, see <https://www.gnu.org/licenses/>.
package libgoal
import (
"encoding/json"
"os"
"path/filepath"
)
// SystemConfig is the json object in $ALGORAND_DATA/system.json
type SystemConfig struct {
// SharedServer is true if this is a daemon on a multiuser system.
// If not shared, kmd and other files are often stored under $ALGORAND_DATA when otherwise they might go under $HOME/.algorand/
SharedServer bool `json:"shared_server,omitempty"`
SystemdManaged bool `json:"systemd_managed,omitempty"`
}
// map data dir to loaded config
var systemConfigCache map[string]SystemConfig
func init() {
systemConfigCache = make(map[string]SystemConfig)
}
// ReadSystemConfig read and parse $ALGORAND_DATA/system.json
func ReadSystemConfig(dataDir string) (sc SystemConfig, err error) {
var ok bool
sc, ok = systemConfigCache[dataDir]
if ok {
return
}
fin, err := os.Open(filepath.Join(dataDir, "system.json"))
if _, isPathErr := err.(*os.PathError); isPathErr {
// no file is fine, just return defaults
err = nil
return
}
if err != nil {
return
}
dec := json.NewDecoder(fin)
err = dec.Decode(&sc)
if err == nil {
systemConfigCache[dataDir] = sc
}
return
}
// AlgorandDataIsPrivate returns true if the algod data dir can be considered 'private' and we can store all related data there.
// Otherwise, some data will likely go under ${HOME}/.algorand/
func AlgorandDataIsPrivate(dataDir string) bool {
if dataDir == "" {
return true
}
sc, err := ReadSystemConfig(dataDir)
if err != nil {
return true
}
return !sc.SharedServer
}
// AlgorandDaemonSystemdManaged returns true if the algod process for a given data dir is managed by systemd
// if not, algod will be managed as an indivudal process for the dir
func AlgorandDaemonSystemdManaged(dataDir string) bool {
if dataDir == "" {
return false
}
sc, err := ReadSystemConfig(dataDir)
if err != nil {
return false
}
return sc.SystemdManaged
}