gowebdav/cmd/gowebdav/main.go

268 lines
4.7 KiB
Go
Raw Permalink Normal View History

2014-10-23 10:39:55 +02:00
package main
import (
2014-10-27 14:32:16 +01:00
"errors"
2014-10-23 10:39:55 +02:00
"flag"
"fmt"
2014-10-27 14:32:16 +01:00
"io"
"io/fs"
2014-10-24 14:04:43 +02:00
"os"
"os/user"
"path"
"path/filepath"
2019-12-15 00:28:41 +01:00
"runtime"
2014-10-24 13:10:56 +02:00
"strings"
2024-01-20 11:02:25 +01:00
d "git.siteop.biz/shoopea/gowebdav"
2014-10-23 10:39:55 +02:00
)
2018-05-25 10:15:26 +02:00
func main() {
root := flag.String("root", os.Getenv("ROOT"), "WebDAV Endpoint [ENV.ROOT]")
2019-12-15 00:31:08 +01:00
user := flag.String("user", os.Getenv("USER"), "User [ENV.USER]")
password := flag.String("pw", os.Getenv("PASSWORD"), "Password [ENV.PASSWORD]")
netrc := flag.String("netrc-file", filepath.Join(getHome(), ".netrc"), "read login from netrc file")
2018-05-25 20:31:58 +02:00
method := flag.String("X", "", `Method:
2018-05-25 11:03:42 +02:00
LS <PATH>
STAT <PATH>
MKDIR <PATH>
MKDIRALL <PATH>
2018-05-25 12:18:30 +02:00
GET <PATH> [<FILE>]
2018-05-25 20:27:55 +02:00
PUT <PATH> [<FILE>]
2018-05-25 11:03:42 +02:00
MV <OLD> <NEW>
CP <OLD> <NEW>
DEL <PATH>
`)
2018-05-25 10:15:26 +02:00
flag.Parse()
if *root == "" {
fail("Set WebDAV ROOT")
}
2019-12-15 00:31:08 +01:00
if argsLength := len(flag.Args()); argsLength == 0 || argsLength > 2 {
2018-05-25 10:15:26 +02:00
fail("Unsupported arguments")
}
2019-12-15 00:31:08 +01:00
if *password == "" {
if u, p := d.ReadConfig(*root, *netrc); u != "" && p != "" {
2019-12-15 00:31:08 +01:00
user = &u
password = &p
}
}
2019-12-15 00:31:08 +01:00
c := d.NewClient(*root, *user, *password)
2018-05-25 10:15:26 +02:00
if e := c.Connect(); e != nil {
panic(e)
}
2018-05-25 20:31:58 +02:00
cmd := getCmd(*method)
2018-05-25 10:15:26 +02:00
2018-05-25 12:25:36 +02:00
if e := cmd(c, flag.Arg(0), flag.Arg(1)); e != nil {
2018-05-25 10:15:26 +02:00
fail(e)
2014-10-23 10:39:55 +02:00
}
}
2018-05-25 10:15:26 +02:00
func fail(err interface{}) {
2014-10-27 14:32:16 +01:00
if err != nil {
2018-05-25 10:15:26 +02:00
fmt.Println(err)
2014-10-27 14:32:16 +01:00
}
2018-05-25 10:15:26 +02:00
os.Exit(-1)
2014-10-27 14:32:16 +01:00
}
func getHome() string {
2019-12-15 00:28:41 +01:00
u, e := user.Current()
if e != nil {
return os.Getenv("HOME")
}
if u != nil {
return u.HomeDir
}
2019-12-15 00:28:41 +01:00
switch runtime.GOOS {
case "windows":
return ""
default:
return "~/"
}
}
2018-05-24 01:13:26 +02:00
func getCmd(method string) func(c *d.Client, p0, p1 string) error {
2018-05-25 20:31:58 +02:00
switch strings.ToUpper(method) {
2018-05-24 01:13:26 +02:00
case "LS", "LIST", "PROPFIND":
2018-05-25 10:15:26 +02:00
return cmdLs
2014-10-23 14:10:31 +02:00
2018-05-24 01:13:26 +02:00
case "STAT":
2018-05-25 10:15:26 +02:00
return cmdStat
2014-10-27 17:02:28 +01:00
2018-05-24 01:13:26 +02:00
case "GET", "PULL", "READ":
2018-05-25 10:15:26 +02:00
return cmdGet
2014-10-23 14:10:31 +02:00
2018-05-24 01:13:26 +02:00
case "DELETE", "RM", "DEL":
2018-05-25 10:15:26 +02:00
return cmdRm
2014-10-23 15:00:20 +02:00
2018-05-24 01:13:26 +02:00
case "MKCOL", "MKDIR":
2018-05-25 10:15:26 +02:00
return cmdMkdir
2014-10-23 14:10:31 +02:00
2018-05-25 11:03:42 +02:00
case "MKCOLALL", "MKDIRALL", "MKDIRP":
2018-05-25 10:15:26 +02:00
return cmdMkdirAll
2014-10-24 13:10:56 +02:00
2018-05-24 01:13:26 +02:00
case "RENAME", "MV", "MOVE":
2018-05-25 10:15:26 +02:00
return cmdMv
2014-10-24 14:08:42 +02:00
2018-05-24 01:13:26 +02:00
case "COPY", "CP":
2018-05-25 10:15:26 +02:00
return cmdCp
2014-10-24 14:08:42 +02:00
2018-05-24 01:13:26 +02:00
case "PUT", "PUSH", "WRITE":
2018-05-25 10:15:26 +02:00
return cmdPut
2014-10-27 14:32:16 +01:00
2018-05-24 01:13:26 +02:00
default:
return func(c *d.Client, p0, p1 string) (err error) {
return errors.New("Unsupported method: " + method)
2014-10-24 13:10:56 +02:00
}
2018-05-24 01:13:26 +02:00
}
}
2018-05-25 12:13:16 +02:00
func cmdLs(c *d.Client, p0, _ string) (err error) {
2018-05-25 10:15:26 +02:00
files, err := c.ReadDir(p0)
if err == nil {
fmt.Println(fmt.Sprintf("ReadDir: '%s' entries: %d ", p0, len(files)))
for _, f := range files {
fmt.Println(f)
}
}
return
}
2018-05-24 01:13:26 +02:00
2018-05-25 12:13:16 +02:00
func cmdStat(c *d.Client, p0, _ string) (err error) {
2018-05-25 10:15:26 +02:00
file, err := c.Stat(p0)
if err == nil {
fmt.Println(file)
2018-05-24 01:13:26 +02:00
}
2018-05-25 10:15:26 +02:00
return
}
2018-05-24 01:13:26 +02:00
2018-05-25 10:15:26 +02:00
func cmdGet(c *d.Client, p0, p1 string) (err error) {
bytes, err := c.Read(p0)
if err == nil {
2018-05-25 12:18:30 +02:00
if p1 == "" {
p1 = filepath.Join(".", p0)
}
err = writeFile(p1, bytes, 0644)
if err == nil {
2018-05-25 10:15:26 +02:00
fmt.Println(fmt.Sprintf("Written %d bytes to: %s", len(bytes), p1))
}
2018-05-24 01:13:26 +02:00
}
2018-05-25 10:15:26 +02:00
return
}
2018-05-24 01:13:26 +02:00
2018-05-25 12:13:16 +02:00
func cmdRm(c *d.Client, p0, _ string) (err error) {
2018-05-25 10:15:26 +02:00
if err = c.Remove(p0); err == nil {
2018-05-25 19:58:42 +02:00
fmt.Println("Remove: " + p0)
2018-05-24 01:13:26 +02:00
}
2018-05-25 10:15:26 +02:00
return
}
2018-05-24 01:13:26 +02:00
2018-05-25 12:13:16 +02:00
func cmdMkdir(c *d.Client, p0, _ string) (err error) {
2018-05-25 10:15:26 +02:00
if err = c.Mkdir(p0, 0755); err == nil {
2018-05-25 19:58:42 +02:00
fmt.Println("Mkdir: " + p0)
2018-05-25 10:15:26 +02:00
}
return
}
2018-05-24 01:13:26 +02:00
2018-05-25 12:13:16 +02:00
func cmdMkdirAll(c *d.Client, p0, _ string) (err error) {
2018-05-25 10:15:26 +02:00
if err = c.MkdirAll(p0, 0755); err == nil {
2018-05-25 19:58:42 +02:00
fmt.Println("MkdirAll: " + p0)
2018-05-25 10:15:26 +02:00
}
return
}
func cmdMv(c *d.Client, p0, p1 string) (err error) {
if err = c.Rename(p0, p1, true); err == nil {
fmt.Println("Rename: " + p0 + " -> " + p1)
2014-10-23 10:39:55 +02:00
}
2018-05-25 10:15:26 +02:00
return
}
func cmdCp(c *d.Client, p0, p1 string) (err error) {
if err = c.Copy(p0, p1, true); err == nil {
fmt.Println("Copy: " + p0 + " -> " + p1)
}
return
}
func cmdPut(c *d.Client, p0, p1 string) (err error) {
2018-05-25 20:27:55 +02:00
if p1 == "" {
p1 = path.Join(".", p0)
} else {
var fi fs.FileInfo
fi, err = c.Stat(p0)
if err != nil && !d.IsErrNotFound(err) {
return
}
if !d.IsErrNotFound(err) && fi.IsDir() {
p0 = path.Join(p0, p1)
}
2018-05-25 20:27:55 +02:00
}
2018-05-25 10:15:26 +02:00
stream, err := getStream(p1)
2018-05-25 20:27:55 +02:00
if err != nil {
return
}
defer stream.Close()
if err = c.WriteStream(p0, stream, 0644); err == nil {
fmt.Println("Put: " + p1 + " -> " + p0)
2018-05-25 10:15:26 +02:00
}
return
}
func writeFile(path string, bytes []byte, mode os.FileMode) error {
parent := filepath.Dir(path)
if _, e := os.Stat(parent); os.IsNotExist(e) {
if e := os.MkdirAll(parent, os.ModePerm); e != nil {
return e
}
}
2018-05-25 10:15:26 +02:00
f, err := os.Create(path)
if err != nil {
return err
}
defer f.Close()
2018-05-25 10:15:26 +02:00
_, err = f.Write(bytes)
return err
2014-10-23 10:39:55 +02:00
}
2014-10-27 14:32:16 +01:00
2014-10-27 15:17:54 +01:00
func getStream(pathOrString string) (io.ReadCloser, error) {
2014-10-27 14:32:16 +01:00
fi, err := os.Stat(pathOrString)
if err != nil {
return nil, err
}
if fi.IsDir() {
2017-10-05 17:07:33 +02:00
return nil, &os.PathError{
Op: "Open",
Path: pathOrString,
Err: errors.New("Path: '" + pathOrString + "' is a directory"),
2017-10-05 17:07:33 +02:00
}
2014-10-27 14:32:16 +01:00
}
2014-10-27 15:17:54 +01:00
f, err := os.Open(pathOrString)
if err == nil {
return f, nil
}
2014-10-27 15:17:54 +01:00
return nil, &os.PathError{
Op: "Open",
Path: pathOrString,
Err: err,
}
2014-10-27 15:17:54 +01:00
}