Stéphan Sainléger
2 years ago
3 changed files with 186 additions and 0 deletions
@ -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" |
||||
|
|
@ -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" |
||||
|
} |
@ -0,0 +1,22 @@ |
|||||
|
description: "Element Web" |
||||
|
maintainer: "Stéphan Sainléger <stephan.sainleger@elabore.coop>" |
||||
|
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 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue