From 3071e1e037618efa4669a68c5f408000ea6e1469 Mon Sep 17 00:00:00 2001 From: coderus Date: Sat, 7 Jan 2023 17:36:52 +0100 Subject: [PATCH] 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