summaryrefslogtreecommitdiff
path: root/libgoal/system.go
blob: a72214dfb0ee93571db7149d2509ef38a05ef2d0 (plain)
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-2023 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
}