arma3launcher/linux/generateRepo.sh

143 lines
4.8 KiB
Bash

#!/bin/bash
###################################################################
#Script Name :generateRepo.sh
#Description :Generate meta data for ArmA 3 Launcher
#Date :24.03.2020
#Author :Niklas Schütrumpf
#Email :niklas@mc8051.de
###################################################################
if ! [ -x "$(command -v zsyncmake)" ]; then
echo 'Error: zsync is not installed.' >&2
exit 1
fi
if ! [ -x "$(command -v jq)" ]; then
echo 'Error: jq is not installed.' >&2
exit 1
fi
if ! [ -x "$(command -v strings)" ]; then
echo 'Error: binutils is not installed.' >&2
exit 1
fi
declare -A SHASUMS
echo "===== ===== ===== GENERATE .ZSYNC ===== ===== ====="
FILELIST=$(find . -type f ! -path '*generateRepo.*' ! -path 'generateRepo.*' ! -path "*/.sync*" ! -path "*.zsync")
while IFS= read -r line; do
mustgenerate=false
zsyncfile="${line}.zsync"
filebyte=$(wc -c < "${line}")
filedate=$(stat -c %Y "${line}")
zsyncfiledate=$(strings "${zsyncfile}" 2>/dev/null | grep -m 1 MTime | cut -d" " -f2-)
if [ ! -f "$zsyncfile" ]; then
echo "$zsyncfile does not exist"
mustgenerate=true
elif [[ ! $(strings "${zsyncfile}" | grep -m 1 Length | cut -d" " -f2) == $filebyte ]]; then # Check file length
echo "$zsyncfile does not have corret length"
mustgenerate=true
elif [[ ! $filedate == $(date -d "${zsyncfiledate}" +"%s") ]]; then # Check date
echo "$zsyncfile does not have corret date"
mustgenerate=true
fi
if [ "$mustgenerate" = true ]; then
echo "Generate $zsyncfile"
rm "${zsyncfile}" 2> /dev/null
dirfile=$(dirname "${line}")
filename=$(basename "${line}")
filenamezsync=$(basename "${zsyncfile}")
fileurl=$(python3 -c "import urllib.parse; print(urllib.parse.quote(input()))" <<< "${filename}")
$(cd "${dirfile}" && zsyncmake -u ${fileurl} -o "${filenamezsync}" "${filename}")
if [ $? -eq 0 ]; then
echo "Success: Generated ${zsyncfile}"
else
echo "Failure: Couldn't generate ${zsyncfile}" >&2
fi
else
echo "Nothing changed for $line"
fi
SHA=$(strings "${zsyncfile}" | grep -m 1 SHA-1 | cut -d" " -f2)
SHASUMS[$(echo "${line}" | sed 's|^./||')]="${SHA}"
done <<< "$FILELIST"
echo -e "===== ===== ===== ===== ===== =====\n"
echo "===== ===== ===== DELETE SINGLE ZFILE WITHOUT FILE ===== ===== ====="
ZSYNCLIST=$(find . -name "*.zsync")
while IFS= read -r zfile; do
ORIG=$(echo "${zfile}" | rev | cut -c7- | rev)
if [ ! -f "$ORIG" ]; then
echo "$ORIG does not exist"
rm "${zfile}"
fi
done <<< "$ZSYNCLIST"
echo -e "===== ===== ===== ===== ===== =====\n"
echo "===== ===== ===== GENERATE METADATA ===== ===== ====="
FILELIST=$(find . -maxdepth 1 ! -path '*generateRepo.*' ! -path "*/.sync*" ! -path "*.zsync" ! -path "." | sed 's|^./||')
declare -a JSONDATA
while IFS= read -r folder; do
echo "${folder}"
if [ -d "$folder" ]; then
echo "is dir"
x=""
foldersize=0
FILEFOLDER=$(find "${folder}" -type f ! -path "*.zsync" | sed 's|^./||')
while IFS= read -r folderfile; do
filebyte=$(wc -c < "${folderfile}")
lastModified=$(stat -c %Y "${folderfile}")
if [ $filebyte -eq 0 ]; then
echo "Skipping \"${folderfile}\" because file is empty"
continue
fi
foldersize=$(expr $foldersize + $filebyte)
name=$(echo "${folderfile}" | cut -d"/" -f2-)
x="\"${name}\":{\"size\": ${filebyte}, \"sha1\": \"${SHASUMS[$folderfile]}\", \"lastModified\": ${lastModified}},${x}"
done <<< "$FILEFOLDER"
x=$(echo ${x} | rev | cut -c2- | rev)
if [ $foldersize -eq 0 ]; then
echo "Skipping complete folder \"${$folder}\" because all files are empty"
continue
fi
JSONDATA+=( "\"${folder}\": {\"size\":${foldersize},\"content\":{${x}}}" )
else
echo "is file"
filebyte=$(wc -c < "${folder}")
lastModified=$(stat -c %Y "${folderfile}")
if [ $filebyte -eq 0 ]; then
continue
fi
JSONDATA+=( "\"${folder}\": {\"size\":${filebyte}, \"sha1\": \"${SHASUMS[$folder]}\", \"lastModified\": ${lastModified}}" )
fi
done <<< "$FILELIST"
s=""
for i in "${JSONDATA[@]}"
do
s="${s},${i}"
done
s=$(echo ${s} | cut -c2-)
s="{${s}}"
echo $s | jq . > /dev/null
if [ $? -eq 0 ]; then
echo $s > ./.sync/modset.json
echo "Success: Generated metafile"
else
echo "Failure: invalid json generated" >&2
fi
echo -e "===== ===== ===== ===== ===== =====\n"