mirror of
https://github.com/fosrl/newt.git
synced 2026-03-27 04:56:41 +00:00
Compare commits
5 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
cd86e6b6de | ||
|
|
230c34e4e0 | ||
|
|
a038ce1458 | ||
|
|
cd83efd365 | ||
|
|
702f39e870 |
6
flake.lock
generated
6
flake.lock
generated
@@ -2,11 +2,11 @@
|
|||||||
"nodes": {
|
"nodes": {
|
||||||
"nixpkgs": {
|
"nixpkgs": {
|
||||||
"locked": {
|
"locked": {
|
||||||
"lastModified": 1749086602,
|
"lastModified": 1752308619,
|
||||||
"narHash": "sha256-DJcgJMekoxVesl9kKjfLPix2Nbr42i7cpEHJiTnBUwU=",
|
"narHash": "sha256-pzrVLKRQNPrii06Rm09Q0i0dq3wt2t2pciT/GNq5EZQ=",
|
||||||
"owner": "NixOS",
|
"owner": "NixOS",
|
||||||
"repo": "nixpkgs",
|
"repo": "nixpkgs",
|
||||||
"rev": "4792576cb003c994bd7cc1edada3129def20b27d",
|
"rev": "650e572363c091045cdbc5b36b0f4c1f614d3058",
|
||||||
"type": "github"
|
"type": "github"
|
||||||
},
|
},
|
||||||
"original": {
|
"original": {
|
||||||
|
|||||||
@@ -27,11 +27,11 @@
|
|||||||
default = self.packages.${system}.pangolin-newt;
|
default = self.packages.${system}.pangolin-newt;
|
||||||
pangolin-newt = pkgs.buildGoModule {
|
pangolin-newt = pkgs.buildGoModule {
|
||||||
pname = "pangolin-newt";
|
pname = "pangolin-newt";
|
||||||
version = "1.2.1";
|
version = "1.3.2";
|
||||||
|
|
||||||
src = ./.;
|
src = ./.;
|
||||||
|
|
||||||
vendorHash = "sha256-Yc5IXnShciek/bKkVezkAcaq47zGiZP8vUHFb9p09LI=";
|
vendorHash = "sha256-Y/f7GCO7Kf1iQiDR32DIEIGJdcN+PKS0OrhBvXiHvwo=";
|
||||||
|
|
||||||
meta = with pkgs.lib; {
|
meta = with pkgs.lib; {
|
||||||
description = "A tunneling client for Pangolin";
|
description = "A tunneling client for Pangolin";
|
||||||
|
|||||||
64
main.go
64
main.go
@@ -488,6 +488,32 @@ persistent_keepalive_interval=5`, fixKey(privateKey.String()), fixKey(wgData.Pub
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If there is just one exit node, we can skip pinging it and use it directly
|
||||||
|
if len(exitNodes) == 1 {
|
||||||
|
logger.Debug("Only one exit node available, using it directly: %s", exitNodes[0].Endpoint)
|
||||||
|
|
||||||
|
// Prepare data to send to the cloud for selection
|
||||||
|
pingResults := []ExitNodePingResult{
|
||||||
|
{
|
||||||
|
ExitNodeID: exitNodes[0].ID,
|
||||||
|
LatencyMs: 0, // No ping latency since we are using it directly
|
||||||
|
Weight: exitNodes[0].Weight,
|
||||||
|
Error: "",
|
||||||
|
Name: exitNodes[0].Name,
|
||||||
|
Endpoint: exitNodes[0].Endpoint,
|
||||||
|
WasPreviouslyConnected: exitNodes[0].WasPreviouslyConnected,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
stopFunc = client.SendMessageInterval("newt/wg/register", map[string]interface{}{
|
||||||
|
"publicKey": publicKey.String(),
|
||||||
|
"pingResults": pingResults,
|
||||||
|
"newtVersion": newtVersion,
|
||||||
|
}, 1*time.Second)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
type nodeResult struct {
|
type nodeResult struct {
|
||||||
Node ExitNode
|
Node ExitNode
|
||||||
Latency time.Duration
|
Latency time.Duration
|
||||||
@@ -497,11 +523,6 @@ persistent_keepalive_interval=5`, fixKey(privateKey.String()), fixKey(wgData.Pub
|
|||||||
results := make([]nodeResult, len(exitNodes))
|
results := make([]nodeResult, len(exitNodes))
|
||||||
const pingAttempts = 3
|
const pingAttempts = 3
|
||||||
for i, node := range exitNodes {
|
for i, node := range exitNodes {
|
||||||
if connected && node.WasPreviouslyConnected {
|
|
||||||
logger.Info("Skipping ping for previously connected exit node so we pick another %d (%s)", node.ID, node.Endpoint)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
var totalLatency time.Duration
|
var totalLatency time.Duration
|
||||||
var lastErr error
|
var lastErr error
|
||||||
successes := 0
|
successes := 0
|
||||||
@@ -556,6 +577,31 @@ persistent_keepalive_interval=5`, fixKey(privateKey.String()), fixKey(wgData.Pub
|
|||||||
WasPreviouslyConnected: res.Node.WasPreviouslyConnected,
|
WasPreviouslyConnected: res.Node.WasPreviouslyConnected,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
// If we were previously connected and there is at least one other good node,
|
||||||
|
// exclude the previously connected node from pingResults sent to the cloud.
|
||||||
|
var filteredPingResults []ExitNodePingResult
|
||||||
|
previouslyConnectedNodeIdx := -1
|
||||||
|
for i, res := range pingResults {
|
||||||
|
if res.WasPreviouslyConnected {
|
||||||
|
previouslyConnectedNodeIdx = i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Count good nodes (latency > 0, no error, not previously connected)
|
||||||
|
goodNodeCount := 0
|
||||||
|
for i, res := range pingResults {
|
||||||
|
if i != previouslyConnectedNodeIdx && res.LatencyMs > 0 && res.Error == "" {
|
||||||
|
goodNodeCount++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if previouslyConnectedNodeIdx != -1 && goodNodeCount > 0 {
|
||||||
|
for i, res := range pingResults {
|
||||||
|
if i != previouslyConnectedNodeIdx {
|
||||||
|
filteredPingResults = append(filteredPingResults, res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pingResults = filteredPingResults
|
||||||
|
logger.Info("Excluding previously connected exit node from ping results due to other available nodes")
|
||||||
|
}
|
||||||
|
|
||||||
// Send the ping results to the cloud for selection
|
// Send the ping results to the cloud for selection
|
||||||
stopFunc = client.SendMessageInterval("newt/wg/register", map[string]interface{}{
|
stopFunc = client.SendMessageInterval("newt/wg/register", map[string]interface{}{
|
||||||
@@ -649,10 +695,10 @@ persistent_keepalive_interval=5`, fixKey(privateKey.String()), fixKey(wgData.Pub
|
|||||||
|
|
||||||
// Register handler for Docker socket check
|
// Register handler for Docker socket check
|
||||||
client.RegisterHandler("newt/socket/check", func(msg websocket.WSMessage) {
|
client.RegisterHandler("newt/socket/check", func(msg websocket.WSMessage) {
|
||||||
logger.Info("Received Docker socket check request")
|
logger.Debug("Received Docker socket check request")
|
||||||
|
|
||||||
if dockerSocket == "" {
|
if dockerSocket == "" {
|
||||||
logger.Info("Docker socket path is not set")
|
logger.Debug("Docker socket path is not set")
|
||||||
err := client.SendMessage("newt/socket/status", map[string]interface{}{
|
err := client.SendMessage("newt/socket/status", map[string]interface{}{
|
||||||
"available": false,
|
"available": false,
|
||||||
"socketPath": dockerSocket,
|
"socketPath": dockerSocket,
|
||||||
@@ -680,10 +726,10 @@ persistent_keepalive_interval=5`, fixKey(privateKey.String()), fixKey(wgData.Pub
|
|||||||
|
|
||||||
// Register handler for Docker container listing
|
// Register handler for Docker container listing
|
||||||
client.RegisterHandler("newt/socket/fetch", func(msg websocket.WSMessage) {
|
client.RegisterHandler("newt/socket/fetch", func(msg websocket.WSMessage) {
|
||||||
logger.Info("Received Docker container fetch request")
|
logger.Debug("Received Docker container fetch request")
|
||||||
|
|
||||||
if dockerSocket == "" {
|
if dockerSocket == "" {
|
||||||
logger.Info("Docker socket path is not set")
|
logger.Debug("Docker socket path is not set")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user