bridge_handlers.go 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199
  1. package api
  2. import (
  3. "encoding/json"
  4. "net/http"
  5. "debtik/internal/bridge"
  6. )
  7. func (s *Server) handleBridgeSummary(w http.ResponseWriter, r *http.Request) {
  8. summary := s.bridgeMgr.GetSummary()
  9. writeJSON(w, http.StatusOK, summary)
  10. }
  11. // ---------------- Bridges (/interface bridge) ----------------
  12. func (s *Server) handleListBridges(w http.ResponseWriter, r *http.Request) {
  13. list := s.bridgeMgr.ListBridges()
  14. writeJSON(w, http.StatusOK, list)
  15. }
  16. func (s *Server) handleSaveBridge(w http.ResponseWriter, r *http.Request) {
  17. var b bridge.BridgeInstance
  18. if err := json.NewDecoder(r.Body).Decode(&b); err != nil {
  19. writeError(w, http.StatusBadRequest, "invalid request body: "+err.Error())
  20. return
  21. }
  22. if err := s.bridgeMgr.SaveBridge(b); err != nil {
  23. writeError(w, http.StatusInternalServerError, err.Error())
  24. return
  25. }
  26. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": b.ID})
  27. }
  28. func (s *Server) handleDeleteBridge(w http.ResponseWriter, r *http.Request) {
  29. id := r.PathValue("id")
  30. if err := s.bridgeMgr.DeleteBridge(id); err != nil {
  31. writeError(w, http.StatusInternalServerError, err.Error())
  32. return
  33. }
  34. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id})
  35. }
  36. func (s *Server) handleSetBridgeState(w http.ResponseWriter, r *http.Request) {
  37. id := r.PathValue("id")
  38. var req struct {
  39. Disabled bool `json:"disabled"`
  40. }
  41. _ = json.NewDecoder(r.Body).Decode(&req)
  42. if err := s.bridgeMgr.SetBridgeState(id, req.Disabled); err != nil {
  43. writeError(w, http.StatusInternalServerError, err.Error())
  44. return
  45. }
  46. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id, "disabled": req.Disabled})
  47. }
  48. func (s *Server) handleAddBridgeIP(w http.ResponseWriter, r *http.Request) {
  49. id := r.PathValue("id")
  50. var req struct {
  51. IP string `json:"ip"`
  52. }
  53. if err := json.NewDecoder(r.Body).Decode(&req); err != nil || req.IP == "" {
  54. writeError(w, http.StatusBadRequest, "ip address is required")
  55. return
  56. }
  57. if err := s.bridgeMgr.AddBridgeIP(id, req.IP); err != nil {
  58. writeError(w, http.StatusInternalServerError, err.Error())
  59. return
  60. }
  61. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id, "ip": req.IP})
  62. }
  63. func (s *Server) handleDeleteBridgeIP(w http.ResponseWriter, r *http.Request) {
  64. id := r.PathValue("id")
  65. var req struct {
  66. IP string `json:"ip"`
  67. }
  68. if err := json.NewDecoder(r.Body).Decode(&req); err != nil || req.IP == "" {
  69. writeError(w, http.StatusBadRequest, "ip address is required")
  70. return
  71. }
  72. if err := s.bridgeMgr.DeleteBridgeIP(id, req.IP); err != nil {
  73. writeError(w, http.StatusInternalServerError, err.Error())
  74. return
  75. }
  76. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id, "ip": req.IP})
  77. }
  78. // ---------------- Ports (/interface bridge port) ----------------
  79. func (s *Server) handleListBridgePorts(w http.ResponseWriter, r *http.Request) {
  80. list := s.bridgeMgr.ListPorts()
  81. writeJSON(w, http.StatusOK, list)
  82. }
  83. func (s *Server) handleSaveBridgePort(w http.ResponseWriter, r *http.Request) {
  84. var p bridge.BridgePort
  85. if err := json.NewDecoder(r.Body).Decode(&p); err != nil {
  86. writeError(w, http.StatusBadRequest, "invalid request body: "+err.Error())
  87. return
  88. }
  89. if err := s.bridgeMgr.SavePort(p); err != nil {
  90. writeError(w, http.StatusInternalServerError, err.Error())
  91. return
  92. }
  93. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": p.ID})
  94. }
  95. func (s *Server) handleDeleteBridgePort(w http.ResponseWriter, r *http.Request) {
  96. id := r.PathValue("id")
  97. if err := s.bridgeMgr.DeletePort(id); err != nil {
  98. writeError(w, http.StatusInternalServerError, err.Error())
  99. return
  100. }
  101. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id})
  102. }
  103. func (s *Server) handleSetBridgePortState(w http.ResponseWriter, r *http.Request) {
  104. id := r.PathValue("id")
  105. var req struct {
  106. Disabled bool `json:"disabled"`
  107. }
  108. _ = json.NewDecoder(r.Body).Decode(&req)
  109. if err := s.bridgeMgr.SetPortState(id, req.Disabled); err != nil {
  110. writeError(w, http.StatusInternalServerError, err.Error())
  111. return
  112. }
  113. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id, "disabled": req.Disabled})
  114. }
  115. // ---------------- VLANs (/interface bridge vlan) ----------------
  116. func (s *Server) handleListBridgeVLANs(w http.ResponseWriter, r *http.Request) {
  117. list := s.bridgeMgr.ListVLANs()
  118. writeJSON(w, http.StatusOK, list)
  119. }
  120. func (s *Server) handleSaveBridgeVLAN(w http.ResponseWriter, r *http.Request) {
  121. var v bridge.BridgeVLAN
  122. if err := json.NewDecoder(r.Body).Decode(&v); err != nil {
  123. writeError(w, http.StatusBadRequest, "invalid request body: "+err.Error())
  124. return
  125. }
  126. if err := s.bridgeMgr.SaveVLAN(v); err != nil {
  127. writeError(w, http.StatusInternalServerError, err.Error())
  128. return
  129. }
  130. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": v.ID})
  131. }
  132. func (s *Server) handleDeleteBridgeVLAN(w http.ResponseWriter, r *http.Request) {
  133. id := r.PathValue("id")
  134. if err := s.bridgeMgr.DeleteVLAN(id); err != nil {
  135. writeError(w, http.StatusInternalServerError, err.Error())
  136. return
  137. }
  138. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id})
  139. }
  140. func (s *Server) handleSetBridgeVLANState(w http.ResponseWriter, r *http.Request) {
  141. id := r.PathValue("id")
  142. var req struct {
  143. Disabled bool `json:"disabled"`
  144. }
  145. _ = json.NewDecoder(r.Body).Decode(&req)
  146. if err := s.bridgeMgr.SetVLANState(id, req.Disabled); err != nil {
  147. writeError(w, http.StatusInternalServerError, err.Error())
  148. return
  149. }
  150. writeJSON(w, http.StatusOK, map[string]any{"success": true, "id": id, "disabled": req.Disabled})
  151. }
  152. // ---------------- Hosts / FDB Table (/interface bridge host) ----------------
  153. func (s *Server) handleListBridgeHosts(w http.ResponseWriter, r *http.Request) {
  154. bridgeName := r.URL.Query().Get("bridge")
  155. hosts, err := s.bridgeMgr.ListHosts(bridgeName)
  156. if err != nil {
  157. writeError(w, http.StatusInternalServerError, err.Error())
  158. return
  159. }
  160. writeJSON(w, http.StatusOK, hosts)
  161. }
  162. func (s *Server) handleFlushBridgeHosts(w http.ResponseWriter, r *http.Request) {
  163. var req struct {
  164. Bridge string `json:"bridge"`
  165. }
  166. _ = json.NewDecoder(r.Body).Decode(&req)
  167. if req.Bridge == "" {
  168. writeError(w, http.StatusBadRequest, "bridge is required")
  169. return
  170. }
  171. if err := s.bridgeMgr.FlushHosts(req.Bridge); err != nil {
  172. writeError(w, http.StatusInternalServerError, err.Error())
  173. return
  174. }
  175. writeJSON(w, http.StatusOK, map[string]any{"success": true, "bridge": req.Bridge})
  176. }