From 7f4de7fda7b0468b74f50f57a4f4b4573d2c7f02 Mon Sep 17 00:00:00 2001 From: "Xinwei Xiong(cubxxw-openim)" <3293172751nss@gmail.com> Date: Tue, 22 Aug 2023 15:38:50 +0800 Subject: [PATCH] feat: add config path Signed-off-by: Xinwei Xiong(cubxxw-openim) <3293172751nss@gmail.com> --- scripts/check-all.sh | 11 +- scripts/install/common.sh | 2 - scripts/install/install-protobuf.sh | 0 scripts/install/install.sh | 3 +- scripts/install/openim-crontask.sh | 3 +- scripts/install/{man.sh => openim-man.sh} | 0 scripts/install/openim-rpc.sh | 52 +++++-- scripts/install/openim-tools.sh | 166 ++++++++++++++++++++++ scripts/lib/golang.sh | 1 + scripts/lib/init.sh | 3 + scripts/make-rules/golang.mk | 4 +- scripts/start-all.sh | 8 +- scripts/update-generated-docs.sh | 0 tools/README.md | 20 --- tools/component/component.go | 96 +++++-------- 15 files changed, 265 insertions(+), 104 deletions(-) mode change 100644 => 100755 scripts/install/install-protobuf.sh rename scripts/install/{man.sh => openim-man.sh} (100%) create mode 100755 scripts/install/openim-tools.sh mode change 100644 => 100755 scripts/update-generated-docs.sh diff --git a/scripts/check-all.sh b/scripts/check-all.sh index 1b14776cd..7635a04bb 100755 --- a/scripts/check-all.sh +++ b/scripts/check-all.sh @@ -34,17 +34,18 @@ print_services_and_ports() { local -n service_names=$1 local -n service_ports=$2 - echo "+-------------------+-------+" - echo "| Service Name | Port |" - echo "+-------------------+-------+" + echo "+-------------------------+----------+" + echo "| Service Name | Port |" + echo "+-------------------------+----------+" for index in "${!service_names[@]}"; do - printf "| %-17s | %-5s |\n" "${service_names[$index]}" "${service_ports[$index]}" + printf "| %-23s | %-8s |\n" "${service_names[$index]}" "${service_ports[$index]}" done - echo "+-------------------+-------+" + echo "+-------------------------+----------+" } + # Print out services and their ports print_services_and_ports OPENIM_SERVER_NAME_TARGETS OPENIM_SERVER_PORT_TARGETS diff --git a/scripts/install/common.sh b/scripts/install/common.sh index da4ad20fc..dd8bf614e 100755 --- a/scripts/install/common.sh +++ b/scripts/install/common.sh @@ -27,8 +27,6 @@ source "${OPENIM_ROOT}/scripts/lib/init.sh" # Make sure the environment is only called via common to avoid too much nesting source "${OPENIM_ROOT}/scripts/install/environment.sh" - - # This function returns a list of Prometheus ports for various services # based on the provided configuration. Each service has its own dedicated # port for monitoring purposes. diff --git a/scripts/install/install-protobuf.sh b/scripts/install/install-protobuf.sh old mode 100644 new mode 100755 diff --git a/scripts/install/install.sh b/scripts/install/install.sh index 7ea5a7a4b..d38898663 100755 --- a/scripts/install/install.sh +++ b/scripts/install/install.sh @@ -56,8 +56,9 @@ source ${OPENIM_ROOT}/scripts/install/openim-push.sh source ${OPENIM_ROOT}/scripts/install/openim-rpc.sh source ${OPENIM_ROOT}/scripts/install/openim-crontask.sh source ${OPENIM_ROOT}/scripts/install/openim-api.sh +source ${OPENIM_ROOT}/scripts/install/openim-man.sh +source ${OPENIM_ROOT}/scripts/install/openim-tools.sh source ${OPENIM_ROOT}/scripts/install/test.sh -source ${OPENIM_ROOT}/scripts/install/man.sh # Detailed help function function openim::install::show_help() { diff --git a/scripts/install/openim-crontask.sh b/scripts/install/openim-crontask.sh index 2d5ecd1bd..674c0ee39 100755 --- a/scripts/install/openim-crontask.sh +++ b/scripts/install/openim-crontask.sh @@ -29,7 +29,7 @@ # Usage: # 1. Direct Script Execution: # This will start the OpenIM CronTask directly through a background process. -# Example: ./openim-crontask.sh +# Example: ./openim-crontask.sh openim::crontask::start # # 2. Controlling through Functions for systemctl operations: # Specific operations like installation, uninstallation, and status check can be executed by passing the respective function name as an argument to the script. @@ -38,7 +38,6 @@ # Note: Ensure that the appropriate permissions and environmental variables are set prior to script execution. # - OPENIM_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd -P) [[ -z ${COMMON_SOURCED} ]] && source ${OPENIM_ROOT}/scripts/install/common.sh diff --git a/scripts/install/man.sh b/scripts/install/openim-man.sh similarity index 100% rename from scripts/install/man.sh rename to scripts/install/openim-man.sh diff --git a/scripts/install/openim-rpc.sh b/scripts/install/openim-rpc.sh index 8e29a137a..7f6dfbfba 100755 --- a/scripts/install/openim-rpc.sh +++ b/scripts/install/openim-rpc.sh @@ -13,6 +13,31 @@ # 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. +# +# OpenIM RPC Service Control Script +# +# Description: +# This script provides a control interface for the OpenIM RPC service within a Linux environment. It offers functionalities to start multiple RPC services, each denoted by their respective names under openim::rpc::service_name. +# +# Features: +# 1. Robust error handling using Bash built-ins like 'errexit', 'nounset', and 'pipefail'. +# 2. The capability to source common utility functions and configurations to ensure uniform environmental settings. +# 3. Comprehensive logging functionalities, providing a detailed understanding of operational processes. +# 4. Provision for declaring and managing a set of RPC services, each associated with its unique name and corresponding ports. +# 5. The ability to define and associate Prometheus ports for service monitoring purposes. +# 6. Functionalities to start each RPC service, along with its designated ports, in a sequence. +# +# Usage: +# 1. Direct Script Execution: +# This initiates all the RPC services declared under the function openim::rpc::service_name. +# Example: ./openim-rpc-{rpc-name}.sh openim::rpc::start +# 2. Controlling through Functions for systemctl operations: +# Specific operations like installation, uninstallation, and status check can be executed by passing the respective function name as an argument to the script. +# Example: ./openim-rpc-{rpc-name}.sh openim::rpc::install +# +# Note: Before executing this script, ensure that the necessary permissions are granted and relevant environmental variables are set. +# + set -o errexit set +o nounset @@ -77,8 +102,7 @@ IFS=" " read -ra OPENIM_RPC_PROM_PORT_TARGETS <<< "$(openim::rpc::prometheus_por readonly OPENIM_RPC_PROM_PORT_TARGETS readonly OPENIM_RPC_PROM_PORT_LISTARIES=("${OPENIM_RPC_PROM_PORT_TARGETS[@]##*/}") -function openim::rpc::start() -{ +function openim::rpc::start() { echo "OPENIM_RPC_SERVICE_LISTARIES: ${OPENIM_RPC_SERVICE_LISTARIES[@]}" echo "OPENIM_RPC_PROM_PORT_LISTARIES: ${OPENIM_RPC_PROM_PORT_LISTARIES[@]}" echo "OPENIM_RPC_PORT_LISTARIES: ${OPENIM_RPC_PORT_LISTARIES[@]}" @@ -98,18 +122,18 @@ function openim::rpc::start() # start all rpc services for ((i = 0; i < ${#OPENIM_RPC_SERVICE_LISTARIES[*]}; i++)); do - openim::util::stop_services_with_name ${OPENIM_RPC_SERVICE_LISTARIES[$i]} - openim::log::info "OpenIM ${OPENIM_RPC_SERVICE_LISTARIES[$i]} config path: ${OPENIM_RPC_CONFIG}" - - # Get the service and Prometheus ports. - OPENIM_RPC_SERVICE_PORTS=( $(openim::util::list-to-string ${OPENIM_RPC_PORT_LISTARIES[$i]}) ) - OPENIM_RPC_PROM_PORTS=( $(openim::util::list-to-string ${OPENIM_RPC_PROM_PORT_LISTARIES[$i]}) ) - - for ((j = 0; j < ${#OPENIM_RPC_SERVICE_PORTS[@]}; j++)); do - openim::log::info "Starting ${OPENIM_RPC_SERVICE_LISTARIES[$i]} service, port: ${OPENIM_RPC_SERVICE_PORTS[j]}, prometheus port: ${OPENIM_RPC_PROM_PORTS[j]}, binary root: ${OPENIM_OUTPUT_HOSTBIN}/${OPENIM_RPC_SERVICE_LISTARIES[$i]}" - openim::rpc::start_service "${OPENIM_RPC_SERVICE_LISTARIES[$i]}" "${OPENIM_RPC_SERVICE_PORTS[j]}" "${OPENIM_RPC_PROM_PORTS[j]}" - sleep 0.5 - done + openim::util::stop_services_with_name ${OPENIM_RPC_SERVICE_LISTARIES[$i]} + openim::log::info "OpenIM ${OPENIM_RPC_SERVICE_LISTARIES[$i]} config path: ${OPENIM_RPC_CONFIG}" + + # Get the service and Prometheus ports. + OPENIM_RPC_SERVICE_PORTS=( $(openim::util::list-to-string ${OPENIM_RPC_PORT_LISTARIES[$i]}) ) + OPENIM_RPC_PROM_PORTS=( $(openim::util::list-to-string ${OPENIM_RPC_PROM_PORT_LISTARIES[$i]}) ) + + for ((j = 0; j < ${#OPENIM_RPC_SERVICE_PORTS[@]}; j++)); do + openim::log::info "Starting ${OPENIM_RPC_SERVICE_LISTARIES[$i]} service, port: ${OPENIM_RPC_SERVICE_PORTS[j]}, prometheus port: ${OPENIM_RPC_PROM_PORTS[j]}, binary root: ${OPENIM_OUTPUT_HOSTBIN}/${OPENIM_RPC_SERVICE_LISTARIES[$i]}" + openim::rpc::start_service "${OPENIM_RPC_SERVICE_LISTARIES[$i]}" "${OPENIM_RPC_SERVICE_PORTS[j]}" "${OPENIM_RPC_PROM_PORTS[j]}" + sleep 0.5 + done done openim::util::check_ports ${OPENIM_RPC_PORT_TARGETS[@]} diff --git a/scripts/install/openim-tools.sh b/scripts/install/openim-tools.sh new file mode 100755 index 000000000..e913885a9 --- /dev/null +++ b/scripts/install/openim-tools.sh @@ -0,0 +1,166 @@ +#!/usr/bin/env bash + +# Copyright © 2023 OpenIM. All rights reserved. +# +# 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. +# +# OpenIM Tools Control Script +# +# Description: +# This script is responsible for managing the lifecycle of OpenIM tools, which include starting, stopping, +# and handling pre and post operations. It's designed to be modular and extensible, ensuring that the +# individual operations can be managed separately, and integrated seamlessly with Linux systemd. +# +# Features: +# 1. Robust error handling using Bash built-ins like 'errexit', 'nounset', and 'pipefail'. +# 2. The capability to source common utility functions and configurations to ensure uniform environmental settings. +# 3. Comprehensive logging functionalities, providing a detailed understanding of operational processes. +# 4. Provision for declaring and managing a set of OpenIM tools, each associated with its unique name and corresponding ports. +# 5. The ability to define and associate Prometheus ports for service monitoring purposes. +# 6. Functionalities to start each OpenIM tool, along with its designated ports, in a sequence. +# +# Usage: +# 1. Direct Script Execution: +# This initiates all the OpenIM tools declared under the function openim::tools::service_name. +# Example: ./openim-tools.sh openim::tools::start +# 2. Controlling through Functions for systemctl operations: +# Specific operations like installation, uninstallation, and status check can be executed by passing the respective function name as an argument to the script. +# Example: ./openim-tools.sh openim::tools::install +# + +set -o errexit +set +o nounset +set -o pipefail + +OPENIM_ROOT=$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd -P) +[[ -z ${COMMON_SOURCED} ]] && source ${OPENIM_ROOT}/scripts/install/common.sh + +SERVER_NAME="openim-tools" + +openim::tools::start_name() { + local targets=( + imctl + ) + echo "${targets[@]}" +} +IFS=" " read -ra OPENIM_TOOLS_NAME_TARGETS <<< "$(openim::tools::start_name)" +readonly OPENIM_TOOLS_NAME_TARGETS +readonly OPENIM_TOOLS_NAME_LISTARIES=("${OPENIM_TOOLS_NAME_TARGETS[@]##*/}") + +openim::tools::pre_start_name() { + local targets=( + ncpu + component + ) + echo "${targets[@]}" +} +IFS=" " read -ra OPENIM_TOOLS_PRE_START_NAME_TARGETS <<< "$(openim::tools::pre_start_name)" +readonly OPENIM_TOOLS_PRE_START_NAME_TARGETS +readonly OPENIM_TOOLS_PRE_START_NAME_LISTARIES=("${OPENIM_TOOLS_PRE_START_NAME_TARGETS[@]##*/}") + +openim::tools::post_start_name() { + local targets=( + infra + ) + echo "${targets[@]}" +} +IFS=" " read -ra OPENIM_TOOLS_POST_START_NAME_TARGETS <<< "$(openim::tools::post_start_name)" +readonly OPENIM_TOOLS_POST_START_NAME_TARGETS +readonly OPENIM_TOOLS_POST_START_NAME_LISTARIES=("${OPENIM_TOOLS_POST_START_NAME_TARGETS[@]##*/}") + +function openim::tools::start_service() { + local binary_name="$1" + local config="$2" + local service_port="$3" + local prometheus_port="$4" + + local cmd="${OPENIM_OUTPUT_HOSTBIN_TOOLS}/${binary_name}" + openim::log::info "Starting PATH: ${OPENIM_OUTPUT_HOSTBIN_TOOLS}/${binary_name}..." + + if [ -n "${config}" ]; then + printf "Specifying config: %s\n" "${config}" + cmd="${cmd} -c ${config}/config.yaml" + fi + + if [ -n "${service_port}" ]; then + printf "Specifying service port: %s\n" "${service_port}" + cmd="${cmd} --port ${service_port}" + fi + + if [ -n "${prometheus_port}" ]; then + printf "Specifying prometheus port: %s\n" "${prometheus_port}" + cmd="${cmd} --prometheus_port ${prometheus_port}" + fi + openim::log::info "Starting ${binary_name}..." + ${cmd} +} + +function openim::tools::start() { + openim::log::info "Starting OpenIM Tools..." + for tool in "${OPENIM_TOOLS_NAME_LISTARIES[@]}"; do + openim::log::info "Starting ${tool}..." + # openim::tools::start_service ${tool} + sleep 0.2 + done +} + + +function openim::tools::pre-start() { + openim::log::info "Preparing to start OpenIM Tools..." + for tool in "${OPENIM_TOOLS_PRE_START_NAME_LISTARIES[@]}"; do + openim::log::info "Starting ${tool}..." + openim::tools::start_service ${tool} ${OPNEIM_CONFIG} + sleep 0.2 + done +} + +function openim::tools::post-start() { + openim::log::info "Post-start actions for OpenIM Tools..." + for tool in "${OPENIM_TOOLS_POST_START_NAME_LISTARIES[@]}"; do + openim::log::info "Starting ${tool}..." + # openim::tools::start_service ${tool} + sleep 0.2 + done +} + +function openim::tools::stop() { + openim::log::info "Stopping OpenIM Tools..." + for tool in "${OPENIM_TOOLS_NAME_LISTARIES[@]}"; do + openim::log::info "Stopping ${tool}..." + # Similarly, place the actual command to stop the tool here. + echo "Stopping service for ${tool}" + sleep 0.2 + done +} + +function openim::tools::pre-stop() { + openim::log::info "Preparing to stop OpenIM Tools..." + for tool in "${OPENIM_TOOLS_PRE_START_NAME_LISTARIES[@]}"; do + openim::log::info "Setting up pre-stop for ${tool}..." + echo "Pre-stop actions for ${tool}" + sleep 0.2 + done +} + +function openim::tools::post-stop() { + openim::log::info "Post-stop actions for OpenIM Tools..." + for tool in "${OPENIM_TOOLS_POST_START_NAME_LISTARIES[@]}"; do + openim::log::info "Executing post-stop for ${tool}..." + echo "Post-stop cleanup for ${tool}" + sleep 0.2 + done +} + +if [[ "$*" =~ openim::tools:: ]];then + eval $* +fi diff --git a/scripts/lib/golang.sh b/scripts/lib/golang.sh index 76fda5bb8..2a537b04c 100755 --- a/scripts/lib/golang.sh +++ b/scripts/lib/golang.sh @@ -98,6 +98,7 @@ openim::golang::start_script_list() { openim-msgtransfer.sh openim-msggateway.sh openim-crontask.sh + openim-tools.sh ) local result=() for target in "${targets[@]}"; do diff --git a/scripts/lib/init.sh b/scripts/lib/init.sh index af73f1f3a..e572cd4a3 100755 --- a/scripts/lib/init.sh +++ b/scripts/lib/init.sh @@ -51,6 +51,7 @@ export no_proxy="127.0.0.1,localhost${no_proxy:+,${no_proxy}}" # This is a symlink to binaries for "this platform", e.g. build tools. export THIS_PLATFORM_BIN="${OPENIM_ROOT}/_output/bin/platforms" +export THIS_PLATFORM_BIN_TOOLS="${OPENIM_ROOT}/_output/bin/tools" . $(dirname ${BASH_SOURCE})/color.sh . $(dirname ${BASH_SOURCE})/util.sh @@ -66,6 +67,8 @@ openim::util::ensure-bash-version OPENIM_OUTPUT_HOSTBIN="${OPENIM_OUTPUT_BINPATH}/$(openim::util::host_platform)" export OPENIM_OUTPUT_HOSTBIN +OPENIM_OUTPUT_HOSTBIN_TOOLS="${OPENIM_OUTPUT_BINTOOLPATH}/$(openim::util::host_platform)" +export OPENIM_OUTPUT_HOSTBIN_TOOLS export OPENIM_NONSERVER_GROUP_VERSIONS diff --git a/scripts/make-rules/golang.mk b/scripts/make-rules/golang.mk index bf5ecdc86..4aa3b7e3a 100644 --- a/scripts/make-rules/golang.mk +++ b/scripts/make-rules/golang.mk @@ -147,8 +147,8 @@ go.build.%: $(BIN_DIR)/platforms/$(OS)/$(ARCH)/$(COMMAND)$(GO_OUT_EXT) $(ROOT_DIR)/cmd/$(COMMAND)/main.go; \ elif [ -f $(ROOT_DIR)/tools/$(COMMAND)/$(COMMAND).go ]; then \ CGO_ENABLED=0 GOOS=$(OS) GOARCH=$(ARCH) $(GO) build $(GO_BUILD_FLAGS) -o \ - $(BIN_TOOLS_DIR)/platforms/$(OS)/$(ARCH)/$(COMMAND)$(GO_OUT_EXT) $(ROOT_DIR)/tools/$(COMMAND)/$(COMMAND).go; \ - chmod +x $(BIN_TOOLS_DIR)/platforms/$(OS)/$(ARCH)/$(COMMAND)$(GO_OUT_EXT); \ + $(BIN_TOOLS_DIR)/$(OS)/$(ARCH)/$(COMMAND)$(GO_OUT_EXT) $(ROOT_DIR)/tools/$(COMMAND)/$(COMMAND).go; \ + chmod +x $(BIN_TOOLS_DIR)/$(OS)/$(ARCH)/$(COMMAND)$(GO_OUT_EXT); \ fi \ fi diff --git a/scripts/start-all.sh b/scripts/start-all.sh index ad56a633f..bdc030211 100755 --- a/scripts/start-all.sh +++ b/scripts/start-all.sh @@ -65,4 +65,10 @@ function execute_scripts() { done } -execute_scripts \ No newline at end of file +# TODO Prelaunch tools, simple for now, can abstract functions later +TOOLS_START_SCRIPTS_PATH=${START_SCRIPTS_PATH}/openim-tools.sh +${TOOLS_START_SCRIPTS_PATH} openim::tools::pre-start + +execute_scripts + +${TOOLS_START_SCRIPTS_PATH} openim::tools::post-start \ No newline at end of file diff --git a/scripts/update-generated-docs.sh b/scripts/update-generated-docs.sh old mode 100644 new mode 100755 diff --git a/tools/README.md b/tools/README.md index 13339766d..45c66564d 100644 --- a/tools/README.md +++ b/tools/README.md @@ -12,26 +12,6 @@ As openim is using go1.18's [workspace feature](https://go.dev/doc/tutorial/work You can execute the following commands to do things above: ```bash -# 4dd91a700d3f:/openim# tree -# . -# ├── LICENSE -# ├── README.md -# ├── openim-chat -# │ ├── bin -# │ ├── config -# │ ├── logs -# │ └── scripts -# ├── openim-server -# │ ├── bin -# │ ├── config -# │ ├── logs -# │ └── scripts -# ├── openkf -# │ ├── bin -# │ ├── config -# │ ├── logs -# │ └── scripts -# cd tools_code_dir # edit the CRD_NAME and CRD_GROUP to your own export OPENIM_TOOLS_NAME= diff --git a/tools/component/component.go b/tools/component/component.go index db9ea915c..ca5f2bda9 100644 --- a/tools/component/component.go +++ b/tools/component/component.go @@ -3,6 +3,7 @@ package main import ( "context" "database/sql" + "flag" "fmt" "net" "net/url" @@ -29,7 +30,8 @@ import ( ) const ( - cfgPath = "../../../../../config/config.yaml" + // defaultCfgPath is the default path of the configuration file + defaultCfgPath = "../../../../../config/config.yaml" minioHealthCheckDuration = 1 maxRetry = 100 componentStartErrCode = 6000 @@ -37,84 +39,64 @@ const ( ) var ( + cfgPath = flag.String("c", defaultCfgPath, "Path to the configuration file") + ErrComponentStart = errs.NewCodeError(componentStartErrCode, "ComponentStartErr") ErrConfig = errs.NewCodeError(configErrCode, "Config file is incorrect") ) func initCfg() error { - data, err := os.ReadFile(cfgPath) + data, err := os.ReadFile(*cfgPath) if err != nil { return err } - if err = yaml.Unmarshal(data, &config.Config); err != nil { - return err - } - return nil + return yaml.Unmarshal(data, &config.Config) +} + +type checkFunc struct { + name string + function func() error } func main() { - err := initCfg() - if err != nil { - fmt.Printf("Read config failed: %v", err.Error()) + flag.Parse() + + if err := initCfg(); err != nil { + fmt.Printf("Read config failed: %v\n", err) + return + } + + checks := []checkFunc{ + {name: "Mysql", function: checkMysql}, + {name: "Mongo", function: checkMongo}, + {name: "Minio", function: checkMinio}, + {name: "Redis", function: checkRedis}, + {name: "Zookeeper", function: checkZookeeper}, + {name: "Kafka", function: checkKafka}, } + for i := 0; i < maxRetry; i++ { if i != 0 { time.Sleep(3 * time.Second) } - fmt.Printf("Checking components Round %v......\n", i+1) - // Check MySQL - if err := checkMysql(); err != nil { - errorPrint(fmt.Sprintf("Starting Mysql failed: %v. Please make sure your mysql service has started", err.Error())) - continue - } else { - successPrint(fmt.Sprint("Mysql starts successfully")) - } - - // Check MongoDB - if err := checkMongo(); err != nil { - errorPrint(fmt.Sprintf("Starting Mongo failed: %v. Please make sure your monngo service has started", err.Error())) - continue - } else { - successPrint(fmt.Sprint("Mongo starts successfully")) - } + fmt.Printf("Checking components Round %v...\n", i+1) - // Check Minio - if err := checkMinio(); err != nil { - if index := strings.Index(err.Error(), utils.IntToString(configErrCode)); index != -1 { - successPrint(fmt.Sprint("Minio starts successfully")) - warningPrint(fmt.Sprintf("%v. Please modify your config file", err.Error())) + allSuccess := true + for _, check := range checks { + err := check.function() + if err != nil { + errorPrint(fmt.Sprintf("Starting %s failed: %v", check.name, err)) + allSuccess = false + break } else { - errorPrint(fmt.Sprintf("Starting Minio failed: %v. Please make sure your Minio service has started", err.Error())) - continue + successPrint(fmt.Sprintf("%s starts successfully", check.name)) } - } else { - successPrint(fmt.Sprint("Minio starts successfully")) - } - // Check Redis - if err := checkRedis(); err != nil { - errorPrint(fmt.Sprintf("Starting Redis failed: %v.Please make sure your Redis service has started", err.Error())) - continue - } else { - successPrint(fmt.Sprint("Redis starts successfully")) } - // Check Zookeeper - if err := checkZookeeper(); err != nil { - errorPrint(fmt.Sprintf("Starting Zookeeper failed: %v.Please make sure your Zookeeper service has started", err.Error())) - continue - } else { - successPrint(fmt.Sprint("Zookeeper starts successfully")) - } - - // Check Kafka - if err := checkKafka(); err != nil { - errorPrint(fmt.Sprintf("Starting Kafka failed: %v.Please make sure your Kafka service has started", err.Error())) - continue - } else { - successPrint(fmt.Sprint("Kafka starts successfully")) + if allSuccess { + successPrint("All components started successfully!") + return } - successPrint(fmt.Sprint("All components starts successfully")) - os.Exit(0) } os.Exit(1) }