dns.go 18 KB

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