rsyslog/validate-syntax.sh
dvirlabs bd120cc643
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/cron/woodpecker Pipeline was successful
Set generic project
2026-04-19 16:58:34 +03:00

180 lines
5.5 KiB
Bash

#!/bin/bash
# =============================================================================
# Syntax validation script for rsyslog GitOps
# =============================================================================
# This script validates:
# 1. Bash script syntax
# 2. Configuration file format
# 3. Ansible playbook syntax
# 4. rsyslog config syntax (if rsyslogd available)
#
# Exit codes:
# 0 = all checks passed
# 1 = one or more checks failed
# =============================================================================
set -o pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
EXIT_CODE=0
# Color codes
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
log_pass() {
echo -e "${GREEN}${NC} $1"
}
log_fail() {
echo -e "${RED}${NC} $1"
EXIT_CODE=1
}
log_warn() {
echo -e "${YELLOW}${NC} $1"
}
log_info() {
echo " $1"
}
# =============================================================================
# 1. Check shell script syntax
# =============================================================================
echo "Checking shell script syntax..."
for script in apply.sh drift-check.sh validate-syntax.sh; do
if [ -f "$SCRIPT_DIR/$script" ]; then
if bash -n "$SCRIPT_DIR/$script" 2>/dev/null; then
log_pass "$script"
else
log_fail "$script (bash -n failed)"
fi
fi
done
# =============================================================================
# 2. Check configuration file
# =============================================================================
echo
echo "Checking configuration file..."
if [ ! -f "$SCRIPT_DIR/config.env" ]; then
log_fail "config.env not found"
else
# Check for required variables
required_vars=(
"REPO_NAME"
"RSYSLOG_MAIN_CONFIG"
"RSYSLOG_CONFIG_DIR"
"GIT_RSYSLOG_MAIN_CONFIG"
"GIT_RSYSLOG_CONFIG_DIR"
)
config_valid=true
for var in "${required_vars[@]}"; do
if grep -q "^$var=" "$SCRIPT_DIR/config.env"; then
log_info "Found: $var"
else
log_fail "Missing required variable in config.env: $var"
config_valid=false
fi
done
if [ "$config_valid" = true ]; then
log_pass "config.env has all required variables"
fi
fi
# =============================================================================
# 3. Check Ansible syntax
# =============================================================================
echo
echo "Checking Ansible syntax..."
if command -v ansible-playbook &>/dev/null; then
if [ -f "$SCRIPT_DIR/ansible.cfg" ] && [ -f "$SCRIPT_DIR/ansible/inventory/hosts.yml" ]; then
if ansible-playbook -i "$SCRIPT_DIR/ansible/inventory/hosts.yml" \
--syntax-check "$SCRIPT_DIR/ansible/playbooks/"*.yml 2>/dev/null; then
log_pass "Ansible playbook syntax is valid"
else
log_fail "Ansible playbook syntax check failed"
fi
else
log_warn "Ansible configuration not found (ansible.cfg or hosts.yml) - skipping Ansible syntax check"
fi
else
log_warn "ansible-playbook not installed - skipping Ansible syntax check"
fi
# =============================================================================
# 4. Check rsyslog configuration files exist
# =============================================================================
echo
echo "Checking rsyslog configuration files..."
# Load config to get the paths
if [ -f "$SCRIPT_DIR/config.local.env" ]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/config.local.env"
elif [ -f "$SCRIPT_DIR/config.env" ]; then
# shellcheck disable=SC1090
source "$SCRIPT_DIR/config.env"
fi
if [ -f "$SCRIPT_DIR/$GIT_RSYSLOG_MAIN_CONFIG" ]; then
log_pass "$GIT_RSYSLOG_MAIN_CONFIG exists"
# Try to validate rsyslog syntax if rsyslogd is available
if command -v rsyslogd &>/dev/null; then
if rsyslogd -N1 -f "$SCRIPT_DIR/$GIT_RSYSLOG_MAIN_CONFIG" 2>/dev/null; then
log_pass "$GIT_RSYSLOG_MAIN_CONFIG syntax is valid"
else
log_fail "$GIT_RSYSLOG_MAIN_CONFIG syntax check failed"
fi
else
log_warn "rsyslogd not installed - skipping rsyslog syntax validation"
fi
else
log_fail "$GIT_RSYSLOG_MAIN_CONFIG not found"
fi
if [ -d "$SCRIPT_DIR/$GIT_RSYSLOG_CONFIG_DIR" ]; then
conf_count=$(find "$SCRIPT_DIR/$GIT_RSYSLOG_CONFIG_DIR" -name "*.conf" | wc -l)
if [ "$conf_count" -gt 0 ]; then
log_pass "Found $conf_count rsyslog config files in $GIT_RSYSLOG_CONFIG_DIR/"
# Try to validate each file if rsyslogd is available
if command -v rsyslogd &>/dev/null; then
for conf in "$SCRIPT_DIR/$GIT_RSYSLOG_CONFIG_DIR"/*.conf; do
if rsyslogd -N1 -f "$conf" 2>/dev/null; then
log_info "Valid: $(basename "$conf")"
else
log_fail "Invalid: $(basename "$conf")"
fi
done
fi
else
log_warn "No .conf files found in $GIT_RSYSLOG_CONFIG_DIR/"
fi
else
log_fail "$GIT_RSYSLOG_CONFIG_DIR/ directory not found"
fi
# =============================================================================
# 5. Summary
# =============================================================================
echo
echo "=========================================="
if [ "$EXIT_CODE" -eq 0 ]; then
echo -e "${GREEN}All checks passed!${NC}"
else
echo -e "${RED}Some checks failed. Please review above.${NC}"
fi
echo "=========================================="
exit "$EXIT_CODE"