#!/bin/bash set -euo pipefail ROOT_DIR=$(cd "$(dirname "$0")/.." && pwd) BASE_VERSION=$(sed -n 's/^version[[:space:]]*=[[:space:]]*//p' "$ROOT_DIR/fnos/manifest" | head -n 1 | tr -d '\r') PACKAGE_VERSION="${PACKAGE_VERSION:-$BASE_VERSION}" case "$PACKAGE_VERSION" in ''|*[!0-9.]*|.*|*..*|*.) printf 'invalid fnOS package version: %s\n' "$PACKAGE_VERSION" >&2; exit 1 ;; esac [ "$(printf '%s' "$PACKAGE_VERSION" | awk -F. '{ print NF }')" -eq 3 ] || { printf 'fnOS package version must contain exactly three numeric components: %s\n' "$PACKAGE_VERSION" >&2 exit 1 } OUTPUT_DIR="${1:-${ROOT_DIR}/artifacts/fnos}" SOURCE_DATE_EPOCH="${SOURCE_DATE_EPOCH:-1785168000}" export VITE_BUILD_TIMESTAMP="${VITE_BUILD_TIMESTAMP:-$((SOURCE_DATE_EPOCH * 1000))}" BUILD_TMP_ROOT="${DYSYNC_BUILD_TMPDIR:-${DYSYNC_TMPDIR:-${TMPDIR:-/tmp}}}" mkdir -p "${BUILD_TMP_ROOT}" WORK_DIR=$(mktemp -d "${BUILD_TMP_ROOT%/}/dysync-fnos-build.XXXXXX") trap 'rm -rf -- "${WORK_DIR}"' EXIT mkdir -p "${OUTPUT_DIR}" (cd "${ROOT_DIR}/app" && npm run build) dotnet restore "${ROOT_DIR}/dy.net.csproj" -r linux-x64 dotnet publish "${ROOT_DIR}/dy.net.csproj" -c Release -r linux-x64 --self-contained true --no-restore \ -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=false -o "${WORK_DIR}/publish" mkdir -p "${WORK_DIR}/payload/server" "${WORK_DIR}/payload/ui/images" "${WORK_DIR}/package" cp -a "${WORK_DIR}/publish/." "${WORK_DIR}/payload/server/" cp "${ROOT_DIR}/appsettings.json" "${WORK_DIR}/payload/server/appsettings.json" sed -i -E "s/(\"tagName\"[[:space:]]*:[[:space:]]*)\"[^\"]*\"/\1\"${PACKAGE_VERSION}\"/; s/(\"fnVersion\"[[:space:]]*:[[:space:]]*)\"[^\"]*\"/\1\"${PACKAGE_VERSION}\"/" \ "${WORK_DIR}/payload/server/appsettings.json" rm -rf -- "${WORK_DIR}/payload/server/db" "${WORK_DIR}/payload/server/logs" cp "${ROOT_DIR}/fnos/ui/config" "${WORK_DIR}/payload/ui/config" cp "${ROOT_DIR}/app/dist/logo.png" "${WORK_DIR}/payload/ui/images/icon_64.png" cp "${ROOT_DIR}/app/dist/logo.png" "${WORK_DIR}/payload/ui/images/icon_256.png" tar --sort=name --mtime="@${SOURCE_DATE_EPOCH}" --owner=0 --group=0 --numeric-owner \ -czf "${WORK_DIR}/package/app.tgz" -C "${WORK_DIR}/payload" server ui cp -a "${ROOT_DIR}/fnos/cmd" "${ROOT_DIR}/fnos/config" "${WORK_DIR}/package/" cp "${ROOT_DIR}/app/dist/logo.png" "${WORK_DIR}/package/ICON.PNG" cp "${ROOT_DIR}/app/dist/logo.png" "${WORK_DIR}/package/ICON_256.PNG" checksum=$(md5sum "${WORK_DIR}/package/app.tgz" | cut -d' ' -f1) sed -e "s/@CHECKSUM@/${checksum}/" \ -e "s/^version[[:space:]]*=.*/version = ${PACKAGE_VERSION}/" \ "${ROOT_DIR}/fnos/manifest" > "${WORK_DIR}/package/manifest" chmod 0755 "${WORK_DIR}/package/cmd/"* PACKAGE="${OUTPUT_DIR}/dy.net-${PACKAGE_VERSION}-x86_64.fpk" tar --sort=name --mtime="@${SOURCE_DATE_EPOCH}" --owner=0 --group=0 --numeric-owner \ -czf "${PACKAGE}" -C "${WORK_DIR}/package" app.tgz cmd config ICON.PNG ICON_256.PNG manifest (cd "${OUTPUT_DIR}" && sha256sum "$(basename "${PACKAGE}")" > "$(basename "${PACKAGE}").sha256") DYSYNC_VERIFY_TMPDIR="${DYSYNC_VERIFY_TMPDIR:-${BUILD_TMP_ROOT}}" \ "${ROOT_DIR}/scripts/verify-fnos-package.sh" "${PACKAGE}" "$PACKAGE_VERSION" printf 'Built %s\n' "${PACKAGE}"