nginx.go 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. package nginx_service
  2. import (
  3. "encoding/json"
  4. "errors"
  5. "github.com/astaxie/beego/logs"
  6. "github.com/astaxie/beego/orm"
  7. "nginx-ui/server/constants"
  8. "nginx-ui/server/models"
  9. ngx "nginx-ui/server/nginx"
  10. "strconv"
  11. )
  12. type NginxService struct {
  13. }
  14. func NewNginxService() *NginxService {
  15. return &NginxService{}
  16. }
  17. // CheckNginxPermission 从path中获取nginx的参数
  18. func (c *NginxService) CheckNginxPermission(user *models.User, nginxId string) (*models.Nginx, error) {
  19. id, err := strconv.Atoi(nginxId)
  20. if err != nil {
  21. logs.Warn("strconv.Atoi(idStr) fail", nginxId)
  22. return nil, errors.New("请传递正确的参数!")
  23. }
  24. return c.CheckNginxPermissionById(user, id)
  25. }
  26. // CheckNginxPermissionById 验证权限,如果无权操作该nginx,返回nil,否则返回
  27. func (c *NginxService) CheckNginxPermissionById(current *models.User, nginxId int) (*models.Nginx, error) {
  28. if nginxId < 1 {
  29. return nil, errors.New("nginx ID must gt 0!")
  30. }
  31. nginx := models.Nginx{Id: nginxId}
  32. o := orm.NewOrm()
  33. err := o.Read(&nginx)
  34. if err != nil {
  35. return nil, err
  36. }
  37. if !current.IsAdmin() && current.Account != nginx.Uid {
  38. return nil, errors.New("您无权操作该实例")
  39. }
  40. return &nginx, nil
  41. }
  42. // Get getAll,
  43. // 管理员获取全部,非管理员或者自己名下的
  44. func (c *NginxService) ListNginx(current *models.User) *models.RespData {
  45. if current == nil {
  46. return models.UnAuthResp
  47. }
  48. o := orm.NewOrm()
  49. qs := o.QueryTable("nginx")
  50. if !current.IsAdmin() {
  51. qs = qs.Filter("Uid", current.Account)
  52. }
  53. var list []*models.Nginx
  54. _, err := qs.All(&list)
  55. for i := range list {
  56. item := list[i]
  57. if item.Password != "" {
  58. item.Password = constants.ReplacePassword
  59. }
  60. }
  61. if err != nil {
  62. return models.NewErrorResp(err)
  63. } else {
  64. return models.SuccessResp(list)
  65. }
  66. }
  67. // Post add nginx instance
  68. func (c *NginxService) Add(current *models.User, req []byte) *models.RespData {
  69. if current == nil {
  70. return models.UnAuthResp
  71. }
  72. var nginx models.Nginx
  73. err := json.Unmarshal(req, &nginx)
  74. if err != nil {
  75. logs.Error(err, string(req))
  76. return models.NewErrorResp(err)
  77. }
  78. nginx.Check()
  79. o := orm.NewOrm()
  80. nginx.Uid = current.Account
  81. nginx.NginxPath = "/usr/sbin/nginx"
  82. nginx.NginxDir = "/etc/nginx"
  83. if nginx.IsLocal {
  84. nginx.IsServer = true
  85. }
  86. nginx.DataDir = "/app/data"
  87. _, err = o.Insert(&nginx)
  88. if err != nil {
  89. return models.NewErrorResp(err)
  90. }
  91. logs.Info("post", nginx)
  92. instance := ngx.GetInstance(&nginx)
  93. err = instance.Connect()
  94. if err != nil {
  95. return models.SuccessResp(nginx).SetCode(1).SetMsg(err.Error())
  96. }
  97. out, err := instance.GetVersion()
  98. if err != nil {
  99. return models.SuccessResp(nginx).SetCode(1).SetMsg(err.Error())
  100. }
  101. nginx.VersionInfo = out
  102. _, _ = o.Update(&nginx, "VersionInfo")
  103. return models.SuccessResp(nginx)
  104. }
  105. func AddNginx(nginx *models.Nginx) error {
  106. nginx.Check()
  107. o := orm.NewOrm()
  108. nginx.NginxPath = "/usr/sbin/nginx"
  109. nginx.NginxDir = "/etc/nginx"
  110. nginx.DataDir = "/app/data"
  111. _, err := o.Insert(nginx)
  112. if err != nil {
  113. return err
  114. }
  115. logs.Info("post", nginx)
  116. instance := ngx.GetInstance(nginx)
  117. err = instance.Connect()
  118. if err != nil {
  119. return err
  120. }
  121. out, err := instance.GetVersion()
  122. if err != nil {
  123. return err
  124. }
  125. nginx.VersionInfo = out
  126. _, _ = o.Update(nginx, "VersionInfo")
  127. return nil
  128. }
  129. // Update modify nginx instance
  130. // post /nginx/:id
  131. func (c *NginxService) Update(nginxId string, current *models.User, req []byte) *models.RespData {
  132. if current == nil {
  133. return models.UnAuthResp
  134. }
  135. var nginx models.Nginx
  136. err := json.Unmarshal(req, &nginx)
  137. if err != nil {
  138. logs.Error(err, string(req))
  139. return models.NewErrorResp(err)
  140. }
  141. exist, err := c.CheckNginxPermission(current, nginxId)
  142. if err != nil {
  143. return models.NewErrorResp(err)
  144. }
  145. nginx.Id = exist.Id
  146. nginx.Uid = exist.Uid
  147. nginx.Check()
  148. o := orm.NewOrm()
  149. if nginx.Password == constants.ReplacePassword {
  150. nginx.Password = exist.Password
  151. }
  152. nginx.HttpConf = exist.HttpConf
  153. _, err = o.Update(&nginx)
  154. if err != nil {
  155. return models.NewErrorResp(err)
  156. }
  157. logs.Info("post", nginx)
  158. instance := ngx.GetInstance(&nginx)
  159. err = instance.Connect()
  160. if err != nil {
  161. return models.NewResp(1, err.Error(), nginx)
  162. }
  163. out, err := instance.GetVersion()
  164. if err != nil {
  165. return models.NewResp(1, err.Error(), nginx)
  166. }
  167. nginx.VersionInfo = out
  168. _, _ = o.Update(&nginx, "VersionInfo")
  169. return models.SuccessResp(nginx)
  170. }
  171. func (c *NginxService) UpdateNginx(nginx *models.Nginx) error {
  172. nginx.Check()
  173. o := orm.NewOrm()
  174. exist := models.Nginx{Id: nginx.Id}
  175. err := o.Read(&nginx)
  176. if err != nil {
  177. return err
  178. }
  179. if nginx.Password == constants.ReplacePassword {
  180. nginx.Password = exist.Password
  181. }
  182. nginx.HttpConf = exist.HttpConf
  183. _, err = o.Update(&nginx)
  184. if err != nil {
  185. return nil
  186. }
  187. logs.Info("post", nginx)
  188. instance := ngx.GetInstance(nginx)
  189. err = instance.Connect()
  190. if err != nil {
  191. return err
  192. }
  193. out, err := instance.GetVersion()
  194. if err != nil {
  195. return err
  196. }
  197. nginx.VersionInfo = out
  198. _, _ = o.Update(&nginx, "VersionInfo")
  199. return nil
  200. }
  201. // StartNginx startNginx
  202. // post /nginx/:id/start
  203. func (c *NginxService) StartNginx(nginxId string, user *models.User) *models.RespData {
  204. if user == nil {
  205. return models.UnAuthResp
  206. }
  207. nginx, err := c.CheckNginxPermission(user, nginxId)
  208. if err != nil {
  209. return models.NewErrorResp(err)
  210. }
  211. instance := ngx.GetInstance(nginx)
  212. err = instance.Start()
  213. isRun, msg := instance.Status()
  214. return models.SuccessResp(isRun).SetMsg(msg)
  215. }
  216. // StopNginx add nginx instance
  217. // post /nginx/:id/stop
  218. func (c *NginxService) StopNginx(nginxId string, user *models.User) *models.RespData {
  219. if user == nil {
  220. return models.UnAuthResp
  221. }
  222. nginx, err := c.CheckNginxPermission(user, nginxId)
  223. if err != nil {
  224. return models.NewErrorResp(err)
  225. }
  226. instance := ngx.GetInstance(nginx)
  227. err = instance.Stop()
  228. isRun, msg := instance.Status()
  229. return models.SuccessResp(isRun).SetMsg(msg)
  230. }
  231. // RefreshHttp nginx detail data
  232. // post /nginx/:id/http/refresh
  233. func (c *NginxService) RefreshHttp(nginxId string, user *models.User, req []byte) *models.RespData {
  234. if user == nil {
  235. return models.UnAuthResp
  236. }
  237. exist, err := c.CheckNginxPermission(user, nginxId)
  238. if err != nil {
  239. return models.NewErrorResp(err)
  240. }
  241. var nginx models.Nginx
  242. err = json.Unmarshal(req, &nginx)
  243. if err != nil {
  244. logs.Error(err, string(req))
  245. return models.NewErrorResp(err)
  246. }
  247. logs.Info("id", nginx)
  248. o := orm.NewOrm()
  249. if nginx.HttpConf != "" {
  250. _, err = o.Update(&nginx, "HttpConf", "HttpData")
  251. if err != nil {
  252. return models.NewErrorResp(err)
  253. }
  254. exist.HttpConf = nginx.HttpConf
  255. exist.HttpData = nginx.HttpData
  256. }
  257. ins := ngx.GetInstance(exist)
  258. err = ins.RefreshHttp(*exist)
  259. if err != nil {
  260. return models.NewErrorResp(err)
  261. }
  262. return models.SuccessResp(nil)
  263. }
  264. // GetNginx nginx detail data
  265. // get /nginx/:id
  266. func (c *NginxService) GetNginx(nginxId string, user *models.User) *models.RespData {
  267. if user == nil {
  268. return models.UnAuthResp
  269. }
  270. nginx, err := c.CheckNginxPermission(user, nginxId)
  271. if err != nil {
  272. return models.NewErrorResp(err)
  273. }
  274. if nginx.Password != "" {
  275. nginx.Password = constants.ReplacePassword
  276. }
  277. var resp = map[string]interface{}{}
  278. resp["nginx"] = nginx
  279. o := orm.NewOrm()
  280. var servers []models.ServerHost
  281. _, err = o.QueryTable((*models.ServerHost)(nil)).Filter("NginxId", nginx.Id).All(&servers)
  282. if err != nil {
  283. return models.NewErrorResp(err)
  284. }
  285. resp["servers"] = servers
  286. return models.SuccessResp(resp)
  287. }
  288. func FindById(nginxId int) (*models.Nginx, error) {
  289. if nginxId < 1 {
  290. return nil, errors.New("nginx ID must gt 0!")
  291. }
  292. nginx := models.Nginx{Id: nginxId}
  293. o := orm.NewOrm()
  294. err := o.Read(&nginx)
  295. if err != nil {
  296. return nil, err
  297. }
  298. return &nginx, nil
  299. }
  300. // DelNginx delete a instance
  301. // delete /nginx/:id
  302. func (c *NginxService) DelNginx(nginxId string, user *models.User) *models.RespData {
  303. if user == nil {
  304. return models.UnAuthResp
  305. }
  306. nginx, err := c.CheckNginxPermission(user, nginxId)
  307. if err != nil {
  308. return models.NewErrorResp(err)
  309. }
  310. o := orm.NewOrm()
  311. count, err := o.Delete(nginx, "Id")
  312. if err != nil {
  313. return models.NewErrorResp(err)
  314. } else {
  315. return models.SuccessResp(count)
  316. }
  317. }
  318. // StatusNginx add nginx instance
  319. // post /nginx/:id/status
  320. func (c *NginxService) StatusNginx(nginxId string, user *models.User) *models.RespData {
  321. if user == nil {
  322. return models.UnAuthResp
  323. }
  324. nginx, err := c.CheckNginxPermission(user, nginxId)
  325. if err != nil {
  326. return models.NewErrorResp(err)
  327. }
  328. instance := ngx.GetInstance(nginx)
  329. isRun, msg := instance.Status()
  330. return models.SuccessResp(isRun).SetMsg(msg)
  331. }