/
id.go
129 lines (103 loc) · 2.89 KB
/
id.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
125
126
127
128
129
package localsystem
import (
"fmt"
"os"
"strings"
"github.com/byuoitav/common/log"
"github.com/byuoitav/common/nerr"
"github.com/byuoitav/common/structs"
)
const (
// EnvironmentFile is the location of the environment file for the av-control api
EnvironmentFile = "/avcapi/environment"
)
var (
systemID = os.Getenv("SYSTEM_ID")
installerID = os.Getenv("INSTALLER_ID")
)
// SystemID returns the pi hostname of the device
func SystemID() (string, *nerr.E) {
if len(systemID) == 0 {
return "", nerr.Create("SYSTEM_ID not set.", "string")
}
if !structs.IsDeviceIDValid(systemID) {
return "", nerr.Create("SYSTEM_ID is set as %s, which is an invalid hostname.", systemID)
}
return systemID, nil
}
// MustSystemID returns the pi hostname of the device, and panics if it isn't set or is invalid
func MustSystemID() string {
id, err := SystemID()
if err != nil {
log.L.Fatalf("%s", err.Error())
}
return id
}
// BuildingID returns the room ID of the pi based on the hostname (everything before the last '-')
func BuildingID() (string, *nerr.E) {
id, err := SystemID()
if err != nil {
return "", err.Addf("failed to get buildingID")
}
split := strings.Split(id, "-")
return split[0], nil
}
// MustBuildingID returns the buildingID or panics if it fails
func MustBuildingID() string {
id, err := BuildingID()
if err != nil {
log.L.Fatalf("failed to get buildingID: %s", err.Error())
}
return id
}
// RoomID returns the room ID of the pi based on the hostname (everything before the last '-')
func RoomID() (string, *nerr.E) {
id, err := SystemID()
if err != nil {
return "", err.Addf("failed to get roomID")
}
split := strings.Split(id, "-")
return split[0] + "-" + split[1], nil
}
// MustRoomID returns the buildingID or panics if it fails
func MustRoomID() string {
id, err := RoomID()
if err != nil {
log.L.Fatalf("failed to get roomID: %s", err.Error())
}
return id
}
// InstallerID returns the installerID of the pi
func InstallerID() (string, *nerr.E) {
if len(installerID) == 0 {
return "", nerr.Create("INSTALLER_ID not set.", "string")
}
return installerID, nil
}
// MustInstallerID returns the installerID or the pi or panics if it fails
func MustInstallerID() string {
id, err := InstallerID()
if err != nil {
log.L.Fatalf("failed to get installerID: %s", err.Error())
}
return id
}
// SetInstallerID sets the installer id
func SetInstallerID(id string) *nerr.E {
errMsg := "failed to set installer ID"
file, err := os.OpenFile(EnvironmentFile, os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
return nerr.Translate(err).Add(errMsg)
}
// TODO do i need to delete an old installer id, or should i just leave it on
_, err = file.WriteString(fmt.Sprintf(`INSTALLER_ID="%s"`, id))
if err != nil {
return nerr.Translate(err).Add(errMsg)
}
file.Close()
err = os.Setenv("INSTALLER_ID", id)
if err != nil {
return nerr.Translate(err).Add(errMsg)
}
return nil
}