start-stop-restart for TCP server

This commit is contained in:
idk
2019-05-18 10:43:57 -04:00
parent d5f792142e
commit 76b5f7acb2
10 changed files with 292 additions and 154 deletions

View File

@ -39,7 +39,7 @@ func (c *Conf) SetInQuantity(label ...string) {
if v, ok := c.GetInt("inbound.quantity", label...); ok { if v, ok := c.GetInt("inbound.quantity", label...); ok {
c.InQuantity = v c.InQuantity = v
} else { } else {
c.InQuantity = 5 c.InQuantity = 1
} }
} }
@ -48,6 +48,6 @@ func (c *Conf) SetOutQuantity(label ...string) {
if v, ok := c.GetInt("outbound.quantity", label...); ok { if v, ok := c.GetInt("outbound.quantity", label...); ok {
c.OutQuantity = v c.OutQuantity = v
} else { } else {
c.OutQuantity = 5 c.OutQuantity = 1
} }
} }

View File

@ -6,12 +6,12 @@
inbound.length = 3 inbound.length = 3
outbound.length = 3 outbound.length = 3
inbound.lengthVariance = 0 inbound.lengthVariance = 1
outbound.lengthVariance = 0 outbound.lengthVariance = 1
inbound.backupQuantity = 3 inbound.backupQuantity = 1
outbound.backupQuantity = 3 outbound.backupQuantity = 1
inbound.quantity = 5 inbound.quantity = 2
outbound.quantity = 5 outbound.quantity = 2
inbound.allowZeroHop = false inbound.allowZeroHop = false
outbound.allowZeroHop = false outbound.allowZeroHop = false
i2cp.encryptLeaseSet = false i2cp.encryptLeaseSet = false
@ -27,15 +27,15 @@ i2cp.enableBlackList = false
type = server type = server
host = 127.0.0.1 host = 127.0.0.1
port = 8081 port = 8081
inbound.length = 3 inbound.length = 2
outbound.length = 3 outbound.length = 2
keys = tcpserver keys = tcpserver
[sam-forwarder-tcp-client] [sam-forwarder-tcp-client]
type = client type = client
host = 127.0.0.1 host = 127.0.0.1
port = 8082 port = 8082
inbound.length = 3 inbound.length = 2
outbound.length = 3 outbound.length = 3
destination = i2p-projekt.i2p destination = i2p-projekt.i2p
keys = tcpclient keys = tcpclient

View File

@ -12,6 +12,7 @@ import (
import ( import (
"github.com/eyedeekay/sam-forwarder/i2pkeys" "github.com/eyedeekay/sam-forwarder/i2pkeys"
"github.com/eyedeekay/sam-forwarder/interface"
"github.com/eyedeekay/sam3" "github.com/eyedeekay/sam3"
"github.com/eyedeekay/sam3/i2pkeys" "github.com/eyedeekay/sam3/i2pkeys"
) )
@ -36,6 +37,7 @@ type SAMClientForwarder struct {
FilePath string FilePath string
file io.ReadWriter file io.ReadWriter
save bool save bool
up bool
// samcatd options // samcatd options
passfile string passfile string
@ -250,15 +252,45 @@ func (f *SAMClientForwarder) Serve() error {
} }
} }
func (f *SAMClientForwarder) Up() bool {
return f.up
}
//Close shuts the whole thing down. //Close shuts the whole thing down.
func (f *SAMClientForwarder) Close() error { func (f *SAMClientForwarder) Close() error {
var err error var err error
err = f.samConn.Close() err = f.samConn.Close()
f.up = false
err = f.connectStream.Close() err = f.connectStream.Close()
err = f.publishConnection.Close() err = f.publishConnection.Close()
return err return err
} }
func (s *SAMClientForwarder) Load() (samtunnel.SAMTunnel, error) {
if s.publishConnection, err = net.Listen("tcp", s.TargetHost+":"+s.TargetPort); err != nil {
return nil, err
}
if s.samConn, err = sam3.NewSAM(s.sam()); err != nil {
return nil, err
}
log.Println("SAM Bridge connection established.")
if s.save {
log.Println("Saving i2p keys")
}
if s.SamKeys, err = sfi2pkeys.Load(s.FilePath, s.TunName, s.passfile, s.samConn, s.save); err != nil {
return nil, err
}
log.Println("Destination keys generated, tunnel name:", s.TunName)
if s.save {
if err := sfi2pkeys.Save(s.FilePath, s.TunName, s.passfile, s.SamKeys); err != nil {
return nil, err
}
log.Println("Saved tunnel keys for", s.TunName)
}
s.up = true
return s, nil
}
//NewSAMClientForwarder makes a new SAM forwarder with default options, accepts host:port arguments //NewSAMClientForwarder makes a new SAM forwarder with default options, accepts host:port arguments
func NewSAMClientForwarder(host, port string) (*SAMClientForwarder, error) { func NewSAMClientForwarder(host, port string) (*SAMClientForwarder, error) {
return NewSAMClientForwarderFromOptions(SetClientHost(host), SetClientPort(port)) return NewSAMClientForwarderFromOptions(SetClientHost(host), SetClientPort(port))
@ -305,25 +337,9 @@ func NewSAMClientForwarderFromOptions(opts ...func(*SAMClientForwarder) error) (
return nil, err return nil, err
} }
} }
if s.publishConnection, err = net.Listen("tcp", s.TargetHost+":"+s.TargetPort); err != nil { l, e := s.Load()
return nil, err if e != nil {
return nil, e
} }
if s.samConn, err = sam3.NewSAM(s.sam()); err != nil { return l.(*SAMClientForwarder), nil
return nil, err
}
log.Println("SAM Bridge connection established.")
if s.save {
log.Println("Saving i2p keys")
}
if s.SamKeys, err = sfi2pkeys.Load(s.FilePath, s.TunName, s.passfile, s.samConn, s.save); err != nil {
return nil, err
}
log.Println("Destination keys generated, tunnel name:", s.TunName)
if s.save {
if err := sfi2pkeys.Save(s.FilePath, s.TunName, s.passfile, s.SamKeys); err != nil {
return nil, err
}
log.Println("Saved tunnel keys for", s.TunName)
}
return &s, nil
} }

