This commit is contained in:
ZhuoQinghui 2024-11-01 15:42:50 +08:00
parent 6ed343cf06
commit 30d77aac56
14 changed files with 242 additions and 16 deletions

12
.run/block.run.xml Normal file
View File

@ -0,0 +1,12 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="block" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="acme-mana" />
<working_directory value="$PROJECT_DIR$" />
<parameters value="block" />
<kind value="PACKAGE" />
<package value="acme-mana" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$/main.go" />
<method v="2" />
</configuration>
</component>

View File

@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="build-darwin-amd64" type="GoApplicationRunConfiguration" factoryName="Go Application" folderName="build">
<module name="acme-mana" />
<working_directory value="$PROJECT_DIR$" />
<go_parameters value="-o bin/acme-mana-darwin-amd64" />
<envs>
<env name="GOARCH" value="amd64" />
<env name="GOOS" value="darwin" />
</envs>
<kind value="PACKAGE" />
<package value="acme-mana" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$" />
<option name="run" value="false" />
<method v="2" />
</configuration>
</component>

View File

@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="build-linux-amd64" type="GoApplicationRunConfiguration" factoryName="Go Application" folderName="build">
<module name="acme-mana" />
<working_directory value="$PROJECT_DIR$" />
<go_parameters value="-o bin/acme-mana-linux-amd64" />
<envs>
<env name="GOARCH" value="amd64" />
<env name="GOOS" value="linux" />
</envs>
<kind value="PACKAGE" />
<package value="acme-mana" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$" />
<option name="run" value="false" />
<method v="2" />
</configuration>
</component>

View File

@ -0,0 +1,17 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="build-windows-amd64" type="GoApplicationRunConfiguration" factoryName="Go Application" folderName="build">
<module name="acme-mana" />
<working_directory value="$PROJECT_DIR$" />
<go_parameters value="-o bin/acme-mana-windows-amd64.exe" />
<envs>
<env name="GOARCH" value="amd64" />
<env name="GOOS" value="windows" />
</envs>
<kind value="PACKAGE" />
<package value="acme-mana" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$" />
<option name="run" value="false" />
<method v="2" />
</configuration>
</component>

12
.run/conf show.run.xml Normal file
View File

@ -0,0 +1,12 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="conf show" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="acme-mana" />
<working_directory value="$PROJECT_DIR$" />
<parameters value="conf show" />
<kind value="PACKAGE" />
<package value="acme-mana" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$/main.go" />
<method v="2" />
</configuration>
</component>

12
.run/help.run.xml Normal file
View File

@ -0,0 +1,12 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="help" type="GoApplicationRunConfiguration" factoryName="Go Application">
<module name="acme-mana" />
<working_directory value="$PROJECT_DIR$" />
<parameters value="help" />
<kind value="PACKAGE" />
<package value="acme-mana" />
<directory value="$PROJECT_DIR$" />
<filePath value="$PROJECT_DIR$/main.go" />
<method v="2" />
</configuration>
</component>

View File

@ -1,7 +1,10 @@
package cmd package cmd
import ( import (
"acme-mana/src/common"
"acme-mana/src/conf"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"os"
) )
func InitCmd() (*cobra.Command, error) { func InitCmd() (*cobra.Command, error) {
@ -10,6 +13,7 @@ func InitCmd() (*cobra.Command, error) {
Short: "ACME协议客户端", Short: "ACME协议客户端",
Long: "基于 ACME 协议实现自动申请证书和续签证书", Long: "基于 ACME 协议实现自动申请证书和续签证书",
} }
common.RootCmd = rootCmd
rootCmd.AddCommand(initConfCmd()) rootCmd.AddCommand(initConfCmd())
rootCmd.AddCommand(initServerCmd()) rootCmd.AddCommand(initServerCmd())
@ -18,7 +22,14 @@ func InitCmd() (*cobra.Command, error) {
rootCmd.AddCommand(certCmd()) rootCmd.AddCommand(certCmd())
rootCmd.AddCommand(acmeCmd()) rootCmd.AddCommand(acmeCmd())
flags := rootCmd.PersistentFlags()
flags.BoolP("force", "f", false, "强制执行")
flags.StringP("conf", "c", "config.yml", "指定配置文件")
_ = rootCmd.ParseFlags(os.Args)
conf.InitAppConfig()
err := rootCmd.Execute() err := rootCmd.Execute()
return rootCmd, err return rootCmd, err
} }

View File

