From ea5219ddc9e05d8776c962feb30bcf0798a5921a Mon Sep 17 00:00:00 2001 From: coderus Date: Fri, 6 Jan 2023 15:30:22 +0100 Subject: [PATCH 01/25] fix(systemd): remove RemainAfterExit from services RemainAfterExit=yes makes impossible for service to restart automatically if exited with 0 exit code --- resources/klipper.service | 1 - resources/moonraker-telegram-bot.service | 1 - resources/moonraker.service | 1 - 3 files changed, 3 deletions(-) diff --git a/resources/klipper.service b/resources/klipper.service index 8c74cd4..ed7598c 100644 --- a/resources/klipper.service +++ b/resources/klipper.service @@ -10,7 +10,6 @@ WantedBy=multi-user.target [Service] Type=simple User=%USER% -RemainAfterExit=yes WorkingDirectory=/home/%USER%/klipper EnvironmentFile=%ENV_FILE% ExecStart=%ENV%/bin/python $KLIPPER_ARGS diff --git a/resources/moonraker-telegram-bot.service b/resources/moonraker-telegram-bot.service index 28cf88f..8fcf233 100644 --- a/resources/moonraker-telegram-bot.service +++ b/resources/moonraker-telegram-bot.service @@ -9,7 +9,6 @@ WantedBy=multi-user.target [Service] Type=simple User=%USER% -RemainAfterExit=yes WorkingDirectory=/home/%USER%/moonraker-telegram-bot EnvironmentFile=%ENV_FILE% ExecStart=%ENV%/bin/python $TELEGRAM_BOT_ARGS diff --git a/resources/moonraker.service b/resources/moonraker.service index ac8000f..77db29b 100644 --- a/resources/moonraker.service +++ b/resources/moonraker.service @@ -11,7 +11,6 @@ WantedBy=multi-user.target Type=simple User=%USER% SupplementaryGroups=moonraker-admin -RemainAfterExit=yes WorkingDirectory=/home/%USER%/moonraker EnvironmentFile=%ENV_FILE% ExecStart=%ENV%/bin/python $MOONRAKER_ARGS -- 2.39.5 From 810fcde5c17a25e2ef6f01cf1a6f7251bd3aa962 Mon Sep 17 00:00:00 2001 From: coderus Date: Fri, 6 Jan 2023 15:37:21 +0100 Subject: [PATCH 02/25] refactor(klipper): do not force remove and clone if already exists --- scripts/klipper.sh | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index 1381e31..37acebd 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -233,6 +233,19 @@ function clone_klipper() { repo=$(echo "${repo}" | sed -r "s/^(http|https):\/\/github\.com\///i; s/\.git$//") repo="https://github.com/${repo}" + if [[ -d ${KLIPPER_DIR} ]] + then + status_msg "Klipper already cloned, checking compatibility ..." + local current_repo=$(git -C ${KLIPPER_DIR} config --get remote.origin.url) + if [[ "${repo}" == "${current_repo}" ]] + then + git -C ${KLIPPER_DIR} stash + git -C ${KLIPPER_DIR} checkout ${branch} + git -C ${KLIPPER_DIR} pull --ff-only + return + fi + fi + [[ -z ${branch} ]] && branch="master" ### force remove existing klipper dir and clone into fresh klipper dir -- 2.39.5 From c07c17e8c9579902234f482496230fb06a3a5532 Mon Sep 17 00:00:00 2001 From: coderus Date: Fri, 6 Jan 2023 15:43:59 +0100 Subject: [PATCH 03/25] refactor(python): Add default input to Python version selector --- scripts/klipper.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index 37acebd..55c0649 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -54,7 +54,7 @@ function start_klipper_setup() { ### user selection for python version print_dialog_user_select_python_version while true; do - read -p "${cyan}###### Select Python version:${white} " input + read -p "${cyan}###### Select Python version:${white} " -e -i 1 input case "${input}" in 1) select_msg "Python 3.x\n" -- 2.39.5 From b131cf56ef266c7a31a840956b3bc52362eae1cb Mon Sep 17 00:00:00 2001 From: coderus Date: Fri, 6 Jan 2023 15:46:51 +0100 Subject: [PATCH 04/25] refactor(klipper): confirm instalaltion to existing instance folder --- scripts/klipper.sh | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index 55c0649..ecfde5f 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -123,11 +123,22 @@ function start_klipper_setup() { if [[ ${input} =~ ${regex} ]]; then select_msg "Name: ${input}\n" + local instance_name if [[ ${input} =~ ^[0-9]+$ ]]; then - instance_names+=("printer_${input}") + instance_name="printer_${input}" else - instance_names+=("${input}") + instance_name="${input}" fi + if [[ -d "${HOME}/${instance_name}_data" ]] + then + status_msg "Instance ${instance_name} already exists" + read -p "${cyan}###### Enter q for exit or any other input to continue:${white} " same_continue + if [[ "${same_continue}" == "q" ]] + then + return + fi + fi + instance_names+=("${instance_name}") i=$(( i + 1 )) else error_msg "Invalid Input!\n" -- 2.39.5 From 3556a009ec7fdb75a0415db78338108c52e71658 Mon Sep 17 00:00:00 2001 From: coderus Date: Fri, 6 Jan 2023 19:54:49 +0100 Subject: [PATCH 05/25] refactor(klipper): Do not clone in Update if no dir exists --- scripts/klipper.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index ecfde5f..de6f9d2 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -536,7 +536,8 @@ function update_klipper() { do_action_service "stop" "klipper" if [[ ! -d ${KLIPPER_DIR} ]]; then - clone_klipper "${custom_repo}" "${custom_branch}" + error_msg "Nothing to update, Klipper directory doesn't exists! Please instakk Klipper first." + return else backup_before_update "klipper" -- 2.39.5 From 72b5038e71aaa9dbf865d21de8a13792144fb820 Mon Sep 17 00:00:00 2001 From: coderus Date: Fri, 6 Jan 2023 19:56:15 +0100 Subject: [PATCH 06/25] refactor(klipper): Just update venv if already exists --- scripts/klipper.sh | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index de6f9d2..4b05336 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -213,7 +213,14 @@ function run_klipper_setup() { ### step 2: install klipper dependencies and create python virtualenv install_klipper_packages "${python_version}" - create_klipper_virtualenv "${python_version}" + + if [[ "${klipper_clone_result}" == "0" ]] + then + create_klipper_virtualenv "${python_version}" + else + "${KLIPPY_ENV}"/bin/pip install -r "${KLIPPER_DIR}/scripts/klippy-requirements.txt" + fi + unset klipper_clone_result ### step 3: create klipper instances for instance in "${instance_names[@]}"; do @@ -253,6 +260,7 @@ function clone_klipper() { git -C ${KLIPPER_DIR} stash git -C ${KLIPPER_DIR} checkout ${branch} git -C ${KLIPPER_DIR} pull --ff-only + klipper_clone_result="1" return fi fi @@ -271,6 +279,8 @@ function clone_klipper() { print_error "Cloning Klipper from\n ${repo}\n failed!" exit 1 fi + + klipper_clone_result="0" } function create_klipper_virtualenv() { -- 2.39.5 From 3b68783f3ba64c6bb20b6ad11cc1e80600896084 Mon Sep 17 00:00:00 2001 From: coderus Date: Fri, 6 Jan 2023 16:25:40 +0100 Subject: [PATCH 07/25] refactor(klipper): Install additional instances without full reinstall --- scripts/klipper.sh | 60 ++++++++++++++++++++++++---------------------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index 4b05336..3a81bf4 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -41,35 +41,39 @@ function start_klipper_setup() { error="${error}\n ➔ ${klipper_initd_service}" error="${error}\n Please re-install Klipper with KIAUH!" log_info "Unsupported Klipper SysVinit service detected: ${klipper_initd_service}" - elif [[ -n ${klipper_systemd_services} ]]; then - error="At least one Klipper service is already installed:" + fi + + local klipper_systemd_services_count=0 + if [[ -n ${klipper_systemd_services} ]]; then + klipper_systemd_services_count=$(find_klipper_systemd | wc -w) + status_msg "Following Klipper instances are already installed:" for s in ${klipper_systemd_services}; do - log_info "Found Klipper service: ${s}" - error="${error}\n ➔ ${s}" + echo "$(get_instance_name ${s})" done - fi - [[ -n ${error} ]] && print_error "${error}" && return - ### user selection for python version - print_dialog_user_select_python_version - while true; do - read -p "${cyan}###### Select Python version:${white} " -e -i 1 input - case "${input}" in - 1) - select_msg "Python 3.x\n" - python_version=3 - break;; - 2) - select_msg "Python 2.7\n" - python_version=2 - break;; - B|b) - clear; install_menu; break;; - *) - error_msg "Invalid Input!\n";; - esac - done && input="" + python_version=$(get_klipper_python_ver) + else + ### user selection for python version + print_dialog_user_select_python_version + while true; do + read -p "${cyan}###### Select Python version:${white} " -e -i 1 input + case "${input}" in + 1) + select_msg "Python 3.x\n" + python_version=3 + break;; + 2) + select_msg "Python 2.7\n" + python_version=2 + break;; + B|b) + clear; install_menu; break;; + *) + error_msg "Invalid Input!\n";; + esac + done && input="" + fi ### user selection for instance count print_dialog_user_select_instance_count @@ -90,7 +94,7 @@ function start_klipper_setup() { ### user selection for custom names use_custom_names="false" - if (( instance_count > 1 )); then + if (( instance_count > 1 )) || [[ -n ${klipper_systemd_services} ]]; then print_dialog_user_select_custom_name_bool while true; do read -p "${cyan}###### Assign custom names? (y/N):${white} " input @@ -113,7 +117,7 @@ function start_klipper_setup() { fi ### user selection for setting the actual custom names - if (( instance_count > 1 )) && [[ ${use_custom_names} == "true" ]]; then + if [[ ${use_custom_names} == "true" ]]; then local i i=1 @@ -145,7 +149,7 @@ function start_klipper_setup() { fi done && input="" elif (( instance_count > 1 )) && [[ ${use_custom_names} == "false" ]]; then - for (( i=1; i <= instance_count; i++ )); do + for (( i=klipper_systemd_services_count+1; i <= instance_count+klipper_systemd_services_count; ++i )); do instance_names+=("printer_${i}") done fi -- 2.39.5 From 40fee65bf4c29b81badd618b2fc64f183de05c64 Mon Sep 17 00:00:00 2001 From: coderus Date: Sat, 7 Jan 2023 17:32:07 +0100 Subject: [PATCH 08/25] refactor(moonraker): do not remove dir for clone if exists, do not reset venv --- scripts/moonraker.sh | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/scripts/moonraker.sh b/scripts/moonraker.sh index 707b27d..8edee1c 100644 --- a/scripts/moonraker.sh +++ b/scripts/moonraker.sh @@ -199,7 +199,10 @@ function moonraker_setup() { ### step 2: install moonraker dependencies and create python virtualenv status_msg "Installing dependencies ..." install_moonraker_dependencies - create_moonraker_virtualenv + if [[ "${moonraker_clone_result}" == "0" ]]; then + create_moonraker_virtualenv + fi + unset moonraker_clone_result ### step 3: create moonraker.conf create_moonraker_conf "${instance_arr[@]}" @@ -226,6 +229,15 @@ function clone_moonraker() { status_msg "Cloning Moonraker from ${repo} ..." + if [[ -d ${MOONRAKER_DIR} ]] + then + status_msg "Moonraker already cloned, pulling recent changes ..." + git -C ${MOONRAKER_DIR} stash + git -C ${MOONRAKER_DIR} pull --ff-only + moonraker_clone_result="1" + return + fi + ### force remove existing moonraker dir and clone into fresh moonraker dir [[ -d ${MOONRAKER_DIR} ]] && rm -rf "${MOONRAKER_DIR}" @@ -234,6 +246,7 @@ function clone_moonraker() { print_error "Cloning Moonraker from\n ${repo}\n failed!" exit 1 fi + moonraker_clone_result="0" } function create_moonraker_conf() { @@ -566,7 +579,8 @@ function update_moonraker() { do_action_service "stop" "moonraker" if [[ ! -d ${MOONRAKER_DIR} ]]; then - clone_moonraker "${MOONRAKER_REPO}" + error_msg "Nothing to update, Moonraker directory doesn't exists! Please install Moonraker first." + return else backup_before_update "moonraker" status_msg "Updating Moonraker ..." -- 2.39.5 From 937ad4cffd94c455c3706e505a2725adea15486a Mon Sep 17 00:00:00 2001 From: coderus Date: Sat, 7 Jan 2023 17:32:33 +0100 Subject: [PATCH 09/25] refactor(utilities): get_data_folder function --- scripts/utilities.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/scripts/utilities.sh b/scripts/utilities.sh index 5c3a6ed..cf51ef5 100644 --- a/scripts/utilities.sh +++ b/scripts/utilities.sh @@ -641,6 +641,28 @@ function get_multi_instance_names() { echo "${instance_names[@]}" } +### +# helper function that returns klipper data directory +# path based on systemd service name. +# +# => return an empty string if klipper is not installed +# => return absolute config directory path +# +function get_data_folder() { + local service_name=${1} + local service_type=${2} + if [[ "${service_name}" == "${service_type}.service" ]]; then + echo "${HOME}/printer_data" + else + local instance_name=$(get_instance_name "${service_name}") + if [[ ${instance_name} =~ ^[0-9]+$ ]]; then + echo "${HOME}/printer_${instance_name}_data" + else + echo "${HOME}/${instance_name}_data" + fi + fi +} + ### # helper function that returns all possibly available absolute # klipper config directory paths based on their instance name. -- 2.39.5 From 2b53e005e6ca0f89b5a4ff47405d632e15c282a0 Mon Sep 17 00:00:00 2001 From: coderus Date: Sat, 7 Jan 2023 17:34:12 +0100 Subject: [PATCH 10/25] refactor(moonraker): funcs to get and print actual moonraker addressses with ports --- scripts/moonraker.sh | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/scripts/moonraker.sh b/scripts/moonraker.sh index 8edee1c..985cbea 100644 --- a/scripts/moonraker.sh +++ b/scripts/moonraker.sh @@ -398,6 +398,22 @@ function print_mr_ip_list() { done && echo } +function get_moonraker_address() { + local service=${1} + local printer_data=$(get_data_folder ${service} moonraker) + local ip=$(hostname -I | cut -d" " -f1) + local port=$(grep "^port:" "${printer_data}/config/moonraker.conf" | cut -f 2 -d " ") + echo "${ip}:${port}" +} + +function print_moonraker_addresses() { + local moonraker_services=$(moonraker_systemd) + for service in ${moonraker_services} + do + echo " ${cyan}● ${service}:${white} $(get_moonraker_address ${service})" + done +} + ### introduced due to ### https://github.com/Arksine/moonraker/issues/349 ### https://github.com/Arksine/moonraker/pull/346 -- 2.39.5 From 3071e1e037618efa4669a68c5f408000ea6e1469 Mon Sep 17 00:00:00 2001 From: coderus Date: Sat, 7 Jan 2023 17:36:52 +0100 Subject: [PATCH 11/25] refactor(moonraker): instance installation a bit messy commit, might require more polishing --- scripts/moonraker.sh | 218 ++++++++++++++++++++----------------------- 1 file changed, 101 insertions(+), 117 deletions(-) diff --git a/scripts/moonraker.sh b/scripts/moonraker.sh index 985cbea..aa650c0 100644 --- a/scripts/moonraker.sh +++ b/scripts/moonraker.sh @@ -49,14 +49,6 @@ function moonraker_setup_dialog() { ### return early if moonraker already exists local moonraker_services moonraker_services=$(moonraker_systemd) - if [[ -n ${moonraker_services} ]]; then - local error="At least one Moonraker service is already installed:" - for s in ${moonraker_services}; do - log_info "Found Moonraker service: ${s}" - error="${error}\n ➔ ${s}" - done - print_error "${error}" && return - fi ### return early if klipper is not installed local klipper_services @@ -67,53 +59,84 @@ function moonraker_setup_dialog() { print_error "${error}" && return fi - local klipper_count user_input=() klipper_names=() + local klipper_count user_input=() klipper_names=() moonraker_names=() klipper_count=$(echo "${klipper_services}" | wc -w ) for service in ${klipper_services}; do klipper_names+=( "$(get_instance_name "${service}")" ) done + for service in ${moonraker_services}; do + moonraker_names+=( "$(get_instance_name "${service}")" ) + done - local moonraker_count + local moonraker_count=$(echo "${moonraker_services}" | wc -w ) if (( klipper_count == 1 )); then ok_msg "Klipper installation found!\n" moonraker_count=1 elif (( klipper_count > 1 )); then top_border - printf "|${green}%-55s${white}|\n" " ${klipper_count} Klipper instances found!" - for name in "${klipper_names[@]}"; do - printf "|${cyan}%-57s${white}|\n" " ● klipper-${name}" + printf "|${green}%-55s${white}|\n" " ${moonraker_count} Moonraker services found!" + local moonraker_folders=() + for name in ${moonraker_services}; do + local moonraker_folder=$(get_data_folder $(basename ${name}) moonraker) + printf "|${cyan}%-57s${white}|\n" " ● $(basename ${name}) - $(get_moonraker_address $(basename ${name}))" + moonraker_folders+=( "${moonraker_folder}" ) done blank_line - echo -e "| The setup will apply the same names to Moonraker! |" - blank_line - echo -e "| Please select the number of Moonraker instances to |" - echo -e "| install. Usually one Moonraker instance per Klipper |" - echo -e "| instance is required, but you may not install more |" - echo -e "| Moonraker instances than available Klipper instances. |" + printf "|${green}%-55s${white}|\n" " ${klipper_count} Klipper services found!" + local klipper_available=() + for name in ${klipper_services}; do + local klipper_folder=$(get_data_folder $(basename ${name}) klipper) + printf "|${cyan}%-57s${white}|\n" " ● $(basename ${name}) - ${klipper_folder}" + if [[ ! " ${moonraker_folders[*]} " =~ " ${klipper_folder} " ]]; then + klipper_available+=( "${name}" ) + fi + done bottom_border + if [[ ${#klipper_available[@]} > 1 ]]; then + echo -e "\nSelect instance to install moonraker:" + echo " 0. Install all" + local i=1 + for name in "${klipper_available[@]}"; do + echo " ${i}. $(basename ${name})" + (( i=i+1 )) + done + echo - ### ask for amount of instances - local re="^[1-9][0-9]*$" - while [[ ! ${moonraker_count} =~ ${re} || ${moonraker_count} -gt ${klipper_count} ]]; do - read -p "${cyan}###### Number of Moonraker instances to set up:${white} " -i "${klipper_count}" -e moonraker_count - ### break if input is valid - [[ ${moonraker_count} =~ ${re} && ${moonraker_count} -le ${klipper_count} ]] && break - ### conditional error messages - [[ ! ${moonraker_count} =~ ${re} ]] && error_msg "Input not a number" - (( moonraker_count > klipper_count )) && error_msg "Number of Moonraker instances larger than installed Klipper instances" - done && select_msg "${moonraker_count}" + while true; do + read -p "Select: " -i "0" -e moonraker_count + if [[ $moonraker_count =~ ^[0-9]+$ ]] && [[ $moonraker_count -le ${#klipper_available[@]} ]]; then + break + else + error_msg "Invalid Input!" + fi + done + select_msg "${moonraker_count}" + if (( moonraker_count == 0 )); then + for service in "${klipper_available[@]}"; do + user_input+=( "$(basename ${service})" ) + done + else + user_input=( "$(basename ${klipper_available[(( moonraker_count-1 ))]})" ) + fi + elif [[ ${#klipper_available[@]} == 0 ]]; then + printf "|${red}%-55s${white}|\n" "Moonraker already installed for every Klipper instance!" + echo + return + else + echo -e "\nMoonraker will be installed for $(basename ${klipper_available[0]}) instance" + moonraker_count=1 + user_input=( "$(basename ${klipper_available[0]})" ) + fi else log_error "Internal error. klipper_count of '${klipper_count}' not equal or grather than one!" return 1 fi - user_input+=("${moonraker_count}") - ### confirm instance amount local yn while true; do - (( moonraker_count == 1 )) && local question="Install Moonraker?" - (( moonraker_count > 1 )) && local question="Install ${moonraker_count} Moonraker instances?" + (( moonraker_count == 0 )) && local question="Install Moonraker for all available instances?" + [[ ${#user_input[@]} == 1 ]] && local question="Install Moonraker for $(basename ${user_input[0]}) instance?" read -p "${cyan}###### ${question} (Y/n):${white} " yn case "${yn}" in Y|y|Yes|yes|"") @@ -129,13 +152,11 @@ function moonraker_setup_dialog() { done ### write existing klipper names into user_input array to use them as names for moonraker - if (( klipper_count > 1 )); then - for name in "${klipper_names[@]}"; do - user_input+=("${name}") - done - fi + for name in ${klipper_services}; do + user_input+=("$(basename ${name})") + done - (( moonraker_count > 1 )) && status_msg "Installing ${moonraker_count} Moonraker instances ..." + (( moonraker_count > 0 )) && status_msg "Installing Moonraker for $(basename ${klipper_available[(( moonraker_count-1 ))]}) instance ..." (( moonraker_count == 1 )) && status_msg "Installing Moonraker ..." moonraker_setup "${user_input[@]}" } @@ -219,9 +240,10 @@ function moonraker_setup() { ### confirm message local confirm="" - (( instance_arr[0] == 1 )) && confirm="Moonraker has been set up!" - (( instance_arr[0] > 1 )) && confirm="${instance_arr[0]} Moonraker instances have been set up!" - print_confirm "${confirm}" && print_mr_ip_list "${instance_arr[0]}" && return + (( ${#instance_arr[@]} == 1 )) && confirm="Moonraker has been set up!" + (( ${#instance_arr[@]} > 1 )) && confirm="${#instance_arr[@]} Moonraker instances have been set up!" + print_confirm "${confirm}" + print_moonraker_addresses } function clone_moonraker() { @@ -250,47 +272,28 @@ function clone_moonraker() { } function create_moonraker_conf() { - local input=("${@}") - local moonraker_count=${input[0]} && unset "input[0]" - local names=("${input[@]}") && unset "input[@]" + local names=("${@}") + local moonraker_count=${#names[@]} local port lan printer_data cfg_dir cfg uds port=7125 lan="$(hostname -I | cut -d" " -f1 | cut -d"." -f1-2).0.0/16" - if (( moonraker_count == 1 )); then - printer_data="${HOME}/printer_data" + local j=0 re="^[1-9][0-9]*$" + + for (( i=1; i <= moonraker_count; i++ )); do + ### overwrite config folder if name is only a number + printer_data=$(get_data_folder "${names[$j]}" "klipper") + cfg_dir="${printer_data}/config" cfg="${cfg_dir}/moonraker.conf" uds="${printer_data}/comms/klippy.sock" - ### write single instance config + ### write multi instance config write_moonraker_conf "${cfg_dir}" "${cfg}" "${port}" "${uds}" "${lan}" - - elif (( moonraker_count > 1 )); then - local j=0 re="^[1-9][0-9]*$" - - for (( i=1; i <= moonraker_count; i++ )); do - ### overwrite config folder if name is only a number - if [[ ${names[j]} =~ ${re} ]]; then - printer_data="${HOME}/printer_${names[${j}]}_data" - else - printer_data="${HOME}/${names[${j}]}_data" - fi - - cfg_dir="${printer_data}/config" - cfg="${cfg_dir}/moonraker.conf" - uds="${printer_data}/comms/klippy.sock" - - ### write multi instance config - write_moonraker_conf "${cfg_dir}" "${cfg}" "${port}" "${uds}" "${lan}" - port=$(( port + 1 )) - j=$(( j + 1 )) - done && unset j - - else - return 1 - fi + port=$(( port + 1 )) + j=$(( j + 1 )) + done && unset j } function write_moonraker_conf() { @@ -317,56 +320,37 @@ function write_moonraker_conf() { } function configure_moonraker_service() { - local input=("${@}") - local moonraker_count=${input[0]} && unset "input[0]" - local names=("${input[@]}") && unset "input[@]" - local printer_data cfg_dir service env_file + local names=("${@}") + local moonraker_count=${#names[@]} + local printer_data cfg_dir service env_file instance_name service_name + + local j=0 re="^[1-9][0-9]*$" + + for (( i=1; i <= moonraker_count; i++ )); do + printer_data=$(get_data_folder "${names[$j]}" "klipper") + instance_name=$(get_instance_name "${names[$j]}") - if (( moonraker_count == 1 )) && [[ ${#names[@]} -eq 0 ]]; then - i="" - printer_data="${HOME}/printer_data" cfg_dir="${printer_data}/config" - service="${SYSTEMD}/moonraker.service" + if [[ "${instance_name}" == "klipper" ]]; then + service_name="moonraker.service" + else + service_name="moonraker-${instance_name}.service" + fi + service="${SYSTEMD}/${service_name}" env_file="${printer_data}/systemd/moonraker.env" ### create required folder structure create_required_folders "${printer_data}" - ### write single instance service - write_moonraker_service "" "${printer_data}" "${service}" "${env_file}" - ok_msg "Moonraker instance created!" + ### write multi instance service + write_moonraker_service "${service_name}" "${printer_data}" "${service}" "${env_file}" + ok_msg "Moonraker instance '${service_name}' created!" + j=$(( j + 1 )) + done && unset i - elif (( moonraker_count > 1 )) && [[ ${#names[@]} -gt 0 ]]; then - local j=0 re="^[1-9][0-9]*$" - - for (( i=1; i <= moonraker_count; i++ )); do - ### overwrite config folder if name is only a number - if [[ ${names[j]} =~ ${re} ]]; then - printer_data="${HOME}/printer_${names[${j}]}_data" - else - printer_data="${HOME}/${names[${j}]}_data" - fi - - cfg_dir="${printer_data}/config" - service="${SYSTEMD}/moonraker-${names[${j}]}.service" - env_file="${printer_data}/systemd/moonraker.env" - - ### create required folder structure - create_required_folders "${printer_data}" - - ### write multi instance service - write_moonraker_service "${names[${j}]}" "${printer_data}" "${service}" "${env_file}" - ok_msg "Moonraker instance 'moonraker-${names[${j}]}' created!" - j=$(( j + 1 )) - done && unset i - - ### enable mainsails remoteMode if mainsail is found - if [[ -d ${MAINSAIL_DIR} ]]; then - enable_mainsail_remotemode - fi - - else - return 1 + ### enable mainsails remoteMode if mainsail is found + if [[ -d ${MAINSAIL_DIR} ]]; then + enable_mainsail_remotemode fi } @@ -374,6 +358,7 @@ function write_moonraker_service() { local i=${1} printer_data=${2} service=${3} env_file=${4} local service_template="${KIAUH_SRCDIR}/resources/moonraker.service" local env_template="${KIAUH_SRCDIR}/resources/moonraker.env" + local instance_name=$(get_instance_name "${i}") ### replace all placeholders if [[ ! -f ${service} ]]; then @@ -381,8 +366,7 @@ function write_moonraker_service() { sudo cp "${service_template}" "${service}" sudo cp "${env_template}" "${env_file}" - [[ -z ${i} ]] && sudo sed -i "s| %INST%||" "${service}" - [[ -n ${i} ]] && sudo sed -i "s|%INST%|${i}|" "${service}" + sudo sed -i "s|%INST%|${instance_name}|" "${service}" sudo sed -i "s|%USER%|${USER}|g; s|%ENV%|${MOONRAKER_ENV}|; s|%ENV_FILE%|${env_file}|" "${service}" sudo sed -i "s|%USER%|${USER}|; s|%PRINTER_DATA%|${printer_data}|" "${env_file}" fi -- 2.39.5 From 57e7b476faea9c5fdbfc58a810596a243cb9ca40 Mon Sep 17 00:00:00 2001 From: coderus Date: Sat, 7 Jan 2023 20:39:12 +0100 Subject: [PATCH 12/25] refactor(moonraker): install/remove single instances --- scripts/moonraker.sh | 184 ++++++++++++++++++++++++++++++------------- 1 file changed, 129 insertions(+), 55 deletions(-) diff --git a/scripts/moonraker.sh b/scripts/moonraker.sh index aa650c0..8b427ce 100644 --- a/scripts/moonraker.sh +++ b/scripts/moonraker.sh @@ -103,14 +103,13 @@ function moonraker_setup_dialog() { echo while true; do - read -p "Select: " -i "0" -e moonraker_count + read -p "Select: " moonraker_count if [[ $moonraker_count =~ ^[0-9]+$ ]] && [[ $moonraker_count -le ${#klipper_available[@]} ]]; then break else error_msg "Invalid Input!" fi done - select_msg "${moonraker_count}" if (( moonraker_count == 0 )); then for service in "${klipper_available[@]}"; do user_input+=( "$(basename ${service})" ) @@ -132,6 +131,10 @@ function moonraker_setup_dialog() { return 1 fi + for i in ${user_input[@]}; do + select_msg "${i}" + done + ### confirm instance amount local yn while true; do @@ -151,11 +154,6 @@ function moonraker_setup_dialog() { esac done - ### write existing klipper names into user_input array to use them as names for moonraker - for name in ${klipper_services}; do - user_input+=("$(basename ${name})") - done - (( moonraker_count > 0 )) && status_msg "Installing Moonraker for $(basename ${klipper_available[(( moonraker_count-1 ))]}) instance ..." (( moonraker_count == 1 )) && status_msg "Installing Moonraker ..." moonraker_setup "${user_input[@]}" @@ -274,16 +272,14 @@ function clone_moonraker() { function create_moonraker_conf() { local names=("${@}") local moonraker_count=${#names[@]} - local port lan printer_data cfg_dir cfg uds + local lan printer_data cfg_dir cfg uds + local port=$(get_moonraker_next_port) - port=7125 lan="$(hostname -I | cut -d" " -f1 | cut -d"." -f1-2).0.0/16" - local j=0 re="^[1-9][0-9]*$" - - for (( i=1; i <= moonraker_count; i++ )); do + for service in "${names[@]}"; do ### overwrite config folder if name is only a number - printer_data=$(get_data_folder "${names[$j]}" "klipper") + printer_data=$(get_data_folder "${service}" "klipper") cfg_dir="${printer_data}/config" cfg="${cfg_dir}/moonraker.conf" @@ -291,8 +287,7 @@ function create_moonraker_conf() { ### write multi instance config write_moonraker_conf "${cfg_dir}" "${cfg}" "${port}" "${uds}" "${lan}" - port=$(( port + 1 )) - j=$(( j + 1 )) + (( port=port+1 )) done && unset j } @@ -324,11 +319,9 @@ function configure_moonraker_service() { local moonraker_count=${#names[@]} local printer_data cfg_dir service env_file instance_name service_name - local j=0 re="^[1-9][0-9]*$" - - for (( i=1; i <= moonraker_count; i++ )); do - printer_data=$(get_data_folder "${names[$j]}" "klipper") - instance_name=$(get_instance_name "${names[$j]}") + for service in "${names[@]}"; do + printer_data=$(get_data_folder "${service}" "klipper") + instance_name=$(get_instance_name "${service}") cfg_dir="${printer_data}/config" if [[ "${instance_name}" == "klipper" ]]; then @@ -345,7 +338,6 @@ function configure_moonraker_service() { ### write multi instance service write_moonraker_service "${service_name}" "${printer_data}" "${service}" "${env_file}" ok_msg "Moonraker instance '${service_name}' created!" - j=$(( j + 1 )) done && unset i ### enable mainsails remoteMode if mainsail is found @@ -382,19 +374,42 @@ function print_mr_ip_list() { done && echo } -function get_moonraker_address() { +function get_moonraker_next_port() { + local port=7125 + local moonraker_services=$(moonraker_systemd) moonraker_ports=() + for service in ${moonraker_services} + do + service_name=$(basename ${service}) + moonraker_ports+=( "$(get_moonraker_port ${service_name})" ) + done + while true; do + if [[ ! " ${moonraker_ports[*]} " =~ " ${port} " ]]; then + break + fi + (( port=port+1 )) + done + echo "${port}" +} + +function get_moonraker_port() { local service=${1} local printer_data=$(get_data_folder ${service} moonraker) - local ip=$(hostname -I | cut -d" " -f1) local port=$(grep "^port:" "${printer_data}/config/moonraker.conf" | cut -f 2 -d " ") + echo "${port}" +} + +function get_moonraker_address() { + local ip=$(hostname -I | cut -d" " -f1) + local port=$(get_moonraker_port ${1}) echo "${ip}:${port}" } function print_moonraker_addresses() { - local moonraker_services=$(moonraker_systemd) + local service_name moonraker_services=$(moonraker_systemd) for service in ${moonraker_services} do - echo " ${cyan}● ${service}:${white} $(get_moonraker_address ${service})" + service_name=$(basename ${service}) + echo " ${cyan}● ${service_name}:${white} $(get_moonraker_address ${service_name})" done } @@ -459,11 +474,9 @@ function remove_moonraker_sysvinit() { } function remove_moonraker_systemd() { - [[ -z $(moonraker_systemd) ]] && return - status_msg "Removing Moonraker Systemd Services ..." - for service in $(moonraker_systemd | cut -d"/" -f5); do + for service in "${@}"; do status_msg "Removing ${service} ..." sudo systemctl stop "${service}" sudo systemctl disable "${service}" @@ -478,29 +491,25 @@ function remove_moonraker_systemd() { } function remove_moonraker_env_file() { - local files regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/systemd\/moonraker\.env" - files=$(find "${HOME}" -maxdepth 3 -regextype posix-extended -regex "${regex}" | sort) - - if [[ -n ${files} ]]; then - for file in ${files}; do - status_msg "Removing ${file} ..." - rm -f "${file}" - ok_msg "${file} removed!" - done - fi + local printer_data file + for service in "${@}"; do + printer_data=$(get_data_folder ${service} moonraker) + file="${HOME}/${printer_data}/systemd/moonraker.env" + status_msg "Removing ${file} ..." + rm -f "${file}" + ok_msg "${file} removed!" + done } function remove_moonraker_logs() { - local files regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/logs\/moonraker\.log.*" - files=$(find "${HOME}" -maxdepth 3 -regextype posix-extended -regex "${regex}" | sort) - - if [[ -n ${files} ]]; then - for file in ${files}; do - status_msg "Removing ${file} ..." - rm -f "${file}" - ok_msg "${file} removed!" - done - fi + local printer_data file + for service in "${@}"; do + printer_data=$(get_data_folder ${service} moonraker) + file="${HOME}/${printer_data}/systemd/moonraker.log"* + status_msg "Removing ${file} ..." + rm -f "${file}" + ok_msg "${file} removed!" + done } function remove_legacy_moonraker_logs() { @@ -558,14 +567,79 @@ function remove_moonraker_polkit() { function remove_moonraker() { remove_moonraker_sysvinit - remove_moonraker_systemd - remove_moonraker_env_file - remove_moonraker_logs + + local moonraker_services=$(moonraker_systemd) + if [[ -z ${moonraker_services} ]]; then + print_error "Moonraker not installed, nothing to do!" + return + fi + + local moonraker_services_count="$(moonraker_systemd | wc -w)" + if (( moonraker_services_count == 1 )); then + echo hi + else + echo "Select Moonraker service to remove:" + echo " 0. Remove all" + local i=1 moonraker_names=() service_name + for name in ${moonraker_services}; do + service_name=$(basename ${name}) + echo " ${i}. ${service_name}" + moonraker_names+=( "${service_name}" ) + (( i=i+1 )) + done + + while true; do + read -p "Select: " moonraker_count + if [[ $moonraker_count =~ ^[0-9]+$ ]]; then + break + else + error_msg "Invalid Input!" + fi + done + + local user_input=() + if (( moonraker_count == 0 )); then + user_input=( ${moonraker_names[@]} ) + else + user_input=( "${moonraker_names[(( moonraker_count-1 ))]}" ) + fi + + for i in ${user_input[@]}; do + select_msg "${i}" + done + + ### confirm instance amount + local yn + while true; do + (( moonraker_count == 0 )) && local question="Remove all Moonraker instances?" + [[ ${#user_input[@]} == 1 ]] && local question="Remove Moonraker $(basename ${user_input[0]}) instance?" + read -p "${cyan}###### ${question} (Y/n):${white} " yn + case "${yn}" in + Y|y|Yes|yes|"") + select_msg "Yes" + break;; + N|n|No|no) + select_msg "No" + abort_msg "Exiting Moonraker setup ...\n" + return;; + *) + error_msg "Invalid Input!";; + esac + done + fi + + remove_moonraker_systemd "${user_input[@]}" + remove_moonraker_env_file "${user_input[@]}" + remove_moonraker_logs "${user_input[@]}" + remove_legacy_moonraker_logs - remove_moonraker_api_key - remove_moonraker_polkit - remove_moonraker_dir - remove_moonraker_env + + if (( ${moonraker_services_count} == 1 || ${moonraker_count} == 0 )); then + remove_moonraker_api_key + remove_moonraker_polkit + remove_moonraker_dir + remove_moonraker_env + fi print_confirm "Moonraker was successfully removed!" return -- 2.39.5 From 26d27a03ec8ba8300ca4e32b1ac0427f2c8cbc89 Mon Sep 17 00:00:00 2001 From: coderus Date: Sat, 7 Jan 2023 20:48:22 +0100 Subject: [PATCH 13/25] fix(moonraker): remove single instance --- scripts/moonraker.sh | 41 +++++++++++++++++++++-------------------- 1 file changed, 21 insertions(+), 20 deletions(-) diff --git a/scripts/moonraker.sh b/scripts/moonraker.sh index 8b427ce..35e3f12 100644 --- a/scripts/moonraker.sh +++ b/scripts/moonraker.sh @@ -576,7 +576,7 @@ function remove_moonraker() { local moonraker_services_count="$(moonraker_systemd | wc -w)" if (( moonraker_services_count == 1 )); then - echo hi + user_input=( "$(basename ${moonraker_services})" ) else echo "Select Moonraker service to remove:" echo " 0. Remove all" @@ -607,27 +607,28 @@ function remove_moonraker() { for i in ${user_input[@]}; do select_msg "${i}" done - - ### confirm instance amount - local yn - while true; do - (( moonraker_count == 0 )) && local question="Remove all Moonraker instances?" - [[ ${#user_input[@]} == 1 ]] && local question="Remove Moonraker $(basename ${user_input[0]}) instance?" - read -p "${cyan}###### ${question} (Y/n):${white} " yn - case "${yn}" in - Y|y|Yes|yes|"") - select_msg "Yes" - break;; - N|n|No|no) - select_msg "No" - abort_msg "Exiting Moonraker setup ...\n" - return;; - *) - error_msg "Invalid Input!";; - esac - done fi + ### confirm instance amount + local yn + while true; do + (( moonraker_services_count == 1 )) && local question="Remove Moonraker?" + [[ "${moonraker_count}" == "0" ]] && local question="Remove all Moonraker instances?" + (( moonraker_count > 0 )) && [[ ${#user_input[@]} == 1 ]] && local question="Remove Moonraker $(basename ${user_input[0]}) instance?" + read -p "${cyan}###### ${question} (Y/n):${white} " yn + case "${yn}" in + Y|y|Yes|yes|"") + select_msg "Yes" + break;; + N|n|No|no) + select_msg "No" + abort_msg "Exiting Moonraker setup ...\n" + return;; + *) + error_msg "Invalid Input!";; + esac + done + remove_moonraker_systemd "${user_input[@]}" remove_moonraker_env_file "${user_input[@]}" remove_moonraker_logs "${user_input[@]}" -- 2.39.5 From d02fc2e01fa1f6a7db6bad39e80e7b704eeae05d Mon Sep 17 00:00:00 2001 From: coderus Date: Sun, 8 Jan 2023 00:13:00 +0100 Subject: [PATCH 14/25] refactor(klipper): refactor UI dialogs --- scripts/klipper.sh | 120 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 98 insertions(+), 22 deletions(-) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index 3a81bf4..febce27 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -424,28 +424,25 @@ function write_example_printer_cfg() { #================================================# function remove_klipper_service() { - if [[ ! -e "${INITD}/klipper" ]] && [[ -z $(find_klipper_systemd) ]]; then - return - fi - status_msg "Removing Klipper services ..." if [[ -e "${INITD}/klipper" ]]; then sudo systemctl stop klipper sudo update-rc.d -f klipper remove sudo rm -f "${INITD}/klipper" "${ETCDEF}/klipper" - else - for service in $(find_klipper_systemd | cut -d"/" -f5); do - status_msg "Removing ${service} ..." - sudo systemctl stop "${service}" - sudo systemctl disable "${service}" - sudo rm -f "${SYSTEMD}/${service}" - sudo systemctl daemon-reload - sudo systemctl reset-failed - done fi - ok_msg "All Klipper services removed!" + for service in "${@}"; do + status_msg "Removing ${service} ..." + sudo systemctl stop "${service}" + sudo systemctl disable "${service}" + sudo rm -f "${SYSTEMD}/${service}" + done + + sudo systemctl daemon-reload + sudo systemctl reset-failed + + ok_msg "Selected Klipper services removed!" } function find_instance_files() { @@ -513,19 +510,98 @@ function remove_files() { fi } -function remove_klipper() { - remove_klipper_service - remove_files "$(find_instance_files "systemd" "klipper.env")" - remove_files "$(find_instance_files "logs" "klippy.log.*")" - remove_files "$(find_instance_files "comms" "klippy.sock")" - remove_files "$(find_instance_files "comms" "klippy.serial")" +function remove_klipper_files() { + status_msg "Removing Klipper files ..." + local printer_data file + + for service in "${@}"; do + printer_data=$(get_data_folder ${service} klipper) + + file="${printer_data}/systemd/klipper.env" + status_msg "Removing ${file} ..." + sudo rm -f ${file} + ok_msg "${file} removed!" + + file="${printer_data}/logs/klipper.lo"* + status_msg "Removing ${file} ..." + rm -f ${file} + ok_msg "${file} removed!" + + file="${printer_data}/comms/klippy.sock" + status_msg "Removing ${file} ..." + rm -f ${file} + ok_msg "${file} removed!" + + file="${printer_data}/comms/klippy.serial" + status_msg "Removing ${file} ..." + rm -f ${file} + ok_msg "${file} removed!" + done + + ok_msg "Files removed!" +} + +function remove_klipper() { remove_files "$(find_legacy_klipper_logs)" remove_files "$(find_legacy_klipper_uds)" remove_files "$(find_legacy_klipper_printer)" - remove_klipper_dir - remove_klipper_env + local klipper_systemd_services=$(find_klipper_systemd) + if [[ -z ${klipper_systemd_services} ]]; then + print_error "Klipper not installed, nothing to do!" + return + fi + + top_border + echo -e "| ${red}~~~~~~~~ [ Klipper instance remover ] ~~~~~~~${white} |" + hr + + local user_input=() klipper_names=() + local klipper_services_count="$(find_klipper_systemd | wc -w)" + if (( klipper_services_count == 1 )); then + service_name=$(basename ${klipper_systemd_services}) + klipper_names+=( "${service_name}" ) + printf "| 0) %-51s|\n" "${service_name}" + else + printf "| 0) %-51s|\n" "Remove all" + local i=1 service_name + for name in ${klipper_systemd_services}; do + service_name=$(basename ${name}) + klipper_names+=( "${service_name}" ) + printf "| ${i}) %-51s|\n" "${service_name}" + (( i=i+1 )) + done + fi + back_footer + + local option + while true; do + read -p "${cyan}Remove Klipper instance:${white} " option + if [[ ${option} == "B" || ${option} == "b" ]]; then + return + elif [[ $((option)) != $option ]]; then + error_msg "Invalid command!" + elif (( option >= 0 && option < ${#klipper_names[@]} )); then + break + else + error_msg "Invalid command!" + fi + done + + if (( option == 0 )); then + user_input=( ${klipper_names[@]} ) + else + user_input=( "${klipper_names[(( option-1 ))]}" ) + fi + + remove_klipper_service "${user_input[@]}" + remove_klipper_files "${user_input[@]}" + + if (( ${klipper_services_count} == 1 )) || [[ "${klipper_count}" == "0" ]]; then + remove_klipper_dir + remove_klipper_env + fi print_confirm "Klipper was successfully removed!" && return } -- 2.39.5 From 00a3fbe43bda8671f0b70ff0cf4d38953fe27255 Mon Sep 17 00:00:00 2001 From: coderus Date: Sun, 8 Jan 2023 00:13:05 +0100 Subject: [PATCH 15/25] refactor(moonraker): refactor UI dialogs --- scripts/moonraker.sh | 274 ++++++++++++++++++------------------------- 1 file changed, 115 insertions(+), 159 deletions(-) diff --git a/scripts/moonraker.sh b/scripts/moonraker.sh index 35e3f12..46e157e 100644 --- a/scripts/moonraker.sh +++ b/scripts/moonraker.sh @@ -37,8 +37,7 @@ function moonraker_systemd() { } function moonraker_setup_dialog() { - status_msg "Initializing Moonraker installation ..." - + print_moonraker_addresses ### return early if python version check fails if [[ $(python3_check) == "false" ]]; then local error="Versioncheck failed! Python 3.7 or newer required!\n" @@ -46,116 +45,85 @@ function moonraker_setup_dialog() { print_error "${error}" && return fi - ### return early if moonraker already exists - local moonraker_services - moonraker_services=$(moonraker_systemd) + local klipper_services=$(find_klipper_systemd) + local klipper_count=$(echo "${klipper_services}" | wc -w ) + for service in ${klipper_services}; do + klipper_names+=( "$(get_instance_name "${service}")" ) + done + + local moonraker_services=$(moonraker_systemd) + local moonraker_count=$(echo "${moonraker_services}" | wc -w ) + for service in ${moonraker_services}; do + moonraker_names+=( "$(get_instance_name "${service}")" ) + done ### return early if klipper is not installed - local klipper_services - klipper_services=$(find_klipper_systemd) if [[ -z ${klipper_services} ]]; then local error="Klipper not installed! Please install Klipper first!" log_error "Moonraker setup started without Klipper being installed. Aborting setup." print_error "${error}" && return fi - local klipper_count user_input=() klipper_names=() moonraker_names=() - klipper_count=$(echo "${klipper_services}" | wc -w ) - for service in ${klipper_services}; do - klipper_names+=( "$(get_instance_name "${service}")" ) - done - for service in ${moonraker_services}; do - moonraker_names+=( "$(get_instance_name "${service}")" ) - done + top_border + echo -e "| ${red}~~~~~~~~~ [ Moonraker installation ] ~~~~~~~~${white} |" + hr - local moonraker_count=$(echo "${moonraker_services}" | wc -w ) - if (( klipper_count == 1 )); then - ok_msg "Klipper installation found!\n" - moonraker_count=1 - elif (( klipper_count > 1 )); then - top_border - printf "|${green}%-55s${white}|\n" " ${moonraker_count} Moonraker services found!" - local moonraker_folders=() - for name in ${moonraker_services}; do - local moonraker_folder=$(get_data_folder $(basename ${name}) moonraker) - printf "|${cyan}%-57s${white}|\n" " ● $(basename ${name}) - $(get_moonraker_address $(basename ${name}))" - moonraker_folders+=( "${moonraker_folder}" ) - done - blank_line - printf "|${green}%-55s${white}|\n" " ${klipper_count} Klipper services found!" - local klipper_available=() - for name in ${klipper_services}; do - local klipper_folder=$(get_data_folder $(basename ${name}) klipper) - printf "|${cyan}%-57s${white}|\n" " ● $(basename ${name}) - ${klipper_folder}" - if [[ ! " ${moonraker_folders[*]} " =~ " ${klipper_folder} " ]]; then - klipper_available+=( "${name}" ) - fi - done - bottom_border - if [[ ${#klipper_available[@]} > 1 ]]; then - echo -e "\nSelect instance to install moonraker:" - echo " 0. Install all" - local i=1 - for name in "${klipper_available[@]}"; do - echo " ${i}. $(basename ${name})" - (( i=i+1 )) - done - echo - - while true; do - read -p "Select: " moonraker_count - if [[ $moonraker_count =~ ^[0-9]+$ ]] && [[ $moonraker_count -le ${#klipper_available[@]} ]]; then - break - else - error_msg "Invalid Input!" - fi - done - if (( moonraker_count == 0 )); then - for service in "${klipper_available[@]}"; do - user_input+=( "$(basename ${service})" ) - done - else - user_input=( "$(basename ${klipper_available[(( moonraker_count-1 ))]})" ) - fi - elif [[ ${#klipper_available[@]} == 0 ]]; then - printf "|${red}%-55s${white}|\n" "Moonraker already installed for every Klipper instance!" - echo - return - else - echo -e "\nMoonraker will be installed for $(basename ${klipper_available[0]}) instance" - moonraker_count=1 - user_input=( "$(basename ${klipper_available[0]})" ) + printf "|${green}%-55s${white}|\n" " ${moonraker_count} Moonraker services found!" + local moonraker_folders=() + for name in ${moonraker_services}; do + local moonraker_folder=$(get_data_folder $(basename ${name}) moonraker) + printf "|${cyan}%-57s${white}|\n" " ● $(basename ${name}) - $(get_moonraker_address $(basename ${name}))" + moonraker_folders+=( "${moonraker_folder}" ) + done + blank_line + printf "|${green}%-55s${white}|\n" " ${klipper_count} Klipper services found!" + local klipper_available=() + for name in ${klipper_services}; do + local klipper_folder=$(get_data_folder $(basename ${name}) klipper) + printf "|${cyan}%-57s${white}|\n" " ● $(basename ${name}) - ${klipper_folder}" + if [[ ! " ${moonraker_folders[*]} " =~ " ${klipper_folder} " ]]; then + klipper_available+=( "$(basename ${name})" ) fi + done + local klipper_available_count=${#klipper_available[@]} + hr + + printf "|${green}%-55s${white}|\n" " ${klipper_available_count} Moonraker services can be installed:" + local service_name + if (( klipper_available_count == 1 )); then + service_name=$(basename "${klipper_available[@]}") + printf "| 0) %-51s|\n" "${service_name}" else - log_error "Internal error. klipper_count of '${klipper_count}' not equal or grather than one!" - return 1 + printf "| 0) %-51s|\n" "Install all" + local i=1 + for name in "${klipper_available[@]}"; do + printf "| ${i}) %-51s|\n" "${name}" + (( i=i+1 )) + done + fi + back_footer + + local option + while true; do + read -p "${cyan}Install moonraker for:${white} " option + if [[ ${option} == "B" || ${option} == "b" ]]; then + return + elif [[ $((option)) != $option ]]; then + error_msg "Invalid command!" + elif (( option >= 0 && option < ${#klipper_available[@]} )); then + break + else + error_msg "Invalid command!" + fi + done + + if (( option == 0 )); then + user_input=( ${klipper_available[@]} ) + else + user_input=( "${klipper_available[(( option-1 ))]}" ) fi - for i in ${user_input[@]}; do - select_msg "${i}" - done - - ### confirm instance amount - local yn - while true; do - (( moonraker_count == 0 )) && local question="Install Moonraker for all available instances?" - [[ ${#user_input[@]} == 1 ]] && local question="Install Moonraker for $(basename ${user_input[0]}) instance?" - read -p "${cyan}###### ${question} (Y/n):${white} " yn - case "${yn}" in - Y|y|Yes|yes|"") - select_msg "Yes" - break;; - N|n|No|no) - select_msg "No" - abort_msg "Exiting Moonraker setup ...\n" - return;; - *) - error_msg "Invalid Input!";; - esac - done - - (( moonraker_count > 0 )) && status_msg "Installing Moonraker for $(basename ${klipper_available[(( moonraker_count-1 ))]}) instance ..." - (( moonraker_count == 1 )) && status_msg "Installing Moonraker ..." + status_msg "Installing Moonraker ..." moonraker_setup "${user_input[@]}" } @@ -317,18 +285,13 @@ function write_moonraker_conf() { function configure_moonraker_service() { local names=("${@}") local moonraker_count=${#names[@]} - local printer_data cfg_dir service env_file instance_name service_name + local printer_data cfg_dir service env_file service_name for service in "${names[@]}"; do printer_data=$(get_data_folder "${service}" "klipper") - instance_name=$(get_instance_name "${service}") cfg_dir="${printer_data}/config" - if [[ "${instance_name}" == "klipper" ]]; then - service_name="moonraker.service" - else - service_name="moonraker-${instance_name}.service" - fi + service_name="${service/"klipper"/"moonraker"}" service="${SYSTEMD}/${service_name}" env_file="${printer_data}/systemd/moonraker.env" @@ -494,7 +457,7 @@ function remove_moonraker_env_file() { local printer_data file for service in "${@}"; do printer_data=$(get_data_folder ${service} moonraker) - file="${HOME}/${printer_data}/systemd/moonraker.env" + file="${printer_data}/systemd/moonraker.env" status_msg "Removing ${file} ..." rm -f "${file}" ok_msg "${file} removed!" @@ -505,7 +468,7 @@ function remove_moonraker_logs() { local printer_data file for service in "${@}"; do printer_data=$(get_data_folder ${service} moonraker) - file="${HOME}/${printer_data}/systemd/moonraker.log"* + file="${printer_data}/systemd/moonraker.lo"* status_msg "Removing ${file} ..." rm -f "${file}" ok_msg "${file} removed!" @@ -574,68 +537,61 @@ function remove_moonraker() { return fi - local moonraker_services_count="$(moonraker_systemd | wc -w)" - if (( moonraker_services_count == 1 )); then - user_input=( "$(basename ${moonraker_services})" ) - else - echo "Select Moonraker service to remove:" - echo " 0. Remove all" - local i=1 moonraker_names=() service_name - for name in ${moonraker_services}; do - service_name=$(basename ${name}) - echo " ${i}. ${service_name}" - moonraker_names+=( "${service_name}" ) - (( i=i+1 )) - done - - while true; do - read -p "Select: " moonraker_count - if [[ $moonraker_count =~ ^[0-9]+$ ]]; then - break - else - error_msg "Invalid Input!" - fi - done - - local user_input=() - if (( moonraker_count == 0 )); then - user_input=( ${moonraker_names[@]} ) - else - user_input=( "${moonraker_names[(( moonraker_count-1 ))]}" ) - fi - - for i in ${user_input[@]}; do - select_msg "${i}" - done + local moonraker_services=$(moonraker_systemd) + if [[ -z ${moonraker_services} ]]; then + print_error "Moonraker not installed, nothing to do!" + return fi - ### confirm instance amount - local yn + top_border + echo -e "| ${red}~~~~~~~ [ Moonraker instance remover ] ~~~~~~${white} |" + hr + + local user_input=() moonraker_names=() + local moonraker_services_count="$(moonraker_systemd | wc -w)" + if (( moonraker_services_count == 1 )); then + service_name=$(basename ${moonraker_services}) + moonraker_names+=( "${service_name}" ) + printf "| 0) %-51s|\n" "${service_name}" + else + printf "| 0) %-51s|\n" "Remove all" + local i=1 service_name + for name in ${moonraker_services}; do + service_name=$(basename ${name}) + moonraker_names+=( "${service_name}" ) + printf "| ${i}) %-51s|\n" "${service_name}" + (( i=i+1 )) + done + fi + back_footer + + local option while true; do - (( moonraker_services_count == 1 )) && local question="Remove Moonraker?" - [[ "${moonraker_count}" == "0" ]] && local question="Remove all Moonraker instances?" - (( moonraker_count > 0 )) && [[ ${#user_input[@]} == 1 ]] && local question="Remove Moonraker $(basename ${user_input[0]}) instance?" - read -p "${cyan}###### ${question} (Y/n):${white} " yn - case "${yn}" in - Y|y|Yes|yes|"") - select_msg "Yes" - break;; - N|n|No|no) - select_msg "No" - abort_msg "Exiting Moonraker setup ...\n" - return;; - *) - error_msg "Invalid Input!";; - esac + read -p "${cyan}Remove Moonraker instance:${white} " option + if [[ ${option} == "B" || ${option} == "b" ]]; then + return + elif [[ $((option)) != $option ]]; then + error_msg "Invalid command!" + elif (( option >= 0 && option < ${#moonraker_names[@]} )); then + break + else + error_msg "Invalid command!" + fi done + if (( option == 0 )); then + user_input=( ${moonraker_names[@]} ) + else + user_input=( "${moonraker_names[(( option-1 ))]}" ) + fi + remove_moonraker_systemd "${user_input[@]}" remove_moonraker_env_file "${user_input[@]}" remove_moonraker_logs "${user_input[@]}" remove_legacy_moonraker_logs - if (( ${moonraker_services_count} == 1 || ${moonraker_count} == 0 )); then + if (( ${moonraker_services_count} == 1 )) || [[ "${moonraker_count}" == "0" ]]; then remove_moonraker_api_key remove_moonraker_polkit remove_moonraker_dir -- 2.39.5 From 7c1c1d8f21212342e7fd73158782b7970dd2cae7 Mon Sep 17 00:00:00 2001 From: coderus Date: Sun, 8 Jan 2023 16:36:46 +0100 Subject: [PATCH 16/25] fix(moonraker): remove print at start --- scripts/moonraker.sh | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/moonraker.sh b/scripts/moonraker.sh index 46e157e..53136e1 100644 --- a/scripts/moonraker.sh +++ b/scripts/moonraker.sh @@ -37,7 +37,6 @@ function moonraker_systemd() { } function moonraker_setup_dialog() { - print_moonraker_addresses ### return early if python version check fails if [[ $(python3_check) == "false" ]]; then local error="Versioncheck failed! Python 3.7 or newer required!\n" -- 2.39.5 From b11fbdb953fe163fb93364890b78bd14e1e6aead Mon Sep 17 00:00:00 2001 From: coderus Date: Tue, 28 Feb 2023 22:22:46 +0100 Subject: [PATCH 17/25] fix(crownest): remove errors output from menu --- scripts/crowsnest.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/crowsnest.sh b/scripts/crowsnest.sh index 4733a29..2915e55 100644 --- a/scripts/crowsnest.sh +++ b/scripts/crowsnest.sh @@ -135,7 +135,7 @@ function remove_crowsnest(){ get_crowsnest_status(){ local -a files local env_file - env_file="$(grep "EnvironmentFile" /etc/systemd/system/crowsnest.service | cut -d "=" -f2)" + env_file="$(grep "EnvironmentFile" /etc/systemd/system/crowsnest.service 2>/dev/null | cut -d "=" -f2)" files=( "${CROWSNEST_DIR}" "/usr/local/bin/crowsnest" -- 2.39.5 From 176c44d6e47e8c71e51ffaa617ee517da17c3fda Mon Sep 17 00:00:00 2001 From: coderus Date: Tue, 28 Feb 2023 22:23:03 +0100 Subject: [PATCH 18/25] fix(moonraker): remove init.d cleanup code --- scripts/moonraker.sh | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/scripts/moonraker.sh b/scripts/moonraker.sh index 98de6aa..363c70b 100644 --- a/scripts/moonraker.sh +++ b/scripts/moonraker.sh @@ -425,16 +425,6 @@ function install_moonraker_polkit() { #================ REMOVE MOONRAKER ================# #==================================================# -function remove_moonraker_sysvinit() { - [[ ! -e "${INITD}/moonraker" ]] && return - - status_msg "Removing Moonraker SysVinit service ..." - sudo systemctl stop moonraker - sudo update-rc.d -f moonraker remove - sudo rm -f "${INITD}/moonraker" "${ETCDEF}/moonraker" - ok_msg "Moonraker SysVinit service removed!" -} - function remove_moonraker_systemd() { status_msg "Removing Moonraker Systemd Services ..." @@ -528,8 +518,6 @@ function remove_moonraker_polkit() { } function remove_moonraker() { - remove_moonraker_sysvinit - local moonraker_services=$(moonraker_systemd) if [[ -z ${moonraker_services} ]]; then print_error "Moonraker not installed, nothing to do!" -- 2.39.5 From 4543ccff20bf5102b8946041b2edd52c1adcb3e6 Mon Sep 17 00:00:00 2001 From: th33xitus Date: Sat, 11 Mar 2023 09:19:35 +0100 Subject: [PATCH 19/25] fix: fix SC2155 Signed-off-by: Dominik Willner --- scripts/utilities.sh | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/scripts/utilities.sh b/scripts/utilities.sh index b43d0d3..1c82bb9 100644 --- a/scripts/utilities.sh +++ b/scripts/utilities.sh @@ -639,10 +639,12 @@ function get_multi_instance_names() { function get_data_folder() { local service_name=${1} local service_type=${2} + local instance_name + if [[ "${service_name}" == "${service_type}.service" ]]; then echo "${HOME}/printer_data" else - local instance_name=$(get_instance_name "${service_name}") + instance_name=$(get_instance_name "${service_name}") if [[ ${instance_name} =~ ^[0-9]+$ ]]; then echo "${HOME}/printer_${instance_name}_data" else -- 2.39.5 From 516af17df024df68f3735b3332d6a79ff1ceb421 Mon Sep 17 00:00:00 2001 From: th33xitus Date: Sat, 11 Mar 2023 12:19:38 +0100 Subject: [PATCH 20/25] revert(klipper): revert changes to clone_klipper Signed-off-by: Dominik Willner --- scripts/klipper.sh | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index 5a6e289..22812c3 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -275,20 +275,6 @@ function clone_klipper() { repo=$(echo "${repo}" | sed -r "s/^(http|https):\/\/github\.com\///i; s/\.git$//") repo="https://github.com/${repo}" - if [[ -d ${KLIPPER_DIR} ]] - then - status_msg "Klipper already cloned, checking compatibility ..." - local current_repo=$(git -C ${KLIPPER_DIR} config --get remote.origin.url) - if [[ "${repo}" == "${current_repo}" ]] - then - git -C ${KLIPPER_DIR} stash - git -C ${KLIPPER_DIR} checkout ${branch} - git -C ${KLIPPER_DIR} pull --ff-only - klipper_clone_result="1" - return - fi - fi - [[ -z ${branch} ]] && branch="master" ### force remove existing klipper dir and clone into fresh klipper dir @@ -303,8 +289,6 @@ function clone_klipper() { print_error "Cloning Klipper from\n ${repo}\n failed!" exit 1 fi - - klipper_clone_result="0" } function create_klipper_virtualenv() { -- 2.39.5 From 37f673dde95bd30855ac08ad2676fe94bd58cf3f Mon Sep 17 00:00:00 2001 From: th33xitus Date: Sat, 11 Mar 2023 12:22:20 +0100 Subject: [PATCH 21/25] revert(klipper): revert changes to run_klipper_setup Signed-off-by: Dominik Willner --- scripts/klipper.sh | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index 22812c3..4b42a8b 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -237,14 +237,7 @@ function run_klipper_setup() { ### step 2: install klipper dependencies and create python virtualenv install_klipper_packages "${python_version}" - - if [[ "${klipper_clone_result}" == "0" ]] - then - create_klipper_virtualenv "${python_version}" - else - "${KLIPPY_ENV}"/bin/pip install -r "${KLIPPER_DIR}/scripts/klippy-requirements.txt" - fi - unset klipper_clone_result + create_klipper_virtualenv "${python_version}" ### step 3: create klipper instances for instance in "${instance_names[@]}"; do -- 2.39.5 From 2b168e2463285346414dd3926570047fb1edaa8f Mon Sep 17 00:00:00 2001 From: th33xitus Date: Sat, 11 Mar 2023 12:33:05 +0100 Subject: [PATCH 22/25] refactor(klipper): first refactor of klipper installation procedure Signed-off-by: Dominik Willner --- scripts/klipper.sh | 154 ++++++++++++++++++++++----------------------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index 4b42a8b..ed13929 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -43,10 +43,12 @@ function klipper_systemd() { } function start_klipper_setup() { - local klipper_systemd_services + local klipper_count + local klipper_instances local python_version local instance_count local instance_names + local adding_instances local use_custom_names local input local regex @@ -55,22 +57,28 @@ function start_klipper_setup() { status_msg "Initializing Klipper installation ...\n" - ### return early if klipper already exists - klipper_systemd_services=$(klipper_systemd) + klipper_count=0 + klipper_instances=$(klipper_systemd) + adding_instances="false" - local klipper_systemd_services_count=0 - if [[ -n ${klipper_systemd_services} ]]; then - klipper_systemd_services_count=$(klipper_systemd | wc -w) - status_msg "Following Klipper instances are already installed:" + if [[ -n ${klipper_instances} ]]; then + klipper_count=$(klipper_systemd | wc -w) + python_version=$(get_klipper_python_ver) + adding_instances="true" - for s in ${klipper_systemd_services}; do - echo "$(get_instance_name ${s})" + status_msg "The following Klipper instances are already installed:" + for s in ${klipper_instances}; do + get_instance_name "${s}" done - python_version=$(get_klipper_python_ver) else - ### user selection for python version - print_dialog_user_select_python_version + top_border + echo -e "| Please select your preferred Python version. | " + echo -e "| The recommended version is Python 3.x. | " + hr + echo -e "| 1) [Python 3.x] (recommended) | " + echo -e "| 2) [Python 2.7] ${yellow}(legacy)${white} | " + back_footer while true; do read -p "${cyan}###### Select Python version:${white} " -e -i 1 input case "${input}" in @@ -90,11 +98,20 @@ function start_klipper_setup() { done && input="" fi - ### user selection for instance count - print_dialog_user_select_instance_count + top_border + echo -e "| Please select the number of Klipper instances to set |" + echo -e "| up. The number of Klipper instances will determine |" + echo -e "| the amount of printers you can run from this host. |" + blank_line + echo -e "| ${yellow}WARNING:${white} |" + echo -e "| ${yellow}Setting up too many instances may crash your system.${white} |" + back_footer + regex="^[1-9][0-9]*$" while [[ ! ${input} =~ ${regex} ]]; do - read -p "${cyan}###### Number of Klipper instances to set up:${white} " -i "1" -e input + local x="" + [[ ${adding_instances} == "true" ]] && x="additional" + read -p "${cyan}###### Number of ${x} Klipper instances to set up:${white} " -i "1" -e input if [[ ${input} =~ ${regex} ]]; then instance_count="${input}" @@ -107,10 +124,21 @@ function start_klipper_setup() { fi done && input="" - ### user selection for custom names use_custom_names="false" - if (( instance_count > 1 )) || [[ -n ${klipper_systemd_services} ]]; then - print_dialog_user_select_custom_name_bool + if (( instance_count > 1 )) || [[ -n ${klipper_instances} ]]; then + top_border + echo -e "| You can now assign a custom name to each instance. |" + echo -e "| If skipped, each instance will get an index assigned |" + if [[ ${adding_instances} == "true" ]]; then + local count=$((klipper_count + 1)) + echo -e "| in ascending order, starting at index '${count}'. |" + else + echo -e "| in ascending order, starting at index '1'. |" + fi + blank_line + echo -e "| Info: |" + echo -e "| Only alphanumeric characters for names are allowed! |" + back_footer while true; do read -p "${cyan}###### Assign custom names? (y/N):${white} " input case "${input}" in @@ -134,16 +162,21 @@ function start_klipper_setup() { ### user selection for setting the actual custom names shopt -s nocasematch if [[ ${use_custom_names} == "true" ]]; then - local i - - i=1 regex="^[0-9a-zA-Z]+$" blacklist="mcu" - while [[ ! ${input} =~ ${regex} || ${input} =~ ${blacklist} || ${i} -le ${instance_count} ]]; do - read -p "${cyan}###### Name for instance #${i}:${white} " input - if [[ ${input} =~ ${blacklist} ]]; then - error_msg "Name not allowed! You are trying to use a reserved name." + local i=1 + while [[ ! ${input} =~ ${regex} || ${input} =~ ${blacklist} || ${i} -le ${instance_count} ]]; do + read -p "${cyan}###### Name for instance #$((klipper_count + i)):${white} " input + + if [[ ! ${input} =~ ${regex} ]]; then + error_msg "Invalid Input!\n" + elif [[ ${input} =~ ${blacklist} ]]; then + error_msg "Name not allowed! You are trying to use a reserved name.\n" + elif get_multi_instance_names | grep -q "${input}"; then + error_msg "Instance with name '${input}' already exists. Please choose a different name.\n" + elif echo "${instance_names[@]}" | grep -q "${input}"; then + error_msg "Name already assigned. Please choose a different name.\n" elif [[ ${input} =~ ${regex} && ! ${input} =~ ${blacklist} ]]; then select_msg "Name: ${input}\n" local instance_name @@ -152,78 +185,43 @@ function start_klipper_setup() { else instance_name="${input}" fi - if [[ -d "${HOME}/${instance_name}_data" ]] - then - status_msg "Instance ${instance_name} already exists" - read -p "${cyan}###### Enter q for exit or any other input to continue:${white} " same_continue - if [[ "${same_continue}" == "q" ]] - then - return - fi - fi instance_names+=("${instance_name}") i=$(( i + 1 )) else error_msg "Invalid Input!\n" fi done && input="" + elif (( instance_count > 1 )) && [[ ${use_custom_names} == "false" ]]; then - for (( i=klipper_systemd_services_count+1; i <= instance_count+klipper_systemd_services_count; ++i )); do + for (( i=klipper_count+1; i <= instance_count+klipper_count; ++i )); do instance_names+=("printer_${i}") done fi shopt -u nocasematch - (( instance_count > 1 )) && status_msg "Installing ${instance_count} Klipper instances ..." - (( instance_count == 1 )) && status_msg "Installing single Klipper instance ..." + local msg="Installing Klipper ..." + if (( instance_count > 1 )) && [[ ${adding_instances} == "false" ]]; then + msg="Installing ${instance_count} Klipper instances ..." + elif (( instance_count > 1 )) && [[ ${adding_instances} == "true" ]]; then + msg="Installing ${instance_count} additional Klipper instances ..." + fi + status_msg "${msg}" - run_klipper_setup "${python_version}" "${instance_names[@]}" -} - -function print_dialog_user_select_python_version() { - top_border - echo -e "| Please select your preferred Python version. | " - echo -e "| The recommended version is Python 3.x. | " - hr - echo -e "| 1) [Python 3.x] (recommended) | " - echo -e "| 2) [Python 2.7] ${yellow}(legacy)${white} | " - back_footer -} - -function print_dialog_user_select_instance_count() { - top_border - echo -e "| Please select the number of Klipper instances to set |" - echo -e "| up. The number of Klipper instances will determine |" - echo -e "| the amount of printers you can run from this host. |" - blank_line - echo -e "| ${yellow}WARNING:${white} |" - echo -e "| ${yellow}Setting up too many instances may crash your system.${white} |" - back_footer -} - -function print_dialog_user_select_custom_name_bool() { - top_border - echo -e "| You can now assign a custom name to each instance. |" - echo -e "| If skipped, each instance will get an index assigned |" - echo -e "| in ascending order, starting at index '1'. |" - blank_line - echo -e "| Info: |" - echo -e "| Only alphanumeric characters for names are allowed! |" - back_footer + run_klipper_setup "${python_version}" "${adding_instances}" "${instance_names[@]}" } function run_klipper_setup() { read_kiauh_ini "${FUNCNAME[0]}" local python_version=${1} + local adding_instances local instance_names local confirm local custom_repo local custom_branch local dep - shift 1 - read -r -a instance_names <<< "${@}" + shift 2 && read -r -a instance_names <<< "${@}" custom_repo="${custom_klipper_repo}" custom_branch="${custom_klipper_repo_branch}" @@ -232,12 +230,14 @@ function run_klipper_setup() { ### checking dependencies dependency_check "${dep[@]}" - ### step 1: clone klipper - clone_klipper "${custom_repo}" "${custom_branch}" + if [[ "${adding_instances}" == "false" ]]; then + ### step 1: clone klipper + clone_klipper "${custom_repo}" "${custom_branch}" - ### step 2: install klipper dependencies and create python virtualenv - install_klipper_packages "${python_version}" - create_klipper_virtualenv "${python_version}" + ### step 2: install klipper dependencies and create python virtualenv + install_klipper_packages "${python_version}" + create_klipper_virtualenv "${python_version}" + fi ### step 3: create klipper instances for instance in "${instance_names[@]}"; do -- 2.39.5 From 38090816ca9479f05f5c95c8bfd86afa39fa60bf Mon Sep 17 00:00:00 2001 From: th33xitus Date: Sat, 11 Mar 2023 22:22:11 +0100 Subject: [PATCH 23/25] revert(klipper): revert klipper update function Signed-off-by: Dominik Willner --- scripts/klipper.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index ed13929..d53920b 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -617,8 +617,7 @@ function update_klipper() { do_action_service "stop" "klipper" if [[ ! -d ${KLIPPER_DIR} ]]; then - error_msg "Nothing to update, Klipper directory doesn't exists! Please instakk Klipper first." - return + clone_klipper "${custom_repo}" "${custom_branch}" else backup_before_update "klipper" -- 2.39.5 From c148b0e8ac538578976a975b72780ee048002185 Mon Sep 17 00:00:00 2001 From: th33xitus Date: Sat, 11 Mar 2023 23:51:36 +0100 Subject: [PATCH 24/25] refactor(klipper): refactor klipper remove procedure Signed-off-by: Dominik Willner --- scripts/klipper.sh | 83 +++++++++++++++++++++------------------------- 1 file changed, 37 insertions(+), 46 deletions(-) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index d53920b..c7531ae 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -53,7 +53,6 @@ function start_klipper_setup() { local input local regex local blacklist - local error status_msg "Initializing Klipper installation ...\n" @@ -214,7 +213,7 @@ function run_klipper_setup() { read_kiauh_ini "${FUNCNAME[0]}" local python_version=${1} - local adding_instances + local adding_instances=${2} local instance_names local confirm local custom_repo @@ -437,11 +436,12 @@ function remove_klipper_service() { } function find_instance_files() { - local target_folder=${1} - local target_name=${2} + local data_folder=${1} + local target_folder=${2} + local target_name=${3} local files - readarray -t files < <(find "${HOME}" -regex "${HOME}/[A-Za-z0-9_]+_data/${target_folder}/${target_name}" | sort) + readarray -t files < <(find "${HOME}" -regex "${data_folder}/${target_folder}/${target_name}" | sort) echo -e "${files[@]}" } @@ -495,8 +495,11 @@ function remove_files() { if (( ${#files[@]} > 0 )); then for file in "${files[@]}"; do status_msg "Removing ${file} ..." - rm -f "${file}" - ok_msg "${file} removed!" + if rm -f "${file}"; then + ok_msg "${file} removed!" + else + error_msg "${file} could not be removed! Please remove it manually!" + fi done fi } @@ -504,76 +507,64 @@ function remove_files() { function remove_klipper_files() { status_msg "Removing Klipper files ..." - local printer_data file - for service in "${@}"; do - printer_data=$(get_data_folder ${service} klipper) - - file="${printer_data}/systemd/klipper.env" - status_msg "Removing ${file} ..." - sudo rm -f ${file} - ok_msg "${file} removed!" - - file="${printer_data}/logs/klipper.lo"* - status_msg "Removing ${file} ..." - rm -f ${file} - ok_msg "${file} removed!" - - file="${printer_data}/comms/klippy.sock" - status_msg "Removing ${file} ..." - rm -f ${file} - ok_msg "${file} removed!" - - file="${printer_data}/comms/klippy.serial" - status_msg "Removing ${file} ..." - rm -f ${file} - ok_msg "${file} removed!" + local data_folder + data_folder=$(get_data_folder "${service}") + remove_files "$(find_instance_files "${data_folder}" "systemd" "klipper.env")" + remove_files "$(find_instance_files "${data_folder}" "logs" "klippy.log.*")" + remove_files "$(find_instance_files "${data_folder}" "comms" "klippy.sock")" + remove_files "$(find_instance_files "${data_folder}" "comms" "klippy.serial")" done ok_msg "Files removed!" } function remove_klipper() { - remove_files "$(find_legacy_klipper_logs)" - remove_files "$(find_legacy_klipper_uds)" - remove_files "$(find_legacy_klipper_printer)" + local klipper_systemd_services + local klipper_services_count + local user_input=() + local klipper_names=() + local service_name - local klipper_systemd_services=$(klipper_systemd) + klipper_systemd_services=$(klipper_systemd) if [[ -z ${klipper_systemd_services} ]]; then print_error "Klipper not installed, nothing to do!" return fi + remove_files "$(find_legacy_klipper_logs)" + remove_files "$(find_legacy_klipper_uds)" + remove_files "$(find_legacy_klipper_printer)" + top_border echo -e "| ${red}~~~~~~~~ [ Klipper instance remover ] ~~~~~~~${white} |" hr - local user_input=() klipper_names=() - local klipper_services_count="$(klipper_systemd | wc -w)" + klipper_services_count="$(echo "${klipper_systemd_services}" | wc -w)" if (( klipper_services_count == 1 )); then - service_name=$(basename ${klipper_systemd_services}) + service_name=$(basename "${klipper_systemd_services}") klipper_names+=( "${service_name}" ) printf "| 0) %-51s|\n" "${service_name}" else printf "| 0) %-51s|\n" "Remove all" - local i=1 service_name + local i=1 for name in ${klipper_systemd_services}; do - service_name=$(basename ${name}) + service_name=$(basename "${name}") klipper_names+=( "${service_name}" ) printf "| ${i}) %-51s|\n" "${service_name}" - (( i=i+1 )) + i=$(( i + 1 )) done fi back_footer local option while true; do - read -p "${cyan}Remove Klipper instance:${white} " option + read -p "${cyan}Instance to remove:${white} " option if [[ ${option} == "B" || ${option} == "b" ]]; then return - elif [[ $((option)) != $option ]]; then + elif [[ $((option)) != "${option}" ]]; then error_msg "Invalid command!" - elif (( option >= 0 && option < ${#klipper_names[@]} )); then + elif (( option >= 0 && option <= ${#klipper_names[@]} )); then break else error_msg "Invalid command!" @@ -581,15 +572,15 @@ function remove_klipper() { done if (( option == 0 )); then - user_input=( ${klipper_names[@]} ) + user_input=( "${klipper_names[@]}" ) else - user_input=( "${klipper_names[(( option-1 ))]}" ) + user_input=( "${klipper_names[(( option - 1 ))]}" ) fi remove_klipper_service "${user_input[@]}" remove_klipper_files "${user_input[@]}" - if (( ${klipper_services_count} == 1 )) || [[ "${option}" == "0" ]]; then + if (( klipper_services_count == 1 )) || [[ "${option}" == "0" ]]; then remove_klipper_dir remove_klipper_env fi -- 2.39.5 From 70c316b5126feb39fe0a424aef6df8fa08fbd02a Mon Sep 17 00:00:00 2001 From: th33xitus Date: Mon, 13 Mar 2023 22:24:03 +0100 Subject: [PATCH 25/25] refactor(klipper): tweak klipper install dialogs Signed-off-by: Dominik Willner --- scripts/klipper.sh | 49 +++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 24 deletions(-) diff --git a/scripts/klipper.sh b/scripts/klipper.sh index c7531ae..a345d8a 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -43,32 +43,38 @@ function klipper_systemd() { } function start_klipper_setup() { - local klipper_count + local is_multi_instance_setup="false" + local adding_instances="false" + local use_custom_names="false" + local klipper_count=0 + local klipper_instances local python_version local instance_count local instance_names - local adding_instances - local use_custom_names local input local regex local blacklist status_msg "Initializing Klipper installation ...\n" - klipper_count=0 klipper_instances=$(klipper_systemd) - adding_instances="false" + [[ -n ${klipper_instances} ]] && is_multi_instance_setup="true" - if [[ -n ${klipper_instances} ]]; then - klipper_count=$(klipper_systemd | wc -w) + if [[ ${is_multi_instance_setup} == "true" ]]; then + klipper_count=$(echo "${klipper_instances}" | wc -w) python_version=$(get_klipper_python_ver) adding_instances="true" - status_msg "The following Klipper instances are already installed:" + # print list of already installed instances + top_border + printf "|${green}%-55s${white}|\n" " ${klipper_count} Klipper instances are already installed!" + local klipper_folder for s in ${klipper_instances}; do - get_instance_name "${s}" + klipper_folder="$(get_data_folder "$(basename "${s}")" klipper)" + printf "|${cyan}%-57s${white}|\n" " ● klipper-$(get_instance_name "${s}") - ${klipper_folder}" done + bottom_border && echo else top_border @@ -114,6 +120,7 @@ function start_klipper_setup() { if [[ ${input} =~ ${regex} ]]; then instance_count="${input}" + (( instance_count > 1 )) && is_multi_instance_setup="true" select_msg "Instance count: ${instance_count}\n" break elif [[ ${input} == "B" || ${input} == "b" ]]; then @@ -123,20 +130,14 @@ function start_klipper_setup() { fi done && input="" - use_custom_names="false" - if (( instance_count > 1 )) || [[ -n ${klipper_instances} ]]; then + if [[ ${is_multi_instance_setup} == "true" ]]; then top_border - echo -e "| You can now assign a custom name to each instance. |" - echo -e "| If skipped, each instance will get an index assigned |" - if [[ ${adding_instances} == "true" ]]; then - local count=$((klipper_count + 1)) - echo -e "| in ascending order, starting at index '${count}'. |" - else - echo -e "| in ascending order, starting at index '1'. |" - fi + echo -e "| You can now give each instance a custom name. If you |" + echo -e "| select 'N', each instance will get an index assigned |" + echo -e "| in ascending order, starting at index '$((klipper_count + 1))'. |" blank_line - echo -e "| Info: |" - echo -e "| Only alphanumeric characters for names are allowed! |" + echo -e "| ${yellow}Info:${white} |" + echo -e "| ${yellow}Only alphanumeric characters are allowed!${white} |" back_footer while true; do read -p "${cyan}###### Assign custom names? (y/N):${white} " input @@ -191,7 +192,7 @@ function start_klipper_setup() { fi done && input="" - elif (( instance_count > 1 )) && [[ ${use_custom_names} == "false" ]]; then + elif [[ ${is_multi_instance_setup} == "true" && ${use_custom_names} == "false" ]]; then for (( i=klipper_count+1; i <= instance_count+klipper_count; ++i )); do instance_names+=("printer_${i}") done @@ -199,9 +200,9 @@ function start_klipper_setup() { shopt -u nocasematch local msg="Installing Klipper ..." - if (( instance_count > 1 )) && [[ ${adding_instances} == "false" ]]; then + if [[ ${is_multi_instance_setup} == "true" && ${adding_instances} == "false" ]]; then msg="Installing ${instance_count} Klipper instances ..." - elif (( instance_count > 1 )) && [[ ${adding_instances} == "true" ]]; then + elif [[ ${adding_instances} == "true" ]]; then msg="Installing ${instance_count} additional Klipper instances ..." fi status_msg "${msg}" -- 2.39.5