mirror of
https://github.com/openziti/zrok.git
synced 2025-06-25 12:12:32 +02:00
for when the drive source is a file instead of a directory (#438)
This commit is contained in:
parent
cbb69373f4
commit
103b60c2c2
@ -27,9 +27,18 @@ func NewFilesystemTarget(cfg *FilesystemTargetConfig) *FilesystemTarget {
|
||||
}
|
||||
|
||||
func (t *FilesystemTarget) Inventory() ([]*Object, error) {
|
||||
if _, err := os.Stat(t.cfg.Root); os.IsNotExist(err) {
|
||||
fi, err := os.Stat(t.cfg.Root)
|
||||
if os.IsNotExist(err) {
|
||||
return nil, nil
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if !fi.IsDir() {
|
||||
return []*Object{{Path: t.cfg.Root, Size: fi.Size(), Modified: fi.ModTime()}}, nil
|
||||
}
|
||||
|
||||
t.tree = nil
|
||||
if err := fs.WalkDir(t.root, ".", t.recurse); err != nil {
|
||||
return nil, err
|
||||
@ -37,6 +46,10 @@ func (t *FilesystemTarget) Inventory() ([]*Object, error) {
|
||||
return t.tree, nil
|
||||
}
|
||||
|
||||
func (t *FilesystemTarget) IsDir() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
func (t *FilesystemTarget) recurse(path string, d fs.DirEntry, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -15,6 +15,7 @@ type Object struct {
|
||||
|
||||
type Target interface {
|
||||
Inventory() ([]*Object, error)
|
||||
IsDir() bool
|
||||
ReadStream(path string) (io.ReadCloser, error)
|
||||
WriteStream(path string, stream io.Reader, mode os.FileMode) error
|
||||
SetModificationTime(path string, mtime time.Time) error
|
||||
|
@ -33,18 +33,18 @@ func Synchronize(src, dst Target) error {
|
||||
}
|
||||
}
|
||||
|
||||
for _, target := range copyList {
|
||||
ss, err := src.ReadStream(target.Path)
|
||||
for _, copyPath := range copyList {
|
||||
ss, err := src.ReadStream(copyPath.Path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := dst.WriteStream(target.Path, ss, os.ModePerm); err != nil {
|
||||
if err := dst.WriteStream(copyPath.Path, ss, os.ModePerm); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := dst.SetModificationTime(target.Path, target.Modified); err != nil {
|
||||
if err := dst.SetModificationTime(copyPath.Path, copyPath.Modified); err != nil {
|
||||
return err
|
||||
}
|
||||
logrus.Infof("=> %v", target.Path)
|
||||
logrus.Infof("=> %v", copyPath.Path)
|
||||
}
|
||||
|
||||
return nil
|
||||
|
@ -20,7 +20,9 @@ type WebDAVTargetConfig struct {
|
||||
}
|
||||
|
||||
type WebDAVTarget struct {
|
||||
cfg *WebDAVTargetConfig
|
||||
c *webdavClient.Client
|
||||
isDir bool
|
||||
}
|
||||
|
||||
func NewWebDAVTarget(cfg *WebDAVTargetConfig) (*WebDAVTarget, error) {
|
||||
@ -31,10 +33,21 @@ func NewWebDAVTarget(cfg *WebDAVTargetConfig) (*WebDAVTarget, error) {
|
||||
if err := c.Connect(); err != nil {
|
||||
return nil, errors.Wrap(err, "error connecting to webdav target")
|
||||
}
|
||||
return &WebDAVTarget{c: c}, nil
|
||||
return &WebDAVTarget{cfg: cfg, c: c}, nil
|
||||
}
|
||||
|
||||
func (t *WebDAVTarget) Inventory() ([]*Object, error) {
|
||||
fi, err := t.c.Stat("")
|
||||
if !fi.IsDir() {
|
||||
t.isDir = false
|
||||
return []*Object{{
|
||||
Path: fi.Name(),
|
||||
Size: fi.Size(),
|
||||
Modified: fi.ModTime(),
|
||||
}}, nil
|
||||
}
|
||||
|
||||
t.isDir = true
|
||||
tree, err := t.recurse("", nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -42,6 +55,10 @@ func (t *WebDAVTarget) Inventory() ([]*Object, error) {
|
||||
return tree, nil
|
||||
}
|
||||
|
||||
func (t *WebDAVTarget) IsDir() bool {
|
||||
return t.isDir
|
||||
}
|
||||
|
||||
func (t *WebDAVTarget) recurse(path string, tree []*Object) ([]*Object, error) {
|
||||
files, err := t.c.ReadDir(path)
|
||||
if err != nil {
|
||||
@ -69,8 +86,11 @@ func (t *WebDAVTarget) recurse(path string, tree []*Object) ([]*Object, error) {
|
||||
}
|
||||
|
||||
func (t *WebDAVTarget) ReadStream(path string) (io.ReadCloser, error) {
|
||||
if t.isDir {
|
||||
return t.c.ReadStream(path)
|
||||
}
|
||||
return t.c.ReadStream("")
|
||||
}
|
||||
|
||||
func (t *WebDAVTarget) WriteStream(path string, stream io.Reader, mode os.FileMode) error {
|
||||
return t.c.WriteStream(path, stream, mode)
|
||||
|
Loading…
x
Reference in New Issue
Block a user