-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathmain.go
103 lines (93 loc) · 2.7 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
package main
import (
"crypto/rand"
"encoding/base64"
"fmt"
"os"
"os/signal"
"syscall"
"github.com/pyke369/golang-support/acl"
"github.com/pyke369/golang-support/uconfig"
"github.com/pyke369/golang-support/ulog"
"github.com/pyke369/golang-support/uuid"
)
const (
PROGNAME = "groom"
PROGVER = "1.3.2"
)
var (
Config *uconfig.UConfig
Logger *ulog.ULog
AccessLogger *ulog.ULog
Mode string
Domains = NewDomains()
Instance, Secret = uuid.BUUID(), uuid.BUUID()
)
func main() {
var err error
if len(os.Args) < 2 {
fmt.Fprintf(os.Stderr, "usage: %s <configuration> | password [<secret> [<salt>]]\n", PROGNAME)
os.Exit(1)
}
if os.Args[1] == "password" {
pick, secret, salt := true, "", ""
if len(os.Args) > 2 {
secret = os.Args[2]
pick = false
} else {
value := make([]byte, 32)
if _, err := rand.Read(value); err == nil {
secret = base64.RawURLEncoding.EncodeToString(value)
}
}
if len(os.Args) > 3 {
salt = os.Args[3]
} else {
value := make([]byte, 6)
rand.Read(value)
if _, err := rand.Read(value); err == nil {
salt = base64.RawStdEncoding.EncodeToString(value)
}
}
if len(secret) < 8 || len(salt) < 8 {
fmt.Fprintf(os.Stderr, "provided secret and/or salt are too short\n")
os.Exit(1)
}
fmt.Printf("%s", acl.Crypt512(secret, salt, 0))
if pick {
fmt.Printf(" - %s", secret)
}
fmt.Printf("\n")
os.Exit(0)
}
if Config, err = uconfig.New(os.Args[1]); err != nil {
fmt.Fprintf(os.Stderr, "configuration syntax error: %v\n", err)
os.Exit(2)
}
AccessLogger = ulog.New(Config.GetString(Config.Path(PROGNAME, "log", "access")))
Mode = Config.GetString(Config.Path(PROGNAME, "mode"), "agent")
Logger = ulog.New(Config.GetString(Config.Path(PROGNAME, "log", "system"), "console(output=stdout)"))
Logger.Info(map[string]interface{}{"mode": Mode, "event": "start", "config": os.Args[1], "pid": os.Getpid(), "version": PROGVER})
switch Mode {
case "server":
go ServerRun()
case "agent":
go AgentRun()
default:
fmt.Fprintf(os.Stderr, "neither in server nor agent mode\n")
os.Exit(3)
}
signals := make(chan os.Signal, 1)
signal.Notify(signals, syscall.SIGHUP)
for {
<-signals
if _, err = uconfig.New(os.Args[1]); err == nil {
Config.Load(os.Args[1])
AccessLogger.Load(Config.GetString(Config.Path(PROGNAME, "log", "access")))
Logger.Load(Config.GetString(Config.Path(PROGNAME, "log", "system"), "console(output=stdout)"))
Logger.Info(map[string]interface{}{"mode": Mode, "event": "reload", "config": os.Args[1], "pid": os.Getpid(), "version": PROGVER})
} else {
Logger.Info(map[string]interface{}{"mode": Mode, "event": "reload", "config": os.Args[1], "error": err.Error()})
}
}
}