commit 7259fdc58bc20f4dbc5d8c002fb315ec01bd303f Author: Jessica James Date: Mon Apr 26 20:36:58 2021 -0500 Initial commit diff --git a/.s3cfg-gcloud b/.s3cfg-gcloud new file mode 100644 index 0000000..a7981dc --- /dev/null +++ b/.s3cfg-gcloud @@ -0,0 +1,76 @@ +[default] +access_key = GOOG2F4PQLDENFN2QHXH +access_token = +add_encoding_exts = +add_headers = +bucket_location = US +ca_certs_file = +cache_file = +check_ssl_certificate = True +check_ssl_hostname = True +cloudfront_host = cloudfront.amazonaws.com +default_mime_type = binary/octet-stream +delay_updates = False +delete_after = False +delete_after_fetch = False +delete_removed = False +dry_run = False +enable_multipart = True +encrypt = False +expiry_date = +expiry_days = +expiry_prefix = +follow_symlinks = False +force = False +get_continue = False +gpg_command = /usr/bin/gpg +gpg_decrypt = %(gpg_command)s -d --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s +gpg_encrypt = %(gpg_command)s -c --verbose --no-use-agent --batch --yes --passphrase-fd %(passphrase_fd)s -o %(output_file)s %(input_file)s +gpg_passphrase = +guess_mime_type = True +host_base = storage.googleapis.com +host_bucket = %(bucket).storage.googleapis.com +human_readable_sizes = False +invalidate_default_index_on_cf = False +invalidate_default_index_root_on_cf = True +invalidate_on_cf = False +kms_key = +limit = -1 +limitrate = 0 +list_md5 = False +log_target_prefix = +long_listing = False +max_delete = -1 +mime_type = +multipart_chunk_size_mb = 15 +multipart_max_chunks = 10000 +preserve_attrs = True +progress_meter = True +proxy_host = +proxy_port = 0 +put_continue = False +recursive = False +recv_chunk = 65536 +reduced_redundancy = False +requester_pays = False +restore_days = 1 +restore_priority = Standard +secret_key = P2wrxwJmDO0qEyA/99NUeQPGHd4C0yx6kiDTBjFI +send_chunk = 65536 +server_side_encryption = False +signature_v2 = False +signurl_use_https = False +simpledb_host = sdb.amazonaws.com +skip_existing = False +socket_timeout = 300 +stats = False +stop_on_error = False +storage_class = +urlencoding_mode = normal +use_http_expect = False +use_https = True +use_mime_magic = True +verbosity = WARNING +website_endpoint = http://%(bucket)s.s3-website-%(location)s.amazonaws.com/ +website_error = +website_index = index.html diff --git a/clean_builds.sh b/clean_builds.sh new file mode 100755 index 0000000..3633d5c --- /dev/null +++ b/clean_builds.sh @@ -0,0 +1,130 @@ +# Setup static paths +version_path="${version_data_path}" +patches_path="${patches_data_path}" + +# Parse arguments +echo_output=false +verbose=false + +function print_help() { + echo "Cleans up unreferenced builds." + echo "Options:" + echo " --help, -h | Displays this help message" + echo " --echo, -e, --dry-run | Suppresses deleting the unreferenced builds" + echo " --verbose, -v | Enables verbose output, useful for debugging" + echo " --version-path | Explicitly override version data directory path with specified" + echo " --patches-path | Explicitly override patch data path with specified" + echo "" + echo "Example usage: ./clean_builds --echo" + exit 0 +} + +for arg in "$@" +do + case $arg in + --help|-h) + print_help + ;; + --echo|--dry-run|-e) + echo_output=true + shift + ;; + --verbose|-v) + verbose=true + shift + ;; + --version-path) + version_path="$2" + shift + shift + ;; + --patches-path) + patches_path="$2" + shift + shift + ;; + esac +done + +if $verbose +then + echo "Values:" + echo " echo_output: $echo_output" + echo " patches_path: $patches_path" + echo " version_path: $version_path" + echo "" +fi + +# Scans for unreferenced builds, and deletes them if necessary +# +# @param version_file Path to version files containing build information +# @param patches_path Path to the root patches directory on this filesystem +function clean_builds() { + version_path="$1" + patches_path="$2" + + # Read in list of builds + builds=() + for item in $patches_path/*; do + if [ -f "$item/instructions.json" ]; then + builds+=("$item") + #echo "$item" + fi + done + + if $verbose; then + echo "Builds available:" + for build in "${builds[@]}"; do + echo "$build" + done + echo "" + fi + + # Read in referenced builds + referenced_builds=() + for version_file in $version_path/*; do + version_data=$(cat "$version_file") + build=$(echo "$version_data" | jq -r ".game.patch_path") + build_path="$patches_path/$build" + + if [[ ! "${referenced_builds[@]}" =~ "$build_path" ]]; then + referenced_builds+=("$build_path") + fi + done + + if $verbose; then + echo "Referenced builds:" + for build in "${referenced_builds[@]}"; do + echo $build + done + echo "" + fi + + # Build list of unreferenced builds + unreferenced_builds=() + for build in "${builds[@]}"; do + if [[ ! "${referenced_builds[@]}" =~ "$build" ]]; then + unreferenced_builds+=("$build") + fi + done + + if $verbose; then + echo "Unreferenced builds:" + for build in "${unreferenced_builds[@]}"; do + echo $build + done + echo "" + fi + + # Delete unreferenced builds + for build in "${unreferenced_builds[@]}"; do + echo "Removing $build..." + if $echo_output; then + echo rm -rf "$build" + else + rm -rf "$build" + fi + done +} + +clean_builds "${version_path}" "${patches_path}" diff --git a/game_mirrors b/game_mirrors new file mode 100644 index 0000000..a10554b --- /dev/null +++ b/game_mirrors @@ -0,0 +1,34 @@ +[ + { + "name": "Constructive Tyranny (Germany)", + "url": "http://rxmirror.ctgamehosts.uk/" + }, + { + "name": "Constructive Tyranny US (Vint Hill, Virginia, USA)", + "url": "http://mirror.us.tyrant.gg/" + }, + { + "name": "Constructive Tyranny US (Piscataway, New Jersey, USA)", + "url": "http://mirror.usa.tyrant.gg/" + }, + { + "name": "iTweek (Germany)", + "url": "http://rxp-de1.ts3-server.ch/" + }, + { + "name": "CnCFPS.com (Los Angeles, CA, USA)", + "url": "http://rxp-lax2.cncfps.com" + }, + { + "name": "TotemArts (Las Vegas, Nevada, USA)", + "url": "http://us-lv.buyvm.renegade-x.com/" + }, + { + "name": "TotemArts (New York, New York, USA)", + "url": "http://us-ny.buyvm.renegade-x.com/" + }, + { + "name": "TotemArts (Roost, Luxembourg, EU)", + "url": "http://eu-lux.buyvm.renegade-x.com/" + } +] diff --git a/map_builds.sh b/map_builds.sh new file mode 100755 index 0000000..e8642b5 --- /dev/null +++ b/map_builds.sh @@ -0,0 +1,112 @@ +# Setup static paths +version_path="${version_data_path}" +patches_path="${patches_data_path}" + +# Parse arguments +verbose=false + +function print_help() { + echo "Prints out a mapping of the current versions/builds." + echo "Options:" + echo " --help, -h | Displays this help message" + echo " --verbose, -v | Enables verbose output, useful for debugging" + echo " --version-path | Explicitly override version data directory path with specified" + echo " --patches-path | Explicitly override patch data path with specified" + echo "" + echo "Example usage: ./map_builds --echo" + exit 0 +} + +for arg in "$@" +do + case $arg in + --help|-h) + print_help + ;; + --verbose|-v) + verbose=true + shift + ;; + --version-path) + version_path="$2" + shift + shift + ;; + --patches-path) + patches_path="$2" + shift + shift + ;; + esac +done + +if $verbose +then + echo "Values:" + echo " patches_path: $patches_path" + echo " version_path: $version_path" + echo "" +fi + +# Scans for unreferenced builds, and deletes them if necessary +# +# @param version_file Path to version files containing build information +# @param patches_path Path to the root patches directory on this filesystem +function map_builds() { + version_path="$1" + patches_path="$2" + + # Read in list of builds + builds=() + for item in $patches_path/*; do + if [ -f "$item/instructions.json" ]; then + builds+=("$item") + fi + done + + if $verbose; then + echo "Builds available:" + for build in "${builds[@]}"; do + echo "$build" + done + echo "" + fi + + # Read in referenced builds + referenced_builds=() + for version_file in $version_path/*; do + version_data=$(cat "$version_file") + build=$(echo "$version_data" | jq -r ".game.patch_path") + build_path="$patches_path/$build" + + if [[ ! "${referenced_builds[@]}" =~ "$build_path" ]]; then + referenced_builds+=("$build_path") + fi + + echo "$(basename $version_file) -> $build" + done + + if $verbose; then + echo "Referenced builds:" + for build in "${referenced_builds[@]}"; do + echo $build + done + echo "" + fi + + # Build list of unreferenced builds + unreferenced_builds=() + for build in "${builds[@]}"; do + if [[ ! "${referenced_builds[@]}" =~ "$build" ]]; then + unreferenced_builds+=("$build") + fi + done + + # Print out unreferenced builds + echo "Unreferenced builds:" + for build in "${unreferenced_builds[@]}"; do + echo $build + done +} + +map_builds "${version_path}" "${patches_path}" diff --git a/set_game_branch.sh b/set_game_branch.sh new file mode 100755 index 0000000..31567eb --- /dev/null +++ b/set_game_branch.sh @@ -0,0 +1,145 @@ +# Setup static paths +version_path="${version_data_path}" +patches_path="${patches_data_path}" + +# Parse arguments +echo_output=false +minify=false +verbose=false + +function print_help() { + echo "Sets the patch path for a given branch." + echo "Options:" + echo " --help, -h | Displays this help message" + echo " --echo, -e, --dry-run | Prints the output to the console, instead of overwriting the file" + echo " --minify, -m | Minifies the JSON result" + echo " --verbose, -v | Enables verbose output, useful for debugging" + echo " --version-path | Explicitly override version data directory path with specified" + echo " --patches-path | Explicitly override patch data path with specified" + echo "" + echo "Example usage: ./set_game_branch --echo release PATCH5464C" + exit 0 +} + +for arg in "$@" +do + case $arg in + --help|-h) + print_help + ;; + --echo|--dry-run|-e) + echo_output=true + shift + ;; + --minify|-m) + minify=true + shift + ;; + --verbose|-v) + verbose=true + shift + ;; + --version-path) + version_path="$2" + shift + shift + ;; + --patches-path) + patches_path="$2" + shift + shift + ;; + esac +done + +# Sanity check parameter count +if [ "$#" -ne 2 ] +then + echo "ERROR: insufficient parameters" + print_help +fi + +version_file="${version_path%/}/${1%.json}.json" +patch_path="${2%/}" + +if $verbose +then + echo "Values:" + echo " echo_output: $echo_output" + echo " minify: $minify" + echo " patches_path: $patches_path" + echo " version_path: $version_path" + echo " patch_path: $patch_path" + echo " version_file: $version_file" + echo "" +fi + +# Sets a Renegade X launcher version branch to point to a Renegade X game patch data package +# +# @param version_file Launcher version file to target/modify +# @param patch_path Relative path from patches_path to target game patch data +# @param patches_path Path to the root patches directory on this filesystem +function set_branch() { + version_file="$1" + patch_path="$2" + patches_path="$3" + metadata_file="${patches_path}/${patch_path}/metadata.json" + + # Verify version branch exists + if ! [ -f "$version_file" ] + then + echo "ERROR: version file does not exist: $version_file" + return 1 + fi + + # Verify patch data exists + if ! [ -f "$metadata_file" ] + then + echo "ERROR: metadata file does not exist: $metadata_file" + return 1 + fi + + # Get metadata hash + patch_metadata=$(cat "${metadata_file}") + metadata_hash=$(sha256sum ${metadata_file} | awk '{ print toupper($1) }') + + # Validate instructions_hash + instructions_real_hash=$(sha256sum "${patches_path}/${patch_path}/instructions.json"| awk '{ print toupper($1) }') + instructions_expected_hash=$(echo "$patch_metadata" | jq -r ".instructions_hash") + if [ "$instructions_expected_hash" != "$instructions_real_hash" ] + then + echo "ERROR: Metadata hash does not match real instructions.json hash. Corrupt upload?" + return 1 + fi + + # TODO: Verify contents of patch by parsing through instructions.json to check file hashes + + # Read in initial version data + version_data=$(cat "${version_file}") + + # Set the patch_path + version_data=$(echo "${version_data}" | jq ".game.patch_path = \"${patch_path}\"") + + # Set the metadata hash; this is unused for now + version_data=$(echo "${version_data}" | jq ".game.metadata_hash = \"${metadata_hash}\"") + + # Merge in metadata into game + game_version_data=$(echo "${version_data}" | jq ".game * ${patch_metadata}") + version_data=$(echo "${version_data}" | jq ".game = ${game_version_data}") + + # Minify final JSON if specified + if $minify + then + version_data=$(echo "${version_data}" | jq -c .) + fi + + # Write version_data to destination + if $echo_output + then + echo "${version_data}" + else + echo "${version_data}" > ${version_file} + fi +} + +set_branch "${version_file}" "${patch_path}" "${patches_path}" diff --git a/sync.sh b/sync.sh new file mode 100755 index 0000000..fb566d6 --- /dev/null +++ b/sync.sh @@ -0,0 +1,13 @@ +#!/bin/bash +lockfile=/home/renx/static.renegade-x.com/sync.lock +{ + if ! flock -n 9 + then + exit 1 + fi + +echo Synching... +s3cmd sync --acl-public --add-header="Cache-Control:max-age=0" --config=/home/renx/static.renegade-x.com/.s3cfg-gcloud /home/renx/static.renegade-x.com/data/ s3://static.renegade-x.com/ +# "--delete-removed" was removed due to a 400 InvalidArgument error; that functionality needs to be re-added somehow + +} 9>"$lockfile" diff --git a/update_mirrors.sh b/update_mirrors.sh new file mode 100755 index 0000000..fdfa5a7 --- /dev/null +++ b/update_mirrors.sh @@ -0,0 +1,20 @@ +game_mirrors_file=game_mirrors +static_path="/home/renx/static.renegade-x.com/" +version_path="${static_path}/data/launcher_data/version" + +update_mirrors() { + game_mirrors=$(cat "${game_mirrors_file}") + version_file=${version_path}/$1 + jq ".game.mirrors = ${game_mirrors}" "${version_file}" > "$version_file.tmp" && mv "${version_file}.tmp" "${version_file}" +} + +# Release branches +update_mirrors release.json +update_mirrors server.json + +# Staging branches +update_mirrors beta.json + +# Temporary / Alpha testing branches +update_mirrors alpha.json +update_mirrors launcher.json