Загрузка данных


#!/bin/bash

set -euo pipefail

SERVER="http://192.168.205.1:8765"
WORK_ROOT="$HOME/VMBuildAgent"
KEYTOOL="/Applications/Unity/Hub/Editor/6000.3.6f1/PlaybackEngines/AndroidPlayer/OpenJDK/bin/keytool"

APP_ID="${1:-}"

if [ -z "$APP_ID" ]; then
    echo "ERROR: app id required"
    exit 1
fi

if [[ ! "$APP_ID" =~ ^[a-zA-Z0-9_-]+$ ]]; then
    echo "ERROR: invalid app id"
    exit 1
fi

JOB_DIR="$WORK_ROOT/working/$APP_ID"

JSON_FILE="$JOB_DIR/$APP_ID.json"
UNITYPACKAGE_FILE="$JOB_DIR/$APP_ID.unitypackage"

JSON_URL="$SERVER/inbox/$APP_ID/$APP_ID.json"
UNITYPACKAGE_URL="$SERVER/inbox/$APP_ID/$APP_ID.unitypackage"

mkdir -p "$JOB_DIR"

echo ""
echo "=================================="
echo " VM BUILD AGENT"
echo "=================================="
echo ""
echo "App ID: $APP_ID"
echo ""

echo "[1/5] Downloading JSON..."

curl -f -sS -o "$JSON_FILE" "$JSON_URL"

echo "OK"

echo ""
echo "[2/5] Reading config..."

ID_FROM_JSON=$(
    /usr/bin/plutil -extract id raw -o - "$JSON_FILE"
)

PRODUCT_NAME=$(
    /usr/bin/plutil -extract productName raw -o - "$JSON_FILE"
)

PACKAGE_NAME=$(
    /usr/bin/plutil -extract packageName raw -o - "$JSON_FILE"
)

KEYSTORE_MODE=$(
    /usr/bin/plutil -extract keystore.mode raw -o - "$JSON_FILE"
)

if [ "$ID_FROM_JSON" != "$APP_ID" ]; then
    echo "ERROR: JSON id does not match job id"
    exit 1
fi

echo "OK"

echo ""
echo "[3/5] Downloading UnityPackage..."

curl -f -sS -o "$UNITYPACKAGE_FILE" "$UNITYPACKAGE_URL"

echo "OK"

echo ""
echo "[4/5] Processing keystore..."

if [ "$KEYSTORE_MODE" = "create" ]; then

    if [ ! -x "$KEYTOOL" ]; then
        echo "ERROR: keytool not found"
        echo "$KEYTOOL"
        exit 1
    fi

    VALIDITY_DAYS=$(
        /usr/bin/plutil -extract keystore.validityDays raw -o - "$JSON_FILE"
    )

    DNAME=$(
        /usr/bin/plutil -extract keystore.dname raw -o - "$JSON_FILE"
    )

    STORE_NAME="$APP_ID"
    STORE_PASSWORD="${APP_ID}pass"
    KEY_ALIAS="${APP_ID}d"
    KEY_PASSWORD="${APP_ID}dpass"

    KEYSTORE_FILE="$JOB_DIR/$APP_ID.keystore"

    rm -f "$KEYSTORE_FILE"

    "$KEYTOOL" -genkeypair -noprompt -v -storetype JKS -keystore "$KEYSTORE_FILE" -storepass "$STORE_PASSWORD" -alias "$KEY_ALIAS" -keypass "$KEY_PASSWORD" -keyalg RSA -keysize 2048 -validity "$VALIDITY_DAYS" -dname "$DNAME"

    if [ ! -s "$KEYSTORE_FILE" ]; then
        echo "ERROR: keystore creation failed"
        exit 1
    fi

    echo ""
    echo "Keystore created."
    echo "File:           $(basename "$KEYSTORE_FILE")"
    echo "Store name:     $STORE_NAME"
    echo "Store password: $STORE_PASSWORD"
    echo "Alias:          $KEY_ALIAS"
    echo "Alias password: $KEY_PASSWORD"

elif [ "$KEYSTORE_MODE" = "existing" ]; then

    STORE_PASSWORD=$(
        /usr/bin/plutil -extract keystore.storePassword raw -o - "$JSON_FILE"
    )

    KEY_ALIAS=$(
        /usr/bin/plutil -extract keystore.alias raw -o - "$JSON_FILE"
    )

    KEY_PASSWORD=$(
        /usr/bin/plutil -extract keystore.aliasPassword raw -o - "$JSON_FILE"
    )

    KEYSTORE_NAME=$(
        curl -f -sS "$SERVER/keystore-info/$APP_ID"
    )

    if [ -z "$KEYSTORE_NAME" ]; then
        echo "ERROR: keystore filename is empty"
        exit 1
    fi

    if [[ "$KEYSTORE_NAME" == *"/"* ]] || [[ "$KEYSTORE_NAME" == *"\\"* ]]; then
        echo "ERROR: invalid keystore filename"
        exit 1
    fi

    KEYSTORE_FILE="$JOB_DIR/$KEYSTORE_NAME"

    rm -f "$KEYSTORE_FILE"

    curl \
        -f \
        -sS \
        -o "$KEYSTORE_FILE" \
        "$SERVER/keystore/$APP_ID"

    if [ ! -s "$KEYSTORE_FILE" ]; then
        echo "ERROR: existing keystore download failed"
        exit 1
    fi

    if [ ! -x "$KEYTOOL" ]; then
        echo "ERROR: keytool not found"
        echo "$KEYTOOL"
        exit 1
    fi

    "$KEYTOOL" \
        -list \
        -keystore "$KEYSTORE_FILE" \
        -storepass "$STORE_PASSWORD" \
        -alias "$KEY_ALIAS" \
        > /dev/null

    echo ""
    echo "Existing keystore downloaded."
    echo "Original name:  $KEYSTORE_NAME"
    echo "Alias:          $KEY_ALIAS"

else

    echo "ERROR: unknown keystore mode: $KEYSTORE_MODE"
    exit 1

fi

echo ""
echo "[5/5] Checking files..."

if [ ! -s "$JSON_FILE" ]; then
    echo "ERROR: JSON is empty"
    exit 1
fi

if [ ! -s "$UNITYPACKAGE_FILE" ]; then
    echo "ERROR: UnityPackage is empty"
    exit 1
fi

if [ ! -s "$KEYSTORE_FILE" ]; then
    echo "ERROR: keystore is empty"
    exit 1
fi

echo "OK"

echo ""
echo "=================================="
echo " JOB READY"
echo "=================================="
echo ""
echo "ID:            $ID_FROM_JSON"
echo "Product Name:  $PRODUCT_NAME"
echo "Package Name:  $PACKAGE_NAME"
echo "Keystore Mode: $KEYSTORE_MODE"
echo "Keystore:      $KEYSTORE_FILE"
echo "Alias:         $KEY_ALIAS"
echo ""