diff --git a/recipes/odoo/crud.sh b/recipes/odoo/crud.sh new file mode 100755 index 0000000..9c3b506 --- /dev/null +++ b/recipes/odoo/crud.sh @@ -0,0 +1,214 @@ +#!/bin/bash + +function check_database_exists() { + db-psql list | grep -q "$longname" +} + +function check_port_used() { + # shellcheck disable=SC2034 + usedport=$(lxc exec "$container" -- bash -c "grep xmlrpc_port /etc/odoo/$shortname.conf | cut -d' ' -f3") + [[ "$usedport" == "$port" ]] +} + +function check_service_running() { + lxc exec "$container" -- bash -c "systemctl is-active --quiet ${longname}.service" +} + +function _read() { + disable_trace + check_database_exists + check_container "$container" + check_port_used + check_service_running + enable_trace + return 0 +} + +function _create() { + + echo "creating templates ... " + mkdir -p "$MIAOU_CONFIGDIR/apps/odoo" + + longport=$((port + 1000)) + APP_PORT=$port LONG_PORT=$longport APP_NAME=$shortname tera -e -t "$MIAOU_BASEDIR/templates/apps/odoo/odoo.conf.j2" -o "$MIAOU_CONFIGDIR/apps/odoo/$shortname.conf" "$MIAOU_CONFIGDIR/miaou.expanded.yaml" >/dev/null + APP_NAME=$shortname tera -t "$MIAOU_BASEDIR/templates/apps/odoo/odoo.service.j2" --env-only -o "$MIAOU_CONFIGDIR/apps/odoo/$longname.service" >/dev/null + echo "creating templates ... OK" + + echo "copying files to container <$container> ... " + lxc file push --uid 0 --gid 0 "$MIAOU_CONFIGDIR/apps/odoo/$shortname.conf" "$container/etc/odoo/$shortname.conf" + lxc file push --uid 0 --gid 0 "$MIAOU_CONFIGDIR/apps/odoo/$longname.service" "$container/etc/systemd/system/$longname.service" + echo "copying files to container <$container> ... OK" + + echo "create data folder for $shortname" + cat < ... " + db-psql create "$longname" + echo "create empty database <$longname> ... OK" + + admin_username=$(echo -e "$data" | yq '.admin.username') + [[ $admin_username = 'null' ]] && echoerr "odoo recipe requires \`data:admin:username\` into miaou.yaml service definition of <$fqdn>" && exit 1 + + admin_password=$(echo -e "$data" | yq '.admin.password') + [[ $admin_password = 'null' ]] && echoerr "odoo recipe requires \`data:admin:password\` into miaou.yaml service definition of <$fqdn>" && exit 1 + + cat <" + exit 1 + ;; + esac +done + +[[ + "$action" != unset && + "$port" != unset && + "$fqdn" != unset && + "$container" != unset && + "$shortname" != unset && + "$data" != unset ]] || usage + +. "$MIAOU_BASEDIR/lib/init.sh" + +$action diff --git a/recipes/odoo/install.sh b/recipes/odoo/install.sh new file mode 100755 index 0000000..eb443f7 --- /dev/null +++ b/recipes/odoo/install.sh @@ -0,0 +1,124 @@ +#!/bin/bash + +readonly EXPANDED_CONF="$MIAOU_CONFIGDIR/miaou.expanded.yaml" +readonly ODOO_DIR="/home/odoo/odoo" + +readonly WKHTML_VERSION="0.12.6.1-3" +readonly WKHTML_RELEASE="$WKHTML_VERSION.bookworm_amd64" + +function check_user_odoo() { + (lxc exec "$CONTAINER" -- id odoo &>/dev/null) || return 12 + return 0 +} + +function check_target_bgcolor() { + (lxc exec "$CONTAINER" -- grep -Pq "^\\\$o-community-color: $BACKGROUND_COLOR" "$ODOO_DIR/addons/web/static/src/legacy/scss/primary_variables.scss") || return 13 + return 0 +} + +function check_file_odoo-addon-install() { + (lxc exec "$CONTAINER" -- test -f /home/odoo/odoo/odoo-addon-install) || return 23 + return 0 +} + +function check() { + PREFIX="recipe:odoo:check" + check_user_odoo || return 21 + check_target_bgcolor || return 22 + check_file_odoo-addon-install || return 23 +} + +function install() { + PREFIX="recipe:odoo:install" + : $PREFIX + launch_container "$CONTAINER" + echo "initializing Odoo ... " + + lxc exec "$CONTAINER" -- bash <" + useradd -ms /bin/bash odoo + else + echo "user already set!" + fi + + echo "install odoo in odoo userspace" + cat < added!" +EOF +} + +function compute_bgcolor_target() { + target=$(yq '.target' "$EXPANDED_CONF") + case "$target" in + dev) builtin echo "#17a2b8" ;; + beta) builtin echo "#79A70A" ;; + prod) builtin echo "#7C7BAD" ;; + *) echoerr "unknown target <$target>" && exit 10 ;; + esac +} + +### MAIN + +. "$MIAOU_BASEDIR/lib/init.sh" +arg1_required "$@" +readonly CONTAINER="$1" +BACKGROUND_COLOR=$(compute_bgcolor_target) +readonly BACKGROUND_COLOR + +check || ( + install + check +) diff --git a/templates/apps/odoo/odoo-addon-install b/templates/apps/odoo/odoo-addon-install new file mode 100644 index 0000000..3c366c9 --- /dev/null +++ b/templates/apps/odoo/odoo-addon-install @@ -0,0 +1,33 @@ +#!/bin/bash + +CLIENT=$1 +ADDON=$2 + +function usage() { + echo 'usage: ' + exit 100 +} + +# VERIFICATION + +[[ -z "$CLIENT" || -z "$ADDON" ]] && usage +[[ ! -d "/home/odoo/data-${CLIENT}" ]] && echo "unknown CLIENT <${CLIENT}>, should exist in folder /home/odoo/data-..." && exit 2 + +URL="https://pypi.org/project/odoo-addon-${ADDON}/" +curl --output /dev/null --silent --head --fail "${URL}" +[[ $? -ne 0 ]] && echo "unknown ADDON <${ADDON}>, should be downloadable from: ${URL}" && exit 3 + +[[ -d "/home/odoo/data-${CLIENT}/addons/18.0/${ADDON}" ]] && echo "ADDON <${ADDON}> already exists, consider removing manually!" && exit 4 + +# ACTION + +package=$(curl -Ls "$URL" | rg '' -r '$1') +wget $package -O /tmp/package.zip +rm /tmp/ADDON -rf && mkdir /tmp/ADDON +unzip /tmp/package.zip 'odoo/addons/*' -d /tmp/ADDON/ +real_name=$(unzip -l /tmp/package.zip | head -n4 | tail -n1 | cut -d'/' -f3) +chown -R odoo:odoo /tmp/ADDON/ +mv /tmp/ADDON/odoo/addons/* "/home/odoo/data-$CLIENT/addons/18.0/" + +# ADD +su odoo -c "python3.10 /home/odoo/odoo/odoo-bin -c /etc/odoo/$CLIENT.conf -i $real_name -d odoo-$CLIENT --worker=0 --stop-after-init" diff --git a/templates/apps/odoo/odoo.conf.j2 b/templates/apps/odoo/odoo.conf.j2 new file mode 100644 index 0000000..b962302 --- /dev/null +++ b/templates/apps/odoo/odoo.conf.j2 @@ -0,0 +1,17 @@ +[options] +data_dir = /home/odoo/data-{{ APP_NAME }} + +xmlrpc_port = {{ APP_PORT }} +longpolling_port = {{ LONG_PORT }} + +db_host = ct1.lxd +db_name = odoo-{{ APP_NAME }} +db_user = odoo-{{ APP_NAME }} +db_password = odoo-{{ APP_NAME }} +list_db = {{ target != 'prod'}} + +workers = 2 +db_maxconn = 10 +db_filter = .* +syslog = True +proxy_mode = True \ No newline at end of file diff --git a/templates/apps/odoo/odoo.service.j2 b/templates/apps/odoo/odoo.service.j2 new file mode 100644 index 0000000..78a48ff --- /dev/null +++ b/templates/apps/odoo/odoo.service.j2 @@ -0,0 +1,14 @@ +[Unit] +Description=Odoo {{ APP_NAME }} +After=network.target + +[Service] +Type=simple +SyslogIdentifier=odoo-{{ APP_NAME }} +PermissionsStartOnly=true +User=odoo +Group=odoo +ExecStart=python3.10 /home/odoo/odoo/odoo-bin -c /etc/odoo/{{ APP_NAME }}.conf + +[Install] +WantedBy=multi-user.target \ No newline at end of file