@ -1,12 +1,21 @@
package cmd package cmd
import ( import (
"acme-mana/src/common"
"encoding/json"
"fmt" "fmt"
tea "github.com/charmbracelet/bubbletea"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
// 打印 配置信息
func confShow(cmd *cobra.Command, args []string) { func confShow(cmd *cobra.Command, args []string) {
fmt.Println("show conf") tea.Println()
confJson, err := json.MarshalIndent(common.AppConf, "", " ")
if err != nil {
fmt.Println("序列化配置信息失败:", err)
}
fmt.Println(string(confJson))
} }
func editServer(cmd *cobra.Command, args []string) { func editServer(cmd *cobra.Command, args []string) {

10
src/common/variable.go Normal file
View File

@ -0,0 +1,10 @@
package common
import (
"acme-mana/src/model"
"github.com/spf13/cobra"
)
var RootCmd *cobra.Command
var AppConf *model.AppConfig

69
src/conf/util.go Normal file
View File

@ -0,0 +1,69 @@
package conf
import (
"acme-mana/src/common"
"acme-mana/src/model"
"acme-mana/src/util"
"gopkg.in/yaml.v3"
"log"
"os"
)
func readAppConfig(c *model.AppConfig) *model.AppConfig {
confFile, err := common.RootCmd.PersistentFlags().GetString("conf")
if err != nil {
log.Fatalln("读取配置文件参数失败")
}
_, err = os.Stat(confFile)
if os.IsNotExist(err) {
log.Println("配置文件不存在, 自动创建")
writeConf(c, confFile)
}
file, err := os.ReadFile(confFile)
if err != nil {
log.Fatalln("读取配置文件失败")
}
//var conf = &model.AppConfig{}
err = yaml.Unmarshal(file, c)
if err != nil {
log.Fatalln("解析配置文件失败")
}
return c
}
func InitAppConfig() {
common.AppConf = DefaultAppConfig()
}
func RefreshConfig() {
readAppConfig(common.AppConf)
}
func writeConf(c *model.AppConfig, file string) {
out, err := yaml.Marshal(c)
if err != nil {
log.Fatalln("序列化配置文件失败")
}
util.MkFileDir(file)
err = os.WriteFile(file, out, 0644)
if err != nil {
log.Fatalln("写入配置文件失败")
}
}
func DefaultAppConfig() *model.AppConfig {
return &model.AppConfig{
Server: &model.ServerConf{
Host: "0.0.0.0",
Port: 36851,
},
Task: &model.TaskConf{
Delay: 0,
Interval: 0,
},
Certs: nil,
Providers: nil,
}
}

View File

@ -12,6 +12,9 @@ import (
) )
func ReadConfig() *AppConfig { func ReadConfig() *AppConfig {
if DnsProviderSupports != nil {
return nil
}
InitConfig() InitConfig()
file, err := os.ReadFile(GetEnvConf().ConfFile) file, err := os.ReadFile(GetEnvConf().ConfFile)
if err != nil { if err != nil {

View File

@ -2,7 +2,6 @@ package src
import ( import (
"encoding/json" "encoding/json"
tea "github.com/charmbracelet/bubbletea"
"log" "log"
"net" "net"
"os" "os"
@ -76,20 +75,6 @@ func initLog() {
} }
func showHelp() { func showHelp() {
tea.Println("")
log.Printf(`
Usage: acme-mana [command] [options]
Commands:
help Show this help message
start Start the daemon
stop Stop the daemon
status Check the status of the daemon
dump Dump the configuration file
domains List all domains
pubkey Show the public key
apply Manually apply for a certificate
block Block the
`)
} }
// 守护进程启动 // 守护进程启动

34
src/model/conf.go Normal file
View File

@ -0,0 +1,34 @@
package model
type AppConfig struct {
Server *ServerConf `json:"server" yaml:"server"`
Task *TaskConf `json:"task" yaml:"task"`
Certs *[]CertConf `json:"cert" yaml:"cert"`
Providers *[]ProviderConf `json:"provider" yaml:"provider"`
}
type ServerConf struct {
Host string `json:"host" yaml:"host"`
Port int `json:"port" yaml:"port"`
}
type TaskConf struct {
// 启动延迟时间, 单位: 毫秒, 默认: 0
Delay int `json:"delay" yaml:"delay"`
// 间隔时间
Interval int `json:"interval" yaml:"interval"`
}
type ProviderConf struct {
Name string `json:"name" yaml:"name"`
Type string `json:"type" yaml:"type"`
Conf map[string]string `json:"conf" yaml:"conf"`
}
type CertConf struct {
Name string `json:"name" yaml:"name"`
Provider string `json:"use" yaml:"provider"`
Dir string `json:"dir" yaml:"dir"`
Email string `json:"email" yaml:"email"`
Host []string `json:"host" yaml:"host"`
}

18
src/util/file-util.go Normal file
View File

@ -0,0 +1,18 @@
package util
import (
"log"
"os"
"path/filepath"
)
// MkFileDir 创建文件所在的目录
func MkFileDir(file string) {
dir := filepath.Dir(file)
if _, err := os.Stat(dir); os.IsNotExist(err) {
err := os.MkdirAll(dir, 0755)
if err != nil {
log.Fatal("创建目录失败!", err)
}
}
}