init
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
#!/bin/bash
|
||||
|
||||
|
||||
dump_config (){
|
||||
echo "========== Odoo Container Configuration =========="
|
||||
echo "UUID: $UUID"
|
||||
echo "BRANCH: $BRANCH"
|
||||
echo "STAGING: $STAGING"
|
||||
echo
|
||||
echo "PostgreSQL Host: $POSTGRES_HOST"
|
||||
echo "PostgreSQL Port: $POSTGRES_PORT"
|
||||
echo "PostgreSQL Admin: $POSTGRES_ADMIN_USER / $POSTGRES_ADMIN_PASSWORD"
|
||||
echo "ODOO DB User: $ODOO_DB_USER"
|
||||
echo "ODOO DB Password: $ODOO_DB_PASSWORD"
|
||||
echo
|
||||
echo "BASEURL: $BASEURL"
|
||||
echo "DATA_DIR: $DATA_DIR"
|
||||
echo "CUSTOM_DIR: $CUSTOM_DIR"
|
||||
echo "ENTERPRISE_DIR: $ENTERPRISE_DIR"
|
||||
echo "LOGS_DIR: $LOGS_DIR"
|
||||
echo "CONFIG_DIR: $CONFIG_DIR"
|
||||
echo "CC_DIR: $CC_DIR"
|
||||
echo "BACKUP_DIR: $BACKUP_DIR"
|
||||
echo "GIT_DIR: $GIT_DIR"
|
||||
echo "ETC_DIR: $ETC_DIR"
|
||||
echo "INSTALL_DIR: $INSTALL_DIR"
|
||||
echo "SSH_DIR: $SSH_DIR"
|
||||
echo "HUGO_DIR: $HUGO_DIR"
|
||||
echo
|
||||
echo "SERVER_IP: $SERVER_IP"
|
||||
echo "=================================================="
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Function: Create PostgreSQL user
|
||||
# -----------------------------
|
||||
|
||||
check_and_create_db() {
|
||||
echo "check and create"
|
||||
echo "Connecting as $POSTGRES_ADMIN_USER to $POSTGRES_HOST:$POSTGRES_PORT"
|
||||
|
||||
# -----------------------------
|
||||
# Check if user exists
|
||||
# -----------------------------
|
||||
USER_EXISTS=$(PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -tAc "SELECT 1 FROM pg_roles WHERE rolname='$ODOO_DB_USER';" | grep -q 1 && echo "yes" || echo "no")
|
||||
if [ "$USER_EXISTS" = "no" ]; then
|
||||
echo "Creating PostgreSQL user $ODOO_DB_USER..."
|
||||
PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -c "CREATE USER \"$ODOO_DB_USER\" WITH PASSWORD '$ODOO_DB_PASSWORD';"
|
||||
fi
|
||||
|
||||
# -----------------------------
|
||||
# Check if database exists
|
||||
# -----------------------------
|
||||
DB_EXISTS=$(PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres -tAc "SELECT 1 FROM pg_database WHERE datname='$UUID';" | grep -q 1 && echo "yes" || echo "no")
|
||||
|
||||
if [ "$DB_EXISTS" = "no" ]; then
|
||||
/4server/sbin/ODOO_19/restore $UUID default.zip
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Function: Check DNS and build Traefik labels
|
||||
# -----------------------------
|
||||
check_domains() {
|
||||
local domains="$1"
|
||||
local server_ip="$2"
|
||||
|
||||
echo "Checking DNS resolution for domains: $domains"
|
||||
local filtered_domains=""
|
||||
for domain in $domains; do
|
||||
ns_ip=$(nslookup "$domain" 2>/dev/null | grep -Eo 'Address: ([0-9]{1,3}\.){3}[0-9]{1,3}' | awk '{print $2}' | tail -n1)
|
||||
if [[ "$ns_ip" == "$server_ip" ]]; then
|
||||
filtered_domains+=" $domain"
|
||||
fi
|
||||
done
|
||||
filtered_domains=$(echo "$filtered_domains" | xargs)
|
||||
|
||||
DOMAIN_LABEL=""
|
||||
for domain in $filtered_domains; do
|
||||
if [ -z "$DOMAIN_LABEL" ]; then
|
||||
DOMAIN_LABEL="traefik.http.routers.$UUID.rule=Host(\`$domain\`)"
|
||||
else
|
||||
DOMAIN_LABEL+=" || Host(\`$domain\`)"
|
||||
fi
|
||||
done
|
||||
echo "$DOMAIN_LABEL"
|
||||
}
|
||||
Executable
+3
@@ -0,0 +1,3 @@
|
||||
#!/bin/bash
|
||||
|
||||
/4server/sbin/ODOO_19/listModules $1
|
||||
Executable
+47
@@ -0,0 +1,47 @@
|
||||
#!/usr/bin/env python3
|
||||
import csv
|
||||
import sys
|
||||
import zipfile
|
||||
|
||||
if len(sys.argv) < 2:
|
||||
print("Usage: python3 check_odoo_version.py <dump.zip>")
|
||||
sys.exit(1)
|
||||
|
||||
zip_path = sys.argv[1]
|
||||
base_version = None
|
||||
|
||||
with zipfile.ZipFile(zip_path, 'r') as z:
|
||||
# Assume there is only one .sql file in the zip
|
||||
sql_files = [f for f in z.namelist() if f.endswith('.sql')]
|
||||
if not sql_files:
|
||||
print("No .sql file found in the zip.")
|
||||
sys.exit(1)
|
||||
|
||||
sql_file_name = sql_files[0]
|
||||
|
||||
with z.open(sql_file_name, 'r') as f:
|
||||
# Decode bytes to string
|
||||
lines = (line.decode('utf-8') for line in f)
|
||||
|
||||
# Skip lines until COPY command
|
||||
for line in lines:
|
||||
if line.startswith("COPY public.ir_module_module"):
|
||||
break
|
||||
|
||||
# Read the COPY data until the terminator '\.'
|
||||
reader = csv.reader(lines, delimiter='\t', quotechar='"', escapechar='\\')
|
||||
for row in reader:
|
||||
if row == ['\\.']: # End of COPY
|
||||
break
|
||||
if len(row) < 12:
|
||||
continue
|
||||
module_name = row[7].strip() # 8th column = name
|
||||
if module_name == "base":
|
||||
base_version = row[11].strip() # 12th column = latest_version
|
||||
break
|
||||
|
||||
if base_version:
|
||||
print(base_version.split(".")[0])
|
||||
else:
|
||||
print("Base module not found in dump.")
|
||||
|
||||
Executable
+32
@@ -0,0 +1,32 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Create the tmp directory if it doesn't exist
|
||||
mkdir -p /4server/tmp/
|
||||
|
||||
# Save original stdout
|
||||
exec 3>&1
|
||||
|
||||
# Redirect all other output to log
|
||||
exec > /4server/data/log/importDb.log 2>&1
|
||||
echo "$(date '+%Y-%m-%d %H:%M') Import file $1"
|
||||
|
||||
# Generate random 8-digit filename
|
||||
RANDOM_FILE="/4server/tmp/import_$(date '+%Y%m%d_%H%M').zip"
|
||||
|
||||
# Download file from Google Drive using gdown
|
||||
gdown "$1" -O "$RANDOM_FILE"
|
||||
|
||||
# Execute dbVersion on the downloaded file and capture output
|
||||
VERSION=$(/4server/sbin/ODOO_19/dbVersion "$RANDOM_FILE")
|
||||
|
||||
# Output JSON to original stdout
|
||||
cat <<EOF >&3
|
||||
{
|
||||
"version":"$VERSION",
|
||||
"file":"$RANDOM_FILE"
|
||||
}
|
||||
EOF
|
||||
|
||||
# Close saved stdout
|
||||
exec 3>&-
|
||||
|
||||
Executable
+124
@@ -0,0 +1,124 @@
|
||||
#!/bin/bash
|
||||
export PATH=/4PROJECTS/bin:$PATH
|
||||
if [ ! -n "$1" ]; then
|
||||
echo "Missing Parameters <UUID>"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
UUID=$1
|
||||
|
||||
source /4server/sbin/helpers
|
||||
|
||||
get_contract_info
|
||||
|
||||
# Query installed modules from database and save CSV in variable
|
||||
DB_MODULES_CSV=$(PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" PAGER= psql \
|
||||
-h "$POSTGRES_HOST" \
|
||||
-U "$POSTGRES_ADMIN_USER" \
|
||||
-p "$POSTGRES_PORT" \
|
||||
-d "$UUID" \
|
||||
--csv \
|
||||
-c "
|
||||
SELECT
|
||||
name,
|
||||
latest_version,
|
||||
author,
|
||||
summary
|
||||
FROM ir_module_module
|
||||
WHERE state = 'installed'
|
||||
ORDER BY name;
|
||||
")
|
||||
|
||||
# Check if container exists and is running
|
||||
if ! doas docker ps --format "{{.Names}}" | grep -q "^${UUID}$"; then
|
||||
echo "Error: Container $UUID is not running" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Get addons_path from odoo.conf in container (try multiple possible locations)
|
||||
ADDONS_PATH_RAW=""
|
||||
for ODOO_CONF in "/etc/odoo.conf" "/etc/odoo/odoo.conf" "/opt/odoo/etc/odoo.conf"; do
|
||||
ADDONS_PATH_RAW=$(doas docker exec "$UUID" grep "^addons_path" "$ODOO_CONF" 2>/dev/null | sed 's/.*=//' | xargs)
|
||||
[ -n "$ADDONS_PATH_RAW" ] && break
|
||||
done
|
||||
|
||||
# Also check standard Odoo library locations
|
||||
ODOO_LIB_PATHS=""
|
||||
# Check standard docker installation path
|
||||
if doas docker exec "$UUID" test -d "/lib/python3/dist-packages/odoo/addons" 2>/dev/null; then
|
||||
ODOO_LIB_PATHS="/lib/python3/dist-packages/odoo/addons"
|
||||
fi
|
||||
# Also check other possible locations
|
||||
for lib_path in $(doas docker exec "$UUID" find /usr/lib /usr/local/lib -maxdepth 3 -type d -path "*/python3*/site-packages/odoo/addons" 2>/dev/null); do
|
||||
ODOO_LIB_PATHS="$ODOO_LIB_PATHS $lib_path"
|
||||
done
|
||||
|
||||
# Collect all module directories from filesystem
|
||||
FILESYSTEM_MODULES=$(mktemp)
|
||||
trap "rm -f $FILESYSTEM_MODULES" EXIT
|
||||
|
||||
# Collect from addons_path directories
|
||||
if [ -n "$ADDONS_PATH_RAW" ]; then
|
||||
OLD_IFS="$IFS"
|
||||
IFS=',' read -ra ADDPATHS <<< "$ADDONS_PATH_RAW"
|
||||
IFS="$OLD_IFS"
|
||||
for addons_dir in "${ADDPATHS[@]}"; do
|
||||
addons_dir=$(echo "$addons_dir" | xargs)
|
||||
[ -z "$addons_dir" ] && continue
|
||||
|
||||
# Get all directories in this addons path
|
||||
doas docker exec "$UUID" find "$addons_dir" -maxdepth 1 -type d 2>/dev/null | \
|
||||
sed "s|^$addons_dir/||" | sed "s|^$addons_dir$||" | grep -v "^$" >> "$FILESYSTEM_MODULES"
|
||||
done
|
||||
fi
|
||||
|
||||
# Also collect from standard Odoo library locations
|
||||
if [ -n "$ODOO_LIB_PATHS" ]; then
|
||||
for lib_path in $ODOO_LIB_PATHS; do
|
||||
lib_path=$(echo "$lib_path" | xargs)
|
||||
[ -z "$lib_path" ] && continue
|
||||
|
||||
# Get all directories in this library path
|
||||
doas docker exec "$UUID" find "$lib_path" -maxdepth 1 -type d 2>/dev/null | \
|
||||
sed "s|^$lib_path/||" | sed "s|^$lib_path$||" | grep -v "^$" >> "$FILESYSTEM_MODULES"
|
||||
done
|
||||
fi
|
||||
|
||||
# Sort and deduplicate filesystem modules
|
||||
sort -u "$FILESYSTEM_MODULES" > "${FILESYSTEM_MODULES}.sorted"
|
||||
mv "${FILESYSTEM_MODULES}.sorted" "$FILESYSTEM_MODULES"
|
||||
|
||||
# Process database modules and find missing ones
|
||||
MISSING_MODULES=$(mktemp)
|
||||
trap "rm -f $FILESYSTEM_MODULES $MISSING_MODULES" EXIT
|
||||
|
||||
# Process each line from database CSV (skip header)
|
||||
echo "$DB_MODULES_CSV" | tail -n +2 | while IFS= read -r line; do
|
||||
[ -z "$line" ] && continue
|
||||
|
||||
# Extract module name from first CSV field
|
||||
# Handle quoted CSV: extract first field, remove surrounding quotes
|
||||
if echo "$line" | grep -q '^"'; then
|
||||
# First field is quoted - extract between first quote and comma
|
||||
name=$(echo "$line" | sed 's/^"\([^"]*\)".*/\1/')
|
||||
else
|
||||
# First field is not quoted - extract up to first comma
|
||||
name=$(echo "$line" | cut -d',' -f1)
|
||||
fi
|
||||
|
||||
name=$(echo "$name" | xargs)
|
||||
[ -z "$name" ] && continue
|
||||
|
||||
# Check if module exists in filesystem
|
||||
if ! grep -Fxq "$name" "$FILESYSTEM_MODULES"; then
|
||||
# Module not found in filesystem - output the full CSV line
|
||||
echo "$line" >> "$MISSING_MODULES"
|
||||
fi
|
||||
done
|
||||
|
||||
# Output missing modules if any were found
|
||||
if [ -s "$MISSING_MODULES" ]; then
|
||||
echo "Missing modules:"
|
||||
echo "$DB_MODULES_CSV" | head -n 1 # Output CSV header
|
||||
cat "$MISSING_MODULES"
|
||||
fi
|
||||
Executable
+68
@@ -0,0 +1,68 @@
|
||||
#!/bin/bash
|
||||
export PATH=/4PROJECTS/bin:$PATH
|
||||
if [ ! -n "$2" ]; then
|
||||
echo "Missing Parameters <UUID> <FILE>"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
UUID=$1
|
||||
echo "UUID: $UUID"
|
||||
|
||||
source /4server/sbin/helpers
|
||||
|
||||
get_contract_info
|
||||
|
||||
|
||||
#export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql')
|
||||
|
||||
echo "PASSWORD $ODOO_DB_PASSWORD"
|
||||
|
||||
echo "Restoring $FILENAME to $UUID"
|
||||
echo "status of container"
|
||||
doas docker ps -a --filter "id=$UUID"
|
||||
echo "POSTGRES HOST: $POSTGRES_HOST"
|
||||
BACKUP="/mnt/backup/$2"
|
||||
TEMPLATE="/mnt/db_images/$2"
|
||||
doas docker exec "$UUID" /bin/bash -c "[ -f $TEMPLATE ]"
|
||||
|
||||
if doas docker exec "$UUID" /bin/bash -c "[ -f $BACKUP ]"; then
|
||||
FILENAME="$BACKUP"
|
||||
elif doas docker exec "$UUID" /bin/bash -c "[ -f $TEMPLATE ]"; then
|
||||
FILENAME="$TEMPLATE"
|
||||
else
|
||||
echo "File not exists"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
### DELETE AND CREATE DATABASE
|
||||
PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -d postgres -c "
|
||||
SELECT pg_terminate_backend(pid) FROM pg_stat_activity
|
||||
WHERE datname = '$UUID' AND pid <> pg_backend_pid();
|
||||
"
|
||||
PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql -h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -d postgres -c "
|
||||
DROP DATABASE IF EXISTS \"$UUID\";
|
||||
"
|
||||
|
||||
PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \
|
||||
-h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres \
|
||||
-c "ALTER ROLE \"$UUID\" CREATEDB;"
|
||||
|
||||
|
||||
doas docker exec "$UUID" rm -rf /home/odoo/.local/share/Odoo/filestore
|
||||
doas docker exec "$UUID" rm -rf /root/.local/share/Odoo/filestore
|
||||
|
||||
doas docker exec "$UUID" odoo db --db_host beedb -w "$ODOO_DB_PASSWORD" -r "$UUID" load "$UUID" $FILENAME -f
|
||||
|
||||
PGPASSWORD="$POSTGRES_ADMIN_PASSWORD" psql \
|
||||
-h "$POSTGRES_HOST" -U "$POSTGRES_ADMIN_USER" -p "$POSTGRES_PORT" -d postgres \
|
||||
-c "ALTER ROLE \"$UUID\" NOCREATEDB;"
|
||||
|
||||
|
||||
doas docker exec "$UUID" cp -r /root/.local/share/Odoo/filestore /home/odoo/.local/share/Odoo/filestore
|
||||
doas docker exec "$UUID" chown -R odoo:odoo /home/odoo/.local
|
||||
|
||||
doas docker exec "$UUID" mkdir -p /var/lib/odoo/.local/share/Odoo/
|
||||
doas docker exec "$UUID" ln -s /home/odoo/.local/share/Odoo/filestore /var/lib/odoo/.local/share/Odoo/filestore
|
||||
|
||||
docker restart "$UUID"
|
||||
Executable
+22
@@ -0,0 +1,22 @@
|
||||
#!/bin/bash
|
||||
export PATH=/4PROJECTS/bin:$PATH
|
||||
if [ ! -n "$1" ]; then
|
||||
echo "Missing Parameters <UUID>"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
UUID=$1
|
||||
echo "UUID: $UUID"
|
||||
|
||||
source /4server/sbin/helpers
|
||||
|
||||
get_contract_info
|
||||
|
||||
|
||||
#export ODOO_DB_PASSWORD=$(echo "$SECRET" | jq -r '.psql')
|
||||
|
||||
echo "PASSWORD $ODOO_DB_PASSWORD"
|
||||
|
||||
echo "POSTGRES HOST: $POSTGRES_HOST"
|
||||
|
||||
doas docker exec -it "$UUID" odoo shell --db_host beedb --db_password="$ODOO_DB_PASSWORD" -d "$UUID" --db_user="$UUID"
|
||||
Executable
+60
@@ -0,0 +1,60 @@
|
||||
#!/bin/bash
|
||||
export PATH=/4PROJECTS/bin:$PATH
|
||||
|
||||
# --------------------------------------------------
|
||||
# Validate parameter
|
||||
# --------------------------------------------------
|
||||
if [ -z "$1" ]; then
|
||||
echo "Missing Parameters <UUID>"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
UUID=$1
|
||||
|
||||
# --------------------------------------------------
|
||||
# Load environment helpers
|
||||
# --------------------------------------------------
|
||||
source /4server/sbin/helpers
|
||||
|
||||
if ! get_contract_info "$UUID"; then
|
||||
echo "Error: Failed to load contract info for $UUID" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# --------------------------------------------------
|
||||
# Verify container exists
|
||||
# --------------------------------------------------
|
||||
if ! doas docker ps -a --format "{{.Names}}" | grep -q "^${UUID}$"; then
|
||||
echo "Error: Container $UUID does not exist" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Updating all Odoo modules for database: $UUID"
|
||||
echo "Using DB host: $POSTGRES_HOST"
|
||||
|
||||
# --------------------------------------------------
|
||||
# Run Odoo update inside container
|
||||
# --------------------------------------------------
|
||||
if ! doas docker exec -u odoo "$UUID" odoo \
|
||||
-u all \
|
||||
-d "$UUID" \
|
||||
--stop-after-init \
|
||||
--db_host="$POSTGRES_HOST" \
|
||||
--db_port="$POSTGRES_PORT" \
|
||||
--db_user="$POSTGRES_ADMIN_USER" \
|
||||
--db_password="$POSTGRES_ADMIN_PASSWORD"
|
||||
then
|
||||
echo "Error: Odoo module update failed for $UUID" >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Module update completed successfully for $UUID"
|
||||
|
||||
# --------------------------------------------------
|
||||
# Restart container
|
||||
# --------------------------------------------------
|
||||
echo "Starting container $UUID"
|
||||
/4server/sbin/startContainer "$UUID"
|
||||
|
||||
echo "Done."
|
||||
exit 0
|
||||
Reference in New Issue
Block a user