Skip to main content

FastAPI firmware file server with upload UI and syslog receiver

Project description

FWServe

A FastAPI-based firmware file server that automatically serves .bin files from a configured directory, with a web upload UI and integrated syslog receiver.

Features

  • Automatic detection of new .bin files
  • RESTful API for listing and downloading files
  • Web UI for uploading .bin files
  • Integrated syslog server (UDP + TCP)
  • Real-time syslog viewer with filtering
  • CLI for easy installation as a systemd service
  • Runs as a Linux systemd service

Installation

From PyPI

pip install fwserve

From Source

# Clone the repository
git clone https://github.com/yourusername/fwserve.git
cd fwserve

# Install with pip
pip install .

# Or install with development dependencies
pip install -e ".[dev]"

Quick Start

Run in Development Mode

# Run with default settings (port 8080, current directory)
fwserve run

# Run with custom settings
fwserve run --port 8080 --directory /path/to/files --reload

Install as a Service (Linux)

# Install with default settings (requires root)
sudo fwserve install

# Install with custom settings
sudo fwserve install --port 80 --syslog-port 514

# Check service status
fwserve status

# Uninstall the service
sudo fwserve uninstall

API Endpoints

Endpoint Method Description
/health GET Health check
/files GET List available .bin files
/files/{filename} GET Download a specific file
/upload GET Upload form UI
/upload POST Upload a .bin file
/syslog GET Real-time syslog viewer UI
/syslog/history GET Get recent syslog entries
/syslog/stream GET SSE stream of syslog entries

CLI Commands

# Show help
fwserve --help

# Run the server
fwserve run --host 0.0.0.0 --port 8080 --directory ./files

# Install as systemd service (requires root)
sudo fwserve install --port 80 --syslog-port 514

# Check service status
fwserve status

# Uninstall service (requires root)
sudo fwserve uninstall

Configuration

Configuration is done via environment variables:

Server Settings

Variable Default Description
FWSERVE_HOST 0.0.0.0 Host to bind to
FWSERVE_PORT 8080 HTTP port to listen on
FWSERVE_DIRECTORY . Directory to serve files from
FWSERVE_LOG_LEVEL INFO Logging level
FWSERVE_TIMEZONE America/New_York Timezone for timestamps

Upload Settings

Variable Default Description
FWSERVE_UPLOAD_MAX_BYTES 104857600 Maximum upload size (100MB)

Syslog Settings

Variable Default Description
SYSLOG_ENABLE_UDP true Enable UDP syslog listener
SYSLOG_ENABLE_TCP true Enable TCP syslog listener
SYSLOG_UDP_PORT 5514 UDP port for syslog
SYSLOG_TCP_PORT 5514 TCP port for syslog
SYSLOG_LOG_FILE <directory>/syslog.log Path to syslog storage file
SYSLOG_TAIL_SIZE 5000 Number of entries to keep in memory
SYSLOG_HISTORY_LIMIT 500 Max entries returned by history endpoint

Usage Examples

List available files

curl http://localhost:8080/files

Response:

{
  "files": ["firmware_v1.0.bin", "update_v2.1.bin"]
}

Download a file

curl -O http://localhost:8080/files/firmware_v1.0.bin

Upload a file

curl -X POST -F "file=@firmware.bin" http://localhost:8080/upload

Send syslog messages

# UDP
echo "<14>Test message from host1" | nc -u localhost 5514

# TCP
echo "<14>Test message from host1" | nc localhost 5514

Get syslog history with filters

# Get all entries
curl http://localhost:8080/syslog/history

# Filter by host
curl "http://localhost:8080/syslog/history?host=router1"

# Filter by severity and message
curl "http://localhost:8080/syslog/history?severity=err&q=failed"

Running Tests

# Install dev dependencies
pip install -e ".[dev]"

# Run tests
pytest tests/ -v

# Run type checking
mypy src/fwserve/

# Run linter
ruff check src/

Building the Package

# Install build dependencies
pip install build

# Build wheel and sdist
python -m build

# The built packages will be in dist/
ls dist/
# fwserve-1.0.0-py3-none-any.whl
# fwserve-1.0.0.tar.gz

Service Management

After installing with fwserve install:

# Start service
sudo systemctl start fwserve

# Stop service
sudo systemctl stop fwserve

# Restart service
sudo systemctl restart fwserve

# View status
sudo systemctl status fwserve

# View logs
sudo journalctl -u fwserve -f

Security Notes

  • Only .bin files are served/uploaded
  • Path traversal attacks are blocked
  • Service runs as dedicated non-root user (fwserve)
  • Systemd security hardening is enabled
  • Files directory has restricted write access

Project Structure

fwserve/
├── pyproject.toml       # Package configuration
├── README.md
├── src/
│   └── fwserve/
│       ├── __init__.py
│       ├── app.py           # FastAPI application
│       ├── cli.py           # Click CLI
│       ├── config.py        # Configuration
│       ├── file_watcher.py  # Directory monitoring
│       ├── syslog_parser.py # Syslog message parsing
│       ├── syslog_server.py # UDP/TCP listeners
│       └── syslog_store.py  # File-backed storage
└── tests/
    ├── test_main.py
    └── test_syslog.py

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fwserve-1.0.0.tar.gz (16.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fwserve-1.0.0-py3-none-any.whl (18.8 kB view details)

Uploaded Python 3

File details

Details for the file fwserve-1.0.0.tar.gz.

File metadata

  • Download URL: fwserve-1.0.0.tar.gz
  • Upload date:
  • Size: 16.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fwserve-1.0.0.tar.gz
Algorithm Hash digest
SHA256 a83e8db422aaf208aee73884f3be757b74c3c649e7c912d87b649e3a2d916c2d
MD5 3cbb27b78cbeb076c300ffb195c3b41f
BLAKE2b-256 6d2eefe899aaae0f99829a6f8ea8147b1d8bcc9567bae17e5d56dc49b8459452

See more details on using hashes here.

Provenance

The following attestation bundles were made for fwserve-1.0.0.tar.gz:

Publisher: ci.yml on liptonj/workflows2025

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file fwserve-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: fwserve-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 18.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for fwserve-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a7ec5ab840792a06a70a4e283bda783d204cf06044df5771cc916a844ec966e9
MD5 68ce81b57b0f77e0ed2f6a6275bfaa11
BLAKE2b-256 73ab70ae2877e850f5245a6d9c8960c1693457f72d7a78190cf6f2d1fe3a3315

See more details on using hashes here.

Provenance

The following attestation bundles were made for fwserve-1.0.0-py3-none-any.whl:

Publisher: ci.yml on liptonj/workflows2025

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page