@@ -3,7 +3,6 @@ package commands
33
44import (
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
2727var (
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}
4347func 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`,
9390var 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
178190var 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