Giter Site home page Giter Site logo

miquels / webdavfs Goto Github PK

View Code? Open in Web Editor NEW
209.0 14.0 26.0 90 KB

Linux / OSX FUSE webdav filesystem. This filesystem behaves like a real network filesystem- no unnecessary copying of entire files.

License: MIT License

Go 100.00%
linux fuse mount webdav webdav-client go osx

webdavfs's Introduction

webdavfs

A FUSE filesystem for WEBDAV shares.

Most filesystem drivers for Webdav shares act somewhat like a mirror; if a file is read it's first downloaded then cached in its entirety on a local drive, then read from there. Writing files is similar or even worse- a partial update to a file might involve downloading it first, modifying it, then uploading it again. In many cases that is not optimal.

This filesystem driver behaves like a network filesystem. It doesn't cache anything locally, it just sends out partial reads/writes over the network.

For that to work, you need partial write support- and unfortunately, there is no standard for that. See https://blog.sphere.chronosempire.org.uk/2012/11/21/webdav-and-the-http-patch-nightmare

However, there is support in Apache (the webserver, using mod_dav) and SabreDav (a php webserver server library, used by e.g. NextCloud) for partial writes. So we detect if it's Apache or SabreDav we're talking to and then use their specific methods to partially update files.

If no support for partial writes is detected, mount.webdavfs will print a warning and mount the filesystem read-only. In that case you can also use the rwdirops mount option, this will make metadata writable (i.e. you can use rm / mv / mkdir / rmdir) but you still won't be able to write to files.

But if you only need to read files it's still way faster than davfs2 :)

What is working

Basic filesystem operations.

  • files: create/delete/read/write/truncate/seek
  • directories: mkdir rmdir readdir
  • query filesystem size (df / vfsstat)

What is not yet working

  • locking

What will not ever work

  • change permissions (all files are 644, all dirs are 755)
  • change user/group
  • devices / fifos / chardev / blockdev etc
  • truncate(2) / ftruncate(2) for lengths between 1 .. currentfilesize - 1

This is basically because these are mostly just missing properties from webdav.

What platforms does it run on

  • Linux
  • FreeBSD (untested, but should work)
  • It might work on macos if you use osxfuse 3. Then again it might not. This is completely unsupported. See also this issue.

How to install and use.

First you need to install golang, git, fuse, and set up your environment. For Debian:

$ sudo -s
Password:
# apt-get install golang git fuse
# exit

Now with go and git installed, get a copy of this github repository:

$ git clone https://github.com/miquels/webdavfs
$ cd webdavfs

You're now ready to build the binary:

$ go get
$ go build

And install it:

$ sudo -s
Password:
# cp webdavfs /sbin/mount.webdavfs

Using it is simple as:

# mount -t webdavfs -ousername=you,password=pass https://webdav.where.ever/subdir /mnt

Command line options

Option Description
-f don't actually mount
-D daemonize
-T opts trace options: fuse,webdav,httpreq,httphdr
-F file trace file. file will be reopened when renamed, tracing will stop when file is removed
-o opts mount options

Mount options

Option Description
allow_root If mounted as normal user, allow access by root
allow_other Allow access by others than the mount owner. This
also sets "default_permisions"
default_permissions As per fuse documentation
no_default_permissions Don't set "default_permissions" with "allow_other"
ro Read only
rwdirops Read-write for directory operations, but no file-writing (no PUT)
rw Read-write (default)
uid User ID for filesystem
gid Group ID for filesystem.
mode Mode for files/directories on the filesystem (600, 666, etc).
Files will never have the executable bit on, directories always.
cookie Authorization Cookie (Useful for O365 Sharepoint/OneDrive for Business)
password Password of webdav user
username Username of webdav user
async_read As per fuse documentation
nonempty As per fuse documentation
maxconns Maximum number of parallel connections to the webdav
server (default 8)
maxidleconns Maximum number of idle connections (default 8)
sabredav_partialupdate Use the sabredav partialupdate protocol even when
the remote server doesn't advertise support (DANGEROUS)

If the webdavfs program is called via mount -t webdavfs or as mount.webdav, it will fork, re-exec and run in the background. In that case it will remove the username and password options from the command line, and communicate them via the environment instead.

The environment options for username and password are WEBDAV_USERNAME and WEBDAV_PASSWORD, respectively.

In the future it will also be possible to read the credentials from a configuration file.