View File

@ -15,6 +15,7 @@ import (
import ( import (
"github.com/eyedeekay/sam-forwarder/i2pkeys" "github.com/eyedeekay/sam-forwarder/i2pkeys"
"github.com/eyedeekay/sam-forwarder/interface"
"github.com/eyedeekay/sam3" "github.com/eyedeekay/sam3"
"github.com/eyedeekay/sam3/i2pkeys" "github.com/eyedeekay/sam3/i2pkeys"
) )
@ -38,6 +39,7 @@ type SAMForwarder struct {
FilePath string FilePath string
file io.ReadWriter file io.ReadWriter
save bool save bool
up bool
Type string Type string
@ -358,16 +360,43 @@ func (f *SAMForwarder) Serve() error {
} }
} }
func (f *SAMForwarder) Up() bool {
return f.up
}
//Close shuts the whole thing down. //Close shuts the whole thing down.
func (f *SAMForwarder) Close() error { func (f *SAMForwarder) Close() error {
var err error var err error
err = f.samConn.Close() err = f.samConn.Close()
f.up = false
err = f.publishStream.Close() err = f.publishStream.Close()
err = f.publishListen.Close() err = f.publishListen.Close()
err = f.publishConnection.Close() err = f.publishConnection.Close()
return err return err
} }
func (s *SAMForwarder) Load() (samtunnel.SAMTunnel, error) {
if s.samConn, err = sam3.NewSAM(s.sam()); err != nil {
return nil, err
}
log.Println("SAM Bridge connection established.")
if s.save {
log.Println("Saving i2p keys")
}
if s.SamKeys, err = sfi2pkeys.Load(s.FilePath, s.TunName, s.passfile, s.samConn, s.save); err != nil {
return nil, err
}
log.Println("Destination keys generated, tunnel name:", s.TunName)
if s.save {
if err := sfi2pkeys.Save(s.FilePath, s.TunName, s.passfile, s.SamKeys); err != nil {
return nil, err
}
log.Println("Saved tunnel keys for", s.TunName)
}
s.up = true
return s, nil
}
//NewSAMForwarder makes a new SAM forwarder with default options, accepts host:port arguments //NewSAMForwarder makes a new SAM forwarder with default options, accepts host:port arguments
func NewSAMForwarder(host, port string) (*SAMForwarder, error) { func NewSAMForwarder(host, port string) (*SAMForwarder, error) {
return NewSAMForwarderFromOptions(SetHost(host), SetPort(port)) return NewSAMForwarderFromOptions(SetHost(host), SetPort(port))
@ -414,22 +443,9 @@ func NewSAMForwarderFromOptions(opts ...func(*SAMForwarder) error) (*SAMForwarde
return nil, err return nil, err
} }
} }
if s.samConn, err = sam3.NewSAM(s.sam()); err != nil { l, e := s.Load()
return nil, err if e != nil {
return nil, e
} }
log.Println("SAM Bridge connection established.") return l.(*SAMForwarder), nil
if s.save {
log.Println("Saving i2p keys")
}
if s.SamKeys, err = sfi2pkeys.Load(s.FilePath, s.TunName, s.passfile, s.samConn, s.save); err != nil {
return nil, err
}
log.Println("Destination keys generated, tunnel name:", s.TunName)
if s.save {
if err := sfi2pkeys.Save(s.FilePath, s.TunName, s.passfile, s.SamKeys); err != nil {
return nil, err
}
log.Println("Saved tunnel keys for", s.TunName)
}
return &s, nil
} }

