0.1.1
This commit is contained in:
@@ -0,0 +1,16 @@
|
||||
package coordinator
|
||||
|
||||
import "github.com/rombintu/godpn/internal/models"
|
||||
|
||||
type Coordinator struct {
|
||||
// TODO временное решение
|
||||
//
|
||||
// ip : Peer
|
||||
peers map[string]models.PeerNode
|
||||
}
|
||||
|
||||
func NewCoordinator() *Coordinator {
|
||||
return &Coordinator{
|
||||
peers: make(map[string]models.PeerNode),
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package tracker
|
||||
package coordinator
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
@@ -9,27 +9,26 @@ import (
|
||||
)
|
||||
|
||||
func (s *Server) registerHandler(c echo.Context) error {
|
||||
var peer models.PeerManifest
|
||||
if err := c.Bind(peer); err != nil {
|
||||
var node models.PeerNode
|
||||
if err := c.Bind(node); err != nil {
|
||||
return c.JSON(http.StatusBadRequest, map[string]string{"error": "invalid request"})
|
||||
}
|
||||
|
||||
if peer.PubKey == "" {
|
||||
return c.JSON(http.StatusBadRequest, map[string]string{"error": "pubkey is required"})
|
||||
if node.PublicKey == "" {
|
||||
return c.JSON(http.StatusBadRequest, map[string]string{"error": "public key is required"})
|
||||
}
|
||||
|
||||
ip := c.RealIP()
|
||||
if peer.IP != "" {
|
||||
ip = peer.IP
|
||||
if node.Endpoint != "" {
|
||||
ip = node.Endpoint
|
||||
}
|
||||
|
||||
s.mu.Lock()
|
||||
s.tracker.peers[ip] = peer.PubKey
|
||||
s.coordinator.peers[ip] = node
|
||||
s.mu.Unlock()
|
||||
|
||||
return c.JSON(http.StatusOK, map[string]string{
|
||||
"status": "registered",
|
||||
"ip": ip,
|
||||
return c.JSON(http.StatusOK, map[string]models.PeerNode{
|
||||
"registered": node,
|
||||
})
|
||||
}
|
||||
|
||||
@@ -37,7 +36,7 @@ func (s *Server) registerHandler(c echo.Context) error {
|
||||
func (s *Server) listPeers(c echo.Context) error {
|
||||
s.mu.RLock()
|
||||
defer s.mu.RUnlock()
|
||||
return c.JSON(http.StatusOK, s.tracker.peers)
|
||||
return c.JSON(http.StatusOK, s.coordinator.peers)
|
||||
}
|
||||
|
||||
// WebSocket handler для реального времени
|
||||
@@ -54,7 +53,7 @@ func (s *Server) websocketHandler(c echo.Context) error {
|
||||
|
||||
// Отправляем текущий список peers при подключении
|
||||
s.mu.RLock()
|
||||
if err := ws.WriteJSON(s.tracker.peers); err != nil {
|
||||
if err := ws.WriteJSON(s.coordinator.peers); err != nil {
|
||||
s.mu.RUnlock()
|
||||
return err
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
package tracker
|
||||
package coordinator
|
||||
|
||||
import (
|
||||
"sync"
|
||||
@@ -8,15 +8,15 @@ import (
|
||||
)
|
||||
|
||||
type Server struct {
|
||||
router *echo.Echo
|
||||
mu sync.RWMutex
|
||||
tracker *Tracker
|
||||
router *echo.Echo
|
||||
mu sync.RWMutex
|
||||
coordinator *Coordinator
|
||||
}
|
||||
|
||||
func NewServer() *Server {
|
||||
return &Server{
|
||||
router: echo.New(),
|
||||
tracker: NewTracker(),
|
||||
router: echo.New(),
|
||||
coordinator: NewCoordinator(),
|
||||
}
|
||||
}
|
||||
|
||||
+26
-3
@@ -1,6 +1,29 @@
|
||||
package models
|
||||
|
||||
type PeerManifest struct {
|
||||
IP string `json:"ip" form:"ip" query:"ip"`
|
||||
PubKey string `json:"pubkey" form:"pubkey" query:"pubkey" validate:"required"`
|
||||
import "time"
|
||||
|
||||
type PeerNode struct {
|
||||
// Basic identity
|
||||
PublicKey string `json:"public_key" validate:"required"` // WireGuard/SS public key
|
||||
|
||||
// Network information
|
||||
Endpoint string `json:"endpoint"` // IP:Port or DNS
|
||||
Protocol string `json:"protocol"` // "shadowsocks", "wireguard", etc
|
||||
|
||||
// Performance metrics
|
||||
System string `json:"system"` // "linux", "windows", etc
|
||||
Latency int `json:"latency"` // in milliseconds
|
||||
Bandwidth int `json:"bandwidth"` // in Mbps
|
||||
|
||||
// Geo information
|
||||
Region string `json:"region,omitempty"` // "eu-west", "us-east"
|
||||
Country string `json:"country,omitempty"` // 2-letter ISO code
|
||||
|
||||
// System stats
|
||||
Uptime float64 `json:"uptime"` // 0.0-1.0 percentage
|
||||
Load float64 `json:"load"` // 5-min system load avg
|
||||
|
||||
// Timestamps
|
||||
LastSeen time.Time `json:"last_seen"`
|
||||
FirstSeen time.Time `json:"first_seen"`
|
||||
}
|
||||
|
||||
@@ -6,14 +6,14 @@ import (
|
||||
)
|
||||
|
||||
func (s *Server) connectHandler(c echo.Context) error {
|
||||
var peerManifest models.PeerManifest
|
||||
var node models.PeerNode
|
||||
|
||||
if err := c.Bind(peerManifest); err != nil {
|
||||
if err := c.Bind(node); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
peer := NewPeer(peerManifest.PubKey)
|
||||
if err := peer.Connect(peerManifest.IP, "8080"); err != nil {
|
||||
peer := NewPeer(node.PublicKey)
|
||||
if err := peer.Connect(node.Endpoint); err != nil {
|
||||
return err
|
||||
}
|
||||
defer peer.Disconnect()
|
||||
|
||||
@@ -11,8 +11,9 @@ import (
|
||||
)
|
||||
|
||||
const (
|
||||
tcpNetwork = "tcp"
|
||||
bufferSize = 32 * 1024 // 32KB
|
||||
tcpNetwork = "tcp"
|
||||
bufferSize = 32 * 1024 // 32KB
|
||||
AHEAD_CHACHA20_POLY1305 = "AEAD_CHACHA20_POLY1305" // Default method cipher
|
||||
)
|
||||
|
||||
// Ошибки подключения
|
||||
@@ -34,7 +35,7 @@ func NewPeer(pubKey string) *Peer {
|
||||
}
|
||||
}
|
||||
|
||||
func (p *Peer) Connect(ip, port string) error {
|
||||
func (p *Peer) Connect(endpoint string) error {
|
||||
p.mu.Lock()
|
||||
defer p.mu.Unlock()
|
||||
|
||||
@@ -42,12 +43,12 @@ func (p *Peer) Connect(ip, port string) error {
|
||||
return nil // Уже подключен
|
||||
}
|
||||
|
||||
conn, err := net.Dial(tcpNetwork, net.JoinHostPort(ip, port))
|
||||
conn, err := net.Dial(tcpNetwork, endpoint)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
cipher, err := core.PickCipher("AEAD_CHACHA20_POLY1305", []byte(p.pubKey), "")
|
||||
cipher, err := core.PickCipher(AHEAD_CHACHA20_POLY1305, []byte(p.pubKey), "")
|
||||
if err != nil {
|
||||
conn.Close()
|
||||
return err
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
package tracker
|
||||
|
||||
type Tracker struct {
|
||||
peers map[string]string
|
||||
}
|
||||
|
||||
func NewTracker() *Tracker {
|
||||
return &Tracker{
|
||||
peers: make(map[string]string),
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user