TODO

  • maxconns doesn't work yet. this is complicated with the Go HTTP client.
  • add configuration file
  • timeout handling and interrupt handling
  • we use busy-loop locking, yuck. use semaphores built on channels.
  • rewrite fuse.go code to use the bazil/fuse abstraction instead of bazil/fuse/fs.
    perhaps switch to

Unix filesystem extensions for webdav.

Not ever going to happen, but if you wanted a more unix-like experience and better performance, here are a few ideas:

  • Content-Type: for unix pipes / chardevs / etc
  • contentsize property (read-write)
  • inodenumber property
  • unix properties like uid/gid/mode
  • DELETE Depth 0 for collections (no delete if non-empty)
  • return updated PROPSTAT information after operations like PUT / DELETE / MKCOL / MOVE

webdavfs's People

Contributors

jschwartzenberg avatar miquels avatar remcovz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

webdavfs's Issues

document how to get a server to work with this.

In the last week I installed:
NGINX with default dav (no HTTP Patch)
SabreDAV (HTTP Patch requires writing more PHP than I am familiar with)
webdav-server-rs (does not work at all)
apache (maybe tomorrow)

This was a lot of work but I still don't have something working. I think documenting how to run such a service would help a lot to make this thing more usable.

Document working SabreDAV server somewhere (see here)

<?php

use Sabre\DAV;
use Sabre\DAV\Auth;
use Sabre\DAV\PartialUpdate\Plugin;

require 'vendor/autoload.php';

$rootDirectory = new DAV\FS\Directory('public');
$server = new DAV\Server($rootDirectory);

$server->setBaseUri('/sabredav/server.php');

$lockBackend = new DAV\Locks\Backend\File('data/locks');
$lockPlugin = new DAV\Locks\Plugin($lockBackend);
$server->addPlugin($lockPlugin);

$server->addPlugin(new DAV\Browser\Plugin());
$server->addPlugin(new Sabre\DAV\PartialUpdate\Plugin());
$server->addPlugin(new \Sabre\DAV\Browser\Plugin());

$server->exec();
?>

This is the simplest SabreDAV server someone could want for use with webdavfs. I hope it helps.

Note that it doesn't work.

Support redirects for non-collection resources

Please add support for GETing a non-collection resource when the server responds with a redirect to another URL. Currently, webdavfs does not support redirects at all; attempting to access a redirected file over a webdavfs mount results in the following in the trace file:

GET request error: Get "<REDIRECTED URL>": 400 Will not follow redirect
2024-02-27 09:32:08 GetRange: Get "<REDIRECTED URL>": 400 Will not follow redirect
2024-02-27 09:32:08 102 Read(FILENAME): Get "<REDIRECTED URL>": 400 Will not follow redirect

Support for Windows via WinFsp

The author of WinFsp might be ready to join efforts if you
decide to support windows via his project

winfsp/winfsp#284

And windows native webdav support is still problematic, regardless of version...

Also from other various clients, not all work well with webdav, I've managed to
make only few of them work...

Nextcloud 15: no PUT Range support

It looks like SabreDav capabilities are not detected (or broken). I collected a trace, however I found nothing suspicious. Is it working for you ?

git tag

Thank you for this great software. To my knowledge it it the best enabling webdav by using fuse.

Can you please give it a git tag incl. version nummer.

license?

Hey,

I can't see a license attached to this project,
Which license is this distributed under?
MIT?

Thanks in advance!

One-byte directories missing from ls

Directory names which are only one byte are missing from the output of e.g. ls command. They are correctly being created (with mkdir), can be traversed into from the shell and are visible from other clients (e.g. gvfs, web browser).

Exemplary session:

$ mkdir X
$ ls -la
total 0
drwx------ 1 jest jest 0 paź  8 14:43 .
$ cd X
$ pwd
/home/user/dav/dir/X
$ ls -la
total 0
drwx------ 1 jest jest 0 paź  8 14:43 .
$ cd ..
$ rmdir X

The log from the program run with -T fuse,webdav,httpreq,httphdr, for the sequence of mkdir X; ls; rmdir X:

