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) // 判断文件夹和证书文件是否存在 _, err := os.Stat(certDir) if os.IsNotExist(err) { log.Println("Applying for a certificate, Domain: {} certificate directory does not exist!", name) Apply(domain) return } if existFile(certDir, CertFileName) { log.Println("Applying for a certificate, Domain: {} {} does not exist!", name, CertFileName) Apply(domain) return } if existFile(certDir, KeyFileName) { log.Println("Applying for a certificate, Domain: {} {} does not exist!", name, KeyFileName) Apply(domain) return } if existFile(certDir, CertInfoFileName) { log.Println("Applying for a certificate, Domain: {} {} does not exist!", name, CertInfoFileName) Apply(domain) return } infoFile := path.Join(dir, CertInfoFileName) infoBytes, err := os.ReadFile(infoFile) if err != nil { log.Println("Failed to read cert info file, Domain: {}", name) } var certInfo CertInfo err = json.Unmarshal(infoBytes, &certInfo) if err != nil { log.Println("Failed to parse cert info file, Domain: {}", name) } log.Println("Checking if the certificate is expired, Domain: {}", name) if certInfo.Info.NotAfter.Sub(time.Now()) < 7*24*time.Hour { log.Println("Apply for a certificate that is about to expire, domain name:", name) Apply(domain) } } func existFile(dir string, fileName string) bool { f := path.Join(dir, fileName) _, err := os.Stat(f) return !os.IsNotExist(err) }