View File

@ -37,16 +37,51 @@ func (t *TunnelHandler) Printdivf(id, key, value string, rw http.ResponseWriter,
} }
func (t *TunnelHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) { func (t *TunnelHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
if strings.HasSuffix(req.URL.Path, "color") {
fmt.Fprintf(rw, " <div id=\"%s\" class=\"%s\" >", t.SAMTunnel.ID(), t.SAMTunnel.GetType())
}
if err := req.ParseForm(); err == nil { if err := req.ParseForm(); err == nil {
if action := req.PostFormValue("action"); action != "" { if action := req.PostFormValue("action"); action != "" {
fmt.Fprintf(rw, "%s", action) var err error
return switch action {
case "start":
if !t.SAMTunnel.Up() {
fmt.Println("Starting tunnel", t.ID())
if t.SAMTunnel, err = t.Load(); err == nil {
t.Serve()
}
//return
} else {
fmt.Println(t.ID(), "already started")
req.URL.Path = req.URL.Path + "/color"
}
case "stop":
if t.SAMTunnel.Up() {
fmt.Println("Stopping tunnel", t.ID())
t.Close()
} else {
fmt.Println(t.ID(), "already stopped")
req.URL.Path = req.URL.Path + "/color"
}
case "restart":
if t.SAMTunnel.Up() {
fmt.Println("Stopping tunnel", t.ID())
t.Close()
fmt.Println("Starting tunnel", t.ID())
if t.SAMTunnel, err = t.Load(); err == nil {
t.Serve()
}
return
} else {
fmt.Println(t.ID(), "stopped.")
req.URL.Path = req.URL.Path + "/color"
}
default:
}
} }
} }
if strings.HasSuffix(req.URL.Path, "color") {
fmt.Fprintf(rw, " <div id=\"%s\" class=\"%s\" >", t.SAMTunnel.ID(), t.SAMTunnel.GetType())
}
t.Printdivf(t.SAMTunnel.ID(), "TunName", t.SAMTunnel.ID(), rw, req) t.Printdivf(t.SAMTunnel.ID(), "TunName", t.SAMTunnel.ID(), rw, req)
fmt.Fprintf(rw, " <span id=\"toggle%s\" class=\"control\">\n", t.SAMTunnel.ID()) fmt.Fprintf(rw, " <span id=\"toggle%s\" class=\"control\">\n", t.SAMTunnel.ID())
fmt.Fprintf(rw, " <a href=\"#\" onclick=\"toggle_visibility_class('%s');\"> Show/Hide %s</a><br>\n", t.SAMTunnel.ID(), t.SAMTunnel.ID()) fmt.Fprintf(rw, " <a href=\"#\" onclick=\"toggle_visibility_class('%s');\"> Show/Hide %s</a><br>\n", t.SAMTunnel.ID(), t.SAMTunnel.ID())

View File

@ -13,4 +13,6 @@ type SAMTunnel interface {
Base64() string Base64() string
Serve() error Serve() error
Close() error Close() error
Up() bool
Load() (SAMTunnel, error)
} }

View File

@ -11,6 +11,7 @@ import (
import ( import (
"github.com/eyedeekay/sam-forwarder/i2pkeys" "github.com/eyedeekay/sam-forwarder/i2pkeys"
"github.com/eyedeekay/sam-forwarder/interface"
"github.com/eyedeekay/sam3" "github.com/eyedeekay/sam3"
"github.com/eyedeekay/sam3/i2pkeys" "github.com/eyedeekay/sam3/i2pkeys"
) )
@ -35,6 +36,7 @@ type SAMClientForwarder struct {
FilePath string FilePath string
file io.ReadWriter file io.ReadWriter
save bool save bool
up bool
// samcatd options // samcatd options
passfile string passfile string
@ -249,15 +251,45 @@ func (f *SAMClientForwarder) Serve() error {
} }
} }
func (f *SAMClientForwarder) Up() bool {
return f.up
}
//Close shuts the whole thing down. //Close shuts the whole thing down.
func (f *SAMClientForwarder) Close() error { func (f *SAMClientForwarder) Close() error {
var err error var err error
err = f.samConn.Close() err = f.samConn.Close()
f.up = false
err = f.connectStream.Close() err = f.connectStream.Close()
err = f.publishConnection.Close() err = f.publishConnection.Close()
return err return err
} }
func (s *SAMClientForwarder) Load() (samtunnel.SAMTunnel, error) {
if s.publishConnection, err = net.Listen("tcp", s.TargetHost+":"+s.TargetPort); err != nil {
return nil, err
}
if s.samConn, err = sam3.NewSAM(s.sam()); err != nil {
return nil, err
}
log.Println("SAM Bridge connection established.")
if s.save {
log.Println("Saving i2p keys")
}
if s.SamKeys, err = sfi2pkeys.Load(s.FilePath, s.TunName, s.passfile, s.samConn, s.save); err != nil {
return nil, err
}
log.Println("Destination keys generated, tunnel name:", s.TunName)
if s.save {
if err := sfi2pkeys.Save(s.FilePath, s.TunName, s.passfile, s.SamKeys); err != nil {
return nil, err
}
log.Println("Saved tunnel keys for", s.TunName)
}
s.up = true
return s, nil
}
//NewSAMClientForwarder makes a new SAM forwarder with default options, accepts host:port arguments //NewSAMClientForwarder makes a new SAM forwarder with default options, accepts host:port arguments
func NewSAMClientForwarder(host, port string) (*SAMClientForwarder, error) { func NewSAMClientForwarder(host, port string) (*SAMClientForwarder, error) {
return NewSAMClientForwarderFromOptions(SetClientHost(host), SetClientPort(port)) return NewSAMClientForwarderFromOptions(SetClientHost(host), SetClientPort(port))
@ -304,25 +336,9 @@ func NewSAMClientForwarderFromOptions(opts ...func(*SAMClientForwarder) error) (
return nil, err return nil, err
} }
} }
if s.publishConnection, err = net.Listen("tcp", s.TargetHost+":"+s.TargetPort); err != nil { l, e := s.Load()
return nil, err if e != nil {
return nil, e
} }
if s.samConn, err = sam3.NewSAM(s.sam()); err != nil { return l.(*SAMClientForwarder), nil
return nil, err
}
log.Println("SAM Bridge connection established.")
if s.save {
log.Println("Saving i2p keys")
}
if s.SamKeys, err = sfi2pkeys.Load(s.FilePath, s.TunName, s.passfile, s.samConn, s.save); err != nil {
return nil, err
}
log.Println("Destination keys generated, tunnel name:", s.TunName)
if s.save {
if err := sfi2pkeys.Save(s.FilePath, s.TunName, s.passfile, s.SamKeys); err != nil {
return nil, err
}
log.Println("Saved tunnel keys for", s.TunName)
}
return &s, nil
} }

