#!/bin/bash
set -euo pipefail
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() {
echo -e "${GREEN}[INFO]${NC} $1"
}
log_warn() {
echo -e "${YELLOW}[WARN]${NC} $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
log_step() {
echo -e "${BLUE}[STEP]${NC} $1"
}
VERSION="1.0.0"
BUILD_DATE=$(date +%Y%m%d)
RELEASE_DIR="release-${BUILD_DATE}"
FIRMWARE_DIR="output"
CHANGELOG_FILE="CHANGELOG.md"
get_git_info() {
if [ -d ".git" ]; then
GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
GIT_BRANCH=$(git rev-parse --abbrev-ref HEAD 2>/dev/null || echo "unknown")
GIT_TAG=$(git describe --tags --exact-match 2>/dev/null || echo "")
else
GIT_COMMIT="unknown"
GIT_BRANCH="unknown"
GIT_TAG=""
fi
}
create_release_dir() {
log_step "创建发布目录"
if [ -d "$RELEASE_DIR" ]; then
log_warn "发布目录已存在,删除旧目录"
rm -rf "$RELEASE_DIR"
fi
mkdir -p "$RELEASE_DIR"
mkdir -p "$RELEASE_DIR/firmware"
mkdir -p "$RELEASE_DIR/tools"
mkdir -p "$RELEASE_DIR/docs"
log_info "发布目录创建完成: $RELEASE_DIR"
}
copy_firmware_files() {
log_step "复制固件文件"
if [ ! -d "$FIRMWARE_DIR" ]; then
log_error "固件目录不存在: $FIRMWARE_DIR"
exit 1
fi
sysupgrade_files=$(find "$FIRMWARE_DIR" -name "*sysupgrade.bin" 2>/dev/null || true)
factory_files=$(find "$FIRMWARE_DIR" -name "*factory.bin" 2>/dev/null || true)
if [ -z "$sysupgrade_files" ] && [ -z "$factory_files" ]; then
log_error "未找到固件文件"
exit 1
fi
for file in $sysupgrade_files $factory_files; do
if [ -f "$file" ]; then
cp "$file" "$RELEASE_DIR/firmware/"
log_info "复制固件: $(basename "$file")"
fi
done
log_info "固件文件复制完成"
}
copy_tool_scripts() {
log_step "复制工具脚本"
if [ -f "scripts/flash-firmware.sh" ]; then
cp "scripts/flash-firmware.sh" "$RELEASE_DIR/tools/"
chmod +x "$RELEASE_DIR/tools/flash-firmware.sh"
log_info "复制刷写脚本"
fi
if [ -f "scripts/setup-environment.sh" ]; then
cp "scripts/setup-environment.sh" "$RELEASE_DIR/tools/"
chmod +x "$RELEASE_DIR/tools/setup-environment.sh"
log_info "复制环境设置脚本"
fi
log_info "工具脚本复制完成"
}
generate_release_notes() {
log_step "生成发布说明"
get_git_info
cat > "$RELEASE_DIR/README.txt" << EOF
OpenWrt TP842N-V3 打印服务器固件
=====================================
版本信息:
- 固件版本: ${VERSION}
- 构建日期: $(date +%Y-%m-%d)
- Git 提交: ${GIT_COMMIT}
- Git 分支: ${GIT_BRANCH}
- OpenWrt 版本: 23.05.3
功能特性:
✓ 基于 OpenWrt 23.05.3 稳定版
✓ 集成 CUPS 2.4.x 中文打印服务
✓ 预装 HP LaserJet 系列驱动
✓ USB 打印机即插即用支持
✓ 定时重启功能
✓ 中文 Web 管理界面
默认配置:
- LAN IP: 192.168.10.1
- Web 登录: admin / thdn12345678
- Wi-Fi SSID: THDN-dayin
- Wi-Fi 密码: thdn12345678
- 主机名: THDN-PrintServer
支持的打印机型号:
- HP LaserJet 1020
- HP LaserJet 1020plus
- HP LaserJet 1007
- HP LaserJet 1008
- HP LaserJet 1108
刷写方法:
1. TFTP 刷写: 使用 tools/flash-firmware.sh -t <固件文件>
2. Web 刷写: 访问 http://192.168.10.1 进行升级
3. SSH 刷写: 使用 tools/flash-firmware.sh -s <IP> <固件文件>
注意事项:
- 刷写前请备份原厂固件
- 确保电源稳定,刷写过程中不要断电
- 首次启动可能需要 2-3 分钟
技术支持:
- 项目基于 OpenWrt 官方源码
- 使用国内源码镜像加速构建
- 定期更新依赖包至最新稳定版
构建环境:
- Ubuntu 22.04 LTS
- 4GB+ RAM
- 20GB+ 磁盘空间
许可证: GPL-2.0
EOF
log_info "发布说明生成完成"
}
generate_checksums() {
log_step "生成文件校验和"
cd "$RELEASE_DIR"
find . -type f -name "*.bin" -o -name "*.sh" | sort | xargs md5sum > MD5SUMS.txt
find . -type f -name "*.bin" -o -name "*.sh" | sort | xargs sha256sum > SHA256SUMS.txt
cd ..
log_info "校验和生成完成"
}
create_archive() {
log_step "创建发布压缩包"
local archive_name="openwrt-tp842n-v3-printserver-${BUILD_DATE}.tar.gz"
tar -czf "$archive_name" "$RELEASE_DIR"
md5sum "$archive_name" > "${archive_name}.md5"
sha256sum "$archive_name" > "${archive_name}.sha256"
log_info "压缩包创建完成: $archive_name"
}
show_release_info() {
log_step "发布信息汇总"
echo ""
echo "=============================================="
echo "OpenWrt TP842N-V3 打印服务器固件发布"
echo "=============================================="
echo "发布目录: $RELEASE_DIR"
echo "构建日期: $(date +%Y-%m-%d)"
echo "版本号: $VERSION"
echo ""
echo "发布内容:"
ls -la "$RELEASE_DIR"
echo ""
echo "压缩包:"
ls -la *.tar.gz 2>/dev/null || echo "无压缩包"
echo ""
echo "校验和:"
cat "${RELEASE_DIR}/MD5SUMS.txt" 2>/dev/null || echo "无 MD5 校验和"
echo "=============================================="
}
cleanup_old_releases() {
log_step "清理旧发布"
find . -maxdepth 1 -type d -name "release-*" | sort -r | tail -n +6 | while read dir; do
if [ -d "$dir" ]; then
log_info "删除旧发布: $dir"
rm -rf "$dir"
fi
done
find . -maxdepth 1 -type f -name "*.tar.gz" | sort -r | tail -n +6 | while read file; do
if [ -f "$file" ]; then
log_info "删除旧压缩包: $file"
rm -f "$file" "${file}.md5" "${file}.sha256"
fi
done
}
main() {
log_info "开始创建 OpenWrt 固件发布"
if [ ! -d "$FIRMWARE_DIR" ] || [ -z "$(find "$FIRMWARE_DIR" -name "*.bin" 2>/dev/null)" ]; then
log_error "未找到固件文件,请先构建固件"
exit 1
fi
create_release_dir
copy_firmware_files
copy_tool_scripts
generate_release_notes
generate_checksums
create_archive
cleanup_old_releases
show_release_info
log_info "发布创建完成!"
}
main "$@"