dns.go 18 KB

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