View File

@ -14,6 +14,7 @@ import (
import ( import (
"github.com/eyedeekay/sam-forwarder/i2pkeys" "github.com/eyedeekay/sam-forwarder/i2pkeys"
"github.com/eyedeekay/sam-forwarder/interface"
"github.com/eyedeekay/sam3" "github.com/eyedeekay/sam3"
"github.com/eyedeekay/sam3/i2pkeys" "github.com/eyedeekay/sam3/i2pkeys"
) )
@ -28,15 +29,15 @@ type SAMForwarder struct {
TargetHost string TargetHost string
TargetPort string TargetPort string
samConn *sam3.SAM samConn *sam3.SAM
SamKeys i2pkeys.I2PKeys SamKeys i2pkeys.I2PKeys
publishStream *sam3.StreamSession publishStream *sam3.StreamSession
publishListen *sam3.StreamListener publishListen *sam3.StreamListener
publishConnection net.Conn
FilePath string FilePath string
file io.ReadWriter file io.ReadWriter
save bool save bool
up bool
Type string Type string
@ -89,7 +90,6 @@ func (f *SAMForwarder) ID() string {
func (f *SAMForwarder) Cleanup() { func (f *SAMForwarder) Cleanup() {
f.publishStream.Close() f.publishStream.Close()
f.publishListen.Close() f.publishListen.Close()
f.publishConnection.Close()
f.samConn.Close() f.samConn.Close()
} }
@ -280,6 +280,9 @@ func (f *SAMForwarder) connUnlockAndClose(cli, conn bool, connection *sam3.SAMCo
} }
func (f *SAMForwarder) forward(conn *sam3.SAMConn) { //(conn net.Conn) { func (f *SAMForwarder) forward(conn *sam3.SAMConn) { //(conn net.Conn) {
if !f.Up() {
return
}
var request *http.Request var request *http.Request
var requestbytes []byte var requestbytes []byte
var responsebytes []byte var responsebytes []byte
@ -335,38 +338,70 @@ func (f *SAMForwarder) Base64() string {
//Serve starts the SAM connection and and forwards the local host:port to i2p //Serve starts the SAM connection and and forwards the local host:port to i2p
func (f *SAMForwarder) Serve() error { func (f *SAMForwarder) Serve() error {
//lsk, lspk, lspsk := f.leasesetsettings() //lsk, lspk, lspsk := f.leasesetsettings()
if f.publishStream, err = f.samConn.NewStreamSession(f.TunName, f.SamKeys, f.print()); err != nil { if f.Up() {
log.Println("Stream Creation error:", err.Error()) if f.publishStream, err = f.samConn.NewStreamSession(f.TunName, f.SamKeys, f.print()); err != nil {
return err log.Println("Stream Creation error:", err.Error())
} return err
log.Println("SAM stream session established.") }
if f.publishListen, err = f.publishStream.Listen(); err != nil { log.Println("SAM stream session established.")
return err if f.publishListen, err = f.publishStream.Listen(); err != nil {
} return err
log.Println("Starting Listener.") }
b := string(f.SamKeys.Addr().Base32()) log.Println("Starting Listener.")
log.Println("SAM Listener created,", b) b := string(f.SamKeys.Addr().Base32())
log.Println("SAM Listener created,", b)
for {
conn, err := f.publishListen.AcceptI2P() for {
if err != nil { conn, err := f.publishListen.AcceptI2P()
log.Fatalf("ERROR: failed to accept listener: %v", err) if err != nil {
log.Printf("ERROR: failed to accept listener: %v", err)
return nil
}
defer conn.Close()
log.Printf("Accepted connection %v\n", conn)
go f.forward(conn)
} }
log.Printf("Accepted connection %v\n", conn)
go f.forward(conn)
} }
return nil
}
func (f *SAMForwarder) Up() bool {
return f.up
} }
//Close shuts the whole thing down. //Close shuts the whole thing down.
func (f *SAMForwarder) Close() error { func (f *SAMForwarder) Close() error {
var err error var err error
err = f.samConn.Close() //err = f.samConn.Close()
f.up = false
err = f.publishStream.Close() err = f.publishStream.Close()
err = f.publishListen.Close() //err = f.samConn.Close()
err = f.publishConnection.Close() //err = f.publishListen.Close()
return err return err
} }
func (s *SAMForwarder) Load() (samtunnel.SAMTunnel, error) {
if s.samConn, err = sam3.NewSAM(s.sam()); err != nil {
return nil, err
}
log.Println("SAM Bridge connection established.")
if s.save {
log.Println("Saving i2p keys")
}
if s.SamKeys, err = sfi2pkeys.Load(s.FilePath, s.TunName, s.passfile, s.samConn, s.save); err != nil {
return nil, err
}
log.Println("Destination keys generated, tunnel name:", s.TunName)
if s.save {
if err := sfi2pkeys.Save(s.FilePath, s.TunName, s.passfile, s.SamKeys); err != nil {
return nil, err
}
log.Println("Saved tunnel keys for", s.TunName)
}
s.up = true
return s, nil
}
//NewSAMForwarder makes a new SAM forwarder with default options, accepts host:port arguments //NewSAMForwarder makes a new SAM forwarder with default options, accepts host:port arguments
func NewSAMForwarder(host, port string) (*SAMForwarder, error) { func NewSAMForwarder(host, port string) (*SAMForwarder, error) {
return NewSAMForwarderFromOptions(SetHost(host), SetPort(port)) return NewSAMForwarderFromOptions(SetHost(host), SetPort(port))
@ -413,22 +448,9 @@ func NewSAMForwarderFromOptions(opts ...func(*SAMForwarder) error) (*SAMForwarde
return nil, err return nil, err
} }
} }
if s.samConn, err = sam3.NewSAM(s.sam()); err != nil { l, e := s.Load()
return nil, err if e != nil {
return nil, e
} }
log.Println("SAM Bridge connection established.") return l.(*SAMForwarder), nil
if s.save {
log.Println("Saving i2p keys")
}
if s.SamKeys, err = sfi2pkeys.Load(s.FilePath, s.TunName, s.passfile, s.samConn, s.save); err != nil {
return nil, err
}
log.Println("Destination keys generated, tunnel name:", s.TunName)
if s.save {
if err := sfi2pkeys.Save(s.FilePath, s.TunName, s.passfile, s.SamKeys); err != nil {
return nil, err
}
log.Println("Saved tunnel keys for", s.TunName)
}
return &s, nil
} }

View File

@ -13,6 +13,7 @@ import (
import ( import (
"github.com/eyedeekay/sam-forwarder/i2pkeys" "github.com/eyedeekay/sam-forwarder/i2pkeys"
"github.com/eyedeekay/sam-forwarder/interface"
"github.com/eyedeekay/sam3" "github.com/eyedeekay/sam3"
"github.com/eyedeekay/sam3/i2pkeys" "github.com/eyedeekay/sam3/i2pkeys"
) )
@ -38,6 +39,7 @@ type SAMSSUClientForwarder struct {
FilePath string FilePath string
file io.ReadWriter file io.ReadWriter
save bool save bool
up bool
// samcatd options // samcatd options
passfile string passfile string
@ -87,6 +89,8 @@ func (f *SAMSSUClientForwarder) Cleanup() {
} }
func (f *SAMSSUClientForwarder) Close() error { func (f *SAMSSUClientForwarder) Close() error {
f.Cleanup()
f.up = false
return nil return nil
} }
@ -249,6 +253,10 @@ func (f *SAMSSUClientForwarder) forward(conn net.PacketConn) {
}() }()
} }
func (f *SAMSSUClientForwarder) Up() bool {
return f.up
}
//Serve starts the SAM connection and and forwards the local host:port to i2p //Serve starts the SAM connection and and forwards the local host:port to i2p
func (f *SAMSSUClientForwarder) Serve() error { func (f *SAMSSUClientForwarder) Serve() error {
if f.addr, err = f.samConn.Lookup(f.dest); err != nil { if f.addr, err = f.samConn.Lookup(f.dest); err != nil {
@ -272,6 +280,31 @@ func (f *SAMSSUClientForwarder) Serve() error {
return nil return nil
} }
func (s *SAMSSUClientForwarder) Load() (samtunnel.SAMTunnel, error) {
if s.publishConnection, err = net.ListenPacket("udp", s.TargetHost+":"+s.TargetPort); err != nil {
return nil, err
}
if s.samConn, err = sam3.NewSAM(s.sam()); err != nil {
return nil, err
}
log.Println("SAM Bridge connection established.")
if s.save {
log.Println("Saving i2p keys")
}
if s.SamKeys, err = sfi2pkeys.Load(s.FilePath, s.TunName, s.passfile, s.samConn, s.save); err != nil {
return nil, err
}
log.Println("Destination keys generated, tunnel name:", s.TunName)
if s.save {
if err := sfi2pkeys.Save(s.FilePath, s.TunName, s.passfile, s.SamKeys); err != nil {
return nil, err
}
log.Println("Saved tunnel keys for", s.TunName)
}
s.up = true
return s, nil
}
//NewSAMSSUClientForwarderFromOptions makes a new SAM forwarder with default options, accepts host:port arguments //NewSAMSSUClientForwarderFromOptions makes a new SAM forwarder with default options, accepts host:port arguments
func NewSAMSSUClientForwarderFromOptions(opts ...func(*SAMSSUClientForwarder) error) (*SAMSSUClientForwarder, error) { func NewSAMSSUClientForwarderFromOptions(opts ...func(*SAMSSUClientForwarder) error) (*SAMSSUClientForwarder, error) {
var s SAMSSUClientForwarder var s SAMSSUClientForwarder
@ -313,25 +346,9 @@ func NewSAMSSUClientForwarderFromOptions(opts ...func(*SAMSSUClientForwarder) er
return nil, err return nil, err
} }
} }
if s.publishConnection, err = net.ListenPacket("udp", s.TargetHost+":"+s.TargetPort); err != nil { l, e := s.Load()
return nil, err if e != nil {
return nil, e
} }
if s.samConn, err = sam3.NewSAM(s.sam()); err != nil { return l.(*SAMSSUClientForwarder), nil
return nil, err
}
log.Println("SAM Bridge connection established.")
if s.save {
log.Println("Saving i2p keys")
}
if s.SamKeys, err = sfi2pkeys.Load(s.FilePath, s.TunName, s.passfile, s.samConn, s.save); err != nil {
return nil, err
}
log.Println("Destination keys generated, tunnel name:", s.TunName)
if s.save {
if err := sfi2pkeys.Save(s.FilePath, s.TunName, s.passfile, s.SamKeys); err != nil {
return nil, err
}
log.Println("Saved tunnel keys for", s.TunName)
}
return &s, nil
} }

