mirror of
https://github.com/zrepl/zrepl.git
synced 2024-11-23 00:43:51 +01:00
80 lines
1.7 KiB
Go
80 lines
1.7 KiB
Go
|
package cmd
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"github.com/spf13/cobra"
|
||
|
"github.com/zrepl/zrepl/rpc"
|
||
|
"github.com/zrepl/zrepl/sshbytestream"
|
||
|
"github.com/zrepl/zrepl/zfs"
|
||
|
"io"
|
||
|
golog "log"
|
||
|
"os"
|
||
|
)
|
||
|
|
||
|
var stdinserver struct {
|
||
|
identity string
|
||
|
}
|
||
|
|
||
|
var StdinserverCmd = &cobra.Command{
|
||
|
Use: "stdinserver",
|
||
|
Short: "start in stdin server mode (from authorized_keys file)",
|
||
|
Run: cmdStdinServer,
|
||
|
}
|
||
|
|
||
|
func init() {
|
||
|
StdinserverCmd.Flags().StringVar(&stdinserver.identity, "identity", "", "")
|
||
|
RootCmd.AddCommand(StdinserverCmd)
|
||
|
}
|
||
|
|
||
|
func cmdStdinServer(cmd *cobra.Command, args []string) {
|
||
|
|
||
|
var err error
|
||
|
defer func() {
|
||
|
if err != nil {
|
||
|
log.Printf("stdinserver exiting with error: %s", err)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
}()
|
||
|
|
||
|
if stdinserver.identity == "" {
|
||
|
err = fmt.Errorf("identity flag not set")
|
||
|
return
|
||
|
}
|
||
|
identity := stdinserver.identity
|
||
|
|
||
|
var sshByteStream io.ReadWriteCloser
|
||
|
if sshByteStream, err = sshbytestream.Incoming(); err != nil {
|
||
|
return
|
||
|
}
|
||
|
|
||
|
findMapping := func(cm []ClientMapping, identity string) zfs.DatasetMapping {
|
||
|
for i := range cm {
|
||
|
if cm[i].From == identity {
|
||
|
return cm[i].Mapping
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
sinkMapping := func(identity string) (sink zfs.DatasetMapping, err error) {
|
||
|
if sink = findMapping(conf.Sinks, identity); sink == nil {
|
||
|
return nil, fmt.Errorf("could not find sink for dataset")
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
sinkLogger := golog.New(logOut, fmt.Sprintf("sink[%s] ", identity), logFlags)
|
||
|
handler := Handler{
|
||
|
Logger: sinkLogger,
|
||
|
SinkMappingFunc: sinkMapping,
|
||
|
PullACL: findMapping(conf.PullACLs, identity),
|
||
|
}
|
||
|
|
||
|
if err = rpc.ListenByteStreamRPC(sshByteStream, identity, handler, sinkLogger); err != nil {
|
||
|
log.Printf("listenbytestreamerror: %#v\n", err)
|
||
|
os.Exit(1)
|
||
|
}
|
||
|
|
||
|
return
|
||
|
|
||
|
}
|