mirror of
https://github.com/rcourtman/Pulse.git
synced 2026-10-19 10:33:29 +00:00
feat: Pulse v6 release
This commit is contained in:
parent
2fe22c3308
commit
778a2577b6
3155 changed files with 594553 additions and 173975 deletions
|
|
@ -5,9 +5,22 @@
|
|||
|
||||
set -euo pipefail
|
||||
|
||||
# Use Go 1.24 if available
|
||||
# Prefer the pinned toolchain from go.mod (toolchain directive).
|
||||
# If /usr/local/go exists (typical in CI images), prepend it to PATH.
|
||||
if [ -x /usr/local/go/bin/go ]; then
|
||||
export PATH=/usr/local/go/bin:$PATH
|
||||
export PATH=/usr/local/go/bin:$PATH
|
||||
fi
|
||||
|
||||
# Release artifacts must be built with the vetted toolchain to match security-gate evidence.
|
||||
required_go="go1.25.7"
|
||||
current_go="$(go env GOVERSION 2>/dev/null || true)"
|
||||
if [[ "${PULSE_SKIP_GO_VERSION_CHECK:-false}" != "true" ]]; then
|
||||
if [[ "${current_go}" != "${required_go}" ]]; then
|
||||
echo "Error: Go toolchain must be ${required_go} (got ${current_go:-unknown})." >&2
|
||||
echo "Tip: set GOTOOLCHAIN=auto to allow automatic toolchain download." >&2
|
||||
echo "Override: PULSE_SKIP_GO_VERSION_CHECK=true (not recommended)." >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Force static binaries so release artifacts run on older glibc hosts
|
||||
|
|
@ -21,7 +34,7 @@ echo "Building Pulse v${VERSION}..."
|
|||
|
||||
# Require public key embedding for release-grade license validation.
|
||||
# Explicitly opt out with PULSE_ALLOW_MISSING_LICENSE_KEY=true (not recommended).
|
||||
LICENSE_LDFLAGS=""
|
||||
license_ldflags_args=()
|
||||
if [[ -z "${PULSE_LICENSE_PUBLIC_KEY:-}" ]]; then
|
||||
if [[ "${PULSE_ALLOW_MISSING_LICENSE_KEY:-false}" == "true" ]]; then
|
||||
echo "Warning: PULSE_LICENSE_PUBLIC_KEY not set; continuing because PULSE_ALLOW_MISSING_LICENSE_KEY=true."
|
||||
|
|
@ -53,7 +66,7 @@ else
|
|||
echo "Verified license public key fingerprint: SHA256:${actual_fingerprint}"
|
||||
fi
|
||||
|
||||
LICENSE_LDFLAGS="-X github.com/rcourtman/pulse-go-rewrite/internal/license.EmbeddedPublicKey=${PULSE_LICENSE_PUBLIC_KEY}"
|
||||
license_ldflags_args=(--license-public-key "${PULSE_LICENSE_PUBLIC_KEY}")
|
||||
fi
|
||||
|
||||
# Clean previous builds
|
||||
|
|
@ -65,16 +78,12 @@ echo "Building frontend..."
|
|||
npm --prefix frontend-modern ci
|
||||
npm --prefix frontend-modern run build
|
||||
|
||||
# Copy frontend dist for embedding (required for Go embed)
|
||||
echo "Copying frontend dist for embedding..."
|
||||
rm -rf internal/api/frontend-modern
|
||||
mkdir -p internal/api/frontend-modern
|
||||
cp -r frontend-modern/dist internal/api/frontend-modern/
|
||||
agent_ldflags="$(./scripts/release_ldflags.sh agent --version "v${VERSION}")"
|
||||
|
||||
# Build host agents for every supported platform/architecture so download endpoints work offline
|
||||
echo "Building host agents for all platforms..."
|
||||
host_agent_order=(linux-amd64 linux-arm64 linux-armv7 linux-armv6 linux-386 darwin-amd64 darwin-arm64 freebsd-amd64 freebsd-arm64 windows-amd64 windows-arm64 windows-386)
|
||||
host_agent_envs=(
|
||||
# Build unified agents for every supported platform/architecture
|
||||
echo "Building unified agents for all platforms..."
|
||||
agent_build_order=(linux-amd64 linux-arm64 linux-armv7 linux-armv6 linux-386 darwin-amd64 darwin-arm64 freebsd-amd64 freebsd-arm64 windows-amd64 windows-arm64 windows-386)
|
||||
agent_build_envs=(
|
||||
"GOOS=linux GOARCH=amd64"
|
||||
"GOOS=linux GOARCH=arm64"
|
||||
"GOOS=linux GOARCH=arm GOARM=7"
|
||||
|
|
@ -89,38 +98,21 @@ host_agent_envs=(
|
|||
"GOOS=windows GOARCH=386"
|
||||
)
|
||||
|
||||
if [[ ${#host_agent_order[@]} -ne ${#host_agent_envs[@]} ]]; then
|
||||
echo "Host agent build config mismatch." >&2
|
||||
if [[ ${#agent_build_order[@]} -ne ${#agent_build_envs[@]} ]]; then
|
||||
echo "Unified agent build config mismatch." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
for i in "${!host_agent_order[@]}"; do
|
||||
target="${host_agent_order[$i]}"
|
||||
build_env="${host_agent_envs[$i]}"
|
||||
output_path="$BUILD_DIR/pulse-host-agent-$target"
|
||||
if [[ "$target" == windows-* ]]; then
|
||||
output_path="${output_path}.exe"
|
||||
fi
|
||||
|
||||
env $build_env go build \
|
||||
-ldflags="-s -w -X github.com/rcourtman/pulse-go-rewrite/internal/hostagent.Version=v${VERSION}" \
|
||||
-trimpath \
|
||||
-o "$output_path" \
|
||||
./cmd/pulse-host-agent
|
||||
done
|
||||
|
||||
# Build unified agents for every supported platform/architecture
|
||||
echo "Building unified agents for all platforms..."
|
||||
for i in "${!host_agent_order[@]}"; do
|
||||
target="${host_agent_order[$i]}"
|
||||
build_env="${host_agent_envs[$i]}"
|
||||
for i in "${!agent_build_order[@]}"; do
|
||||
target="${agent_build_order[$i]}"
|
||||
build_env="${agent_build_envs[$i]}"
|
||||
output_path="$BUILD_DIR/pulse-agent-$target"
|
||||
if [[ "$target" == windows-* ]]; then
|
||||
output_path="${output_path}.exe"
|
||||
fi
|
||||
|
||||
env $build_env go build \
|
||||
-ldflags="-s -w -X main.Version=v${VERSION}" \
|
||||
-ldflags="${agent_ldflags}" \
|
||||
-trimpath \
|
||||
-o "$output_path" \
|
||||
./cmd/pulse-agent
|
||||
|
|
@ -150,15 +142,21 @@ for i in "${!build_order[@]}"; do
|
|||
build_time=$(date -u '+%Y-%m-%d_%H:%M:%S')
|
||||
git_commit=$(git rev-parse --short HEAD 2>/dev/null || echo 'unknown')
|
||||
|
||||
server_ldflags="$(./scripts/release_ldflags.sh server --version "v${VERSION}" --build-time "${build_time}" --git-commit "${git_commit}" "${license_ldflags_args[@]}")"
|
||||
|
||||
# Build backend binary with version info
|
||||
# -tags release disables dev-mode env-var bypasses (PULSE_DEV, PULSE_MOCK_MODE,
|
||||
# PULSE_LICENSE_DEV_MODE) so they cannot be used to skip feature gating or
|
||||
# license signature validation in production binaries.
|
||||
env $build_env go build \
|
||||
-ldflags="-s -w -X main.Version=v${VERSION} -X main.BuildTime=${build_time} -X main.GitCommit=${git_commit} -X github.com/rcourtman/pulse-go-rewrite/internal/dockeragent.Version=v${VERSION} ${LICENSE_LDFLAGS}" \
|
||||
-tags release \
|
||||
-ldflags="${server_ldflags}" \
|
||||
-trimpath \
|
||||
-o "$BUILD_DIR/pulse-$build_name" \
|
||||
./cmd/pulse
|
||||
done
|
||||
|
||||
# Create platform-specific tarballs that include all host agent binaries for download endpoints
|
||||
# Create platform-specific tarballs that include all unified agent binaries for download endpoints
|
||||
for build_name in "${build_order[@]}"; do
|
||||
echo "Packaging release for $build_name..."
|
||||
|
||||
|
|
@ -171,22 +169,8 @@ for build_name in "${build_order[@]}"; do
|
|||
# Copy architecture-specific runtime binaries
|
||||
cp "$BUILD_DIR/pulse-$build_name" "$staging_dir/bin/pulse"
|
||||
|
||||
cp "$BUILD_DIR/pulse-host-agent-$build_name" "$staging_dir/bin/pulse-host-agent"
|
||||
|
||||
# Copy host agent binaries for every supported platform/architecture
|
||||
for target in "${host_agent_order[@]}"; do
|
||||
src="$BUILD_DIR/pulse-host-agent-$target"
|
||||
dest="$staging_dir/bin/pulse-host-agent-$target"
|
||||
if [[ "$target" == windows-* ]]; then
|
||||
src="${src}.exe"
|
||||
dest="${dest}.exe"
|
||||
fi
|
||||
cp "$src" "$dest"
|
||||
done
|
||||
( cd "$staging_dir/bin" && ln -sf pulse-host-agent-windows-amd64.exe pulse-host-agent-windows-amd64 && ln -sf pulse-host-agent-windows-arm64.exe pulse-host-agent-windows-arm64 && ln -sf pulse-host-agent-windows-386.exe pulse-host-agent-windows-386 )
|
||||
|
||||
# Copy unified agent binaries for every supported platform/architecture
|
||||
for target in "${host_agent_order[@]}"; do
|
||||
for target in "${agent_build_order[@]}"; do
|
||||
src="$BUILD_DIR/pulse-agent-$target"
|
||||
dest="$staging_dir/bin/pulse-agent-$target"
|
||||
if [[ "$target" == windows-* ]]; then
|
||||
|
|
@ -198,11 +182,7 @@ for build_name in "${build_order[@]}"; do
|
|||
( cd "$staging_dir/bin" && ln -sf pulse-agent-windows-amd64.exe pulse-agent-windows-amd64 && ln -sf pulse-agent-windows-arm64.exe pulse-agent-windows-arm64 && ln -sf pulse-agent-windows-386.exe pulse-agent-windows-386 )
|
||||
|
||||
# Copy scripts and VERSION metadata
|
||||
cp "scripts/install-docker-agent.sh" "$staging_dir/scripts/install-docker-agent.sh"
|
||||
cp "scripts/install-container-agent.sh" "$staging_dir/scripts/install-container-agent.sh"
|
||||
cp "scripts/install-host-agent.ps1" "$staging_dir/scripts/install-host-agent.ps1"
|
||||
cp "scripts/uninstall-host-agent.sh" "$staging_dir/scripts/uninstall-host-agent.sh"
|
||||
cp "scripts/uninstall-host-agent.ps1" "$staging_dir/scripts/uninstall-host-agent.ps1"
|
||||
cp "scripts/install-docker.sh" "$staging_dir/scripts/install-docker.sh"
|
||||
cp "scripts/install.sh" "$staging_dir/scripts/install.sh"
|
||||
[ -f "scripts/install.ps1" ] && cp "scripts/install.ps1" "$staging_dir/scripts/install.ps1"
|
||||
|
|
@ -229,16 +209,10 @@ mkdir -p "$universal_dir/scripts"
|
|||
# Copy all binaries to bin/ directory to maintain consistent structure
|
||||
for build_name in "${build_order[@]}"; do
|
||||
cp "$BUILD_DIR/pulse-$build_name" "$universal_dir/bin/pulse-${build_name}"
|
||||
|
||||
cp "$BUILD_DIR/pulse-host-agent-$build_name" "$universal_dir/bin/pulse-host-agent-${build_name}"
|
||||
cp "$BUILD_DIR/pulse-agent-$build_name" "$universal_dir/bin/pulse-agent-${build_name}"
|
||||
done
|
||||
|
||||
cp "scripts/install-docker-agent.sh" "$universal_dir/scripts/install-docker-agent.sh"
|
||||
cp "scripts/install-container-agent.sh" "$universal_dir/scripts/install-container-agent.sh"
|
||||
cp "scripts/install-host-agent.ps1" "$universal_dir/scripts/install-host-agent.ps1"
|
||||
cp "scripts/uninstall-host-agent.sh" "$universal_dir/scripts/uninstall-host-agent.sh"
|
||||
cp "scripts/uninstall-host-agent.ps1" "$universal_dir/scripts/uninstall-host-agent.ps1"
|
||||
cp "scripts/install-docker.sh" "$universal_dir/scripts/install-docker.sh"
|
||||
cp "scripts/install.sh" "$universal_dir/scripts/install.sh"
|
||||
[ -f "scripts/install.ps1" ] && cp "scripts/install.ps1" "$universal_dir/scripts/install.ps1"
|
||||
|
|
@ -271,29 +245,6 @@ chmod +x "$universal_dir/bin/pulse"
|
|||
|
||||
|
||||
|
||||
cat > "$universal_dir/bin/pulse-host-agent" << 'EOF'
|
||||
#!/bin/sh
|
||||
# Auto-detect architecture and run appropriate pulse-host-agent binary
|
||||
|
||||
ARCH=$(uname -m)
|
||||
case "$ARCH" in
|
||||
x86_64|amd64)
|
||||
exec "$(dirname "$0")/pulse-host-agent-linux-amd64" "$@"
|
||||
;;
|
||||
aarch64|arm64)
|
||||
exec "$(dirname "$0")/pulse-host-agent-linux-arm64" "$@"
|
||||
;;
|
||||
armv7l|armhf)
|
||||
exec "$(dirname "$0")/pulse-host-agent-linux-armv7" "$@"
|
||||
;;
|
||||
*)
|
||||
echo "Unsupported architecture: $ARCH" >&2
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
EOF
|
||||
chmod +x "$universal_dir/bin/pulse-host-agent"
|
||||
|
||||
cat > "$universal_dir/bin/pulse-agent" << 'EOF'
|
||||
#!/bin/sh
|
||||
# Auto-detect architecture and run appropriate pulse-agent binary
|
||||
|
|
@ -320,24 +271,6 @@ chmod +x "$universal_dir/bin/pulse-agent"
|
|||
# Add VERSION file
|
||||
echo "$VERSION" > "$universal_dir/VERSION"
|
||||
|
||||
# Package standalone host agent binaries (all platforms)
|
||||
# Linux
|
||||
tar -czf "$RELEASE_DIR/pulse-host-agent-v${VERSION}-linux-amd64.tar.gz" -C "$BUILD_DIR" pulse-host-agent-linux-amd64
|
||||
tar -czf "$RELEASE_DIR/pulse-host-agent-v${VERSION}-linux-arm64.tar.gz" -C "$BUILD_DIR" pulse-host-agent-linux-arm64
|
||||
tar -czf "$RELEASE_DIR/pulse-host-agent-v${VERSION}-linux-armv7.tar.gz" -C "$BUILD_DIR" pulse-host-agent-linux-armv7
|
||||
tar -czf "$RELEASE_DIR/pulse-host-agent-v${VERSION}-linux-armv6.tar.gz" -C "$BUILD_DIR" pulse-host-agent-linux-armv6
|
||||
tar -czf "$RELEASE_DIR/pulse-host-agent-v${VERSION}-linux-386.tar.gz" -C "$BUILD_DIR" pulse-host-agent-linux-386
|
||||
# Darwin
|
||||
tar -czf "$RELEASE_DIR/pulse-host-agent-v${VERSION}-darwin-amd64.tar.gz" -C "$BUILD_DIR" pulse-host-agent-darwin-amd64
|
||||
tar -czf "$RELEASE_DIR/pulse-host-agent-v${VERSION}-darwin-arm64.tar.gz" -C "$BUILD_DIR" pulse-host-agent-darwin-arm64
|
||||
# FreeBSD
|
||||
tar -czf "$RELEASE_DIR/pulse-host-agent-v${VERSION}-freebsd-amd64.tar.gz" -C "$BUILD_DIR" pulse-host-agent-freebsd-amd64
|
||||
tar -czf "$RELEASE_DIR/pulse-host-agent-v${VERSION}-freebsd-arm64.tar.gz" -C "$BUILD_DIR" pulse-host-agent-freebsd-arm64
|
||||
# Windows
|
||||
zip -j "$RELEASE_DIR/pulse-host-agent-v${VERSION}-windows-amd64.zip" "$BUILD_DIR/pulse-host-agent-windows-amd64.exe"
|
||||
zip -j "$RELEASE_DIR/pulse-host-agent-v${VERSION}-windows-arm64.zip" "$BUILD_DIR/pulse-host-agent-windows-arm64.exe"
|
||||
zip -j "$RELEASE_DIR/pulse-host-agent-v${VERSION}-windows-386.zip" "$BUILD_DIR/pulse-host-agent-windows-386.exe"
|
||||
|
||||
# Package standalone unified agent binaries (all platforms)
|
||||
# Linux
|
||||
tar -czf "$RELEASE_DIR/pulse-agent-v${VERSION}-linux-amd64.tar.gz" -C "$BUILD_DIR" pulse-agent-linux-amd64
|
||||
|
|
@ -359,27 +292,19 @@ zip -j "$RELEASE_DIR/pulse-agent-v${VERSION}-windows-386.zip" "$BUILD_DIR/pulse-
|
|||
# Also copy bare binaries for /releases/latest/download/ redirect compatibility
|
||||
# These allow LXC/barebone installs to redirect to GitHub without needing versioned URLs
|
||||
echo "Copying bare binaries to release directory for redirect compatibility..."
|
||||
cp "$BUILD_DIR/pulse-agent-linux-amd64" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-agent-linux-arm64" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-agent-linux-armv7" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-agent-linux-armv6" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-agent-linux-386" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-agent-windows-amd64.exe" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-agent-windows-arm64.exe" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-agent-windows-386.exe" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-host-agent-windows-amd64.exe" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-host-agent-windows-arm64.exe" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-host-agent-windows-386.exe" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-agent-freebsd-amd64" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-agent-freebsd-arm64" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-host-agent-freebsd-amd64" "$RELEASE_DIR/"
|
||||
cp "$BUILD_DIR/pulse-host-agent-freebsd-arm64" "$RELEASE_DIR/"
|
||||
|
||||
# Copy Windows, macOS, and FreeBSD binaries into universal tarball for /download/ endpoint
|
||||
echo "Adding Windows, macOS, and FreeBSD binaries to universal tarball..."
|
||||
cp "$BUILD_DIR/pulse-host-agent-darwin-amd64" "$universal_dir/bin/"
|
||||
cp "$BUILD_DIR/pulse-host-agent-darwin-arm64" "$universal_dir/bin/"
|
||||
cp "$BUILD_DIR/pulse-host-agent-freebsd-amd64" "$universal_dir/bin/"
|
||||
cp "$BUILD_DIR/pulse-host-agent-freebsd-arm64" "$universal_dir/bin/"
|
||||
cp "$BUILD_DIR/pulse-host-agent-windows-amd64.exe" "$universal_dir/bin/"
|
||||
cp "$BUILD_DIR/pulse-host-agent-windows-arm64.exe" "$universal_dir/bin/"
|
||||
cp "$BUILD_DIR/pulse-host-agent-windows-386.exe" "$universal_dir/bin/"
|
||||
|
||||
cp "$BUILD_DIR/pulse-agent-darwin-amd64" "$universal_dir/bin/"
|
||||
cp "$BUILD_DIR/pulse-agent-darwin-arm64" "$universal_dir/bin/"
|
||||
cp "$BUILD_DIR/pulse-agent-freebsd-amd64" "$universal_dir/bin/"
|
||||
|
|
@ -389,10 +314,6 @@ cp "$BUILD_DIR/pulse-agent-windows-arm64.exe" "$universal_dir/bin/"
|
|||
cp "$BUILD_DIR/pulse-agent-windows-386.exe" "$universal_dir/bin/"
|
||||
|
||||
# Create symlinks for Windows binaries without .exe extension (required for download endpoint)
|
||||
ln -s pulse-host-agent-windows-amd64.exe "$universal_dir/bin/pulse-host-agent-windows-amd64"
|
||||
ln -s pulse-host-agent-windows-arm64.exe "$universal_dir/bin/pulse-host-agent-windows-arm64"
|
||||
ln -s pulse-host-agent-windows-386.exe "$universal_dir/bin/pulse-host-agent-windows-386"
|
||||
|
||||
ln -s pulse-agent-windows-amd64.exe "$universal_dir/bin/pulse-agent-windows-amd64"
|
||||
ln -s pulse-agent-windows-arm64.exe "$universal_dir/bin/pulse-agent-windows-arm64"
|
||||
ln -s pulse-agent-windows-386.exe "$universal_dir/bin/pulse-agent-windows-386"
|
||||
|
|
@ -423,7 +344,8 @@ fi
|
|||
# curl -fsSL https://github.com/rcourtman/Pulse/releases/latest/download/install.sh | bash
|
||||
# instead of pulling from main branch (which may have newer, incompatible changes)
|
||||
echo "Copying install scripts to release directory..."
|
||||
cp install.sh "$RELEASE_DIR/"
|
||||
cp scripts/install.sh "$RELEASE_DIR/install.sh"
|
||||
[ -f "scripts/install.ps1" ] && cp "scripts/install.ps1" "$RELEASE_DIR/install.ps1"
|
||||
cp scripts/install-docker.sh "$RELEASE_DIR/"
|
||||
cp scripts/pulse-auto-update.sh "$RELEASE_DIR/"
|
||||
|
||||
|
|
@ -487,78 +409,3 @@ echo
|
|||
echo "Release build complete!"
|
||||
echo "Archives created in $RELEASE_DIR/"
|
||||
ls -lh $RELEASE_DIR/
|
||||
|
||||
# Create host-agent manifest (per tarball) for validation/debugging
|
||||
manifest_path="$RELEASE_DIR/host-agent-manifest.json"
|
||||
echo "Generating host-agent manifest at $manifest_path..."
|
||||
python3 - <<'EOF' "$RELEASE_DIR" "$VERSION" "$manifest_path"
|
||||
import json
|
||||
import os
|
||||
import sys
|
||||
import tarfile
|
||||
|
||||
release_dir = sys.argv[1]
|
||||
version = sys.argv[2]
|
||||
manifest_path = sys.argv[3]
|
||||
|
||||
tar_arches = [
|
||||
"linux-amd64",
|
||||
"linux-arm64",
|
||||
"linux-armv7",
|
||||
"linux-armv6",
|
||||
"linux-386",
|
||||
]
|
||||
|
||||
host_agents = [
|
||||
"pulse-host-agent-linux-amd64",
|
||||
"pulse-host-agent-linux-arm64",
|
||||
"pulse-host-agent-linux-armv7",
|
||||
"pulse-host-agent-linux-armv6",
|
||||
"pulse-host-agent-linux-386",
|
||||
"pulse-host-agent-darwin-amd64",
|
||||
"pulse-host-agent-darwin-arm64",
|
||||
"pulse-host-agent-windows-amd64.exe",
|
||||
"pulse-host-agent-windows-arm64.exe",
|
||||
"pulse-host-agent-windows-386.exe",
|
||||
"pulse-host-agent-windows-amd64",
|
||||
"pulse-host-agent-windows-arm64",
|
||||
"pulse-host-agent-windows-386",
|
||||
"pulse-host-agent-freebsd-amd64",
|
||||
"pulse-host-agent-freebsd-arm64",
|
||||
]
|
||||
|
||||
manifest = {
|
||||
"version": version,
|
||||
"tarballs": {},
|
||||
"universal": [],
|
||||
}
|
||||
|
||||
def collect_agents(tar_path):
|
||||
found = []
|
||||
try:
|
||||
with tarfile.open(tar_path, "r:gz") as tf:
|
||||
names = set(m.name for m in tf.getmembers() if (m.isfile() or m.issym()))
|
||||
for agent in host_agents:
|
||||
target = f"./bin/{agent}"
|
||||
if target in names:
|
||||
found.append(agent)
|
||||
except Exception as exc:
|
||||
print(f"Failed to read {tar_path}: {exc}", file=sys.stderr)
|
||||
return sorted(found)
|
||||
|
||||
# Platform tarballs
|
||||
for arch in tar_arches:
|
||||
tarball = os.path.join(release_dir, f"pulse-v{version}-{arch}.tar.gz")
|
||||
if os.path.exists(tarball):
|
||||
manifest["tarballs"][arch] = collect_agents(tarball)
|
||||
|
||||
# Universal tarball
|
||||
universal_tar = os.path.join(release_dir, f"pulse-v{version}.tar.gz")
|
||||
if os.path.exists(universal_tar):
|
||||
manifest["universal"] = collect_agents(universal_tar)
|
||||
|
||||
with open(manifest_path, "w", encoding="utf-8") as handle:
|
||||
json.dump(manifest, handle, indent=2)
|
||||
|
||||
print(json.dumps(manifest, indent=2))
|
||||
EOF
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue