saseul-script

package main

import (
	"bufio"
	"fmt"
	"os"
	"path/filepath"

	"github.com/joho/godotenv"
)

// DSλŠ” 파일 κ²½λ‘œμ—μ„œ μ‚¬μš©ν•  κ΅¬λΆ„μžμž…λ‹ˆλ‹€.
const DS = string(filepath.Separator)

// ROOTλŠ” ν”„λ‘œμ νŠΈμ˜ 루트 디렉터리 κ²½λ‘œμž…λ‹ˆλ‹€.
const ROOT = "path/to/root"

// SOURCEλŠ” ν˜„μž¬ μ†ŒμŠ€ 파일의 디렉터리 κ²½λ‘œμž…λ‹ˆλ‹€.
const SOURCE = "path/to/source"

// SASEUL_VERSION은 SASEUL의 ν˜„μž¬ 버전을 λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
const SASEUL_VERSION = "2.1.9.6"

// DEBUG_LOGλŠ” 디버그 둜그 파일의 κ²½λ‘œμž…λ‹ˆλ‹€.
const DEBUG_LOG = "debug.log"

var (
	SASEUL_INI map[string]string // SASEUL μ„€μ • 값을 μ €μž₯ν•˜λŠ” λ§΅μž…λ‹ˆλ‹€.
)

func main() {
	loadEnv()         // ν™˜κ²½ μ„€μ • νŒŒμΌμ„ λ‘œλ“œν•©λ‹ˆλ‹€.
	setMemoryLimit()  // λ©”λͺ¨λ¦¬ μ œν•œμ„ μ„€μ •ν•©λ‹ˆλ‹€. (Goμ—μ„œλŠ” 일반적으둜 ν•„μš”ν•˜μ§€ μ•ŠμŒ)

	saseulRoot := filepath.Join(SOURCE, "Saseul")

	LoaderBuild(map[string]string{
		"api_root":    filepath.Join(saseulRoot, "Api"),
		"script_root": filepath.Join(saseulRoot, "Script"),
		"service_root": filepath.Join(saseulRoot, "Service"),
	})

	EnvInit()

	if !EnvExists() {
		fmt.Println("\nThe env file does not exist. Starting to create an env file.")
		LoaderScript([]string{"saseul-script", "SetEnv"})
		os.Exit(1)
	}

	EnvLoad()
	LoaderScript(os.Args)
}

// loadEnv ν•¨μˆ˜λŠ” ν™˜κ²½ μ„€μ • 파일(saseul.ini)을 λ‘œλ“œν•˜μ—¬ SASEUL_INI 맡에 μ €μž₯ν•©λ‹ˆλ‹€.
func loadEnv() {
	godotenv.Load(filepath.Join(ROOT, "saseul.ini"))
	SASEUL_INI = map[string]string{
		"log":             getEnv("log", DEBUG_LOG),
		"version":         getEnv("version", SASEUL_VERSION),
		"data":            getEnv("data", filepath.Join(ROOT, "data")),
		"peers":           getEnv("peers", ""),
		"network_name":    getEnv("network_name", ""),
		"system_nonce":    getEnv("system_nonce", ""),
		"genesis_address": getEnv("genesis_address", ""),
		"manager_addresses": getEnv("manager_addresses", ""),
		"ledger":          getEnv("ledger", ""),
		"database":        getEnv("database", ""),
		"collect":         getEnv("collect", ""),
		"consensus":       getEnv("consensus", ""),
		"mining":          getEnv("mining", ""),
		"mysql_host":      getEnv("mysql_host", ""),
		"mysql_port":      getEnv("mysql_port", ""),
		"mysql_user":      getEnv("mysql_user", ""),
		"mysql_database":  getEnv("mysql_database", ""),
		"mysql_password":  getEnv("mysql_password", ""),
		"err_file":        getEnv("err_file", DEBUG_LOG),
	}
}

// getEnv ν•¨μˆ˜λŠ” ν™˜κ²½ λ³€μˆ˜μ—μ„œ 값을 κ°€μ Έμ˜€κ±°λ‚˜ κΈ°λ³Έ 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.
func getEnv(key, defaultValue string) string {
	if value, exists := os.LookupEnv(key); exists {
		return value
	}
	return defaultValue
}

// setMemoryLimit ν•¨μˆ˜λŠ” λ©”λͺ¨λ¦¬ μ œν•œμ„ μ„€μ •ν•©λ‹ˆλ‹€.
// Go μ–Έμ–΄μ—μ„œλŠ” 일반적으둜 λͺ…μ‹œμ μΈ λ©”λͺ¨λ¦¬ μ œν•œμ΄ ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
func setMemoryLimit() {
	// In Go, we typically do not need to set memory limits as in PHP
}

// LoaderBuild ν•¨μˆ˜λŠ” Loaderλ₯Ό κ΅¬μΆ•ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
// paths 맡에 μ§€μ •λœ κ²½λ‘œλ“€μ„ 기반으둜 μ„€μ •ν•©λ‹ˆλ‹€.
func LoaderBuild(paths map[string]string) {
	// Implement your Loader build function here
}

// EnvInit ν•¨μˆ˜λŠ” ν™˜κ²½ μ΄ˆκΈ°ν™” ν•¨μˆ˜μž…λ‹ˆλ‹€.
// ν•„μš”ν•œ ν™˜κ²½ 섀정을 μ΄ˆκΈ°ν™”ν•˜λŠ” λ‘œμ§μ„ μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
func EnvInit() {
	// Implement your Env init function here
}

// EnvExists ν•¨μˆ˜λŠ” ν™˜κ²½ 파일이 μ‘΄μž¬ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό ν™•μΈν•©λ‹ˆλ‹€.
// μ‹€μ œ κ΅¬ν˜„μ— 따라 ν™˜κ²½ 파일의 쑴재 μ—¬λΆ€λ₯Ό κ²€μ‚¬ν•©λ‹ˆλ‹€.
func EnvExists() bool {
	// Implement your Env exists function here
	return false
}

// EnvLoad ν•¨μˆ˜λŠ” ν™˜κ²½ 섀정을 λ‘œλ“œν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
// μ‹€μ œ κ΅¬ν˜„μ— 따라 ν•„μš”ν•œ ν™˜κ²½ 섀정을 λ‘œλ“œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
func EnvLoad() {
	// Implement your Env load function here
}

// LoaderScript ν•¨μˆ˜λŠ” 슀크립트λ₯Ό μ‹€ν–‰ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
// args둜 μ „λ‹¬λœ 인수λ₯Ό 기반으둜 슀크립트λ₯Ό μ‹€ν–‰ν•©λ‹ˆλ‹€.
func LoaderScript(args []string) {
	// Implement your Loader script function here
}

// writeToFile ν•¨μˆ˜λŠ” μ§€μ •λœ νŒŒμΌμ— 데이터λ₯Ό μ”λ‹ˆλ‹€.
func writeToFile(filename, data string) {
	f, err := os.OpenFile(filename, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
	if err != nil {
		fmt.Println("Error opening file:", err)
		return
	}
	defer f.Close()

	writer := bufio.NewWriter(f)
	_, err = writer.WriteString(data)
	if err != nil {
		fmt.Println("Error writing to file:", err)
	}
	writer.Flush()
}

Last updated