15 releases

Uses new Rust 2024

new 0.0.15 Feb 5, 2026
0.0.14 Feb 5, 2026
0.0.9 Jan 20, 2026
0.0.3 Dec 30, 2025

#1 in #amazing

Apache-2.0

450KB
10K SLoC

xtool

A collection of amazing command-line tools, featuring TFTP server/client, HTTP static file server, serial port tools, file transfer service, and disk image utilities.

Features

  • TFTP Server: RFC-compliant TFTP server with support for read/write operations
  • TFTP Client: Command-line client for downloading and uploading files
  • HTTP Server: Static file server with directory listing
  • Serial Tools: Serial port monitor, list, and network forwarding
  • File Transfer: Upload/download files via token-based service with encryption support
  • Disk Utilities: Create and manipulate disk images (GPT, ext4, FAT32)

Installation

cargo install --path .

Or install from crates.io:

cargo install xtool

Usage

TFTP Server

Start a TFTP server:

# Basic usage - serve files from /var/tftp on port 69
xtool tftpd /var/tftp

# Specify IP and port
xtool tftpd -i 127.0.0.1 -p 6969 /path/to/directory

# Read-only mode
xtool tftpd -r /path/to/directory

# Single port mode (useful behind NAT)
xtool tftpd -s /path/to/directory

TFTP Client

Download a file:

# Download file from server
xtool tftpc get 192.168.1.100 remote_file.txt

# Download to specific location
xtool tftpc get 192.168.1.100 remote_file.txt /path/to/local_file.txt

# Specify port and options
xtool tftpc get 192.168.1.100 remote_file.txt -p 6969 -b 8192 -t 10

Upload a file:

# Upload file to server
xtool tftpc put 192.168.1.100 local_file.txt

# Upload with different remote name
xtool tftpc put 192.168.1.100 local_file.txt remote_name.txt

# Specify options
xtool tftpc put 192.168.1.100 local_file.txt -p 6969 -b 8192 -t 10

HTTP Server

Start a static file HTTP server:

# Basic usage - serve current directory on port 80
xtool http

# Specify port and directory
xtool http -p 8080 -d /path/to/serve

Features:

  • Directory listing with HTML interface
  • Automatic MIME type detection
  • Serves index.html for directory requests

Serial Console

List available serial ports:

xtool serial list

Monitor a serial port (interactive shell):

# Monitor COM1 with default baud rate (115200)
xtool serial monitor COM1

# Monitor with specific baud rate
xtool serial monitor COM1 -b 9600

# Use configuration file defaults (if port is set in .xtool.toml)
xtool serial monitor

# Interactive port selection if no port specified
xtool serial

Key bindings:

  • Ctrl + ]: Exit monitor mode

Serial network forwarding (forward network to serial):

# Start server - forward TCP connections to serial port
xtool serial netd /dev/ttyUSB0 -b 115200 -p 5432

# Connect client - connect to serial server remotely
xtool serial netc -s 192.168.1.100 -p 5432

File Transfer

Upload a file and get a token:

# Upload a file
xtool file send ./sample.txt

# Upload with download limit
xtool file send ./sample.txt --limit 3

# Upload directory (auto-compressed)
xtool file send ./myfolder

# Upload with encryption
xtool file send ./secret.txt -k mypassword

# Send a text message (no file)
xtool file send -m "Hello, World!"

Download a file by token:

# Download to current directory
xtool file get 081607

# Specify output path
xtool file get 081607 -o ./downloads/sample.txt

# Decrypt downloaded file
xtool file get 081607 -k mypassword

Specify custom server:

xtool file send ./sample.txt -s http://localhost:8080
xtool file get 081607 -s http://localhost:8080

Disk Image Utilities

Create a blank disk image:

# Create 64MB disk image
xtool disk --disk disk.img mkimg --size 64M

# Create with overwrite
xtool disk --disk disk.img mkimg --size 1G --overwrite

Create GPT partition table:

# Create GPT from parameter.txt
xtool disk --disk disk.img mkgpt -f parameter.txt

# Skip confirmation
xtool disk --disk disk.img mkgpt -f parameter.txt -y

Format filesystem:

# Format partition as ext4
xtool disk --disk disk.img --part 1 mkfs --fstype ext4

# Format with label
xtool disk --disk disk.img --part 1 mkfs --fstype fat32 --label BOOT

