run.sh (6401B)
1 #!/bin/sh 2 set -u 3 4 usage() { 5 cat <<'EOF' 6 Usage: test/audit/release/run.sh (--dist DIR | --kit FILE) [options] 7 8 Required (exactly one): 9 --dist DIR shipped distribution root; uses DIR/bin/kit 10 --kit FILE exact Kit binary to audit 11 12 Selection: 13 --module GLOBS comma-separated module globs 14 --command GLOBS comma-separated command globs 15 --workflow GLOBS comma-separated workflow globs 16 --target GLOBS comma-separated target globs 17 --arch GLOBS comma-separated architecture globs 18 --format GLOBS comma-separated format globs 19 --severity GLOBS comma-separated severities (p0,p1,p2,p3) 20 21 Output: 22 --out DIR artifact root (default: build/audit/release-acceptance) 23 --run-id NAME run directory name (default: UTC timestamp plus PID) 24 25 Other: 26 -h, --help show this help 27 28 No compiler fallback exists. Existing run directories are never overwritten. 29 The command exits 1 when any selected case is FAIL or BLOCKED, 0 otherwise, 30 and 2 for harness usage/setup errors. 31 EOF 32 } 33 34 SCRIPT_DIR=$(CDPATH= cd "$(dirname "$0")" && pwd -P) || exit 2 35 REPO_ROOT=$(CDPATH= cd "$SCRIPT_DIR/../../.." && pwd -P) || exit 2 36 37 DIST_ARG= 38 KIT_ARG= 39 OUT_ARG=$REPO_ROOT/build/audit/release-acceptance 40 RUN_ID= 41 HARNESS_FILTER_MODULE= 42 HARNESS_FILTER_COMMAND= 43 HARNESS_FILTER_WORKFLOW= 44 HARNESS_FILTER_TARGET= 45 HARNESS_FILTER_ARCH= 46 HARNESS_FILTER_FORMAT= 47 HARNESS_FILTER_SEVERITY= 48 49 while [ "$#" -gt 0 ]; do 50 case "$1" in 51 --dist|--kit|--out|--run-id|--module|--command|--workflow|--target|--arch|--format|--severity) 52 audit_option=$1 53 shift 54 if [ "$#" -eq 0 ]; then 55 printf 'audit: %s requires an argument\n' "$audit_option" >&2 56 usage >&2 57 exit 2 58 fi 59 audit_value=$1 60 case "$audit_option" in 61 --dist) DIST_ARG=$audit_value ;; 62 --kit) KIT_ARG=$audit_value ;; 63 --out) OUT_ARG=$audit_value ;; 64 --run-id) RUN_ID=$audit_value ;; 65 --module) HARNESS_FILTER_MODULE=$audit_value ;; 66 --command) HARNESS_FILTER_COMMAND=$audit_value ;; 67 --workflow) HARNESS_FILTER_WORKFLOW=$audit_value ;; 68 --target) HARNESS_FILTER_TARGET=$audit_value ;; 69 --arch) HARNESS_FILTER_ARCH=$audit_value ;; 70 --format) HARNESS_FILTER_FORMAT=$audit_value ;; 71 --severity) HARNESS_FILTER_SEVERITY=$audit_value ;; 72 esac 73 ;; 74 -h|--help) 75 usage 76 exit 0 77 ;; 78 *) 79 printf 'audit: unknown option: %s\n' "$1" >&2 80 usage >&2 81 exit 2 82 ;; 83 esac 84 shift 85 done 86 87 if { [ -n "$DIST_ARG" ] && [ -n "$KIT_ARG" ]; } || \ 88 { [ -z "$DIST_ARG" ] && [ -z "$KIT_ARG" ]; }; then 89 printf 'audit: pass exactly one of --dist DIR or --kit FILE\n' >&2 90 usage >&2 91 exit 2 92 fi 93 94 HARNESS_DIST= 95 if [ -n "$DIST_ARG" ]; then 96 if [ ! -d "$DIST_ARG" ]; then 97 printf 'audit: distribution directory does not exist: %s\n' "$DIST_ARG" >&2 98 exit 2 99 fi 100 HARNESS_DIST=$(CDPATH= cd "$DIST_ARG" && pwd -P) || exit 2 101 HARNESS_KIT=$HARNESS_DIST/bin/kit 102 else 103 if [ ! -f "$KIT_ARG" ]; then 104 printf 'audit: Kit binary does not exist: %s\n' "$KIT_ARG" >&2 105 exit 2 106 fi 107 audit_kit_dir=$(CDPATH= cd "$(dirname "$KIT_ARG")" && pwd -P) || exit 2 108 HARNESS_KIT=$audit_kit_dir/$(basename "$KIT_ARG") 109 fi 110 111 if [ ! -x "$HARNESS_KIT" ]; then 112 printf 'audit: Kit binary is not executable: %s\n' "$HARNESS_KIT" >&2 113 exit 2 114 fi 115 116 mkdir -p "$OUT_ARG" || exit 2 117 HARNESS_OUT_ROOT=$(CDPATH= cd "$OUT_ARG" && pwd -P) || exit 2 118 if [ -z "$RUN_ID" ]; then 119 RUN_ID=$(date -u '+%Y%m%dT%H%M%SZ')-$$ 120 fi 121 case "$RUN_ID" in 122 ''|*/*|.|..) printf 'audit: invalid --run-id: %s\n' "$RUN_ID" >&2; exit 2 ;; 123 esac 124 125 HARNESS_RUN_DIR=$HARNESS_OUT_ROOT/$RUN_ID 126 if [ -e "$HARNESS_RUN_DIR" ]; then 127 printf 'audit: refusing to overwrite existing run: %s\n' "$HARNESS_RUN_DIR" >&2 128 exit 2 129 fi 130 mkdir -p "$HARNESS_RUN_DIR/cases" || exit 2 131 132 if [ -n "$HARNESS_DIST" ]; then 133 HARNESS_PATH=$HARNESS_DIST/bin:/usr/bin:/bin 134 else 135 HARNESS_PATH=$(dirname "$HARNESS_KIT"):/usr/bin:/bin 136 fi 137 138 HARNESS_SUMMARY_TSV=$HARNESS_RUN_DIR/summary.tsv 139 printf 'state\tseverity\tmodule\tcommand\tworkflow\ttarget\tarch\tformat\tcase\treason\n' \ 140 > "$HARNESS_SUMMARY_TSV" 141 142 { 143 printf 'kit=%s\n' "$HARNESS_KIT" 144 printf 'dist=%s\n' "$HARNESS_DIST" 145 printf 'path=%s\n' "$HARNESS_PATH" 146 printf 'filter.module=%s\n' "$HARNESS_FILTER_MODULE" 147 printf 'filter.command=%s\n' "$HARNESS_FILTER_COMMAND" 148 printf 'filter.workflow=%s\n' "$HARNESS_FILTER_WORKFLOW" 149 printf 'filter.target=%s\n' "$HARNESS_FILTER_TARGET" 150 printf 'filter.arch=%s\n' "$HARNESS_FILTER_ARCH" 151 printf 'filter.format=%s\n' "$HARNESS_FILTER_FORMAT" 152 printf 'filter.severity=%s\n' "$HARNESS_FILTER_SEVERITY" 153 } > "$HARNESS_RUN_DIR/run.metadata" 154 155 . "$SCRIPT_DIR/lib/harness.sh" 156 157 HARNESS_MODULES_RAN=0 158 for audit_module_file in "$SCRIPT_DIR"/modules/*.sh; do 159 [ -f "$audit_module_file" ] || continue 160 audit_module_name=$(basename "$audit_module_file" .sh) 161 case "$audit_module_name" in 162 *[!a-z0-9_]*) printf 'audit: invalid module filename: %s\n' "$audit_module_file" >&2; exit 2 ;; 163 esac 164 audit_match_filter "$audit_module_name" "$HARNESS_FILTER_MODULE" || continue 165 . "$audit_module_file" 166 HARNESS_MODULES_RAN=$((HARNESS_MODULES_RAN + 1)) 167 audit_module_function=audit_module_$audit_module_name 168 "$audit_module_function" 169 done 170 171 if [ "$HARNESS_MODULES_RAN" -eq 0 ]; then 172 printf 'audit: no module matched --module=%s\n' "$HARNESS_FILTER_MODULE" >&2 173 exit 2 174 fi 175 176 { 177 printf 'Kit release acceptance: %s\n' "$RUN_ID" 178 printf 'Kit: %s\n' "$HARNESS_KIT" 179 printf 'Selected: %s\n' "$HARNESS_SELECTED" 180 printf 'PASS: %s\n' "$HARNESS_PASS" 181 printf 'FAIL: %s\n' "$HARNESS_FAIL" 182 printf 'BLOCKED: %s\n' "$HARNESS_BLOCKED" 183 printf 'NOT_APPLICABLE: %s\n' "$HARNESS_NOT_APPLICABLE" 184 printf 'Details: %s\n' "$HARNESS_SUMMARY_TSV" 185 } > "$HARNESS_RUN_DIR/summary.txt" 186 187 cat "$HARNESS_RUN_DIR/summary.txt" 188 189 if [ "$HARNESS_SELECTED" -eq 0 ]; then 190 printf 'audit: no cases matched the requested filters\n' >&2 191 exit 2 192 fi 193 194 if [ "$HARNESS_FAIL" -ne 0 ] || [ "$HARNESS_BLOCKED" -ne 0 ]; then 195 exit 1 196 fi 197 exit 0