#!/usr/bin/bash export PATH=/usr/sbin:$PATH export DEBIAN_FRONTEND=noninteractive set -euo pipefail DEPLOY_PATH=$(pwd)/deployment SETUP_PATH=$(pwd)/setup PIP=$(pwd)/venv/bin/pip PYTHON=$(pwd)/venv/bin/python ODOO_ADDONS=${DEPLOY_PATH}/addons ODOO_CONFIG=${DEPLOY_PATH}/etc ODOO_BACKUP=${DEPLOY_PATH}/backup # System DEPENDS_PACKAGE=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf' 'postgresql-client') DEPENDS_COMMAND=('wget' 'curl' 'git' 'unzip' 'make' 'wkhtmltopdf' 'psql') ((EUID)) && sudo_cmd="sudo" || sudo_cmd="" readonly MINIMUM_DOCER_VERSION="20" UNAME_U="$(uname -s)" readonly UNAME_U readonly COLOUR_RESET='\e[0m' readonly aCOLOUR=( '\e[38;5;154m' # green | Lines, bullets and separators '\e[1m' # Bold white | Main descriptions '\e[90m' # Grey | Credits '\e[91m' # Red | Update notifications Alert '\e[33m' # Yellow | Emphasis ) trap 'onCtrlC' INT onCtrlC() { echo -e "${COLOUR_RESET}" exit 1 } Show() { # OK if (($1 == 0)); then echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[0]} OK $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" # FAILED elif (($1 == 1)); then echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[3]}FAILED$COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" exit 1 # INFO elif (($1 == 2)); then echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[0]} INFO $COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" # NOTICE elif (($1 == 3)); then echo -e "${aCOLOUR[2]}[$COLOUR_RESET${aCOLOUR[4]}NOTICE$COLOUR_RESET${aCOLOUR[2]}]$COLOUR_RESET $2" fi } Warn() { echo -e "${aCOLOUR[3]}$1$COLOUR_RESET" } GreyStart() { echo -e "${aCOLOUR[2]}\c" } ColorReset() { echo -e "$COLOUR_RESET\c" } Update_Package_Resource() { GreyStart if [ -x "$(command -v apk)" ]; then ${sudo_cmd} apk update elif [ -x "$(command -v apt)" ]; then ${sudo_cmd} apt update elif [ -x "$(command -v dnf)" ]; then ${sudo_cmd} dnf check-update elif [ -x "$(command -v zypper)" ]; then ${sudo_cmd} zypper update elif [ -x "$(command -v yum)" ]; then ${sudo_cmd} yum update fi ColorReset } # 3 Check OS Check_OS() { if [[ $UNAME_U == *Linux* ]]; then Show 0 "Your System is : $UNAME_U" else Show 1 "This script is only for Linux." exit 1 fi } Install_Depends() { for ((i = 0; i < ${#DEPENDS_COMMAND[@]}; i++)); do cmd=${DEPENDS_COMMAND[i]} if [[ ! -x $(${sudo_cmd} which "$cmd") ]]; then packagesNeeded=${DEPENDS_PACKAGE[i]} Show 2 "Install the necessary dependencies: \e[33m$packagesNeeded \e[0m" GreyStart if [ -x "$(command -v apk)" ]; then ${sudo_cmd} apk add --no-cache "$packagesNeeded" elif [ -x "$(command -v apt-get)" ]; then ${sudo_cmd} apt-get -y -q install "$packagesNeeded" --no-upgrade elif [ -x "$(command -v dnf)" ]; then ${sudo_cmd} dnf install "$packagesNeeded" elif [ -x "$(command -v zypper)" ]; then ${sudo_cmd} zypper install "$packagesNeeded" elif [ -x "$(command -v yum)" ]; then ${sudo_cmd} yum install "$packagesNeeded" elif [ -x "$(command -v pacman)" ]; then ${sudo_cmd} pacman -S "$packagesNeeded" elif [ -x "$(command -v paru)" ]; then ${sudo_cmd} paru -S "$packagesNeeded" else Show 1 "Package manager not found. You must manually install: \e[33m$packagesNeeded \e[0m" fi ColorReset else Show 2 "\e[33m ${DEPENDS_COMMAND[i]}\e[0m Installed" fi done } Check_Dependency_Installation() { for ((i = 0; i < ${#DEPENDS_COMMAND[@]}; i++)); do cmd=${DEPENDS_COMMAND[i]} if [[ ! -x $(${sudo_cmd} which "$cmd") ]]; then packagesNeeded=${DEPENDS_PACKAGE[i]} Show 1 "Dependency \e[33m$packagesNeeded \e[0m installation failed, please try again manually!" exit 1 fi done } Check_Docker_Install() { if [[ -x "$(command -v docker)" ]]; then Docker_Version=$(${sudo_cmd} docker version --format '{{.Server.Version}}') if [[ $? -ne 0 ]]; then Install_Docker elif [[ ${Docker_Version:0:2} -lt "${MINIMUM_DOCER_VERSION}" ]]; then Show 1 "Recommended minimum Docker version is \e[33m${MINIMUM_DOCER_VERSION}.xx.xx\e[0m,\Current Docker verison is \e[33m${Docker_Version}\e[0m,\nPlease uninstall current Docker and rerun the CasaOS installation script." exit 1 else Show 0 "Current Docker verison is ${Docker_Version}." fi else Install_Docker fi } Install_Docker() { Show 2 "Install the necessary dependencies: \e[33mDocker \e[0m" if [[ ! -d "${PREFIX}/etc/apt/sources.list.d" ]]; then ${sudo_cmd} mkdir -p "${PREFIX}/etc/apt/sources.list.d" fi GreyStart if [[ "${REGION}" = "CN" ]]; then ${sudo_cmd} curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun else ${sudo_cmd} curl -fsSL https://get.docker.com | bash fi ColorReset if [[ $? -ne 0 ]]; then Show 1 "Installation failed, please try again." exit 1 else Check_Docker_Install_Final fi } Check_Docker_Install_Final() { if [[ -x "$(command -v docker)" ]]; then Docker_Version=$(${sudo_cmd} docker version --format '{{.Server.Version}}') if [[ $? -ne 0 ]]; then Install_Docker elif [[ ${Docker_Version:0:2} -lt "${MINIMUM_DOCER_VERSION}" ]]; then Show 1 "Recommended minimum Docker version is \e[33m${MINIMUM_DOCER_VERSION}.xx.xx\e[0m,\Current Docker verison is \e[33m${Docker_Version}\e[0m,\nPlease uninstall current Docker and rerun the CasaOS installation script." exit 1 else Show 0 "Current Docker verison is ${Docker_Version}." Check_Docker_Running fi else Show 1 "Installation failed, please run 'curl -fsSL https://get.docker.com | bash' and rerun the CasaOS installation script." exit 1 fi } Generate_Config_Docker(){ ODOO_IMAGE=${1:-} ODOO_TAG=${2:-} ODOO_CONTAINER=${3:-} if [[ ! -f "${DEPLOY_PATH}/.env" ]]; then cp "${DEPLOY_PATH}/env.template" "${DEPLOY_PATH}/.env" fi USER="${REPO_NAME:-"default_repo"}" # Convert to lowercase USER="${USER,,}" ${PYTHON} "$SETUP_PATH/gen_config_docker.py" --db_port 5432 --db_user $USER --deploy_path "$DEPLOY_PATH" \ --image "${ODOO_IMAGE}" --container "${ODOO_CONTAINER}" --tag "${ODOO_TAG:=latest}" \ --addons "${ODOO_ADDONS}" --config "${ODOO_CONFIG}" --backup "${ODOO_BACKUP}" Show 0 " Generate Config Complete" } Generate_Config_Native(){ DB_USER=${2:-} DB_PASSWORD=${3:-} DB_SERVER=${4:-} DB_PORT=${5:-} ADDONS=${1:-} REPO_NAME=$(basename "$(git rev-parse --show-toplevel)" | sed -E 's/[.-]/_/g') USER="${REPO_NAME:-"default_repo"}" # Convert to lowercase USER="${USER,,}" PASSWORD="$(openssl rand -hex 24)" # Check if the user already exists USER_EXISTS=$(psql "postgresql://${DB_USER}:${DB_PASSWORD}@${DB_SERVER}:${DB_PORT}/postgres" -t -A -c "SELECT COUNT(*) FROM pg_roles WHERE rolname='$USER';") if [ $USER_EXISTS -eq 0 ]; then # User does not exist, create the user Show 2 "Create the new PostgreSQL username: $USER with password: $PASSWORD" psql "postgresql://${DB_USER}:${DB_PASSWORD}@${DB_SERVER}:${DB_PORT}/postgres" -c "CREATE USER $USER WITH PASSWORD '$PASSWORD';" Show 2 "Grant $USER superuser (admin) privileges" psql "postgresql://${DB_USER}:${DB_PASSWORD}@${DB_SERVER}:${DB_PORT}/postgres" -c "ALTER USER $USER WITH SUPERUSER;" else # User exists, update the password (do not try to create) Show 2 "User $USER already exists, updating password to $PASSWORD" psql "postgresql://${DB_USER}:${DB_PASSWORD}@${DB_SERVER}:${DB_PORT}/postgres" -c "ALTER USER $USER WITH PASSWORD '$PASSWORD';" fi ${PYTHON} "$SETUP_PATH/gen_config.py" --db_user $USER --db_pass $PASSWORD --deploy_path "$(pwd)" \ --addons_path $ADDONS --db_port $DB_PORT --db_server $DB_SERVER Show 0 " Generate Config Complete" } main(){ TYPE=${1:-} Check_OS # Update_Package_Resource # Install_Depends # Check_Dependency_Installation # Check_Docker_Install case "$TYPE" in --native) Generate_Config_Native $2 $3 $4 $5 $6 ;; --docker) Generate_Config_Docker $2 $3 $4 ;; *) # else Show 1 "Invalid argument (--docker|--native)" ;; esac } main "$@"