From f2ff78fa86bd574dd0b3ebb6e00503ab32fdd4f7 Mon Sep 17 00:00:00 2001 From: philippe lhardy Date: Thu, 3 Jul 2025 17:21:28 +0200 Subject: [PATCH] ajout des script de creation de l'environnement de dev Nextcloud --- LISEZMOI.md | 29 +- README.md | 11 +- nextcloud_devenv/.gitignore | 18 + nextcloud_devenv/README.md | 16 + nextcloud_devenv/c/Makefile | 34 ++ nextcloud_devenv/c/README | 1 + nextcloud_devenv/devenv_params | 1 + nextcloud_devenv/enter_root.sh | 4 + nextcloud_devenv/enter_www_data.sh | 4 + nextcloud_devenv/init.sh | 101 +++++ nextcloud_devenv/lib/log_functions.sh | 90 ++++ nextcloud_devenv/lib/metascript.sh | 593 ++++++++++++++++++++++++++ nextcloud_devenv/run_occ.sh | 3 + nextcloud_devenv/runpodman.sh | 68 +++ nextcloud_devenv/setupdatabase.sh | 29 ++ nextcloud_devenv/setuppodman.sh | 10 + nextcloud_devenv/sync_polls.sh | 6 + 17 files changed, 1016 insertions(+), 2 deletions(-) create mode 100644 nextcloud_devenv/.gitignore create mode 100644 nextcloud_devenv/README.md create mode 100644 nextcloud_devenv/c/Makefile create mode 100644 nextcloud_devenv/c/README create mode 100644 nextcloud_devenv/devenv_params create mode 100755 nextcloud_devenv/enter_root.sh create mode 100755 nextcloud_devenv/enter_www_data.sh create mode 100755 nextcloud_devenv/init.sh create mode 100644 nextcloud_devenv/lib/log_functions.sh create mode 100644 nextcloud_devenv/lib/metascript.sh create mode 100755 nextcloud_devenv/run_occ.sh create mode 100755 nextcloud_devenv/runpodman.sh create mode 100755 nextcloud_devenv/setupdatabase.sh create mode 100755 nextcloud_devenv/setuppodman.sh create mode 100755 nextcloud_devenv/sync_polls.sh diff --git a/LISEZMOI.md b/LISEZMOI.md index 5073ebd..790f39c 100644 --- a/LISEZMOI.md +++ b/LISEZMOI.md @@ -1,9 +1,21 @@ +# Plomberie pour utiliser l'algorithme du Jugement majoritaire dans des application de sondages/votes + +Ce projet provient de https://www.astrolabe.coop/ pour l'ajout du jugement majoritaire dans l'application de sondage de Nextcloud : https://github.com/nextcloud/polls/issues/3472 . + +## Qu'est-ce que le jugement majoritaire ? + +https://fr.wikipedia.org/wiki/Jugement_majoritaire + # Libraire de calcul Jugement majoritaire ## Etude Une étude de l'existant est dans le répertoire étude. +Après cette recherche il est évident que les implémentations à choisir sont dans https://github.com/MieuxVoter + +## Préparation + Ce projet est plutot un jouet comparé à l'existant. L'idée ici serait d'avoir une API commune ou à minima des formats d'échanges communs. @@ -125,4 +137,19 @@ python3 convert_nextcloud_poll_csv.py ../samples/poll1.csv 'Très Bien' 'Bien' ' ## Tests -Voir le README.md en anglais \ No newline at end of file +Voir le README.md en anglais + +# Applications de vote / sondages + +|Nextcloud polls|https://github.com/nextcloud/polls| +|framadate|https://framagit.org/framasoft/framadate| + +## Nextcloud Polls + +https://github.com/nextcloud/polls + +## Framadate ? + +ex: https://framadate.org + +https://framagit.org/framasoft/framadate \ No newline at end of file diff --git a/README.md b/README.md index 3a970c3..ca36e1c 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,16 @@ -# Library to deliver a poll result with majority judgement algorithm +# Glue to use majortiy judgement algorithm in various polls applications + +Intial trigger of this project is implementation of this in Nextcloud poll app https://github.com/nextcloud/polls/issues/3472, project pushed by https://www.astrolabe.coop/ + +## What is majortiy judgement algorithm ? https://en.wikipedia.org/wiki/Majority_judgment +# Library to deliver a poll result with majority judgement algorithm + +After some research most of implementation is done in https://github.com/MieuxVoter + + Sorry for inconvenience but currently only french version is available. LISEZMOI.md diff --git a/nextcloud_devenv/.gitignore b/nextcloud_devenv/.gitignore new file mode 100644 index 0000000..15c61b9 --- /dev/null +++ b/nextcloud_devenv/.gitignore @@ -0,0 +1,18 @@ +/home/plhardy/artisanlogiciel/code/artlog_toolbox +4create.makefile +4java.makefile +absant.sh +antify.sh +debianize.sh +doit.sh +eclipse_env.sh +generate_new.sh +locate_artlog_toolbox.sh +printclonesdep.sh +pythonize.sh +refresh_toolbox.sh +scrumify.sh +status.sh +test.txt +/bind_folder/ +/snapshots/ \ No newline at end of file diff --git a/nextcloud_devenv/README.md b/nextcloud_devenv/README.md new file mode 100644 index 0000000..cbb3231 --- /dev/null +++ b/nextcloud_devenv/README.md @@ -0,0 +1,16 @@ +# Nextcloud Dev En + +Create a dev env for nextcloud + +setup databse : + +./setupdatabase.sh + +# not completed, done manualy +# ./setuppodman.sh +# comment out VOLUME var/www/html in 31/apache/Dockerfile +# cd podman; ./update.sh; cd 31/apache; podman build . + +./runpodman.sh + +./doit.sh diff --git a/nextcloud_devenv/c/Makefile b/nextcloud_devenv/c/Makefile new file mode 100644 index 0000000..0ae1b0f --- /dev/null +++ b/nextcloud_devenv/c/Makefile @@ -0,0 +1,34 @@ + +CC=gcc +LD=gcc +CPPFLAGS=-g + +BUILD=build + +src=main.c + +objects=$(patsubst %.c,$(BUILD)/obj/%.o,$(src)) + +$(objects): | $(BUILD)/obj + +test:$(BUILD)/binary + mkdir -p $@ + ./$(BUILD)/binary test.binary >test/parse1.binary + ./$(BUILD)/binary parse1.binary >test/parse2.binary + diff test/parse1.binary test/parse2.binary + +$(BUILD)/binary: $(objects) + @echo link objects $(objects) + $(LD) $(LDFLAGS) $^ -o $@ + +$(BUILD)/obj: + mkdir -p $@ + +$(BUILD)/obj/%.o: %.c + @echo compile $< + @$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@ + +clean: + rm -f $(objects) + +.PHONY:clean test diff --git a/nextcloud_devenv/c/README b/nextcloud_devenv/c/README new file mode 100644 index 0000000..f13ebb6 --- /dev/null +++ b/nextcloud_devenv/c/README @@ -0,0 +1 @@ +source placeholder for nextcloud_devenv in c autogenerated by ./create_project.sh lun. 30 juin 2025 15:08:14 CEST diff --git a/nextcloud_devenv/devenv_params b/nextcloud_devenv/devenv_params new file mode 100644 index 0000000..da28778 --- /dev/null +++ b/nextcloud_devenv/devenv_params @@ -0,0 +1 @@ +NOJAVA='c only' diff --git a/nextcloud_devenv/enter_root.sh b/nextcloud_devenv/enter_root.sh new file mode 100755 index 0000000..5f429e0 --- /dev/null +++ b/nextcloud_devenv/enter_root.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +podman exec -it nextcloud_local /bin/bash + diff --git a/nextcloud_devenv/enter_www_data.sh b/nextcloud_devenv/enter_www_data.sh new file mode 100755 index 0000000..9d9d985 --- /dev/null +++ b/nextcloud_devenv/enter_www_data.sh @@ -0,0 +1,4 @@ +#!/bin/bash + +podman exec -u www-data -it nextcloud_local /bin/bash + diff --git a/nextcloud_devenv/init.sh b/nextcloud_devenv/init.sh new file mode 100755 index 0000000..195e9b6 --- /dev/null +++ b/nextcloud_devenv/init.sh @@ -0,0 +1,101 @@ +#!/bin/bash + +# search ARTLOG_TOOLBOX= within $toolboxparam file, no bash expansion is done. +extract_from_toolbox_param() +{ + local toolboxparam=$1 + if [[ -f $toolboxparam ]] + then + echo "extract from $toolboxparam" >&2 + while read LINE + do + if [[ $LINE =~ ARTLOG_TOOLBOX=(.*) ]] + then + ARTLOG_TOOLBOX=${BASH_REMATCH[1]} + fi + done <$toolboxparam + fi +} + +select_artlog_toolbox() +{ + directory_name=${1:-artlog_toolbox} + potential_path=($(find .. -type d -name "$directory_name")) + + # default to this. + ARTLOG_TOOLBOX=$(pwd) + + toolboxparam=./toolbox.param + + extract_from_toolbox_param "$toolboxparam" + + echo "Current toolbox : $ARTLOG_TOOLBOX" + + potential_number=${#potential_path[@]} + if (( $potential_number > 0 )) + then + for (( i=0; i<$potential_number; i++ )) + do + echo "$(( i + 1)) ${potential_path[$i]}" + done + echo "which one would you like to use (select number 1 to $potential_number) all other for current ?" + read a + if [[ -z $a ]] + then + a=0 + fi + if (( $a > 0 )) + then + ARTLOG_TOOLBOX=$(readlink -f ${potential_path[$(( a - 1))]}) + fi + echo "$ARTLOG_TOOLBOX" + else + echo "[INFO] No directory $directory_name name found" + fi +} + + +if [[ $0 =~ locate_artlog_toolbox.sh ]] +then + echo "[WARNING] function tool $0 used as main" >&2 + if [[ $# > 0 ]] + then + echo "$0 called with with param $1" >&2 + select_artlog_toolbox $1 + else + extract_from_toolbox_param ./toolbox.param + if [[ -n $ARTLOG_TOOLBOX ]] + then + echo "$ARTLOG_TOOLBOX" + else + echo "no ARTLOG_TOOLBOX set" >&2 + fi + fi + exit 0 +fi + +# AFTER function copied from /home/plhardy/artisanlogiciel/code/artlog_toolbox/scripts/locate_artlog_toolbox.sh + +if [[ -z $ARTLOG_TOOLBOX ]] +then + ARTLOG_TOOLBOX=$(pwd)/artlog_toolbox + select_artlog_toolbox artlog_toolbox + echo "no ARTLOG_TOOLBOX found, use a dedicated one $ARTLOG_TOOLBOX" +fi + + +if [[ ! -d $ARTLOG_TOOLBOX ]] +then + git clone git@github.com:artlog/artlog_toolbox $ARTLOG_TOOLBOX + if [[ -d $ARTLOG_TOOLBOX ]] + then + pushd $ARTLOG_TOOLBOX + git checkout master + popd + else + echo "[ERROR] git creation of $ARTLOG_TOOLBOX failed" >&2 + exit 1 + fi +fi +echo "ARTLOG_TOOLBOX=$ARTLOG_TOOLBOX" >toolbox.param +$ARTLOG_TOOLBOX/deploy.sh copy diff --git a/nextcloud_devenv/lib/log_functions.sh b/nextcloud_devenv/lib/log_functions.sh new file mode 100644 index 0000000..399b1ad --- /dev/null +++ b/nextcloud_devenv/lib/log_functions.sh @@ -0,0 +1,90 @@ +# SHOULD BE INCLUDED WITH source or . from a bash script + +# EXAMPLE +# log_functions=./log_functions.sh +# [[ -f $log_functions ]] || { echo "[FATAL] Missing $log_functions" >&2 ; exit 1 ;} +# source $log_functions + +log_any() +{ + priority=$1 + shift + echo "[$priority] $@" >&2 +} + +log_fatal() +{ + log_any FATAL "$*" +} + +log_error() +{ + log_any ERROR "$*" +} + +log_warn() +{ + log_any WARN "$*" +} + +log_info() +{ + log_any INFO "$*" +} + +log_debug() +{ + [[ -n $debug ]] && log_any DEBUG "$*" +} + + +deferpipe() +{ + cat + echo "# | $@" +} + +autoquoteargs() +{ + echo -n "$1" + shift + while [[ $# > 0 ]] + do + if [[ "$1" =~ [\ \$] ]] + then + echo -n " '$1'" + else + echo -n " $1" + fi + shift + done + echo +} + +echoarray() +{ + declare -a arr=("${@}") + declare -i len=${#arr[@]} + # Show passed array + for ((n = 0; n < len; n++)) + do + echo -en " \"${arr[$n]}\"" + done + echo +} + +include_source() +{ + if [[ -f $1 ]] + then + source $1 + else + log_fatal "Missing $1 script" + exit 1 + fi +} + +verbose() +{ + [[ -n $verbose ]] && log_any $verbose $@ +} diff --git a/nextcloud_devenv/lib/metascript.sh b/nextcloud_devenv/lib/metascript.sh new file mode 100644 index 0000000..945030c --- /dev/null +++ b/nextcloud_devenv/lib/metascript.sh @@ -0,0 +1,593 @@ +#!/bin/bash + +# metascript to include +# +# usual way if no parameters used by outer script : +# +# source $(dirname "$0")/metascript.sh +# +# defaultmetainit $@ +# + +metascript_included=yes + +# assume all tools are in lib/ +toolsdir=$(dirname $(readlink -f $0))/lib +# all tools resources are relative to this directory + +# project directory +# relative +# toolsparentdir=$(realpath --relative-to "$(pwd)" $(readlink -f $0))/ +# absolute +toolsparentdir=$(realpath $(readlink -f $0))/ + +if [[ -z $log_functions ]] +then + log_functions=$toolsdir/log_functions.sh + [[ -f $log_functions ]] || { echo "[FATAL] Missing $log_functions" >&2 ; exit 1 ;} + source $log_functions +fi + +metascript_usage() +{ + cat <&2 +metascript commands : + +help|usage help or usage of this {$0} tool +dryrun|show|showdoc display what should/will be done + +defersource= script file defining defer() non sandard function +defer= defer function to use, default is showdoc +toolsresourcesdir= where to pick resource + default to parent of script $toolsresourcesdir + mostly used with dryrun +apply default : will actual do work without defer +EOF +} + +usage() +{ + echo "[WARNING} no specific usage function for {$0}, to improve by developer" >&2 + echo >&2 + metascript_usage +} + +showinfo() +{ + echo $@ +} + +showdoc() +{ + if [[ $1 =~ ^tools/ ]] + then + # assumes it handles ENV_METASCRIPT_DEFER + $@ + else + echo '```' + autoquoteargs $@ + echo + echo '```' + fi +} + +redirectto() +{ + tofile=$1 + if [[ -n $defer ]] + then + echo "Copy to $tofile" + echo '```' + cat + echo '```' + else + cat > $tofile + fi +} + +execredirectfrom() +{ + tofile=$1 + shift + if [[ -n $defer ]] + then + echo '```' + autoquoteargs $@ + echo ' < '"$tofile" + echo '```' + else + $@ < $tofile + fi +} + +execredirectto() +{ + tofile=$1 + shift + if [[ -n $defer ]] + then + echo '```' + autoquoteargs $@ + echo ' > '"$tofile" + echo '```' + else + $@ > $tofile + fi +} + +pipeto() +{ + if [[ -n $defer ]] + then + echo '```' + echo -n 'cat << EOF| ' + autoquoteargs $@ + echo + cat + echo "EOF" + echo '```' + else + cat | $@ + fi +} + + +query_ext() +{ + local prompt="$1" + local var=$2 + + if [[ -n $defer ]] + then + # uppercase it + eval $var=${var^^} + $defer query $prompt "$(eval echo \$$var)" + else + echo -ne $prompt + read $var + fi +} + +# two arguments first prompt, second name of var +query_password() +{ + local prompt="$1" + local var=$2 + + if [[ -n $defer ]] + then + # uppercase it + eval $var=${var^^} + $defer query_password "\"$prompt\"" "$(eval echo \$$var)" + else + read -sp "$prompt" $var + echo + fi +} + +# echo yes if reply match ^[Yy]([eE][sS]|)$ or no if does not match. +query_yesno() +{ + local prompt="$1" + local yesno=no + + read -p "$prompt (Yes/No) " yesno + + if [[ $yesno =~ ^[Yy]([eE][sS]|)$ ]] + then + echo yes + else + echo no + fi +} + + +# through hardcoded 'secret' variable +create_secret() +{ + # global secret + # declare -g secret + # export -n secret + + local -i length=$1 + + [[ -z $length ]] && length = 32 + + if (( length < 8 )) + then + log_warn "secret length $length < 8. very small" + fi + # secret=$(echo $RANDOM | md5sum | head -c $length) + secret=$(tr -dc A-Za-z0-9 &2 + from=${from//$s/\\$s} + fi + if [[ $from =~ \[ ]] + then + from=${from//\[/\\\[} + fi + if [[ $from =~ \* ]] + then + from=${from//\*/\\\*} + fi + if [[ $from =~ ^(.*)\$$ ]] + then + from=${BASH_REMATCH[1]}'\$' + fi + if [[ $from =~ ^\^(.*)$ ]] + then + from='\^'${BASH_REMATCH[1]} + fi + + if [[ $to =~ [\\] ]] + then +# escape char \ should be doubled + to=${to//\\/\\\\} + fi + if [[ $to =~ $s ]] + then +# echo "[ERROR] character $s is prohibited due to sed usage" >&2 +# echo "This is a limitation of metascript.sh script, replaced by \$s" >&2 + to=${to//$s/\\$s} + fi + if [[ $to =~ [\&] ]] + then +# echo "[ERROR] character & is prohibited due to sed usage" >&2 + to=${to//\&/\\\&} + fi + + # replace it globaly + echo "s$s$from$s$to${s}g" + +} + +sedreplacefromto() +{ + local from="$1" + local to="$2" + shift 2 + local sedexpr="$1" + execredirectto $to sed "$sedexpr" $from + shift + while [[ $# > 0 ]] + do + sedexpr="$1" + $defer sed -i "$sedexpr" $to + shift + done + +} + +replacefromto() +{ + local from="$1" + local to="$2" + shift 2 + if [[ -n $defer ]] + then + $defer "replace $@ from '$from' into '$to'" + else + local sedexpr=$(sed_substitute_expr "$1" "$2") + execredirectto $to sed "$sedexpr" $from + shift 2 + while [[ $# > 0 ]] + do + sedexpr=$(sed_substitute_expr "$1" "$2") + $defer sed -i "$sedexpr" $to + shift 2 + done + fi + +} + +sedreplacein() +{ + local file=$1 + shift + while [[ $# > 0 ]] + do + $defer sed -i "$1" $file + shift + done +} + +replacein() +{ + local infile=$1 + shift + if [[ -n $defer ]] + then + $defer "replace $@ into '$infile'" + else + while [[ $# > 0 ]] + do + sedexpr=$(sed_substitute_expr "$1" "$2") + $defer sed -i "$sedexpr" $infile + shift 2 + done + fi +} + +parsemetaarg() +{ + case $1 in + apply) + defer= + ;; + defersource=*) + defersource=${1/defersource=/} + ;; + defer=*) + defer=${1/defer=/} + ;; + dryrun|show|showdoc) + defer=showdoc + ;; + help|usage) + usage + ;; + toolsresourcesdir=*) + toolsresourcesdir=${1/toolsresourcesdir=/} + ;; + scl_enable=*) + scl_args=(scl enable ${1/scl_enable=/} --) + ;; + *) + log_error "unrecognized argument '$1'" + usage + exit 1 + ;; + esac +} + +enforcearg() +{ + local var="$1" + local default="$2" + eval value='$'"$var" + + if [[ -z $value ]] + then + log_error "{0} expect '$var' to be set ex $var=$default" + usage + exit 1 + fi +} + +enforcefile() +{ + file="$1" + constraint="$2" + + if [[ ! -f "$file" ]] + then + if [[ $constraint = exists ]] + then + log_error "[ERROR] Missing expected $file" + [[ -n $defer ]] || exit 1 + fi + else + if [[ $constraint = does_not_exists ]] + then + log_error "[ERROR] '$file' already exists. Move it away" + [[ -n $defer ]] || exit 1 + fi + fi +} + +enforcedir() +{ + dir="$1" + constraint="$2" + + if [[ $constraint = does_not_exist ]] + then + if [[ -e $dir ]] + then + log_error "'$dir' already exists. Move it away" + [[ -n $defer ]] || exit 1 + fi + fi + + if [[ $constraint = exists ]] + then + if [[ ! -d "$dir" ]] + then + if [[ -e "$dir" ]] + then + log_error "'$dir' already exists but is not a directory as expected" + [[ -n $defer ]] || exit 1 + fi + log_error "[ERROR] Missing expected directory '$dir'" + [[ -n $defer ]] || exit 1 + fi + + fi + +} + +applymetaargs() +{ + if [[ -n $defer ]] + then + if [[ -n $defersource ]] + then + if [[ -f $defersource ]] + then + log_any "source $defersource" + source $defersource + else + exit_fatal "defersource $defersource provided but not a file" + fi + fi + # $showinfo "generated with $0 $allparms" + export ENV_METASCRIPT_DEFER="$defer" + export ENV_METASCRIPT_RESOURCESDIR="$toolsresourcesdir" + fi +} + +defaultmetainit() +{ + while [[ $# > 0 ]] + do + parsemetaarg "$1" + shift + done + + applymetaargs +} + +read_organisation() +{ + organisation_file=$(find organisation -name '*.conf') + if [[ -f $organisation_file ]] + then + while read line + do + case $line in + name=*) + organisation_name=${line/name=/} + ;; + domain=*) + organisation_domain=${line/domain=/} + ;; + ldap_base=*) + organisation_ldap_base=${line/ldap_base=/} + ;; + image_keyword=*) + organisation_image_keyword=${line/image_keyword=/} + ;; + *) + log_warn "'$line' not recognized as an organisation parameter" + ;; + esac + done < $organisation_file + fi +} + +check_variable_match() +{ + local var="$1" + local match="$2" + local default="$3" + local value="" + + eval value='$'"$var" + + if [[ -z "$value" ]] + then + echo "set $var to default value $default" + eval "$var=$default" + eval value='$'"$var" + fi + + if [[ ! $value =~ $match ]] + then + log_error "$var $value should match $match" + exit 1 + fi + +} + +check_variable_in() +{ + local var="$1" + local default="$2" + shift 2 + + local value="" + local values=$@ + + eval value='$'"$var" + + if [[ -z "$value" ]] + then + echo "set $var to default value $default" + eval "$var=$default" + eval value='$'"$var" + fi + + while [[ $# > 0 ]] + do + if [[ "$value" = "$1" ]] + then + return + fi + shift + done + + log_error "'$var' should be within $values it is '$value'" + exit 1 +} + +check_root() +{ + if [[ -n $defer ]] + then + $defer "{$0} script to run run as root or with sudo" + else + [[ $EUID -eq 0 ]] || { + log_error "{$0} You have to be root or use sudo to run this script" + exit 1; + } + fi +} + +get_timestamp_second() +{ + echo "$(date +"%Y%m%d%H%M%S")" +} + +if [[ -z $ENV_METASCRIPT_RESOURCESDIR ]] +then + toolsresourcesdir=$toolsparentdir +else + toolsresourcesdir=$ENV_METASCRIPT_RESOURCESDIR +fi + +# quick way to give scl patches to fill scl_arg array +if [[ -f $toolsparentdir/.scl_env ]] +then + source $toolsparentdir/.scl_env +fi + +# empty defer means doit +defer=$ENV_METASCRIPT_DEFER + +showinfo=showinfo + +allparms=$@ + +applymetaargs=applymetaargs diff --git a/nextcloud_devenv/run_occ.sh b/nextcloud_devenv/run_occ.sh new file mode 100755 index 0000000..2599ad8 --- /dev/null +++ b/nextcloud_devenv/run_occ.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +podman exec -u www-data -it nextcloud_local ./occ $@ diff --git a/nextcloud_devenv/runpodman.sh b/nextcloud_devenv/runpodman.sh new file mode 100755 index 0000000..cf90cec --- /dev/null +++ b/nextcloud_devenv/runpodman.sh @@ -0,0 +1,68 @@ +#!/bin/bash + +source lib/metascript.sh + +enforcedir polls exists + +defaultmetainit $@ + +podman=podman +nextcloud_image=nextcloud_local +# same name than image +container_name=$nextcloud_image + +rel_bind_folder=bind_folder +bind_folder=$(pwd)/$rel_bind_folder + +declare -a podman_args + +podman_args+=(-p 127.0.0.1:8080:80 --name=$container_name) + +# container 33 www-data => current user. +current_uid=$(id -u) +current_gid=$(id -g) +container_www_data_uid=33 +container_www_data_gid=33 +first_subuid=100000 +first_subgid=100000 +mapped_root_uid=$(( first_subuid + container_www_data_uid - 1 )) +range_1=$(( container_www_data_uid - 1 )) + +# does not work idmap requires CAP_SYS_ADMIN permission not set for standard user +# www_data_idmap=",idmap=uids=0-${mapped_root_uid}-1#1-${first_subuid}-${range_1}#${container_www_data_uid}-${current_uid}-1#34-100033-2000;gids=0-${mapped_root_uid}-1#1-${first_subgid}-${range_1}#${container_www_data_gid}-${current_gid}-1#34-100033-2000" + +# no theme yet +for dir in nextcloud custom_apps config data +do + folder=${bind_folder}/$dir + if [[ ! -f $folder ]] + then + mkdir -p $folder + fi + idmap="" + if [[ $dir == nextcloud ]] + then + target=/var/www/html + else + target=/var/www/html/$dir + if [[ $dir == custom_apps ]] + then + # current user will map to www-data for this binding + idmap="$www_data_idmap" + fi + fi + podman_args+=(--mount type=bind,source=${folder},target=${target}${idmap}) +done + +# with root ... +podman_args+=(--mount type=bind,source=$(pwd)/polls,target=/root/polls) + +if [[ -n $detach ]] +then + podman_args+=(-d) +fi + + +echo "run podman with args ${podman_args[@]}" + +$defer $podman run "${podman_args[@]}" $nextcloud_image diff --git a/nextcloud_devenv/setupdatabase.sh b/nextcloud_devenv/setupdatabase.sh new file mode 100755 index 0000000..442a35f --- /dev/null +++ b/nextcloud_devenv/setupdatabase.sh @@ -0,0 +1,29 @@ +#!/bin/bash + +source lib/metascript.sh + +log_info "assume postgres is already installed localy" + +log_info "https://docs.nextcloud.com/server/latest/admin_manual/configuration_database/linux_database_configuration.html#requirements" + +query_password "database password :" password + +if [[ -z $password ]] +then + log_error "Missing password" + exit 1 +fi + +database_name=nextcloud_dev +username=nextcloud_dev + +{ +cat <