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