refactor(moonraker): instance installation

a bit messy commit, might require more polishing
This commit is contained in:
coderus
2023-01-07 17:36:52 +01:00
parent 2b53e005e6
commit 3071e1e037

View File

@@ -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