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() {
// 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...")

View File

@ -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
//}