2020-05-14 23:44:08 +02:00
|
|
|
package cmd
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
"errors"
|
|
|
|
"fmt"
|
|
|
|
"os"
|
|
|
|
"os/exec"
|
|
|
|
"strings"
|
|
|
|
"time"
|
2025-01-13 12:21:31 +01:00
|
|
|
|
|
|
|
"github.com/go-acme/lego/v4/certificate"
|
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
hookEnvAccountEmail = "LEGO_ACCOUNT_EMAIL"
|
|
|
|
hookEnvCertDomain = "LEGO_CERT_DOMAIN"
|
|
|
|
hookEnvCertPath = "LEGO_CERT_PATH"
|
|
|
|
hookEnvCertKeyPath = "LEGO_CERT_KEY_PATH"
|
|
|
|
hookEnvIssuerCertKeyPath = "LEGO_ISSUER_CERT_PATH"
|
|
|
|
hookEnvCertPEMPath = "LEGO_CERT_PEM_PATH"
|
|
|
|
hookEnvCertPFXPath = "LEGO_CERT_PFX_PATH"
|
2020-05-14 23:44:08 +02:00
|
|
|
)
|
|
|
|
|
2025-01-03 15:22:00 +01:00
|
|
|
func launchHook(hook string, timeout time.Duration, meta map[string]string) error {
|
2020-05-14 23:44:08 +02:00
|
|
|
if hook == "" {
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2025-01-03 15:22:00 +01:00
|
|
|
ctxCmd, cancel := context.WithTimeout(context.Background(), timeout)
|
2020-05-14 23:44:08 +02:00
|
|
|
defer cancel()
|
|
|
|
|
|
|
|
parts := strings.Fields(hook)
|
|
|
|
|
|
|
|
cmdCtx := exec.CommandContext(ctxCmd, parts[0], parts[1:]...)
|
|
|
|
cmdCtx.Env = append(os.Environ(), metaToEnv(meta)...)
|
|
|
|
|
|
|
|
output, err := cmdCtx.CombinedOutput()
|
|
|
|
|
|
|
|
if len(output) > 0 {
|
|
|
|
fmt.Println(string(output))
|
|
|
|
}
|
|
|
|
|
2020-10-27 12:01:05 +01:00
|
|
|
if errors.Is(ctxCmd.Err(), context.DeadlineExceeded) {
|
2020-05-14 23:44:08 +02:00
|
|
|
return errors.New("hook timed out")
|
|
|
|
}
|
|
|
|
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func metaToEnv(meta map[string]string) []string {
|
|
|
|
var envs []string
|
|
|
|
|
|
|
|
for k, v := range meta {
|
|
|
|
envs = append(envs, k+"="+v)
|
|
|
|
}
|
|
|
|
|
|
|
|
return envs
|
|
|
|
}
|
2025-01-13 12:21:31 +01:00
|
|
|
|
|
|
|
func addPathToMetadata(meta map[string]string, domain string, certRes *certificate.Resource, certsStorage *CertificatesStorage) {
|
|
|
|
meta[hookEnvCertDomain] = domain
|
|
|
|
meta[hookEnvCertPath] = certsStorage.GetFileName(domain, certExt)
|
|
|
|
meta[hookEnvCertKeyPath] = certsStorage.GetFileName(domain, keyExt)
|
|
|
|
|
|
|
|
if certRes.IssuerCertificate != nil {
|
|
|
|
meta[hookEnvIssuerCertKeyPath] = certsStorage.GetFileName(domain, issuerExt)
|
|
|
|
}
|
|
|
|
|
|
|
|
if certsStorage.pem {
|
|
|
|
meta[hookEnvCertPEMPath] = certsStorage.GetFileName(domain, pemExt)
|
|
|
|
}
|
|
|
|
|
|
|
|
if certsStorage.pfx {
|
|
|
|
meta[hookEnvCertPFXPath] = certsStorage.GetFileName(domain, pfxExt)
|
|
|
|
}
|
|
|
|
}
|