# -*- mode: shell-script -*- OPENSEM_DIR="/opt/apps/opensem" OPENSEM_CODE="$SERVICE_CONFIGSTORE$OPENSEM_DIR" OPENSEM_RELEASE=1.0.0-rc.5 OPENSEM_URL=https://docker.0k.io/downloads/opensem-"${OPENSEM_RELEASE}".tar.xz OPENSEM_CONFIG_FILE="${OPENSEM_CODE}"/.env.prepare opensem:init() { current_version="" if [ -e "${OPENSEM_CODE}/.version" ]; then current_version="$(cat "${OPENSEM_CODE}/.version")" || return 1 fi ## Note: previous content will be removed, if not in `.git` and no ## version matching current one if ! [ -d "${OPENSEM_CODE}/.git" ]; then mkdir -p "${OPENSEM_CODE}" && cd "${OPENSEM_CODE}" && git init . && git config user.email "root@localhost" && git config user.name "Root" || { err "Couldn't create directory ${OPENSEM_CODE}, or init it with git." return 1 } fi ## Check if we need to upgrade code. if [ "$current_version" == "$OPENSEM_RELEASE" ]; then return 0 fi cd "${OPENSEM_CODE}" || return 1 if [ -d "$PWD"/.git ]; then rm -rf "${PWD:?}"/* "$PWD"/{.version,.env} || return 1 else err "Can't find the '.git' directory in ${OPENSEM_CODE}." return 1 fi curl -L "$OPENSEM_URL" | tar xJ || { err "Couldn't download $OPENSEM_URL." return 1 } sed -ri "s% __DIR__.'/../% '/opt/apps/$SERVICE_NAME/%g" public/index.php || { err "Couldn't patch public/index.php." return 1 } echo "$OPENSEM_RELEASE" > .version git add -A . || { err "'git add -A .' in '${OPENSEM_CODE}' failed." return 1 } if git diff --staged -s --exit-code; then info "No differences with last saved version." else git commit -m "Release $OPENSEM_RELEASE" || { err "'git commit' failed." return 1 } rm -rf "$SERVICE_DATASTORE/var/cache/opensem/"* fi } opensem:config() { APP_ENV=$(options-get app-env 2>/dev/null) || true APP_ENV=${APP_ENV:-production} cat < "${OPENSEM_CONFIG_FILE}" APP_NAME=OpenSEM APP_ENV=${APP_ENV} APP_KEY=base64:$(password:get app_key internal 32 base64) APP_DEBUG=false LOG_CHANNEL=stderr CACHE_DRIVER=array SESSION_DRIVER=file SESSION_LIFETIME=180 QUEUE_CONNECTION=sync CLOCKWORK_ENABLE=false XRAY_ENABLED=false DEBUGBAR_ENABLED=false QUERY_DETECTOR_ENABLED=false MICROSCOPE_ENABLED=false WKHTML_PDF_BINARY='"wkhtmltopdf"' WKHTML_IMG_BINARY='"wkhtmltoimage"' LIMIT_UUID_LENGTH_32=true AUTHENTICATION_LOG_NOTIFY=false REPORTING_API_ENABLED=false EOF service_def=$(get_compose_service_def "$SERVICE_NAME") || return 1 echo "Service def: '$service_def'" >&2 env=$(e "$service_def" | shyaml get-value -y options.env 2>/dev/null) || true echo "Env: '$env'" >&2 if [ -n "$env" ]; then e "$env" | opensem:config-merge || return 1 fi } artisan() { export COMPOSE_IGNORE_ORPHANS=true php_fpm_service=$(service:traverse "$SERVICE_NAME":php-fpm) || return 1 ## We don't want post deploy that is doing the final http initialization. compose --debug -q --no-init --no-post-deploy --no-pre-deploy \ --without-relation="$SERVICE_NAME":publish-dir \ run \ "${artisan_docker_run_opts[@]}" \ -T --rm -w /opt/apps/"$SERVICE_NAME" \ --entrypoint php \ -u www-data "$php_fpm_service" artisan "$@" | cat return "${PIPESTATUS[0]}" } dotenv:quote() { local val="$1" # Empty string → quoted so the emptiness is explicit if [[ -z "$val" ]]; then printf "''" return fi # Plain token (alnum + _ . - / @ :) doesn’t need quoting if [[ "$val" =~ ^[A-Za-z0-9_.:/@-]+$ ]]; then printf '%s' "$val" return fi # If it has no single quotes or newlines, prefer single quotes if [[ "$val" != *"'"* && "$val" != *$'\n'* && "$val" != *$'\r'* ]]; then printf "'%s'" "$val" return fi # Fallback: double quotes with escaped specials + newlines local escaped="$val" escaped=${escaped//\\/\\\\} escaped=${escaped//$'\n'/\\n} escaped=${escaped//$'\r'/\\r} escaped=${escaped//$'\t'/\\t} escaped=${escaped//\"/\\\"} escaped=${escaped//\$/\\$} escaped=${escaped//\`/\\\`} printf "\"%s\"" "$escaped" } ## Set or add a single key/value to .env opensem:config-set() { local key="$1" val="$2" ## sanity check on key: if ! [[ "$key" =~ ^[A-Z_]+$ ]]; then err "Invalid key name '$key', only [A-Z_] are allowed." return 1 fi val=$(dotenv:quote "$val") || return 1 ## modify or add in "$OPENSEM_CONFIG_FILE" if grep -qE "^[[:space:]]*$key=" "${OPENSEM_CONFIG_FILE}"; then sed -ri "s%^[[:space:]]*${key}=.*$%${key}=${val}%" "${OPENSEM_CONFIG_FILE}" || return 1 else echo "${key}=${val}" >> "${OPENSEM_CONFIG_FILE}" || return 1 fi } opensem:config-merge() { local key val type local sep= local prefix= if [ -n "$1" ]; then prefix="$(IFS="_"; echo "$*")_" fi while read-0 key type val; do ## sanity check on key: if ! [[ "$key" =~ ^[a-z-]+$ ]]; then err "Invalid key name '$key', only [a-z-] are allowed." return 1 fi case "${type##*\!}" in map|seq) e "$val" | opensem:config-merge "$@" "$key" || return 1 continue ;; bool) val="${val%$'\n'}" 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 ;; str|*) val="${val%$'\n'}" val="$(dotenv:quote "$val")" ;; esac key=${key//-/_} key=${key^^} key=${prefix^^}$key opensem:config-set "$key" "$val" || return 1 done < <( yq -0 'to_entries | map([.key, .value | type, .value | to_yaml])[] | .[]' ) }