|
4 | 4 | # Supports: Linux, macOS (Darwin), FreeBSD, Windows (Git Bash/MSYS/Cygwin) |
5 | 5 | # Usage: ./install-gh-aw.sh [version] |
6 | 6 | # If no version is specified, it will fetch and use the latest release |
| 7 | +# Note: Checksum validation is currently skipped by default (will be enabled in future releases) |
7 | 8 | # Example: ./install-gh-aw.sh v1.0.0 |
8 | 9 |
|
9 | 10 | set -e # Exit on any error |
10 | 11 |
|
| 12 | +# Parse arguments |
| 13 | +SKIP_CHECKSUM=true # Default to true until checksums are available in releases |
| 14 | +VERSION="" |
| 15 | +for arg in "$@"; do |
| 16 | + case $arg in |
| 17 | + --skip-checksum) |
| 18 | + SKIP_CHECKSUM=true |
| 19 | + shift |
| 20 | + ;; |
| 21 | + *) |
| 22 | + if [ -z "$VERSION" ]; then |
| 23 | + VERSION="$arg" |
| 24 | + fi |
| 25 | + ;; |
| 26 | + esac |
| 27 | +done |
| 28 | + |
11 | 29 | # Colors for output |
12 | 30 | RED='\033[0;31m' |
13 | 31 | GREEN='\033[0;32m' |
@@ -50,6 +68,23 @@ if command -v jq &> /dev/null; then |
50 | 68 | HAS_JQ=true |
51 | 69 | fi |
52 | 70 |
|
| 71 | +# Check if sha256sum or shasum is available (for checksum verification) |
| 72 | +HAS_CHECKSUM_TOOL=false |
| 73 | +CHECKSUM_CMD="" |
| 74 | +if command -v sha256sum &> /dev/null; then |
| 75 | + HAS_CHECKSUM_TOOL=true |
| 76 | + CHECKSUM_CMD="sha256sum" |
| 77 | +elif command -v shasum &> /dev/null; then |
| 78 | + HAS_CHECKSUM_TOOL=true |
| 79 | + CHECKSUM_CMD="shasum -a 256" |
| 80 | +fi |
| 81 | + |
| 82 | +if [ "$SKIP_CHECKSUM" = false ] && [ "$HAS_CHECKSUM_TOOL" = false ]; then |
| 83 | + print_warning "Neither sha256sum nor shasum is available. Checksum verification will be skipped." |
| 84 | + print_warning "To suppress this warning, use --skip-checksum flag." |
| 85 | + SKIP_CHECKSUM=true |
| 86 | +fi |
| 87 | + |
53 | 88 | # Determine OS and architecture |
54 | 89 | OS=$(uname -s) |
55 | 90 | ARCH=$(uname -m) |
@@ -167,7 +202,7 @@ fetch_release_data() { |
167 | 202 | } |
168 | 203 |
|
169 | 204 | # Get version (use provided version or fetch latest) |
170 | | -VERSION=${1:-""} |
| 205 | +# VERSION is already set from argument parsing |
171 | 206 | REPO="githubnext/gh-aw" |
172 | 207 |
|
173 | 208 | if [ -z "$VERSION" ]; then |
|
201 | 236 |
|
202 | 237 | # Construct download URL and paths |
203 | 238 | DOWNLOAD_URL="https://github.com/$REPO/releases/download/$VERSION/$PLATFORM" |
| 239 | +CHECKSUMS_URL="https://github.com/$REPO/releases/download/$VERSION/checksums.txt" |
204 | 240 | if [ "$OS_NAME" = "windows" ]; then |
205 | 241 | DOWNLOAD_URL="${DOWNLOAD_URL}.exe" |
206 | 242 | fi |
207 | 243 | INSTALL_DIR="$HOME/.local/share/gh/extensions/gh-aw" |
208 | 244 | BINARY_PATH="$INSTALL_DIR/$BINARY_NAME" |
| 245 | +CHECKSUMS_PATH="$INSTALL_DIR/checksums.txt" |
209 | 246 |
|
210 | 247 | print_info "Download URL: $DOWNLOAD_URL" |
211 | 248 | print_info "Installation directory: $INSTALL_DIR" |
@@ -243,6 +280,71 @@ for attempt in $(seq 1 $MAX_RETRIES); do |
243 | 280 | fi |
244 | 281 | done |
245 | 282 |
|
| 283 | +# Download and verify checksums if not skipped |
| 284 | +if [ "$SKIP_CHECKSUM" = false ]; then |
| 285 | + print_info "Downloading checksums file..." |
| 286 | + CHECKSUMS_DOWNLOADED=false |
| 287 | + |
| 288 | + for attempt in $(seq 1 $MAX_RETRIES); do |
| 289 | + if curl -L -f -o "$CHECKSUMS_PATH" "$CHECKSUMS_URL" 2>/dev/null; then |
| 290 | + CHECKSUMS_DOWNLOADED=true |
| 291 | + print_success "Checksums file downloaded successfully" |
| 292 | + break |
| 293 | + else |
| 294 | + if [ "$attempt" -eq "$MAX_RETRIES" ]; then |
| 295 | + print_warning "Failed to download checksums file after $MAX_RETRIES attempts" |
| 296 | + print_warning "Checksum verification will be skipped for this version." |
| 297 | + print_info "This may occur for older releases that don't include checksums." |
| 298 | + break |
| 299 | + else |
| 300 | + print_warning "Checksum download attempt $attempt failed. Retrying in 2s..." |
| 301 | + sleep 2 |
| 302 | + fi |
| 303 | + fi |
| 304 | + done |
| 305 | + |
| 306 | + # Verify checksum if we downloaded it successfully |
| 307 | + if [ "$CHECKSUMS_DOWNLOADED" = true ]; then |
| 308 | + print_info "Verifying binary checksum..." |
| 309 | + |
| 310 | + # Determine the expected filename in the checksums file |
| 311 | + EXPECTED_FILENAME="$PLATFORM" |
| 312 | + if [ "$OS_NAME" = "windows" ]; then |
| 313 | + EXPECTED_FILENAME="${PLATFORM}.exe" |
| 314 | + fi |
| 315 | + |
| 316 | + # Extract the expected checksum from the checksums file |
| 317 | + EXPECTED_CHECKSUM=$(grep "$EXPECTED_FILENAME" "$CHECKSUMS_PATH" | awk '{print $1}') |
| 318 | + |
| 319 | + if [ -z "$EXPECTED_CHECKSUM" ]; then |
| 320 | + print_warning "Checksum for $EXPECTED_FILENAME not found in checksums file" |
| 321 | + print_warning "Checksum verification will be skipped." |
| 322 | + else |
| 323 | + # Compute the actual checksum of the downloaded binary |
| 324 | + ACTUAL_CHECKSUM=$($CHECKSUM_CMD "$BINARY_PATH" | awk '{print $1}') |
| 325 | + |
| 326 | + if [ "$ACTUAL_CHECKSUM" = "$EXPECTED_CHECKSUM" ]; then |
| 327 | + print_success "Checksum verification passed!" |
| 328 | + print_info "Expected: $EXPECTED_CHECKSUM" |
| 329 | + print_info "Actual: $ACTUAL_CHECKSUM" |
| 330 | + else |
| 331 | + print_error "Checksum verification failed!" |
| 332 | + print_error "Expected: $EXPECTED_CHECKSUM" |
| 333 | + print_error "Actual: $ACTUAL_CHECKSUM" |
| 334 | + print_error "The downloaded binary may be corrupted or tampered with." |
| 335 | + print_info "To skip checksum verification, use: ./install-gh-aw.sh $VERSION --skip-checksum" |
| 336 | + rm -f "$BINARY_PATH" |
| 337 | + exit 1 |
| 338 | + fi |
| 339 | + fi |
| 340 | + |
| 341 | + # Clean up checksums file |
| 342 | + rm -f "$CHECKSUMS_PATH" |
| 343 | + fi |
| 344 | +else |
| 345 | + print_warning "Checksum verification skipped (--skip-checksum flag used)" |
| 346 | +fi |
| 347 | + |
246 | 348 | # Make it executable |
247 | 349 | print_info "Making binary executable..." |
248 | 350 | chmod +x "$BINARY_PATH" |
|
0 commit comments