|
@@ -4,13 +4,11 @@ import (
|
|
|
"crypto/tls"
|
|
"crypto/tls"
|
|
|
"flag"
|
|
"flag"
|
|
|
"github.com/coreos/etcd/store"
|
|
"github.com/coreos/etcd/store"
|
|
|
- "github.com/coreos/etcd/web"
|
|
|
|
|
|
|
+ "github.com/coreos/go-raft"
|
|
|
"io/ioutil"
|
|
"io/ioutil"
|
|
|
"net/http"
|
|
"net/http"
|
|
|
"net/url"
|
|
"net/url"
|
|
|
"os"
|
|
"os"
|
|
|
- "os/signal"
|
|
|
|
|
- "runtime/pprof"
|
|
|
|
|
"strings"
|
|
"strings"
|
|
|
"time"
|
|
"time"
|
|
|
)
|
|
)
|
|
@@ -142,27 +140,12 @@ func main() {
|
|
|
flag.Parse()
|
|
flag.Parse()
|
|
|
|
|
|
|
|
if cpuprofile != "" {
|
|
if cpuprofile != "" {
|
|
|
- f, err := os.Create(cpuprofile)
|
|
|
|
|
- if err != nil {
|
|
|
|
|
- fatal(err)
|
|
|
|
|
- }
|
|
|
|
|
- pprof.StartCPUProfile(f)
|
|
|
|
|
- defer pprof.StopCPUProfile()
|
|
|
|
|
-
|
|
|
|
|
- c := make(chan os.Signal, 1)
|
|
|
|
|
- signal.Notify(c, os.Interrupt)
|
|
|
|
|
- go func() {
|
|
|
|
|
- for sig := range c {
|
|
|
|
|
- infof("captured %v, stopping profiler and exiting..", sig)
|
|
|
|
|
- pprof.StopCPUProfile()
|
|
|
|
|
- os.Exit(1)
|
|
|
|
|
- }
|
|
|
|
|
- }()
|
|
|
|
|
-
|
|
|
|
|
|
|
+ runCPUProfile()
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if veryVerbose {
|
|
if veryVerbose {
|
|
|
verbose = true
|
|
verbose = true
|
|
|
|
|
+ raft.SetLogLevel(raft.Debug)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if machines != "" {
|
|
if machines != "" {
|
|
@@ -175,6 +158,7 @@ func main() {
|
|
|
cluster = strings.Split(string(b), ",")
|
|
cluster = strings.Split(string(b), ",")
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Check TLS arguments
|
|
|
raftTLSConfig, ok := tlsConfigFromInfo(argInfo.RaftTLS)
|
|
raftTLSConfig, ok := tlsConfigFromInfo(argInfo.RaftTLS)
|
|
|
if !ok {
|
|
if !ok {
|
|
|
fatal("Please specify cert and key file or cert and key file and CAFile or none of the three")
|
|
fatal("Please specify cert and key file or cert and key file and CAFile or none of the three")
|
|
@@ -190,13 +174,11 @@ func main() {
|
|
|
fatal("ERROR: server name required. e.g. '-n=server_name'")
|
|
fatal("ERROR: server name required. e.g. '-n=server_name'")
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // Check host name arguments
|
|
|
argInfo.RaftURL = sanitizeURL(argInfo.RaftURL, raftTLSConfig.Scheme)
|
|
argInfo.RaftURL = sanitizeURL(argInfo.RaftURL, raftTLSConfig.Scheme)
|
|
|
argInfo.EtcdURL = sanitizeURL(argInfo.EtcdURL, etcdTLSConfig.Scheme)
|
|
argInfo.EtcdURL = sanitizeURL(argInfo.EtcdURL, etcdTLSConfig.Scheme)
|
|
|
argInfo.WebURL = sanitizeURL(argInfo.WebURL, "http")
|
|
argInfo.WebURL = sanitizeURL(argInfo.WebURL, "http")
|
|
|
|
|
|
|
|
- // Setup commands.
|
|
|
|
|
- registerCommands()
|
|
|
|
|
-
|
|
|
|
|
// Read server info from file or grab it from user.
|
|
// Read server info from file or grab it from user.
|
|
|
if err := os.MkdirAll(dirPath, 0744); err != nil {
|
|
if err := os.MkdirAll(dirPath, 0744); err != nil {
|
|
|
fatalf("Unable to create path: %s", err)
|
|
fatalf("Unable to create path: %s", err)
|
|
@@ -208,21 +190,16 @@ func main() {
|
|
|
etcdStore = store.CreateStore(maxSize)
|
|
etcdStore = store.CreateStore(maxSize)
|
|
|
snapConf = newSnapshotConf()
|
|
snapConf = newSnapshotConf()
|
|
|
|
|
|
|
|
- startRaft(raftTLSConfig)
|
|
|
|
|
|
|
+ startWebInterface()
|
|
|
|
|
|
|
|
- if argInfo.WebURL != "" {
|
|
|
|
|
- // start web
|
|
|
|
|
- argInfo.WebURL = sanitizeURL(argInfo.WebURL, "http")
|
|
|
|
|
- go webHelper()
|
|
|
|
|
- go web.Start(raftServer, argInfo.WebURL)
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ startRaft(raftTLSConfig)
|
|
|
|
|
|
|
|
- startEtcdTransport(*info, etcdTLSConfig.Scheme, etcdTLSConfig.Server)
|
|
|
|
|
|
|
+ startEtcd(etcdTLSConfig)
|
|
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-// Start to listen and response client command
|
|
|
|
|
-func startEtcdTransport(info Info, scheme string, tlsConf tls.Config) {
|
|
|
|
|
|
|
+// Start to listen and response etcd client command
|
|
|
|
|
+func startEtcd(tlsConf TLSConfig) {
|
|
|
u, err := url.Parse(info.EtcdURL)
|
|
u, err := url.Parse(info.EtcdURL)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
fatalf("invalid url '%s': %s", info.EtcdURL, err)
|
|
fatalf("invalid url '%s': %s", info.EtcdURL, err)
|
|
@@ -231,11 +208,11 @@ func startEtcdTransport(info Info, scheme string, tlsConf tls.Config) {
|
|
|
|
|
|
|
|
server := http.Server{
|
|
server := http.Server{
|
|
|
Handler: NewEtcdMuxer(),
|
|
Handler: NewEtcdMuxer(),
|
|
|
- TLSConfig: &tlsConf,
|
|
|
|
|
|
|
+ TLSConfig: &tlsConf.Server,
|
|
|
Addr: u.Host,
|
|
Addr: u.Host,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if scheme == "http" {
|
|
|
|
|
|
|
+ if tlsConf.Scheme == "http" {
|
|
|
fatal(server.ListenAndServe())
|
|
fatal(server.ListenAndServe())
|
|
|
} else {
|
|
} else {
|
|
|
fatal(server.ListenAndServeTLS(info.EtcdTLS.CertFile, info.EtcdTLS.KeyFile))
|
|
fatal(server.ListenAndServeTLS(info.EtcdTLS.CertFile, info.EtcdTLS.KeyFile))
|