重构
This commit is contained in:
parent
55d241b873
commit
e6d412c114
|
@ -31,7 +31,7 @@ func InitCmd() (*cobra.Command, error) {
|
||||||
//rootCmd.GenPowerShellCompletion(os.Stdout)
|
//rootCmd.GenPowerShellCompletion(os.Stdout)
|
||||||
//rootCmd.GenZshCompletion(os.Stdout)
|
//rootCmd.GenZshCompletion(os.Stdout)
|
||||||
|
|
||||||
conf.InitAppConfig()
|
conf.LoadAppConfig()
|
||||||
err := rootCmd.Execute()
|
err := rootCmd.Execute()
|
||||||
|
|
||||||
return rootCmd, err
|
return rootCmd, err
|
||||||
|
@ -61,10 +61,13 @@ func initConfCmd() *cobra.Command {
|
||||||
func initServerCmd() *cobra.Command {
|
func initServerCmd() *cobra.Command {
|
||||||
serverCmd := &cobra.Command{
|
serverCmd := &cobra.Command{
|
||||||
Use: "server",
|
Use: "server",
|
||||||
Short: "服务相关命令",
|
Short: "服务端命令",
|
||||||
Long: "配置服务相关参数, 如监听端口,监听地址等",
|
Long: "acme-mana服务端相关命令, 配置服务相关参数, 如监听端口,监听地址等",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
cmd.Help()
|
err := cmd.Help()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
editCmd := &cobra.Command{
|
editCmd := &cobra.Command{
|
||||||
|
@ -274,7 +277,7 @@ func acmeCmd() *cobra.Command {
|
||||||
acmeCmd := &cobra.Command{
|
acmeCmd := &cobra.Command{
|
||||||
Use: "acme",
|
Use: "acme",
|
||||||
Short: "ACME相关命令",
|
Short: "ACME相关命令",
|
||||||
Long: "ACME相关命令",
|
Long: "acme.sh原生命令",
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
cmd.Help()
|
cmd.Help()
|
||||||
},
|
},
|
||||||
|
|
|
@ -1,10 +1,7 @@
|
||||||
package common
|
package common
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"acme-mana/src/model"
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
var RootCmd *cobra.Command
|
var RootCmd *cobra.Command
|
||||||
|
|
||||||
var AppConf *model.AppConfig
|
|
||||||
|
|
63
src/conf/conf.go
Normal file
63
src/conf/conf.go
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
package conf
|
||||||
|
|
||||||
|
// AppConfig
|
||||||
|
// 配置文件
|
||||||
|
type AppConfig struct {
|
||||||
|
// 服务器配置
|
||||||
|
Server *ServerConf `json:"server" yaml:"server"`
|
||||||
|
// 网页配置
|
||||||
|
Web *WebConf `json:"web" yaml:"web"`
|
||||||
|
// 任务配置
|
||||||
|
Task *TaskConf `json:"task" yaml:"task"`
|
||||||
|
// 认证配置
|
||||||
|
Providers *[]ProviderConf `json:"provider" yaml:"provider"`
|
||||||
|
// 证书配置
|
||||||
|
Certs *[]CertConf `json:"cert" yaml:"cert"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ServerConf 服务端配置
|
||||||
|
type ServerConf struct {
|
||||||
|
// 监听地址
|
||||||
|
Host string `json:"host" yaml:"host"`
|
||||||
|
// 监听端口
|
||||||
|
Port int `json:"port" yaml:"port"`
|
||||||
|
// 通信密钥, DES 加密
|
||||||
|
Key string `json:"key" yaml:"key"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// WebConf 网页服务配置
|
||||||
|
type WebConf struct {
|
||||||
|
// 是否启用
|
||||||
|
Enable bool `json:"enable" yaml:"enable"`
|
||||||
|
// 监听地址
|
||||||
|
Host string `json:"host" yaml:"host"`
|
||||||
|
// 监听端口
|
||||||
|
Port int `json:"port" yaml:"port"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// TaskConf 定时任务配置
|
||||||
|
type TaskConf struct {
|
||||||
|
// 启动延迟时间, 单位: 毫秒, 默认: 0
|
||||||
|
Delay int `json:"delay" yaml:"delay"`
|
||||||
|
// 间隔时间
|
||||||
|
Interval int `json:"interval" yaml:"interval"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// ProviderConf 三方认证配置
|
||||||
|
type ProviderConf struct {
|
||||||
|
// 认证名称
|
||||||
|
Name string `json:"name" yaml:"name"`
|
||||||
|
// 认证类型
|
||||||
|
Type string `json:"type" yaml:"type"`
|
||||||
|
// 认证配置
|
||||||
|
Conf map[string]string `json:"conf" yaml:"conf"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// CertConf 证书配置
|
||||||
|
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"`
|
||||||
|
}
|
129
src/conf/func.go
Normal file
129
src/conf/func.go
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
package conf
|
||||||
|
|
||||||
|
import "log"
|
||||||
|
|
||||||
|
func Config() *AppConfig {
|
||||||
|
return appConf
|
||||||
|
}
|
||||||
|
|
||||||
|
func EditServer(host string, port int, key string) *AppConfig {
|
||||||
|
appConf.Server.Host = host
|
||||||
|
appConf.Server.Port = port
|
||||||
|
appConf.Server.Key = key
|
||||||
|
WriteConfig()
|
||||||
|
return appConf
|
||||||
|
}
|
||||||
|
|
||||||
|
func EditWeb(host string, port int) *AppConfig {
|
||||||
|
appConf.Web.Host = host
|
||||||
|
appConf.Web.Port = port
|
||||||
|
WriteConfig()
|
||||||
|
return appConf
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExecWeb(run bool) *AppConfig {
|
||||||
|
appConf.Web.Enable = run
|
||||||
|
WriteConfig()
|
||||||
|
return appConf
|
||||||
|
}
|
||||||
|
|
||||||
|
func EditTask(delay int, interval int) *AppConfig {
|
||||||
|
appConf.Task.Delay = delay
|
||||||
|
appConf.Task.Interval = interval
|
||||||
|
WriteConfig()
|
||||||
|
return appConf
|
||||||
|
}
|
||||||
|
|
||||||
|
func FindProvider(name string) (*ProviderConf, int) {
|
||||||
|
for index, provider := range *appConf.Providers {
|
||||||
|
if provider.Name == name {
|
||||||
|
return &provider, index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, -1
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddProvider(name string, typeName string, conf map[string]string) *AppConfig {
|
||||||
|
provider, _ := FindProvider(name)
|
||||||
|
if provider != nil {
|
||||||
|
log.Fatal("已存在相同名称的配置")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
provider = &ProviderConf{
|
||||||
|
Name: name,
|
||||||
|
Type: typeName,
|
||||||
|
Conf: conf,
|
||||||
|
}
|
||||||
|
providers := *appConf.Providers
|
||||||
|
newProviders := append(providers, *provider)
|
||||||
|
appConf.Providers = &newProviders
|
||||||
|
return appConf
|
||||||
|
}
|
||||||
|
|
||||||
|
func EditProvider(name string, typeName string, conf map[string]string) *AppConfig {
|
||||||
|
provider, _ := FindProvider(name)
|
||||||
|
if provider == nil {
|
||||||
|
log.Fatal("不存在该配置")
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
provider.Type = typeName
|
||||||
|
provider.Conf = conf
|
||||||
|
WriteConfig()
|
||||||
|
return appConf
|
||||||
|
}
|
||||||
|
|
||||||
|
func RmProvider(name string) *AppConfig {
|
||||||
|
_, index := FindProvider(name)
|
||||||
|
if index == -1 {
|
||||||
|
log.Fatal("不存在该配置")
|
||||||
|
}
|
||||||
|
providers := *appConf.Providers
|
||||||
|
newProviders := append(providers[:index], providers[index+1:]...)
|
||||||
|
appConf.Providers = &newProviders
|
||||||
|
return appConf
|
||||||
|
}
|
||||||
|
|
||||||
|
func FindCert(name string) (*CertConf, int) {
|
||||||
|
for index, cert := range *appConf.Certs {
|
||||||
|
if cert.Name == name {
|
||||||
|
return &cert, index
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil, -1
|
||||||
|
}
|
||||||
|
func FindCertByProvider(provider string) *[]CertConf {
|
||||||
|
var result []CertConf
|
||||||
|
for _, cert := range *appConf.Certs {
|
||||||
|
if cert.Provider == provider {
|
||||||
|
result = append(result, cert)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return &result
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddCert(cert *CertConf) *AppConfig {
|
||||||
|
certs := *appConf.Certs
|
||||||
|
newCerts := append(certs, *cert)
|
||||||
|
appConf.Certs = &newCerts
|
||||||
|
return appConf
|
||||||
|
}
|
||||||
|
func EditCert(name string, cert *CertConf) *AppConfig {
|
||||||
|
_, index := FindCert(name)
|
||||||
|
if index == -1 {
|
||||||
|
log.Fatal("不存在该配置")
|
||||||
|
}
|
||||||
|
certs := *appConf.Certs
|
||||||
|
certs[index] = *cert
|
||||||
|
appConf.Certs = &certs
|
||||||
|
return appConf
|
||||||
|
}
|
||||||
|
func RmCert(name string) *AppConfig {
|
||||||
|
_, index := FindCert(name)
|
||||||
|
if index == -1 {
|
||||||
|
log.Fatal("不存在该配置")
|
||||||
|
}
|
||||||
|
certs := *appConf.Certs
|
||||||
|
newCerts := append(certs[:index], certs[index+1:]...)
|
||||||
|
appConf.Certs = &newCerts
|
||||||
|
return appConf
|
||||||
|
}
|
|
@ -2,54 +2,43 @@ package conf
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"acme-mana/src/common"
|
"acme-mana/src/common"
|
||||||
"acme-mana/src/model"
|
|
||||||
"acme-mana/src/util"
|
"acme-mana/src/util"
|
||||||
"gopkg.in/yaml.v3"
|
"gopkg.in/yaml.v3"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
)
|
)
|
||||||
|
|
||||||
func readAppConfig(c *model.AppConfig) *model.AppConfig {
|
func LoadAppConfig() {
|
||||||
confFile, err := common.RootCmd.PersistentFlags().GetString("conf")
|
// 读取配置文件位置
|
||||||
if err != nil {
|
confFile := getConfFile()
|
||||||
log.Fatalln("读取配置文件参数失败")
|
// 判断配资文件是否存在
|
||||||
}
|
if _, err := os.Stat(confFile); os.IsNotExist(err) {
|
||||||
|
|
||||||
_, err = os.Stat(confFile)
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
log.Println("配置文件不存在, 自动创建")
|
log.Println("配置文件不存在, 自动创建")
|
||||||
writeConf(c, confFile)
|
config := defaultAppConfig()
|
||||||
|
log.Println("默认配置文件创建成功")
|
||||||
|
log.Println("服务器通信密钥: " + config.Server.Key)
|
||||||
|
appConf = config
|
||||||
|
writeConf(appConf, confFile)
|
||||||
|
} else {
|
||||||
|
appConf = readAppConfig(appConf)
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// RefreshConfig 刷新配置
|
||||||
func RefreshConfig() {
|
func RefreshConfig() {
|
||||||
readAppConfig(common.AppConf)
|
readAppConfig(appConf)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WriteConfig 写入配置文件
|
||||||
func WriteConfig() {
|
func WriteConfig() {
|
||||||
confFile, err := common.RootCmd.PersistentFlags().GetString("conf")
|
confFile, err := common.RootCmd.PersistentFlags().GetString("conf")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln("读取配置文件参数失败")
|
log.Fatalln("读取配置文件参数失败")
|
||||||
}
|
}
|
||||||
writeConf(common.AppConf, confFile)
|
writeConf(appConf, confFile)
|
||||||
}
|
}
|
||||||
|
|
||||||
func writeConf(c *model.AppConfig, file string) {
|
func writeConf(c *AppConfig, file string) {
|
||||||
out, err := yaml.Marshal(c)
|
out, err := yaml.Marshal(c)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln("序列化配置文件失败")
|
log.Fatalln("序列化配置文件失败")
|
||||||
|
@ -61,13 +50,22 @@ func writeConf(c *model.AppConfig, file string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func DefaultAppConfig() *model.AppConfig {
|
// DefaultAppConfig 默认配置
|
||||||
return &model.AppConfig{
|
func defaultAppConfig() *AppConfig {
|
||||||
Server: &model.ServerConf{
|
serverKey := util.RandomStr(32)
|
||||||
|
|
||||||
|
return &AppConfig{
|
||||||
|
Server: &ServerConf{
|
||||||
Host: "0.0.0.0",
|
Host: "0.0.0.0",
|
||||||
Port: 36851,
|
Port: 36851,
|
||||||
|
Key: serverKey,
|
||||||
},
|
},
|
||||||
Task: &model.TaskConf{
|
Web: &WebConf{
|
||||||
|
Enable: false,
|
||||||
|
Host: "0.0.0.0",
|
||||||
|
Port: 36852,
|
||||||
|
},
|
||||||
|
Task: &TaskConf{
|
||||||
Delay: 0,
|
Delay: 0,
|
||||||
Interval: 0,
|
Interval: 0,
|
||||||
},
|
},
|
||||||
|
@ -75,3 +73,27 @@ func DefaultAppConfig() *model.AppConfig {
|
||||||
Providers: nil,
|
Providers: nil,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getConfFile 获取配置文件位置
|
||||||
|
func getConfFile() string {
|
||||||
|
confFile, err := common.RootCmd.PersistentFlags().GetString("conf")
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("读取配置文件参数失败")
|
||||||
|
}
|
||||||
|
return confFile
|
||||||
|
}
|
||||||
|
|
||||||
|
// readAppConfig 读取配置文件
|
||||||
|
func readAppConfig(c *AppConfig) *AppConfig {
|
||||||
|
confFile := getConfFile()
|
||||||
|
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
|
||||||
|
}
|
3
src/conf/variable.go
Normal file
3
src/conf/variable.go
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
package conf
|
||||||
|
|
||||||
|
var appConf *AppConfig
|
|
@ -11,7 +11,10 @@ var service *gin.Engine
|
||||||
var isRunning bool
|
var isRunning bool
|
||||||
|
|
||||||
func Start() {
|
func Start() {
|
||||||
|
if isRunning {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
go start()
|
||||||
}
|
}
|
||||||
|
|
||||||
func Stop() {
|
func Stop() {
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
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/server/handle/cert.go
Normal file
18
src/server/handle/cert.go
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
package handle
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"log"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetCert(context *gin.Context) {
|
||||||
|
log.Println("get cert")
|
||||||
|
}
|
||||||
|
|
||||||
|
func RefreshCert(context *gin.Context) {
|
||||||
|
log.Fatalln("refresh cert")
|
||||||
|
}
|
||||||
|
|
||||||
|
func domainList(context *gin.Context) {
|
||||||
|
log.Fatalln("domain list")
|
||||||
|
}
|
64
src/server/http-server.go
Normal file
64
src/server/http-server.go
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
import (
|
||||||
|
"acme-mana/src/conf"
|
||||||
|
"acme-mana/src/server/handle"
|
||||||
|
"context"
|
||||||
|
"errors"
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"strconv"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
type HttpServer struct {
|
||||||
|
server *http.Server `json:"server"`
|
||||||
|
status bool
|
||||||
|
engine *gin.Engine
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *HttpServer) InitServer() {
|
||||||
|
s.engine = gin.Default()
|
||||||
|
s.register()
|
||||||
|
s.status = false
|
||||||
|
|
||||||
|
config := conf.Config()
|
||||||
|
var serverConf = config.Server
|
||||||
|
s.server = &http.Server{
|
||||||
|
Addr: serverConf.Host + ":" + strconv.Itoa(serverConf.Port),
|
||||||
|
Handler: s.engine,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *HttpServer) Start() {
|
||||||
|
go func() {
|
||||||
|
if err := s.server.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) {
|
||||||
|
log.Printf("listen: %s\n\n", err)
|
||||||
|
s.status = true
|
||||||
|
} else {
|
||||||
|
s.status = false
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *HttpServer) Stop() {
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
err := httpServer.server.Shutdown(ctx)
|
||||||
|
s.status = false
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("Server Shutdown:", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Status() bool {
|
||||||
|
return httpServer.status
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *HttpServer) register() {
|
||||||
|
service := s.engine
|
||||||
|
service.GET("/api/v1/refresh", handle.RefreshCert)
|
||||||
|
service.GET("/api/v1/cert", handle.GetCert)
|
||||||
|
service.GET("/api/v1/domain/list", handle.GetCert)
|
||||||
|
}
|
3
src/server/variable.go
Normal file
3
src/server/variable.go
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
package server
|
||||||
|
|
||||||
|
var httpServer *HttpServer
|
17
src/util/random.go
Normal file
17
src/util/random.go
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
package util
|
||||||
|
|
||||||
|
import (
|
||||||
|
"math/rand"
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
|
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
|
||||||
|
|
||||||
|
func RandomStr(size int) string {
|
||||||
|
rand.NewSource(time.Now().UnixNano())
|
||||||
|
b := make([]byte, size)
|
||||||
|
for i := range b {
|
||||||
|
b[i] = letterBytes[rand.Intn(len(letterBytes))]
|
||||||
|
}
|
||||||
|
return string(b)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user