refactor(moonraker): instance installation
a bit messy commit, might require more polishing
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user