certificate.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "fmt"
  6. "github.com/astaxie/beego/logs"
  7. "github.com/astaxie/beego/orm"
  8. "server/models"
  9. nginx2 "server/nginx"
  10. "server/utils"
  11. "strconv"
  12. "strings"
  13. "time"
  14. )
  15. type CertController struct {
  16. BaseController
  17. }
  18. // 这个是根据域名的名称来的,自定义命令,即文件名称
  19. func saveOrUpdate(cert *models.NginxCerts) error {
  20. o := orm.NewOrm()
  21. find := models.NginxCerts{ServiceName: cert.ServiceName, NginxId: cert.NginxId}
  22. err := o.Read(&find, "service_name", "nginx_id")
  23. if err != nil && err != orm.ErrNoRows {
  24. return err
  25. }
  26. if err == orm.ErrNoRows {
  27. _, err := o.Insert(cert)
  28. return err
  29. }
  30. _, err = o.Update(cert)
  31. return err
  32. }
  33. func (c *CertController) getNginx() *models.Nginx {
  34. idStr := c.getParam(":id")
  35. id, err := strconv.Atoi(idStr)
  36. logs.Info("id", id)
  37. if err != nil {
  38. c.ErrorJson(err)
  39. return nil
  40. }
  41. var nginx = models.Nginx{
  42. Id: id,
  43. }
  44. o := orm.NewOrm()
  45. err = o.Read(&nginx)
  46. if err != nil {
  47. c.ErrorJson(err)
  48. return nil
  49. }
  50. if nginx.DataDir == "" {
  51. c.setCode(-1).setMsg("请先配置数据目录位置!").json()
  52. return nil
  53. }
  54. return &nginx
  55. }
  56. // Get getAll
  57. func (c *CertController) Get() {
  58. nginx := c.getNginx()
  59. if nginx == nil {
  60. return
  61. }
  62. o := orm.NewOrm()
  63. var list []models.NginxCerts
  64. _, err := o.QueryTable((*models.NginxCerts)(nil)).Filter("NginxId", nginx.Id).All(&list)
  65. if err != nil {
  66. c.ErrorJson(err)
  67. return
  68. }
  69. c.setData(list).json()
  70. }
  71. // Sync 从配置的证书路径同步证书到数据库
  72. func (c *CertController) Sync() {
  73. nginx := c.getNginx()
  74. if nginx == nil {
  75. return
  76. }
  77. ins := nginx2.GetInstance(nginx)
  78. names := strings.Split(ins.GetCerts(), "\n")
  79. var certs []models.NginxCerts
  80. for i := range names {
  81. name := names[i]
  82. if strings.HasSuffix(name, ".key") {
  83. serviceName := name[0 : len(name)-4]
  84. cert, err := ins.GetCertData(serviceName)
  85. cert.NginxId = nginx.Id
  86. cert.CreatedAt = time.Now().Format("2006-02-01 15:04")
  87. if err != nil {
  88. logs.Warn("getCertData fail", err, serviceName)
  89. } else {
  90. err = saveOrUpdate(cert)
  91. if err != nil {
  92. logs.Warn("save certs fail", err, serviceName)
  93. } else {
  94. certs = append(certs, *cert)
  95. }
  96. }
  97. }
  98. }
  99. c.setData(true).json()
  100. }
  101. // Post save certs
  102. func (c *CertController) Post() {
  103. nginx := c.getNginx()
  104. if nginx == nil {
  105. return
  106. }
  107. var cert models.NginxCerts
  108. err := json.Unmarshal(c.Ctx.Input.RequestBody, &cert)
  109. if err != nil {
  110. logs.Error(err, string(c.Ctx.Input.RequestBody))
  111. c.ErrorJson(err)
  112. return
  113. }
  114. if cert.Pem == "" || cert.Key == "" {
  115. c.setCode(-1).setMsg("请输入证书私钥和公钥内容!").json()
  116. return
  117. }
  118. parse, err := utils.CheckHttps(cert.Pem)
  119. if err != nil {
  120. cert.HintMsg = fmt.Sprintf("证书公钥解析异常:%s", err.Error())
  121. } else {
  122. cert.ExpiresAt = parse.NotAfter.Format("2006-01-02 15:04")
  123. cert.SubjectName = parse.Subject.CommonName
  124. }
  125. logs.Info("parse", cert.SubjectName)
  126. o := orm.NewOrm()
  127. cert.NginxId = nginx.Id
  128. if cert.Id > 0 {
  129. _, err = o.Update(&cert)
  130. } else {
  131. cert.CreatedAt = time.Now().Format("2006-01-02 15:04")
  132. _, err = o.Insert(&cert)
  133. }
  134. if err != nil {
  135. c.ErrorJson(err)
  136. return
  137. }
  138. ins := nginx2.GetInstance(nginx)
  139. err = ins.SaveCerts(&cert)
  140. if err != nil {
  141. c.ErrorJson(err)
  142. return
  143. }
  144. c.json()
  145. }
  146. // Delete del certs
  147. func (c *CertController) Delete() {
  148. nginx := c.getNginx()
  149. if nginx == nil {
  150. return
  151. }
  152. ins := nginx2.GetInstance(nginx)
  153. certId, err := c.GetInt("id", -1)
  154. if err != nil {
  155. c.ErrorJson(err)
  156. return
  157. }
  158. if certId < 0 {
  159. c.ErrorJson(errors.New("参数错误"))
  160. return
  161. }
  162. dirs := ins.CheckDirs()
  163. if dirs.CertsDir == "" || dirs.CertsDir == "/" {
  164. c.setCode(-1).setMsg("请先配置证书路径,不能为根路径。")
  165. c.json()
  166. return
  167. }
  168. o := orm.NewOrm()
  169. cert := models.NginxCerts{Id: certId, NginxId: nginx.Id}
  170. err = o.Read(&cert, "id", "nginx_id")
  171. if err != nil && err != orm.ErrNoRows {
  172. c.ErrorJson(err)
  173. return
  174. } else if err != nil && err == orm.ErrNoRows {
  175. c.json()
  176. return
  177. }
  178. _, err = o.Delete(&cert)
  179. if err != nil && err != orm.ErrNoRows {
  180. c.ErrorJson(err)
  181. return
  182. }
  183. certName := cert.ServiceName
  184. cmd1 := fmt.Sprintf("cd %s && if [ -f %s.key ];then mv -f %s.key %s;fi", dirs.CertsDir, certName, certName, dirs.BackupDir)
  185. cmd2 := fmt.Sprintf("cd %s && if [ -f %s.pem ];then mv -f %s.pem %s;fi", dirs.CertsDir, certName, certName, dirs.BackupDir)
  186. resp, err := ins.Run(fmt.Sprintf("%s;%s", cmd1, cmd2))
  187. if err != nil {
  188. c.ErrorJson(err)
  189. return
  190. }
  191. c.setData(resp).json()
  192. }