Skip to content

Commit 78c6883

Browse files
authored
Improve dmsg utilities (skycoin#302)
* go get -u github.com/skycoin/skywire@develop * change some fatal error logging to debug logging * retry httpC.Do(req) with dmsgcurl after non i/o deadline reached errors * fix CI errors * update import path for calvin library
1 parent d5e314d commit 78c6883

File tree

362 files changed

+123332
-244359
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

362 files changed

+123332
-244359
lines changed

cmd/dmsg-socks5/commands/dmsg-socks5.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,9 @@ import (
1212
"strings"
1313
"time"
1414

15-
"github.com/0magnet/calvin"
1615
socks5 "github.com/confiant-inc/go-socks5"
1716
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo"
17+
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/calvin"
1818
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher"
1919
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cmdutil"
2020
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging"

cmd/dmsgcurl/commands/dmsgcurl.go

Lines changed: 50 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"io"
99
"io/fs"
1010
"log"
11+
"net"
1112
"net/http"
1213
"net/url"
1314
"os"
@@ -16,8 +17,8 @@ import (
1617
"sync/atomic"
1718
"time"
1819

19-
"github.com/0magnet/calvin"
2020
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo"
21+
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/calvin"
2122
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher"
2223
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cmdutil"
2324
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging"
@@ -37,6 +38,7 @@ var (
3738
dmsgcurlData string
3839
sk cipher.SecKey
3940
pk cipher.PubKey
41+
destPK cipher.PubKey
4042
dlog = logging.MustGetLogger("dmsgcurl")
4143
dmsgcurlAgent string
4244
logLvl string
@@ -118,6 +120,15 @@ var RootCmd = &cobra.Command{
118120
dlog.WithError(fmt.Errorf("failed to parse provided URL")).Error(errorDesc["URL_MALFORMAT"] + "\n")
119121
os.Exit(errorCode["URL_MALFORMAT"])
120122
}
123+
destSlc := strings.Split(parsedURL.Host, ":")
124+
if len(destSlc) == 1 {
125+
destSlc = append(destSlc, "80")
126+
}
127+
err = destPK.Set(destSlc[0])
128+
if err != nil {
129+
dlog.WithError(err).Fatal("bad PK for host\n")
130+
}
131+
121132
var cErr curlError
122133
if useHTTP {
123134
if len(dmsgDiscs) == 0 || dmsgDiscs[0] == "" {
@@ -205,14 +216,14 @@ func handleRequest(ctx context.Context, dmsgLogger *logging.Logger, pk cipher.Pu
205216
if !dmsgHTTP {
206217
dmsgC, closeDmsg, err = cli.StartDmsg(ctx, dmsgLogger, pk, sk, httpClient, dmsgDisc, dmsgSessions)
207218
} else {
208-
destination := strings.Split(parsedURL.Host, ":")[0]
209-
dmsgC, closeDmsg, err = cli.StartDmsgDirect(ctx, dmsgLogger, pk, sk, httpClient, dmsgDisc, dmsgSessions, destination)
219+
dmsgC, closeDmsg, err = cli.StartDmsgDirect(ctx, dmsgLogger, pk, sk, httpClient, dmsgDisc, dmsgSessions, destPK.String())
210220
}
211221
if err != nil {
212-
return curlError{
213-
Error: fmt.Errorf("%s", errorDesc["DMSG_INIT"]),
214-
Code: errorCode["DMSG_INIT"],
215-
}
222+
dlog.WithError(err).Debug("Error connecting to dmsg network")
223+
// return curlError{
224+
// Error: fmt.Errorf("%s", errorDesc["DMSG_INIT"]),
225+
// Code: errorCode["DMSG_INIT"],
226+
// }
216227
}
217228
defer closeDmsg()
218229

@@ -256,16 +267,43 @@ func handleRequest(ctx context.Context, dmsgLogger *logging.Logger, pk cipher.Pu
256267
req.Header.Set("Content-Type", "text/plain")
257268
}
258269
resp, err := httpC.Do(req)
270+
for attempts := 1; attempts <= 10; attempts++ {
271+
if err != nil {
272+
var netErr net.Error
273+
274+
if errors.As(err, &netErr) && netErr.Timeout() {
275+
dlog.WithError(err).Error("Failed to perform HTTP request\n")
276+
return curlError{
277+
Error: fmt.Errorf("%s", errorDesc["RECV_ERROR"]),
278+
Code: errorCode["RECV_ERROR"],
279+
}
280+
} else if errors.Is(err, context.DeadlineExceeded) {
281+
dlog.WithError(err).Error("Failed to perform HTTP request\n")
282+
return curlError{
283+
Error: fmt.Errorf("%s", errorDesc["RECV_ERROR"]),
284+
Code: errorCode["RECV_ERROR"],
285+
}
286+
}
287+
288+
dlog.WithError(err).Debugf("Attempt %d failed, retrying...\n", attempts)
289+
time.Sleep(time.Duration(attempts) * time.Second) // Exponential backoff
290+
resp, err = httpC.Do(req)
291+
continue
292+
}
293+
294+
defer resp.Body.Close() //nolint
295+
dlog.Debugf("Request succeeded with status code: %d\n", resp.StatusCode)
296+
break
297+
}
298+
259299
if err != nil {
260-
dlog.WithError(err).Error("Failed to preform HTTP request\n")
300+
dlog.WithError(err).Debug("Failed to perform HTTP request after maximum retries\n")
261301
return curlError{
262302
Error: fmt.Errorf("%s", errorDesc["RECV_ERROR"]),
263303
Code: errorCode["RECV_ERROR"],
264304
}
265305
}
266-
// if maxSize > 0 && resp.ContentLength > maxSize*1024 {
267-
// return fmt.Errorf("requested file size is more than allowed size: %d KB > %d KB", (resp.ContentLength / 1024), maxSize)
268-
// }
306+
269307
n, err := cancellableCopy(ctx, file, resp.Body, resp.ContentLength)
270308
if err != nil {
271309
dlog.WithError(err).Error(fmt.Sprintf("download failed at %d/%dB\n", n, resp.ContentLength))
@@ -324,7 +362,7 @@ func closeAndCleanFile(file *os.File, err error) {
324362

325363
func closeResponseBody(resp *http.Response) {
326364
if err := resp.Body.Close(); err != nil {
327-
dlog.WithError(err).Fatal("Failed to close response body\n")
365+
dlog.WithError(err).Debug("Failed to close response body\n")
328366
}
329367
}
330368

cmd/dmsghttp/commands/dmsghttp.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ import (
1313
"sync"
1414
"time"
1515

16-
"github.com/0magnet/calvin"
1716
"github.com/gin-gonic/gin"
1817
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo"
18+
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/calvin"
1919
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher"
2020
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cmdutil"
2121
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging"
@@ -148,19 +148,19 @@ func server() {
148148
dmsgC, closeDmsg, err = cli.StartDmsgDirect(ctx, dlog, pk, sk, httpClient, dmsgDisc, dmsgSessions, pk.String())
149149
}
150150
if err != nil {
151-
dlog.WithError(err).Fatal("Error connecting to dmsg network")
151+
dlog.WithError(err).Debug("Error connecting to dmsg network")
152152
return
153153
}
154154
defer closeDmsg()
155155

156156
lis, err := dmsgC.Listen(uint16(dmsgPort)) //nolint gosec
157157
if err != nil {
158-
log.WithError(err).Fatal()
158+
dlog.WithError(err).Debug()
159159
}
160160
go func() {
161161
<-ctx.Done()
162162
if err := lis.Close(); err != nil {
163-
log.WithError(err).Error()
163+
dlog.WithError(err).Debug()
164164
}
165165
}()
166166

@@ -186,9 +186,9 @@ func server() {
186186

187187
// Start serving
188188
go func() {
189-
log.WithField("dmsg_addr", lis.Addr().String()).Info("Serving...")
189+
log.WithField("dmsg_addr", lis.Addr().String()).Debug("Serving...\n")
190190
if err := serve.Serve(lis); err != nil && err != http.ErrServerClosed {
191-
log.Fatalf("Serve: %v", err)
191+
dlog.WithError(err).Debug("Server error\n")
192192
}
193193
wg.Done()
194194
}()

cmd/dmsgip/commands/dmsgip.go

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import (
1010
"path/filepath"
1111
"strings"
1212

13-
"github.com/0magnet/calvin"
1413
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo"
14+
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/calvin"
1515
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher"
1616
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cmdutil"
1717
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging"
@@ -100,10 +100,9 @@ var RootCmd = &cobra.Command{
100100
defer cancel()
101101

102102
httpClient = &http.Client{}
103-
var dialer proxy.Dialer = proxy.Direct // Default dialer is direct connection
103+
var dialer proxy.Dialer = proxy.Direct
104104

105105
if proxyAddr != "" {
106-
// Use SOCKS5 proxy dialer if specified
107106
dialer, err = proxy.SOCKS5("tcp", proxyAddr, nil, proxy.Direct)
108107
if err != nil {
109108
dlog.Fatalf("Error creating SOCKS5 dialer: %v", err)
@@ -128,11 +127,9 @@ var RootCmd = &cobra.Command{
128127
dmsgC, closeDmsg, err = cli.StartDmsgDirect(ctx, dlog, pk, sk, httpClient, dmsgDisc, dmsgSessions, pk.String())
129128
}
130129
if err != nil {
131-
dlog.WithError(err).Fatal("Error connecting to dmsg network")
132-
return err
130+
dlog.WithError(err).Debug("Error connecting to dmsg network")
133131
}
134132
defer closeDmsg()
135-
// Perform IP lookup using the context with the proxy dialer
136133
ip, err := dmsgC.LookupIP(ctx, srvs)
137134
if err != nil {
138135
dlog.WithError(err).Error("failed to lookup IP")

cmd/dmsgpty-cli/commands/root.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"strings"
1212

1313
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo"
14+
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/calvin"
1415
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cmdutil"
1516
"github.com/spf13/cobra"
1617

@@ -46,11 +47,8 @@ var RootCmd = &cobra.Command{
4647
return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0]
4748
}(),
4849
Short: "DMSG pseudoterminal command line interface",
49-
Long: `
50-
┌┬┐┌┬┐┌─┐┌─┐┌─┐┌┬┐┬ ┬ ┌─┐┬ ┬
51-
│││││└─┐│ ┬├─┘ │ └┬┘───│ │ │
52-
─┴┘┴ ┴└─┘└─┘┴ ┴ ┴ └─┘┴─┘┴
53-
DMSG pseudoterminal command line interface`,
50+
Long: calvin.AsciiFont("dmsgpty-cli") + `
51+
DMSG pseudoterminal command line interface`,
5452
SilenceErrors: true,
5553
SilenceUsage: true,
5654
DisableSuggestions: true,

cmd/dmsgpty-host/commands/root.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import (
1616
jsoniter "github.com/json-iterator/go"
1717
"github.com/sirupsen/logrus"
1818
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo"
19+
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/calvin"
1920
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher"
2021
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cmdutil"
2122
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging"
@@ -75,11 +76,8 @@ var RootCmd = &cobra.Command{
7576
return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0]
7677
}(),
7778
Short: "DMSG host for pseudoterminal command line interface",
78-
Long: `
79-
┌┬┐┌┬┐┌─┐┌─┐┌─┐┌┬┐┬ ┬ ┬ ┬┌─┐┌─┐┌┬┐
80-
│││││└─┐│ ┬├─┘ │ └┬┘───├─┤│ │└─┐ │
81-
─┴┘┴ ┴└─┘└─┘┴ ┴ ┴ ┴ ┴└─┘└─┘ ┴
82-
DMSG host for pseudoterminal command line interface`,
79+
Long: calvin.AsciiFont("dmsgpty-host") + `
80+
DMSG host for pseudoterminal (pty) command line interface`,
8381
SilenceErrors: true,
8482
SilenceUsage: true,
8583
DisableSuggestions: true,

cmd/dmsgweb/commands/dmsgweb.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,11 @@ import (
1616
"sync"
1717
"syscall"
1818

19-
"github.com/0magnet/calvin"
2019
"github.com/chen3feng/safecast"
2120
"github.com/confiant-inc/go-socks5"
2221
"github.com/gin-gonic/gin"
2322
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo"
23+
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/calvin"
2424
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher"
2525
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cmdutil"
2626
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging"

go.mod

Lines changed: 31 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -7,75 +7,74 @@ toolchain go1.24.2
77
require (
88
github.com/0magnet/calvin v0.0.0-20241204203002-126d3bcd81d8
99
github.com/ActiveState/termtest/conpty v0.5.0
10-
github.com/VictoriaMetrics/metrics v1.35.1
11-
github.com/bitfield/script v0.23.0
10+
github.com/VictoriaMetrics/metrics v1.36.0
11+
github.com/bitfield/script v0.24.1
1212
github.com/chen3feng/safecast v0.0.0-20220908170618-81b2ecd47937
13-
github.com/coder/websocket v1.8.12
13+
github.com/coder/websocket v1.8.13
1414
github.com/confiant-inc/go-socks5 v0.0.0-20210816151940-c1124825b1d6
15-
github.com/creack/pty v1.1.23
15+
github.com/creack/pty v1.1.24
1616
github.com/gin-gonic/gin v1.10.0
17-
github.com/go-chi/chi/v5 v5.2.0
17+
github.com/go-chi/chi/v5 v5.2.1
1818
github.com/go-redis/redis/v8 v8.11.5
1919
github.com/hashicorp/yamux v0.1.2
2020
github.com/ivanpirog/coloredcobra v1.0.1
2121
github.com/json-iterator/go v1.1.12
22-
github.com/pires/go-proxyproto v0.8.0
22+
github.com/pires/go-proxyproto v0.8.1
2323
github.com/sirupsen/logrus v1.9.3
2424
github.com/skycoin/noise v0.0.0-20180327030543-2492fe189ae6
25-
github.com/skycoin/skycoin v0.28.1-0.20241105130348-39b49a2d0a7f
26-
github.com/skycoin/skywire v1.3.29-rc7.0.20250414132907-330ec8cce85f
27-
github.com/spf13/cobra v1.8.1
25+
github.com/skycoin/skycoin v0.28.1-0.20241105130348-39b49a2d0a7f //DO NOT MODIFY OR UPDATE v0.28.1-0.20241105130348-39b49a2d0a7f
26+
github.com/skycoin/skywire v1.3.29-rc7.0.20250511174520-aee80a241891
27+
github.com/spf13/cobra v1.9.1
2828
github.com/stretchr/testify v1.10.0
29-
golang.org/x/net v0.36.0
30-
golang.org/x/sys v0.30.0
31-
golang.org/x/term v0.29.0
29+
golang.org/x/net v0.40.0
30+
golang.org/x/sys v0.33.0
31+
golang.org/x/term v0.32.0
3232
)
3333

3434
require (
35-
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
36-
github.com/bytedance/sonic v1.12.3 // indirect
37-
github.com/bytedance/sonic/loader v0.2.0 // indirect
35+
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
36+
github.com/bytedance/sonic v1.13.2 // indirect
37+
github.com/bytedance/sonic/loader v0.2.4 // indirect
3838
github.com/cespare/xxhash/v2 v2.3.0 // indirect
39-
github.com/cloudwego/base64x v0.1.4 // indirect
40-
github.com/cloudwego/iasm v0.2.0 // indirect
39+
github.com/cloudwego/base64x v0.1.5 // indirect
4140
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
4241
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
4342
github.com/fatih/color v1.18.0 // indirect
44-
github.com/gabriel-vasile/mimetype v1.4.6 // indirect
45-
github.com/gin-contrib/sse v0.1.0 // indirect
43+
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
44+
github.com/gin-contrib/sse v1.1.0 // indirect
4645
github.com/go-playground/locales v0.14.1 // indirect
4746
github.com/go-playground/universal-translator v0.18.1 // indirect
48-
github.com/go-playground/validator/v10 v10.22.1 // indirect
49-
github.com/goccy/go-json v0.10.3 // indirect
47+
github.com/go-playground/validator/v10 v10.26.0 // indirect
48+
github.com/goccy/go-json v0.10.5 // indirect
5049
github.com/inconshreveable/mousetrap v1.1.0 // indirect
51-
github.com/itchyny/gojq v0.12.16 // indirect
50+
github.com/itchyny/gojq v0.12.17 // indirect
5251
github.com/itchyny/timefmt-go v0.1.6 // indirect
53-
github.com/klauspost/cpuid/v2 v2.2.9 // indirect
52+
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
5453
github.com/leodido/go-urn v1.4.0 // indirect
55-
github.com/mattn/go-colorable v0.1.13 // indirect
54+
github.com/mattn/go-colorable v0.1.14 // indirect
5655
github.com/mattn/go-isatty v0.0.20 // indirect
5756
github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect
5857
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
5958
github.com/modern-go/reflect2 v1.0.2 // indirect
60-
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
59+
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
6160
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
62-
github.com/spf13/pflag v1.0.5 // indirect
61+
github.com/spf13/pflag v1.0.6 // indirect
6362
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
6463
github.com/ugorji/go/codec v1.2.12 // indirect
6564
github.com/valyala/fastrand v1.1.0 // indirect
6665
github.com/valyala/histogram v1.2.0 // indirect
67-
golang.org/x/arch v0.11.0 // indirect
68-
golang.org/x/crypto v0.35.0 // indirect
69-
golang.org/x/text v0.22.0 // indirect
70-
google.golang.org/protobuf v1.35.1 // indirect
66+
golang.org/x/arch v0.17.0 // indirect
67+
golang.org/x/crypto v0.38.0 // indirect
68+
golang.org/x/text v0.25.0 // indirect
69+
google.golang.org/protobuf v1.36.6 // indirect
7170
gopkg.in/yaml.v3 v3.0.1 // indirect
72-
mvdan.cc/sh/v3 v3.9.0 // indirect
71+
mvdan.cc/sh/v3 v3.11.0 // indirect
7372
)
7473

7574
// Uncomment for tests with alternate branches of 'skywire-utilities'
7675
//replace github.com/skycoin/skywire => ../skywire
7776
//replace github.com/skycoin/skywire => github.com/skycoin/skywire <commit-hash>
78-
//replace github.com/skycoin/skywire => github.com/skycoin/skywire v1.3.29-rc1.0.20241217211947-72c9d0b82083
77+
//replace github.com/skycoin/skywire => github.com/skycoin/skywire v1.3.29-rc7.0.20250511174520-aee80a241891
7978

8079
// replace github.com/skycoin/skywire-utilities => ../skywire-utilities
8180
// replace github.com/skycoin/skywire-utilities => github.com/skycoin/skywire-utilities

0 commit comments

Comments
 (0)