dns.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  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. })
  301. go mq.PublishPeerUpdate(false)
  302. logic.ReturnSuccessResponseWithJson(w, r, nil, "deleted nameserver resource")
  303. }
  304. // @Summary Gets node DNS entries associated with a network
  305. // @Router /api/dns/{network} [get]
  306. // @Tags DNS
  307. // @Accept json
  308. // @Param network path string true "Network identifier"
  309. // @Success 200 {array} models.DNSEntry
  310. // @Failure 500 {object} models.ErrorResponse
  311. func getNodeDNS(w http.ResponseWriter, r *http.Request) {
  312. w.Header().Set("Content-Type", "application/json")
  313. var dns []models.DNSEntry
  314. var params = mux.Vars(r)
  315. network := params["network"]
  316. dns, err := logic.GetNodeDNS(network)
  317. if err != nil {
  318. logger.Log(0, r.Header.Get("user"),
  319. fmt.Sprintf("failed to get node DNS entries for network [%s]: %v", network, err))
  320. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  321. return
  322. }
  323. w.WriteHeader(http.StatusOK)
  324. json.NewEncoder(w).Encode(dns)
  325. }
  326. // @Summary Get all DNS entries
  327. // @Router /api/dns [get]
  328. // @Tags DNS
  329. // @Accept json
  330. // @Success 200 {array} models.DNSEntry
  331. // @Failure 500 {object} models.ErrorResponse
  332. func getAllDNS(w http.ResponseWriter, r *http.Request) {
  333. w.Header().Set("Content-Type", "application/json")
  334. dns, err := logic.GetAllDNS()
  335. if err != nil {
  336. logger.Log(0, r.Header.Get("user"), "failed to get all DNS entries: ", err.Error())
  337. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  338. return
  339. }
  340. logic.SortDNSEntrys(dns[:])
  341. w.WriteHeader(http.StatusOK)
  342. json.NewEncoder(w).Encode(dns)
  343. }
  344. // @Summary Gets custom DNS entries associated with a network
  345. // @Router /api/dns/adm/{network}/custom [get]
  346. // @Tags DNS
  347. // @Accept json
  348. // @Param network path string true "Network identifier"
  349. // @Success 200 {array} models.DNSEntry
  350. // @Failure 500 {object} models.ErrorResponse
  351. func getCustomDNS(w http.ResponseWriter, r *http.Request) {
  352. w.Header().Set("Content-Type", "application/json")
  353. var dns []models.DNSEntry
  354. var params = mux.Vars(r)
  355. network := params["network"]
  356. dns, err := logic.GetCustomDNS(network)
  357. if err != nil {
  358. logger.Log(
  359. 0,
  360. r.Header.Get("user"),
  361. fmt.Sprintf(
  362. "failed to get custom DNS entries for network [%s]: %v",
  363. network,
  364. err.Error(),
  365. ),
  366. )
  367. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  368. return
  369. }
  370. w.WriteHeader(http.StatusOK)
  371. json.NewEncoder(w).Encode(dns)
  372. }
  373. // @Summary Get all DNS entries associated with the network
  374. // @Router /api/dns/adm/{network} [get]
  375. // @Tags DNS
  376. // @Accept json
  377. // @Param network path string true "Network identifier"
  378. // @Success 200 {array} models.DNSEntry
  379. // @Failure 500 {object} models.ErrorResponse
  380. func getDNS(w http.ResponseWriter, r *http.Request) {
  381. w.Header().Set("Content-Type", "application/json")
  382. var dns []models.DNSEntry
  383. var params = mux.Vars(r)
  384. network := params["network"]
  385. dns, err := logic.GetDNS(network)
  386. if err != nil {
  387. logger.Log(0, r.Header.Get("user"),
  388. fmt.Sprintf("failed to get all DNS entries for network [%s]: %v", network, err.Error()))
  389. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  390. return
  391. }
  392. w.WriteHeader(http.StatusOK)
  393. json.NewEncoder(w).Encode(dns)
  394. }
  395. // @Summary Create a new DNS entry
  396. // @Router /api/dns/adm/{network} [post]
  397. // @Tags DNS
  398. // @Accept json
  399. // @Param network path string true "Network identifier"
  400. // @Param body body models.DNSEntry true "DNS entry details"
  401. // @Success 200 {object} models.DNSEntry
  402. // @Failure 400 {object} models.ErrorResponse
  403. // @Failure 500 {object} models.ErrorResponse
  404. func createDNS(w http.ResponseWriter, r *http.Request) {
  405. w.Header().Set("Content-Type", "application/json")
  406. var entry models.DNSEntry
  407. var params = mux.Vars(r)
  408. netID := params["network"]
  409. _ = json.NewDecoder(r.Body).Decode(&entry)
  410. entry.Network = params["network"]
  411. err := logic.ValidateDNSCreate(entry)
  412. if err != nil {
  413. logger.Log(0, r.Header.Get("user"),
  414. fmt.Sprintf("invalid DNS entry %+v: %v", entry, err))
  415. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "badrequest"))
  416. return
  417. }
  418. // check if default domain is appended if not append
  419. if logic.GetDefaultDomain() != "" &&
  420. !strings.HasSuffix(entry.Name, logic.GetDefaultDomain()) {
  421. entry.Name += "." + logic.GetDefaultDomain()
  422. }
  423. entry, err = logic.CreateDNS(entry)
  424. if err != nil {
  425. logger.Log(0, r.Header.Get("user"),
  426. fmt.Sprintf("Failed to create DNS entry %+v: %v", entry, err))
  427. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  428. return
  429. }
  430. if servercfg.IsDNSMode() {
  431. err = logic.SetDNS()
  432. if err != nil {
  433. logger.Log(0, r.Header.Get("user"),
  434. fmt.Sprintf("Failed to set DNS entries on file: %v", err))
  435. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  436. return
  437. }
  438. }
  439. if logic.GetManageDNS() {
  440. mq.SendDNSSyncByNetwork(netID)
  441. }
  442. logger.Log(1, "new DNS record added:", entry.Name)
  443. logger.Log(2, r.Header.Get("user"),
  444. fmt.Sprintf("DNS entry is set: %+v", entry))
  445. w.WriteHeader(http.StatusOK)
  446. json.NewEncoder(w).Encode(entry)
  447. }
  448. // @Summary Delete a DNS entry
  449. // @Router /api/dns/{network}/{domain} [delete]
  450. // @Tags DNS
  451. // @Accept json
  452. // @Param network path string true "Network identifier"
  453. // @Param domain path string true "Domain Name"
  454. // @Success 200 {array} models.DNSEntry
  455. // @Failure 500 {object} models.ErrorResponse
  456. func deleteDNS(w http.ResponseWriter, r *http.Request) {
  457. // Set header
  458. w.Header().Set("Content-Type", "application/json")
  459. // get params
  460. var params = mux.Vars(r)
  461. netID := params["network"]
  462. entrytext := params["domain"] + "." + params["network"]
  463. err := logic.DeleteDNS(params["domain"], params["network"])
  464. if err != nil {
  465. logger.Log(0, "failed to delete dns entry: ", entrytext)
  466. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  467. return
  468. }
  469. logger.Log(1, "deleted dns entry: ", entrytext)
  470. if servercfg.IsDNSMode() {
  471. err = logic.SetDNS()
  472. if err != nil {
  473. logger.Log(0, r.Header.Get("user"),
  474. fmt.Sprintf("Failed to set DNS entries on file: %v", err))
  475. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  476. return
  477. }
  478. }
  479. if logic.GetManageDNS() {
  480. mq.SendDNSSyncByNetwork(netID)
  481. }
  482. json.NewEncoder(w).Encode(entrytext + " deleted.")
  483. }
  484. // GetDNSEntry - gets a DNS entry
  485. func GetDNSEntry(domain string, network string) (models.DNSEntry, error) {
  486. var entry models.DNSEntry
  487. key, err := logic.GetRecordKey(domain, network)
  488. if err != nil {
  489. return entry, err
  490. }
  491. record, err := database.FetchRecord(database.DNS_TABLE_NAME, key)
  492. if err != nil {
  493. return entry, err
  494. }
  495. err = json.Unmarshal([]byte(record), &entry)
  496. return entry, err
  497. }
  498. // @Summary Push DNS entries to nameserver
  499. // @Router /api/dns/adm/pushdns [post]
  500. // @Tags DNS
  501. // @Accept json
  502. // @Success 200 {string} string "DNS Pushed to CoreDNS"
  503. // @Failure 400 {object} models.ErrorResponse
  504. // @Failure 500 {object} models.ErrorResponse
  505. func pushDNS(w http.ResponseWriter, r *http.Request) {
  506. // Set header
  507. w.Header().Set("Content-Type", "application/json")
  508. if !servercfg.IsDNSMode() {
  509. logic.ReturnErrorResponse(
  510. w,
  511. r,
  512. logic.FormatError(errors.New("DNS Mode is set to off"), "badrequest"),
  513. )
  514. return
  515. }
  516. err := logic.SetDNS()
  517. if err != nil {
  518. logger.Log(0, r.Header.Get("user"),
  519. fmt.Sprintf("Failed to set DNS entries on file: %v", err))
  520. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  521. return
  522. }
  523. logger.Log(1, r.Header.Get("user"), "pushed DNS updates to nameserver")
  524. json.NewEncoder(w).Encode("DNS Pushed to CoreDNS")
  525. }
  526. // @Summary Sync DNS entries for a given network
  527. // @Router /api/dns/adm/{network}/sync [post]
  528. // @Tags DNS
  529. // @Accept json
  530. // @Success 200 {string} string "DNS Sync completed successfully"
  531. // @Failure 400 {object} models.ErrorResponse
  532. // @Failure 500 {object} models.ErrorResponse
  533. func syncDNS(w http.ResponseWriter, r *http.Request) {
  534. // Set header
  535. w.Header().Set("Content-Type", "application/json")
  536. if !logic.GetManageDNS() {
  537. logic.ReturnErrorResponse(
  538. w,
  539. r,
  540. logic.FormatError(errors.New("manage DNS is set to false"), "badrequest"),
  541. )
  542. return
  543. }
  544. var params = mux.Vars(r)
  545. netID := params["network"]
  546. k, err := logic.GetDNS(netID)
  547. if err == nil && len(k) > 0 {
  548. err = mq.PushSyncDNS(k)
  549. }
  550. if err != nil {
  551. logger.Log(0, r.Header.Get("user"),
  552. fmt.Sprintf("Failed to Sync DNS entries to network %s: %v", netID, err))
  553. logic.ReturnErrorResponse(w, r, logic.FormatError(err, "internal"))
  554. return
  555. }
  556. logger.Log(1, r.Header.Get("user"), "DNS Sync complelted successfully")
  557. json.NewEncoder(w).Encode("DNS Sync completed successfully")
  558. }