refactor!: update KIAUH for recent moonraker changes (#245)

This commit is contained in:
th33xitus
2022-10-20 11:20:34 +02:00
committed by GitHub
parent 442980dbd0
commit 046178f801
20 changed files with 562 additions and 524 deletions

View File

@@ -2,6 +2,57 @@
This document covers possible important changes to KIAUH. This document covers possible important changes to KIAUH.
### 2022-10-20
KIAUH has now reached major version 5 !
Recently Moonraker introduced some changes which makes it necessary to change the folder structure of printer setups.
If you are interested in the details, check out this PR: https://github.com/Arksine/moonraker/pull/491 \
Although Moonraker has some mechanics available to migrate existing setups to the new file structure with the use of symlinks, fresh and clean installs
should be considered.
The version jump of KIAUH to v5 is a breaking change due to those major changes! That means v4 and v5 are not compatible with each other!
This is also the reason why you will currently be greeted by a yellow notification in the main menu of KIAUH leading to this changelog.
I decided to disable a few functions of the script and focus on releasing the required changes to the core components of this script.
I will work on updating the other parts of the script piece by piece during the next days/weeks.
So I am already sorry in advance if one of your desired components you wanted to install or use temporarily cannot be installed or used right now.
The following functions are currently unavailable:
- Installation of: KlipperScreen, Obico, Octoprint, MJPG-Streamer, Telegram Bot and PrettyGCode
- All backup functions and the Log-Upload
**So what is working?**\
Installation of Klipper, Moonraker, Mainsail and Fluidd. Both, single and multi-instance setups work!\
As already said, the rest will follow in the near future. Updating and removal of already installed components should continue to work.
**What was removed?**\
The option to change Klippers configuration directory got removed. From now on it will not be possible anymore to change
the configuration directory from within KIAUH and the new filestructure is enforced.
**What if I don't have an existing Klipper/Moonraker install right now?**\
Nothing important to think about, install Klipper and Moonraker. KIAUH will install both of them with the new filestructure.
**What if I have an existing Klipper/Moonraker install?**\
First of all: Backups! Please copy all of your config files and the Moonraker database (it is a hidden folder, usually `~/.moonraker_database`) to a safe location.
After that, uninstall Klipper and Moonraker with KIAUH. You can then proceed and re-install both of them with KIAUH again. It is important that you are on KIAUH v5 for that!
Once everything is installed again, you need to manually copy your configuration files from the old `~/klipper_config` folder to the new `~/printer_data/config` folder.
Previous, by Moonraker created symlinks to folder of the old filestructure will not work anymore, you need to move the files to their new location now!
Do the same with the two files inside of `~/.moonraker_database`. Move/copy them into `~/printer_data/database`. If `~/printer_data/database` is already populated with a `data.mdb` and `lock.mdb`
delete them or simply overwrite them. Nothing should be lost as those should be empty database files. Anyway, you made backups, right?
You can now proceed and restart Moonraker. Either from within Mainsail or Fluidd, or use SSH and execute `sudo systemctl restart moonraker`.
If everything went smooth, you should be good to go again. If you see some Moonraker warnings about deprecated options in the `moonraker.conf`, go ahead and resolve them.
I will not cover them in detail here. A good source is the Moonraker documentation: https://moonraker.readthedocs.io/en/latest/configuration/
**What if I have an existing Klipper/Moonraker multi-instance install?**\
Pretty much the same steps that are required for single instance installs apply to multi-instance setups. So please go ahead and read the previous paragraph if you didn't already.
Make backups of everything first. Then remove and install the desired amount of Klipper and Moonraker instances again.
Now you need to move all config and database files to their new locations.\
Example with an instance called `printer_1`:\
The config files go from `~/klipper_config/printer_1` to `~/printer_1_data/config`.
The database files go from `~/.moonraker_database_1` to `~/printer_1_data/database`.
Now restart all Moonraker services. You can restart all of them at once if you launch KIAUH, and in the main menu type `restart moonraker` and hit Enter.
I hope I have covered the most important things. In case you need further support, the official Klipper Discord is a good place to ask for help.
### 2022-08-15 ### 2022-08-15
Support for "Obico for Klipper" was added! Huge thanks to [kennethjiang](https://github.com/kennethjiang) for helping me with the implementation! Support for "Obico for Klipper" was added! Huge thanks to [kennethjiang](https://github.com/kennethjiang) for helping me with the implementation!

View File

@@ -9,6 +9,15 @@
# This file may be distributed under the terms of the GNU GPLv3 license # # This file may be distributed under the terms of the GNU GPLv3 license #
#=======================================================================# #=======================================================================#
# TODO: mjpg-streamer
# TODO: moonraker-telegram-bot
# TODO: obico
# TODO: pretty_gcode
# TODO: upload_log
# TODO: all backup functions
# TODO: octoprint
# TODO: doublecheck that nothing got missed!
set -e set -e
clear clear

1
resources/klipper.env Normal file
View File

@@ -0,0 +1 @@
KLIPPER_ARGS="/home/%USER%/klipper/klippy/klippy.py %CFG% -I %PRINTER% -l %LOG% -a %UDS%"

View File

@@ -1,7 +1,5 @@
#Systemd Klipper Service
[Unit] [Unit]
Description=Systemd Klipper Service for instance klipper-%INST% Description=Klipper 3D Printer Firmware SV1 %INST%
Documentation=https://www.klipper3d.org/ Documentation=https://www.klipper3d.org/
After=network.target After=network.target
Wants=udev.target Wants=udev.target
@@ -10,13 +8,11 @@ Wants=udev.target
WantedBy=multi-user.target WantedBy=multi-user.target
[Service] [Service]
Environment=KLIPPER_CONFIG=%CFG%
Environment=KLIPPER_LOG=%LOG%
Environment=KLIPPER_SOCKET=%UDS%
Environment=KLIPPER_PRINTER=%PRINTER%
Type=simple Type=simple
User=%USER% User=%USER%
RemainAfterExit=yes RemainAfterExit=yes
ExecStart=%ENV%/bin/python %DIR%/klippy/klippy.py ${KLIPPER_CONFIG} -I ${KLIPPER_PRINTER} -l ${KLIPPER_LOG} -a ${KLIPPER_SOCKET} WorkingDirectory=/home/%USER%/klipper
EnvironmentFile=%ENV_FILE%
ExecStart=%ENV%/bin/python $KLIPPER_ARGS
Restart=always Restart=always
RestartSec=10 RestartSec=10

View File

@@ -1,7 +1,6 @@
[server] [server]
host: 0.0.0.0 host: 0.0.0.0
port: %PORT% port: %PORT%
enable_debug_logging: False
klippy_uds_address: %UDS% klippy_uds_address: %UDS%
[authorization] [authorization]
@@ -22,13 +21,6 @@ cors_domains:
https://app.fluidd.xyz https://app.fluidd.xyz
http://app.fluidd.xyz http://app.fluidd.xyz
[database]
database_path: %DB%
[file_manager]
config_path: %CFG%
log_path: %LOG%
[octoprint_compat] [octoprint_compat]
[history] [history]

1
resources/moonraker.env Normal file
View File

@@ -0,0 +1 @@
MOONRAKER_ARGS="/home/%USER%/moonraker/moonraker/moonraker.py -d %PRINTER_DATA%"

View File

@@ -1,20 +1,19 @@
#Systemd Moonraker Service
[Unit] [Unit]
Description=Systemd Moonraker Service for instance moonraker-%INST% Description=API Server for Klipper SV1 %INST%
Documentation=https://moonraker.readthedocs.io/ Documentation=https://moonraker.readthedocs.io/
After=network.target Requires=network-online.target
After=network-online.target
[Install] [Install]
WantedBy=multi-user.target WantedBy=multi-user.target
[Service] [Service]
Environment=MOONRAKER_CONF=%CFG%
Environment=MOONRAKER_LOG=%LOG%
Type=simple Type=simple
SupplementaryGroups=moonraker-admin
User=%USER% User=%USER%
SupplementaryGroups=moonraker-admin
RemainAfterExit=yes RemainAfterExit=yes
ExecStart=%ENV%/bin/python %DIR%/moonraker/moonraker.py -c ${MOONRAKER_CONF} -l ${MOONRAKER_LOG} WorkingDirectory=/home/%USER%/moonraker
EnvironmentFile=%ENV_FILE%
ExecStart=%ENV%/bin/python $MOONRAKER_ARGS
Restart=always Restart=always
RestartSec=10 RestartSec=10

View File

@@ -39,29 +39,29 @@ function install_fluidd() {
### check if another site already listens to port 80 ### check if another site already listens to port 80
fluidd_port_check fluidd_port_check
### ask user to install mjpg-streamer # ### ask user to install mjpg-streamer
local install_mjpg_streamer # local install_mjpg_streamer
if [[ ! -f "${SYSTEMD}/webcamd.service" ]]; then # if [[ ! -f "${SYSTEMD}/webcamd.service" ]]; then
while true; do # while true; do
echo # echo
top_border # top_border
echo -e "| Install MJPG-Streamer for webcam support? |" # echo -e "| Install MJPG-Streamer for webcam support? |"
bottom_border # bottom_border
read -p "${cyan}###### Please select (y/N):${white} " yn # read -p "${cyan}###### Please select (y/N):${white} " yn
case "${yn}" in # case "${yn}" in
Y|y|Yes|yes) # Y|y|Yes|yes)
select_msg "Yes" # select_msg "Yes"
install_mjpg_streamer="true" # install_mjpg_streamer="true"
break;; # break;;
N|n|No|no|"") # N|n|No|no|"")
select_msg "No" # select_msg "No"
install_mjpg_streamer="false" # install_mjpg_streamer="false"
break;; # break;;
*) # *)
error_msg "Invalid command!";; # error_msg "Invalid command!";;
esac # esac
done # done
fi # fi
### download fluidd ### download fluidd
download_fluidd download_fluidd
@@ -83,7 +83,7 @@ function install_fluidd() {
patch_fluidd_update_manager patch_fluidd_update_manager
### install mjpg-streamer ### install mjpg-streamer
[[ ${install_mjpg_streamer} == "true" ]] && install_mjpg-streamer # [[ ${install_mjpg_streamer} == "true" ]] && install_mjpg-streamer
fetch_webui_ports #WIP fetch_webui_ports #WIP
@@ -124,9 +124,11 @@ function install_fluidd_macros() {
} }
function download_fluidd_macros() { function download_fluidd_macros() {
local fluidd_cfg="https://raw.githubusercontent.com/fluidd-core/FluiddPI/master/src/modules/fluidd/filesystem/home/pi/klipper_config/fluidd.cfg" local fluidd_cfg path configs regex
local configs path
configs=$(find "${KLIPPER_CONFIG}" -type f -name "printer.cfg" | sort) fluidd_cfg="https://raw.githubusercontent.com/fluidd-core/FluiddPI/master/src/modules/fluidd/filesystem/home/pi/klipper_config/fluidd.cfg"
regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/config\/printer\.cfg"
configs=$(find "${HOME}" -maxdepth 3 -regextype posix-extended -regex "${regex}" | sort)
if [[ -n ${configs} ]]; then if [[ -n ${configs} ]]; then
for config in ${configs}; do for config in ${configs}; do
@@ -214,8 +216,23 @@ function remove_fluidd_logs() {
} }
function remove_fluidd_log_symlinks() { function remove_fluidd_log_symlinks() {
local files regex
regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/logs\/fluidd-.*"
files=$(find "${HOME}" -maxdepth 3 -regextype posix-extended -regex "${regex}" 2> /dev/null | sort)
if [[ -n ${files} ]]; then
for file in ${files}; do
status_msg "Removing ${file} ..."
rm -f "${file}"
ok_msg "${file} removed!"
done
fi
}
function remove_legacy_fluidd_log_symlinks() {
local files local files
files=$(find "${KLIPPER_LOGS}" -name "fluidd*" 2> /dev/null | sort) files=$(find "${HOME}/klipper_logs" -name "fluidd*" 2> /dev/null | sort)
if [[ -n ${files} ]]; then if [[ -n ${files} ]]; then
for file in ${files}; do for file in ${files}; do
@@ -231,6 +248,7 @@ function remove_fluidd() {
remove_fluidd_config remove_fluidd_config
remove_fluidd_logs remove_fluidd_logs
remove_fluidd_log_symlinks remove_fluidd_log_symlinks
remove_legacy_fluidd_log_symlinks
### remove fluidd_port from ~/.kiauh.ini ### remove fluidd_port from ~/.kiauh.ini
sed -i "/^fluidd_port=/d" "${INI_FILE}" sed -i "/^fluidd_port=/d" "${INI_FILE}"
@@ -395,10 +413,11 @@ function select_fluidd_port() {
} }
function patch_fluidd_update_manager() { function patch_fluidd_update_manager() {
local patched="false" local patched moonraker_configs regex
local moonraker_configs regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/config\/moonraker\.conf"
moonraker_configs=$(find "${KLIPPER_CONFIG}" -type f -name "moonraker.conf" | sort) moonraker_configs=$(find "${HOME}" -maxdepth 3 -type f -regextype posix-extended -regex "${regex}" | sort)
patched="false"
for conf in ${moonraker_configs}; do for conf in ${moonraker_configs}; do
if ! grep -Eq "^\[update_manager fluidd\]$" "${conf}"; then if ! grep -Eq "^\[update_manager fluidd\]$" "${conf}"; then
### add new line to conf if it doesn't end with one ### add new line to conf if it doesn't end with one

View File

@@ -105,10 +105,11 @@ function create_example_shell_command() {
### create a backup of the config folder ### create a backup of the config folder
backup_klipper_config_dir backup_klipper_config_dir
local printer_cfgs path local configs regex path
printer_cfgs=$(find "$(get_klipper_cfg_dir)" -type f -name "printer.cfg" | sort) regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/config\/printer\.cfg"
configs=$(find "${HOME}" -maxdepth 3 -regextype posix-extended -regex "${regex}" | sort)
for cfg in ${printer_cfgs}; do for cfg in ${configs}; do
path=$(echo "${cfg}" | rev | cut -d"/" -f2- | rev) path=$(echo "${cfg}" | rev | cut -d"/" -f2- | rev)
if [[ ! -f "${path}/shell_command.cfg" ]]; then if [[ ! -f "${path}/shell_command.cfg" ]]; then

View File

@@ -34,8 +34,6 @@ function set_globals() {
KLIPPY_ENV="${HOME}/klippy-env" KLIPPY_ENV="${HOME}/klippy-env"
KLIPPER_DIR="${HOME}/klipper" KLIPPER_DIR="${HOME}/klipper"
KLIPPER_REPO="https://github.com/Klipper3d/klipper.git" KLIPPER_REPO="https://github.com/Klipper3d/klipper.git"
KLIPPER_LOGS="${HOME}/klipper_logs"
KLIPPER_CONFIG="$(get_klipper_cfg_dir)" # default: ${HOME}/klipper_config
#================= MOONRAKER ==================# #================= MOONRAKER ==================#
MOONRAKER_ENV="${HOME}/moonraker-env" MOONRAKER_ENV="${HOME}/moonraker-env"

View File

@@ -15,19 +15,6 @@ set -e
#================ INSTALL KLIPPER ================# #================ INSTALL KLIPPER ================#
#=================================================# #=================================================#
### check for existing klipper service installations
function klipper_initd() {
local services
services=$(find "${INITD}" -maxdepth 1 -regextype posix-extended -regex "${INITD}/klipper(-[^0])?[0-9]*" | sort)
echo "${services}"
}
function klipper_systemd() {
local services
services=$(find "${SYSTEMD}" -maxdepth 1 -regextype posix-extended -regex "${SYSTEMD}/klipper(-[0-9a-zA-Z]+)?.service" | sort)
echo "${services}"
}
function klipper_setup_dialog() { function klipper_setup_dialog() {
status_msg "Initializing Klipper installation ..." status_msg "Initializing Klipper installation ..."
@@ -36,8 +23,8 @@ function klipper_setup_dialog() {
local python_version="${1}" user_input=() local python_version="${1}" user_input=()
local error local error
klipper_initd_service=$(klipper_initd) klipper_initd_service=$(find_klipper_initd)
klipper_systemd_services=$(klipper_systemd) klipper_systemd_services=$(find_klipper_systemd)
user_input+=("${python_version}") user_input+=("${python_version}")
### return early if klipper already exists ### return early if klipper already exists
@@ -150,6 +137,103 @@ function klipper_setup_dialog() {
klipper_setup "${user_input[@]}" klipper_setup "${user_input[@]}"
} }
function klipper_setup() {
read_kiauh_ini "${FUNCNAME[0]}"
### index 0: python version, index 1: instance count, index 2-n: instance names (optional)
local user_input=("${@}")
local python_version="${user_input[0]}" && unset "user_input[0]"
local instance_arr=("${user_input[@]}") && unset "user_input[@]"
local custom_repo="${custom_klipper_repo}"
local custom_branch="${custom_klipper_repo_branch}"
local dep=(git)
### checking dependencies
dependency_check "${dep[@]}"
### 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 3: configure and create klipper instances
configure_klipper_service "${instance_arr[@]}"
### step 4: enable and start all instances
do_action_service "enable" "klipper"
do_action_service "start" "klipper"
### step 5: check for dialout group membership
check_usergroups
### confirm message
local confirm=""
(( instance_arr[0] == 1 )) && confirm="Klipper has been set up!"
(( instance_arr[0] > 1 )) && confirm="${instance_arr[0]} Klipper instances have been set up!"
print_confirm "${confirm}" && return
}
function clone_klipper() {
local repo=${1} branch=${2}
[[ -z ${repo} ]] && repo="${KLIPPER_REPO}"
repo=$(echo "${repo}" | sed -r "s/^(http|https):\/\/github\.com\///i; s/\.git$//")
repo="https://github.com/${repo}"
[[ -z ${branch} ]] && branch="master"
### force remove existing klipper dir and clone into fresh klipper dir
[[ -d ${KLIPPER_DIR} ]] && rm -rf "${KLIPPER_DIR}"
status_msg "Cloning Klipper from ${repo} ..."
cd "${HOME}" || exit 1
if git clone "${repo}" "${KLIPPER_DIR}"; then
cd "${KLIPPER_DIR}" && git checkout "${branch}"
else
print_error "Cloning Klipper from\n ${repo}\n failed!"
exit 1
fi
}
function create_klipper_virtualenv() {
local python_version="${1}"
[[ ${python_version} == "python2" ]] && \
status_msg "Installing $(python2 -V) virtual environment..."
[[ ${python_version} == "python3" ]] && \
status_msg "Installing $(python3 -V) virtual environment..."
### remove klippy-env if it already exists
[[ -d ${KLIPPY_ENV} ]] && rm -rf "${KLIPPY_ENV}"
if [[ ${python_version} == "python2" ]]; then
if virtualenv -p python2 "${KLIPPY_ENV}"; then
"${KLIPPY_ENV}"/bin/pip install -r "${KLIPPER_DIR}"/scripts/klippy-requirements.txt
else
log_error "failure while creating python2 klippy-env"
error_msg "Creation of Klipper virtualenv failed!"
exit 1
fi
fi
if [[ ${python_version} == "python3" ]]; then
if virtualenv -p python3 "${KLIPPY_ENV}"; then
"${KLIPPY_ENV}"/bin/pip install -U pip
"${KLIPPY_ENV}"/bin/pip install -r "${KLIPPER_DIR}"/scripts/klippy-requirements.txt
else
log_error "failure while creating python3 klippy-env"
error_msg "Creation of Klipper virtualenv failed!"
exit 1
fi
fi
return
}
### ###
# extracts the required packages from the # extracts the required packages from the
# install-debian.sh script and installs them # install-debian.sh script and installs them
@@ -200,124 +284,84 @@ function install_klipper_packages() {
fi fi
} }
function create_klipper_virtualenv() { function configure_klipper_service() {
local python_version="${1}" local input=("${@}")
local klipper_count=${input[0]} && unset "input[0]"
local names=("${input[@]}") && unset "input[@]"
local printer_data cfg_dir cfg log printer uds service env_file
[[ ${python_version} == "python2" ]] && \ if (( klipper_count == 1 )) && [[ ${#names[@]} -eq 0 ]]; then
status_msg "Installing $(python2 -V) virtual environment..." printer_data="${HOME}/printer_data"
cfg_dir="${printer_data}/config"
cfg="${cfg_dir}/printer.cfg"
log="${printer_data}/logs/klippy.log"
printer="${printer_data}/comms/klippy.serial"
uds="${printer_data}/comms/klippy.sock"
service="${SYSTEMD}/klipper.service"
env_file="${printer_data}/systemd/klipper.env"
[[ ${python_version} == "python3" ]] && \ ### create required folder structure
status_msg "Installing $(python3 -V) virtual environment..." create_required_folders "${printer_data}"
### remove klippy-env if it already exists ### write single instance service
[[ -d ${KLIPPY_ENV} ]] && rm -rf "${KLIPPY_ENV}" write_klipper_service "" "${cfg}" "${log}" "${printer}" "${uds}" "${service}" "${env_file}"
write_example_printer_cfg "${cfg_dir}" "${cfg}"
ok_msg "Klipper instance created!"
if [[ ${python_version} == "python2" ]]; then elif (( klipper_count >= 1 )) && [[ ${#names[@]} -gt 0 ]]; then
if virtualenv -p python2 "${KLIPPY_ENV}"; then local j=0 re="^[1-9][0-9]*$"
"${KLIPPY_ENV}"/bin/pip install -r "${KLIPPER_DIR}"/scripts/klippy-requirements.txt
else
log_error "failure while creating python2 klippy-env"
error_msg "Creation of Klipper virtualenv failed!"
exit 1
fi
fi
if [[ ${python_version} == "python3" ]]; then for (( i=1; i <= klipper_count; i++ )); do
if virtualenv -p python3 "${KLIPPY_ENV}"; then ### overwrite config folder if name is only a number
"${KLIPPY_ENV}"/bin/pip install -U pip if [[ ${names[j]} =~ ${re} ]]; then
"${KLIPPY_ENV}"/bin/pip install -r "${KLIPPER_DIR}"/scripts/klippy-requirements.txt printer_data="${HOME}/printer_${names[${j}]}_data"
else else
log_error "failure while creating python3 klippy-env" printer_data="${HOME}/${names[${j}]}_data"
error_msg "Creation of Klipper virtualenv failed!" fi
exit 1
fi
fi
return cfg_dir="${printer_data}/config"
} cfg="${cfg_dir}/printer.cfg"
log="${printer_data}/logs/klippy.log"
printer="${printer_data}/comms/klippy.serial"
uds="${printer_data}/comms/klippy.sock"
service="${SYSTEMD}/klipper-${names[${j}]}.service"
env_file="${printer_data}/systemd/klipper.env"
function klipper_setup() { ### create required folder structure
read_kiauh_ini "${FUNCNAME[0]}" create_required_folders "${printer_data}"
### index 0: python version, index 1: instance count, index 2-n: instance names (optional)
local user_input=("${@}")
local python_version="${user_input[0]}" && unset "user_input[0]"
local instance_arr=("${user_input[@]}") && unset "user_input[@]"
local custom_repo="${custom_klipper_repo}"
local custom_branch="${custom_klipper_repo_branch}"
### checking dependencies
local dep=(git)
dependency_check "${dep[@]}"
### step 1: clone klipper ### write multi instance service
clone_klipper "${custom_repo}" "${custom_branch}" write_klipper_service "${names[${j}]}" "${cfg}" "${log}" "${printer}" "${uds}" "${service}" "${env_file}"
write_example_printer_cfg "${cfg_dir}" "${cfg}"
ok_msg "Klipper instance 'klipper-${names[${j}]}' created!"
j=$(( j + 1 ))
done && unset j
### step 2: install klipper dependencies and create python virtualenv
install_klipper_packages "${python_version}"
create_klipper_virtualenv "${python_version}"
### step 3: create gcode_files and logs folder
[[ ! -d "${HOME}/gcode_files" ]] && mkdir -p "${HOME}/gcode_files"
[[ ! -d ${KLIPPER_LOGS} ]] && mkdir -p "${KLIPPER_LOGS}"
### step 4: create klipper instances
create_klipper_service "${instance_arr[@]}"
### step 5: enable and start all instances
do_action_service "enable" "klipper"
do_action_service "start" "klipper"
### step 6: check for dialout group membership
check_usergroups
### confirm message
local confirm=""
(( instance_arr[0] == 1 )) && confirm="Klipper has been set up!"
(( instance_arr[0] > 1 )) && confirm="${instance_arr[0]} Klipper instances have been set up!"
print_confirm "${confirm}" && return
}
function clone_klipper() {
local repo=${1} branch=${2}
[[ -z ${repo} ]] && repo="${KLIPPER_REPO}"
repo=$(echo "${repo}" | sed -r "s/^(http|https):\/\/github\.com\///i; s/\.git$//")
repo="https://github.com/${repo}"
[[ -z ${branch} ]] && branch="master"
### force remove existing klipper dir and clone into fresh klipper dir
[[ -d ${KLIPPER_DIR} ]] && rm -rf "${KLIPPER_DIR}"
status_msg "Cloning Klipper from ${repo} ..."
cd "${HOME}" || exit 1
if git clone "${repo}" "${KLIPPER_DIR}"; then
cd "${KLIPPER_DIR}" && git checkout "${branch}"
else else
print_error "Cloning Klipper from\n ${repo}\n failed!" return 1
exit 1
fi fi
} }
function write_klipper_service() { function write_klipper_service() {
local i=${1} cfg=${2} log=${3} printer=${4} uds=${5} service=${6} local i=${1} cfg=${2} log=${3} printer=${4} uds=${5} service=${6} env_file=${7}
local service_template="${KIAUH_SRCDIR}/resources/klipper.service" local service_template="${KIAUH_SRCDIR}/resources/klipper.service"
local env_template="${KIAUH_SRCDIR}/resources/klipper.env"
### replace all placeholders ### replace all placeholders
if [[ ! -f ${service} ]]; then if [[ ! -f ${service} ]]; then
status_msg "Creating Klipper Service ${i} ..." status_msg "Creating Klipper Service ${i} ..."
sudo cp "${service_template}" "${service}" sudo cp "${service_template}" "${service}"
[[ -z ${i} ]] && sudo sed -i "s| for instance klipper-%INST%||" "${service}" sudo cp "${env_template}" "${env_file}"
[[ -z ${i} ]] && sudo sed -i "s| %INST%||" "${service}"
[[ -n ${i} ]] && sudo sed -i "s|%INST%|${i}|" "${service}" [[ -n ${i} ]] && sudo sed -i "s|%INST%|${i}|" "${service}"
sudo sed -i "s|%USER%|${USER}|; s|%ENV%|${KLIPPY_ENV}|; s|%DIR%|${KLIPPER_DIR}|" "${service}" sudo sed -i "s|%USER%|${USER}|g; s|%ENV%|${KLIPPY_ENV}|; s|%ENV_FILE%|${env_file}|" "${service}"
sudo sed -i "s|%LOG%|${log}|; s|%CFG%|${cfg}|; s|%PRINTER%|${printer}|; s|%UDS%|${uds}|" "${service}" sudo sed -i "s|%USER%|${USER}|; s|%LOG%|${log}|; s|%CFG%|${cfg}|; s|%PRINTER%|${printer}|; s|%UDS%|${uds}|" "${env_file}"
fi fi
} }
function write_example_printer_cfg() { function write_example_printer_cfg() {
local cfg_dir=${1} cfg=${2} local cfg_dir=${1} cfg=${2}
local cfg_template="${KIAUH_SRCDIR}/resources/printer.cfg" local cfg_template="${KIAUH_SRCDIR}/resources/example.printer.cfg"
### create a config directory if it doesn't exist ### create a config directory if it doesn't exist
if [[ ! -d ${cfg_dir} ]]; then if [[ ! -d ${cfg_dir} ]]; then
@@ -332,52 +376,6 @@ function write_example_printer_cfg() {
fi fi
} }
function create_klipper_service() {
local input=("${@}")
local klipper_count=${input[0]} && unset "input[0]"
local names=("${input[@]}") && unset "input[@]"
local cfg_dir cfg log printer uds service
if (( klipper_count == 1 )) && [[ ${#names[@]} -eq 0 ]]; then
cfg_dir="${KLIPPER_CONFIG}"
cfg="${cfg_dir}/printer.cfg"
log="${KLIPPER_LOGS}/klippy.log"
printer="/tmp/printer"
uds="/tmp/klippy_uds"
service="${SYSTEMD}/klipper.service"
### write single instance service
write_klipper_service "" "${cfg}" "${log}" "${printer}" "${uds}" "${service}"
write_example_printer_cfg "${cfg_dir}" "${cfg}"
ok_msg "Klipper instance created!"
elif (( klipper_count >= 1 )) && [[ ${#names[@]} -gt 0 ]]; then
local j=0 re="^[1-9][0-9]*$"
for (( i=1; i <= klipper_count; i++ )); do
### overwrite config folder if name is only a number
if [[ ${names[j]} =~ ${re} ]]; then
cfg_dir="${KLIPPER_CONFIG}/printer_${names[${j}]}"
else
cfg_dir="${KLIPPER_CONFIG}/${names[${j}]}"
fi
cfg="${cfg_dir}/printer.cfg"
log="${KLIPPER_LOGS}/klippy-${names[${j}]}.log"
printer="/tmp/printer-${names[${j}]}"
uds="/tmp/klippy_uds-${names[${j}]}"
service="${SYSTEMD}/klipper-${names[${j}]}.service"
### write multi instance service
write_klipper_service "${names[${j}]}" "${cfg}" "${log}" "${printer}" "${uds}" "${service}"
write_example_printer_cfg "${cfg_dir}" "${cfg}"
ok_msg "Klipper instance 'klipper-${names[${j}]}' created!"
j=$(( j + 1 ))
done && unset j
else
return 1
fi
}
#================================================# #================================================#
#================ REMOVE KLIPPER ================# #================ REMOVE KLIPPER ================#
#================================================# #================================================#
@@ -393,10 +391,10 @@ function remove_klipper_sysvinit() {
} }
function remove_klipper_systemd() { function remove_klipper_systemd() {
[[ -z $(klipper_systemd) ]] && return [[ -z $(find_klipper_systemd) ]] && return
status_msg "Removing Klipper Systemd Services ..." status_msg "Removing Klipper Systemd Services ..."
for service in $(klipper_systemd | cut -d"/" -f5); do for service in $(find_klipper_systemd | cut -d"/" -f5); do
status_msg "Removing ${service} ..." status_msg "Removing ${service} ..."
sudo systemctl stop "${service}" sudo systemctl stop "${service}"
sudo systemctl disable "${service}" sudo systemctl disable "${service}"
@@ -410,9 +408,35 @@ function remove_klipper_systemd() {
ok_msg "Klipper Service removed!" ok_msg "Klipper Service removed!"
} }
function remove_klipper_env_file() {
local files regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/systemd\/klipper\.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
}
function remove_klipper_logs() { function remove_klipper_logs() {
local files regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/logs\/klippy\.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
}
function remove_legacy_klipper_logs() {
local files regex="klippy(-[0-9a-zA-Z]+)?\.log(.*)?" local files regex="klippy(-[0-9a-zA-Z]+)?\.log(.*)?"
files=$(find "${KLIPPER_LOGS}" -maxdepth 1 -regextype posix-extended -regex "${KLIPPER_LOGS}/${regex}" 2> /dev/null | sort) files=$(find "${HOME}/klipper_logs" -maxdepth 1 -regextype posix-extended -regex "${HOME}/klipper_logs/${regex}" 2> /dev/null | sort)
if [[ -n ${files} ]]; then if [[ -n ${files} ]]; then
for file in ${files}; do for file in ${files}; do
@@ -424,8 +448,8 @@ function remove_klipper_logs() {
} }
function remove_klipper_uds() { function remove_klipper_uds() {
local files local files regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/comms\/klippy\.sock"
files=$(find /tmp -maxdepth 1 -regextype posix-extended -regex "/tmp/klippy_uds(-[0-9a-zA-Z]+)?" | sort) files=$(find "${HOME}" -maxdepth 3 -regextype posix-extended -regex "${regex}" | sort)
if [[ -n ${files} ]]; then if [[ -n ${files} ]]; then
for file in ${files}; do for file in ${files}; do
@@ -437,9 +461,22 @@ function remove_klipper_uds() {
} }
function remove_klipper_printer() { function remove_klipper_printer() {
local files local files regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/comms\/klippy\.serial"
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
}
function remove_legacy_klipper_printer() {
local files
files=$(find /tmp -maxdepth 1 -regextype posix-extended -regex "/tmp/printer(-[0-9a-zA-Z]+)?" | sort) files=$(find /tmp -maxdepth 1 -regextype posix-extended -regex "/tmp/printer(-[0-9a-zA-Z]+)?" | sort)
if [[ -n ${files} ]]; then if [[ -n ${files} ]]; then
for file in ${files}; do for file in ${files}; do
status_msg "Removing ${file} ..." status_msg "Removing ${file} ..."
@@ -468,9 +505,12 @@ function remove_klipper_env() {
function remove_klipper() { function remove_klipper() {
remove_klipper_sysvinit remove_klipper_sysvinit
remove_klipper_systemd remove_klipper_systemd
remove_klipper_env_file
remove_klipper_logs remove_klipper_logs
remove_legacy_klipper_logs
remove_klipper_uds remove_klipper_uds
remove_klipper_printer remove_klipper_printer
remove_legacy_klipper_printer
remove_klipper_dir remove_klipper_dir
remove_klipper_env remove_klipper_env
@@ -520,11 +560,11 @@ function update_klipper() {
function get_klipper_status() { function get_klipper_status() {
local sf_count status py_ver local sf_count status py_ver
sf_count="$(klipper_systemd | wc -w)" sf_count="$(find_klipper_systemd | wc -w)"
### detect an existing "legacy" klipper init.d installation ### detect an existing "legacy" klipper init.d installation
if [[ $(klipper_systemd | wc -w) -eq 0 ]] \ if [[ $(find_klipper_systemd | wc -w) -eq 0 ]] \
&& [[ $(klipper_initd | wc -w) -ge 1 ]]; then && [[ $(find_klipper_initd | wc -w) -ge 1 ]]; then
sf_count=1 sf_count=1
fi fi
@@ -595,19 +635,6 @@ function compare_klipper_versions() {
#=================== HELPERS ====================# #=================== HELPERS ====================#
#================================================# #================================================#
function get_klipper_cfg_dir() {
local cfg_dir
read_kiauh_ini "${FUNCNAME[0]}"
if [[ -z ${custom_klipper_cfg_loc} ]]; then
cfg_dir="${HOME}/klipper_config"
else
cfg_dir="${custom_klipper_cfg_loc}"
fi
echo "${cfg_dir}"
}
### ###
# reads the python version from the klipper virtual environment # reads the python version from the klipper virtual environment
# #

View File

@@ -39,29 +39,29 @@ function install_mainsail() {
### check if another site already listens to port 80 ### check if another site already listens to port 80
mainsail_port_check mainsail_port_check
### ask user to install mjpg-streamer # ### ask user to install mjpg-streamer
local install_mjpg_streamer # local install_mjpg_streamer
if [[ ! -f "${SYSTEMD}/webcamd.service" ]]; then # if [[ ! -f "${SYSTEMD}/webcamd.service" ]]; then
while true; do # while true; do
echo # echo
top_border # top_border
echo -e "| Install MJPG-Streamer for webcam support? |" # echo -e "| Install MJPG-Streamer for webcam support? |"
bottom_border # bottom_border
read -p "${cyan}###### Please select (y/N):${white} " yn # read -p "${cyan}###### Please select (y/N):${white} " yn
case "${yn}" in # case "${yn}" in
Y|y|Yes|yes) # Y|y|Yes|yes)
select_msg "Yes" # select_msg "Yes"
install_mjpg_streamer="true" # install_mjpg_streamer="true"
break;; # break;;
N|n|No|no|"") # N|n|No|no|"")
select_msg "No" # select_msg "No"
install_mjpg_streamer="false" # install_mjpg_streamer="false"
break;; # break;;
*) # *)
error_msg "Invalid command!";; # error_msg "Invalid command!";;
esac # esac
done # done
fi # fi
### download mainsail ### download mainsail
download_mainsail download_mainsail
@@ -83,7 +83,7 @@ function install_mainsail() {
patch_mainsail_update_manager patch_mainsail_update_manager
### install mjpg-streamer ### install mjpg-streamer
[[ ${install_mjpg_streamer} == "true" ]] && install_mjpg-streamer # [[ ${install_mjpg_streamer} == "true" ]] && install_mjpg-streamer
fetch_webui_ports #WIP fetch_webui_ports #WIP
@@ -124,9 +124,11 @@ function install_mainsail_macros() {
} }
function download_mainsail_macros() { function download_mainsail_macros() {
local ms_cfg="https://raw.githubusercontent.com/mainsail-crew/MainsailOS/master/src/modules/mainsail/filesystem/home/pi/klipper_config/mainsail.cfg" local ms_cfg path configs regex
local configs path
configs=$(find "${KLIPPER_CONFIG}" -type f -name "printer.cfg" | sort) ms_cfg="https://raw.githubusercontent.com/mainsail-crew/MainsailOS/master/src/modules/mainsail/filesystem/home/pi/klipper_config/mainsail.cfg"
regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/config\/printer\.cfg"
configs=$(find "${HOME}" -maxdepth 3 -regextype posix-extended -regex "${regex}" | sort)
if [[ -n ${configs} ]]; then if [[ -n ${configs} ]]; then
for config in ${configs}; do for config in ${configs}; do
@@ -219,8 +221,23 @@ function remove_mainsail_logs() {
} }
function remove_mainsail_log_symlinks() { function remove_mainsail_log_symlinks() {
local files regex
regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/logs\/mainsail-.*"
files=$(find "${HOME}" -maxdepth 3 -regextype posix-extended -regex "${regex}" 2> /dev/null | sort)
if [[ -n ${files} ]]; then
for file in ${files}; do
status_msg "Removing ${file} ..."
rm -f "${file}"
ok_msg "${file} removed!"
done
fi
}
function remove_legacy_mainsail_log_symlinks() {
local files local files
files=$(find "${KLIPPER_LOGS}" -name "mainsail*" 2> /dev/null | sort) files=$(find "${HOME}/klipper_logs" -name "mainsail*" 2> /dev/null | sort)
if [[ -n ${files} ]]; then if [[ -n ${files} ]]; then
for file in ${files}; do for file in ${files}; do
@@ -236,6 +253,7 @@ function remove_mainsail() {
remove_mainsail_config remove_mainsail_config
remove_mainsail_logs remove_mainsail_logs
remove_mainsail_log_symlinks remove_mainsail_log_symlinks
remove_legacy_mainsail_log_symlinks
### remove mainsail_port from ~/.kiauh.ini ### remove mainsail_port from ~/.kiauh.ini
sed -i "/^mainsail_port=/d" "${INI_FILE}" sed -i "/^mainsail_port=/d" "${INI_FILE}"
@@ -397,13 +415,13 @@ function ms_theme_install() {
for folder in "${folder_arr[@]}"; do for folder in "${folder_arr[@]}"; do
### instance names/identifier of only numbers need to be prefixed with 'printer_' ### instance names/identifier of only numbers need to be prefixed with 'printer_'
if [[ ${folder} =~ ^[0-9]+$ ]]; then if [[ ${folder} =~ ^[0-9]+$ ]]; then
target_folders+=("${KLIPPER_CONFIG}/printer_${folder}") target_folders+=("${HOME}/printer_${folder}_data/config")
else else
target_folders+=("${KLIPPER_CONFIG}/${folder}") target_folders+=("${HOME}/${folder}_data/config")
fi fi
done done
else else
target_folders+=("${KLIPPER_CONFIG}") target_folders+=("${HOME}/printer_data/config")
fi fi
if (( ${#target_folders[@]} > 1 )); then if (( ${#target_folders[@]} > 1 )); then
@@ -411,7 +429,7 @@ function ms_theme_install() {
echo -e "| Please select the printer you want to apply the theme |" echo -e "| Please select the printer you want to apply the theme |"
echo -e "| installation to: |" echo -e "| installation to: |"
for (( i=0; i < ${#target_folders[@]}; i++ )); do for (( i=0; i < ${#target_folders[@]}; i++ )); do
folder=$(echo "${target_folders[${i}]}" | rev | cut -d "/" -f1 | rev) folder=$(echo "${target_folders[${i}]}" | rev | cut -d "/" -f2 | cut -d"_" -f2- | rev)
printf "|${cyan}%-55s${white}|\n" " ${i}) ${folder}" printf "|${cyan}%-55s${white}|\n" " ${i}) ${folder}"
done done
bottom_border bottom_border
@@ -440,8 +458,11 @@ function ms_theme_install() {
} }
function ms_theme_delete() { function ms_theme_delete() {
local theme_folders target_folders=() local regex theme_folders target_folders=()
theme_folders=$(find "${KLIPPER_CONFIG}" -mindepth 1 -type d -name ".theme" | sort)
regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/config\/\.theme"
theme_folders=$(find "${HOME}" -maxdepth 3 -type d -regextype posix-extended -regex "${regex}" | sort)
# theme_folders=$(find "${KLIPPER_CONFIG}" -mindepth 1 -type d -name ".theme" | sort)
### build target folder array ### build target folder array
for folder in ${theme_folders}; do for folder in ${theme_folders}; do
@@ -570,10 +591,11 @@ function enable_mainsail_remotemode() {
} }
function patch_mainsail_update_manager() { function patch_mainsail_update_manager() {
local patched="false" local patched moonraker_configs regex
local moonraker_configs regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/config\/moonraker\.conf"
moonraker_configs=$(find "${KLIPPER_CONFIG}" -type f -name "moonraker.conf" | sort) moonraker_configs=$(find "${HOME}" -maxdepth 3 -type f -regextype posix-extended -regex "${regex}" | sort)
patched="false"
for conf in ${moonraker_configs}; do for conf in ${moonraker_configs}; do
if ! grep -Eq "^\[update_manager mainsail\]$" "${conf}"; then if ! grep -Eq "^\[update_manager mainsail\]$" "${conf}"; then
### add new line to conf if it doesn't end with one ### add new line to conf if it doesn't end with one

View File

@@ -60,7 +60,7 @@ function moonraker_setup_dialog() {
### return early if klipper is not installed ### return early if klipper is not installed
local klipper_services local klipper_services
klipper_services=$(klipper_systemd) klipper_services=$(find_klipper_systemd)
if [[ -z ${klipper_services} ]]; then if [[ -z ${klipper_services} ]]; then
local error="Klipper not installed! Please install Klipper first!" local error="Klipper not installed! Please install Klipper first!"
log_error "Moonraker setup started without Klipper being installed. Aborting setup." log_error "Moonraker setup started without Klipper being installed. Aborting setup."
@@ -205,7 +205,7 @@ function moonraker_setup() {
create_moonraker_conf "${instance_arr[@]}" create_moonraker_conf "${instance_arr[@]}"
### step 4: create moonraker instances ### step 4: create moonraker instances
create_moonraker_service "${instance_arr[@]}" configure_moonraker_service "${instance_arr[@]}"
### step 5: create polkit rules for moonraker ### step 5: create polkit rules for moonraker
install_moonraker_polkit || true install_moonraker_polkit || true
@@ -240,18 +240,19 @@ function create_moonraker_conf() {
local input=("${@}") local input=("${@}")
local moonraker_count=${input[0]} && unset "input[0]" local moonraker_count=${input[0]} && unset "input[0]"
local names=("${input[@]}") && unset "input[@]" local names=("${input[@]}") && unset "input[@]"
local log="${KLIPPER_LOGS}" local port lan printer_data cfg_dir cfg uds
local lan
port=7125
lan="$(hostname -I | cut -d" " -f1 | cut -d"." -f1-2).0.0/16" lan="$(hostname -I | cut -d" " -f1 | cut -d"." -f1-2).0.0/16"
local port=7125 cfg_dir cfg db uds
if (( moonraker_count == 1 )); then if (( moonraker_count == 1 )); then
cfg_dir="${KLIPPER_CONFIG}" printer_data="${HOME}/printer_data"
cfg_dir="${printer_data}/config"
cfg="${cfg_dir}/moonraker.conf" cfg="${cfg_dir}/moonraker.conf"
db="${HOME}/.moonraker_database" uds="${printer_data}/comms/klippy.sock"
uds="/tmp/klippy_uds"
### write single instance config ### write single instance config
write_moonraker_conf "${cfg_dir}" "${cfg}" "${port}" "${log}" "${db}" "${uds}" "${lan}" write_moonraker_conf "${cfg_dir}" "${cfg}" "${port}" "${uds}" "${lan}"
elif (( moonraker_count > 1 )); then elif (( moonraker_count > 1 )); then
local j=0 re="^[1-9][0-9]*$" local j=0 re="^[1-9][0-9]*$"
@@ -259,16 +260,17 @@ function create_moonraker_conf() {
for (( i=1; i <= moonraker_count; i++ )); do for (( i=1; i <= moonraker_count; i++ )); do
### overwrite config folder if name is only a number ### overwrite config folder if name is only a number
if [[ ${names[j]} =~ ${re} ]]; then if [[ ${names[j]} =~ ${re} ]]; then
cfg_dir="${KLIPPER_CONFIG}/printer_${names[${j}]}" printer_data="${HOME}/printer_${names[${j}]}_data"
else else
cfg_dir="${KLIPPER_CONFIG}/${names[${j}]}" printer_data="${HOME}/${names[${j}]}_data"
fi fi
cfg_dir="${printer_data}/config"
cfg="${cfg_dir}/moonraker.conf" cfg="${cfg_dir}/moonraker.conf"
uds="/tmp/klippy_uds-${names[${j}]}" uds="${printer_data}/comms/klippy.sock"
db="${HOME}/.moonraker_database_${names[${j}]}"
### write multi instance config ### write multi instance config
write_moonraker_conf "${cfg_dir}" "${cfg}" "${port}" "${log}" "${db}" "${uds}" "${lan}" write_moonraker_conf "${cfg_dir}" "${cfg}" "${port}" "${uds}" "${lan}"
port=$(( port + 1 )) port=$(( port + 1 ))
j=$(( j + 1 )) j=$(( j + 1 ))
done && unset j done && unset j
@@ -279,7 +281,7 @@ function create_moonraker_conf() {
} }
function write_moonraker_conf() { function write_moonraker_conf() {
local cfg_dir=${1} cfg=${2} port=${3} log=${4} db=${5} uds=${6} lan=${7} local cfg_dir=${1} cfg=${2} port=${3} uds=${4} lan=${5}
local conf_template="${KIAUH_SRCDIR}/resources/moonraker.conf" local conf_template="${KIAUH_SRCDIR}/resources/moonraker.conf"
[[ ! -d ${cfg_dir} ]] && mkdir -p "${cfg_dir}" [[ ! -d ${cfg_dir} ]] && mkdir -p "${cfg_dir}"
@@ -287,8 +289,7 @@ function write_moonraker_conf() {
if [[ ! -f ${cfg} ]]; then if [[ ! -f ${cfg} ]]; then
status_msg "Creating moonraker.conf in ${cfg_dir} ..." status_msg "Creating moonraker.conf in ${cfg_dir} ..."
cp "${conf_template}" "${cfg}" cp "${conf_template}" "${cfg}"
sed -i "s|%USER%|${USER}|g" "${cfg}" sed -i "s|%USER%|${USER}|g; s|%PORT%|${port}|; s|%UDS%|${uds}|" "${cfg}"
sed -i "s|%CFG%|${cfg_dir}|; s|%PORT%|${port}|; s|%LOG%|${log}|; s|%DB%|${db}|; s|%UDS%|${uds}|" "${cfg}"
# if host ip is not in the default ip ranges replace placeholder, # if host ip is not in the default ip ranges replace placeholder,
# otherwise remove placeholder from config # otherwise remove placeholder from config
if ! grep -q "${lan}" "${cfg}"; then if ! grep -q "${lan}" "${cfg}"; then
@@ -302,20 +303,24 @@ function write_moonraker_conf() {
fi fi
} }
function create_moonraker_service() { function configure_moonraker_service() {
local input=("${@}") local input=("${@}")
local moonraker_count=${input[0]} && unset "input[0]" local moonraker_count=${input[0]} && unset "input[0]"
local names=("${input[@]}") && unset "input[@]" local names=("${input[@]}") && unset "input[@]"
local cfg_dir cfg log service local printer_data cfg_dir service env_file
if (( moonraker_count == 1 )) && [[ ${#names[@]} -eq 0 ]]; then if (( moonraker_count == 1 )) && [[ ${#names[@]} -eq 0 ]]; then
i="" i=""
cfg_dir="${KLIPPER_CONFIG}" printer_data="${HOME}/printer_data"
cfg="${cfg_dir}/moonraker.conf" cfg_dir="${printer_data}/config"
log="${KLIPPER_LOGS}/moonraker.log"
service="${SYSTEMD}/moonraker.service" service="${SYSTEMD}/moonraker.service"
env_file="${printer_data}/systemd/moonraker.env"
### create required folder structure
create_required_folders "${printer_data}"
### write single instance service ### write single instance service
write_moonraker_service "" "${cfg}" "${log}" "${service}" write_moonraker_service "" "${printer_data}" "${service}" "${env_file}"
ok_msg "Moonraker instance created!" ok_msg "Moonraker instance created!"
elif (( moonraker_count > 1 )) && [[ ${#names[@]} -gt 0 ]]; then elif (( moonraker_count > 1 )) && [[ ${#names[@]} -gt 0 ]]; then
@@ -324,16 +329,20 @@ function create_moonraker_service() {
for (( i=1; i <= moonraker_count; i++ )); do for (( i=1; i <= moonraker_count; i++ )); do
### overwrite config folder if name is only a number ### overwrite config folder if name is only a number
if [[ ${names[j]} =~ ${re} ]]; then if [[ ${names[j]} =~ ${re} ]]; then
cfg_dir="${KLIPPER_CONFIG}/printer_${names[${j}]}" printer_data="${HOME}/printer_${names[${j}]}_data"
else else
cfg_dir="${KLIPPER_CONFIG}/${names[${j}]}" printer_data="${HOME}/${names[${j}]}_data"
fi fi
cfg="${cfg_dir}/moonraker.conf" cfg_dir="${printer_data}/config"
log="${KLIPPER_LOGS}/moonraker-${names[${j}]}.log"
service="${SYSTEMD}/moonraker-${names[${j}]}.service" 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 multi instance service
write_moonraker_service "${names[${j}]}" "${cfg}" "${log}" "${service}" write_moonraker_service "${names[${j}]}" "${printer_data}" "${service}" "${env_file}"
ok_msg "Moonraker instance 'moonraker-${names[${j}]}' created!" ok_msg "Moonraker instance 'moonraker-${names[${j}]}' created!"
j=$(( j + 1 )) j=$(( j + 1 ))
done && unset i done && unset i
@@ -349,18 +358,20 @@ function create_moonraker_service() {
} }
function write_moonraker_service() { function write_moonraker_service() {
local i=${1} cfg=${2} log=${3} service=${4} local i=${1} printer_data=${2} service=${3} env_file=${4}
local service_template="${KIAUH_SRCDIR}/resources/moonraker.service" local service_template="${KIAUH_SRCDIR}/resources/moonraker.service"
local env_template="${KIAUH_SRCDIR}/resources/moonraker.env"
### replace all placeholders ### replace all placeholders
if [[ ! -f ${service} ]]; then if [[ ! -f ${service} ]]; then
status_msg "Creating Moonraker Service ${i} ..." status_msg "Creating Moonraker Service ${i} ..."
sudo cp "${service_template}" "${service}" sudo cp "${service_template}" "${service}"
sudo cp "${env_template}" "${env_file}"
[[ -z ${i} ]] && sudo sed -i "s| for instance moonraker-%INST%||" "${service}" [[ -z ${i} ]] && sudo sed -i "s| %INST%||" "${service}"
[[ -n ${i} ]] && sudo sed -i "s|%INST%|${i}|" "${service}" [[ -n ${i} ]] && sudo sed -i "s|%INST%|${i}|" "${service}"
sudo sed -i "s|%USER%|${USER}|; s|%ENV%|${MOONRAKER_ENV}|; s|%DIR%|${MOONRAKER_DIR}|" "${service}" sudo sed -i "s|%USER%|${USER}|g; s|%ENV%|${MOONRAKER_ENV}|; s|%ENV_FILE%|${env_file}|" "${service}"
sudo sed -i "s|%CFG%|${cfg}|; s|%LOG%|${log}|" "${service}" sudo sed -i "s|%USER%|${USER}|; s|%PRINTER_DATA%|${printer_data}|" "${env_file}"
fi fi
} }
@@ -453,9 +464,35 @@ function remove_moonraker_systemd() {
ok_msg "Moonraker Services removed!" ok_msg "Moonraker Services removed!"
} }
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
}
function remove_moonraker_logs() { 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
}
function remove_legacy_moonraker_logs() {
local files regex="moonraker(-[0-9a-zA-Z]+)?\.log(.*)?" local files regex="moonraker(-[0-9a-zA-Z]+)?\.log(.*)?"
files=$(find "${KLIPPER_LOGS}" -maxdepth 1 -regextype posix-extended -regex "${KLIPPER_LOGS}/${regex}" 2> /dev/null | sort) files=$(find "${HOME}/klipper_logs" -maxdepth 1 -regextype posix-extended -regex "${HOME}/klipper_logs/${regex}" 2> /dev/null | sort)
if [[ -n ${files} ]]; then if [[ -n ${files} ]]; then
for file in ${files}; do for file in ${files}; do
@@ -509,7 +546,9 @@ function remove_moonraker_polkit() {
function remove_moonraker() { function remove_moonraker() {
remove_moonraker_sysvinit remove_moonraker_sysvinit
remove_moonraker_systemd remove_moonraker_systemd
remove_moonraker_env_file
remove_moonraker_logs remove_moonraker_logs
remove_legacy_moonraker_logs
remove_moonraker_api_key remove_moonraker_api_key
remove_moonraker_polkit remove_moonraker_polkit
remove_moonraker_dir remove_moonraker_dir

View File

@@ -74,23 +74,29 @@ function set_upstream_nginx_cfg() {
} }
function symlink_webui_nginx_log() { function symlink_webui_nginx_log() {
local interface=${1} path="${KLIPPER_LOGS}" local interface path access_log error_log regex logpaths
local access_log="/var/log/nginx/${interface}-access.log"
local error_log="/var/log/nginx/${interface}-error.log"
[[ ! -d ${path} ]] && mkdir -p "${path}" interface=${1}
access_log="/var/log/nginx/${interface}-access.log"
error_log="/var/log/nginx/${interface}-error.log"
regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/logs"
logpaths=$(find "${HOME}" -maxdepth 2 -type d -regextype posix-extended -regex "${regex}" | sort)
if [[ -f ${access_log} && ! -L "${path}/${interface}-access.log" ]]; then for path in ${logpaths}; do
status_msg "Creating symlink for ${access_log} ..." [[ ! -d ${path} ]] && mkdir -p "${path}"
ln -s "${access_log}" "${path}"
ok_msg "Done!"
fi
if [[ -f ${error_log} && ! -L "${path}/${interface}-error.log" ]]; then if [[ -f ${access_log} && ! -L "${path}/${interface}-access.log" ]]; then
status_msg "Creating symlink for ${error_log} ..." status_msg "Creating symlink for ${access_log} ..."
ln -s "${error_log}" "${path}" ln -s "${access_log}" "${path}"
ok_msg "Done!" ok_msg "Symlink created: ${path}/${interface}-access.log"
fi fi
if [[ -f ${error_log} && ! -L "${path}/${interface}-error.log" ]]; then
status_msg "Creating symlink for ${error_log} ..."
ln -s "${error_log}" "${path}"
ok_msg "Symlink created: ${path}/${interface}-error.log"
fi
done
} }
function match_nginx_configs() { function match_nginx_configs() {

View File

@@ -25,7 +25,7 @@ function octoprint_setup_dialog() {
status_msg "Initializing OctoPrint installation ..." status_msg "Initializing OctoPrint installation ..."
local klipper_services local klipper_services
klipper_services=$(klipper_systemd) klipper_services=$(find_klipper_systemd)
if [[ -z ${klipper_services} ]]; then if [[ -z ${klipper_services} ]]; then
local error="Klipper not installed! Please install Klipper first!" local error="Klipper not installed! Please install Klipper first!"
log_error "OctoPrint setup started without Klipper being installed. Aborting setup." log_error "OctoPrint setup started without Klipper being installed. Aborting setup."

View File

@@ -55,17 +55,35 @@ function install_menu() {
4) 4)
do_action "install_fluidd" "install_ui";; do_action "install_fluidd" "install_ui";;
5) 5)
do_action "install_klipperscreen" "install_ui";; #do_action "install_klipperscreen" "install_ui";;
clear && print_header
print_error "Function currently disabled! Sorry!"
install_ui;;
6) 6)
do_action "octoprint_setup_dialog" "install_ui";; #do_action "octoprint_setup_dialog" "install_ui";;
clear && print_header
print_error "Function currently disabled! Sorry!"
install_ui;;
7) 7)
do_action "install_pgc_for_klipper" "install_ui";; #do_action "install_pgc_for_klipper" "install_ui";;
clear && print_header
print_error "Function currently disabled! Sorry!"
install_ui;;
8) 8)
do_action "telegram_bot_setup_dialog" "install_ui";; #do_action "telegram_bot_setup_dialog" "install_ui";;
clear && print_header
print_error "Function currently disabled! Sorry!"
install_ui;;
9) 9)
do_action "moonraker_obico_setup_dialog" "install_ui";; #do_action "moonraker_obico_setup_dialog" "install_ui";;
clear && print_header
print_error "Function currently disabled! Sorry!"
install_ui;;
10) 10)
do_action "install_mjpg-streamer" "install_ui";; #do_action "install_mjpg-streamer" "install_ui";;
clear && print_header
print_error "Function currently disabled! Sorry!"
install_ui;;
B|b) B|b)
clear; main_menu; break;; clear; main_menu; break;;
*) *)

View File

@@ -12,6 +12,10 @@
set -e set -e
function main_ui() { function main_ui() {
echo -e "${yellow}/=======================================================\\"
echo -e "| Please read the newest changelog carefully: |"
echo -e "| https://git.io/JnmlX |"
echo -e "\=======================================================/${white}"
top_border top_border
echo -e "| $(title_msg "~~~~~~~~~~~~~~~ [ Main Menu ] ~~~~~~~~~~~~~~~") |" echo -e "| $(title_msg "~~~~~~~~~~~~~~~ [ Main Menu ] ~~~~~~~~~~~~~~~") |"
hr hr
@@ -83,7 +87,8 @@ function print_klipper_repo() {
function main_menu() { function main_menu() {
print_header && main_ui clear && print_header
main_ui
### initialize kiauh.ini ### initialize kiauh.ini
init_ini init_ini
@@ -103,8 +108,9 @@ function main_menu() {
"restart octoprint") do_action_service "restart" "octoprint"; main_ui;; "restart octoprint") do_action_service "restart" "octoprint"; main_ui;;
update) do_action "update_kiauh" "main_ui";; update) do_action "update_kiauh" "main_ui";;
0)clear && print_header 0)clear && print_header
upload_selection #upload_selection
break;; print_error "Function currently disabled! Sorry!"
main_ui;;
1)clear && print_header 1)clear && print_header
install_menu install_menu
break;; break;;
@@ -118,8 +124,9 @@ function main_menu() {
advanced_menu advanced_menu
break;; break;;
5)clear && print_header 5)clear && print_header
backup_menu #backup_menu
break;; print_error "Function currently disabled! Sorry!"
main_ui;;
6)clear && print_header 6)clear && print_header
settings_menu settings_menu
break;; break;;
@@ -130,5 +137,5 @@ function main_menu() {
deny_action "main_ui";; deny_action "main_ui";;
esac esac
done done
clear; main_menu main_menu
} }

View File

@@ -14,20 +14,12 @@ set -e
function settings_ui() { function settings_ui() {
read_kiauh_ini "${FUNCNAME[0]}" read_kiauh_ini "${FUNCNAME[0]}"
local custom_cfg_loc="${custom_klipper_cfg_loc}"
local custom_repo="${custom_klipper_repo}" local custom_repo="${custom_klipper_repo}"
local custom_branch="${custom_klipper_repo_branch}" local custom_branch="${custom_klipper_repo_branch}"
local ms_pre_rls="${mainsail_install_unstable}" local ms_pre_rls="${mainsail_install_unstable}"
local fl_pre_rls="${fluidd_install_unstable}" local fl_pre_rls="${fluidd_install_unstable}"
local bbu="${backup_before_update}" local bbu="${backup_before_update}"
### config location
if [[ -z ${custom_cfg_loc} ]]; then
custom_cfg_loc="${cyan}${KLIPPER_CONFIG}${white}"
else
custom_cfg_loc="${cyan}${custom_cfg_loc}${white}"
fi
### custom repository ### custom repository
custom_repo=$(echo "${custom_repo}" | sed "s/https:\/\/github\.com\///" | sed "s/\.git$//" ) custom_repo=$(echo "${custom_repo}" | sed "s/https:\/\/github\.com\///" | sed "s/\.git$//" )
if [[ -z ${custom_repo} ]]; then if [[ -z ${custom_repo} ]]; then
@@ -67,8 +59,6 @@ function settings_ui() {
echo -e "| $(title_msg "~~~~~~~~~~~~ [ KIAUH Settings ] ~~~~~~~~~~~~~") |" echo -e "| $(title_msg "~~~~~~~~~~~~ [ KIAUH Settings ] ~~~~~~~~~~~~~") |"
hr hr
echo -e "| Klipper: |" echo -e "| Klipper: |"
echo -e "| ● Config folder: |"
printf "| %-60s|\n" "${custom_cfg_loc}"
echo -e "| ● Repository: |" echo -e "| ● Repository: |"
printf "| %-70s|\n" "${custom_repo} (${custom_branch})" printf "| %-70s|\n" "${custom_repo} (${custom_branch})"
hr hr
@@ -77,24 +67,23 @@ function settings_ui() {
hr hr
printf "| Backup before updating: %-42s|\n" "${bbu}" printf "| Backup before updating: %-42s|\n" "${bbu}"
hr hr
echo -e "| 1) Change Klipper config folder location |" echo -e "| 1) Set custom Klipper repository |"
echo -e "| 2) Set custom Klipper repository |"
blank_line blank_line
if [[ ${mainsail_install_unstable} == "false" ]]; then if [[ ${mainsail_install_unstable} == "false" ]]; then
echo -e "| 3) ${green}Allow${white} unstable Mainsail releases |" echo -e "| 2) ${green}Allow${white} unstable Mainsail releases |"
else else
echo -e "| 3) ${red}Disallow${white} unstable Mainsail releases |" echo -e "| 2) ${red}Disallow${white} unstable Mainsail releases |"
fi fi
if [[ ${fluidd_install_unstable} == "false" ]]; then if [[ ${fluidd_install_unstable} == "false" ]]; then
echo -e "| 4) ${green}Allow${white} unstable Fluidd releases |" echo -e "| 3) ${green}Allow${white} unstable Fluidd releases |"
else else
echo -e "| 4) ${red}Disallow${white} unstable Fluidd releases |" echo -e "| 3) ${red}Disallow${white} unstable Fluidd releases |"
fi fi
blank_line blank_line
if [[ ${backup_before_update} == "false" ]]; then if [[ ${backup_before_update} == "false" ]]; then
echo -e "| 5) ${green}Enable${white} automatic backups before updates |" echo -e "| 4) ${green}Enable${white} automatic backups before updates |"
else else
echo -e "| 5) ${red}Disable${white} automatic backups before updates |" echo -e "| 4) ${red}Disable${white} automatic backups before updates |"
fi fi
back_help_footer back_help_footer
} }
@@ -105,16 +94,6 @@ function show_settings_help() {
top_border top_border
echo -e "| ~~~~~~ < ? > Help: KIAUH Settings < ? > ~~~~~~ |" echo -e "| ~~~~~~ < ? > Help: KIAUH Settings < ? > ~~~~~~ |"
hr hr
echo -e "| ${cyan}Klipper config folder:${white} |"
echo -e "| The location of your printer.cfg and all other config |"
echo -e "| files that gets used during installation of Klipper |"
echo -e "| and all other components which need that location. |"
echo -e "| It is not recommended to change this location. |"
echo -e "| Be advised, that negative side effects could occur. |"
blank_line
printf "| Default: %-55s|\n" "${default_cfg}"
blank_line
hr
echo -e "| ${cyan}Install unstable releases:${white} |" echo -e "| ${cyan}Install unstable releases:${white} |"
echo -e "| If set to ${green}true${white}, KIAUH installs/updates the software |" echo -e "| If set to ${green}true${white}, KIAUH installs/updates the software |"
echo -e "| with the latest, currently available release. |" echo -e "| with the latest, currently available release. |"
@@ -160,20 +139,16 @@ function settings_menu() {
read -p "${cyan}####### Perform action:${white} " action read -p "${cyan}####### Perform action:${white} " action
case "${action}" in case "${action}" in
1) 1)
clear && print_header
change_klipper_cfg_folder
settings_ui;;
2)
clear && print_header clear && print_header
change_klipper_repo_menu change_klipper_repo_menu
settings_ui;; settings_ui;;
3) 2)
switch_mainsail_releasetype switch_mainsail_releasetype
settings_menu;; settings_menu;;
4) 3)
switch_fluidd_releasetype switch_fluidd_releasetype
settings_menu;; settings_menu;;
5) 4)
toggle_backup_before_update toggle_backup_before_update
settings_menu;; settings_menu;;
B|b) B|b)

View File

@@ -156,10 +156,6 @@ function init_ini() {
echo -e "\nlogupload_accepted=false\c" >> "${INI_FILE}" echo -e "\nlogupload_accepted=false\c" >> "${INI_FILE}"
fi fi
if ! grep -Eq "^custom_klipper_cfg_loc=" "${INI_FILE}"; then
echo -e "\ncustom_klipper_cfg_loc=\c" >> "${INI_FILE}"
fi
if ! grep -Eq "^custom_klipper_repo=" "${INI_FILE}"; then if ! grep -Eq "^custom_klipper_repo=" "${INI_FILE}"; then
echo -e "\ncustom_klipper_repo=\c" >> "${INI_FILE}" echo -e "\ncustom_klipper_repo=\c" >> "${INI_FILE}"
fi fi
@@ -184,157 +180,6 @@ function init_ini() {
sed -i "/^[[:blank:]]*$/ d" "${INI_FILE}" sed -i "/^[[:blank:]]*$/ d" "${INI_FILE}"
} }
function change_klipper_cfg_folder() {
local current_cfg_loc example_loc recommended_loc new_cfg_loc
current_cfg_loc="$(get_klipper_cfg_dir)"
example_loc=$(printf "%s/<your_config_folder>" "${HOME}")
recommended_loc=$(printf "%s/klipper_config" "${HOME}")
local yn
while true; do
top_border
echo -e "| ${yellow}IMPORTANT:${white} |"
echo -e "| Please enter the new path in the following format: |"
printf "| ${cyan}%-51s${white} |\n" "${example_loc}"
blank_line
echo -e "| ${red}WARNING: ${white} |"
echo -e "| ${red}There will be no validation checks! Make sure to set${white} |"
echo -e "| ${red}a valid directory to prevent possible problems!${white} |"
blank_line
printf "| Recommended: ${cyan}%-38s${white} |\n" "${recommended_loc}"
bottom_border
echo
echo -e "${cyan}###### Please set the new Klipper config directory:${white} "
read -e -i "${current_cfg_loc}" -e new_cfg_loc
echo
read -p "${cyan}###### Set config directory to '${yellow}${new_cfg_loc}${cyan}' ? (Y/n):${white} " yn
case "${yn}" in
Y|y|Yes|yes|"")
select_msg "Yes"
set_klipper_cfg_path "${current_cfg_loc}" "${new_cfg_loc}"
print_confirm "New config directory set!"
break;;
N|n|No|no)
select_msg "No"
break;;
*)
print_error "Invalid command!";;
esac
done
}
function set_klipper_cfg_path() {
local current_cfg_loc="${1}" new_cfg_loc="${2}"
local instance klipper_services moonraker_services moonraker_configs
log_info "Function set_klipper_cfg_path invoked\nCurrent location: ${1}\nNew location: ${2}"
### backup the old config dir
backup_klipper_config_dir
### write new location to .kiauh.ini
sed -i "/^custom_klipper_cfg_loc=/d" "${INI_FILE}"
sed -i '$a'"custom_klipper_cfg_loc=${new_cfg_loc}" "${INI_FILE}"
status_msg "New directory was set to '${new_cfg_loc}'!"
### stop services
do_action_service "stop" "klipper"
do_action_service "stop" "moonraker"
### copy config files to new klipper config folder
if [[ -n ${current_cfg_loc} && -d ${current_cfg_loc} ]]; then
status_msg "Copy config files to '${new_cfg_loc}' ..."
if [[ ! -d ${new_cfg_loc} ]]; then
log_info "Copy process started"
mkdir -p "${new_cfg_loc}"
cd "${current_cfg_loc}"
cp -r -v ./* "${new_cfg_loc}"
ok_msg "Done!"
else
log_warning "Copy process skipped, new config directory already exists and may not be empty!"
warn_msg "New config directory already exists! Copy process skipped!"
fi
fi
klipper_services=$(klipper_systemd)
if [[ -n ${klipper_services} ]]; then
status_msg "Re-writing Klipper services to use new config file location ..."
for service in ${klipper_services}; do
if [[ ${service} = "/etc/systemd/system/klipper.service" ]]; then
if grep -q "Environment=KLIPPER_CONFIG=" "${service}"; then
### single instance klipper service installed by kiauh v4 / MainsailOS > 0.5.0
sudo sed -i -r "/KLIPPER_CONFIG=/ s|CONFIG=(.+)\/printer\.cfg|CONFIG=${new_cfg_loc}/printer\.cfg|" "${service}"
else
### single instance klipper service installed by kiauh v3
sudo sed -i -r "/ExecStart=/ s|klippy\.py (.+)\/printer\.cfg|klippy\.py ${new_cfg_loc}\/printer\.cfg|" "${service}"
fi
else
instance=$(echo "${service}" | cut -d"-" -f2 | cut -d"." -f1)
if grep -q "Environment=KLIPPER_CONFIG=" "${service}"; then
### multi instance klipper service installed by kiauh v4 / MainsailOS > 0.5.0
sudo sed -i -r "/KLIPPER_CONFIG=/ s|CONFIG=(.+)\/printer_${instance}\/printer\.cfg|CONFIG=${new_cfg_loc}\/printer_${instance}\/printer\.cfg|" "${service}"
else
### multi instance klipper service installed by kiauh v3
sudo sed -i -r "/ExecStart=/ s|klippy\.py (.+)\/printer_${instance}\/printer\.cfg|klippy\.py ${new_cfg_loc}\/printer_${instance}\/printer\.cfg|" "${service}"
fi
fi
done
ok_msg "OK!"
fi
moonraker_services=$(moonraker_systemd)
if [[ -n ${moonraker_services} ]]; then
### handle multi moonraker instance service file
status_msg "Re-writing Moonraker services to use new config file location ..."
for service in ${moonraker_services}; do
if [[ ${service} = "/etc/systemd/system/moonraker.service" ]]; then
if grep -q "Environment=MOONRAKER_CONF=" "${service}"; then
### single instance moonraker service installed by kiauh v4 / MainsailOS > 0.5.0
sudo sed -i -r "/MOONRAKER_CONF=/ s|_CONF=(.+)\/moonraker\.conf|_CONF=${new_cfg_loc}\/moonraker\.conf|" "${service}"
else
### single instance moonraker service installed by kiauh v3
sudo sed -i -r "/ExecStart=/ s| -c (.+)\/moonraker\.conf| -c ${new_cfg_loc}\/moonraker\.conf|" "${service}"
fi
else
instance=$(echo "${service}" | cut -d"-" -f2 | cut -d"." -f1)
if grep -q "Environment=MOONRAKER_CONF=" "${service}"; then
### multi instance moonraker service installed by kiauh v4 / MainsailOS > 0.5.0
sudo sed -i -r "/MOONRAKER_CONF=/ s|_CONF=(.+)\/printer_${instance}\/moonraker\.conf|_CONF=${new_cfg_loc}\/printer_${instance}\/moonraker\.conf|" "${service}"
else
### multi instance moonraker service installed by kiauh v3
sudo sed -i -r "/ExecStart=/ s| -c (.+)\/printer_${instance}\/moonraker\.conf| -c ${new_cfg_loc}\/printer_${instance}\/moonraker\.conf|" "${service}"
fi
fi
done
moonraker_configs=$(find "${new_cfg_loc}" -type f -name "moonraker.conf" | sort)
### replace old file path with new one in moonraker.conf
local loc
for conf in ${moonraker_configs}; do
loc=$(echo "${conf}" | rev | cut -d"/" -f2- | rev)
sed -i -r "/config_path:/ s|config_path:.*|config_path: ${loc}|" "${conf}"
done
ok_msg "OK!"
fi
### reloading units
sudo systemctl daemon-reload
### restart services
do_action_service "restart" "klipper"
do_action_service "restart" "moonraker"
}
function switch_mainsail_releasetype() { function switch_mainsail_releasetype() {
read_kiauh_ini "${FUNCNAME[0]}" read_kiauh_ini "${FUNCNAME[0]}"
local state="${mainsail_install_unstable}" local state="${mainsail_install_unstable}"
@@ -493,6 +338,38 @@ function fetch_webui_ports() {
#=================== SYSTEM =====================# #=================== SYSTEM =====================#
#================================================# #================================================#
function find_klipper_initd() {
local services
services=$(find "${INITD}" -maxdepth 1 -regextype posix-extended -regex "${INITD}/klipper(-[^0])?[0-9]*" | sort)
echo "${services}"
}
function find_klipper_systemd() {
local services
services=$(find "${SYSTEMD}" -maxdepth 1 -regextype posix-extended -regex "${SYSTEMD}/klipper(-[0-9a-zA-Z]+)?.service" | sort)
echo "${services}"
}
function create_required_folders() {
local printer_data=${1} folders
folders=("backup" "certs" "config" "database" "gcodes" "comms" "logs" "systemd")
for folder in "${folders[@]}"; do
local dir="${printer_data}/${folder}"
### remove possible symlink created by moonraker
if [[ -L "${dir}" && -d "${dir}" ]]; then
rm "${dir}"
fi
if [[ ! -d "${dir}" ]]; then
status_msg "Creating folder '${dir}' ..."
mkdir -p "${dir}"
ok_msg "Folder '${dir}' created!"
fi
done
}
function check_system_updates() { function check_system_updates() {
local updates_avail info_msg local updates_avail info_msg
updates_avail=$(apt list --upgradeable 2>/dev/null | sed "1d") updates_avail=$(apt list --upgradeable 2>/dev/null | sed "1d")
@@ -720,7 +597,7 @@ function set_multi_instance_names() {
local name local name
local names="" local names=""
local services=$(klipper_systemd) local services=$(find_klipper_systemd)
### ###
# if value of 'multi_instance_names' is not an empty # if value of 'multi_instance_names' is not an empty
@@ -785,7 +662,7 @@ function get_config_folders() {
cfg_dirs+=("${KLIPPER_CONFIG}/${name}") cfg_dirs+=("${KLIPPER_CONFIG}/${name}")
fi fi
done done
elif [[ -z ${instance_names} && $(klipper_systemd | wc -w) -gt 0 ]]; then elif [[ -z ${instance_names} && $(find_klipper_systemd | wc -w) -gt 0 ]]; then
cfg_dirs+=("${KLIPPER_CONFIG}") cfg_dirs+=("${KLIPPER_CONFIG}")
else else
cfg_dirs=() cfg_dirs=()