diff --git a/src/cmd/handler.go b/src/cmd/handler.go deleted file mode 100644 index 65e98f5..0000000 --- a/src/cmd/handler.go +++ /dev/null @@ -1,94 +0,0 @@ -package cmd - -import ( - "acme-mana/src/conf" - "acme-mana/src/server" - "acme-mana/src/util" - "encoding/json" - "fmt" - tea "github.com/charmbracelet/bubbletea" - "github.com/spf13/cobra" - "strconv" -) - -// 打印 配置信息 -func confShow(cmd *cobra.Command, args []string) { - tea.Println() - confJson, err := json.MarshalIndent(conf.Config(), "", " ") - if err != nil { - fmt.Println("序列化配置信息失败:", err) - } - fmt.Println(string(confJson)) -} - -func editServer(cmd *cobra.Command, args []string) { - server := conf.Config().Server - server.Host = util.ReadLine("请输入服务监听地址;", server.Host) - server.Port = util.ReadInt("请输入服务监听端口;", strconv.Itoa(server.Port)) - conf.WriteConfig() - fmt.Println("服务监听配置已完成") -} - -func serverState(cmd *cobra.Command, args []string) { - server.HttpInstance.Status() -} -func startServer(cmd *cobra.Command, args []string) { - server.HttpInstance.Start() -} -func stopServer(cmd *cobra.Command, args []string) { - fmt.Println("stop server") -} - -func editTask(cmd *cobra.Command, args []string) { - fmt.Println("edit task") -} -func runTask(cmd *cobra.Command, args []string) { - fmt.Println("run task") -} - -func statusTask(cmd *cobra.Command, args []string) { - fmt.Println("status task") -} - -func stopTask(cmd *cobra.Command, args []string) { - fmt.Println("stop task") -} - -func startTask(cmd *cobra.Command, args []string) { - fmt.Println("start task") -} -func providerDelete(cmd *cobra.Command, args []string) { - fmt.Println("delete provider") -} - -func providerEdit(cmd *cobra.Command, args []string) { - fmt.Println("edit provider") -} - -func providerAdd(cmd *cobra.Command, args []string) { - fmt.Println("add provider") -} - -func providerList(cmd *cobra.Command, args []string) { - fmt.Println("list provider") -} - -func providerSupport(cmd *cobra.Command, args []string) { - fmt.Println("support provider") -} - -func editCert(cmd *cobra.Command, args []string) { - fmt.Println("edit cert") -} - -func certDelete(cmd *cobra.Command, args []string) { - fmt.Println("delete cert") -} - -func certAdd(cmd *cobra.Command, args []string) { - fmt.Println("add cert") -} - -func certList(cmd *cobra.Command, args []string) { - fmt.Println("list cert") -} diff --git a/src/command.go b/src/command.go index f625330..6de28b4 100644 --- a/src/command.go +++ b/src/command.go @@ -63,8 +63,7 @@ package src //收到停止命令 //*/ //func onStop() { -// log.Println("Stopping daemon...") -// os.Remove(PidFile) +// log.Println("Stopping daemon...")// os.Remove(PidFile) // log.Println("Remove PID File...") // os.Remove(SocketFile) // log.Println("Remove Socket File...") diff --git a/src/daemon.go b/src/daemon.go index 960e92e..b36ec91 100644 --- a/src/daemon.go +++ b/src/daemon.go @@ -1,269 +1,269 @@ package src -import ( - "encoding/json" - "log" - "net" - "os" - "os/exec" - "path" - "path/filepath" - "strconv" - "syscall" -) - -var stdout *os.File -var stderr *os.File - -// Start 启动/* -func Start() { - initLog() - args := os.Args - if len(args) <= 1 { - //daemonStart() - doTask() - return - } - command := args[1] - switch command { - case "help": - showHelp() - case "block": - doTask() - case "start": - daemonStart() - case "stop": - daemonStop() - case "status": - daemonStatus() - case "dump": - dumpConfig() - case "domains": - showDomains() - case "pubkey": - showPubkey() - case "apply": - applyOnce() - case "-s": - daemonCommand() - default: - log.Fatalf("Unknown command: %s", command) - } -} - -// 初始化日志文件 -func initLog() { - pwd, err := os.Getwd() - if err != nil { - log.Fatalf("Failed to get current working directory: %v", err) - } - dir := path.Join(pwd, "log") - _, err = os.Stat(dir) - if os.IsNotExist(err) { - err := os.Mkdir(dir, 0777) - if err != nil { - log.Fatalf("Failed to create directory: %v", err) - } - } - outFile, err := os.OpenFile(path.Join(dir, "out.log"), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) - defer outFile.Close() - stdout = outFile - - errFile, err := os.OpenFile(path.Join(dir, "err.log"), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) - defer stderr.Close() - stderr = errFile -} - -func showHelp() { -} - -// 守护进程启动 -func daemonStart() { - GetAppConfig() - isDaemon := os.Getenv("GO_DAEMON") - log.Println("Run Daemon, DAEMON Is " + isDaemon) - if isDaemon != "1" { - // 直接启动 - if isRunning() { - log.Println("Daemon is already running.") - return - } - - workPath, err := os.Executable() - if err != nil { - log.Fatalf("Failed to get executable path: %v", err) - } - cmd := exec.Cmd{ - Path: workPath, - Args: os.Args, - Dir: filepath.Dir(workPath), - Env: append(os.Environ(), "GO_DAEMON=1"), - //Stdin: os.Stdin, - Stdout: stdout, - Stderr: stderr, - //Stdin: os.Stdin, - //Stdout: os.Stdout, - //Stderr: os.Stderr, - SysProcAttr: &syscall.SysProcAttr{}, - } - - log.Println("Starting daemon...") - err = cmd.Start() - if err != nil { - log.Fatalf("Failed to start daemon: %v", err) - } - err = os.WriteFile(PidFile, []byte(strconv.Itoa(cmd.Process.Pid)), 0644) - if err != nil { - log.Fatalf("Failed to write PID file: %v", err) - } - log.Printf("Daemon started with PID: %d", cmd.Process.Pid) - os.Exit(0) - - } else { - // 子进程 - doTask() - } - -} - -// 守护进程停止 -func daemonStop() { - sendCommand("stop") -} - -// 守护进程状态 -func daemonStatus() { - if isRunning() { - log.Println("Daemon is running.") - } else { - log.Println("Daemon is not running.") - } -} - -// 输出配置文件 -func dumpConfig() { - //config, err := json.Marshal(GetAppConfig()) - config, err := json.MarshalIndent(GetAppConfig(), "", " ") - if err != nil { - log.Fatalf("Failed to marshal config: %v", err) - } - log.Println(string(config)) -} - -// 手动执行一次证书申请 -func applyOnce() { - if len(os.Args) < 3 { - log.Fatalf("Please enter domain name!") - } - name := os.Args[2] - if name == "" { - log.Fatalf("No domain specified!") - } - domain := GetAppConfig().FindDomain(name) - if domain == nil { - log.Fatalf("Domain not found: %s", name) - } - Apply(*domain) -} - -// 输出域名列表 -func showDomains() { - domains := GetAppConfig().Domains - // 格式化为json并打印 - config, err := json.MarshalIndent(domains, "", " ") - if err != nil { - log.Fatalf("Failed to marshal config: %v", err) - } - log.Println(string(config)) -} - -// 输出公钥 -func showPubkey() { - key := GetAppConfig().Encrypt.PubKey - log.Println(key) -} - -// 守护进程接收命令 -func daemonCommand() { - log.Println("Sending command...") - command := os.Args[2] - sendCommand(command) - -} - -// 发送命令 -func sendCommand(command string) { - conn, err := net.Dial("unix", SocketFile) - if err != nil { - log.Fatalf("Failed to connect to daemon: %v", err) - } - defer func(conn net.Conn) { - err := conn.Close() - if err != nil { - log.Fatalf("Failed to close connection: %v", err) - } - }(conn) - - _, err = conn.Write([]byte(command)) - if err != nil { - log.Fatalf("Failed to send command: %v", err) - } - - log.Printf("Sending command '%s' to daemon with PID: %d", command, 0) -} - -// 业务进程执行任务 -func doTask() { - - // 监听主进程下发的指令 - go InitSocket() - - // 监听HTTP请求 - go InitHttpServer("0.0.0.0", 10000) - - // 自动执行域名证书更新 - go AutoRefreshCert() - - // 阻止退出 - select {} -} - -// 是否已启动 -func isRunning() bool { - log.Println("Checking if daemon is running...") - pid, err := readPID() - if err != nil { - return false - } - - process, err := os.FindProcess(pid) - log.Println("Found process:", process) - if err != nil { - log.Println("Failed to find process:", err) - return false - } - return true - //err = process.Signal(syscall.Signal(0)) - //log.Println("Signal result:", err) - //return err == nil -} - -// 读取PID文件 -func readPID() (int, error) { - log.Println("Reading PID file...") - data, err := os.ReadFile(PidFile) - if err != nil { - log.Println("Failed to read PID file:", err) - return 0, err - } - log.Println("PID file content:", string(data)) - - pid, err := strconv.Atoi(string(data)) - if err != nil { - log.Println("Failed to parse PID:", err) - return 0, err - } - log.Println("PID:", pid) - - return pid, nil -} +//import ( +// "encoding/json" +// "log" +// "net" +// "os" +// "os/exec" +// "path" +// "path/filepath" +// "strconv" +// "syscall" +//) +// +//var stdout *os.File +//var stderr *os.File +// +//// Start 启动/* +//func Start() { +// initLog() +// args := os.Args +// if len(args) <= 1 { +// //daemonStart() +// doTask() +// return +// } +// command := args[1] +// switch command { +// case "help": +// showHelp() +// case "block": +// doTask() +// case "start": +// daemonStart() +// case "stop": +// daemonStop() +// case "status": +// daemonStatus() +// case "dump": +// dumpConfig() +// case "domains": +// showDomains() +// case "pubkey": +// showPubkey() +// case "apply": +// applyOnce() +// case "-s": +// daemonCommand() +// default: +// log.Fatalf("Unknown command: %s", command) +// } +//} +// +//// 初始化日志文件 +//func initLog() { +// pwd, err := os.Getwd() +// if err != nil { +// log.Fatalf("Failed to get current working directory: %v", err) +// } +// dir := path.Join(pwd, "log") +// _, err = os.Stat(dir) +// if os.IsNotExist(err) { +// err := os.Mkdir(dir, 0777) +// if err != nil { +// log.Fatalf("Failed to create directory: %v", err) +// } +// } +// outFile, err := os.OpenFile(path.Join(dir, "out.log"), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) +// defer outFile.Close() +// stdout = outFile +// +// errFile, err := os.OpenFile(path.Join(dir, "err.log"), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) +// defer stderr.Close() +// stderr = errFile +//} +// +//func showHelp() { +//} +// +//// 守护进程启动 +//func daemonStart() { +// GetAppConfig() +// isDaemon := os.Getenv("GO_DAEMON") +// log.Println("Run Daemon, DAEMON Is " + isDaemon) +// if isDaemon != "1" { +// // 直接启动 +// if isRunning() { +// log.Println("Daemon is already running.") +// return +// } +// +// workPath, err := os.Executable() +// if err != nil { +// log.Fatalf("Failed to get executable path: %v", err) +// } +// cmd := exec.Cmd{ +// Path: workPath, +// Args: os.Args, +// Dir: filepath.Dir(workPath), +// Env: append(os.Environ(), "GO_DAEMON=1"), +// //Stdin: os.Stdin, +// Stdout: stdout, +// Stderr: stderr, +// //Stdin: os.Stdin, +// //Stdout: os.Stdout, +// //Stderr: os.Stderr, +// SysProcAttr: &syscall.SysProcAttr{}, +// } +// +// log.Println("Starting daemon...") +// err = cmd.Start() +// if err != nil { +// log.Fatalf("Failed to start daemon: %v", err) +// } +// err = os.WriteFile(PidFile, []byte(strconv.Itoa(cmd.Process.Pid)), 0644) +// if err != nil { +// log.Fatalf("Failed to write PID file: %v", err) +// } +// log.Printf("Daemon started with PID: %d", cmd.Process.Pid) +// os.Exit(0) +// +// } else { +// // 子进程 +// doTask() +// } +// +//} +// +//// 守护进程停止 +//func daemonStop() { +// sendCommand("stop") +//} +// +//// 守护进程状态 +//func daemonStatus() { +// if isRunning() { +// log.Println("Daemon is running.") +// } else { +// log.Println("Daemon is not running.") +// } +//} +// +//// 输出配置文件 +//func dumpConfig() { +// //config, err := json.Marshal(GetAppConfig()) +// config, err := json.MarshalIndent(GetAppConfig(), "", " ") +// if err != nil { +// log.Fatalf("Failed to marshal config: %v", err) +// } +// log.Println(string(config)) +//} +// +//// 手动执行一次证书申请 +//func applyOnce() { +// if len(os.Args) < 3 { +// log.Fatalf("Please enter domain name!") +// } +// name := os.Args[2] +// if name == "" { +// log.Fatalf("No domain specified!") +// } +// domain := GetAppConfig().FindDomain(name) +// if domain == nil { +// log.Fatalf("Domain not found: %s", name) +// } +// Apply(*domain) +//} +// +//// 输出域名列表 +//func showDomains() { +// domains := GetAppConfig().Domains +// // 格式化为json并打印 +// config, err := json.MarshalIndent(domains, "", " ") +// if err != nil { +// log.Fatalf("Failed to marshal config: %v", err) +// } +// log.Println(string(config)) +//} +// +//// 输出公钥 +//func showPubkey() { +// key := GetAppConfig().Encrypt.PubKey +// log.Println(key) +//} +// +//// 守护进程接收命令 +//func daemonCommand() { +// log.Println("Sending command...") +// command := os.Args[2] +// sendCommand(command) +// +//} +// +//// 发送命令 +//func sendCommand(command string) { +// conn, err := net.Dial("unix", SocketFile) +// if err != nil { +// log.Fatalf("Failed to connect to daemon: %v", err) +// } +// defer func(conn net.Conn) { +// err := conn.Close() +// if err != nil { +// log.Fatalf("Failed to close connection: %v", err) +// } +// }(conn) +// +// _, err = conn.Write([]byte(command)) +// if err != nil { +// log.Fatalf("Failed to send command: %v", err) +// } +// +// log.Printf("Sending command '%s' to daemon with PID: %d", command, 0) +//} +// +//// 业务进程执行任务 +//func doTask() { +// +// // 监听主进程下发的指令 +// go InitSocket() +// +// // 监听HTTP请求 +// go InitHttpServer("0.0.0.0", 10000) +// +// // 自动执行域名证书更新 +// go AutoRefreshCert() +// +// // 阻止退出 +// select {} +//} +// +//// 是否已启动 +//func isRunning() bool { +// log.Println("Checking if daemon is running...") +// pid, err := readPID() +// if err != nil { +// return false +// } +// +// process, err := os.FindProcess(pid) +// log.Println("Found process:", process) +// if err != nil { +// log.Println("Failed to find process:", err) +// return false +// } +// return true +// //err = process.Signal(syscall.Signal(0)) +// //log.Println("Signal result:", err) +// //return err == nil +//} +// +//// 读取PID文件 +//func readPID() (int, error) { +// log.Println("Reading PID file...") +// data, err := os.ReadFile(PidFile) +// if err != nil { +// log.Println("Failed to read PID file:", err) +// return 0, err +// } +// log.Println("PID file content:", string(data)) +// +// pid, err := strconv.Atoi(string(data)) +// if err != nil { +// log.Println("Failed to parse PID:", err) +// return 0, err +// } +// log.Println("PID:", pid) +// +// return pid, nil +//}