View File

@ -13,6 +13,7 @@ import (
import ( import (
"github.com/eyedeekay/sam-forwarder/i2pkeys" "github.com/eyedeekay/sam-forwarder/i2pkeys"
"github.com/eyedeekay/sam-forwarder/interface"
"github.com/eyedeekay/sam3" "github.com/eyedeekay/sam3"
"github.com/eyedeekay/sam3/i2pkeys" "github.com/eyedeekay/sam3/i2pkeys"
) )
@ -36,6 +37,7 @@ type SAMSSUForwarder struct {
FilePath string FilePath string
file io.ReadWriter file io.ReadWriter
save bool save bool
up bool
// samcatd options // samcatd options
passfile string passfile string
@ -269,6 +271,31 @@ func (f *SAMSSUForwarder) Serve() error {
} }
} }
func (s *SAMSSUForwarder) Load() (samtunnel.SAMTunnel, error) {
if s.samConn, err = sam3.NewSAM(s.sam()); err != nil {
return nil, err
}
log.Println("SAM Bridge connection established.")
if s.save {
log.Println("Saving i2p keys")
}
if s.SamKeys, err = sfi2pkeys.Load(s.FilePath, s.TunName, s.passfile, s.samConn, s.save); err != nil {
return nil, err
}
log.Println("Destination keys generated, tunnel name:", s.TunName)
if s.save {
if err := sfi2pkeys.Save(s.FilePath, s.TunName, s.passfile, s.SamKeys); err != nil {
return nil, err
}
log.Println("Saved tunnel keys for", s.TunName)
}
s.up = true
return s, nil
}
func (f *SAMSSUForwarder) Up() bool {
return f.up
}
//NewSAMSSUForwarder makes a new SAM forwarder with default options, accepts host:port arguments //NewSAMSSUForwarder makes a new SAM forwarder with default options, accepts host:port arguments
func NewSAMSSUForwarder(host, port string) (*SAMSSUForwarder, error) { func NewSAMSSUForwarder(host, port string) (*SAMSSUForwarder, error) {
return NewSAMSSUForwarderFromOptions(SetHost(host), SetPort(port)) return NewSAMSSUForwarderFromOptions(SetHost(host), SetPort(port))
@ -313,22 +340,9 @@ func NewSAMSSUForwarderFromOptions(opts ...func(*SAMSSUForwarder) error) (*SAMSS
return nil, err return nil, err
} }
} }
if s.samConn, err = sam3.NewSAM(s.sam()); err != nil { l, e := s.Load()
return nil, err if e != nil {
return nil, e
} }
log.Println("SAM Bridge connection established.") return l.(*SAMSSUForwarder), nil
if s.save {
log.Println("Saving i2p keys")
}
if s.SamKeys, err = sfi2pkeys.Load(s.FilePath, s.TunName, s.passfile, s.samConn, s.save); err != nil {
return nil, err
}
log.Println("Destination keys generated, tunnel name:", s.TunName)
if s.save {
if err := sfi2pkeys.Save(s.FilePath, s.TunName, s.passfile, s.SamKeys); err != nil {
return nil, err
}
log.Println("Saved tunnel keys for", s.TunName)
}
return &s, nil
} }