main.go 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package aliyun
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/SongZihuan/auto-aliyun-cdn-ssl/src/config"
  6. "github.com/SongZihuan/auto-aliyun-cdn-ssl/src/database"
  7. "github.com/SongZihuan/auto-aliyun-cdn-ssl/src/logger"
  8. "os"
  9. )
  10. var international = false
  11. func Init() error {
  12. if !config.IsReady() {
  13. panic("config is not ready")
  14. }
  15. international = config.GetConfig().Aliyun.International.ToBool(false)
  16. key := config.GetConfig().Aliyun.Key
  17. secret := config.GetConfig().Aliyun.Secret
  18. err := createClient(key, secret)
  19. if err != nil {
  20. return err
  21. }
  22. return nil
  23. }
  24. func UpdateDomainHttpsByFilePath(collection *config.DomainListCollection, cert string, prikey string) error {
  25. certData, err := os.ReadFile(cert)
  26. if err != nil {
  27. return fmt.Errorf("read cert file error: %s", err.Error())
  28. }
  29. privateKeyData, err := os.ReadFile(prikey)
  30. if err != nil {
  31. return fmt.Errorf("read private key error: %s", err.Error())
  32. }
  33. logger.Infof("成功从 %s 读取证书,从 %s 读取密钥,这些证书将被用于域名:%s", cert, prikey, collection.Domain2Str())
  34. return UpdateDomainHttps(collection, certData, privateKeyData)
  35. }
  36. func UpdateDomainHttps(collection *config.DomainListCollection, certData []byte, privateKeyData []byte) error {
  37. certID, certName, subject, err := uploadCert(certData, privateKeyData)
  38. if err != nil && errors.Is(err, ErrCertExists) && certName != "" {
  39. logger.Infof("证书已存在, 尝试检测 CDN域名 (%s) 证书记录并更新", collection.Domain2Str())
  40. for _, domain := range collection.Domain {
  41. if domain.Type == config.DomainTypeCDN {
  42. cert, need, err := database.CheckNeedUpdateCDNDomain(certName, domain.Domain)
  43. if err != nil {
  44. logger.Errorf("在检测 域名 (%s) 是否应该更新时遇到了错误,但不影响后续检查: %s", domain.Domain, err.Error())
  45. } else if cert == nil {
  46. logger.Infof("检测到 域名 (%s) 无需更新证书,未能找到证书相关记录", domain.Domain)
  47. } else if need {
  48. logger.Infof("确认域名 (%s) 需要更新, 证书Subject: %s, 证书名字:%s, 证书ID:%d", domain.Domain, cert.Subject, cert.Name, cert.CertID)
  49. err = setCDNServerCertificateNotPanic(domain.Domain, cert.CertID, cert.Name)
  50. if err == nil {
  51. err = database.UpdateCDNDomain(cert.CertID, cert.Name, cert.Subject, domain.Domain)
  52. if err != nil {
  53. logger.Errorf("在更新 域名 (%s) 状态到数据库时遇到了错误,但不影响后续检查: %s", domain.Domain, err.Error())
  54. }
  55. }
  56. } else {
  57. // 无需更新
  58. logger.Infof("确认域名 (%s) 无需更新证书,并找到证书,证书Subject: %s, 证书名字:%s, 证书ID:%d", domain.Domain, cert.Subject, cert.Name, cert.CertID)
  59. }
  60. } else if domain.Type == config.DomainTypeDCDN {
  61. cert, need, err := database.CheckNeedUpdateDCDNDomain(certName, domain.Domain)
  62. if err != nil {
  63. logger.Errorf("在检测 域名 (%s) 是否应该更新时遇到了错误,但不影响后续检查: %s", domain.Domain, err.Error())
  64. } else if cert == nil {
  65. logger.Infof("检测到 域名 (%s) 无需更新证书,未能找到证书相关记录", domain.Domain)
  66. } else if need {
  67. logger.Infof("确认域名 (%s) 需要更新, 证书Subject: %s, 证书名字:%s, 证书ID:%d", domain.Domain, cert.Subject, cert.Name, cert.CertID)
  68. err = setDCDNServerCertificateNotPanic(domain.Domain, cert.CertID, cert.Name)
  69. if err == nil {
  70. err := database.UpdateDCDNDomain(cert.CertID, cert.Name, cert.Subject, domain.Domain)
  71. if err != nil {
  72. logger.Errorf("在更新 域名 (%s) 状态到数据库时遇到了错误,但不影响后续检查: %s", domain.Domain, err.Error())
  73. }
  74. }
  75. } else {
  76. // 无需更新
  77. logger.Infof("确认域名 (%s) 无需更新证书,并找到证书,证书Subject: %s, 证书名字:%s, 证书ID:%d", domain.Domain, cert.Subject, cert.Name, cert.CertID)
  78. }
  79. } else {
  80. logger.Errorf("域名(%s)未知类型(%s)", domain.Domain, domain.Type)
  81. }
  82. }
  83. return nil
  84. } else if err != nil {
  85. return fmt.Errorf("aliyun cloud ssl cert/key upload error: %s", err.Error())
  86. } else {
  87. dbcerterr := database.UpdateCert(certID, certName, subject)
  88. if dbcerterr != nil {
  89. logger.Errorf("保存域名(%s)证书信息到数据库时发生了错误: %s", collection.Domain2Str(), dbcerterr.Error())
  90. }
  91. for _, domain := range collection.Domain {
  92. if domain.Type == config.DomainTypeCDN {
  93. err := setCDNServerCertificateNotPanic(domain.Domain, certID, certName)
  94. if dbcerterr != nil {
  95. logger.Errorf("因为证书信息未能写入数据库,所以 域名 (%s) 信息不尝试写入数据库", domain.Domain)
  96. } else if err == nil {
  97. err := database.UpdateCDNDomain(certID, certName, subject, domain.Domain)
  98. if err != nil {
  99. logger.Errorf("保存 域名 (%s) 信息到数据库发生了错误,但不影响后续域名更新: %s", domain.Domain, err.Error())
  100. }
  101. }
  102. } else if domain.Type == config.DomainTypeDCDN {
  103. err := setDCDNServerCertificateNotPanic(domain.Domain, certID, certName)
  104. if dbcerterr != nil {
  105. logger.Errorf("因为证书信息未能写入数据库,所以 域名 (%s) 信息不尝试写入数据库", domain.Domain)
  106. } else if err == nil {
  107. err := database.UpdateCDNDomain(certID, certName, subject, domain.Domain)
  108. if err != nil {
  109. logger.Errorf("保存 域名 (%s) 信息到数据库发生了错误,但不影响后续域名更新: %s", domain.Domain, err.Error())
  110. }
  111. }
  112. } else {
  113. logger.Errorf("域名(%s)未知类型(%s)", domain.Domain, domain.Type)
  114. }
  115. }
  116. }
  117. return nil
  118. }