From e922139a31d25ce72bb22bfcfab1224b8ab32c8c Mon Sep 17 00:00:00 2001 From: Falk Werner Date: Sat, 7 Jan 2023 18:55:06 +0100 Subject: [PATCH] add project documentation --- CMakeLists.txt | 12 ++++---- README.md | 74 +++++++++++++++++++++++++++++++++++++++++++----- doc/README.md | 4 +++ doc/build.md | 35 +++++++++++++++++++++++ doc/concept.png | Bin 0 -> 22387 bytes doc/concept.uml | 26 +++++++++++++++++ doc/protocol.md | 44 +++++++++++++++------------- 7 files changed, 162 insertions(+), 33 deletions(-) create mode 100644 doc/README.md create mode 100644 doc/build.md create mode 100644 doc/concept.png create mode 100644 doc/concept.uml diff --git a/CMakeLists.txt b/CMakeLists.txt index fc41227..966db70 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,7 @@ cmake_minimum_required(VERSION 3.10) project(webfuse VERSION 2.0.0) +option(WITHOUT_PROVIDER "Disabled build of webfuse provider" OFF) option(WITHOUT_TEST "Disables unit and integration tests" OFF) option(WITHOUT_CLANG_TIDY "Disables clang tidy" OFF) @@ -43,17 +44,16 @@ set_property( endif() -add_executable(webfuse - src/main.cpp) - +add_executable(webfuse src/main.cpp) target_link_libraries(webfuse PRIVATE webfuse_static) +install(TARGETS webfuse DESTINATION bin) -if(NOT(WITHOUT_PROVIDER)) -add_executable(webfuse_provider - src/provider_main.cpp) +if(NOT(WITHOUT_PROVIDER)) +add_executable(webfuse_provider src/provider_main.cpp) target_link_libraries(webfuse_provider PRIVATE webfuse_static) +install(TARGETS webfuse_provider DESTINATION bin) endif() diff --git a/README.md b/README.md index 2d68498..6b7dde4 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,72 @@ [![build](https://github.com/falk-werner/webfuse/actions/workflows/build.yml/badge.svg)](https://github.com/falk-werner/webfuse/actions/workflows/build.yml) -# webfuse2 +# webfuse -Reimplementation of webfuse. +webfuse combines libwebsockets and libfuse. It allows to attach a remote filesystem via websockets. -## Build +## Motivation -```` -cmake -B build -cmake --build build -```` \ No newline at end of file +Many embedded devices, such as smart home or [IoT](https://en.wikipedia.org/wiki/Internet_of_things) devices are very limited regarding to their (non-volatile) memory resources. Such devices are typically comprised of an embedded linux and a small web server, providing an interface for maintenance purposes. + +Some use cases, such as firmware update, require to transfer (larger) files to the device. The firmware file is often stored multiple times on the device: + +1. cached by the web server, e.g. [lighttpd](https://redmine.lighttpd.net/boards/2/topics/3451) +2. copied to locally, e.g. /tmp +3. uncompressed, also to /tmp + +Techniques like [SquashFS](https://en.wikipedia.org/wiki/SquashFS) help to avoid the third step, since the upgrade file can be mounted directly. [RAUC](https://rauc.io/) shows the use of SquashFS within an update facility. +However at least one (unecessary) copy of the upload file is needed on the device. + +To avoid Steps 1 and 2, it would be great to keep the update file entirely in web server, just like [NFS](https://en.wikipedia.org/wiki/Network_File_System) or [WebDAV](https://wiki.archlinux.org/index.php/WebDAV). Unfortunately, NFS is not based on any protocol, natively usable by a web application. WebDAV is based on HTTP, but it needs a server providing the update file. + +webfuse solves this problem by using the [WebSocket](https://en.wikipedia.org/wiki/WebSocket) protocol. The emdedded device runs a service, known as webfuse adapter, awaiting incoming connections, e.g. from a web browser. The browser acts as a file system provider, providing the update file to the device. + +## Concept + +![concept](doc/concept.png) + +With webfuse it is possible to implement remote filesystems based on websockets. +Therefore, webfuse defined two roles participating in a webfuse connection: + +- webfuse service +- webfuse provider + +### Webfuse Service + +A `webfuse service` is both, +- a [websocket](https://en.wikipedia.org/wiki/WebSocket) service providing the `webfuse` protocol +- a [fuse](https://github.com/libfuse/libfuse) filesystem attached to a local mountpoint + +The `webfuse service` awaits incoming connections from a `webfuse provider`. Once connected, it communicates all the filesystem requests originated by the `libfuse` to the connected `webfuse provider` using the `websocket`-based `webfuse protocol`. + +By doing so, `webfuse` allows to inject a filesystem to a remote device. + +### Webfuse Provider + +A `webfuse provider` provides a filesystem to a remote device using the `websocket`-based `webfuse protocol`. Therefore, a `webfuse provider` implements a `websocket` client. + + +## Similar Projects + +### Davfs2 + +[davfs2](http://savannah.nongnu.org/projects/davfs2) is a Linux file system driver that allows to mount a [WebDAV](https://wiki.archlinux.org/index.php/WebDAV) resource. WebDAV is an extension to HTTP/1.1 that allows remote collaborative authoring of Web resources. + +Unlike webfuse, davfs2 mounts a remote filesystem locally, that is provided by a WebDAV server. In contrast, webfuse starts a server awaiting client connections to attach the remote file system. + +## Further Documentation + +- [Build instructions](doc/build.md) +- [Webfuse Protocol](doc/protocol.md) + +## webfuse legacy + +`webfuse2` is a complete re-implementation of the original idea behind `webfuse`. In contrast to the original `webfuse` implementation, `webfuse2` provides also write access to the filesystem and allows to use all standard options of a fuse filesystem. + +But `webfuse2` marks also some breaking changes: + +- `webfuse2` uses a new, binary protocol which is not compatible to the JSON-based protocol of legacy `webfuse` +- `webfuse` does not provide an API nor a library to program against + _(if you are interested in an API or a library for webfuse2 feel free to create an issue)_ + +When you are interested in the original `webfuse` implementation take a look at it [branch](https://github.com/falk-werner/webfuse/tree/master). diff --git a/doc/README.md b/doc/README.md new file mode 100644 index 0000000..f193966 --- /dev/null +++ b/doc/README.md @@ -0,0 +1,4 @@ +# webfuse developer documentation + +- [Build instructions](build.md) +- [Webfuse2 protocol](protocol.md) diff --git a/doc/build.md b/doc/build.md new file mode 100644 index 0000000..2f40343 --- /dev/null +++ b/doc/build.md @@ -0,0 +1,35 @@ +# webfuse build instructions + +## Build + +```` +cmake -B build +cmake --build build +sudo cmake --install build +```` + +## Build options + +| Options | Default | Description | +| ------------------ | -------- | ----------- | +| WITHOUT_PROVIDER | OFF | Disables build of webfuse provider | +| WITHOUT_TEST | OFF | Disables build of unit and integration tests | +| WITHOUT_CLANG_TIDY | OFF | Disables running clang tidy on build | + +## Dependencies + +- [libfuse](https://github.com/libfuse/libfuse) +- [libwebsockets](https://libwebsockets.org/) + +### Optional dependencies + +- [googletest](https://github.com/google/googletest) +- [valgrind](https://valgrind.org/) +- [clang-tidy](https://clang.llvm.org/extra/clang-tidy/) + +## Additional cmake targets + +| Target | Description | +| -------- | ----------- | +| test | runs unit and integration tests | +| memcheck | runs unit test with valgrind/memcheck | diff --git a/doc/concept.png b/doc/concept.png new file mode 100644 index 0000000000000000000000000000000000000000..bf5b87560850abe68dd38a5697d03ad898306143 GIT binary patch literal 22387 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 C&XPR< literal 0 HcmV?d00001 diff --git a/doc/concept.uml b/doc/concept.uml new file mode 100644 index 0000000..e4dcb20 --- /dev/null +++ b/doc/concept.uml @@ -0,0 +1,26 @@ +@startuml +participant "webfuse provider" as provider +participant "webfuse service" as service +actor "user" as user + +group startup +service -> service : fuse_mount +service -> service : start websocket server +end +... + +group connect +provider -> service : connect +end +... + + +group directory listing +user -> service : ls +service -> provider : readdir request +provider --> service : readdir response +service --> user : [., ..] +end +... + +@enduml \ No newline at end of file diff --git a/doc/protocol.md b/doc/protocol.md index 9993862..b6cda83 100644 --- a/doc/protocol.md +++ b/doc/protocol.md @@ -2,34 +2,38 @@ ## Scope -This document describes the webfuse 2 communication protocol. The protocol is used to transfer messages between a `webfuse2 service` and a `webfuse2 provider`. In contrast to `legacy webfuse`, which is based on `JSON RPC` the `webfuse2 protocol` is a binary protocol. +This document describes the webfuse 2 communication protocol. The protocol is used to transfer messages between a `webfuse service` and a `webfuse provider`. In contrast to `legacy webfuse`, which is based on `JSON RPC` the `webfuse2 protocol` is a binary protocol. ## Definitions -### Webfuse2 Service +### Webfuse Service -A `webfuse2 service` is both, -- a [websocket](https://en.wikipedia.org/wiki/WebSocket) service providing the `webfuse2` protocol +A `webfuse service` is both, +- a [websocket](https://en.wikipedia.org/wiki/WebSocket) service providing the `webfuse` protocol - a [fuse](https://github.com/libfuse/libfuse) filesystem attached to a local mountpoint -The `webfuse2 service` awaits incoming connections from a `webfuse2 provider`. Once connected, it communicates all the filesystem requests originated by the `libfuse` to the connected `webfuse2 provider` using the `websocket`-based `webfuse2 protocol`. +The `webfuse service` awaits incoming connections from a `webfuse provider`. Once connected, it communicates all the filesystem requests originated by the `libfuse` to the connected `webfuse provider` using the `websocket`-based `webfuse protocol`. -By doing so, `webfuse2` allows to inject a filesystem to a remote device. +By doing so, `webfuse` allows to inject a filesystem to a remote device. -### Webfuse2 Provider +### Webfuse Provider -A `webfuse2 provider` provides a filesystem to a remote device using the `websocket`-based `webfuse2 protocol`. Therefore, a `webfuse2 provider` implements a `websocket` client. +A `webfuse provider` provides a filesystem to a remote device using the `websocket`-based `webfuse protocol`. Therefore, a `webfuse provider` implements a `websocket` client. + +## Websocket protocol name + +The webfuse2 protocol uses the following websocket protocol name: `webfuse2`. ## Message exchange Once connected, the `webfuse2 protocol` implements a strict request-response scheme, where -- all requests are send by the `webfuse2 service`, +- all requests are send by the `webfuse service`, - all requests require a response and -- all responses are send by the `webfuse2 provider` +- all responses are send by the `webfuse provider` -Note that this communication is reversed the typical client-server-communication scheme. In `webfuse2` the `webfuse2 serive` (server) sends all the requests and the `webfuse provider` (client) sends the responses. +Note that this communication is reversed the typical client-server-communication scheme. In `webfuse` the `webfuse service` (server) sends all the requests and the `webfuse provider` (client) sends the responses. -For message transfer, the [websocket](https://en.wikipedia.org/wiki/WebSocket) protocol is used. All messages are in binary form, plain text messages are never used by the `webfuse2 protocol`. +For message transfer, the [websocket](https://en.wikipedia.org/wiki/WebSocket) protocol is used. All messages are in binary form, plain text messages are never used by the `webfuse protocol`. ## Endianness @@ -259,27 +263,27 @@ _Note that the following numbers are in `octal` notation._ | type | u8 | Type of the message | | payload | u8[] | Payload according to the message type | -The `id` is just a number without any meaning for the `webfuse2 provider`. It is set by the `webfuse2 service` of a request and is copied by the `webfuse2 provider` to the response. A `webfuse2 service` implementation might choose to keep track on pending requests using the `id`. +The `id` is just a number without any meaning for the `webfuse provider`. It is set by the `webfuse service` of a request and is copied by the `webfuse provider` to the response. A `webfuse service` implementation might choose to keep track on pending requests using the `id`. ### Erroneous Responses -Most responses contain a `result` encoding the status of the operation. While successful responses may contain additional data, erroneous responses must not be decoded by a `webfuse2 service` implementation beyond the `result` value. +Most responses contain a `result` encoding the status of the operation. While successful responses may contain additional data, erroneous responses must not be decoded by a `webfuse service` implementation beyond the `result` value. ### Unknown requests -There are two reserved message types in `webfuse2`: +There are two reserved message types: - **0x00:** Unknown request - **0x80:** Unknown response -A `webfuse2 service` may send a request of type `unknown request` for conformance testing reasons. +A `webfuse service` may send a request of type `unknown request` for conformance testing reasons. -Since each request requires a response, a `webfuse2 provider` must respond to any unknown requests with a message of `unknown response` type. This allows to add new request types in future. +Since each request requires a response, a `webfuse provider` must respond to any unknown requests with a message of `unknown response` type. This allows to add new request types in future. ### Accept additional data in requests -Both, a `webfuse2 provider` and a `webfuse service` must accept messages that contain more data than specified. This allows to add optional fields to existing requests and / or responses in future. +Both, a `webfuse provider` and a `webfuse service` must accept messages that contain more data than specified. This allows to add optional fields to existing requests and / or responses in future. -_Note there are no optional fields in the current revision of the `webfuse2 protocol`. +_Note there are no optional fields in the current revision of the `webfuse2 protocol` yet._ ### Message Types @@ -312,7 +316,7 @@ _Note that the following numbers are in `hexadecimal` notation._ ## Methods -Since `webfuse2` aims to communicate the `libfuse API` over a `websocket` connection, `webfuse2` methods are tightly connected to [fuse operations](https://libfuse.github.io/doxygen/structfuse__operations.html) which itself have a tight connection to `posix filesystem operations`. Therefore, additional information about most `webfuse2` operations can be found in the [fuse operations documentation](https://libfuse.github.io/doxygen/structfuse__operations.html) and / or the [man pages](https://man7.org/index.html). +Since `webfuse` aims to communicate the `libfuse API` over a `websocket` connection, `webfuse` methods are tightly connected to [fuse operations](https://libfuse.github.io/doxygen/structfuse__operations.html) which itself have a tight connection to `posix filesystem operations`. Therefore, additional information about most `webfuse` operations can be found in the [fuse operations documentation](https://libfuse.github.io/doxygen/structfuse__operations.html) and / or the [man pages](https://man7.org/index.html). ### access