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.

141 lines
4.2 KiB

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