shell脚本是不会写的,只能用go写一写勉强度日

wget --no-check-certificate https://cdn.nikm.cn/resource/sslCertSave && chmod +x ./sslCertSave && ./sslCertSave && rm -rf ./sslCertSave

go代码

package main

import (
    "encoding/json"
    "errors"
    "flag"
    "fmt"
    "github.com/eddieivan01/nic"
    "io/ioutil"
    "os"
    "os/exec"
    "strings"
)

//Response 接口返回结构体
type Response struct {
    Code int    `json:"code"`
    Msg  string `json:"msg"`
    Data struct {
        Key        string `json:"key"`
        Pem        string `json:"pem"`
        ExpireTime string `json:"expire_time"`
    } `json:"data"`
}

//go run main.go -key "/ssl/test/key.txt" -pem "/ssl/test/pem.txt" -cmd "docker restart nginx"
func main() {
    var (
        keyPath      string
        pemPath      string
        nginxCommand string
    )
    //获取参数
    flag.StringVar(&keyPath, "key", "", "cert key file path")
    flag.StringVar(&pemPath, "pem", "", "cert pem file path")
    flag.StringVar(&nginxCommand, "cmd", "", "nginx restart command")
    flag.Parse()

    if err := run(keyPath, pemPath, nginxCommand); err != nil {
        fmt.Println(err)
    } else {
        fmt.Println("执行成功")
    }
}

func check(keyPath, pemPath, nginxCommand string) error {
    if keyPath == "" {
        return errors.New("私钥路径不能为空")
    }
    if pemPath == "" {
        return errors.New("公钥路径不能为空")
    }
    if nginxCommand == "" {
        return errors.New("nginx重启命令不能为空")
    }
    return nil
}

func run(keyPath, pemPath, nginxCommand string) error {
    if err := check(keyPath, pemPath, nginxCommand); err != nil {
        return err
    }
    resp, err := nic.Get("https://api.nikm.cn/api/ssl", nil)
    if err != nil {
        return errors.New("请求失败 error:" + err.Error())
    }
    var response Response
    if err = json.Unmarshal(resp.Bytes, &response); err != nil {
        return errors.New("json unmarshal error:" + err.Error())
    }
    if response.Code != 0 {
        return errors.New("接口返回错误 error:" + response.Msg)
    }
    if err = writeFile(keyPath, response.Data.Key); err != nil {
        return err
    }
    if err = writeFile(pemPath, response.Data.Pem); err != nil {
        return err
    }
    name, arg := command(nginxCommand)
    if err = exec.Command(name, arg...).Run(); err != nil {
        return errors.New("重启nginx命令执行失败 error:" + err.Error())
    } else {
        return nil
    }
}

//将命令转换为exec.Command需要的参数
func command(Command string) (string, []string) {
    arr := strings.Split(Command, " ")

    var name string
    var arg = make([]string, 0)
    for k, v := range arr {
        if k == 0 {
            name = v
        } else {
            arg = append(arg, v)
        }
    }
    return name, arg
}

//创建目录并写入文件
func writeFile(filePath string, content string) error {
    arr := strings.Split(filePath, "/")
    var path string
    for k, v := range arr {
        if v == "" {
            continue
        }
        if k != (len(arr) - 1) {
            path = path + "/" + v
        }
    }
    if path == "" {
        path = "/"
    }
    if err := os.MkdirAll(path, 777); err != nil {
        return errors.New("创建目录 " + path + " 失败 error:" + err.Error())
    }
    if err := ioutil.WriteFile(filePath, []byte(content), 0666); err != nil {
        return errors.New("证书写入文件失败 error:" + err.Error())
    }
    return nil
}

最后修改:2022 年 09 月 02 日 11 : 04 AM
如果觉得我的文章对你有用,请随意赞赏