Skip to content

Commit f0a9a2e

Browse files
0pcommrpalide
andauthored
use embedded dmsghttp config for dmsg utilities (skycoin#298)
* implement dmsg-direct using embedded dmsghttp config for dmsgcurl * continue dmsghttp-config implementation for dmsgcurl * slight refactorization * fix typo * improve logging * continue improvements to logging * continue improvements to logging * continue improvements to logging * remove unneeded logging * fix typo * fix CI errors * update mohammed's revised error implementation * fix spelling * improve a part of code, as possible solution * remove ineffectual assignement * check error on PostEntry of destination * remove //TODO comment * standardize var naming, begin dmsghttp, add proxy for direct * continue implementing dmsg-direct for dmsghttp filee server * change destination pk * fix dmsgSession issue on curl * fix CI issues * implement dmsg-direct for dmsgip command * update dmsgsocks & dmsgweb to use dmsg-direect by default * make format * add error checks * check for errors when conneceting to dmsg * fix return * remove unused --------- Co-authored-by: Mohammed <[email protected]>
1 parent 12dcb90 commit f0a9a2e

File tree

19 files changed

+1179
-501
lines changed

19 files changed

+1179
-501
lines changed

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

Lines changed: 97 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package commands
33

44
import (
55
"context"
6-
"encoding/json"
76
"fmt"
87
"log"
98
"net/http"
@@ -13,25 +12,30 @@ import (
1312
"strings"
1413
"time"
1514

15+
"github.com/0magnet/calvin"
1616
socks5 "github.com/confiant-inc/go-socks5"
17-
"github.com/skycoin/skywire"
1817
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/buildinfo"
1918
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cipher"
19+
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/cmdutil"
2020
"github.com/skycoin/skywire/pkg/skywire-utilities/pkg/logging"
2121
"github.com/spf13/cobra"
2222

23-
"github.com/skycoin/dmsg/pkg/disc"
23+
"github.com/skycoin/dmsg/internal/cli"
2424
dmsg "github.com/skycoin/dmsg/pkg/dmsg"
2525
)
2626

2727
var (
28-
sk cipher.SecKey
29-
pubk string
30-
dmsgDisc string
31-
wl string
32-
wlkeys []cipher.PubKey
33-
proxyPort int
34-
dmsgPort uint16
28+
sk cipher.SecKey
29+
pubk string
30+
wl string
31+
wlkeys []cipher.PubKey
32+
proxyPort int
33+
dmsgPort uint16
34+
dmsgDisc = dmsg.DiscAddr(false)
35+
useHTTP bool
36+
httpClient *http.Client
37+
dmsgSessions int
38+
dlog *logging.Logger
3539
)
3640

3741
// Execute executes root CLI command.
@@ -41,20 +45,15 @@ func Execute() {
4145
}
4246
}
4347
func init() {
44-
var envServices skywire.EnvServices
45-
var services skywire.Services
46-
if err := json.Unmarshal(skywire.ServicesJSON, &envServices); err == nil {
47-
if err := json.Unmarshal(envServices.Prod, &services); err == nil {
48-
dmsgDisc = services.DmsgDiscovery
49-
}
50-
}
5148
RootCmd.AddCommand(
5249
serveCmd,
5350
proxyCmd,
5451
)
52+
5553
serveCmd.Flags().Uint16VarP(&dmsgPort, "dport", "q", 1081, "dmsg port to serve socks5")
5654
serveCmd.Flags().StringVarP(&wl, "wl", "w", "", "whitelist keys, comma separated")
5755
serveCmd.Flags().StringVarP(&dmsgDisc, "dmsg-disc", "D", dmsgDisc, "dmsg discovery url")
56+
serveCmd.Flags().BoolVarP(&useHTTP, "http", "z", false, "use regular http to connect to dmsg discovery")
5857
if os.Getenv("DMSGSK") != "" {
5958
sk.Set(os.Getenv("DMSGSK")) //nolint
6059
}
@@ -64,6 +63,7 @@ func init() {
6463
proxyCmd.Flags().Uint16VarP(&dmsgPort, "dport", "q", 1081, "dmsg port to connect to socks5 server")
6564
proxyCmd.Flags().StringVarP(&pubk, "pk", "k", "", "dmsg socks5 proxy server public key to connect to")
6665
proxyCmd.Flags().StringVarP(&dmsgDisc, "dmsg-disc", "D", dmsgDisc, "dmsg discovery url")
66+
proxyCmd.Flags().BoolVarP(&useHTTP, "http", "z", false, "use regular http to connect to dmsg discovery")
6767
if os.Getenv("DMSGSK") != "" {
6868
sk.Set(os.Getenv("DMSGSK")) //nolint
6969
}
@@ -77,11 +77,8 @@ var RootCmd = &cobra.Command{
7777
return strings.Split(filepath.Base(strings.ReplaceAll(strings.ReplaceAll(fmt.Sprintf("%v", os.Args), "[", ""), "]", "")), " ")[0]
7878
}(),
7979
Short: "DMSG socks5 proxy server & client",
80-
Long: `
81-
┌┬┐┌┬┐┌─┐┌─┐ ┌─┐┌─┐┌─┐┬┌─┌─┐
82-
│││││└─┐│ ┬───└─┐│ ││ ├┴┐└─┐
83-
─┴┘┴ ┴└─┘└─┘ └─┘└─┘└─┘┴ ┴└─┘
84-
DMSG socks5 proxy server & client`,
80+
Long: calvin.AsciiFont("dmsg-socks") + `
81+
DMSG socks5 proxy server & client`,
8582
SilenceErrors: true,
8683
SilenceUsage: true,
8784
DisableSuggestions: true,
@@ -93,17 +90,18 @@ DMSG socks5 proxy server & client`,
9390
var serveCmd = &cobra.Command{
9491
Use: "server",
9592
Short: "dmsg socks5 proxy server",
93+
Long: "dmsg socks5 proxy server",
9694
SilenceErrors: true,
9795
SilenceUsage: true,
9896
DisableSuggestions: true,
9997
DisableFlagsInUseLine: true,
10098
Run: func(_ *cobra.Command, _ []string) {
101-
log := logging.MustGetLogger("ssh-proxy")
99+
dlog = logging.MustGetLogger("dmsg-proxy")
102100
interrupt := make(chan os.Signal, 1)
103101
signal.Notify(interrupt, os.Interrupt)
104102
go func() {
105103
<-interrupt
106-
log.Info("Interrupt received. Shutting down...")
104+
dlog.Info("Interrupt received. Shutting down...")
107105
os.Exit(0)
108106
}()
109107
pk, err := sk.PubKey()
@@ -122,52 +120,66 @@ var serveCmd = &cobra.Command{
122120
}
123121
if len(wlkeys) > 0 {
124122
if len(wlkeys) == 1 {
125-
log.Info(fmt.Sprintf("%d key whitelisted", len(wlkeys)))
123+
dlog.Info(fmt.Sprintf("%d key whitelisted", len(wlkeys)))
126124
} else {
127-
log.Info(fmt.Sprintf("%d keys whitelisted", len(wlkeys)))
125+
dlog.Info(fmt.Sprintf("%d keys whitelisted", len(wlkeys)))
128126
}
129127
}
128+
129+
ctx, cancel := cmdutil.SignalContext(context.Background(), dlog)
130+
defer cancel()
130131
//TODO: implement whitelist logic
131-
respC := dmsg.NewClient(pk, sk, disc.NewHTTP(dmsgDisc, &http.Client{}, log), dmsg.DefaultConfig())
132-
go respC.Serve(context.Background())
133-
log.Infof("dmsg client pk: " + pk.String())
132+
var dmsgC *dmsg.Client
133+
var closeDmsg func()
134+
135+
if useHTTP {
136+
dlog.WithField("public_key", pk.String()).WithField("dmsg_disc", dmsgDisc).Debug("Connecting to dmsg network...")
137+
dmsgC, closeDmsg, err = cli.StartDmsg(ctx, dlog, pk, sk, httpClient, dmsgDisc, dmsgSessions)
138+
} else {
139+
dlog.WithField("public_key", pk.String()).Debug("Connecting to dmsg network...")
140+
dmsgC, closeDmsg, err = cli.StartDmsgDirect(ctx, dlog, pk, sk, httpClient, dmsgDisc, dmsgSessions, pk.String())
141+
}
142+
143+
if err != nil {
144+
dlog.WithError(err).Fatal("Error connecting to dmsg network")
145+
return
146+
}
147+
148+
defer closeDmsg()
149+
150+
dlog.Infof("dmsg client pk: " + pk.String())
134151
time.Sleep(time.Second)
135-
respL, err := respC.Listen(dmsgPort)
152+
dmsgL, err := dmsgC.Listen(dmsgPort)
136153
if err != nil {
137-
log.Fatalf("Error listening on port %d: %v", dmsgPort, err)
154+
dlog.Fatalf("Error listening on port %d: %v", dmsgPort, err)
138155
}
139156
defer func() {
140-
if err := respL.Close(); err != nil {
141-
log.Printf("Error closing listener: %v", err)
142-
}
143-
}()
144-
defer func() {
145-
if err := respC.Close(); err != nil {
146-
log.Errorf("Error closing DMSG client: %v", err)
157+
if err := dmsgL.Close(); err != nil {
158+
dlog.Printf("Error closing listener: %v", err)
147159
}
148160
}()
149161
for {
150-
respConn, err := respL.Accept()
162+
respConn, err := dmsgL.Accept()
151163
if err != nil {
152-
log.Errorf("Error accepting initiator: %v", err)
164+
dlog.Errorf("Error accepting initiator: %v", err)
153165
continue
154166
}
155-
log.Infof("Accepted connection from: %s", respConn.RemoteAddr())
167+
dlog.Infof("Accepted connection from: %s", respConn.RemoteAddr())
156168

157169
conf := &socks5.Config{}
158170
server, err := socks5.New(conf)
159171
if err != nil {
160-
log.Fatalf("Error creating SOCKS5 server: %v", err)
172+
dlog.Fatalf("Error creating SOCKS5 server: %v", err)
161173
}
162174
go func() {
163175
defer func() {
164176
if closeErr := respConn.Close(); closeErr != nil {
165-
log.Printf("Error closing client connection: %v", closeErr)
177+
dlog.Printf("Error closing client connection: %v", closeErr)
166178
}
167179
}()
168180
if err := server.ServeConn(respConn); err != nil {
169-
log.Infof("Connection closed: %s", respConn.RemoteAddr())
170-
log.Errorf("Error serving SOCKS5 proxy: %v", err)
181+
dlog.Infof("Connection closed: %s", respConn.RemoteAddr())
182+
dlog.Errorf("Error serving SOCKS5 proxy: %v", err)
171183
}
172184
}()
173185
}
@@ -176,49 +188,72 @@ var serveCmd = &cobra.Command{
176188

177189
// proxyCmd serves the local socks5 proxy
178190
var proxyCmd = &cobra.Command{
179-
Use: "client",
180-
Short: "socks5 proxy client for dmsg socks5 proxy server",
191+
Use: "client",
192+
Short: "socks5 proxy client for dmsg socks5 proxy server",
193+
Long: "socks5 proxy client for dmsg socks5 proxy server",
194+
SilenceErrors: true,
195+
SilenceUsage: true,
196+
DisableSuggestions: true,
197+
DisableFlagsInUseLine: true,
181198
Run: func(_ *cobra.Command, _ []string) {
182-
log := logging.MustGetLogger("ssh-proxy-client")
199+
dlog = logging.MustGetLogger("dmsg-proxy-client")
183200
var pubKey cipher.PubKey
184201
err := pubKey.Set(pubk)
185202
if err != nil {
186-
log.Fatal("Public key to connect to cannot be empty")
203+
dlog.Fatal("Public key to connect to cannot be empty")
187204
}
188205
pk, err := sk.PubKey()
189206
if err != nil {
190207
pk, sk = cipher.GenerateKeyPair()
191208
}
192-
initC := dmsg.NewClient(pk, sk, disc.NewHTTP(dmsgDisc, &http.Client{}, log), dmsg.DefaultConfig())
193-
go initC.Serve(context.Background())
194-
initL, err := initC.Listen(dmsgPort)
209+
210+
ctx, cancel := cmdutil.SignalContext(context.Background(), dlog)
211+
defer cancel()
212+
213+
var dmsgC *dmsg.Client
214+
var closeDmsg func()
215+
216+
if useHTTP {
217+
dlog.WithField("public_key", pk.String()).WithField("dmsg_disc", dmsgDisc).Debug("Connecting to dmsg network...")
218+
dmsgC, closeDmsg, err = cli.StartDmsg(ctx, dlog, pk, sk, httpClient, dmsgDisc, dmsgSessions)
219+
} else {
220+
dlog.WithField("public_key", pk.String()).Debug("Connecting to dmsg network...")
221+
dmsgC, closeDmsg, err = cli.StartDmsgDirect(ctx, dlog, pk, sk, httpClient, dmsgDisc, dmsgSessions, pk.String())
222+
}
223+
if err != nil {
224+
dlog.WithError(err).Fatal("Error connecting to dmsg network")
225+
return
226+
}
227+
228+
defer closeDmsg()
229+
dmsgL, err := dmsgC.Listen(dmsgPort)
195230
if err != nil {
196-
log.Fatalf("Error listening by initiator on port %d: %v", dmsgPort, err)
231+
dlog.Fatalf("Error listening by initiator on port %d: %v", dmsgPort, err)
197232
}
198233
defer func() {
199-
if err := initL.Close(); err != nil {
200-
log.Printf("Error closing initiator's listener: %v", err)
234+
if err := dmsgL.Close(); err != nil {
235+
dlog.Printf("Error closing initiator's listener: %v", err)
201236
}
202237
}()
203-
log.Infof("Socks5 proxy client connected on DMSG port %d", dmsgPort)
204-
initTp, err := initC.DialStream(context.Background(), dmsg.Addr{PK: pubKey, Port: dmsgPort})
238+
dlog.Infof("Socks5 proxy client connected on DMSG port %d", dmsgPort)
239+
initTp, err := dmsgC.DialStream(context.Background(), dmsg.Addr{PK: pubKey, Port: dmsgPort})
205240
if err != nil {
206-
log.Fatalf("Error dialing responder: %v", err)
241+
dlog.Fatalf("Error dialing responder: %v", err)
207242
}
208243
defer func() {
209244
if err := initTp.Close(); err != nil {
210-
log.Printf("Error closing initiator's stream: %v", err)
245+
dlog.Printf("Error closing initiator's stream: %v", err)
211246
}
212247
}()
213248
conf := &socks5.Config{}
214249
server, err := socks5.New(conf)
215250
if err != nil {
216-
log.Fatalf("Error creating SOCKS5 server: %v", err)
251+
dlog.Fatalf("Error creating SOCKS5 server: %v", err)
217252
}
218253
proxyListenAddr := fmt.Sprintf("127.0.0.1:%d", proxyPort)
219-
log.Infof("Serving SOCKS5 proxy on %s", proxyListenAddr)
254+
dlog.Infof("Serving SOCKS5 proxy on %s", proxyListenAddr)
220255
if err := server.ListenAndServe("tcp", proxyListenAddr); err != nil {
221-
log.Fatalf("Error serving SOCKS5 proxy: %v", err)
256+
dlog.Fatalf("Error serving SOCKS5 proxy: %v", err)
222257
}
223258
},
224259
}

0 commit comments

Comments
 (0)