4
0

servers-json-validate.sh 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #!/bin/bash
  2. # Checks lgsm/data/servers.json against serverlist.csv, the details port tables and the default configs.
  3. # shellcheck disable=SC2329 # Stubs replace module functions called by fn_info_messages_select_engine.
  4. cd "$(dirname "${BASH_SOURCE[0]}")/../.." || exit 1
  5. serversjson="lgsm/data/servers.json"
  6. serverlist="lgsm/data/serverlist.csv"
  7. configdir="lgsm/config-default/config-lgsm"
  8. exitcode=0
  9. fn_error() {
  10. echo "ERROR: ${1}"
  11. exitcode=1
  12. }
  13. if ! jq empty "${serversjson}"; then
  14. echo "ERROR: ${serversjson} is not valid JSON"
  15. exit 1
  16. fi
  17. echo "Checking that servers.json and serverlist.csv list the same servers"
  18. csvservers="$(tail -n +2 "${serverlist}" | cut -d ',' -f2 | sort)"
  19. jsonservers="$(jq -r '.servers | keys[]' "${serversjson}")"
  20. while read -r gameservername; do
  21. fn_error "${gameservername} is in serverlist.csv but not in servers.json"
  22. done < <(comm -23 <(echo "${csvservers}") <(echo "${jsonservers}") | sed '/^$/d')
  23. while read -r gameservername; do
  24. fn_error "${gameservername} is in servers.json but not in serverlist.csv"
  25. done < <(comm -13 <(echo "${csvservers}") <(echo "${jsonservers}") | sed '/^$/d')
  26. if [ "$(jq -r '.servers | keys_unsorted[]' "${serversjson}")" != "${jsonservers}" ]; then
  27. fn_error "servers in servers.json are not in alphabetical order"
  28. fi
  29. echo "Checking ports against info_messages.sh and _default.cfg"
  30. while IFS=',' read -r shortname gameservername _; do
  31. [ -n "$(jq -r --arg g "${gameservername}" '.servers[$g] // empty' "${serversjson}")" ] || continue
  32. defaultcfg="${configdir}/${gameservername}/_default.cfg"
  33. expected="$(
  34. (
  35. # shellcheck source=/dev/null
  36. source "${defaultcfg}"
  37. ase="Enabled"
  38. # shellcheck source=/dev/null
  39. source lgsm/modules/info_messages.sh > /dev/null 2>&1
  40. fn_port() {
  41. [ "${1}" == "header" ] || printf 'PORTROW\t%s\t%s\t%s\n' "${1}" "${2}" "${3}"
  42. }
  43. column() {
  44. cat
  45. }
  46. fn_messages_separator() {
  47. :
  48. }
  49. fn_print_error_nl() {
  50. :
  51. }
  52. fn_info_messages_select_engine
  53. ) 2> /dev/null | sed -n 's/^PORTROW\t//p'
  54. )"
  55. actual="$(jq -r --arg g "${gameservername}" '.servers[$g].ports[] | .protocols[] as $p | [.label, .variable, $p] | @tsv' "${serversjson}")"
  56. if [ "$(sort <<< "${expected}")" != "$(sort <<< "${actual}")" ]; then
  57. fn_error "${gameservername} ports differ from info_messages.sh"
  58. diff <(sort <<< "${expected}") <(sort <<< "${actual}") | sed -n 's/^</ info_messages.sh:/p; s/^>/ servers.json: /p'
  59. fi
  60. while IFS=$'\t' read -r variable default; do
  61. cfgvalue="$(sed -n "s/^${variable}=\"\([0-9]*\)\"$/\1/p" "${defaultcfg}" | head -n 1)"
  62. if [ -n "${cfgvalue}" ] && [ "${cfgvalue}" != "${default}" ]; then
  63. fn_error "${gameservername} ${variable} is ${cfgvalue} in _default.cfg but ${default:-null} in servers.json"
  64. fi
  65. done < <(jq -r --arg g "${gameservername}" '.servers[$g].ports | unique_by(.variable)[] | [.variable, (.default // "" | tostring)] | @tsv' "${serversjson}")
  66. done < <(tail -n +2 "${serverlist}")
  67. echo "Ports with no default and no note:"
  68. jq -r '.servers | to_entries[] | .key as $g | .value.ports[] | select(.default == null and .note == null) | " \($g) \(.variable)"' "${serversjson}" | sort -u
  69. exit "${exitcode}"