| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- package discovery
- import (
- "context"
- "encoding/json"
- "fmt"
- "net"
- "networktool/internal/config"
- "networktool/internal/deviceinfo"
- "networktool/internal/logger"
- "networktool/internal/model"
- )
- type Server struct {
- cfg config.Config
- log *logger.Logger
- deviceSvc *deviceinfo.Service
- }
- func New(cfg config.Config, log *logger.Logger, deviceSvc *deviceinfo.Service) *Server {
- return &Server{cfg: cfg, log: log, deviceSvc: deviceSvc}
- }
- func (s *Server) Run(ctx context.Context) error {
- addr, err := net.ResolveUDPAddr("udp4", fmt.Sprintf("%s:%d", s.cfg.UDPHost, s.cfg.UDPPort))
- if err != nil {
- return err
- }
- conn, err := net.ListenUDP("udp4", addr)
- if err != nil {
- return err
- }
- defer conn.Close()
- go func() {
- <-ctx.Done()
- _ = conn.Close()
- }()
- s.log.Info("udp discovery listening", "addr", conn.LocalAddr().String())
- buf := make([]byte, 2048)
- for {
- n, remote, err := conn.ReadFromUDP(buf)
- if err != nil {
- if ctx.Err() != nil {
- return nil
- }
- return err
- }
- var req model.DiscoverRequest
- if err := json.Unmarshal(buf[:n], &req); err != nil || req.MessageType != "discover" {
- continue
- }
- device := s.deviceSvc.Get()
- resp := model.DiscoverResponse{
- ProtocolVersion: 1,
- MessageType: "discover_response",
- RequestID: req.RequestID,
- DeviceID: device.DeviceID,
- Hostname: device.Hostname,
- ServerVersion: device.ServerVersion,
- LAN2IP: s.cfg.MaintenanceIP,
- AuthRequired: true,
- }
- payload, _ := json.Marshal(resp)
- _, _ = conn.WriteToUDP(payload, remote)
- }
- }
|