2018-10-08 14:31:58 496 Lookup(X)
2018-10-08 14:31:58 Stat(/dir/X)
2018-10-08 14:31:58 Propfind(/dir/X, 0, [])
2018-10-08 14:31:58 PROPFIND http://davserver/dir/X HTTP/1.1
2018-10-08 14:31:58  Content-Length: 183
2018-10-08 14:31:58  Content-Type: text/xml
2018-10-08 14:31:58  Depth: 0
2018-10-08 14:31:58  User-Agent: fuse-webdavfs/0.1 (Go) linux (amd64)
2018-10-08 14:31:58 
2018-10-08 14:31:58 PROPFIND request error: 404 Not Found
2018-10-08 14:31:58 Propfind: 404 Not Found
2018-10-08 14:31:58 Stat: 404 Not Found
2018-10-08 14:31:58 496 Lookup(X): 404 Not Found
2018-10-08 14:31:58 497 Mkdir(X)
2018-10-08 14:31:58 Mkcol(/dir/X/)
2018-10-08 14:31:58 MKCOL http://davserver/dir/X/ HTTP/1.1
2018-10-08 14:31:58  Content-Length: 0
2018-10-08 14:31:58  User-Agent: fuse-webdavfs/0.1 (Go) linux (amd64)
2018-10-08 14:31:58 
2018-10-08 14:31:58 HTTP/1.1 201 Created
2018-10-08 14:31:58  Content-Length: 274
2018-10-08 14:31:58  Content-Type: text/html; charset=ISO-8859-1
2018-10-08 14:31:58  Date: Mon, 08 Oct 2018 12:31:58 GMT
2018-10-08 14:31:58  Location: http://davserver/dir/X/
2018-10-08 14:31:58  Server: Apache/2.4.29 (Ubuntu)
2018-10-08 14:31:58 
2018-10-08 14:31:58 Mkcol: OK
2018-10-08 14:31:58 497 Mkdir OK
2018-10-08 14:31:58 0 Getattr(X)
2018-10-08 14:31:58 0 Getattr(X): {"Attr":{"Valid":60000000000,"Inode":1055670720892221494,"Size":0,"Blocks":0,"Atime":"2018-10-08T14:31:58.297043298+02:00","Mtime":"2018-10-08T14:31:58.297043298+02:00","Ctime":"2018-10-08T14:31:58.297043298+02:00","Crtime":"2018-10-08T14:31:58.297043298+02:00","Mode":2147484096,"Nlink":1,"Uid":1000,"Gid":1000,"Rdev":0,"Flags":0,"BlockSize":4096}}
2018-10-08 14:32:01 498 Open(dir): trunc=false read=true write=false
2018-10-08 14:32:01 498 Open(dir): OK
2018-10-08 14:32:01 499 Getattr(dir)
2018-10-08 14:32:01 Stat(/dir/)
2018-10-08 14:32:01 Propfind(/dir/, 0, [])
2018-10-08 14:32:01 PROPFIND http://davserver/dir/ HTTP/1.1
2018-10-08 14:32:01  Content-Length: 183
2018-10-08 14:32:01  Content-Type: text/xml
2018-10-08 14:32:01  Depth: 0
2018-10-08 14:32:01  User-Agent: fuse-webdavfs/0.1 (Go) linux (amd64)
2018-10-08 14:32:01 
2018-10-08 14:32:01 HTTP/1.1 207 Multi-Status
2018-10-08 14:32:01  Content-Length: 668
2018-10-08 14:32:01  Content-Type: text/xml; charset="utf-8"
2018-10-08 14:32:01  Date: Mon, 08 Oct 2018 12:32:01 GMT
2018-10-08 14:32:01  Server: Apache/2.4.29 (Ubuntu)
2018-10-08 14:32:01 
2018-10-08 14:32:01 Propfind: returns [{"Name":"dir/","ResourceType_":{"Collection":{},"RedirectRef":null},"RefTarget_":{"Href":null},"ResourceType":"collection","RefTarget":"","CreationDate":"2018-10-08T12:31:58Z","LastModified":"Mon, 08 Oct 2018 12:31:58 GMT","Etag":"1000-577b6cea6090d","ContentLength":"","SpaceUsed":"","SpaceFree":""}]
2018-10-08 14:32:01 Readdir: returns {"Name":"dir","Target":"","IsDir":true,"IsLink":false,"Mtime":"2018-10-08T12:31:58Z","Ctime":"2018-10-08T12:31:58Z","Size":0}
2018-10-08 14:32:01 499 Getattr(dir): {"Attr":{"Valid":60000000000,"Inode":9946167772755823291,"Size":0,"Blocks":0,"Atime":"2018-10-08T12:31:58Z","Mtime":"2018-10-08T12:31:58Z","Ctime":"2018-10-08T12:31:58Z","Crtime":"2018-10-08T12:31:58Z","Mode":2147484096,"Nlink":1,"Uid":1000,"Gid":1000,"Rdev":0,"Flags":0,"BlockSize":4096}}
2018-10-08 14:32:01 - ReaddirAll(dir)
2018-10-08 14:32:01 Readdir(/dir, true
2018-10-08 14:32:01 Propfind(/dir/, 1, [])
2018-10-08 14:32:01 PROPFIND http://davserver/dir/ HTTP/1.1
2018-10-08 14:32:01  Content-Length: 183
2018-10-08 14:32:01  Content-Type: text/xml
2018-10-08 14:32:01  Depth: 1
2018-10-08 14:32:01  User-Agent: fuse-webdavfs/0.1 (Go) linux (amd64)
2018-10-08 14:32:01 
2018-10-08 14:32:01 HTTP/1.1 207 Multi-Status
2018-10-08 14:32:01  Content-Length: 1234
2018-10-08 14:32:01  Content-Type: text/xml; charset="utf-8"
2018-10-08 14:32:01  Date: Mon, 08 Oct 2018 12:32:01 GMT
2018-10-08 14:32:01  Server: Apache/2.4.29 (Ubuntu)
2018-10-08 14:32:01 
2018-10-08 14:32:01 Propfind: returns [{"Name":"","ResourceType_":{"Collection":{},"RedirectRef":null},"RefTarget_":{"Href":null},"ResourceType":"collection","RefTarget":"","CreationDate":"2018-10-08T12:31:58Z","LastModified":"Mon, 08 Oct 2018 12:31:58 GMT","Etag":"1000-577b6cea6090d","ContentLength":"","SpaceUsed":"","SpaceFree":""},{"Name":"X/","ResourceType_":{"Collection":{},"RedirectRef":null},"RefTarget_":{"Href":null},"ResourceType":"collection","RefTarget":"","CreationDate":"2018-10-08T12:31:58Z","LastModified":"Mon, 08 Oct 2018 12:31:58 GMT","Etag":"1000-577b6cea6090d","ContentLength":"","SpaceUsed":"","SpaceFree":""}]
2018-10-08 14:32:01 Readdir: returns [{"Name":".","Target":"","IsDir":true,"IsLink":false,"Mtime":"2018-10-08T12:31:58Z","Ctime":"2018-10-08T12:31:58Z","Size":0}]
2018-10-08 14:32:01 - ReadDirAll(dir): 1 entries
2018-10-08 14:32:04 503 Remove(X)
2018-10-08 14:32:04 Propfind(/dir/X, 1, [])
2018-10-08 14:32:04 PROPFIND http://davserver/dir/X HTTP/1.1
2018-10-08 14:32:04  Content-Length: 183
2018-10-08 14:32:04  Content-Type: text/xml
2018-10-08 14:32:04  Depth: 1
2018-10-08 14:32:04  User-Agent: fuse-webdavfs/0.1 (Go) linux (amd64)
2018-10-08 14:32:04 
2018-10-08 14:32:04 HTTP/1.1 207 Multi-Status
2018-10-08 14:32:04  Content-Length: 670
2018-10-08 14:32:04  Content-Type: text/xml; charset="utf-8"
2018-10-08 14:32:04  Date: Mon, 08 Oct 2018 12:32:04 GMT
2018-10-08 14:32:04  Server: Apache/2.4.29 (Ubuntu)
2018-10-08 14:32:04 
2018-10-08 14:32:04 Propfind: returns [{"Name":"/","ResourceType_":{"Collection":{},"RedirectRef":null},"RefTarget_":{"Href":null},"ResourceType":"collection","RefTarget":"","CreationDate":"2018-10-08T12:31:58Z","LastModified":"Mon, 08 Oct 2018 12:31:58 GMT","Etag":"1000-577b6cea6090d","ContentLength":"","SpaceUsed":"","SpaceFree":""}]
2018-10-08 14:32:04 Delete(/dir/X/)
2018-10-08 14:32:04 DELETE http://davserver/dir/X/ HTTP/1.1
2018-10-08 14:32:04  Content-Length: 0
2018-10-08 14:32:04  User-Agent: fuse-webdavfs/0.1 (Go) linux (amd64)
2018-10-08 14:32:04 
2018-10-08 14:32:04 HTTP/1.1 204 No Content
2018-10-08 14:32:04  Content-Type: httpd/unix-directory
2018-10-08 14:32:04  Date: Mon, 08 Oct 2018 12:32:04 GMT
2018-10-08 14:32:04  Server: Apache/2.4.29 (Ubuntu)
2018-10-08 14:32:04 
2018-10-08 14:32:04 Delete: OK
2018-10-08 14:32:04 503 Remove OK
2018-10-08 14:32:04 Forget(X (deleted))

Ubuntu 16.04 (Mint 18.3), kernel 4.15.0-36

query filesystem size (df / vfsstat)

Hello

Thank you for your great work. This is my first issue I'm writing and I hope it's okay
Sorry in advance.

Unfortunately, when mounting, the file system size is not recognized and is empty:
Dateisystem Typ Größe Benutzt Verf. Verw% Eingehängt auf
https://webdav.hidrive.ionos.com/ fuse.webdavfs - - - - /mnt

Here is my mount command:
mount -t webdavfs -ousername=user,password=pass,allow_other,mode=777 https://webdav.hidrive.ionos.com/ /mnt

mount shows:
https://webdav.hidrive.ionos.com/ on /mnt type fuse.webdavfs (rw,nosuid,nodev,relatime,user_id=0,group_id=0,default_permissions,allow_other)

Is the mount command wrong or is the problem with the "webdavfs" program or with this webdav provider?
I would appreciate feedback.

Thanks

Greetings

Authentication Not work with sabredav aka. sabre/dav Sabre -- 401

https://sabre.io/dav/authentication/

I just used the default options. I can tell the client is extra suspictious because the behaviour of this client is different when I send the pass option as a mount option or as environment variables.

When I use environment variables, for some reason this thing tries to use the http_proxy value also. And I get different error codes.

$> http_proxy="" https_proxy="" WEBDAV_USERNAME=broken WEBDAV_PASSWORD='yEAwvY0ZH6ymUYrtbdbswtkLH' mount -t webdavfs "https://us0.co/sabredav/server.php" .mnt
mount.webdavfs: 401 Unauthorized
$> sudo mount -t webdavfs -ousername=broken,password=yEAwvY0ZH6ymUYrtbdbswtkLH,allow_other  "https://us0.co/sabredav/server.php" ~/.mnt
mount.webdavfs: 401 Unauthorized

I was able to connect with cadaver though. That's a real username/password pair, feel free to mess around with my service.

permission denied can't write to the fuse

test case:

echo 'x' > mnt/x
echo: write error: permission denied
sudo sh -c "echo 'x' >mnt/x"
sh: 1: echo: echo: I/O error

I tried mounting with different options to fudge the permissions but nothing changes here.

./main.go:279:21: undefined: fuse.AllowRoot # go1.14 darwin/amd64

I want to compile binary on macOS but for Linux.

➜  miquels# git clone https://github.com/miquels/webdavfs
Cloning into 'webdavfs'...
remote: Enumerating objects: 268, done.
remote: Total 268 (delta 0), reused 0 (delta 0), pack-reused 268
Receiving objects: 100% (268/268), 76.39 KiB | 221.00 KiB/s, done.
Resolving deltas: 100% (171/171), done.
➜  miquels# cd webdavfs
➜  webdavfs git:(master) go version
go version go1.14 darwin/amd64
➜  webdavfs git:(master) go get
# github.com/miquels/webdavfs
./main.go:279:21: undefined: fuse.AllowRoot

not nice with http_proxy or https_proxy variables.

I use privoxy for my proxy.

echo "$http_proxy"
127.0.0.1:3988
echo "$https_proxy"
127.0.0.1:3988
 mount -t webdavfs -ousername=user,password=pass "https://us0.co/sabredav/server.php" /home/user/mnt


mount.webdavfs: Options "https://us0.co/sabredav/server.php/": proxyconnect tcp: net/http: TLS handshake timeout

it times out
setting the variables to "" is a workaround.

"Input/output error" using Nextcloud 13

The server in question is running Nextcloud 13.0.1 on Apache. Mounting with webdavfs works but when I try to write files I get an "Input/output error" (400 Bad Request).

I looked into it and discovered that although Nextcloud uses SabreDAV it apparently does not use its PartialUpdate Plugin which is needed for write support :-( Problematic in my particular case is that webdavfs correctly detects that there is no SabreDAV it can use, but it still sees the apache webserver. Unfortunately the apache has its DAV support deactivated for the files managed by Nextcloud. webdavfs should detect that and fallback to a readonly mount, but it doesn't.

Bug: cache is not updated if the file size has not changed

I'm writing PATCH support for a standard webdav server in go. While I was testing different bytes=A-B, I noticed that if the file size did not change after the operation, then the old version of the file would be displayed on the local file system. You can restart the web server, rewrite the file 100 times on the server or client (but without changing the size), wait a hour, but the client will still have the old version of the file without changes.
I also tested dufs to make sure that the problem is not in my implementation. There's a problem there too.

Perhaps I still made a mistake somewhere. But I suggest you check with your webserver too.

macFUSE 4 support

I'm happy to report that webdavfs can be made to work with the latest macFUSE 4 (4.5.0) as of this writing. You just need two changes: switch from the vanilla bazil.org fuse library to this fork: https://github.com/anacrolix/fuse and remove the AddRoot option. You can see the diff here:

master...elliotkendall:webdavfs:master

I imagine you don't want to do make either of these changes globally, but might you be interested in adding some conditionals for Mac users?

fusefs-webdavfs mounted only readonly

Hello. I added on /etc/fstab
https://disk.example.uz/remote.php/webdav/ /mnt users rw, lite, mountprog=/usr/local/sbin/mount_webdavfs,username=user, password=passwd,-F=/var/tmp/trace.log,-T=webdav,-T=httpreq,-T=httphdr 0 0

mounted only readonly
installed package from ports /usr/ports/sysutils/fusefs-webdavfs

OS Type Freebsd 12
⇒ kldstat
Id Refs Address Size Name
1 10 0xffffffff80200000 243d390 kernel
2 1 0xffffffff8263f000 16750 fuse.ko
3 1 0xffffffff8281a000 2678 intpm.ko
4 1 0xffffffff8281d000 b10 smbus.ko
5 1 0xffffffff8281e000 1800 uhid.ko

undefined: syscall.Dup2 (build failed)

Hi i am trying to build webdavfs on Linux with Go 1.10.3

export APP=webdavfs
export DIR=/SRC/.MYSCRIPT
export TEMPO=$DIR/tmp1

cd ${TEMPO}
rm -rf *
mkdir -p ${TEMPO}/src
mkdir -p ${TEMPO}/bin
mkdir -p ${TEMPO}/pkg

export GOPATH=${TEMPO}

cd ${TEMPO}/src
mkdir -p github.com/miquels
cd github.com/miquels

git clone https://github.com/miquels/webdavfs

cd webdavfs

go get

GOOS=linux GOARCH=arm64 go build -o ${APP}.arm64 
GOOS=linux GOARCH=arm GOARM=5 go build -o ${APP}.armv5 
GOOS=linux GOARCH=arm GOARM=7 go build -o ${APP}.armv7 
GOOS=linux GOARCH=amd64 go build -o ${APP}.x64 
GOOS=linux GOARCH=386 go build -o ${APP}.i386 

result

`root@trusty64:/SRC/.MYSCRIPT/GO# ./WebDAVfs
Cloning into 'webdavfs'...
remote: Enumerating objects: 262, done.
remote: Total 262 (delta 0), reused 0 (delta 0), pack-reused 262
Receiving objects: 100% (262/262), 75.82 KiB | 0 bytes/s, done.
Resolving deltas: 100% (167/167), done.
Checking connectivity... done.

github.com/miquels/webdavfs

./daemon.go:139:2: undefined: syscall.Dup2
./daemon.go:140:2: undefined: syscall.Dup2
./trace.go:135:2: undefined: syscall.Dup2
./trace.go:136:2: undefined: syscall.Dup2
`

any idea ?

Support for Caddy?

It's not clear to me from a quick look whether Caddy with the WebDAV plugin supports partial writes.

Can someone take a look, and possibly work with the plugin author to make this happen? Caddy is one of my new (as of last year) favorite things, and I'm using it anywhere I need or want something smaller and cleaner than Apache httpd.

I would like to contribute directly, but I don't know either Go or WebDAV anywhere near as well as the authors of the webdavfs or Caddy-WebDAV projects. 😒

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.