This commit is contained in:
ZhuoQinghui 2024-12-27 17:08:51 +08:00
parent a742f096f0
commit 8d063e1330
3 changed files with 268 additions and 363 deletions

View File

@ -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")
}

View File

@ -63,8 +63,7 @@ package src
//收到停止命令 //收到停止命令
//*/ //*/
//func onStop() { //func onStop() {
// log.Println("Stopping daemon...") // log.Println("Stopping daemon...")// os.Remove(PidFile)
// os.Remove(PidFile)
// log.Println("Remove PID File...") // log.Println("Remove PID File...")
// os.Remove(SocketFile) // os.Remove(SocketFile)
// log.Println("Remove Socket File...") // log.Println("Remove Socket File...")

View File

@ -1,269 +1,269 @@
package src package src
import ( //import (
"encoding/json" // "encoding/json"
"log" // "log"
"net" // "net"
"os" // "os"
"os/exec" // "os/exec"
"path" // "path"
"path/filepath" // "path/filepath"
"strconv" // "strconv"
"syscall" // "syscall"
) //)
//
var stdout *os.File //var stdout *os.File
var stderr *os.File //var stderr *os.File
//
// Start 启动/* //// Start 启动/*
func Start() { //func Start() {
initLog() // initLog()
args := os.Args // args := os.Args
if len(args) <= 1 { // if len(args) <= 1 {
// //daemonStart()
// doTask()
// return
// }
// command := args[1]
// switch command {
// case "help":
// showHelp()
// case "block":
// doTask()
// case "start":
// daemonStart() // daemonStart()
doTask() // case "stop":
return // daemonStop()
} // case "status":
command := args[1] // daemonStatus()
switch command { // case "dump":
case "help": // dumpConfig()
showHelp() // case "domains":
case "block": // showDomains()
doTask() // case "pubkey":
case "start": // showPubkey()
daemonStart() // case "apply":
case "stop": // applyOnce()
daemonStop() // case "-s":
case "status": // daemonCommand()
daemonStatus() // default:
case "dump": // log.Fatalf("Unknown command: %s", command)
dumpConfig() // }
case "domains": //}
showDomains() //
case "pubkey": //// 初始化日志文件
showPubkey() //func initLog() {
case "apply": // pwd, err := os.Getwd()
applyOnce() // if err != nil {
case "-s": // log.Fatalf("Failed to get current working directory: %v", err)
daemonCommand() // }
default: // dir := path.Join(pwd, "log")
log.Fatalf("Unknown command: %s", command) // _, err = os.Stat(dir)
} // if os.IsNotExist(err) {
} // err := os.Mkdir(dir, 0777)
// if err != nil {
// 初始化日志文件 // log.Fatalf("Failed to create directory: %v", err)
func initLog() { // }
pwd, err := os.Getwd() // }
if err != nil { // outFile, err := os.OpenFile(path.Join(dir, "out.log"), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
log.Fatalf("Failed to get current working directory: %v", err) // defer outFile.Close()
} // stdout = outFile
dir := path.Join(pwd, "log") //
_, err = os.Stat(dir) // errFile, err := os.OpenFile(path.Join(dir, "err.log"), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
if os.IsNotExist(err) { // defer stderr.Close()
err := os.Mkdir(dir, 0777) // stderr = errFile
if err != nil { //}
log.Fatalf("Failed to create directory: %v", err) //
} //func showHelp() {
} //}
outFile, err := os.OpenFile(path.Join(dir, "out.log"), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) //
defer outFile.Close() //// 守护进程启动
stdout = outFile //func daemonStart() {
// GetAppConfig()
errFile, err := os.OpenFile(path.Join(dir, "err.log"), os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644) // isDaemon := os.Getenv("GO_DAEMON")
defer stderr.Close() // log.Println("Run Daemon, DAEMON Is " + isDaemon)
stderr = errFile // if isDaemon != "1" {
} // // 直接启动
// if isRunning() {
func showHelp() { // log.Println("Daemon is already running.")
} // return
// }
// 守护进程启动 //
func daemonStart() { // workPath, err := os.Executable()
GetAppConfig() // if err != nil {
isDaemon := os.Getenv("GO_DAEMON") // log.Fatalf("Failed to get executable path: %v", err)
log.Println("Run Daemon, DAEMON Is " + isDaemon) // }
if isDaemon != "1" { // cmd := exec.Cmd{
// 直接启动 // Path: workPath,
if isRunning() { // Args: os.Args,
log.Println("Daemon is already running.") // Dir: filepath.Dir(workPath),
return // Env: append(os.Environ(), "GO_DAEMON=1"),
} // //Stdin: os.Stdin,
// Stdout: stdout,
workPath, err := os.Executable() // Stderr: stderr,
if err != nil { // //Stdin: os.Stdin,
log.Fatalf("Failed to get executable path: %v", err) // //Stdout: os.Stdout,
} // //Stderr: os.Stderr,
cmd := exec.Cmd{ // SysProcAttr: &syscall.SysProcAttr{},
Path: workPath, // }
Args: os.Args, //
Dir: filepath.Dir(workPath), // log.Println("Starting daemon...")
Env: append(os.Environ(), "GO_DAEMON=1"), // err = cmd.Start()
//Stdin: os.Stdin, // if err != nil {
Stdout: stdout, // log.Fatalf("Failed to start daemon: %v", err)
Stderr: stderr, // }
//Stdin: os.Stdin, // err = os.WriteFile(PidFile, []byte(strconv.Itoa(cmd.Process.Pid)), 0644)
//Stdout: os.Stdout, // if err != nil {
//Stderr: os.Stderr, // log.Fatalf("Failed to write PID file: %v", err)
SysProcAttr: &syscall.SysProcAttr{}, // }
} // log.Printf("Daemon started with PID: %d", cmd.Process.Pid)
// os.Exit(0)
log.Println("Starting daemon...") //
err = cmd.Start() // } else {
if err != nil { // // 子进程
log.Fatalf("Failed to start daemon: %v", err) // doTask()
} // }
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) //func daemonStop() {
os.Exit(0) // sendCommand("stop")
//}
} else { //
// 子进程 //// 守护进程状态
doTask() //func daemonStatus() {
} // if isRunning() {
// log.Println("Daemon is running.")
} // } else {
// log.Println("Daemon is not running.")
// 守护进程停止 // }
func daemonStop() { //}
sendCommand("stop") //
} //// 输出配置文件
//func dumpConfig() {
// 守护进程状态 // //config, err := json.Marshal(GetAppConfig())
func daemonStatus() { // config, err := json.MarshalIndent(GetAppConfig(), "", " ")
if isRunning() { // if err != nil {
log.Println("Daemon is running.") // log.Fatalf("Failed to marshal config: %v", err)
} else { // }
log.Println("Daemon is not running.") // log.Println(string(config))
} //}
} //
//// 手动执行一次证书申请
// 输出配置文件 //func applyOnce() {
func dumpConfig() { // if len(os.Args) < 3 {
//config, err := json.Marshal(GetAppConfig()) // log.Fatalf("Please enter domain name!")
config, err := json.MarshalIndent(GetAppConfig(), "", " ") // }
if err != nil { // name := os.Args[2]
log.Fatalf("Failed to marshal config: %v", err) // if name == "" {
} // log.Fatalf("No domain specified!")
log.Println(string(config)) // }
} // domain := GetAppConfig().FindDomain(name)
// if domain == nil {
// 手动执行一次证书申请 // log.Fatalf("Domain not found: %s", name)
func applyOnce() { // }
if len(os.Args) < 3 { // Apply(*domain)
log.Fatalf("Please enter domain name!") //}
} //
name := os.Args[2] //// 输出域名列表
if name == "" { //func showDomains() {
log.Fatalf("No domain specified!") // domains := GetAppConfig().Domains
} // // 格式化为json并打印
domain := GetAppConfig().FindDomain(name) // config, err := json.MarshalIndent(domains, "", " ")
if domain == nil { // if err != nil {
log.Fatalf("Domain not found: %s", name) // log.Fatalf("Failed to marshal config: %v", err)
} // }
Apply(*domain) // log.Println(string(config))
} //}
//
// 输出域名列表 //// 输出公钥
func showDomains() { //func showPubkey() {
domains := GetAppConfig().Domains // key := GetAppConfig().Encrypt.PubKey
// 格式化为json并打印 // log.Println(key)
config, err := json.MarshalIndent(domains, "", " ") //}
if err != nil { //
log.Fatalf("Failed to marshal config: %v", err) //// 守护进程接收命令
} //func daemonCommand() {
log.Println(string(config)) // log.Println("Sending command...")
} // command := os.Args[2]
// sendCommand(command)
// 输出公钥 //
func showPubkey() { //}
key := GetAppConfig().Encrypt.PubKey //
log.Println(key) //// 发送命令
} //func sendCommand(command string) {
// conn, err := net.Dial("unix", SocketFile)
// 守护进程接收命令 // if err != nil {
func daemonCommand() { // log.Fatalf("Failed to connect to daemon: %v", err)
log.Println("Sending command...") // }
command := os.Args[2] // defer func(conn net.Conn) {
sendCommand(command) // err := conn.Close()
// if err != nil {
} // log.Fatalf("Failed to close connection: %v", err)
// }
// 发送命令 // }(conn)
func sendCommand(command string) { //
conn, err := net.Dial("unix", SocketFile) // _, err = conn.Write([]byte(command))
if err != nil { // if err != nil {
log.Fatalf("Failed to connect to daemon: %v", err) // log.Fatalf("Failed to send command: %v", err)
} // }
defer func(conn net.Conn) { //
err := conn.Close() // log.Printf("Sending command '%s' to daemon with PID: %d", command, 0)
if err != nil { //}
log.Fatalf("Failed to close connection: %v", err) //
} //// 业务进程执行任务
}(conn) //func doTask() {
//
_, err = conn.Write([]byte(command)) // // 监听主进程下发的指令
if err != nil { // go InitSocket()
log.Fatalf("Failed to send command: %v", err) //
} // // 监听HTTP请求
// go InitHttpServer("0.0.0.0", 10000)
log.Printf("Sending command '%s' to daemon with PID: %d", command, 0) //
} // // 自动执行域名证书更新
// go AutoRefreshCert()
// 业务进程执行任务 //
func doTask() { // // 阻止退出
// select {}
// 监听主进程下发的指令 //}
go InitSocket() //
//// 是否已启动
// 监听HTTP请求 //func isRunning() bool {
go InitHttpServer("0.0.0.0", 10000) // log.Println("Checking if daemon is running...")
// pid, err := readPID()
// 自动执行域名证书更新 // if err != nil {
go AutoRefreshCert() // return false
// }
// 阻止退出 //
select {} // process, err := os.FindProcess(pid)
} // log.Println("Found process:", process)
// if err != nil {
// 是否已启动 // log.Println("Failed to find process:", err)
func isRunning() bool { // return false
log.Println("Checking if daemon is running...") // }
pid, err := readPID() // return true
if err != nil { // //err = process.Signal(syscall.Signal(0))
return false // //log.Println("Signal result:", err)
} // //return err == nil
//}
process, err := os.FindProcess(pid) //
log.Println("Found process:", process) //// 读取PID文件
if err != nil { //func readPID() (int, error) {
log.Println("Failed to find process:", err) // log.Println("Reading PID file...")
return false // data, err := os.ReadFile(PidFile)
} // if err != nil {
return true // log.Println("Failed to read PID file:", err)
//err = process.Signal(syscall.Signal(0)) // return 0, err
//log.Println("Signal result:", err) // }
//return err == nil // log.Println("PID file content:", string(data))
} //
// pid, err := strconv.Atoi(string(data))
// 读取PID文件 // if err != nil {
func readPID() (int, error) { // log.Println("Failed to parse PID:", err)
log.Println("Reading PID file...") // return 0, err
data, err := os.ReadFile(PidFile) // }
if err != nil { // log.Println("PID:", pid)
log.Println("Failed to read PID file:", err) //
return 0, err // return pid, nil
} //}
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
}