List files in disk image:

# List root directory
xtool disk --disk disk.img ls

# List specific directory
xtool disk --disk disk.img --part 1 ls /boot

Copy files (host ↔ image):

# Copy from host to image
xtool disk --disk disk.img cp ./local.txt /dest.txt

# Copy from image to host
xtool disk --disk disk.img cp /remote.txt ./local.txt

# Recursive copy
xtool disk --disk disk.img cp -r ./mydir /destdir

# Force overwrite
xtool disk --disk disk.img cp -f ./local.txt /dest.txt

Move/rename files:

xtool disk --disk disk.img mv /oldname.txt /newname.txt

Remove files:

# Remove a file
xtool disk --disk disk.img rm /file.txt

# Remove directory recursively
xtool disk --disk disk.img rm -r /mydir

# Force remove (ignore errors)
xtool disk --disk disk.img rm -f /file.txt

Create directory:

# Create directory
xtool disk --disk disk.img mkdir /newdir

# Create parent directories
xtool disk --disk disk.img mkdir -p /a/b/c

Display file content:

# Cat a file
xtool disk --disk disk.img cat /boot/config.txt

# Read first N bytes
xtool disk --disk disk.img cat /large.bin --bytes 1024

# Read from offset
xtool disk --disk disk.img cat /file.bin --offset 512

Show disk info:

# Display disk and partition info
xtool disk --disk disk.img info

# JSON output
xtool disk --disk disk.img info --json

Configuration File

Generate a configuration file (.xtool.toml):

# Generate config in current directory
xtool genconfig

# Force overwrite existing config
xtool genconfig --force

The configuration file supports settings for:

  • TFTP server (ip, port, read_only, single_port)
  • TFTP client (server, port, block_size, timeout)
  • Serial (uart, baud, net_port, net_bind)

Options

TFTP Server Options:

  • -i, --ip <IP>: IP address to bind (default: 0.0.0.0)
  • -p, --port <PORT>: Port to listen on (default: 69)
  • -r, --read-only: Enable read-only mode (disable writes)
  • -s, --single-port: Use single port mode

TFTP Client Options:

  • -p, --port <PORT>: Server port (default: 69)
  • -b, --block-size <SIZE>: Block size in bytes (default: 512, max: 65464)
  • -t, --timeout <SECONDS>: Timeout in seconds (default: 5)

HTTP Server Options:

  • -p, --port <PORT>: Port to listen on (default: 80)
  • -d, --path <PATH>: Root directory to serve (default: current directory)

Serial Options:

  • -b, --baud <RATE>: Baud rate (default: 115200)

Disk Options:

  • --disk <PATH>: Target disk image path (required for all disk commands)
  • --part <ID|NAME>: Select partition by index or name

Examples

Running Tests

# Run all tests
cargo test

# Run only integration tests
cargo test --test tftp_integration_test

# Run with output
cargo test -- --nocapture

Example Session

TFTP:

Terminal 1 (Server):

$ xtool tftpd -p 6969 ./files
[14:20:00 INFO] Starting TFTP server on 0.0.0.0:6969
[14:20:00 INFO] Root directory: ./files
[14:20:00 INFO] TFTP server listening, press Ctrl+C to stop

Terminal 2 (Client):

$ xtool tftpc get 127.0.0.1 test.txt -p 6969
[14:20:15 INFO] Downloading test.txt from 127.0.0.1:6969
[14:20:15 INFO] Download completed successfully

$ xtool tftpc put 127.0.0.1 upload.txt -p 6969
[14:20:30 INFO] Uploading upload.txt to 127.0.0.1:6969
[14:20:30 INFO] Upload completed successfully

HTTP Server:

$ xtool http -p 8080 -d ./public
[14:20:00 INFO] HTTP server listening on http://0.0.0.0:8080
[14:20:00 INFO] Serving directory: /home/user/public

Disk Image Operations:

# Create and format a disk image
$ xtool disk --disk test.img mkimg --size 64M
$ xtool disk --disk test.img mkgpt -f parameter.txt -y
$ xtool disk --disk test.img --part 1 mkfs --fstype ext4

# Copy files to image
$ xtool disk --disk test.img cp ./boot.sh /boot.sh
$ xtool disk --disk test.img ls /

License

Apache-2.0

Dependencies

~34–56MB
~864K SLoC