#file-server #file-transfer #file-sharing #file-serving #http-server #ftp-server #tftp

app quick-serve

Quick Serve: A zero-config, multi-platform, multi-protocol standalone server for prompt file serving, with or without GUI

5 releases

0.2.1 Aug 18, 2024
0.2.0 Apr 15, 2024
0.1.2 Apr 8, 2024
0.1.1 Mar 5, 2024
0.1.0 Jan 9, 2024

#243 in Development tools

MIT license

190KB
893 lines

Build Status crates.io

Logo

Quick-serve

No setup, zero-config, multi-platform, multi-protocol, standalone server for developers or whoever wants to promptly serve some files over the network.

It can be used both headless or for an even more friendly experience, it can be used with a GUI:

Screenshot

Motivation

As an embedded software engineer, I routinely encounter the need for seamless file transfers between host and target devices in the course of various development tasks. Whether the objective is upgrading a system image, booting a Linux Kernel from the bootloader, retrieving packages from remote repositories, fetching a Git repository or sharing files with your colleague next desk, the constant requirement is a quick and straightforward file server. The capability to promptly set up an FTP, TFTP, or HTTP server proves to be a time-saving and efficient solution in navigating the most diverse file exchange scenarios.

I developed this application as an exercise in learning Rust because I couldn't find a solution that seamlessly served multiple protocols, was headless, and supported various platforms. Unlike many dedicated servers tailored for either Windows or Linux, with or without a UI, my app aims to bridge the gap by offering a versatile, multi-platform, and protocol-agnostic solution.

Usage

Quick-serve

Usage: quick-serve [OPTIONS]

Options:
  -b, --bind-ip=<IP>     Bind IP [default: 127.0.0.1]
  -p, --serve-dir=<DIR>  Path to serve [default: /tmp/]
  -v, --verbose...       Verbose logging
  -H, --http[=<PORT>]    Start the HTTP server [default port: 8080]
  -f, --ftp[=<PORT>]     Start the FTP server [default port: 2121]
  -t, --tftp[=<PORT>]    Start the TFTP server [default port: 6969]
  -h, --help             Print help (see more with '--help')
  -V, --version          Print version

Dependencies

Fedora

sudo dnf install glibc2-devel atk-devel cairo-devel pango-devel gdk-pixbuf2-devel gtk3-devel

Ubuntu

sudo apt install libatk1.0-dev libcairo2-dev libpango1.0-dev libgdk-pixbuf2.0-dev libgtk-3-dev

Install and Run

cargo install quick-serve
quick-serve

Build and Run

git clone https://github.com/joaofl/quick-serve.git
cd quick-serve
cargo run --release

The ui is optional and can be refrained from compilation with:

cargo build --release --no-default-features

Even if it is compiled, the UI can still be disabled at runtime.

Cross compile:

  • Install Docker
  • Install Cross
cargo install cross --git https://github.com/cross-rs/cross
  • Build
./cross-build-all.sh

Test

sudo apt install wget tftp
cargo build
cargo test

Implementation Goals

Supported Protocols

  • FTP
  • HTTP
  • TFTP
  • HTTPS
  • DHCP
  • SFTP
  • NFS
  • SAMBA

Interface

  • Command line
  • Local interface
  • Web interface
  • Terminal interface

Functionalities

  • Serve n files and exit
  • Serve for t seconds and exit
  • Show number of files being served
  • Report transfer rate
  • Report transferred files
  • Show statistics when exit
  • Color-code logs according to protocol
  • Add log filtering options
  • Refine on each protocol's specific logs

TODO

  • Fix excessive CPU usage when using the UI

Dependencies

~132MB
~3.5M SLoC