package src import ( "encoding/json" "log" "os" "path" "time" ) var AutoRefreshCertTicker = time.NewTicker(time.Hour) func AutoRefreshCert() { log.Println("Start auto refresh cert") defer AutoRefreshCertTicker.Stop() for { select { case <-AutoRefreshCertTicker.C: doRefreshCert() } } } func doRefreshCert() { domains := GetAppConfig().Domains for _, domain := range domains { doRefreshCertOnce(domain) } } func doRefreshCertOnce(domain Domain) { name := domain.Name dir := GetAppConfig().CertDir certDir := path.Join(dir, name) if !ValidExist(certDir, domain) { Apply(domain) } infoFile := path.Join(certDir, CertInfoFileName) certInfo := ParseCertInfo(infoFile, domain) log.Println("Checking if the certificate is expired, Domain: {}", name) if certInfo.Info.NotAfter.Sub(time.Now()) < 14*24*time.Hour { log.Println("Apply for a certificate that is about to expire, domain name:", name) Apply(domain) } } func ValidExist(certDir string, domain Domain) bool { _, err := os.Stat(certDir) if os.IsNotExist(err) { log.Printf("Applying for a certificate, Domain: %s certificate directory does not exist!", domain.Name) return false } if !ExistFile(certDir, CertFileName) { log.Printf("Applying for a certificate, Domain: %s %s does not exist!", domain.Name, CertFileName) return false } if !ExistFile(certDir, KeyFileName) { log.Printf("Applying for a certificate, Domain: %s %s does not exist!", domain.Name, KeyFileName) return false } if !ExistFile(certDir, CertInfoFileName) { log.Printf("Applying for a certificate, Domain: %s %s does not exist!", domain.Name, CertInfoFileName) return false } return true } func ParseCertInfo(infoFile string, domain Domain) CertInfo { infoBytes, err := os.ReadFile(infoFile) if err != nil { log.Println("Failed to read cert info file, Domain: {}", domain.Name) } var certInfo CertInfo err = json.Unmarshal(infoBytes, &certInfo) if err != nil { log.Println("Failed to parse cert info file, Domain: {}", domain.Name) } return certInfo } func ExistFile(dir string, fileName string) bool { f := path.Join(dir, fileName) _, err := os.Stat(f) return !os.IsNotExist(err) }