zumba/zumba.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)
}