|
| 1 | +apiVersion: v1 |
| 2 | +kind: ConfigMap |
| 3 | +metadata: |
| 4 | + name: {{ template "factorio-server-charts.fullname" . }}-mod-downloader-configmap |
| 5 | + labels: |
| 6 | + app: {{ template "factorio-server-charts.fullname" . }} |
| 7 | + chart: {{ template "factorio-server-charts.fullname" . }} |
| 8 | + release: "{{ .Release.Name }}" |
| 9 | + heritage: "{{ .Release.Service }}" |
| 10 | +data: |
| 11 | + #credit to the factoriotools/factorio-docker team, most of this logic came from them |
| 12 | + # https://github.com/factoriotools/factorio-docker/blob/master/docker/files/update-mods.sh |
| 13 | + mod-downloader.sh: | |
| 14 | + modDir=/factorio/mods |
| 15 | + MOD_BASE_URL="https://mods.factorio.com" |
| 16 | + declare -a officialMods |
| 17 | + officialMods=( |
| 18 | + {{- range .Values.mods.portal }} |
| 19 | + {{ . }} |
| 20 | + {{- end }} |
| 21 | + ) |
| 22 | + declare -A unofficialMods |
| 23 | + {{- range .Values.mods.unofficial }} |
| 24 | + unofficialMods[{{ .name | quote}}]={{ .url | quote}} |
| 25 | + {{- end }} |
| 26 | + function print_step() |
| 27 | + { |
| 28 | + echo "$1" |
| 29 | + } |
| 30 | + function print_success() |
| 31 | + { |
| 32 | + echo "$1" |
| 33 | + } |
| 34 | + function print_failure() |
| 35 | + { |
| 36 | + echo "$1" |
| 37 | + } |
| 38 | + function downloadUnofficial() { |
| 39 | + cd $modDir;curl -L -o $2 $1 |
| 40 | + } |
| 41 | + function downloadofficial() { |
| 42 | + if [[ -z ${USERNAME:-} ]]; then |
| 43 | + USERNAME="$(jq -j ".username" "/factorio/configs/server-settings.json")" |
| 44 | + fi |
| 45 | +
|
| 46 | + if [[ -z ${TOKEN:-} ]]; then |
| 47 | + TOKEN="$(jq -j ".token" "/factorio/configs/server-settings.json")" |
| 48 | + fi |
| 49 | +
|
| 50 | + if [[ -z ${USERNAME:-} ]]; then |
| 51 | + echo "You need to provide your Factorio username to update mods." |
| 52 | + fi |
| 53 | +
|
| 54 | + if [[ -z ${TOKEN:-} ]]; then |
| 55 | + echo "You need to provide your Factorio token to update mods." |
| 56 | + fi |
| 57 | + MOD_INFO_URL="$MOD_BASE_URL/api/mods/$1" |
| 58 | + MOD_INFO_JSON=$(curl --silent "$MOD_INFO_URL") |
| 59 | + #echo "$MOD_INFO_URL $MOD_INFO_JSON" |
| 60 | + if ! echo "$MOD_INFO_JSON" | jq -e .name >/dev/null; then |
| 61 | + print_success " Custom mod not on $MOD_BASE_URL, skipped." |
| 62 | + return 0 |
| 63 | + fi |
| 64 | + MOD_INFO=$(echo "$MOD_INFO_JSON" | jq -j --arg version "$VERSION" ".releases|reverse|map(select(.info_json.factorio_version as \$mod_version | \$version | startswith(\$mod_version)))[0]|.file_name, \";\", .download_url, \";\", .sha1") |
| 65 | + echo $MOD_INFO |
| 66 | + MOD_FILENAME=$(echo "$MOD_INFO" | cut -f1 -d";") |
| 67 | + MOD_URL=$(echo "$MOD_INFO" | cut -f2 -d";") |
| 68 | + MOD_SHA1=$(echo "$MOD_INFO" | cut -f3 -d";") |
| 69 | + if [[ $MOD_FILENAME == null ]]; then |
| 70 | + print_failure " Not compatible with version" |
| 71 | + return 0 |
| 72 | + fi |
| 73 | + print_step "Downloading..." |
| 74 | + FULL_URL="$MOD_BASE_URL$MOD_URL?username=$USERNAME&token=$TOKEN" |
| 75 | + echo $FULL_URL |
| 76 | + HTTP_STATUS=$(curl --silent -L -w "%{http_code}" -o "$modDir/$MOD_FILENAME" "$FULL_URL") |
| 77 | +
|
| 78 | + if [[ $HTTP_STATUS != 200 ]]; then |
| 79 | + print_failure " Download failed: Code $HTTP_STATUS." |
| 80 | + rm -f "$modDir/$MOD_FILENAME" |
| 81 | + return 1 |
| 82 | + fi |
| 83 | +
|
| 84 | + if [[ ! -f $modDir/$MOD_FILENAME ]]; then |
| 85 | + print_failure " Downloaded file missing!" |
| 86 | + return 1 |
| 87 | + fi |
| 88 | +
|
| 89 | + if ! [[ $(sha1sum "$modDir/$MOD_FILENAME") =~ $MOD_SHA1 ]]; then |
| 90 | + print_failure " SHA1 mismatch!" |
| 91 | + rm -f "$modDir/$MOD_FILENAME" |
| 92 | + return 1 |
| 93 | + fi |
| 94 | +
|
| 95 | + print_success " Download complete." |
| 96 | + } |
| 97 | + mkdir -p $modDir |
| 98 | + for key in "${!unofficialMods[@]}"; do |
| 99 | + downloadUnofficial "${unofficialMods[$key]}" $key |
| 100 | + done |
| 101 | + {{- if and .Values.server_settings.username .Values.server_settings.token }} |
| 102 | + echo "server is running version $VERSION" |
| 103 | + for officialMod in ${officialMods[*]}; do |
| 104 | + downloadofficial $officialMod $USERNAME $TOKEN |
| 105 | + done |
| 106 | + {{- end }} |
| 107 | +
|
| 108 | +
|
| 109 | + |
| 110 | +
|
| 111 | + |
0 commit comments