zrepl/cmd/handler.go

100 lines
2.4 KiB
Go
Raw Normal View History

2017-04-26 20:21:18 +02:00
package main
import (
"github.com/zrepl/zrepl/rpc"
2017-04-26 20:25:53 +02:00
"github.com/zrepl/zrepl/zfs"
"io"
2017-04-26 20:21:18 +02:00
)
2017-04-26 20:25:53 +02:00
type Handler struct {
2017-05-07 12:28:03 +02:00
Logger Logger
PushMapping zfs.DatasetMapping
PullMapping zfs.DatasetMapping
}
2017-04-26 20:21:18 +02:00
func (h Handler) HandleFilesystemRequest(r rpc.FilesystemRequest) (roots []zfs.DatasetPath, err error) {
2017-05-07 12:28:03 +02:00
var mapping zfs.DatasetMapping
switch r.Direction {
case rpc.DirectionPush:
mapping = h.PushMapping
case rpc.DirectionPull:
mapping = h.PullMapping
}
h.Logger.Printf("handling fsr: %#v", r)
if roots, err = zfs.ZFSListMapping(mapping); err != nil {
h.Logger.Printf("handle fsr err: %v\n", err)
return
}
h.Logger.Printf("got filesystems: %#v", roots)
2017-04-26 20:21:18 +02:00
return
}
2017-05-03 17:12:15 +02:00
func (h Handler) HandleFilesystemVersionsRequest(r rpc.FilesystemVersionsRequest) (versions []zfs.FilesystemVersion, err error) {
2017-05-07 12:28:03 +02:00
// allowed to request that?
if _, err = h.PullMapping.Map(r.Filesystem); err != nil {
h.Logger.Printf("filesystem: %#v\n", r.Filesystem)
h.Logger.Printf("pull mapping: %#v\n", h.PullMapping)
h.Logger.Printf("allowed error: %#v\n", err)
return
}
h.Logger.Printf("allowed: %#v\n", r.Filesystem)
// find our versions
if versions, err = zfs.ZFSListFilesystemVersions(r.Filesystem); err != nil {
h.Logger.Printf("our versions error: %#v\n", err)
return
}
h.Logger.Printf("our versions: %#v\n", versions)
return
2017-05-07 12:28:03 +02:00
2017-05-03 17:12:15 +02:00
}
func (h Handler) HandleInitialTransferRequest(r rpc.InitialTransferRequest) (stream io.Reader, err error) {
2017-05-07 12:28:03 +02:00
h.Logger.Printf("handling initial transfer request: %#v", r)
// allowed to request that?
if _, err = h.PullMapping.Map(r.Filesystem); err != nil {
h.Logger.Printf("initial transfer request acl errror: %#v", err)
return
}
h.Logger.Printf("invoking zfs send")
if stream, err = zfs.ZFSSend(r.Filesystem, &r.FilesystemVersion, nil); err != nil {
h.Logger.Printf("error sending filesystem: %#v", err)
}
h.Logger.Printf("finished zfs send")
return
2017-05-07 12:28:03 +02:00
2017-04-26 20:21:18 +02:00
}
func (h Handler) HandleIncrementalTransferRequest(r rpc.IncrementalTransferRequest) (stream io.Reader, err error) {
2017-05-07 12:28:03 +02:00
h.Logger.Printf("handling incremental transfer request: %#v", r)
// allowed to request that?
if _, err = h.PullMapping.Map(r.Filesystem); err != nil {
h.Logger.Printf("incremental transfer request acl errror: %#v", err)
return
}
h.Logger.Printf("invoking zfs send")
if stream, err = zfs.ZFSSend(r.Filesystem, &r.From, &r.To); err != nil {
h.Logger.Printf("error sending filesystem: %#v", err)
}
h.Logger.Printf("finished zfs send")
return
2017-05-07 12:28:03 +02:00
2017-04-26 20:21:18 +02:00
}