Awesome
remotefs
<p align="center"> <img src="/assets/logo.png" alt="logo" width="256" height="256" /> </p> <p align="center"> <a href="https://veeso.github.io/remotefs/blob/main/CHANGELOG.md" target="_blank">Changelog</a> · <a href="https://veeso.github.io/remotefs/#get-started" target="_blank">Get started</a> · <a href="https://docs.rs/remotefs" target="_blank">Documentation</a> </p> <p align="center">~ The Omni Filetransfer Client Library (and more!) ~</p> <p align="center">Developed by <a href="https://veeso.github.io/" target="_blank">@veeso</a></p> <p align="center">Current version: 0.3.1 (22/10/2024)</p> <p align="center"> <a href="https://opensource.org/licenses/MIT" ><img src="https://img.shields.io/badge/License-MIT-teal.svg" alt="License-MIT" /></a> <a href="https://github.com/veeso/remotefs-rs/stargazers" ><img src="https://img.shields.io/github/stars/veeso/remotefs-rs.svg?style=badge" alt="Repo stars" /></a> <a href="https://crates.io/crates/remotefs" ><img src="https://img.shields.io/crates/d/remotefs.svg" alt="Downloads counter" /></a> <a href="https://crates.io/crates/remotefs" ><img src="https://img.shields.io/crates/v/remotefs.svg" alt="Latest version" /></a> <a href="https://ko-fi.com/veeso"> <img src="https://img.shields.io/badge/donate-ko--fi-red" alt="Ko-fi" /></a> </p> <p align="center"> <a href="https://github.com/veeso/remotefs-rs/actions" ><img src="https://github.com/veeso/remotefs-rs/workflows/Linux/badge.svg" alt="Linux CI" /></a> <a href="https://github.com/veeso/remotefs-rs/actions" ><img src="https://github.com/veeso/remotefs-rs/workflows/MacOS/badge.svg" alt="MacOS CI" /></a> <a href="https://github.com/veeso/remotefs-rs/actions" ><img src="https://github.com/veeso/remotefs-rs/workflows/Windows/badge.svg" alt="Windows CI" /></a> <a href="https://coveralls.io/github/veeso/remotefs-rs" ><img src="https://coveralls.io/repos/github/veeso/remotefs-rs/badge.svg" alt="Coveralls" /></a> <a href="https://docs.rs/remotefs" ><img src="https://docs.rs/remotefs/badge.svg" alt="Docs" /></a> </p>About remotefs ☁️
remotefs is a library that provides a file system structure to work with all the most popular file transfer protocols.
This is achieved through a trait called RemoteFs
which exposes methods to operate on the remote file system.
Currently the library exposes a client for Sftp, Scp, Kube, Ftp, WebDAV and Aws-s3 as external libraries.
Why remotefs ❓
You might be wondering, "why remotefs?" The first and foremost reason is to provide a generic interface over multiple protocols. For example, in termscp it allows the support of multiple protocols without any protocol-specific code. The second reason is that often, users just want a simple way to operate on a remote file system, however, they don't have the time to spend researching the ins and outs of each protocol.
Using remotefs, this is no longer a problem: all you need is to configure the options to your liking, then you're ready to connect.
Features 🎁
- 📁 Different communication protocols
- Aws S3
- FTP and FTPS
- SFTP
- SCP
- SMB
- ✔️ Configurable: use only the client that you need
- 🤖 Extensible: adding new protocols is easy
- 🚀 Simple: easy to setup
- 😄 Understandable: no need to understand the underlying protocol
Get started 🚀
First, add remotefs
to your list of dependencies:
remotefs = "^0.3.0"
select over a variety of features:
find
: enable thefind()
method onRemoteFs
trait (enabled by default)no-log
: disable logging. By default, thelog
crate is used.
Client libraries 🔌
To use an existing client, you must add them to your Cargo.toml
, along with remotefs:
-
remotefs-aws-s3 = "^0.3.0"
-
remotefs-ftp = { version = "^0.3.0", features = [ "secure" ] }
-
remotefs-kube = "^0.3.0"
-
remotefs-smb = "^0.3.0"
-
remotefs-ssh = "^0.4.0"
-
remotefs-webdav = "^0.2.0"
Remote file system 💾
As mentioned earlier, this library exposes a trait called RemoteFs
.
This trait exposes several methods to operate on a remote file system via the chosen client.
Let's briefly go over which methods are available:
- connect: connect to the remote host.
- disconnect: disconnect from the remote host.
- is_connected: returns whether the client is connected to the remote host.
- append_file: append specified buffer to the specified file.
- append: open a file for append and returns a stream to write to it.
- change_dir: change the working directory to provided path.
- copy: copy a file from the specified source path to the specified destination.
- create_dir: create a directory with the specified file mode at the specified path.
- create_file: create a file at a specified path with the specified content.
- create: create a file and returns a stream to write to it.
- exec: executes a shell command.
- exists: checks whether file at specified path exists.
- list_dir: get entries at the provided path.
- mov: move a file from the specified source path to the specified destination.
- open_file: open a file for reading and fill the specified buffer with the file content.
- open: open a file and returns a stream to read it.
- pwd: get working directory.
- remove_dir_all: remove file/directory and all of its content.
- remove_dir: remove directory at the specified path. It fails if it is not an empty directory.
- remove_file: remove file at the specified path. It fails if it is not a file.
- setstat: set file metadata for file at the specified path.
- stat: get file information of file at the specified path.
- symlink: create a symlink at the specified path, pointing to the specified file.
Client compatibility table ✔️
The following table states the compatibility for each client associated with the remote file system trait method.
Note: connect()
, disconnect()
and is_connected()
MUST always be supported, and are so omitted in the table.
Client/Method | Aws-S3 | Ftp | Kube | Scp | Sftp | Smb | WebDAV |
---|---|---|---|---|---|---|---|
append_file | No | Yes | No | No | Yes | Yes | No |
append | No | Yes | No | No | Yes | No | No |
change_dir | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
copy | No | No | Yes | Yes | Yes | No | No |
create_dir | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
create_file | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
create | No | Yes | No | Yes | Yes | No | No |
exec | No | No | Yes | Yes | Yes | No | No |
exists | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
list_dir | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
mov | No | Yes | Yes | Yes | Yes | Yes | Yes |
open_file | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
open | No | Yes | No | Yes | Yes | No | No |
pwd | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
remove_dir_all | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
remove_dir | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
remove_file | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
setstat | No | No | Yes | Yes | Yes | No | No |
stat | Yes | Yes | Yes | Yes | Yes | Yes | Yes |
symlink | No | No | Yes | Yes | Yes | Yes | No |
Support the developer ☕
If you like remotefs and you're grateful for the work I've done, please consider a little donation 🥳
You can make a donation on the following platforms:
Apps using remotefs 🚀
Contributing and issues 🤝🏻
Contributions, bug reports, new features, and questions are welcome! 😉 If you have any questions or concerns, or you want to suggest a new feature, or you want just want to improve remotefs, feel free to open an issue or leave a pull request.
Please follow our contributing guidelines
Changelog ⏳
View remotefs` changelog HERE
License 📃
remotefs is licensed under the MIT license.
You can read the entire license HERE