mirror of
https://gitcode.com/JianFeeeee/HomeAgent.git
synced 2026-10-03 15:53:56 +00:00
feat: add initconfig + setup.sh to Linux packages, combine tar.gz
This commit is contained in:
@ -2,7 +2,7 @@
|
|||||||
set -e
|
set -e
|
||||||
|
|
||||||
SERVICE_NAME="homeagent"
|
SERVICE_NAME="homeagent"
|
||||||
SERVICE_FILE="/etc/systemd/system/${SERVICE_NAME}.service"
|
SERVICE_FILE="/lib/systemd/system/${SERVICE_NAME}.service"
|
||||||
HOMED_BIN="/usr/bin/homed"
|
HOMED_BIN="/usr/bin/homed"
|
||||||
DATA_DIR="/var/lib/homeagent"
|
DATA_DIR="/var/lib/homeagent"
|
||||||
|
|
||||||
@ -11,8 +11,15 @@ case "$1" in
|
|||||||
if [ -f "$HOMED_BIN" ]; then
|
if [ -f "$HOMED_BIN" ]; then
|
||||||
mkdir -p "$DATA_DIR"
|
mkdir -p "$DATA_DIR"
|
||||||
|
|
||||||
|
# 初始化凭据和数据库
|
||||||
|
if [ -x /usr/lib/homeagent/setup.sh ]; then
|
||||||
|
HOMEAGENT_DATA="$DATA_DIR" /usr/lib/homeagent/setup.sh || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 注册 systemd 服务
|
||||||
if [ -f "$SERVICE_FILE" ]; then
|
if [ -f "$SERVICE_FILE" ]; then
|
||||||
systemctl daemon-reload 2>/dev/null || true
|
systemctl daemon-reload 2>/dev/null || true
|
||||||
|
systemctl enable "$SERVICE_NAME" 2>/dev/null || true
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
|
|||||||
63
package/linux/setup.sh
Normal file
63
package/linux/setup.sh
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# HomeAgent 首次初始化脚本
|
||||||
|
# 在安装后执行,生成凭据并初始化数据库
|
||||||
|
set -e
|
||||||
|
|
||||||
|
DATA_DIR="${HOMEAGENT_DATA:-/var/lib/homeagent}"
|
||||||
|
CRED_FILE="${DATA_DIR}/credentials.txt"
|
||||||
|
CONFIG_DB="${DATA_DIR}/config.db"
|
||||||
|
WAITER_CONF="${DATA_DIR}/waiter.yaml"
|
||||||
|
INITCONFIG_BIN="/usr/bin/initconfig"
|
||||||
|
|
||||||
|
# 如果已经初始化过,跳过
|
||||||
|
if [ -f "$CONFIG_DB" ] && [ -f "$CRED_FILE" ]; then
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
mkdir -p "$DATA_DIR"
|
||||||
|
|
||||||
|
# 生成随机凭据
|
||||||
|
API_KEY=$(cat /proc/sys/kernel/random/uuid 2>/dev/null | tr -d '-' || echo "homeagent$(date +%s)")
|
||||||
|
WEBUI_USER="${WEBUI_USER:-admin}"
|
||||||
|
WEBUI_PASS="${WEBUI_PASS:-$(openssl rand -hex 12 2>/dev/null || echo "homeagent")}"
|
||||||
|
|
||||||
|
# 初始化数据库
|
||||||
|
if [ -x "$INITCONFIG_BIN" ]; then
|
||||||
|
"$INITCONFIG_BIN" \
|
||||||
|
-data "$DATA_DIR" \
|
||||||
|
-username "$WEBUI_USER" \
|
||||||
|
-password "$WEBUI_PASS" \
|
||||||
|
-apikey "$API_KEY" 2>/dev/null
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 保存凭据
|
||||||
|
cat > "$CRED_FILE" << CRED
|
||||||
|
===================================
|
||||||
|
HomeAgent 初始配置信息
|
||||||
|
请妥善保管,安装后仅此一份
|
||||||
|
===================================
|
||||||
|
WebUI 地址: http://localhost:8080
|
||||||
|
API Key: ${API_KEY}
|
||||||
|
WebUI 用户名: ${WEBUI_USER}
|
||||||
|
WebUI 密码: ${WEBUI_PASS}
|
||||||
|
CLI Socket: ${DATA_DIR}/cli.sock
|
||||||
|
===================================
|
||||||
|
CRED
|
||||||
|
chmod 600 "$CRED_FILE"
|
||||||
|
|
||||||
|
# 配置 waiter CLI
|
||||||
|
cat > "$WAITER_CONF" << WAITER
|
||||||
|
socket: "${DATA_DIR}/cli.sock"
|
||||||
|
api_key: ${API_KEY}
|
||||||
|
default: local
|
||||||
|
connections:
|
||||||
|
- name: local
|
||||||
|
socket: "${DATA_DIR}/cli.sock"
|
||||||
|
api_key: ${API_KEY}
|
||||||
|
WAITER
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "============================================"
|
||||||
|
echo " HomeAgent 初始化完成"
|
||||||
|
echo "============================================"
|
||||||
|
cat "$CRED_FILE"
|
||||||
@ -194,17 +194,23 @@ stage_variant() {
|
|||||||
mkdir -p "$staging/etc/systemd/system"
|
mkdir -p "$staging/etc/systemd/system"
|
||||||
mkdir -p "$staging/var/lib/homeagent"
|
mkdir -p "$staging/var/lib/homeagent"
|
||||||
|
|
||||||
|
local initconfig_bin="$BUILD_DIR/initconfig_$suffix"
|
||||||
|
|
||||||
case "$variant" in
|
case "$variant" in
|
||||||
full)
|
full)
|
||||||
cp "$BUILD_DIR/homed_$suffix" "$staging/usr/bin/homed"
|
cp "$BUILD_DIR/homed_$suffix" "$staging/usr/bin/homed"
|
||||||
cp "$BUILD_DIR/waiter_$suffix" "$staging/usr/bin/waiter"
|
cp "$BUILD_DIR/waiter_$suffix" "$staging/usr/bin/waiter"
|
||||||
cp "$PROJECT_ROOT/deploy/homeagent.service" "$staging/etc/systemd/system/homeagent.service"
|
cp "$PROJECT_ROOT/deploy/homeagent.service" "$staging/etc/systemd/system/homeagent.service"
|
||||||
|
[ -f "$initconfig_bin" ] && cp "$initconfig_bin" "$staging/usr/bin/initconfig"
|
||||||
|
stage_setup "$staging"
|
||||||
stage_gui "$staging"
|
stage_gui "$staging"
|
||||||
;;
|
;;
|
||||||
server)
|
server)
|
||||||
cp "$BUILD_DIR/homed_$suffix" "$staging/usr/bin/homed"
|
cp "$BUILD_DIR/homed_$suffix" "$staging/usr/bin/homed"
|
||||||
cp "$BUILD_DIR/waiter_$suffix" "$staging/usr/bin/waiter"
|
cp "$BUILD_DIR/waiter_$suffix" "$staging/usr/bin/waiter"
|
||||||
cp "$PROJECT_ROOT/deploy/homeagent.service" "$staging/etc/systemd/system/homeagent.service"
|
cp "$PROJECT_ROOT/deploy/homeagent.service" "$staging/etc/systemd/system/homeagent.service"
|
||||||
|
[ -f "$initconfig_bin" ] && cp "$initconfig_bin" "$staging/usr/bin/initconfig"
|
||||||
|
stage_setup "$staging"
|
||||||
;;
|
;;
|
||||||
client)
|
client)
|
||||||
cp "$BUILD_DIR/waiter_$suffix" "$staging/usr/bin/waiter"
|
cp "$BUILD_DIR/waiter_$suffix" "$staging/usr/bin/waiter"
|
||||||
@ -232,6 +238,16 @@ SCRIPT
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
stage_setup() {
|
||||||
|
local staging="$1"
|
||||||
|
local setup_src="$PROJECT_ROOT/package/linux/setup.sh"
|
||||||
|
if [ -f "$setup_src" ]; then
|
||||||
|
mkdir -p "$staging/usr/lib/homeagent"
|
||||||
|
cp "$setup_src" "$staging/usr/lib/homeagent/setup.sh"
|
||||||
|
chmod 755 "$staging/usr/lib/homeagent/setup.sh"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# ---- create .deb ----
|
# ---- create .deb ----
|
||||||
build_deb() {
|
build_deb() {
|
||||||
local variant="$1"
|
local variant="$1"
|
||||||
@ -273,19 +289,47 @@ build_deb() {
|
|||||||
echo " Created: $deb_dir/$pkg_name ($(du -h "$deb_dir/$pkg_name" | cut -f1))"
|
echo " Created: $deb_dir/$pkg_name ($(du -h "$deb_dir/$pkg_name" | cut -f1))"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ---- create .tar.gz ----
|
# ---- create combined .tar.gz (all binaries, no variant split) ----
|
||||||
build_tar() {
|
build_tar() {
|
||||||
local variant="$1"
|
|
||||||
local staging="$2"
|
|
||||||
local tar_dir="${DIST_DIR}/tar"
|
local tar_dir="${DIST_DIR}/tar"
|
||||||
mkdir -p "$tar_dir"
|
mkdir -p "$tar_dir"
|
||||||
|
|
||||||
local archive_name="homeagent-${variant}_${VERSION}_linux_${TAR_ARCH}.tar.gz"
|
local archive_name="homeagent_${VERSION}_linux_${TAR_ARCH}.tar.gz"
|
||||||
local archive_dir="homeagent-${variant}"
|
local archive_dir="homeagent-${VERSION}-linux-${TAR_ARCH}"
|
||||||
|
|
||||||
|
# build combined staging
|
||||||
|
local staging
|
||||||
|
staging="$(mktemp -d)"
|
||||||
|
mkdir -p "$staging/usr/bin" "$staging/usr/lib/homeagent"
|
||||||
|
|
||||||
|
# copy all available binaries
|
||||||
|
for bin in homed waiter initconfig; do
|
||||||
|
local src="$BUILD_DIR/${bin}_linux_${TAR_ARCH}"
|
||||||
|
[ -f "$src" ] && cp "$src" "$staging/usr/bin/$bin"
|
||||||
|
done
|
||||||
|
|
||||||
|
# setup script
|
||||||
|
local setup_src="$PROJECT_ROOT/package/linux/setup.sh"
|
||||||
|
[ -f "$setup_src" ] && cp "$setup_src" "$staging/usr/lib/homeagent/setup.sh"
|
||||||
|
|
||||||
|
# GUI if available
|
||||||
|
local gui_src="$BUILD_DIR/homeagent-gui-linux-${TAR_ARCH}"
|
||||||
|
if [ -d "$gui_src" ]; then
|
||||||
|
mkdir -p "$staging/usr/lib/homeagent-gui"
|
||||||
|
cp -r "$gui_src"/* "$staging/usr/lib/homeagent-gui/"
|
||||||
|
cat > "$staging/usr/bin/homeagent-gui" << 'SCRIPT'
|
||||||
|
#!/bin/sh
|
||||||
|
exec /usr/lib/homeagent-gui/homeagent-gui "$@"
|
||||||
|
SCRIPT
|
||||||
|
chmod 755 "$staging/usr/bin/homeagent-gui"
|
||||||
|
fi
|
||||||
|
|
||||||
|
chmod 755 "$staging/usr/bin/"* 2>/dev/null || true
|
||||||
|
|
||||||
echo ">>> Building .tar.gz: $archive_name"
|
echo ">>> Building .tar.gz: $archive_name"
|
||||||
(cd "$staging" && tar czf "$tar_dir/$archive_name" --transform "s|^\.|${archive_dir}|" .)
|
(cd "$staging" && tar czf "$tar_dir/$archive_name" --transform "s|^\.|${archive_dir}|" .)
|
||||||
echo " Created: $tar_dir/$archive_name ($(du -h "$tar_dir/$archive_name" | cut -f1))"
|
echo " Created: $tar_dir/$archive_name ($(du -h "$tar_dir/$archive_name" | cut -f1))"
|
||||||
|
rm -rf "$staging"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ---- create .rpm (via fpm if available) ----
|
# ---- create .rpm (via fpm if available) ----
|
||||||
@ -297,25 +341,58 @@ build_rpm() {
|
|||||||
|
|
||||||
local pkg_name="homeagent-${variant}-${VERSION}-1.${RPM_ARCH}.rpm"
|
local pkg_name="homeagent-${variant}-${VERSION}-1.${RPM_ARCH}.rpm"
|
||||||
|
|
||||||
if command -v fpm &>/dev/null; then
|
# find fpm
|
||||||
echo ">>> Building .rpm via fpm: $pkg_name"
|
local fpm_bin="$(command -v fpm 2>/dev/null || true)"
|
||||||
fpm -s dir -t rpm \
|
if [ -z "$fpm_bin" ]; then
|
||||||
-n "homeagent-${variant}" \
|
fpm_bin="$(find /home -name "fpm" -type f -path "*/bin/*" 2>/dev/null | head -1 || true)"
|
||||||
-v "$VERSION" \
|
fi
|
||||||
--iteration 1 \
|
|
||||||
-a "$RPM_ARCH" \
|
if [ -z "$fpm_bin" ]; then
|
||||||
--description "HomeAgent ${variant^} package" \
|
|
||||||
--url "https://github.com/trueagent/HomeAgent" \
|
|
||||||
--license "Proprietary" \
|
|
||||||
-C "$staging" \
|
|
||||||
-p "$rpm_dir/$pkg_name" \
|
|
||||||
.
|
|
||||||
echo " Created: $rpm_dir/$pkg_name"
|
|
||||||
else
|
|
||||||
echo " SKIP .rpm: fpm not installed. Install it with: gem install fpm"
|
echo " SKIP .rpm: fpm not installed. Install it with: gem install fpm"
|
||||||
echo " Alternatively, build RPM on Fedora/RHEL using:"
|
echo " Alternatively, build RPM on Fedora/RHEL using:"
|
||||||
echo " rpmbuild -ba package/linux/homeagent.spec"
|
echo " rpmbuild -ba package/linux/homeagent.spec"
|
||||||
|
return
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# find or extract rpmbuild (fpm needs it)
|
||||||
|
local rpmbuild_dir="/tmp/rpmext"
|
||||||
|
if [ ! -f "$rpmbuild_dir/usr/bin/rpmbuild" ]; then
|
||||||
|
# try to extract from cached deb packages
|
||||||
|
local rpm_deb
|
||||||
|
rpm_deb="$(find /tmp -name "rpm_*.deb" -type f 2>/dev/null | head -1)"
|
||||||
|
if [ -z "$rpm_deb" ]; then
|
||||||
|
rpm_deb="$(find "$PROJECT_ROOT" -name "rpm_*.deb" -type f 2>/dev/null | head -1)"
|
||||||
|
fi
|
||||||
|
if [ -n "$rpm_deb" ]; then
|
||||||
|
mkdir -p "$rpmbuild_dir"
|
||||||
|
(cd "$rpmbuild_dir" && ar x "$rpm_deb" 2>/dev/null && \
|
||||||
|
tar --no-same-permissions -xf data.tar.zst --zstd 2>/dev/null) || true
|
||||||
|
for libdeb in /tmp/librpm*.deb; do
|
||||||
|
[ -f "$libdeb" ] && (cd "$rpmbuild_dir" && ar x "$libdeb" 2>/dev/null && \
|
||||||
|
tar --no-same-permissions -xf data.tar.zst --zstd 2>/dev/null) || true
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$rpmbuild_dir/usr/bin/rpmbuild" ]; then
|
||||||
|
export PATH="$rpmbuild_dir/usr/bin:$PATH"
|
||||||
|
export LD_LIBRARY_PATH="$rpmbuild_dir/usr/lib/x86_64-linux-gnu${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}"
|
||||||
|
export RPM_CONFIGDIR="$rpmbuild_dir/usr/lib/rpm"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ">>> Building .rpm via fpm: $pkg_name"
|
||||||
|
"$fpm_bin" -s dir -t rpm \
|
||||||
|
-n "homeagent-${variant}" \
|
||||||
|
-v "$VERSION" \
|
||||||
|
--iteration 1 \
|
||||||
|
-a "$RPM_ARCH" \
|
||||||
|
--description "HomeAgent ${variant^} package" \
|
||||||
|
--url "https://github.com/trueagent/HomeAgent" \
|
||||||
|
--license "Proprietary" \
|
||||||
|
-C "$staging" \
|
||||||
|
-p "$rpm_dir/$pkg_name" \
|
||||||
|
. 2>&1
|
||||||
|
echo " Created: $rpm_dir/$pkg_name"
|
||||||
}
|
}
|
||||||
|
|
||||||
# ---- main ----
|
# ---- main ----
|
||||||
@ -353,10 +430,6 @@ main() {
|
|||||||
all|deb) build_deb "$variant" "$staging" ;;
|
all|deb) build_deb "$variant" "$staging" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
case "$ACTION" in
|
|
||||||
all|tar) build_tar "$variant" "$staging" ;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
case "$ACTION" in
|
case "$ACTION" in
|
||||||
all|rpm) build_rpm "$variant" "$staging" ;;
|
all|rpm) build_rpm "$variant" "$staging" ;;
|
||||||
esac
|
esac
|
||||||
@ -364,11 +437,15 @@ main() {
|
|||||||
rm -rf "$staging"
|
rm -rf "$staging"
|
||||||
done
|
done
|
||||||
|
|
||||||
|
case "$ACTION" in
|
||||||
|
all|tar) build_tar ;;
|
||||||
|
esac
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
echo "=== Done! Packages in: $DIST_DIR ==="
|
echo "=== Done! Packages in: $DIST_DIR ==="
|
||||||
echo ""
|
echo ""
|
||||||
echo "Summary:"
|
echo "Summary:"
|
||||||
find "$DIST_DIR" -type f -name "*.deb" -o -name "*.tar.gz" -o -name "*.rpm" 2>/dev/null | sort | while read -r f; do
|
find "$DIST_DIR" -type f \( -name "*.deb" -o -name "homeagent_*.tar.gz" -o -name "*.rpm" \) 2>/dev/null | sort | while read -r f; do
|
||||||
echo " $(du -h "$f" | cut -f1) $f"
|
echo " $(du -h "$f" | cut -f1) $f"
|
||||||
done
|
done
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user