#!/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"