mirror of
https://github.com/openziti/zrok.git
synced 2024-11-07 16:54:23 +01:00
zrok ls (#438)
This commit is contained in:
parent
4b7f5df1ee
commit
c743622462
@ -3,7 +3,6 @@ package main
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/openziti/zrok/environment"
|
||||
"github.com/openziti/zrok/environment/env_core"
|
||||
"github.com/openziti/zrok/sdk/golang/sdk"
|
||||
"github.com/openziti/zrok/tui"
|
||||
"github.com/openziti/zrok/util/sync"
|
||||
@ -81,11 +80,11 @@ func (cmd *copyCommand) run(_ *cobra.Command, args []string) {
|
||||
}
|
||||
}()
|
||||
|
||||
source, err := cmd.createTarget(sourceUrl, root)
|
||||
source, err := sync.TargetForURL(sourceUrl, root)
|
||||
if err != nil {
|
||||
tui.Error("error creating target", err)
|
||||
}
|
||||
target, err := cmd.createTarget(targetUrl, root)
|
||||
target, err := sync.TargetForURL(targetUrl, root)
|
||||
if err != nil {
|
||||
tui.Error("error creating target", err)
|
||||
}
|
||||
@ -96,16 +95,3 @@ func (cmd *copyCommand) run(_ *cobra.Command, args []string) {
|
||||
|
||||
fmt.Println("copy complete!")
|
||||
}
|
||||
|
||||
func (cmd *copyCommand) createTarget(url *url.URL, root env_core.Root) (sync.Target, error) {
|
||||
switch url.Scheme {
|
||||
case "file":
|
||||
return sync.NewFilesystemTarget(&sync.FilesystemTargetConfig{Root: url.Path}), nil
|
||||
|
||||
case "zrok":
|
||||
return sync.NewZrokTarget(&sync.ZrokTargetConfig{URL: url, Root: root})
|
||||
|
||||
default:
|
||||
return sync.NewWebDAVTarget(&sync.WebDAVTargetConfig{URL: url, Username: "", Password: ""})
|
||||
}
|
||||
}
|
||||
|
65
cmd/zrok/dir.go
Normal file
65
cmd/zrok/dir.go
Normal file
@ -0,0 +1,65 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/openziti/zrok/environment"
|
||||
"github.com/openziti/zrok/tui"
|
||||
"github.com/openziti/zrok/util"
|
||||
"github.com/openziti/zrok/util/sync"
|
||||
"github.com/spf13/cobra"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
func init() {
|
||||
rootCmd.AddCommand(newDirCommand().cmd)
|
||||
}
|
||||
|
||||
type dirCommand struct {
|
||||
cmd *cobra.Command
|
||||
}
|
||||
|
||||
func newDirCommand() *dirCommand {
|
||||
cmd := &cobra.Command{
|
||||
Use: "dir <target>",
|
||||
Short: "List the contents of <target> ('http://', 'zrok://', and 'file://' supported)",
|
||||
Aliases: []string{"ls"},
|
||||
Args: cobra.ExactArgs(1),
|
||||
}
|
||||
command := &dirCommand{cmd: cmd}
|
||||
cmd.Run = command.run
|
||||
return command
|
||||
}
|
||||
|
||||
func (cmd *dirCommand) run(_ *cobra.Command, args []string) {
|
||||
targetUrl, err := url.Parse(args[0])
|
||||
if err != nil {
|
||||
tui.Error(fmt.Sprintf("invalid target URL '%v'", args[0]), err)
|
||||
}
|
||||
if targetUrl.Scheme == "" {
|
||||
targetUrl.Scheme = "file"
|
||||
}
|
||||
|
||||
root, err := environment.LoadRoot()
|
||||
if err != nil {
|
||||
tui.Error("error loading root", err)
|
||||
}
|
||||
|
||||
target, err := sync.TargetForURL(targetUrl, root)
|
||||
if err != nil {
|
||||
tui.Error(fmt.Sprintf("error creating target for '%v'", targetUrl.String()), err)
|
||||
}
|
||||
|
||||
objects, err := target.Dir("/")
|
||||
if err != nil {
|
||||
tui.Error("error listing directory", err)
|
||||
}
|
||||
|
||||
for _, object := range objects {
|
||||
if object.IsDir {
|
||||
fmt.Printf("<dir> %-32s\n", object.Path)
|
||||
} else {
|
||||
fmt.Printf(" %-32s %-16s %s\n", object.Path, util.BytesToSize(object.Size), object.Modified.String())
|
||||
}
|
||||
}
|
||||
fmt.Println()
|
||||
}
|
@ -52,6 +52,27 @@ func (t *FilesystemTarget) Inventory() ([]*Object, error) {
|
||||
return t.tree, nil
|
||||
}
|
||||
|
||||
func (t *FilesystemTarget) Dir(path string) ([]*Object, error) {
|
||||
des, err := os.ReadDir(t.cfg.Root)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var objects []*Object
|
||||
for _, de := range des {
|
||||
fi, err := de.Info()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
objects = append(objects, &Object{
|
||||
Path: de.Name(),
|
||||
IsDir: de.IsDir(),
|
||||
Size: fi.Size(),
|
||||
Modified: fi.ModTime(),
|
||||
})
|
||||
}
|
||||
return objects, nil
|
||||
}
|
||||
|
||||
func (t *FilesystemTarget) Mkdir(path string) error {
|
||||
return os.MkdirAll(filepath.Join(t.cfg.Root, path), os.ModePerm)
|
||||
}
|
||||
|
@ -16,6 +16,7 @@ type Object struct {
|
||||
|
||||
type Target interface {
|
||||
Inventory() ([]*Object, error)
|
||||
Dir(path string) ([]*Object, error)
|
||||
Mkdir(path string) error
|
||||
ReadStream(path string) (io.ReadCloser, error)
|
||||
WriteStream(path string, stream io.Reader, mode os.FileMode) error
|
||||
|
23
util/sync/target.go
Normal file
23
util/sync/target.go
Normal file
@ -0,0 +1,23 @@
|
||||
package sync
|
||||
|
||||
import (
|
||||
"github.com/openziti/zrok/environment/env_core"
|
||||
"github.com/pkg/errors"
|
||||
"net/url"
|
||||
)
|
||||
|
||||
func TargetForURL(url *url.URL, root env_core.Root) (Target, error) {
|
||||
switch url.Scheme {
|
||||
case "file":
|
||||
return NewFilesystemTarget(&FilesystemTargetConfig{Root: url.Path}), nil
|
||||
|
||||
case "zrok":
|
||||
return NewZrokTarget(&ZrokTargetConfig{URL: url, Root: root})
|
||||
|
||||
case "http", "https":
|
||||
return NewWebDAVTarget(&WebDAVTargetConfig{URL: url, Username: "", Password: ""})
|
||||
|
||||
default:
|
||||
return nil, errors.Errorf("unknown URL scheme '%v'", url.Scheme)
|
||||
}
|
||||
}
|
@ -59,7 +59,25 @@ func (t *WebDAVTarget) Inventory() ([]*Object, error) {
|
||||
IsDir: fi.IsDir,
|
||||
Size: fi.Size,
|
||||
Modified: fi.ModTime,
|
||||
ETag: fi.ETag,
|
||||
})
|
||||
}
|
||||
}
|
||||
return objects, nil
|
||||
}
|
||||
|
||||
func (t *WebDAVTarget) Dir(path string) ([]*Object, error) {
|
||||
fis, err := t.dc.Readdir(context.Background(), t.cfg.URL.Path, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var objects []*Object
|
||||
for _, fi := range fis {
|
||||
if fi.Path != "/" {
|
||||
objects = append(objects, &Object{
|
||||
Path: filepath.Base(fi.Path),
|
||||
IsDir: fi.IsDir,
|
||||
Size: fi.Size,
|
||||
Modified: fi.ModTime,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
@ -84,6 +84,25 @@ func (t *ZrokTarget) Inventory() ([]*Object, error) {
|
||||
return objects, nil
|
||||
}
|
||||
|
||||
func (t *ZrokTarget) Dir(path string) ([]*Object, error) {
|
||||
fis, err := t.dc.Readdir(context.Background(), t.cfg.URL.Path, false)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
var objects []*Object
|
||||
for _, fi := range fis {
|
||||
if fi.Path != "/" {
|
||||
objects = append(objects, &Object{
|
||||
Path: filepath.Base(fi.Path),
|
||||
IsDir: fi.IsDir,
|
||||
Size: fi.Size,
|
||||
Modified: fi.ModTime,
|
||||
})
|
||||
}
|
||||
}
|
||||
return objects, nil
|
||||
}
|
||||
|
||||
func (t *ZrokTarget) Mkdir(path string) error {
|
||||
return t.dc.Mkdir(context.Background(), filepath.Join(t.cfg.URL.Path, path))
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user