mirror of
https://github.com/zrepl/zrepl.git
synced 2024-11-27 02:45:20 +01:00
80 lines
1.8 KiB
Go
80 lines
1.8 KiB
Go
package serve
|
|
|
|
import (
|
|
"github.com/problame/go-netssh"
|
|
"github.com/zrepl/zrepl/config"
|
|
"github.com/zrepl/zrepl/daemon/nethelpers"
|
|
"io"
|
|
"net"
|
|
"path"
|
|
"time"
|
|
)
|
|
|
|
type StdinserverListenerFactory struct {
|
|
ClientIdentity string
|
|
sockpath string
|
|
}
|
|
|
|
func StdinserverListenerFactoryFromConfig(g *config.Global, in *config.StdinserverServer) (f *StdinserverListenerFactory, err error) {
|
|
|
|
f = &StdinserverListenerFactory{
|
|
ClientIdentity: in.ClientIdentity,
|
|
}
|
|
|
|
f.sockpath = path.Join(g.Serve.StdinServer.SockDir, f.ClientIdentity)
|
|
|
|
return
|
|
}
|
|
|
|
func (f *StdinserverListenerFactory) Listen() (net.Listener, error) {
|
|
|
|
if err := nethelpers.PreparePrivateSockpath(f.sockpath); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
l, err := netssh.Listen(f.sockpath)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return StdinserverListener{l}, nil
|
|
}
|
|
|
|
type StdinserverListener struct {
|
|
l *netssh.Listener
|
|
}
|
|
|
|
func (l StdinserverListener) Addr() net.Addr {
|
|
return netsshAddr{}
|
|
}
|
|
|
|
func (l StdinserverListener) Accept() (net.Conn, error) {
|
|
c, err := l.l.Accept()
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return netsshConnToNetConnAdatper{c}, nil
|
|
}
|
|
|
|
func (l StdinserverListener) Close() (err error) {
|
|
return l.l.Close()
|
|
}
|
|
|
|
type netsshAddr struct{}
|
|
|
|
func (netsshAddr) Network() string { return "netssh" }
|
|
func (netsshAddr) String() string { return "???" }
|
|
|
|
type netsshConnToNetConnAdatper struct {
|
|
io.ReadWriteCloser // works for both netssh.SSHConn and netssh.ServeConn
|
|
}
|
|
|
|
func (netsshConnToNetConnAdatper) LocalAddr() net.Addr { return netsshAddr{} }
|
|
|
|
func (netsshConnToNetConnAdatper) RemoteAddr() net.Addr { return netsshAddr{} }
|
|
|
|
func (netsshConnToNetConnAdatper) SetDeadline(t time.Time) error { return nil }
|
|
|
|
func (netsshConnToNetConnAdatper) SetReadDeadline(t time.Time) error { return nil }
|
|
|
|
func (netsshConnToNetConnAdatper) SetWriteDeadline(t time.Time) error { return nil }
|