149 lines
3.1 KiB
Go
149 lines
3.1 KiB
Go
package main
|
|
|
|
import (
|
|
"encoding/base64"
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type AcmeJson struct {
|
|
Letsencryptresolver struct {
|
|
Account struct {
|
|
Email string `json:"Email"`
|
|
Registration struct {
|
|
Body struct {
|
|
Status string `json:"status"`
|
|
Contact []string `json:"contact"`
|
|
} `json:"body"`
|
|
URI string `json:"uri"`
|
|
} `json:"Registration"`
|
|
PrivateKey string `json:"PrivateKey"`
|
|
KeyType string `json:"KeyType"`
|
|
} `json:"Account"`
|
|
Certificates []struct {
|
|
Domain struct {
|
|
Main string `json:"main"`
|
|
} `json:"domain"`
|
|
Certificate string `json:"certificate"`
|
|
Key string `json:"key"`
|
|
Store string `json:"Store"`
|
|
} `json:"Certificates"`
|
|
} `json:"letsencryptresolver"`
|
|
}
|
|
|
|
// Squelch
|
|
var MyAcme AcmeJson
|
|
var AcmeFile, CertPath string
|
|
|
|
func init() {
|
|
|
|
AcmeFile = os.Getenv("ACME_FILE")
|
|
CertPath = os.Getenv("CERT_PATH")
|
|
|
|
if AcmeFile == "" {
|
|
log.Println("Missing ENV VAR ACME_FILE")
|
|
os.Exit(2)
|
|
}
|
|
|
|
if CertPath == "" {
|
|
log.Println("Missing ENV VAR CERT_PATH")
|
|
os.Exit(2)
|
|
}
|
|
|
|
}
|
|
|
|
func loadAcme() {
|
|
file, err := ioutil.ReadFile(AcmeFile)
|
|
|
|
if err != nil {
|
|
log.Println("Cannot open config file", err.Error())
|
|
os.Exit(1)
|
|
} else {
|
|
log.Println("Json File open")
|
|
}
|
|
|
|
err = json.Unmarshal([]byte(file), &MyAcme)
|
|
|
|
if err != nil {
|
|
log.Println("Cannot marshal json: ", err.Error())
|
|
os.Exit(1)
|
|
} else {
|
|
log.Println("Json Syntax OK")
|
|
}
|
|
|
|
log.Println("Acme file Loaded")
|
|
|
|
}
|
|
|
|
func main() {
|
|
|
|
ticker := time.NewTicker(12 * time.Hour)
|
|
defer ticker.Stop()
|
|
|
|
loadAcme()
|
|
|
|
for ; true; <-ticker.C {
|
|
|
|
for _, k := range MyAcme.Letsencryptresolver.Certificates {
|
|
|
|
// Decode
|
|
decoded, err := base64.StdEncoding.DecodeString(k.Certificate)
|
|
if err != nil {
|
|
fmt.Println("Unable to decode certificate", k.Domain.Main)
|
|
continue
|
|
} else {
|
|
fmt.Println("Decoded certificate ok: ", k.Domain.Main)
|
|
}
|
|
|
|
// Write chain
|
|
name := fmt.Sprintf("%s/%s.chain.crt", CertPath, k.Domain.Main)
|
|
fmt.Println("Writing file", name)
|
|
err = ioutil.WriteFile(name, decoded, 0644)
|
|
if err != nil {
|
|
fmt.Println("Error writing file", name)
|
|
} else {
|
|
fmt.Println("Decoded chain written at: ", name)
|
|
}
|
|
|
|
// Write cert
|
|
name = fmt.Sprintf("%s/%s.crt", CertPath, k.Domain.Main)
|
|
fmt.Println("Writing file", name)
|
|
parts := strings.Split(string(decoded), "\n\n")
|
|
err = ioutil.WriteFile(name, []byte(parts[0]), 0644)
|
|
if err != nil {
|
|
fmt.Println("Error writing file", name)
|
|
} else {
|
|
fmt.Println("Decoded cert written at: ", name)
|
|
}
|
|
|
|
// Decode key
|
|
decoded, err = base64.StdEncoding.DecodeString(k.Key)
|
|
if err != nil {
|
|
fmt.Println("Unable to decode Key", k.Domain.Main)
|
|
continue
|
|
} else {
|
|
fmt.Println("Decoded key for ", k.Domain.Main)
|
|
}
|
|
|
|
// Write key
|
|
name = fmt.Sprintf("%s/%s.key", CertPath, k.Domain.Main)
|
|
fmt.Println("Writing key file", name)
|
|
err = ioutil.WriteFile(name, []byte(decoded), 0644)
|
|
if err != nil {
|
|
fmt.Println("Error writing file", name)
|
|
} else {
|
|
fmt.Println("Decoded key written at: ", name)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
os.Exit(0)
|
|
|
|
}
|