Skip to content

Commit

Permalink
first import
Browse files Browse the repository at this point in the history
  • Loading branch information
mattn committed Dec 13, 2015
0 parents commit f07b350
Show file tree
Hide file tree
Showing 8 changed files with 1,557 additions and 0 deletions.
27 changes: 27 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# davfs

WebDAV filesystem using SQLite3 backend.

## Usage

```
$ davfs
```

## Requirements

golang

## Installation

```
$ go get github.com/mattn/davfs/cmd/davfs
```

## License

MIT

## Author

Yasuhiro Matsumoto (a.k.a mattn)
108 changes: 108 additions & 0 deletions cmd/davfs/davfs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package main

import (
"flag"
"log"
"net/http"
"net/url"
"os"
"strings"

"github.com/fatih/color"
"github.com/mattn/go-colorable"

"github.com/mattn/davfs"
_ "github.com/mattn/davfs/plugin/file"
_ "github.com/mattn/davfs/plugin/memory"
_ "github.com/mattn/davfs/plugin/mysql"
_ "github.com/mattn/davfs/plugin/postgres"
_ "github.com/mattn/davfs/plugin/sqlite3"
"golang.org/x/net/webdav"
)

var (
addr = flag.String("addr", ":9999", "server address")
driver = flag.String("driver", "sqlite3", "database driver")
source = flag.String("source", "fs.db", "database connection string")
cred = flag.String("cred", "", "credential for basic auth")
create = flag.Bool("create", false, "create filesystem")
)

func errorString(err error) string {
if err != nil {
return err.Error()
}
return ""
}

func main() {
flag.Parse()

log.SetOutput(colorable.NewColorableStderr())

if *create {
err := davfs.CreateFS(*driver, *source)
if err != nil {
log.Fatal(err)
}
os.Exit(0)
}
fs, err := davfs.NewFS(*driver, *source)
if err != nil {
log.Fatal(err)
}

dav := &webdav.Handler{
FileSystem: fs,
LockSystem: webdav.NewMemLS(),
Logger: func(r *http.Request, err error) {
litmus := r.Header.Get("X-Litmus")
if len(litmus) > 19 {
litmus = litmus[:16] + "..."
}

switch r.Method {
case "COPY", "MOVE":
dst := ""
if u, err := url.Parse(r.Header.Get("Destination")); err == nil {
dst = u.Path
}
log.Printf("%-18s %s %s %s",
color.GreenString(r.Method),
r.URL.Path,
dst,
color.RedString(errorString(err)))
default:
log.Printf("%-18s %s %s",
color.GreenString(r.Method),
r.URL.Path,
color.RedString(errorString(err)))
}
},
}

var handler http.Handler
if *cred != "" {
token := strings.SplitN(*cred, ":", 2)
if len(token) != 2 {
flag.Usage()
return
}
user, pass := token[0], token[1]
handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
username, password, ok := r.BasicAuth()
if !ok || username != user || password != pass {
w.Header().Set("WWW-Authenticate", `Basic realm="davfs"`)
http.Error(w, "authorization failed", http.StatusUnauthorized)
return
}
dav.ServeHTTP(w, r)
})
} else {
handler = dav
}

log.Print(color.CyanString("Server started %v", *addr))
http.Handle("/", handler)
log.Fatal(http.ListenAndServe(*addr, nil))
}
32 changes: 32 additions & 0 deletions davfs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package davfs

import (
"os"

"golang.org/x/net/webdav"
)

type Driver interface {
Mount(source string) (webdav.FileSystem, error)
CreateFS(source string) error
}

var drivers = map[string]Driver{}

func Register(name string, driver Driver) {
drivers[name] = driver
}

func NewFS(driver, source string) (webdav.FileSystem, error) {
if d, ok := drivers[driver]; ok {
return d.Mount(source)
}
return nil, os.ErrNotExist
}

func CreateFS(driver, source string) error {
if d, ok := drivers[driver]; ok {
return d.CreateFS(source)
}
return os.ErrNotExist
}
35 changes: 35 additions & 0 deletions plugin/file/file.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package file

import (
"github.com/mattn/davfs"
"golang.org/x/net/webdav"
"os"
"path/filepath"
)

func init() {
davfs.Register("file", &Driver{})
}

type Driver struct {
}

func (d *Driver) Mount(source string) (webdav.FileSystem, error) {
if source == "" {
source = "."
}
if s, err := filepath.Abs(source); err == nil {
source = s
}
return webdav.Dir(source), nil
}

func (d *Driver) CreateFS(source string) error {
if source == "" {
source = "."
}
if s, err := filepath.Abs(source); err == nil {
source = s
}
return os.Mkdir(source, 0755)
}
21 changes: 21 additions & 0 deletions plugin/memory/memory.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package memory

import (
"github.com/mattn/davfs"
"golang.org/x/net/webdav"
)

func init() {
davfs.Register("memory", &Driver{})
}

type Driver struct {
}

func (d *Driver) Mount(source string) (webdav.FileSystem, error) {
return webdav.NewMemFS(), nil
}

func (d *Driver) CreateFS(source string) error {
return nil
}
Loading

0 comments on commit f07b350

Please sign in to comment.