optimize configure.sh

This commit is contained in:
2026-04-06 18:53:07 -04:00
parent 360b9ca28d
commit 61a873dda1

311
debian/configure.sh vendored
View File

@@ -7,80 +7,62 @@
# Usage (standalone): ./configure.sh # Usage (standalone): ./configure.sh
# Usage (from install): . ./configure.sh # Usage (from install): . ./configure.sh
#move to the directory this script lives in so relative paths work
cd "$(dirname "$0")" 2>/dev/null || true cd "$(dirname "$0")" 2>/dev/null || true
CONFIG_FILE="./resources/config.sh" CONFIG_FILE="./resources/config.sh"
_CREDS_FILE="/root/.git-credentials"
# --------------------------------------------------------------------------- # ===========================================================================
# Helper: prompt with a default value # Defaults — every variable is pre-populated so sections with no
# ask <variable_name> <prompt_text> <default_value> # customization need no else branch at all.
# --------------------------------------------------------------------------- # ===========================================================================
domain_name=ip_address ; system_username=admin
system_password=random ; system_branch=5.5
php_version=8.2 ; letsencrypt_folder=true
switch_branch=stable ; switch_source=true
switch_package=false ; switch_version=1.10.12
switch_tls=true ; switch_token=
sofia_version=1.13.17
database_name=fusionpbx ; database_username=fusionpbx
database_password=random ; database_repo=official
database_version=18 ; database_host=127.0.0.1
database_port=5432 ; database_backup=false
application_transcribe=true ; application_speech=true
application_language_model=true ; application_device_logs=true
application_dialplan_tools=false; application_edit=false
application_sip_trunks=false
_git_credentials_written=false
# ===========================================================================
# Helpers
# ===========================================================================
# ask <var> <prompt> <default>
ask() { ask() {
_var="$1" printf "%s [%s]: " "$2" "$3"
_prompt="$2"
_default="$3"
printf "%s [%s]: " "$_prompt" "$_default"
read -r _input </dev/tty read -r _input </dev/tty
[ -z "$_input" ] && _input="$_default" eval "${1}=\"${_input:-$3}\""
eval "${_var}=\"\${_input}\""
} }
# --------------------------------------------------------------------------- # ask_secret <var> <prompt> — no echo
# Helper: silent prompt for passwords/tokens (no echo)
# ask_secret <variable_name> <prompt_text>
# ---------------------------------------------------------------------------
ask_secret() { ask_secret() {
_var="$1"
_prompt="$2"
if stty -echo 2>/dev/null; then if stty -echo 2>/dev/null; then
printf "%s: " "$_prompt" printf "%s: " "$2"
read -r _input </dev/tty read -r _input </dev/tty
stty echo stty echo; echo ""
echo ""
else else
printf "%s (input visible - no tty echo control): " "$_prompt" printf "%s (input visible): " "$2"
read -r _input </dev/tty read -r _input </dev/tty
fi fi
eval "${_var}=\"\${_input}\"" eval "${1}=\"${_input}\""
} }
# --------------------------------------------------------------------------- # ask_yn <prompt> <default y|n> — returns 0=yes 1=no
# Helper: yes/no prompt normalised to true/false
# ask_bool <variable_name> <prompt_text> <default true|false>
# ---------------------------------------------------------------------------
ask_bool() {
_var="$1"
_prompt="$2"
_default="$3"
while true; do
printf "%s (true/false) [%s]: " "$_prompt" "$_default"
read -r _input </dev/tty
[ -z "$_input" ] && _input="$_default"
case "$_input" in
true|yes|y|1) eval "${_var}=true"; break ;;
false|no|n|0) eval "${_var}=false"; break ;;
*) echo " Please enter true or false." ;;
esac
done
}
# ---------------------------------------------------------------------------
# Helper: yes/no gate — returns 0 for yes, 1 for no
# ask_yn <prompt_text> <default y|n>
# ---------------------------------------------------------------------------
ask_yn() { ask_yn() {
_prompt="$1"
_default="$2"
while true; do while true; do
printf "%s (y/n) [%s]: " "$_prompt" "$_default" printf "%s (y/n) [%s]: " "$1" "$2"
read -r _input </dev/tty read -r _input </dev/tty
[ -z "$_input" ] && _input="$_default" case "${_input:-$2}" in
case "$_input" in
y|Y|yes|YES) return 0 ;; y|Y|yes|YES) return 0 ;;
n|N|no|NO) return 1 ;; n|N|no|NO) return 1 ;;
*) echo " Please enter y or n." ;; *) echo " Please enter y or n." ;;
@@ -88,6 +70,35 @@ ask_yn() {
done done
} }
# ask_bool <var> <prompt> <default true|false> — wraps ask_yn
ask_bool() {
_yn=$([ "$3" = "true" ] && echo "y" || echo "n")
if ask_yn "$2" "$_yn"; then eval "${1}=true"
else eval "${1}=false"
fi
}
# write_git_credentials <server>
write_git_credentials() {
_srv="$1"
ask _git_username "Git username or email" ""
[ -z "$_git_username" ] && { echo " No username entered — skipping."; return; }
ask_secret _git_password "Git password or personal access token"
# URL-encode characters that break the credentials file URL format
_enc_u=$(printf '%s' "$_git_username" | sed 's/%/%25/g;s/ /%20/g;s/:/%3A/g;s/@/%40/g')
_enc_p=$(printf '%s' "$_git_password" | sed 's/%/%25/g;s/ /%20/g;s/:/%3A/g;s/@/%40/g')
# Remove any pre-existing entry for this server, then append
[ -f "$_CREDS_FILE" ] && sed -i "/@${_srv}/d" "$_CREDS_FILE"
printf 'https://%s:%s@%s\n' "$_enc_u" "$_enc_p" "$_srv" >> "$_CREDS_FILE"
chmod 600 "$_CREDS_FILE"
_git_credentials_written=true
echo " Credentials written to $_CREDS_FILE"
unset _git_password _enc_p _git_username _enc_u
}
# =========================================================================== # ===========================================================================
echo "" echo ""
echo "============================================================" echo "============================================================"
@@ -113,26 +124,17 @@ if ask_yn "Customize basic settings" "y"; then
ask_bool letsencrypt_folder "Create Let's Encrypt folder structure" "true" ask_bool letsencrypt_folder "Create Let's Encrypt folder structure" "true"
echo "" echo ""
else else
domain_name=ip_address echo " Using defaults."; echo ""
system_username=admin
system_password=random
system_branch=5.5
php_version=8.2
letsencrypt_folder=true
echo " Using defaults for all basic settings."
echo ""
fi fi
# =========================================================================== # ===========================================================================
# SECTION 2 — Advanced Install Settings (optional) # SECTION 2 — Advanced Install Settings
# =========================================================================== # ===========================================================================
echo "------------------------------------------------------------" echo "------------------------------------------------------------"
echo " Advanced Install Settings" echo " Advanced Install Settings (FreeSWITCH / Sofia-Sip / Database)"
echo "------------------------------------------------------------" echo "------------------------------------------------------------"
if ask_yn "Customize advanced settings (FreeSWITCH, Database, Sofia-Sip)" "n"; then if ask_yn "Customize advanced settings" "n"; then
echo "" echo ""
# --- FreeSWITCH ---
echo " -- FreeSWITCH --" echo " -- FreeSWITCH --"
ask switch_branch " Branch (master, stable)" "stable" ask switch_branch " Branch (master, stable)" "stable"
ask_bool switch_source " Compile from source" "true" ask_bool switch_source " Compile from source" "true"
@@ -141,42 +143,21 @@ if ask_yn "Customize advanced settings (FreeSWITCH, Database, Sofia-Sip)" "n"; t
ask_bool switch_tls " Enable TLS" "true" ask_bool switch_tls " Enable TLS" "true"
ask switch_token " SignalWire auth token (blank if none)" "" ask switch_token " SignalWire auth token (blank if none)" ""
echo "" echo ""
# --- Sofia-Sip ---
echo " -- Sofia-Sip --" echo " -- Sofia-Sip --"
ask sofia_version " Release version" "1.13.17" ask sofia_version " Release version" "1.13.17"
echo "" echo ""
# --- Database ---
echo " -- Database --" echo " -- Database --"
ask database_name " Database name" "fusionpbx" ask database_name " Database name" "fusionpbx"
ask database_username " Database username" "fusionpbx" ask database_username " Database username" "fusionpbx"
ask database_password " Database password (random = auto)" "random" ask database_password " Database password (random = auto)" "random"
ask database_repo " PostgreSQL repo (official, system)" "official" ask database_repo " PostgreSQL repo (official, system)" "official"
ask database_version " PostgreSQL version (requires repo=official)" "18" ask database_version " PostgreSQL version" "18"
ask database_host " Database host" "127.0.0.1" ask database_host " Database host" "127.0.0.1"
ask database_port " Database port" "5432" ask database_port " Database port" "5432"
ask_bool database_backup " Enable database backup" "false" ask_bool database_backup " Enable database backup" "false"
echo "" echo ""
else else
# Apply defaults silently echo " Using defaults."; echo ""
switch_branch=stable
switch_source=true
switch_package=false
switch_version=1.10.12
switch_tls=true
switch_token=
sofia_version=1.13.17
database_name=fusionpbx
database_username=fusionpbx
database_password=random
database_repo=official
database_version=18
database_host=127.0.0.1
database_port=5432
database_backup=false
echo " Using defaults for all advanced settings."
echo ""
fi fi
# =========================================================================== # ===========================================================================
@@ -196,121 +177,75 @@ if ask_yn "Customize additional applications" "y"; then
ask_bool application_sip_trunks "Install registration-based SIP trunks" "false" ask_bool application_sip_trunks "Install registration-based SIP trunks" "false"
echo "" echo ""
else else
application_transcribe=true echo " Using defaults."; echo ""
application_speech=true
application_language_model=true
application_device_logs=true
application_dialplan_tools=false
application_edit=false
application_sip_trunks=false
echo " Using defaults for all additional applications."
echo ""
fi fi
# =========================================================================== # ===========================================================================
# SECTION 4 — Git Credentials # SECTION 4 — Git Credentials
# =========================================================================== # ===========================================================================
# Auto-detect server hostname from the clone URL in resources/fusionpbx.sh
_git_server=$(grep 'git clone' ./resources/fusionpbx.sh \ _git_server=$(grep 'git clone' ./resources/fusionpbx.sh \
| grep -o 'https://[^/]*' \ | grep -o 'https://[^/]*' | sed 's|https://||' | head -1)
| sed 's|https://||' \
| head -1)
_git_credentials_written=false
echo "------------------------------------------------------------" echo "------------------------------------------------------------"
echo " Git Credentials" echo " Git Credentials"
echo "------------------------------------------------------------" echo "------------------------------------------------------------"
echo " Server detected from resources/fusionpbx.sh: ${_git_server:-<not found>}" echo " Server detected: ${_git_server:-<not found>}"
if ask_yn "Configure git credentials" "y"; then if ask_yn "Configure git credentials" "y"; then
echo "" echo ""
echo " Credentials will be written immediately to /root/.git-credentials (mode 600)." write_git_credentials "$_git_server"
echo " Leave username blank to skip."
echo ""
ask _git_username "Git username or email" ""
if [ -n "$_git_username" ]; then
ask_secret _git_password "Git password or personal access token"
# URL-encode characters that would break the credentials file URL format
_enc_user=$(printf '%s' "$_git_username" | sed \
-e 's/%/%25/g' -e 's/ /%20/g' \
-e 's/:/%3A/g' -e 's/@/%40/g')
_enc_pass=$(printf '%s' "$_git_password" | sed \
-e 's/%/%25/g' -e 's/ /%20/g' \
-e 's/:/%3A/g' -e 's/@/%40/g')
_CREDS_FILE="/root/.git-credentials"
# Remove any pre-existing entry for this server to avoid duplicates
if [ -f "$_CREDS_FILE" ]; then
sed -i "/@${_git_server}/d" "$_CREDS_FILE"
fi
printf 'https://%s:%s@%s\n' "$_enc_user" "$_enc_pass" "$_git_server" \
>> "$_CREDS_FILE"
chmod 600 "$_CREDS_FILE"
_git_credentials_written=true
echo " Credentials written to $_CREDS_FILE"
else
echo " No username entered — skipping credential store."
fi
# Clear sensitive variables immediately
unset _git_password _enc_pass _git_username _enc_user
echo "" echo ""
else else
echo " Skipping git credential configuration." echo " Skipping."; echo ""
echo ""
fi fi
# =========================================================================== # ===========================================================================
# SUMMARY — read back all settings and ask to confirm # SUMMARY
# =========================================================================== # ===========================================================================
echo "============================================================" cat <<EOF
echo " Configuration Summary" ============================================================
echo "============================================================" Configuration Summary
echo "" ============================================================
echo " Basic Settings"
echo " domain_name = $domain_name" Basic Settings
echo " system_username = $system_username" domain_name = $domain_name
echo " system_password = $system_password" system_username = $system_username
echo " system_branch = $system_branch" system_password = $system_password
echo " php_version = $php_version" system_branch = $system_branch
echo " letsencrypt_folder = $letsencrypt_folder" php_version = $php_version
echo "" letsencrypt_folder = $letsencrypt_folder
echo " Advanced Settings (FreeSWITCH / Sofia-Sip / Database)"
echo " switch_branch = $switch_branch" Advanced Settings (FreeSWITCH / Sofia-Sip / Database)
echo " switch_source = $switch_source" switch_branch = $switch_branch
echo " switch_package = $switch_package" switch_source = $switch_source
echo " switch_version = $switch_version" switch_package = $switch_package
echo " switch_tls = $switch_tls" switch_version = $switch_version
echo " switch_token = ${switch_token:-<not set>}" switch_tls = $switch_tls
echo " sofia_version = $sofia_version" switch_token = ${switch_token:-<not set>}
echo " database_name = $database_name" sofia_version = $sofia_version
echo " database_username = $database_username" database_name = $database_name
echo " database_password = $database_password" database_username = $database_username
echo " database_repo = $database_repo" database_password = $database_password
echo " database_version = $database_version" database_repo = $database_repo
echo " database_host = $database_host" database_version = $database_version
echo " database_port = $database_port" database_host = $database_host
echo " database_backup = $database_backup" database_port = $database_port
echo "" database_backup = $database_backup
echo " Additional Applications"
echo " transcribe = $application_transcribe" Additional Applications
echo " speech = $application_speech" transcribe = $application_transcribe
echo " language_model = $application_language_model" speech = $application_speech
echo " device_logs = $application_device_logs" language_model = $application_language_model
echo " dialplan_tools = $application_dialplan_tools" device_logs = $application_device_logs
echo " edit = $application_edit" dialplan_tools = $application_dialplan_tools
echo " sip_trunks = $application_sip_trunks" edit = $application_edit
echo "" sip_trunks = $application_sip_trunks
echo " Git Credentials"
echo " git_server = ${_git_server:-<not detected>}" Git Credentials
echo " credentials = ${_git_credentials_written}" git_server = ${_git_server:-<not detected>}
echo "" credentials written = $_git_credentials_written
echo "============================================================"
echo "" ============================================================
EOF
if ! ask_yn "Continue with installation using these settings" "y"; then if ! ask_yn "Continue with installation using these settings" "y"; then
echo "" echo ""