7127bc0fea7260e405bb1e94e70ec0f5996846b4
UP - Embedded Linux Update Server
A Go-based HTTP server for managing embedded Linux system updates, designed for Orange Pi Zero 2W (Allwinner H618) and similar ARM-based devices.
Overview
This server provides a web interface and REST API for:
- Uploading and managing boot files (U-Boot, kernel, DTB)
- Editing extlinux boot configuration
- Monitoring system temperature
- Remote system reboot
- File version tracking
Project Structure
up/
├── main.go # Application entry point
├── go.mod # Go module definition
├── up.conf # Environment configuration file
├── api/ # HTTP handlers
│ ├── frontend/ # Embedded web UI (HTML, CSS, JS)
│ ├── Extlinux.go # Boot config read/write router
│ ├── ExtlinuxRead.go # Read extlinux.conf
│ ├── ExtlinuxWrite.go # Write extlinux.conf
│ ├── FileDate.go # Get file version timestamps
│ ├── HandleReboot.go # System reboot endpoint
│ ├── HandleTemperature.go # Temperature monitoring
│ ├── HandleUpload.go # File upload handler
│ ├── MountStatus.go # Mount status checker
│ └── spa.go # SPA file server
├── server/ # Server configuration
│ ├── Configure.go # Route configuration
│ └── Run.go # Server startup (HTTP/HTTPS)
└── utils/ # Utility functions
├── mtd/ # MTD (Memory Technology Device) utilities
├── EnsureDir.go # Directory creation
├── GetTargetFilename.go # Filename resolution by type
├── LoadEnv.go # Environment loader
├── MountDevice.go # Device mounting
└── WriteUbootToDevices.go # U-Boot flashing
Configuration
The server uses up.conf (dotenv format) for configuration:
ENABLE_TLS=false # Enable HTTPS
CERT_FILE=cert.crt # TLS certificate path
KEY_FILE=privkey.key # TLS key path
SERVER_ADDRESS=0.0.0.0 # Bind address
SERVER_PORT=8989 # Bind port
MOUNT_POINT=/media # Mount point for target device
DEVICE=/dev/mmcblk1p1 # Target block device
KERNEL_FILE=Image.gz # Kernel image filename
DTB_FILE=sun50i-h618-orangepi-zero2w.dtb # Device tree blob
UBOOT_FILE=uboot.env # U-Boot environment file
EXTLINUX_FILE=extlinux/extlinux.conf # Bootloader config
MAX_FILE_SIZE=200 # Max upload size (MB)
UBOOT_BIN_FILE=u-boot-sunxi-with-spl.bin # U-Boot binary
UBOOT_MAX_SIZE=1 # Max U-Boot size (MB)
MMC_BOOT_OFFSET=8192 # MMC boot offset
API Endpoints
| Endpoint | Method | Description |
|---|---|---|
/ |
GET | Web UI (SPA) |
/api/mount |
GET | Get mount status |
/api/extlinux |
GET | Read extlinux.conf |
/api/extlinux |
POST | Write extlinux.conf |
/api/filedate |
GET | Get file version date |
/api/temperature |
GET | Get CPU temperature |
/api/upload |
POST | Upload files |
/api/reboot |
POST | Reboot system |
API Examples
Get Temperature:
curl http://localhost:8989/api/temperature
# Response: {"success":true,"temperature":45.2,"unit":"Celsius"}
Upload File:
curl -X POST -F "type=kernel" -F "file=@Image.gz" http://localhost:8989/api/upload
Reboot System:
curl -X POST http://localhost:8989/api/reboot
Read Boot Config:
curl http://localhost:8989/api/extlinux
Write Boot Config:
curl -X POST -H "Content-Type: application/json" \
-d '{"content":"default linux\n label linux\n kernel /Image.gz\n"}' \
http://localhost:8989/api/extlinux
Supported Upload Types
The server supports uploading the following file types:
kernel- Kernel image (Image.gz)dtb- Device tree blobuboot_bin- U-Boot bootloaderuboot_env- U-Boot environmentextlinux- Bootloader configuration
Building
# Build
go build -o up
# Run
./up
Requirements
- Go 1.26+
- Root privileges (for mounting devices and rebooting)
- Target storage device (eMMC/SD card)
Features
- Web Interface: Embedded SPA frontend for easy management
- TLS Support: Optional HTTPS with certificate configuration
- Progress Tracking: Real-time upload progress monitoring
- Version Tracking: Automatic timestamp logging for uploaded files
- Safe Reboot: Graceful unmount and sync before reboot
- Temperature Monitoring: CPU thermal sensor readings
Languages
Go
44.1%
JavaScript
23.9%
CSS
16.2%
HTML
15.8%