forked from couchbase/cbgt
/
main_cfg.go
151 lines (130 loc) · 4.3 KB
/
main_cfg.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
138
139
140
141
142
143
144
145
146
147
148
149
150
151
// Copyright (c) 2014 Couchbase, Inc.
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the
// License. You may obtain a copy of the License at
// http://www.apache.org/licenses/LICENSE-2.0
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an "AS
// IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language
// governing permissions and limitations under the License.
package cmd
import (
"errors"
"fmt"
"net/url"
"os"
"strings"
"github.com/couchbase/cbgt"
)
var ErrorBindHttp = errors.New("main_cfg:" +
" couchbase cfg needs network/IP address for bindHttp,\n" +
" Please specify a network/IP address for the -bindHttp parameter\n" +
" (non-loopback, non-127.0.0.1/localhost, non-0.0.0.0)\n" +
" so that this node can be clustered with other nodes.")
// MainCfg connects to a Cfg provider as a server peer (e.g., as a
// cbgt.Manager).
func MainCfg(baseName, connect, bindHttp,
register, dataDir string) (cbgt.Cfg, error) {
return MainCfgEx(baseName, connect, bindHttp, register, dataDir, "", nil)
}
// MainCfgEx connects to a Cfg provider as a server peer (e.g., as a
// cbgt.Manager), with more options.
func MainCfgEx(baseName, connect, bindHttp,
register, dataDir, uuid string, options map[string]string) (cbgt.Cfg, error) {
// TODO: One day, the default cfg provider should not be simple.
// TODO: One day, Cfg provider lookup should be table driven.
var cfg cbgt.Cfg
var err error
switch {
case connect == "", connect == "simple":
cfg, err = MainCfgSimple(baseName, connect, bindHttp, register, dataDir)
case strings.HasPrefix(connect, "couchbase:"):
cfg, err = MainCfgCB(baseName, connect[len("couchbase:"):],
bindHttp, register, dataDir)
case strings.HasPrefix(connect, "metakv"):
cfg, err = MainCfgMetaKv(baseName, connect[len("metakv"):],
bindHttp, register, dataDir, uuid, options)
default:
err = fmt.Errorf("main_cfg1: unsupported cfg connect: %s", connect)
}
return cfg, err
}
// ------------------------------------------------
func MainCfgSimple(baseName, connect, bindHttp, register, dataDir string) (
cbgt.Cfg, error) {
cfgPath := dataDir + string(os.PathSeparator) + baseName + ".cfg"
cfgPathExists := false
if _, err := os.Stat(cfgPath); err == nil {
cfgPathExists = true
}
cfg := cbgt.NewCfgSimple(cfgPath)
if cfgPathExists {
err := cfg.Load()
if err != nil {
return nil, err
}
}
return cfg, nil
}
func MainCfgCB(baseName, urlStr, bindHttp, register, dataDir string) (
cbgt.Cfg, error) {
if (bindHttp[0] == ':' ||
strings.HasPrefix(bindHttp, "0.0.0.0:") ||
strings.HasPrefix(bindHttp, "127.0.0.1:") ||
strings.HasPrefix(bindHttp, "localhost:")) &&
register != "unwanted" &&
register != "unknown" {
return nil, ErrorBindHttp
}
u, err := url.Parse(urlStr)
if err != nil {
return nil, err
}
bucket := "default"
if u.User != nil && u.User.Username() != "" {
bucket = u.User.Username()
}
cfg, err := cbgt.NewCfgCB(urlStr, bucket)
if err != nil {
return nil, err
}
return cfg, nil
}
func MainCfgMetaKv(baseName, urlStr, bindHttp, register, dataDir, uuid string,
options map[string]string) (
cbgt.Cfg, error) {
cfg, err := cbgt.NewCfgMetaKv(uuid)
if err == nil {
// Useful for reseting internal testing.
if urlStr == ":removeAllKeys" {
cfg.RemoveAllKeys()
}
err = cfg.Load()
}
return cfg, err
}
// ------------------------------------------------
// MainCfgClient helper function connects to a Cfg provider as a
// client (not as a known cbgt.Manager server or peer). This is
// useful, for example, for tool developers as opposed to server
// developers.
func MainCfgClient(baseName, cfgConnect string) (cbgt.Cfg, error) {
bindHttp := "<NO-BIND-HTTP>"
register := "unchanged"
dataDir := "<NO-DATA-DIR>"
cfg, err := MainCfg(baseName, cfgConnect,
bindHttp, register, dataDir)
if err == ErrorBindHttp {
return nil, err
}
if err != nil {
return nil, fmt.Errorf("main: could not start cfg,"+
" cfgConnect: %s, err: %v\n"+
" Please check that your -cfg/-cfgConnect parameter (%q)\n"+
" is correct and/or that your configuration provider\n"+
" is available.",
cfgConnect, err, cfgConnect)
}
return cfg, err
}