fork 0k-charms
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

140 lines
4.2 KiB

  1. APP_NAME=element
  2. SOURCE_URL="https://github.com/vector-im/element-web/releases/download"
  3. LOCATION="$SERVICE_CONFIGSTORE/opt/apps/$APP_NAME"
  4. CONFIGFILE="$LOCATION/config.json"
  5. element:code_init() {
  6. local version="$1" enforce_version="$2" source_url
  7. if [ -e "$LOCATION/.version" ] && \
  8. [ "$(cat "$LOCATION/.version")" == "$version" ]; then
  9. return 0
  10. fi
  11. if [[ "${enforce_version,,}" =~ ^(false|0|no)$ ]]; then
  12. if [ -d "$LOCATION" ]; then
  13. return 0
  14. fi
  15. fi
  16. if [ -d "$LOCATION" ]; then
  17. find "$LOCATION" -mindepth 1 -delete
  18. else
  19. mkdir -p "$LOCATION"
  20. fi
  21. cd "$LOCATION"
  22. source_url="$SOURCE_URL/$version/$APP_NAME-$version.tar.gz"
  23. info "Downloading '$source_url'."
  24. wget -q "$source_url" -O file.tar.gz || {
  25. err "Couldn't download '$source_url'."
  26. rm file.tar.gz
  27. return 1
  28. }
  29. tar -zxvf file.tar.gz &&
  30. rm file.tar.gz &&
  31. chown root:root "$LOCATION" -R &&
  32. echo "$version" > "$LOCATION/.version"
  33. }
  34. export ELEMENT_OPTIONS=(
  35. version:ignore
  36. enforce-version:ignore
  37. enforce-config:ignore
  38. )
  39. export ELEMENT_OPTIONS_CONCAT=" ${ELEMENT_OPTIONS[*]} "
  40. element:code_config_base() {
  41. local enforce_config="$1" service_def
  42. if [[ "${enforce_config,,}" =~ ^(false|0|no)$ ]]; then
  43. if [ -e "$CONFIGFILE" ]; then
  44. return 0
  45. fi
  46. fi
  47. service_def=$(get_compose_service_def "$SERVICE_NAME") || return 1
  48. options=$(e "$service_def" | shyaml get-value -y options) || true
  49. e "$options" |
  50. element:json-make > "$CONFIGFILE" || {
  51. err "Failed to make 'config.json'."
  52. return 1
  53. }
  54. }
  55. element:json-make() {
  56. local conv="$1" key val
  57. ## XXXvlab: Should probably offer some lib to do this
  58. local sep=
  59. while read-0 key val; do
  60. key=$(e "$key" | shyaml get-value)
  61. ytype=$(e "$val" | shyaml get-type)
  62. case "$ELEMENT_OPTIONS_CONCAT" in
  63. *" ${key}:ignore "*)
  64. continue
  65. ;;
  66. *" ${key}:bool "*)
  67. val=$(e "$val" | shyaml get-value)
  68. case "${val,,}" in
  69. true|ok|yes|y)
  70. val=true
  71. ;;
  72. false|ko|nok|no|n)
  73. val=false
  74. ;;
  75. *)
  76. die "Invalid value for ${WHITE}$key$NORMAL, please use a boolean value."
  77. ;;
  78. esac
  79. ;;
  80. *" ${key}:numeric "*)
  81. val=$(e "$val" | shyaml get-value)
  82. if ! is_int "$val"; then
  83. err "Invalid value for ${WHITE}$key$NORMAL, please use numeric value."
  84. return 1
  85. fi
  86. ;;
  87. *" ${key}:struct* "*)
  88. val=$(e "$val" | element:json-make noconv) || return 1
  89. ;;
  90. *" ${key}:struct "*)
  91. val=$(e "$val" | element:json-make) || return 1
  92. ;;
  93. *" ${key}:string "*|*)
  94. :
  95. ;;
  96. esac
  97. case "$ytype" in
  98. struct|sequence)
  99. :
  100. ;;
  101. bool)
  102. val=$(e "$val" | shyaml get-value)
  103. ## shyaml outputs actually python's True/False,
  104. ## json need the lowercase version.
  105. val=${val,,}
  106. ;;
  107. str)
  108. val=$(e "$val" | shyaml get-value | jq -Rr tojson)
  109. ;;
  110. *)
  111. echo "YTYPE: $ytype" >&2
  112. echo "VAL: $val" >&2
  113. val=$(e "$val" | shyaml get-value | jq -r tojson)
  114. ;;
  115. esac
  116. if [ -z "$conv" ]; then
  117. key=$(echo "${key//-/_}" | sed 's/_\([a-z0-9]\)/\U\1/g')
  118. fi
  119. printf "$sep%s\0%s" "$key" "$val"
  120. sep="\0\0"
  121. done < <(shyaml key-values-0 -y) |
  122. jq -sR 'split("\u0000\u0000") | map(split("\u0000") | {key: .[0], value: .[1] | fromjson}) | from_entries'
  123. }
  124. element:config_merge() {
  125. local old_config new_config="$1"
  126. old_config=$(cat "$CONFIGFILE")
  127. e "$old_config" "$new_config" | jq -s 'reduce .[] as $x ({}; . * $x)' > "$CONFIGFILE"
  128. }