diff --git a/validate.sh b/validate.sh new file mode 100755 index 0000000..70dd7d1 --- /dev/null +++ b/validate.sh @@ -0,0 +1,143 @@ +#!/bin/bash + +# FetchApply Validation Script +# Validates the FetchApply repository structure and configuration + +set -euo pipefail + +ERRORS=0 +WARNINGS=0 + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +pass() { + echo -e "${GREEN}✓${NC} $1" +} + +fail() { + echo -e "${RED}✗${NC} $1" + ((ERRORS++)) +} + +warn() { + echo -e "${YELLOW}!${NC} $1" + ((WARNINGS++)) +} + +echo "=== FetchApply Repository Validation ===" +echo "" + +# Check required top-level files +echo "Checking top-level files..." +for file in variables classes/server/initializers classes/server/roles; do + if [[ -f "$file" ]]; then + pass "$file exists" + else + fail "$file missing" + fi +done + +# Check roles directory +echo "" +echo "Checking roles..." +for role in security monitoring; do + if [[ -f "roles/$role" ]]; then + pass "roles/$role exists" + else + fail "roles/$role missing" + fi +done + +# Check initializers +echo "" +echo "Checking initializers..." +INITIALIZERS=$(grep -v '^#' classes/server/initializers | grep -v '^$') + +for init in $INITIALIZERS; do + # Skip role references + if [[ "$init" == "security" ]] || [[ "$init" == "monitoring" ]]; then + continue + fi + + if [[ -d "initializers/$init" ]]; then + if [[ -x "initializers/$init/apply" ]]; then + pass "initializers/$init/apply is executable" + else + warn "initializers/$init/apply exists but not executable" + fi + + # Check for configs or scripts directories + if [[ -d "initializers/$init/configs" ]]; then + config_count=$(find "initializers/$init/configs" -type f | wc -l) + pass "initializers/$init has configs/ ($config_count files)" + fi + + if [[ -d "initializers/$init/scripts" ]]; then + script_count=$(find "initializers/$init/scripts" -type f | wc -l) + pass "initializers/$init has scripts/ ($script_count files)" + fi + else + fail "initializers/$init directory missing" + fi +done + +# Check for bash syntax in apply scripts +echo "" +echo "Checking apply script syntax..." +for init in $INITIALIZERS; do + if [[ -f "initializers/$init/apply" ]]; then + if bash -n "initializers/$init/apply" 2>/dev/null; then + pass "initializers/$init/apply has valid bash syntax" + else + fail "initializers/$init/apply has syntax errors" + fi + fi +done + +# Check for path consistency in apply scripts +echo "" +echo "Checking path consistency in apply scripts..." +for init in $INITIALIZERS; do + apply_file="initializers/$init/apply" + if [[ -f "$apply_file" ]]; then + # Check for ./configs/ references (excluding comments) + if grep -v '^[[:space:]]*#' "$apply_file" | grep -q './configs/'; then + if [[ ! -d "initializers/$init/configs" ]]; then + fail "$apply_file references ./configs/ but no configs/ directory exists" + fi + fi + + # Check for ./scripts/ references (excluding comments) + if grep -v '^[[:space:]]*#' "$apply_file" | grep -q './scripts/'; then + if [[ ! -d "initializers/$init/scripts" ]]; then + fail "$apply_file references ./scripts/ but no scripts/ directory exists" + fi + fi + + # Check for ConfigFiles references (deprecated pattern) + if grep -v '^[[:space:]]*#' "$apply_file" | grep -q 'ConfigFiles'; then + warn "$apply_file contains 'ConfigFiles' reference - should use direct paths" + fi + fi +done + +# Summary +echo "" +echo "=== Validation Summary ===" +echo -e "Errors: ${RED}$ERRORS${NC}" +echo -e "Warnings: ${YELLOW}$WARNINGS${NC}" + +if [[ $ERRORS -gt 0 ]]; then + echo -e "${RED}Validation FAILED${NC}" + exit 1 +else + echo -e "${GREEN}Validation PASSED${NC}" + if [[ $WARNINGS -gt 0 ]]; then + echo "Please review warnings above" + fi + exit 0 +fi