package config import ( "basic.com/valib/logger.git" "bytes" "embed" "fmt" "gopkg.in/ini.v1" "io" "io/ioutil" "os" "path" "path/filepath" "strconv" ) var ( baseDir string configFile string baseApiPort uint16 baseP2pPort uint16 baseDebugPort uint16 ) const ( defaultRootDir = "/var/lib/bee" nodePrefix = "node" defaultPortStep uint16 = 10 defaultApiPort uint16 = 1633 defaultP2pPort uint16 = 1634 defaultDebugPort uint16 = 1635 ) //go:embed static var local embed.FS func init() { dir, err := filepath.Abs(filepath.Dir(os.Args[0])) if nil != err { os.Exit(1) } configFile = path.Join(dir, "config.ini") cfg, err := ini.LooseLoad(configFile) if nil != err { logger.Error("failed to load ini file, err:", err) os.Exit(2) } baseDir := cfg.Section("data").Key("dir").MustString(defaultRootDir); err = os.MkdirAll(baseDir, os.ModePerm) if nil != err { logger.Error("failed to mkdir path:", baseDir, ", err:", err) os.Exit(3) } fmt.Println("base dir:", baseDir) baseApiPort = uint16(cfg.Section("port").Key("api").MustUint(uint(defaultApiPort))) baseP2pPort = uint16(cfg.Section("port").Key("p2p").MustUint(uint(defaultP2pPort))) baseDebugPort = uint16(cfg.Section("port").Key("debug").MustUint(uint(defaultDebugPort))) } func GetNodeDir(id uint8) string { dir := fmt.Sprintf("%s%d", nodePrefix, id) return path.Join(baseDir, dir) } func GetApiPort(id uint8) uint16 { port := baseApiPort + (uint16(id) - 1) * defaultPortStep return port } func GetP2pPort(id uint8) uint16 { port := baseP2pPort + (uint16(id) - 1) * defaultPortStep return port } func GetDebugPort(id uint8) uint16 { port := baseDebugPort + (uint16(id) - 1) * defaultPortStep return port } func GenerateDockerFile(dir string, id uint8) error { dockerFile := path.Join(dir, "docker-compose.yml") err := copyResource(dockerFile, "static/docker-compose.yml", "") if nil != err { logger.Error("copyResource failed to read static resource, err:", err) return err } multipleLine := generateEnvVariable(id) envFile := path.Join(dir, ".env") err = copyResource(envFile, "static/env", multipleLine) return nil } func generateEnvVariable(id uint8) string { var b bytes.Buffer apiPort := strconv.Itoa(int(GetApiPort(id))) p2pPort := strconv.Itoa(int(GetP2pPort(id))) debugPort := strconv.Itoa(int(GetDebugPort(id))) b.WriteString("\r\n") b.WriteString("\r\n") b.WriteString(`## HTTP API listen "address" (default :1633)`) b.WriteString("\r\n") b.WriteString(` BEE_API_ADDR=:`) b.WriteString(apiPort) b.WriteString("\r\n") b.WriteString("\r\n") b.WriteString(`## P2P listen address (default :1634)`) b.WriteString("\r\n") b.WriteString(` BEE_P2P_ADDR=:`) b.WriteString(p2pPort) b.WriteString("\r\n") b.WriteString("\r\n") b.WriteString(`## debug HTTP API listen address (default :1635)`) b.WriteString("\r\n") b.WriteString(` BEE_DEBUG_API_ADDR=:`) b.WriteString(debugPort) b.WriteString("\r\n") b.WriteString("\r\n") b.WriteString(` API_ADDR=:`) b.WriteString(apiPort) b.WriteString("\r\n") b.WriteString("\r\n") b.WriteString(` P2P_ADDR=:`) b.WriteString(p2pPort) b.WriteString("\r\n") b.WriteString("\r\n") b.WriteString(` DEBUG_API_ADDR=:`) b.WriteString(debugPort) b.WriteString("\r\n") b.WriteString("\r\n") return b.String() } func copyResource(dest, src string, content string) error { in, err := local.Open(src) if nil != err { logger.Error("copyResource failed to read static resource, err:", err) return err } defer in.Close() out, err := os.Create(dest) if nil != err { logger.Error("copyResource failed to create local copy, err:", err) return err } defer out.Close() if len(content) > 0 { bytes, err := ioutil.ReadAll(in) if nil != err { logger.Error("copyResource failed to read from source file, err:", err) return err } _, err = out.WriteString(string(bytes)) if nil != err { logger.Error("copyResource failed to write , err:", err) return err } _, err = out.WriteString(content) if nil != err { logger.Error("copyResource failed to read from source file, err:", err) return err } } else { _, err = io.Copy(out, in) if nil != err { logger.Error("copyResource failed to copy file, err:", err) return err } } return nil }