diff --git a/docs/changelog.md b/docs/changelog.md index f449f3a64bee5d0d692739cd2776aa12bc5a5251..b255c40dd658e1fe7e0599a2771e0f35cba74f91 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -2,6 +2,57 @@ 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 Support for "Obico for Klipper" was added! Huge thanks to [kennethjiang](https://github.com/kennethjiang) for helping me with the implementation! diff --git a/kiauh.sh b/kiauh.sh index b01b5d933ab18ac8203a784c6c006f35e094b206..8d40d98f79633743d25cb6497f22f4335f9749c6 100755 --- a/kiauh.sh +++ b/kiauh.sh @@ -9,6 +9,15 @@ # 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 clear diff --git a/resources/printer.cfg b/resources/example.printer.cfg similarity index 100% rename from resources/printer.cfg rename to resources/example.printer.cfg diff --git a/resources/klipper.env b/resources/klipper.env new file mode 100644 index 0000000000000000000000000000000000000000..1f16a6e54fddf3e66647ce0ea0195b5dd524640d --- /dev/null +++ b/resources/klipper.env @@ -0,0 +1 @@ +KLIPPER_ARGS="/home/%USER%/klipper/klippy/klippy.py %CFG% -I %PRINTER% -l %LOG% -a %UDS%" \ No newline at end of file diff --git a/resources/klipper.service b/resources/klipper.service index 5bf8f5a1d9289828856e1ff86b1287d18db51b05..bc6063d0b6f044375c0e037c1c9cdc94244605b9 100644 --- a/resources/klipper.service +++ b/resources/klipper.service @@ -1,7 +1,5 @@ -#Systemd Klipper Service - [Unit] -Description=Systemd Klipper Service for instance klipper-%INST% +Description=Klipper 3D Printer Firmware SV1 %INST% Documentation=https://www.klipper3d.org/ After=network.target Wants=udev.target @@ -10,13 +8,11 @@ Wants=udev.target WantedBy=multi-user.target [Service] -Environment=KLIPPER_CONFIG=%CFG% -Environment=KLIPPER_LOG=%LOG% -Environment=KLIPPER_SOCKET=%UDS% -Environment=KLIPPER_PRINTER=%PRINTER% Type=simple User=%USER% 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 RestartSec=10 \ No newline at end of file diff --git a/resources/moonraker.conf b/resources/moonraker.conf index f819c5ad5e4f12bfcd1469a2e262d5a603d1f891..bdca99ae2a26a8cb52140f2ab35c6cc46fcf3639 100644 --- a/resources/moonraker.conf +++ b/resources/moonraker.conf @@ -1,7 +1,6 @@ [server] host: 0.0.0.0 port: %PORT% -enable_debug_logging: False klippy_uds_address: %UDS% [authorization] @@ -22,13 +21,6 @@ cors_domains: https://app.fluidd.xyz http://app.fluidd.xyz -[database] -database_path: %DB% - -[file_manager] -config_path: %CFG% -log_path: %LOG% - [octoprint_compat] [history] diff --git a/resources/moonraker.env b/resources/moonraker.env new file mode 100644 index 0000000000000000000000000000000000000000..065ca7e52f820b6e1b5dfce285664466451b0373 --- /dev/null +++ b/resources/moonraker.env @@ -0,0 +1 @@ +MOONRAKER_ARGS="/home/%USER%/moonraker/moonraker/moonraker.py -d %PRINTER_DATA%" \ No newline at end of file diff --git a/resources/moonraker.service b/resources/moonraker.service index 0ef771f81f397557009d5ec0b319560f3d25335a..ac8000f343e5caa1863f2c91e1371c96c05cff4c 100644 --- a/resources/moonraker.service +++ b/resources/moonraker.service @@ -1,20 +1,19 @@ -#Systemd Moonraker Service - [Unit] -Description=Systemd Moonraker Service for instance moonraker-%INST% +Description=API Server for Klipper SV1 %INST% Documentation=https://moonraker.readthedocs.io/ -After=network.target +Requires=network-online.target +After=network-online.target [Install] WantedBy=multi-user.target [Service] -Environment=MOONRAKER_CONF=%CFG% -Environment=MOONRAKER_LOG=%LOG% Type=simple -SupplementaryGroups=moonraker-admin User=%USER% +SupplementaryGroups=moonraker-admin 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 RestartSec=10 \ No newline at end of file diff --git a/scripts/fluidd.sh b/scripts/fluidd.sh index 41e783859a3fed9e3be4039312180a299aef90ff..127798950917ce5160dad3fd3aaf791c0eb90d73 100644 --- a/scripts/fluidd.sh +++ b/scripts/fluidd.sh @@ -39,29 +39,29 @@ function install_fluidd() { ### check if another site already listens to port 80 fluidd_port_check - ### ask user to install mjpg-streamer - local install_mjpg_streamer - if [[ ! -f "${SYSTEMD}/webcamd.service" ]]; then - while true; do - echo - top_border - echo -e "| Install MJPG-Streamer for webcam support? |" - bottom_border - read -p "${cyan}###### Please select (y/N):${white} " yn - case "${yn}" in - Y|y|Yes|yes) - select_msg "Yes" - install_mjpg_streamer="true" - break;; - N|n|No|no|"") - select_msg "No" - install_mjpg_streamer="false" - break;; - *) - error_msg "Invalid command!";; - esac - done - fi +# ### ask user to install mjpg-streamer +# local install_mjpg_streamer +# if [[ ! -f "${SYSTEMD}/webcamd.service" ]]; then +# while true; do +# echo +# top_border +# echo -e "| Install MJPG-Streamer for webcam support? |" +# bottom_border +# read -p "${cyan}###### Please select (y/N):${white} " yn +# case "${yn}" in +# Y|y|Yes|yes) +# select_msg "Yes" +# install_mjpg_streamer="true" +# break;; +# N|n|No|no|"") +# select_msg "No" +# install_mjpg_streamer="false" +# break;; +# *) +# error_msg "Invalid command!";; +# esac +# done +# fi ### download fluidd download_fluidd @@ -83,7 +83,7 @@ function install_fluidd() { patch_fluidd_update_manager ### install mjpg-streamer - [[ ${install_mjpg_streamer} == "true" ]] && install_mjpg-streamer +# [[ ${install_mjpg_streamer} == "true" ]] && install_mjpg-streamer fetch_webui_ports #WIP @@ -124,9 +124,11 @@ function install_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 configs path - configs=$(find "${KLIPPER_CONFIG}" -type f -name "printer.cfg" | sort) + local fluidd_cfg path configs regex + + 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 for config in ${configs}; do @@ -214,8 +216,23 @@ function remove_fluidd_logs() { } 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 - 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 for file in ${files}; do @@ -231,6 +248,7 @@ function remove_fluidd() { remove_fluidd_config remove_fluidd_logs remove_fluidd_log_symlinks + remove_legacy_fluidd_log_symlinks ### remove fluidd_port from ~/.kiauh.ini sed -i "/^fluidd_port=/d" "${INI_FILE}" @@ -395,10 +413,11 @@ function select_fluidd_port() { } function patch_fluidd_update_manager() { - local patched="false" - local moonraker_configs - moonraker_configs=$(find "${KLIPPER_CONFIG}" -type f -name "moonraker.conf" | sort) + local patched moonraker_configs regex + regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/config\/moonraker\.conf" + moonraker_configs=$(find "${HOME}" -maxdepth 3 -type f -regextype posix-extended -regex "${regex}" | sort) + patched="false" for conf in ${moonraker_configs}; do if ! grep -Eq "^\[update_manager fluidd\]$" "${conf}"; then ### add new line to conf if it doesn't end with one diff --git a/scripts/gcode_shell_command.sh b/scripts/gcode_shell_command.sh index d54683914a709bbe518248320317172b1f83ac16..3ddb3f3f738a8c88b57818dd44616d9a0e76f3c2 100644 --- a/scripts/gcode_shell_command.sh +++ b/scripts/gcode_shell_command.sh @@ -105,10 +105,11 @@ function create_example_shell_command() { ### create a backup of the config folder backup_klipper_config_dir - local printer_cfgs path - printer_cfgs=$(find "$(get_klipper_cfg_dir)" -type f -name "printer.cfg" | sort) + local configs regex path + 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) if [[ ! -f "${path}/shell_command.cfg" ]]; then diff --git a/scripts/globals.sh b/scripts/globals.sh index 5eb327b90f99945b065e77af217d8c9048885a7f..56b3cd56f577218c7e6c775ce9f0cd0abeaa4929 100644 --- a/scripts/globals.sh +++ b/scripts/globals.sh @@ -34,8 +34,6 @@ function set_globals() { KLIPPY_ENV="${HOME}/klippy-env" KLIPPER_DIR="${HOME}/klipper" 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_ENV="${HOME}/moonraker-env" diff --git a/scripts/klipper.sh b/scripts/klipper.sh index 0ce70bc148db38fe8efb150ac2c226cad6f3ef68..2fdaa5076daac68e8e926f49bf10414545bd65b0 100644 --- a/scripts/klipper.sh +++ b/scripts/klipper.sh @@ -15,19 +15,6 @@ set -e #================ 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() { status_msg "Initializing Klipper installation ..." @@ -36,8 +23,8 @@ function klipper_setup_dialog() { local python_version="${1}" user_input=() local error - klipper_initd_service=$(klipper_initd) - klipper_systemd_services=$(klipper_systemd) + klipper_initd_service=$(find_klipper_initd) + klipper_systemd_services=$(find_klipper_systemd) user_input+=("${python_version}") ### return early if klipper already exists @@ -150,92 +137,6 @@ function klipper_setup_dialog() { klipper_setup "${user_input[@]}" } -### -# extracts the required packages from the -# install-debian.sh script and installs them -# -# @param {string}: python_version - klipper-env python version -# -function install_klipper_packages() { - local packages python_version="${1}" - local install_script="${KLIPPER_DIR}/scripts/install-debian.sh" - - status_msg "Reading dependencies..." - # shellcheck disable=SC2016 - packages=$(grep "PKGLIST=" "${install_script}" | cut -d'"' -f2 | sed 's/\${PKGLIST}//g' | tr -d '\n') - ### add dfu-util for octopi-images - packages+=" dfu-util" - ### add dbus requirement for DietPi distro - [[ -e "/boot/dietpi/.version" ]] && packages+=" dbus" - - if [[ ${python_version} == "python3" ]]; then - ### replace python-dev with python3-dev if python3 was selected - packages="${packages//python-dev/python3-dev}" - elif [[ ${python_version} == "python2" ]]; then - ### package name 'python-dev' is deprecated (-> no installation candidate) on more modern linux distros - packages="${packages//python-dev/python2-dev}" - else - log_error "Internal Error: missing parameter 'python_version' during function call of ${FUNCNAME[0]}" - error_msg "Internal Error: missing parameter 'python_version' during function call of ${FUNCNAME[0]}" - exit 1 - fi - - echo "${cyan}${packages}${white}" | tr '[:space:]' '\n' - read -r -a packages <<< "${packages}" - - ### Update system package info - status_msg "Updating package lists..." - if ! sudo apt-get update --allow-releaseinfo-change; then - log_error "failure while updating package lists" - error_msg "Updating package lists failed!" - exit 1 - fi - - ### Install required packages - status_msg "Installing required packages..." - if ! sudo apt-get install --yes "${packages[@]}"; then - log_error "failure while installing required klipper packages" - error_msg "Installing required packages 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 -} - function klipper_setup() { read_kiauh_ini "${FUNCNAME[0]}" ### index 0: python version, index 1: instance count, index 2-n: instance names (optional) @@ -244,8 +145,9 @@ function klipper_setup() { 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) + + ### checking dependencies dependency_check "${dep[@]}" ### step 1: clone klipper @@ -255,18 +157,14 @@ function klipper_setup() { 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 3: configure and create klipper instances + configure_klipper_service "${instance_arr[@]}" - ### step 4: create klipper instances - create_klipper_service "${instance_arr[@]}" - - ### step 5: enable and start all instances + ### step 4: enable and start all instances do_action_service "enable" "klipper" do_action_service "start" "klipper" - ### step 6: check for dialout group membership + ### step 5: check for dialout group membership check_usergroups ### confirm message @@ -300,53 +198,113 @@ function clone_klipper() { fi } -function write_klipper_service() { - local i=${1} cfg=${2} log=${3} printer=${4} uds=${5} service=${6} - local service_template="${KIAUH_SRCDIR}/resources/klipper.service" +function create_klipper_virtualenv() { + local python_version="${1}" - ### replace all placeholders - if [[ ! -f ${service} ]]; then - status_msg "Creating Klipper Service ${i} ..." - sudo cp "${service_template}" "${service}" - [[ -z ${i} ]] && sudo sed -i "s| for instance klipper-%INST%||" "${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|%LOG%|${log}|; s|%CFG%|${cfg}|; s|%PRINTER%|${printer}|; s|%UDS%|${uds}|" "${service}" + [[ ${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 } -function write_example_printer_cfg() { - local cfg_dir=${1} cfg=${2} - local cfg_template="${KIAUH_SRCDIR}/resources/printer.cfg" +### +# extracts the required packages from the +# install-debian.sh script and installs them +# +# @param {string}: python_version - klipper-env python version +# +function install_klipper_packages() { + local packages python_version="${1}" + local install_script="${KLIPPER_DIR}/scripts/install-debian.sh" - ### create a config directory if it doesn't exist - if [[ ! -d ${cfg_dir} ]]; then - status_msg "Creating '${cfg_dir}' ..." - mkdir -p "${cfg_dir}" + status_msg "Reading dependencies..." + # shellcheck disable=SC2016 + packages=$(grep "PKGLIST=" "${install_script}" | cut -d'"' -f2 | sed 's/\${PKGLIST}//g' | tr -d '\n') + ### add dfu-util for octopi-images + packages+=" dfu-util" + ### add dbus requirement for DietPi distro + [[ -e "/boot/dietpi/.version" ]] && packages+=" dbus" + + if [[ ${python_version} == "python3" ]]; then + ### replace python-dev with python3-dev if python3 was selected + packages="${packages//python-dev/python3-dev}" + elif [[ ${python_version} == "python2" ]]; then + ### package name 'python-dev' is deprecated (-> no installation candidate) on more modern linux distros + packages="${packages//python-dev/python2-dev}" + else + log_error "Internal Error: missing parameter 'python_version' during function call of ${FUNCNAME[0]}" + error_msg "Internal Error: missing parameter 'python_version' during function call of ${FUNCNAME[0]}" + exit 1 fi - ### create a minimal config if there is no printer.cfg - if [[ ! -f ${cfg} ]]; then - status_msg "Creating minimal example printer.cfg ..." - cp "${cfg_template}" "${cfg}" + echo "${cyan}${packages}${white}" | tr '[:space:]' '\n' + read -r -a packages <<< "${packages}" + + ### Update system package info + status_msg "Updating package lists..." + if ! sudo apt-get update --allow-releaseinfo-change; then + log_error "failure while updating package lists" + error_msg "Updating package lists failed!" + exit 1 + fi + + ### Install required packages + status_msg "Installing required packages..." + if ! sudo apt-get install --yes "${packages[@]}"; then + log_error "failure while installing required klipper packages" + error_msg "Installing required packages failed!" + exit 1 fi } -function create_klipper_service() { +function configure_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 + local printer_data cfg_dir cfg log printer uds service env_file if (( klipper_count == 1 )) && [[ ${#names[@]} -eq 0 ]]; then - cfg_dir="${KLIPPER_CONFIG}" + printer_data="${HOME}/printer_data" + cfg_dir="${printer_data}/config" cfg="${cfg_dir}/printer.cfg" - log="${KLIPPER_LOGS}/klippy.log" - printer="/tmp/printer" - uds="/tmp/klippy_uds" + 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" + + ### create required folder structure + create_required_folders "${printer_data}" + ### write single instance service - write_klipper_service "" "${cfg}" "${log}" "${printer}" "${uds}" "${service}" + write_klipper_service "" "${cfg}" "${log}" "${printer}" "${uds}" "${service}" "${env_file}" write_example_printer_cfg "${cfg_dir}" "${cfg}" ok_msg "Klipper instance created!" @@ -356,18 +314,24 @@ function create_klipper_service() { 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}]}" + printer_data="${HOME}/printer_${names[${j}]}_data" else - cfg_dir="${KLIPPER_CONFIG}/${names[${j}]}" + printer_data="${HOME}/${names[${j}]}_data" fi + cfg_dir="${printer_data}/config" cfg="${cfg_dir}/printer.cfg" - log="${KLIPPER_LOGS}/klippy-${names[${j}]}.log" - printer="/tmp/printer-${names[${j}]}" - uds="/tmp/klippy_uds-${names[${j}]}" + 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" + + ### create required folder structure + create_required_folders "${printer_data}" + ### write multi instance service - write_klipper_service "${names[${j}]}" "${cfg}" "${log}" "${printer}" "${uds}" "${service}" + 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 )) @@ -378,6 +342,40 @@ function create_klipper_service() { fi } +function write_klipper_service() { + 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 env_template="${KIAUH_SRCDIR}/resources/klipper.env" + + ### replace all placeholders + if [[ ! -f ${service} ]]; then + status_msg "Creating Klipper Service ${i} ..." + 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|%USER%|${USER}|g; s|%ENV%|${KLIPPY_ENV}|; s|%ENV_FILE%|${env_file}|" "${service}" + sudo sed -i "s|%USER%|${USER}|; s|%LOG%|${log}|; s|%CFG%|${cfg}|; s|%PRINTER%|${printer}|; s|%UDS%|${uds}|" "${env_file}" + fi +} + +function write_example_printer_cfg() { + local cfg_dir=${1} cfg=${2} + local cfg_template="${KIAUH_SRCDIR}/resources/example.printer.cfg" + + ### create a config directory if it doesn't exist + if [[ ! -d ${cfg_dir} ]]; then + status_msg "Creating '${cfg_dir}' ..." + mkdir -p "${cfg_dir}" + fi + + ### create a minimal config if there is no printer.cfg + if [[ ! -f ${cfg} ]]; then + status_msg "Creating minimal example printer.cfg ..." + cp "${cfg_template}" "${cfg}" + fi +} + #================================================# #================ REMOVE KLIPPER ================# #================================================# @@ -393,10 +391,10 @@ function remove_klipper_sysvinit() { } function remove_klipper_systemd() { - [[ -z $(klipper_systemd) ]] && return + [[ -z $(find_klipper_systemd) ]] && return 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} ..." sudo systemctl stop "${service}" sudo systemctl disable "${service}" @@ -410,9 +408,35 @@ function remove_klipper_systemd() { 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() { + 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(.*)?" - 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 for file in ${files}; do @@ -424,8 +448,8 @@ function remove_klipper_logs() { } function remove_klipper_uds() { - local files - files=$(find /tmp -maxdepth 1 -regextype posix-extended -regex "/tmp/klippy_uds(-[0-9a-zA-Z]+)?" | sort) + local files regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/comms\/klippy\.sock" + files=$(find "${HOME}" -maxdepth 3 -regextype posix-extended -regex "${regex}" | sort) if [[ -n ${files} ]]; then for file in ${files}; do @@ -437,9 +461,22 @@ function remove_klipper_uds() { } 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) + if [[ -n ${files} ]]; then for file in ${files}; do status_msg "Removing ${file} ..." @@ -468,9 +505,12 @@ function remove_klipper_env() { function remove_klipper() { remove_klipper_sysvinit remove_klipper_systemd + remove_klipper_env_file remove_klipper_logs + remove_legacy_klipper_logs remove_klipper_uds remove_klipper_printer + remove_legacy_klipper_printer remove_klipper_dir remove_klipper_env @@ -520,11 +560,11 @@ function update_klipper() { function get_klipper_status() { 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 - if [[ $(klipper_systemd | wc -w) -eq 0 ]] \ - && [[ $(klipper_initd | wc -w) -ge 1 ]]; then + if [[ $(find_klipper_systemd | wc -w) -eq 0 ]] \ + && [[ $(find_klipper_initd | wc -w) -ge 1 ]]; then sf_count=1 fi @@ -595,19 +635,6 @@ function compare_klipper_versions() { #=================== 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 # diff --git a/scripts/mainsail.sh b/scripts/mainsail.sh index bb4c282476ca85b5ce66d7e0e9a4711ce8c6257a..b3310edb9e75241621a7da9d13531273f64c22ce 100644 --- a/scripts/mainsail.sh +++ b/scripts/mainsail.sh @@ -39,29 +39,29 @@ function install_mainsail() { ### check if another site already listens to port 80 mainsail_port_check - ### ask user to install mjpg-streamer - local install_mjpg_streamer - if [[ ! -f "${SYSTEMD}/webcamd.service" ]]; then - while true; do - echo - top_border - echo -e "| Install MJPG-Streamer for webcam support? |" - bottom_border - read -p "${cyan}###### Please select (y/N):${white} " yn - case "${yn}" in - Y|y|Yes|yes) - select_msg "Yes" - install_mjpg_streamer="true" - break;; - N|n|No|no|"") - select_msg "No" - install_mjpg_streamer="false" - break;; - *) - error_msg "Invalid command!";; - esac - done - fi +# ### ask user to install mjpg-streamer +# local install_mjpg_streamer +# if [[ ! -f "${SYSTEMD}/webcamd.service" ]]; then +# while true; do +# echo +# top_border +# echo -e "| Install MJPG-Streamer for webcam support? |" +# bottom_border +# read -p "${cyan}###### Please select (y/N):${white} " yn +# case "${yn}" in +# Y|y|Yes|yes) +# select_msg "Yes" +# install_mjpg_streamer="true" +# break;; +# N|n|No|no|"") +# select_msg "No" +# install_mjpg_streamer="false" +# break;; +# *) +# error_msg "Invalid command!";; +# esac +# done +# fi ### download mainsail download_mainsail @@ -83,7 +83,7 @@ function install_mainsail() { patch_mainsail_update_manager ### install mjpg-streamer - [[ ${install_mjpg_streamer} == "true" ]] && install_mjpg-streamer +# [[ ${install_mjpg_streamer} == "true" ]] && install_mjpg-streamer fetch_webui_ports #WIP @@ -124,9 +124,11 @@ function install_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 configs path - configs=$(find "${KLIPPER_CONFIG}" -type f -name "printer.cfg" | sort) + local ms_cfg path configs regex + + 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 for config in ${configs}; do @@ -219,8 +221,23 @@ function remove_mainsail_logs() { } 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 - 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 for file in ${files}; do @@ -236,6 +253,7 @@ function remove_mainsail() { remove_mainsail_config remove_mainsail_logs remove_mainsail_log_symlinks + remove_legacy_mainsail_log_symlinks ### remove mainsail_port from ~/.kiauh.ini sed -i "/^mainsail_port=/d" "${INI_FILE}" @@ -397,13 +415,13 @@ function ms_theme_install() { for folder in "${folder_arr[@]}"; do ### instance names/identifier of only numbers need to be prefixed with 'printer_' if [[ ${folder} =~ ^[0-9]+$ ]]; then - target_folders+=("${KLIPPER_CONFIG}/printer_${folder}") + target_folders+=("${HOME}/printer_${folder}_data/config") else - target_folders+=("${KLIPPER_CONFIG}/${folder}") + target_folders+=("${HOME}/${folder}_data/config") fi done else - target_folders+=("${KLIPPER_CONFIG}") + target_folders+=("${HOME}/printer_data/config") fi 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 "| installation to: |" 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}" done bottom_border @@ -440,8 +458,11 @@ function ms_theme_install() { } function ms_theme_delete() { - local theme_folders target_folders=() - theme_folders=$(find "${KLIPPER_CONFIG}" -mindepth 1 -type d -name ".theme" | sort) + local regex theme_folders target_folders=() + + 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 for folder in ${theme_folders}; do @@ -570,10 +591,11 @@ function enable_mainsail_remotemode() { } function patch_mainsail_update_manager() { - local patched="false" - local moonraker_configs - moonraker_configs=$(find "${KLIPPER_CONFIG}" -type f -name "moonraker.conf" | sort) + local patched moonraker_configs regex + regex="\/home\/${USER}\/([A-Za-z0-9_]+)\/config\/moonraker\.conf" + moonraker_configs=$(find "${HOME}" -maxdepth 3 -type f -regextype posix-extended -regex "${regex}" | sort) + patched="false" for conf in ${moonraker_configs}; do if ! grep -Eq "^\[update_manager mainsail\]$" "${conf}"; then ### add new line to conf if it doesn't end with one diff --git a/scripts/moonraker.sh b/scripts/moonraker.sh index a345d28d93ce05dad414d2db96737f53ddf6dcb8..707b27d206599419d157a66d5c20bd2e2e5955ef 100644 --- a/scripts/moonraker.sh +++ b/scripts/moonraker.sh @@ -60,7 +60,7 @@ function moonraker_setup_dialog() { ### return early if klipper is not installed local klipper_services - klipper_services=$(klipper_systemd) + klipper_services=$(find_klipper_systemd) if [[ -z ${klipper_services} ]]; then local error="Klipper not installed! Please install Klipper first!" log_error "Moonraker setup started without Klipper being installed. Aborting setup." @@ -205,7 +205,7 @@ function moonraker_setup() { create_moonraker_conf "${instance_arr[@]}" ### step 4: create moonraker instances - create_moonraker_service "${instance_arr[@]}" + configure_moonraker_service "${instance_arr[@]}" ### step 5: create polkit rules for moonraker install_moonraker_polkit || true @@ -240,18 +240,19 @@ function create_moonraker_conf() { local input=("${@}") local moonraker_count=${input[0]} && unset "input[0]" local names=("${input[@]}") && unset "input[@]" - local log="${KLIPPER_LOGS}" - local lan + local port lan printer_data cfg_dir cfg uds + + port=7125 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 - cfg_dir="${KLIPPER_CONFIG}" + printer_data="${HOME}/printer_data" + cfg_dir="${printer_data}/config" cfg="${cfg_dir}/moonraker.conf" - db="${HOME}/.moonraker_database" - uds="/tmp/klippy_uds" + uds="${printer_data}/comms/klippy.sock" + ### 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 local j=0 re="^[1-9][0-9]*$" @@ -259,16 +260,17 @@ function create_moonraker_conf() { for (( i=1; i <= moonraker_count; i++ )); do ### overwrite config folder if name is only a number if [[ ${names[j]} =~ ${re} ]]; then - cfg_dir="${KLIPPER_CONFIG}/printer_${names[${j}]}" + printer_data="${HOME}/printer_${names[${j}]}_data" else - cfg_dir="${KLIPPER_CONFIG}/${names[${j}]}" + printer_data="${HOME}/${names[${j}]}_data" fi + cfg_dir="${printer_data}/config" cfg="${cfg_dir}/moonraker.conf" - uds="/tmp/klippy_uds-${names[${j}]}" - db="${HOME}/.moonraker_database_${names[${j}]}" + uds="${printer_data}/comms/klippy.sock" + ### 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 )) j=$(( j + 1 )) done && unset j @@ -279,7 +281,7 @@ function create_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" [[ ! -d ${cfg_dir} ]] && mkdir -p "${cfg_dir}" @@ -287,8 +289,7 @@ function write_moonraker_conf() { if [[ ! -f ${cfg} ]]; then status_msg "Creating moonraker.conf in ${cfg_dir} ..." cp "${conf_template}" "${cfg}" - sed -i "s|%USER%|${USER}|g" "${cfg}" - sed -i "s|%CFG%|${cfg_dir}|; s|%PORT%|${port}|; s|%LOG%|${log}|; s|%DB%|${db}|; s|%UDS%|${uds}|" "${cfg}" + sed -i "s|%USER%|${USER}|g; s|%PORT%|${port}|; s|%UDS%|${uds}|" "${cfg}" # if host ip is not in the default ip ranges replace placeholder, # otherwise remove placeholder from config if ! grep -q "${lan}" "${cfg}"; then @@ -302,20 +303,24 @@ function write_moonraker_conf() { fi } -function create_moonraker_service() { +function configure_moonraker_service() { local input=("${@}") local moonraker_count=${input[0]} && unset "input[0]" 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 i="" - cfg_dir="${KLIPPER_CONFIG}" - cfg="${cfg_dir}/moonraker.conf" - log="${KLIPPER_LOGS}/moonraker.log" + printer_data="${HOME}/printer_data" + cfg_dir="${printer_data}/config" 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_moonraker_service "" "${cfg}" "${log}" "${service}" + write_moonraker_service "" "${printer_data}" "${service}" "${env_file}" ok_msg "Moonraker instance created!" elif (( moonraker_count > 1 )) && [[ ${#names[@]} -gt 0 ]]; then @@ -324,16 +329,20 @@ function create_moonraker_service() { for (( i=1; i <= moonraker_count; i++ )); do ### overwrite config folder if name is only a number if [[ ${names[j]} =~ ${re} ]]; then - cfg_dir="${KLIPPER_CONFIG}/printer_${names[${j}]}" + printer_data="${HOME}/printer_${names[${j}]}_data" else - cfg_dir="${KLIPPER_CONFIG}/${names[${j}]}" + printer_data="${HOME}/${names[${j}]}_data" fi - cfg="${cfg_dir}/moonraker.conf" - log="${KLIPPER_LOGS}/moonraker-${names[${j}]}.log" + 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}]}" "${cfg}" "${log}" "${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 @@ -349,18 +358,20 @@ function create_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 env_template="${KIAUH_SRCDIR}/resources/moonraker.env" ### replace all placeholders if [[ ! -f ${service} ]]; then status_msg "Creating Moonraker Service ${i} ..." 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}" - sudo sed -i "s|%USER%|${USER}|; s|%ENV%|${MOONRAKER_ENV}|; s|%DIR%|${MOONRAKER_DIR}|" "${service}" - sudo sed -i "s|%CFG%|${cfg}|; s|%LOG%|${log}|" "${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 } @@ -453,9 +464,35 @@ function remove_moonraker_systemd() { 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() { + 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(.*)?" - 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 for file in ${files}; do @@ -509,7 +546,9 @@ function remove_moonraker_polkit() { function remove_moonraker() { remove_moonraker_sysvinit remove_moonraker_systemd + remove_moonraker_env_file remove_moonraker_logs + remove_legacy_moonraker_logs remove_moonraker_api_key remove_moonraker_polkit remove_moonraker_dir diff --git a/scripts/nginx.sh b/scripts/nginx.sh index dfff521e8c51f4acf0bd288c33b619265da60806..3a9215f17d0c7669717558a014a98b7f98d34fa8 100644 --- a/scripts/nginx.sh +++ b/scripts/nginx.sh @@ -74,23 +74,29 @@ function set_upstream_nginx_cfg() { } function symlink_webui_nginx_log() { - local interface=${1} path="${KLIPPER_LOGS}" - local access_log="/var/log/nginx/${interface}-access.log" - local error_log="/var/log/nginx/${interface}-error.log" + local interface path access_log error_log regex logpaths - [[ ! -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 - status_msg "Creating symlink for ${access_log} ..." - ln -s "${access_log}" "${path}" - ok_msg "Done!" - fi + for path in ${logpaths}; do + [[ ! -d ${path} ]] && mkdir -p "${path}" - if [[ -f ${error_log} && ! -L "${path}/${interface}-error.log" ]]; then - status_msg "Creating symlink for ${error_log} ..." - ln -s "${error_log}" "${path}" - ok_msg "Done!" - fi + if [[ -f ${access_log} && ! -L "${path}/${interface}-access.log" ]]; then + status_msg "Creating symlink for ${access_log} ..." + ln -s "${access_log}" "${path}" + ok_msg "Symlink created: ${path}/${interface}-access.log" + 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() { diff --git a/scripts/octoprint.sh b/scripts/octoprint.sh index db118fe0b5c3649acfe8350d63f57590374f9dbe..7f268f1e53613ba789b7228bbda22147c51b8b8e 100644 --- a/scripts/octoprint.sh +++ b/scripts/octoprint.sh @@ -25,7 +25,7 @@ function octoprint_setup_dialog() { status_msg "Initializing OctoPrint installation ..." local klipper_services - klipper_services=$(klipper_systemd) + klipper_services=$(find_klipper_systemd) if [[ -z ${klipper_services} ]]; then local error="Klipper not installed! Please install Klipper first!" log_error "OctoPrint setup started without Klipper being installed. Aborting setup." diff --git a/scripts/ui/install_menu.sh b/scripts/ui/install_menu.sh index 9f60e7f227326796f3cba16d95bcff2d9ad72f2e..e3ef00bbb7af370d5e74d47bf1bacfcacf34b39f 100755 --- a/scripts/ui/install_menu.sh +++ b/scripts/ui/install_menu.sh @@ -55,17 +55,35 @@ function install_menu() { 4) do_action "install_fluidd" "install_ui";; 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) - 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) - 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) - 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) - 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) - 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) clear; main_menu; break;; *) diff --git a/scripts/ui/main_menu.sh b/scripts/ui/main_menu.sh index 925fca68dfa06917854f016ef6f81d71907507ff..00e3989e89329891d6302cb03aaa19a0b68662e7 100755 --- a/scripts/ui/main_menu.sh +++ b/scripts/ui/main_menu.sh @@ -12,6 +12,10 @@ set -e 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 echo -e "| $(title_msg "~~~~~~~~~~~~~~~ [ Main Menu ] ~~~~~~~~~~~~~~~") |" hr @@ -83,7 +87,8 @@ function print_klipper_repo() { function main_menu() { - print_header && main_ui + clear && print_header + main_ui ### initialize kiauh.ini init_ini @@ -103,8 +108,9 @@ function main_menu() { "restart octoprint") do_action_service "restart" "octoprint"; main_ui;; update) do_action "update_kiauh" "main_ui";; 0)clear && print_header - upload_selection - break;; + #upload_selection + print_error "Function currently disabled! Sorry!" + main_ui;; 1)clear && print_header install_menu break;; @@ -118,8 +124,9 @@ function main_menu() { advanced_menu break;; 5)clear && print_header - backup_menu - break;; + #backup_menu + print_error "Function currently disabled! Sorry!" + main_ui;; 6)clear && print_header settings_menu break;; @@ -130,5 +137,5 @@ function main_menu() { deny_action "main_ui";; esac done - clear; main_menu + main_menu } diff --git a/scripts/ui/settings_menu.sh b/scripts/ui/settings_menu.sh index bb10bb6a2df707a1c9ff46a43ed84259403e6523..3146102e2bd8c70f039f59b62ba59eaf0404bd5e 100755 --- a/scripts/ui/settings_menu.sh +++ b/scripts/ui/settings_menu.sh @@ -14,20 +14,12 @@ set -e function settings_ui() { read_kiauh_ini "${FUNCNAME[0]}" - local custom_cfg_loc="${custom_klipper_cfg_loc}" local custom_repo="${custom_klipper_repo}" local custom_branch="${custom_klipper_repo_branch}" local ms_pre_rls="${mainsail_install_unstable}" local fl_pre_rls="${fluidd_install_unstable}" 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_repo=$(echo "${custom_repo}" | sed "s/https:\/\/github\.com\///" | sed "s/\.git$//" ) if [[ -z ${custom_repo} ]]; then @@ -67,8 +59,6 @@ function settings_ui() { echo -e "| $(title_msg "~~~~~~~~~~~~ [ KIAUH Settings ] ~~~~~~~~~~~~~") |" hr echo -e "| Klipper: |" - echo -e "| ● Config folder: |" - printf "| %-60s|\n" "${custom_cfg_loc}" echo -e "| ● Repository: |" printf "| %-70s|\n" "${custom_repo} (${custom_branch})" hr @@ -77,24 +67,23 @@ function settings_ui() { hr printf "| Backup before updating: %-42s|\n" "${bbu}" hr - echo -e "| 1) Change Klipper config folder location |" - echo -e "| 2) Set custom Klipper repository |" + echo -e "| 1) Set custom Klipper repository |" blank_line 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 - echo -e "| 3) ${red}Disallow${white} unstable Mainsail releases |" + echo -e "| 2) ${red}Disallow${white} unstable Mainsail releases |" fi 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 - echo -e "| 4) ${red}Disallow${white} unstable Fluidd releases |" + echo -e "| 3) ${red}Disallow${white} unstable Fluidd releases |" fi blank_line 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 - echo -e "| 5) ${red}Disable${white} automatic backups before updates |" + echo -e "| 4) ${red}Disable${white} automatic backups before updates |" fi back_help_footer } @@ -105,16 +94,6 @@ function show_settings_help() { top_border echo -e "| ~~~~~~ < ? > Help: KIAUH Settings < ? > ~~~~~~ |" 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 "| If set to ${green}true${white}, KIAUH installs/updates the software |" echo -e "| with the latest, currently available release. |" @@ -160,20 +139,16 @@ function settings_menu() { read -p "${cyan}####### Perform action:${white} " action case "${action}" in 1) - clear && print_header - change_klipper_cfg_folder - settings_ui;; - 2) clear && print_header change_klipper_repo_menu settings_ui;; - 3) + 2) switch_mainsail_releasetype settings_menu;; - 4) + 3) switch_fluidd_releasetype settings_menu;; - 5) + 4) toggle_backup_before_update settings_menu;; B|b) diff --git a/scripts/utilities.sh b/scripts/utilities.sh index 88d83e36b2df9e58be9d2c1a9513ee1c3869666d..bf5ae73f3c951c6f7f290034763bdebfca5cc874 100644 --- a/scripts/utilities.sh +++ b/scripts/utilities.sh @@ -156,10 +156,6 @@ function init_ini() { echo -e "\nlogupload_accepted=false\c" >> "${INI_FILE}" 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 echo -e "\ncustom_klipper_repo=\c" >> "${INI_FILE}" fi @@ -184,157 +180,6 @@ function init_ini() { 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() { read_kiauh_ini "${FUNCNAME[0]}" local state="${mainsail_install_unstable}" @@ -493,6 +338,38 @@ function fetch_webui_ports() { #=================== 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() { local updates_avail info_msg updates_avail=$(apt list --upgradeable 2>/dev/null | sed "1d") @@ -720,7 +597,7 @@ function set_multi_instance_names() { local name local names="" - local services=$(klipper_systemd) + local services=$(find_klipper_systemd) ### # if value of 'multi_instance_names' is not an empty @@ -785,7 +662,7 @@ function get_config_folders() { cfg_dirs+=("${KLIPPER_CONFIG}/${name}") fi 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}") else cfg_dirs=()