func main() { host := oswrapper.Getopt("HOST", "127.0.0.1") etcdPort := oswrapper.Getopt("ETCD_PORT", "4001") etcdCtlPeers := oswrapper.Getopt("ETCD_PEERS", "127.0.0.1:"+etcdPort) etcdURL := etcd.GetHTTPEtcdUrls(host+":"+etcdPort, etcdCtlPeers) etcdClient := etcd.NewClient(etcdURL) etcd.Mkdir(etcdClient, etcdPath) log.Infof("boot version [%v]", version.Version) log.Info("zookeeper: starting...") zookeeper.CheckZkMappingInFleet(etcdPath, etcdClient, etcdURL) // we need to write the file /opt/zookeeper-data/data/myid with the id of this node os.MkdirAll("/opt/zookeeper-data/data", 0640) zkID := etcd.Get(etcdClient, etcdPath+"/"+host+"/id") ioutil.WriteFile("/opt/zookeeper-data/data/myid", []byte(zkID), 0640) zkServer := &zookeeper.ZkServer{ Stdout: os.Stdout, Stderr: os.Stderr, } signal.Notify(signalChan, syscall.SIGHUP, syscall.SIGINT, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT, os.Interrupt, ) // Wait for a signal and exit exitChan := make(chan int) go func() { for { s := <-signalChan log.Debugf("Signal received: %v", s) switch s { case syscall.SIGTERM: exitChan <- 0 case syscall.SIGQUIT: exitChan <- 0 case syscall.SIGKILL: exitChan <- 1 default: exitChan <- 1 } } }() // wait for confd to run once and install initial templates confd.WaitForInitialConf(getConfdNodes(host, etcdCtlPeers, 4001), 10*time.Second) params := make(map[string]string) params["HOST"] = host if log.Level.String() == "debug" { params["DEBUG"] = "true" } err := oswrapper.RunScript("pkg/boot/zookeeper/bash/add-node.bash", params, bindata.Asset) if err != nil { log.Printf("command finished with error: %v", err) } if err := zkServer.Start(); err != nil { panic(err) } log.Info("zookeeper: running...") go func() { log.Debugf("starting pprof http server in port 6060") http.ListenAndServe("localhost:6060", nil) }() code := <-exitChan log.Debugf("execution terminated with exit code %v", code) log.Debugf("executing pre shutdown script") err = oswrapper.RunScript("pkg/boot/zookeeper/bash/remove-node.bash", params, bindata.Asset) if err != nil { log.Printf("command finished with error: %v", err) } log.Info("stopping zookeeper node") zkServer.Stop() }
// Start initiate the boot process of the current component // etcdPath is the base path used to publish the component in etcd // externalPort is the base path used to publish the component in etcd func Start(etcdPath string, externalPort int) { log.Infof("boot version [%v]", version.Version) go func() { log.Debugf("starting pprof http server in port 6060") http.ListenAndServe("localhost:6060", nil) }() signal.Notify(signalChan, syscall.SIGHUP, syscall.SIGINT, syscall.SIGKILL, syscall.SIGTERM, syscall.SIGQUIT, os.Interrupt, ) // Wait for a signal and exit exitChan := make(chan int) go func() { for { s := <-signalChan log.Debugf("Signal received: %v", s) switch s { case syscall.SIGTERM: exitChan <- 0 case syscall.SIGQUIT: exitChan <- 0 case syscall.SIGKILL: exitChan <- 1 default: exitChan <- 1 } } }() component = bootProcess.Lookup("boot") if component == nil { log.Error("error loading boot extension...") signalChan <- syscall.SIGINT } host := oswrapper.Getopt("HOST", "127.0.0.1") etcdPort, _ := strconv.Atoi(oswrapper.Getopt("ETCD_PORT", "4001")) etcdPeers := oswrapper.Getopt("ETCD_PEERS", "127.0.0.1:"+strconv.Itoa(etcdPort)) etcdClient := etcd.NewClient(etcd.GetHTTPEtcdUrls(host+":"+strconv.Itoa(etcdPort), etcdPeers)) etcdURL := etcd.GetHTTPEtcdUrls(host+":"+strconv.Itoa(etcdPort), etcdPeers) currentBoot := &types.CurrentBoot{ ConfdNodes: getConfdNodes(host+":"+strconv.Itoa(etcdPort), etcdPeers), EtcdClient: etcdClient, EtcdPath: etcdPath, EtcdPort: etcdPort, EtcdPeers: etcdPeers, EtcdURL: etcdURL, Host: net.ParseIP(host), Timeout: timeout, TTL: timeout * 2, Port: externalPort, } // do the real work in a goroutine to be able to exit if // a signal is received during the boot process go start(currentBoot) code := <-exitChan // pre shutdown tasks log.Debugf("executing pre shutdown scripts") preShutdownScripts := component.PreShutdownScripts(currentBoot) runAllScripts(signalChan, preShutdownScripts) log.Debugf("execution terminated with exit code %v", code) os.Exit(code) }