dns.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. package controller
  2. import (
  3. "context"
  4. "encoding/json"
  5. "errors"
  6. "fmt"
  7. "net/http"
  8. "strings"
  9. "time"
  10. "github.com/google/uuid"
  11. "github.com/gorilla/mux"
  12. "github.com/gravitl/netmaker/database"
  13. "github.com/gravitl/netmaker/db"
  14. "github.com/gravitl/netmaker/logger"
  15. "github.com/gravitl/netmaker/logic"
  16. "github.com/gravitl/netmaker/models"
  17. "github.com/gravitl/netmaker/mq"
  18. "github.com/gravitl/netmaker/schema"
  19. "github.com/gravitl/netmaker/servercfg"
  20. "gorm.io/datatypes"
  21. )
  22. func dnsHandlers(r *mux.Router) {
  23. r.HandleFunc("/api/dns", logic.SecurityCheck(true, http.HandlerFunc(getAllDNS))).
  24. Methods(http.MethodGet)
  25. r.HandleFunc("/api/dns/adm/{network}/nodes", logic.SecurityCheck(true, http.HandlerFunc(getNodeDNS))).
  26. Methods(http.MethodGet)
  27. r.HandleFunc("/api/dns/adm/{network}/custom", logic.SecurityCheck(true, http.HandlerFunc(getCustomDNS))).
  28. Methods(http.MethodGet)
  29. r.HandleFunc("/api/dns/adm/{network}", logic.SecurityCheck(true, http.HandlerFunc(getDNS))).
  30. Methods(http.MethodGet)
  31. r.HandleFunc("/api/dns/adm/{network}/sync", logic.SecurityCheck(true, http.HandlerFunc(syncDNS))).
  32. Methods(http.MethodPost)
  33. r.HandleFunc("/api/dns/{network}", logic.SecurityCheck(true, http.HandlerFunc(createDNS))).
  34. Methods(http.MethodPost)
  35. r.HandleFunc("/api/dns/adm/pushdns", logic.SecurityCheck(true, http.HandlerFunc(pushDNS))).
  36. Methods(http.MethodPost)
  37. r.HandleFunc("/api/dns/{network}/{domain}", logic.SecurityCheck(true, http.HandlerFunc(deleteDNS))).
  38. Methods(http.MethodDelete)
  39. r.HandleFunc("/api/v1/nameserver", logic.SecurityCheck(true, http.HandlerFunc(createNs))).Methods(http.MethodPost)
  40. r.HandleFunc("/api/v1/nameserver", logic.SecurityCheck(true, http.HandlerFunc(listNs))).Methods(http.MethodGet)
  41. r.HandleFunc("/api/v1/nameserver", logic.SecurityCheck(true, http.HandlerFunc(updateNs))).Methods(http.MethodPut)
  42. r.HandleFunc("/api/v1/nameserver", logic.SecurityCheck(true, http.HandlerFunc(deleteNs))).Methods(http.MethodDelete)
  43. r.HandleFunc("/api/v1/nameserver/global", logic.SecurityCheck(true, http.HandlerFunc(getGlobalNs))).Methods(http.MethodGet)
  44. }
  45. // @Summary List Global Nameservers
  46. // @Router /api/v1/nameserver/global [get]
  47. // @Tags Auth
  48. // @Accept json
  49. // @Param query network string
  50. // @Success 200 {object} models.SuccessResponse
  51. // @Failure 400 {object} models.ErrorResponse
  52. // @Failure 401 {object} models.ErrorResponse
  53. // @Failure 500 {object} models.ErrorResponse
  54. func getGlobalNs(w http.ResponseWriter, r *http.Request) {
  55. logic.ReturnSuccessResponseWithJson(w, r, logic.GlobalNsList, "fetched nameservers")
  56. }
  57. // @Summary Create Nameserver
  58. // @Router /api/v1/nameserver [post]
  59. // @Tags DNS
  60. // @Accept json
  61. // @Param body body models.NameserverReq
  62. // @Success 200 {object} models.SuccessResponse
  63. // @Failure 400 {object} models.ErrorResponse
  64. // @Failure 401 {object} models.ErrorResponse
  65. // @Failure 500 {object} models.ErrorResponse
  66. func createNs(w http.ResponseWriter, r *http.Request) {
  67. var req schema.Nameserver
  68. err := json.NewDecoder(r.Body).Decode(&req)
  69. if err != nil {
  70. logger.Log(0, "error decoding request body: ",
  71. err.Error())
  72. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  73. return
  74. }
  75. if err := logic.ValidateNameserverReq(req); err != nil {
  76. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  77. return
  78. }
  79. if req.Tags == nil {
  80. req.Tags = make(datatypes.JSONMap)
  81. }
  82. if req.Nodes == nil {
  83. req.Nodes = make(datatypes.JSONMap)
  84. }
  85. if gNs, ok := logic.GlobalNsList[req.Name]; ok {
  86. req.Servers = gNs.IPs
  87. }
  88. if !servercfg.IsPro {
  89. req.Tags = datatypes.JSONMap{
  90. "*": struct{}{},
  91. }
  92. }
  93. if req.MatchAll {
  94. req.Domains = []schema.NameserverDomain{
  95. {
  96. Domain: ".",
  97. },
  98. }
  99. }
  100. ns := schema.Nameserver{
  101. ID: uuid.New().String(),
  102. Name: req.Name,
  103. NetworkID: req.NetworkID,
  104. Description: req.Description,
  105. Servers: req.Servers,
  106. MatchAll: req.MatchAll,
  107. Domains: req.Domains,
  108. Tags: req.Tags,
  109. Nodes: req.Nodes,
  110. Status: true,
  111. CreatedBy: r.Header.Get("user"),
  112. CreatedAt: time.Now().UTC(),
  113. }
  114. err = ns.Create(db.WithContext(r.Context()))
  115. if err != nil {
  116. logic.ReturnErrorResponse(
  117. w,
  118. r,
  119. logic.FormatError(errors.New("error creating nameserver "+err.Error()), logic.Internal),
  120. )
  121. return
  122. }
  123. logic.LogEvent(&models.Event{
  124. Action: models.Create,
  125. Source: models.Subject{
  126. ID: r.Header.Get("user"),
  127. Name: r.Header.Get("user"),
  128. Type: models.UserSub,
  129. },
  130. TriggeredBy: r.Header.Get("user"),
  131. Target: models.Subject{
  132. ID: ns.ID,
  133. Name: ns.Name,
  134. Type: models.NameserverSub,
  135. },
  136. NetworkID: models.NetworkID(ns.NetworkID),
  137. Origin: models.Dashboard,
  138. })
  139. go mq.PublishPeerUpdate(false)
  140. logic.ReturnSuccessResponseWithJson(w, r, ns, "created nameserver")
  141. }
  142. // @Summary List Nameservers
  143. // @Router /api/v1/nameserver [get]
  144. // @Tags Auth
  145. // @Accept json
  146. // @Param query network string
  147. // @Success 200 {object} models.SuccessResponse
  148. // @Failure 400 {object} models.ErrorResponse
  149. // @Failure 401 {object} models.ErrorResponse
  150. // @Failure 500 {object} models.ErrorResponse
  151. func listNs(w http.ResponseWriter, r *http.Request) {
  152. network := r.URL.Query().Get("network")
  153. if network == "" {
  154. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("network is required"), "badrequest"))
  155. return
  156. }
  157. ns := schema.Nameserver{NetworkID: network}
  158. list, err := ns.ListByNetwork(db.WithContext(r.Context()))
  159. if err != nil {
  160. logic.ReturnErrorResponse(
  161. w,
  162. r,
  163. logic.FormatError(errors.New("error listing nameservers "+err.Error()), "internal"),
  164. )
  165. return
  166. }
  167. logic.ReturnSuccessResponseWithJson(w, r, list, "fetched nameservers")
  168. }
  169. // @Summary Update Nameserver
  170. // @Router /api/v1/nameserver [put]
  171. // @Tags Auth
  172. // @Accept json
  173. // @Param body body models.NameserverReq
  174. // @Success 200 {object} models.SuccessResponse
  175. // @Failure 400 {object} models.ErrorResponse
  176. // @Failure 401 {object} models.ErrorResponse
  177. // @Failure 500 {object} models.ErrorResponse
  178. func updateNs(w http.ResponseWriter, r *http.Request) {
  179. var updateNs schema.Nameserver
  180. err := json.NewDecoder(r.Body).Decode(&updateNs)
  181. if err != nil {
  182. logger.Log(0, "error decoding request body: ",
  183. err.Error())
  184. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  185. return
  186. }
  187. if err := logic.ValidateNameserverReq(updateNs); err != nil {
  188. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  189. return
  190. }
  191. if updateNs.Tags == nil {
  192. updateNs.Tags = make(datatypes.JSONMap)
  193. }
  194. if updateNs.Nodes == nil {
  195. updateNs.Nodes = make(datatypes.JSONMap)
  196. }
  197. ns := schema.Nameserver{ID: updateNs.ID}
  198. err = ns.Get(db.WithContext(r.Context()))
  199. if err != nil {
  200. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  201. return
  202. }
  203. var updateStatus bool
  204. var updateMatchAll bool
  205. if updateNs.Status != ns.Status {
  206. updateStatus = true
  207. }
  208. if updateNs.MatchAll != ns.MatchAll {
  209. updateMatchAll = true
  210. }
  211. event := &models.Event{
  212. Action: models.Update,
  213. Source: models.Subject{
  214. ID: r.Header.Get("user"),
  215. Name: r.Header.Get("user"),
  216. Type: models.UserSub,
  217. },
  218. TriggeredBy: r.Header.Get("user"),
  219. Target: models.Subject{
  220. ID: ns.ID,
  221. Name: updateNs.Name,
  222. Type: models.NameserverSub,
  223. },
  224. Diff: models.Diff{
  225. Old: ns,
  226. New: updateNs,
  227. },
  228. NetworkID: models.NetworkID(ns.NetworkID),
  229. Origin: models.Dashboard,
  230. }
  231. ns.Servers = updateNs.Servers
  232. ns.Tags = updateNs.Tags
  233. ns.Domains = updateNs.Domains
  234. ns.MatchAll = updateNs.MatchAll
  235. ns.Description = updateNs.Description
  236. ns.Name = updateNs.Name
  237. ns.Nodes = updateNs.Nodes
  238. ns.Status = updateNs.Status
  239. ns.UpdatedAt = time.Now().UTC()
  240. err = ns.Update(db.WithContext(context.TODO()))
  241. if err != nil {
  242. logic.ReturnErrorResponse(
  243. w,
  244. r,
  245. logic.FormatError(errors.New("error creating egress resource"+err.Error()), "internal"),
  246. )
  247. return
  248. }
  249. if updateStatus {
  250. ns.UpdateStatus(db.WithContext(context.TODO()))
  251. }
  252. if updateMatchAll {
  253. ns.UpdateMatchAll(db.WithContext(context.TODO()))
  254. }
  255. logic.LogEvent(event)
  256. go mq.PublishPeerUpdate(false)
  257. logic.ReturnSuccessResponseWithJson(w, r, ns, "updated nameserver")
  258. }
  259. // @Summary Delete Nameserver Resource
  260. // @Router /api/v1/nameserver [delete]
  261. // @Tags Auth
  262. // @Accept json
  263. // @Param body body models.Egress
  264. // @Success 200 {object} models.SuccessResponse
  265. // @Failure 400 {object} models.ErrorResponse
  266. // @Failure 401 {object} models.ErrorResponse
  267. // @Failure 500 {object} models.ErrorResponse
  268. func deleteNs(w http.ResponseWriter, r *http.Request) {
  269. id := r.URL.Query().Get("id")
  270. if id == "" {
  271. logic.ReturnErrorResponse(w, r, logic.FormatError(errors.New("id is required"), "badrequest"))
  272. return
  273. }
  274. ns := schema.Nameserver{ID: id}
  275. err := ns.Get(db.WithContext(r.Context()))
  276. if err != nil {
  277. logic.ReturnErrorResponse(w, r, logic.FormatError(err, logic.BadReq))
  278. return
  279. }
  280. err = ns.Delete(db.WithContext(r.Context()))
  281. if err != nil {
  282. logic.ReturnErrorResponse(w, r, logic.FormatError(err, logic.Internal))
  283. return
  284. }
  285. logic.LogEvent(&models.Event{
  286. Action: models.Delete,
  287. Source: models.Subject{
  288. ID: r.Header.Get("user"),
  289. Name: r.Header.Get("user"),
  290. Type: models.UserSub,
  291. },
  292. TriggeredBy: r.Header.Get("user"),
  293. Target: models.Subject{
  294. ID: ns.ID,
  295. Name: ns.Name,
  296. Type: models.NameserverSub,
  297. },
  298. NetworkID: models.NetworkID(ns.NetworkID),
  299. Origin: models.Dashboard,
  300. Diff: models.Diff{
  301. Old: ns,
  302. New: nil,
  303. },
  304. })
  305. go mq.PublishPeerUpdate(false)
  306. logic.ReturnSuccessResponseWithJson(w, r, nil, "deleted nameserver resource")
  307. }
  308. // @Summary Gets node DNS entries associated with a network
  309. // @Router /api/dns/{network} [get]
  310. // @Tags DNS
  311. // @Accept json
  312. // @Param network path string true "Network identifier"
  313. // @Success 200 {array} models.DNSEntry
  314. // @Failure 500 {object} models.ErrorResponse
  315. func getNodeDNS(w http.ResponseWriter, r *http.Request) {
  316. w.Header().Set("Content-Type", "application/json")
  317. var dns []models.DNSEntry
  318. var params = mux.Vars(r)
  319. network := params["network"]
  320. dns, err := logic.GetNodeDNS(network)
  321. if err != nil {
  322. logger.Log(0, r.Header.Get("user"),
  323. fmt.Sprintf("failed to get node DNS entries for network [%s]: %v", network, err))
  324. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  325. return
  326. }
  327. w.WriteHeader(http.StatusOK)
  328. json.NewEncoder(w).Encode(dns)
  329. }
  330. // @Summary Get all DNS entries
  331. // @Router /api/dns [get]
  332. // @Tags DNS
  333. // @Accept json
  334. // @Success 200 {array} models.DNSEntry
  335. // @Failure 500 {object} models.ErrorResponse
  336. func getAllDNS(w http.ResponseWriter, r *http.Request) {
  337. w.Header().Set("Content-Type", "application/json")
  338. dns, err := logic.GetAllDNS()
  339. if err != nil {
  340. logger.Log(0, r.Header.Get("user"), "failed to get all DNS entries: ", err.Error())
  341. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  342. return
  343. }
  344. logic.SortDNSEntrys(dns[:])
  345. w.WriteHeader(http.StatusOK)
  346. json.NewEncoder(w).Encode(dns)
  347. }
  348. // @Summary Gets custom DNS entries associated with a network
  349. // @Router /api/dns/adm/{network}/custom [get]
  350. // @Tags DNS
  351. // @Accept json
  352. // @Param network path string true "Network identifier"
  353. // @Success 200 {array} models.DNSEntry
  354. // @Failure 500 {object} models.ErrorResponse
  355. func getCustomDNS(w http.ResponseWriter, r *http.Request) {
  356. w.Header().Set("Content-Type", "application/json")
  357. var dns []models.DNSEntry
  358. var params = mux.Vars(r)
  359. network := params["network"]
  360. dns, err := logic.GetCustomDNS(network)
  361. if err != nil {
  362. logger.Log(
  363. 0,
  364. r.Header.Get("user"),
  365. fmt.Sprintf(
  366. "failed to get custom DNS entries for network [%s]: %v",
  367. network,
  368. err.Error(),
  369. ),
  370. )
  371. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  372. return
  373. }
  374. w.WriteHeader(http.StatusOK)
  375. json.NewEncoder(w).Encode(dns)
  376. }
  377. // @Summary Get all DNS entries associated with the network
  378. // @Router /api/dns/adm/{network} [get]
  379. // @Tags DNS
  380. // @Accept json
  381. // @Param network path string true "Network identifier"
  382. // @Success 200 {array} models.DNSEntry
  383. // @Failure 500 {object} models.ErrorResponse
  384. func getDNS(w http.ResponseWriter, r *http.Request) {
  385. w.Header().Set("Content-Type", "application/json")
  386. var dns []models.DNSEntry
  387. var params = mux.Vars(r)
  388. network := params["network"]
  389. dns, err := logic.GetDNS(network)
  390. if err != nil {
  391. logger.Log(0, r.Header.Get("user"),
  392. fmt.Sprintf("failed to get all DNS entries for network [%s]: %v", network, err.Error()))
  393. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  394. return
  395. }
  396. w.WriteHeader(http.StatusOK)
  397. json.NewEncoder(w).Encode(dns)
  398. }
  399. // @Summary Create a new DNS entry
  400. // @Router /api/dns/adm/{network} [post]
  401. // @Tags DNS
  402. // @Accept json
  403. // @Param network path string true "Network identifier"
  404. // @Param body body models.DNSEntry true "DNS entry details"
  405. // @Success 200 {object} models.DNSEntry
  406. // @Failure 400 {object} models.ErrorResponse
  407. // @Failure 500 {object} models.ErrorResponse
  408. func createDNS(w http.ResponseWriter, r *http.Request) {
  409. w.Header().Set("Content-Type", "application/json")
  410. var entry models.DNSEntry
  411. var params = mux.Vars(r)
  412. netID := params["network"]
  413. _ = json.NewDecoder(r.Body).Decode(&entry)
  414. entry.Network = params["network"]
  415. err := logic.ValidateDNSCreate(entry)
  416. if err != nil {
  417. logger.Log(0, r.Header.Get("user"),
  418. fmt.Sprintf("invalid DNS entry %+v: %v", entry, err))
  419. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  420. return
  421. }
  422. // check if default domain is appended if not append
  423. if logic.GetDefaultDomain() != "" &&
  424. !strings.HasSuffix(entry.Name, logic.GetDefaultDomain()) {
  425. entry.Name += "." + logic.GetDefaultDomain()
  426. }
  427. entry, err = logic.CreateDNS(entry)
  428. if err != nil {
  429. logger.Log(0, r.Header.Get("user"),
  430. fmt.Sprintf("Failed to create DNS entry %+v: %v", entry, err))
  431. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  432. return
  433. }
  434. if servercfg.IsDNSMode() {
  435. err = logic.SetDNS()
  436. if err != nil {
  437. logger.Log(0, r.Header.Get("user"),
  438. fmt.Sprintf("Failed to set DNS entries on file: %v", err))
  439. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  440. return
  441. }
  442. }
  443. if logic.GetManageDNS() {
  444. mq.SendDNSSyncByNetwork(netID)
  445. }
  446. logger.Log(1, "new DNS record added:", entry.Name)
  447. logger.Log(2, r.Header.Get("user"),
  448. fmt.Sprintf("DNS entry is set: %+v", entry))
  449. w.WriteHeader(http.StatusOK)
  450. json.NewEncoder(w).Encode(entry)
  451. }
  452. // @Summary Delete a DNS entry
  453. // @Router /api/dns/{network}/{domain} [delete]
  454. // @Tags DNS
  455. // @Accept json
  456. // @Param network path string true "Network identifier"
  457. // @Param domain path string true "Domain Name"
  458. // @Success 200 {array} models.DNSEntry
  459. // @Failure 500 {object} models.ErrorResponse
  460. func deleteDNS(w http.ResponseWriter, r *http.Request) {
  461. // Set header
  462. w.Header().Set("Content-Type", "application/json")
  463. // get params
  464. var params = mux.Vars(r)
  465. netID := params["network"]
  466. entrytext := params["domain"] + "." + params["network"]
  467. err := logic.DeleteDNS(params["domain"], params["network"])
  468. if err != nil {
  469. logger.Log(0, "failed to delete dns entry: ", entrytext)
  470. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  471. return
  472. }
  473. logger.Log(1, "deleted dns entry: ", entrytext)
  474. if servercfg.IsDNSMode() {
  475. err = logic.SetDNS()
  476. if err != nil {
  477. logger.Log(0, r.Header.Get("user"),
  478. fmt.Sprintf("Failed to set DNS entries on file: %v", err))
  479. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  480. return
  481. }
  482. }
  483. if logic.GetManageDNS() {
  484. mq.SendDNSSyncByNetwork(netID)
  485. }
  486. json.NewEncoder(w).Encode(entrytext + " deleted.")
  487. }
  488. // GetDNSEntry - gets a DNS entry
  489. func GetDNSEntry(domain string, network string) (models.DNSEntry, error) {
  490. var entry models.DNSEntry
  491. key, err := logic.GetRecordKey(domain, network)
  492. if err != nil {
  493. return entry, err
  494. }
  495. record, err := database.FetchRecord(database.DNS_TABLE_NAME, key)
  496. if err != nil {
  497. return entry, err
  498. }
  499. err = json.Unmarshal([]byte(record), &entry)
  500. return entry, err
  501. }
  502. // @Summary Push DNS entries to nameserver
  503. // @Router /api/dns/adm/pushdns [post]
  504. // @Tags DNS
  505. // @Accept json
  506. // @Success 200 {string} string "DNS Pushed to CoreDNS"
  507. // @Failure 400 {object} models.ErrorResponse
  508. // @Failure 500 {object} models.ErrorResponse
  509. func pushDNS(w http.ResponseWriter, r *http.Request) {
  510. // Set header
  511. w.Header().Set("Content-Type", "application/json")
  512. if !servercfg.IsDNSMode() {
  513. logic.ReturnErrorResponse(
  514. w,
  515. r,
  516. logic.FormatError(errors.New("DNS Mode is set to off"), "badrequest"),
  517. )
  518. return
  519. }
  520. err := logic.SetDNS()
  521. if err != nil {
  522. logger.Log(0, r.Header.Get("user"),
  523. fmt.Sprintf("Failed to set DNS entries on file: %v", err))
  524. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  525. return
  526. }
  527. logger.Log(1, r.Header.Get("user"), "pushed DNS updates to nameserver")
  528. json.NewEncoder(w).Encode("DNS Pushed to CoreDNS")
  529. }
  530. // @Summary Sync DNS entries for a given network
  531. // @Router /api/dns/adm/{network}/sync [post]
  532. // @Tags DNS
  533. // @Accept json
  534. // @Success 200 {string} string "DNS Sync completed successfully"
  535. // @Failure 400 {object} models.ErrorResponse
  536. // @Failure 500 {object} models.ErrorResponse
  537. func syncDNS(w http.ResponseWriter, r *http.Request) {
  538. // Set header
  539. w.Header().Set("Content-Type", "application/json")
  540. if !logic.GetManageDNS() {
  541. logic.ReturnErrorResponse(
  542. w,
  543. r,
  544. logic.FormatError(errors.New("manage DNS is set to false"), "badrequest"),
  545. )
  546. return
  547. }
  548. var params = mux.Vars(r)
  549. netID := params["network"]
  550. k, err := logic.GetDNS(netID)
  551. if err == nil && len(k) > 0 {
  552. err = mq.PushSyncDNS(k)
  553. }
  554. if err != nil {
  555. logger.Log(0, r.Header.Get("user"),
  556. fmt.Sprintf("Failed to Sync DNS entries to network %s: %v", netID, err))
  557. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  558. return
  559. }
  560. logger.Log(1, r.Header.Get("user"), "DNS Sync complelted successfully")
  561. json.NewEncoder(w).Encode("DNS Sync completed successfully")
  562. }