-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.go
137 lines (105 loc) · 2.25 KB
/
config.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
130
131
132
133
134
135
136
137
package Milena
import (
"github.com/JodeZer/Milena/log"
"github.com/jinzhu/configor"
"os"
"path/filepath"
)
func init() {
var err error
curDir, err = filepath.Abs(filepath.Dir(os.Args[0]))
if err != nil {
os.Exit(1)
}
}
const defaultConfigName = "Milena.yml"
const defaultLockFileName = "Milena.lock"
var curDir string
// Config Entity
type Config struct {
//config file path
FileName string
//data files dir
DataDir string
//log level
LogLevel string
//lockDir
LockFile string `yaml:"-"`
//listen servers
Servers []struct {
//kafka cluster name
Name string
// storage consumer metadata format: {clusterName}/{topic}.meta
MetaDataDir string `yaml:"-"`
// Server address
Brokers []string
// listen all topics
ListenAll bool
// listen topic
Topics []topicSetting
}
}
type topicSetting struct {
//topic name
Name string
//partition setting
Partitions []partionSetting
}
type partionSetting struct {
//partition num
Partition int32
// this time start offset. configed or from metadata
Start int64
}
// NewConfig
func NewConfig(fileName string) *Config {
c := &Config{}
if fileName == "" {
fileName = curDir + "/" + defaultConfigName
}
c.FileName = fileName
if _, err := os.Stat(fileName); os.IsNotExist(err) {
log.Errorf("%s not exists", fileName)
os.Exit(1)
}
log.Infof("find conf %s", fileName)
c.parse()
c.valid()
c.setDefault()
return c
}
// parse config yml file
func (c *Config) parse() {
configor.Load(c, c.FileName)
}
// valid if the file is legal else exist
func (c *Config) valid() {
// valid server conf
m := make(map[string]string, len(c.Servers))
for _, server := range c.Servers {
if server.Name == "" {
log.Errorf("empty cluser name is not allowed")
os.Exit(1)
}
if len(server.Brokers) == 0 {
log.Errorf("none broker for %s", server.Name)
os.Exit(1)
}
if server.ListenAll == false && len(server.Topics) == 0 {
log.Errorf("none topic for %s", server.Name)
os.Exit(1)
}
if _, ok := m[server.Name]; ok {
log.Errorf("duplicate cluser name is not allowed")
os.Exit(1)
}
m[server.Name] = "1"
}
m = nil // helpGC
}
func (c *Config) setDefault() {
if c.DataDir == "" {
c.DataDir = curDir + "/" + "data"
}
c.LockFile = curDir + "/" + "Milena.lock"
}