RPM packaging improvements: - Fix %config(noreplace) directive in spec file (logcorrelator.yml) - Fix post script: use correct path for .yml.example (/etc/logcorrelator/) - Set /var/run/logcorrelator ownership to logcorrelator:logcorrelator - Set correct permissions: /var/run (755), /var/log (750), /var/lib (750) - Add %config(noreplace) for logrotate.d/logcorrelator - Add comprehensive RPM test script (packaging/test/test-rpm.sh) Documentation updates: - Update architecture.yml with filesystem permissions section - Document socket ownership (logcorrelator:logcorrelator, 0666) - Document config file policy (%config(noreplace) behavior) - Add systemd hardening directives (NoNewPrivileges, ProtectSystem) - Update ClickHouse schema: mark non-implemented fields - Remove materialized view SQL (managed externally) - Add stdout sink module documentation Build pipeline: - Update Dockerfile.package with comments for config policy - Add /var/lib/logcorrelator directory creation - Document fpm %config(noreplace) limitations Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
259 lines
7.2 KiB
Bash
Executable File
259 lines
7.2 KiB
Bash
Executable File
#!/bin/bash
|
|
# Test script for logcorrelator RPM package
|
|
# Verifies installation, permissions, and service status
|
|
#
|
|
# Usage: ./packaging/test/test-rpm.sh [el8|el9|el10]
|
|
#
|
|
# This script tests the RPM package in a Docker container to ensure:
|
|
# - Installation succeeds
|
|
# - File permissions are correct
|
|
# - Service starts properly
|
|
# - Sockets are created with correct ownership
|
|
|
|
set -e
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
PROJECT_ROOT="$(dirname "$(dirname "$SCRIPT_DIR")")"
|
|
RPM_DIR="${PROJECT_ROOT}/dist/rpm"
|
|
|
|
# Default to el8 if no argument provided
|
|
DISTRO="${1:-el8}"
|
|
|
|
echo "========================================="
|
|
echo "Testing logcorrelator RPM for ${DISTRO}"
|
|
echo "========================================="
|
|
|
|
# Find the RPM file
|
|
case "${DISTRO}" in
|
|
el8|rocky8)
|
|
RPM_PATH="${RPM_DIR}/el8"
|
|
BASE_IMAGE="rockylinux:8"
|
|
;;
|
|
el9|rocky9)
|
|
RPM_PATH="${RPM_DIR}/el9"
|
|
BASE_IMAGE="rockylinux:9"
|
|
;;
|
|
el10|alma10)
|
|
RPM_PATH="${RPM_DIR}/el10"
|
|
BASE_IMAGE="almalinux:10"
|
|
;;
|
|
*)
|
|
echo "Unknown distribution: ${DISTRO}"
|
|
echo "Valid options: el8, el9, el10"
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
# Find the latest RPM file
|
|
RPM_FILE=$(ls -t "${RPM_PATH}"/logcorrelator-*.rpm 2>/dev/null | head -n 1)
|
|
|
|
if [ -z "${RPM_FILE}" ]; then
|
|
echo "ERROR: No RPM file found in ${RPM_PATH}"
|
|
echo "Please run 'make package-rpm' first"
|
|
exit 1
|
|
fi
|
|
|
|
echo "Testing RPM: ${RPM_FILE}"
|
|
echo "Base image: ${BASE_IMAGE}"
|
|
echo ""
|
|
|
|
# Create test script
|
|
TEST_SCRIPT=$(cat <<'EOF'
|
|
#!/bin/bash
|
|
set -e
|
|
|
|
echo "=== Installing logcorrelator RPM ==="
|
|
rpm -ivh /tmp/logcorrelator.rpm
|
|
|
|
echo ""
|
|
echo "=== Checking user and group ==="
|
|
if ! getent group logcorrelator >/dev/null; then
|
|
echo "FAIL: logcorrelator group not created"
|
|
exit 1
|
|
fi
|
|
echo "OK: logcorrelator group exists"
|
|
|
|
if ! getent passwd logcorrelator >/dev/null; then
|
|
echo "FAIL: logcorrelator user not created"
|
|
exit 1
|
|
fi
|
|
echo "OK: logcorrelator user exists"
|
|
|
|
echo ""
|
|
echo "=== Checking directory permissions ==="
|
|
|
|
# Check /var/run/logcorrelator
|
|
DIR="/var/run/logcorrelator"
|
|
if [ ! -d "$DIR" ]; then
|
|
echo "FAIL: $DIR does not exist"
|
|
exit 1
|
|
fi
|
|
OWNER=$(stat -c '%U:%G' "$DIR")
|
|
PERMS=$(stat -c '%a' "$DIR")
|
|
if [ "$OWNER" != "logcorrelator:logcorrelator" ]; then
|
|
echo "FAIL: $DIR owner is $OWNER (expected logcorrelator:logcorrelator)"
|
|
exit 1
|
|
fi
|
|
if [ "$PERMS" != "755" ]; then
|
|
echo "FAIL: $DIR permissions are $PERMS (expected 755)"
|
|
exit 1
|
|
fi
|
|
echo "OK: $DIR - owner=$OWNER, permissions=$PERMS"
|
|
|
|
# Check /var/log/logcorrelator
|
|
DIR="/var/log/logcorrelator"
|
|
if [ ! -d "$DIR" ]; then
|
|
echo "FAIL: $DIR does not exist"
|
|
exit 1
|
|
fi
|
|
OWNER=$(stat -c '%U:%G' "$DIR")
|
|
PERMS=$(stat -c '%a' "$DIR")
|
|
if [ "$OWNER" != "logcorrelator:logcorrelator" ]; then
|
|
echo "FAIL: $DIR owner is $OWNER (expected logcorrelator:logcorrelator)"
|
|
exit 1
|
|
fi
|
|
if [ "$PERMS" != "750" ]; then
|
|
echo "FAIL: $DIR permissions are $PERMS (expected 750)"
|
|
exit 1
|
|
fi
|
|
echo "OK: $DIR - owner=$OWNER, permissions=$PERMS"
|
|
|
|
# Check /var/lib/logcorrelator
|
|
DIR="/var/lib/logcorrelator"
|
|
if [ ! -d "$DIR" ]; then
|
|
echo "FAIL: $DIR does not exist"
|
|
exit 1
|
|
fi
|
|
OWNER=$(stat -c '%U:%G' "$DIR")
|
|
PERMS=$(stat -c '%a' "$DIR")
|
|
if [ "$OWNER" != "logcorrelator:logcorrelator" ]; then
|
|
echo "FAIL: $DIR owner is $OWNER (expected logcorrelator:logcorrelator)"
|
|
exit 1
|
|
fi
|
|
if [ "$PERMS" != "750" ]; then
|
|
echo "FAIL: $DIR permissions are $PERMS (expected 750)"
|
|
exit 1
|
|
fi
|
|
echo "OK: $DIR - owner=$OWNER, permissions=$PERMS"
|
|
|
|
echo ""
|
|
echo "=== Checking config files ==="
|
|
|
|
# Check config file exists and has correct permissions
|
|
CONFIG="/etc/logcorrelator/logcorrelator.yml"
|
|
if [ ! -f "$CONFIG" ]; then
|
|
echo "FAIL: $CONFIG does not exist"
|
|
exit 1
|
|
fi
|
|
OWNER=$(stat -c '%U:%G' "$CONFIG")
|
|
PERMS=$(stat -c '%a' "$CONFIG")
|
|
if [ "$OWNER" != "logcorrelator:logcorrelator" ]; then
|
|
echo "FAIL: $CONFIG owner is $OWNER (expected logcorrelator:logcorrelator)"
|
|
exit 1
|
|
fi
|
|
if [ "$PERMS" != "640" ]; then
|
|
echo "FAIL: $CONFIG permissions are $PERMS (expected 640)"
|
|
exit 1
|
|
fi
|
|
echo "OK: $CONFIG - owner=$OWNER, permissions=$PERMS"
|
|
|
|
# Check example config file
|
|
EXAMPLE_CONFIG="/etc/logcorrelator/logcorrelator.yml.example"
|
|
if [ ! -f "$EXAMPLE_CONFIG" ]; then
|
|
echo "FAIL: $EXAMPLE_CONFIG does not exist"
|
|
exit 1
|
|
fi
|
|
OWNER=$(stat -c '%U:%G' "$EXAMPLE_CONFIG")
|
|
PERMS=$(stat -c '%a' "$EXAMPLE_CONFIG")
|
|
if [ "$OWNER" != "logcorrelator:logcorrelator" ]; then
|
|
echo "FAIL: $EXAMPLE_CONFIG owner is $OWNER (expected logcorrelator:logcorrelator)"
|
|
exit 1
|
|
fi
|
|
if [ "$PERMS" != "640" ]; then
|
|
echo "FAIL: $EXAMPLE_CONFIG permissions are $PERMS (expected 640)"
|
|
exit 1
|
|
fi
|
|
echo "OK: $EXAMPLE_CONFIG - owner=$OWNER, permissions=$PERMS"
|
|
|
|
echo ""
|
|
echo "=== Checking systemd service ==="
|
|
if [ ! -f /etc/systemd/system/logcorrelator.service ]; then
|
|
echo "FAIL: systemd service file not found"
|
|
exit 1
|
|
fi
|
|
echo "OK: systemd service file exists"
|
|
|
|
echo ""
|
|
echo "=== Checking logrotate config ==="
|
|
if [ ! -f /etc/logrotate.d/logcorrelator ]; then
|
|
echo "FAIL: logrotate config not found"
|
|
exit 1
|
|
fi
|
|
echo "OK: logrotate config exists"
|
|
|
|
echo ""
|
|
echo "=== Testing service start ==="
|
|
# Try to start the service (may fail in container without full systemd)
|
|
if command -v systemctl >/dev/null 2>&1; then
|
|
systemctl daemon-reload || true
|
|
if systemctl start logcorrelator.service 2>/dev/null; then
|
|
echo "OK: service started successfully"
|
|
|
|
# Wait for sockets to be created
|
|
sleep 2
|
|
|
|
echo ""
|
|
echo "=== Checking sockets ==="
|
|
HTTP_SOCKET="/var/run/logcorrelator/http.socket"
|
|
NETWORK_SOCKET="/var/run/logcorrelator/network.socket"
|
|
|
|
if [ -S "$HTTP_SOCKET" ]; then
|
|
OWNER=$(stat -c '%U:%G' "$HTTP_SOCKET")
|
|
PERMS=$(stat -c '%a' "$HTTP_SOCKET")
|
|
echo "OK: $HTTP_SOCKET exists - owner=$OWNER, permissions=$PERMS"
|
|
if [ "$PERMS" != "666" ]; then
|
|
echo "WARN: socket permissions are $PERMS (expected 666)"
|
|
fi
|
|
else
|
|
echo "WARN: $HTTP_SOCKET not found (service may not have started)"
|
|
fi
|
|
|
|
if [ -S "$NETWORK_SOCKET" ]; then
|
|
OWNER=$(stat -c '%U:%G' "$NETWORK_SOCKET")
|
|
PERMS=$(stat -c '%a' "$NETWORK_SOCKET")
|
|
echo "OK: $NETWORK_SOCKET exists - owner=$OWNER, permissions=$PERMS"
|
|
if [ "$PERMS" != "666" ]; then
|
|
echo "WARN: socket permissions are $PERMS (expected 666)"
|
|
fi
|
|
else
|
|
echo "WARN: $NETWORK_SOCKET not found (service may not have started)"
|
|
fi
|
|
|
|
systemctl stop logcorrelator.service || true
|
|
else
|
|
echo "WARN: service failed to start (expected in minimal container)"
|
|
fi
|
|
else
|
|
echo "WARN: systemctl not available (minimal container)"
|
|
fi
|
|
|
|
echo ""
|
|
echo "========================================="
|
|
echo "All tests passed!"
|
|
echo "========================================="
|
|
EOF
|
|
)
|
|
|
|
# Run test in Docker container
|
|
echo "Running tests in Docker container..."
|
|
echo ""
|
|
|
|
docker run --rm \
|
|
-v "${RPM_FILE}:/tmp/logcorrelator.rpm:ro" \
|
|
-v "${TEST_SCRIPT}:/test.sh:ro" \
|
|
"${BASE_IMAGE}" \
|
|
bash /test.sh
|
|
|
|
echo ""
|
|
echo "Test completed successfully for ${DISTRO}"
|