# 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: ```env 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:** ```bash curl http://localhost:8989/api/temperature # Response: {"success":true,"temperature":45.2,"unit":"Celsius"} ``` **Upload File:** ```bash curl -X POST -F "type=kernel" -F "file=@Image.gz" http://localhost:8989/api/upload ``` **Reboot System:** ```bash curl -X POST http://localhost:8989/api/reboot ``` **Read Boot Config:** ```bash curl http://localhost:8989/api/extlinux ``` **Write Boot Config:** ```bash 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 blob - `uboot_bin` - U-Boot bootloader - `uboot_env` - U-Boot environment - `extlinux` - Bootloader configuration ## Building ```bash # 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