From 5ffa8ffac6a1a4ff806828ebfd1a60cfb7fe4db3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phan=20Sainl=C3=A9ger?= Date: Sat, 30 Jul 2022 00:17:00 +0200 Subject: [PATCH] new: [element] new charm --- element/hooks/init | 24 ++++++++ element/lib/common | 140 +++++++++++++++++++++++++++++++++++++++++++ element/metadata.yml | 22 +++++++ 3 files changed, 186 insertions(+) create mode 100755 element/hooks/init create mode 100644 element/lib/common create mode 100644 element/metadata.yml diff --git a/element/hooks/init b/element/hooks/init new file mode 100755 index 0000000..2664b43 --- /dev/null +++ b/element/hooks/init @@ -0,0 +1,24 @@ +#!/bin/bash + +## Init is run on host +## For now it is run every time the script is launched, but +## it should be launched only once after build. + +## Accessible variables are: +## - SERVICE_NAME Name of current service +## - DOCKER_BASE_IMAGE Base image from which this service might be built if any +## - SERVICE_DATASTORE Location on host of the DATASTORE of this service +## - SERVICE_CONFIGSTORE Location on host of the CONFIGSTORE of this service + +. lib/common + +set -e + +version=$(options-get version 2>/dev/null) +enforce_version=$(options-get enforce-version 2>/dev/null) +enforce_config=$(options-get enforce-config 2>/dev/null) + +element:code_init "$version" "$enforce_version" + +element:code_config_base "$enforce_config" + diff --git a/element/lib/common b/element/lib/common new file mode 100644 index 0000000..ce962e5 --- /dev/null +++ b/element/lib/common @@ -0,0 +1,140 @@ + + +APP_NAME=element +SOURCE_URL="https://github.com/vector-im/element-web/releases/download" +LOCATION="$SERVICE_CONFIGSTORE/opt/apps/$APP_NAME" +CONFIGFILE="$LOCATION/config.json" + + +element:code_init() { + local version="$1" enforce_version="$2" source_url + if [ -e "$LOCATION/.version" ] && \ + [ "$(cat "$LOCATION/.version")" == "$version" ]; then + return 0 + fi + if [[ "${enforce_version,,}" =~ ^(false|0|no)$ ]]; then + if [ -d "$LOCATION" ]; then + return 0 + fi + fi + if [ -d "$LOCATION" ]; then + find "$LOCATION" -mindepth 1 -delete + else + mkdir -p "$LOCATION" + fi + cd "$LOCATION" + source_url="$SOURCE_URL/$version/$APP_NAME-$version.tar.gz" + info "Downloading '$source_url'." + wget -q "$source_url" -O file.tar.gz || { + err "Couldn't download '$source_url'." + rm file.tar.gz + return 1 + } + tar -zxvf file.tar.gz && + rm file.tar.gz && + chown root:root "$LOCATION" -R && + echo "$version" > "$LOCATION/.version" +} + +export ELEMENT_OPTIONS=( + version:ignore + enforce-version:ignore + enforce-config:ignore +) + +export ELEMENT_OPTIONS_CONCAT=" ${ELEMENT_OPTIONS[*]} " + + +element:code_config_base() { + local enforce_config="$1" service_def + if [[ "${enforce_config,,}" =~ ^(false|0|no)$ ]]; then + if [ -e "$CONFIGFILE" ]; then + return 0 + fi + fi + service_def=$(get_compose_service_def "$SERVICE_NAME") || return 1 + options=$(e "$service_def" | shyaml get-value -y options) || true + + e "$options" | + element:json-make > "$CONFIGFILE" || { + err "Failed to make 'config.json'." + return 1 + } +} + +element:json-make() { + local conv="$1" key val + ## XXXvlab: Should probably offer some lib to do this + local sep= + while read-0 key val; do + key=$(e "$key" | shyaml get-value) + ytype=$(e "$val" | shyaml get-type) + case "$ELEMENT_OPTIONS_CONCAT" in + *" ${key}:ignore "*) + continue + ;; + *" ${key}:bool "*) + val=$(e "$val" | shyaml get-value) + case "${val,,}" in + true|ok|yes|y) + val=true + ;; + false|ko|nok|no|n) + val=false + ;; + *) + die "Invalid value for ${WHITE}$key$NORMAL, please use a boolean value." + ;; + esac + ;; + *" ${key}:numeric "*) + val=$(e "$val" | shyaml get-value) + if ! is_int "$val"; then + err "Invalid value for ${WHITE}$key$NORMAL, please use numeric value." + return 1 + fi + ;; + *" ${key}:struct* "*) + val=$(e "$val" | element:json-make noconv) || return 1 + ;; + *" ${key}:struct "*) + val=$(e "$val" | element:json-make) || return 1 + ;; + *" ${key}:string "*|*) + : + ;; + esac + case "$ytype" in + struct|sequence) + : + ;; + bool) + val=$(e "$val" | shyaml get-value) + ## shyaml outputs actually python's True/False, + ## json need the lowercase version. + val=${val,,} + ;; + str) + val=$(e "$val" | shyaml get-value | jq -Rr tojson) + ;; + *) + echo "YTYPE: $ytype" >&2 + echo "VAL: $val" >&2 + val=$(e "$val" | shyaml get-value | jq -r tojson) + ;; + esac + if [ -z "$conv" ]; then + key=$(echo "${key//-/_}" | sed 's/_\([a-z0-9]\)/\U\1/g') + fi + printf "$sep%s\0%s" "$key" "$val" + sep="\0\0" + done < <(shyaml key-values-0 -y) | + jq -sR 'split("\u0000\u0000") | map(split("\u0000") | {key: .[0], value: .[1] | fromjson}) | from_entries' +} + + +element:config_merge() { + local old_config new_config="$1" + old_config=$(cat "$CONFIGFILE") + e "$old_config" "$new_config" | jq -s 'reduce .[] as $x ({}; . * $x)' > "$CONFIGFILE" +} diff --git a/element/metadata.yml b/element/metadata.yml new file mode 100644 index 0000000..51114ac --- /dev/null +++ b/element/metadata.yml @@ -0,0 +1,22 @@ +description: "Element Web" +maintainer: "Stéphan Sainléger " +subordinate: true + +default-options: + version: v1.11.1 + enforce-version: true + enforce-config: true + +uses: + publish-dir: + #constraint: required | recommended | optional + #auto: pair | summon | none ## default: pair + scope: container + constraint: required + auto: summon + solves: + container: "main running server" + default-options: + location: !var-expand "$CONFIGSTORE/$BASE_SERVICE_NAME/opt/apps/element" + # data-dirs: ## write permission for web-app + # - .s \ No newline at end of file