Compare commits

...

269 Commits
v2 ... v3

Author SHA1 Message Date
th33xitus
4bf9e8f0a8 fix(moonraker.conf): typos in cors domains 2022-05-10 20:15:50 +02:00
th33xitus
dd58229fee fix: bug in remove_klipperscreen() 2022-03-06 11:56:31 +01:00
Alex Zellner
6c4635fa4e fix(gcode_shell_command): py3 virtual env compatibility (#175) 2022-02-26 19:28:06 +01:00
th33xitus
4517415e9d fix: CRLF to LF 2022-02-26 19:17:22 +01:00
th33xitus
5c45bc7617 readme: fix link to user profile 2022-02-26 17:46:47 +01:00
th33xitus
d8ce465126 readme: add shields to readme 2022-02-26 17:44:59 +01:00
th33xitus
2f8c95a8c7 readme: update readme 2022-02-26 17:24:02 +01:00
th33xitus
4c083ceade fix: broken set_klipper_cfg_path function (#163) 2022-02-26 16:51:43 +01:00
th33xitus
259a6919f0 fix: link for theme data csv 2022-02-10 09:14:44 +01:00
th33xitus
4f7a49d85a fix: bug not updating all when selecting to do so.
* also make the confirm message more verbose and make it clear that KIAUH won't update any held back packages or any dist upgrades.
2022-02-07 14:47:36 +01:00
th33xitus
005a5061a7 chore: apply changes made in mainsailOS 0.6.1 2022-02-03 16:57:55 +01:00
th33xitus
634d795557 fix: bug not successfully copying new upstreams.conf and common_vars.conf 2022-01-31 12:00:57 +01:00
th33xitus
a14e321df9 fix: apply required changes due to introduction of PolicyKit and PackageKit in Moonraker 2022-01-29 23:06:02 +01:00
th33xitus
1682642e47 fix: revert 7e9d18b
Due to some investigations made in #158, the default IPv6 configuration will be removed again
2022-01-11 08:51:32 +01:00
th33xitus
7e9d18b54c script: add webui ipv6 listen directive (fixes #158) 2022-01-08 22:16:38 +01:00
th33xitus
d049d4c770 script: remove unused functions 2022-01-08 21:48:38 +01:00
th33xitus
108cda3cd6 shellcheck: apply fixes for SC2086 2022-01-08 21:45:55 +01:00
th33xitus
d7de58f538 feat: check for apache2 and prompt for action 2022-01-08 20:57:47 +01:00
th33xitus
572afa0396 fix: typo in bug_report.yml 2021-12-30 19:52:22 +01:00
th33xitus
63a5e1e323 update bug_report.yml 2021-12-30 19:49:14 +01:00
th33xitus
8c68eaa995 doc: update changelog.md 2021-12-30 19:26:28 +01:00
th33xitus
e8c0b3cf39 fix: formatting / add INFO prefix 2021-12-26 12:18:45 +01:00
th33xitus
cfad7a1fb0 fix: add check for membership of group 'tty'
It's possible that being part of group 'tty' is also needed to be able to flash an MCU
2021-12-25 00:52:08 +01:00
th33xitus
4113732daa fix: check if group dialout exists
first check if group dialout exists on the system. then check if the current user is not part of it. only then ask for adding the user to that group
2021-12-24 23:33:05 +01:00
th33xitus
95808a0d5b shellcheck: apply several fixes
apply fix for SC2219, SC2086, SC2236
2021-12-24 23:02:38 +01:00
th33xitus
e551c02507 chore: remove unused code 2021-12-24 22:52:21 +01:00
th33xitus
1f40686ea1 fix: improve moonraker service detection (fixes #156) 2021-12-24 22:50:50 +01:00
th33xitus
9b3d96545b refactor: improve error message 2021-12-24 16:22:46 +01:00
th33xitus
a632fae8f6 fix: check if user is in group "dialout" before starting flash or build+flash routine 2021-12-24 16:17:07 +01:00
th33xitus
4e3a701db4 fix: warn_msg should be status_msg 2021-12-24 14:49:23 +01:00
th33xitus
0c760b5aa2 fix: check membership of "video" usergroup (should fix #135) 2021-12-24 14:36:30 +01:00
th33xitus
3bc2f3b498 doc: document passing parameters to gcode_shell_commands 2021-12-24 01:08:09 +01:00
th33xitus
b92cfc3984 fix: klipper_cfg_loc was an empty string
if the config location wasn't already set before installing mjpg-streamer, klipper_cfg_loc was empty, even after calling the check_klipper_cfg_path function beforehand

moonraker.conf: set refresh_interval to 24hrs
2021-12-24 00:22:15 +01:00
th33xitus
01790b5c11 moonraker.conf: pre-configure clients for pre-release updates
moonraker.conf: set refresh_interval to 24hrs
2021-12-23 17:17:48 +01:00
th33xitus
8c7891e360 fix: libjpeg dependencies for ubuntu
chore: several shellcheck fixes
2021-12-23 16:50:48 +01:00
th33xitus
852f7c056a fix: wrong logic in if condition 2021-12-23 16:45:06 +01:00
th33xitus
8cffd07aef fix: klipper service detection
refactor: move $INSTANCE_COUNT into setup function

refactor: creating $PKGLIST

script: add short description to the dialog for selecting the amount of klipper instances

chore: several shellcheck fixes
2021-12-23 15:03:52 +01:00
th33xitus
40745e90df refactor: move $INSTANCE_COUNT into setup function 2021-12-23 14:19:06 +01:00
th33xitus
a43645cca0 refactor: better klipper service detection 2021-12-23 10:35:18 +01:00
th33xitus
4d834db5df refactor: unlink moonraker install from klipper instances
chore: several shellcheck fixes
2021-12-23 10:35:09 +01:00
th33xitus
771191ab69 chore: update .gitignore 2021-12-22 22:39:17 +01:00
th33xitus
7afe943ecc shellcheck: apply fix for SC2086 2021-12-19 17:14:24 +01:00
th33xitus
b06c17c184 fix: confirm flash condition (fixes #155) 2021-12-19 17:05:41 +01:00
Pedro Lamas
3af46b45ee github: adds GitHub issue templates (#150)
Signed-off-by: Pedro Lamas <pedrolamas@gmail.com>
2021-12-05 14:37:08 +01:00
th33xitus
b58e79634c fix: update URLs 2021-11-29 11:13:47 +01:00
Yoshito Komatsu
1ef9b0f58f fix: use [[:digit:]] instead of \d (#146) 2021-11-29 11:09:24 +01:00
th33xitus
8333ae1dc4 fix: also get pre-release versions
previous endpoint didn't allow kiauh to get pre-release versions of mainsail/fluidd
2021-11-20 15:17:21 +01:00
th33xitus
e0ae312a9e fix: missing declaration for OctoPrint backup (fixes #143) 2021-11-17 18:30:33 +01:00
th33xitus
4ce1ce72d3 chore: update moonraker.conf template 2021-11-14 11:29:14 +01:00
th33xitus
60842a330d chore: update webui links 2021-11-14 11:21:34 +01:00
th33xitus
05a59e9261 fix: correct ls command to find kiauh_macros.cfg 2021-11-11 14:15:00 +01:00
th33xitus
36a8757cfd chore: use ls to look for webcamd installation 2021-11-11 13:26:01 +01:00
th33xitus
fe4625d3e1 chore: refactor how moonraker is detected 2021-11-11 13:21:57 +01:00
th33xitus
19ddf3e023 fix: silence grep 2021-11-11 13:02:36 +01:00
th33xitus
ba888b1f97 chore: use ls within remove_nginx method 2021-11-11 12:51:09 +01:00
th33xitus
0284a36e7f chore: use ls to look for nginx installation 2021-11-11 12:43:13 +01:00
th33xitus
22f705e06c chore: manage moonraker service enable/start with do_action_service method 2021-11-11 12:28:20 +01:00
th33xitus
4c34245da0 chore: refactor how klipper services are count 2021-11-11 12:12:43 +01:00
th33xitus
f7cb3d6c97 script: refactor exit code evaluation in flash_mcu.sh 2021-10-31 13:53:22 +01:00
th33xitus
aaf4f7dd5c script: add logrotate rule for webcam service (#127) 2021-10-31 11:23:48 +01:00
Noah Pan
26bac791aa service: remove webcamd service restart interval. (#132) 2021-10-31 10:52:22 +01:00
th33xitus
aa4bdfc7b2 fix: invalid command bug in rollback UI (fixes #131) 2021-10-29 14:04:39 +02:00
th33xitus
311f3be864 fix: wrong check for moonraker multi-instance
The previous command also counted an available `moonraker-telegram-bot.service` and caused further issues with enabling the mainsail remoteMode accidentially.
2021-10-26 20:55:31 +02:00
th33xitus
511df1a889 fix: use correct themes.csv url 2021-10-25 22:22:32 +02:00
th33xitus
8d3ddc273a fix: allow non-single digit instance counts containing a 0 #129 2021-10-22 23:52:58 +02:00
th33xitus
f231fa9c69 gcode_shell_command: make RUN_SHELL_COMMAND accept optional parameters
Thanks @lixxbox for that code
2021-10-17 20:13:48 +02:00
th33xitus
9b6925e9c4 fix: add missing function call in install_webui 2021-10-02 11:26:43 +02:00
th33xitus
7f8ee7939c script: move nginx functions from install_moonraker.sh to install_klipper_webui.sh
nginx was removed as a dependency from moonraker. moonraker didn't make use of it, only mainsail/fluidd do. so moving all nginx related functions to  is reasonable
2021-10-01 23:58:03 +02:00
th33xitus
4d4c49d4c9 script: only display dialogs if files/service not found 2021-10-01 22:53:32 +02:00
th33xitus
7692227946 fix: function setup_moonraker_nginx_cfg 2021-10-01 21:51:33 +02:00
th33xitus
3da993a67c fix: breaking bug 2021-09-29 18:55:13 +02:00
th33xitus
6b74c59d15 script: add function to match nginx configurations
this should fix a common issue where mainsail/fluidd was installed with a more up2date nginx config which didn't match with a previously configured upstreams.conf.
this should also cover cases where the upstreams.conf is more up2date than the corresponding interface configs.
2021-09-29 14:44:01 +02:00
th33xitus
9cd27f7052 fix: backup nginx configs now works correctly 2021-09-28 18:22:50 +02:00
th33xitus
fc4fe130cd script: read webui ports from nginx config, write them to kiauh.ini 2021-09-28 18:22:50 +02:00
th33xitus
2a46b00cda Updating README.md / changelog.md 2021-09-28 17:25:40 +02:00
th33xitus
560186a40b chore: little UI tweaks, renaming "MTelegramBot" to "Telegram Bot" 2021-09-28 17:24:52 +02:00
th33xitus
75bca847f8 fix: remove telegram bot log also from ~/klipper_logs upon removal 2021-09-28 16:56:17 +02:00
Evgenii Shavrin
bb1f2eadca feat: add moonraker-telegram-bot by nlef (#117)
Adds installation and removing feature for https://github.com/nlef/moonraker-telegram-bot
2021-09-28 16:52:59 +02:00
Richard Mitchell
6d87716b1d gcode_shell_command: Fix issue with partial lines being repeated (#118)
Without clearing the partial line on a full line being sent the self.partial_output was repeated for every subsequent line.
2021-09-27 17:44:11 +02:00
th33xitus
1e8c379623 Create FUNDING.yml 2021-09-24 12:21:30 +02:00
th33xitus
6a8991d51e Update changelog.md 2021-09-24 12:19:41 +02:00
th33xitus
fb4367bb41 script: refactoring of the flash routine
script: uart devices can be detected/selected now

script: first implementation of a little help page
2021-09-24 11:59:50 +02:00
th33xitus
9463b719e4 script: update klipper github repository URL 2021-09-24 08:31:11 +02:00
th33xitus
65bf3d5251 fix: fix of previous commit and small refactor 2021-09-12 20:46:39 +02:00
AKA "Thom Wiley
68327262fc chore: change submenu "quit" to "back"
Changing the "Quit" option to "Back" as it is more intuitive, causes less confusion and is in fact the more fitting description of what is happening.
2021-09-12 20:41:27 +02:00
th33xitus
14ef39b87c fix: typo and missing function call for PrettyGCode 2021-08-25 10:14:05 +02:00
th33xitus
969d3b5dab script: add --allow-releaseinfo-change option to apt-get update 2021-08-25 10:05:31 +02:00
th33xitus
05842f8e1d feat: add PrettyGCode for Klipper 2021-08-10 12:25:05 +02:00
th33xitus
39219c105e script: add additional dependency check - should fix #97
Before starting the firmware building process, check for dependencies again.
2021-07-25 18:42:22 +02:00
th33xitus
7984c28fe5 script: add more default trusted_clients to moonraker.conf template
the previous method of adding the host network range was too unreliable in some cases and didn't cover some popular usecases
2021-07-11 19:13:37 +02:00
th33xitus
b44e855a98 script: simplify python dependency installation during klipper and moonraker update 2021-07-11 14:45:58 +02:00
th33xitus
52ab909ba5 script: update moonraker.conf, apply recent changes to the update manager section 2021-07-10 09:27:13 +02:00
th33xitus
4d7e10e5c3 script: update nginx configurations 2021-07-10 09:22:43 +02:00
th33xitus
d3726733e5 fix: small flash routine rework + user input validation 2021-07-04 20:09:25 +02:00
th33xitus
765f016ea2 fix: menu action for removing mainsail theme was missing 2021-07-01 21:38:14 +02:00
th33xitus
5deb987b8a script: patch log_path to moonraker.conf if missing 2021-06-29 22:58:21 +02:00
th33xitus
47d1321979 script: mainsail theme installer overhaul 2021-06-22 17:12:38 +02:00
th33xitus
b47a9cf7ed feat: add voron toolhead theme to mainsail theme installer 2021-06-22 12:07:27 +02:00
th33xitus
a9f23e9b23 script: remove else statement from do_action_service
Caused spamming of error messages when starting from a complete new Pi image.
2021-06-21 20:43:01 +02:00
th33xitus
814acbe92a script: add virtualenv to the moonraker dependency check #95 2021-06-21 08:44:37 +02:00
th33xitus
991dd79d01 script: add simple check for DietPi distro when creating the klipper dependency array 2021-06-18 18:28:27 +02:00
th33xitus
40875dfe49 script: simplify service action methods 2021-06-18 18:03:47 +02:00
th33xitus
806c6fd275 Update changelog.md 2021-06-15 17:36:08 +02:00
th33xitus
e9706b52d8 Update changelog.md 2021-06-15 17:22:39 +02:00
th33xitus
412e084d6d script: add short changelog url to kiauh update message 2021-06-15 16:40:10 +02:00
th33xitus
3ebee823ad script: remove KlipperScreen.log symlink dialog. 2021-06-15 16:12:58 +02:00
th33xitus
72312422e3 fix: performance improvement for loading the advanced menu ui 2021-06-15 15:56:13 +02:00
th33xitus
54089582e4 script: rewrite the auto mainsailOS/fluiddPi migration function
No auto update anymore when updating Klipper. The user now must start this function. It's available in the Advanced Menu.
2021-06-15 15:56:13 +02:00
th33xitus
9fd3f930df script: advanced_menu.sh, switch version becomes switch branch 2021-06-15 15:56:13 +02:00
th33xitus
98f0aa4b8f script: update log-upload function 2021-06-15 15:56:13 +02:00
th33xitus
19b37e4dc4 script: update klipper.service raw file link 2021-06-15 15:56:13 +02:00
th33xitus
d344b1c5f6 feat: auto mainsailOS / fluiddPi migration
script: make use of moonrakers new log_path configuration option

script: create webui nginx log symlinks upon installation/update
2021-06-15 15:56:13 +02:00
jordanruthe
f804fcb65d update: Fix detached head on KlipperScreen update (#93) 2021-06-13 17:39:12 +02:00
th33xitus
0edfc746d4 script: improve dependency checks on klipper/moonraker update 2021-06-08 17:55:40 +02:00
th33xitus
02ef0578e3 script: reading klipper/moonraker dependencies from their respective install scripts 2021-06-08 17:54:23 +02:00
th33xitus
5d11cd212a script: update install_moonraker.sh (#89) 2021-06-04 14:01:54 +02:00
cron410
bf33c77db7 script: install_klipper.sh prompt phrasing (#90) 2021-06-04 13:55:05 +02:00
th33xitus
0815d7778c feat: add cyberpunk theme to mainsail theme installer 2021-05-25 18:53:07 +02:00
th33xitus
9a3814f480 fix: typo in SYSTEMDDIR variable 2021-05-25 18:49:45 +02:00
th33xitus
a83585fb06 fix: improve pattern matching 2021-05-25 18:39:37 +02:00
th33xitus
dc27fe47e1 Merge branch 'b3tuning-install-mjpg-steamer-fix' 2021-05-25 12:16:27 +02:00
th33xitus
11b3d7a961 fix: replace config dir in webcamd file 2021-05-25 12:15:01 +02:00
th33xitus
9e0cdb0715 fix: remove webcamd file when removing mjpgstreamer 2021-05-25 12:13:36 +02:00
th33xitus
8abda56749 fix: typo in WEBCAM_TXT_SRC 2021-05-25 12:04:13 +02:00
James Hildebrand
cf20fc3c48 Issue 85 fix 2021-05-24 16:57:21 -07:00
th33xitus
6c8845d7b4 script: show found services in error message 2021-05-23 11:38:32 +02:00
th33xitus
fb0a30814d fix: validate user input for amount of Klipper instances to install 2021-05-23 10:44:51 +02:00
th33xitus
87f229c62d Update README.md 2021-05-23 10:08:16 +02:00
th33xitus
5b1da45688 fix: typo in dialog of get_mcu_id 2021-05-23 09:58:34 +02:00
th33xitus
545b978e80 update kiauh_macros.cfg
Update macros to reflect recent changes to Klipper

f10247a498
2021-05-21 08:55:11 +02:00
th33xitus
44f5609de6 script: remove deprecated moonraker.conf entries 2021-04-20 21:53:13 +02:00
th33xitus
f2a26d9b3d fix: false positive error message during klipper setup
add fix some status.sh functions too
2021-04-15 13:03:36 +02:00
Evgenii Shavrin
bb2cdab02b script: better moonraker service detection (#79)
More accurate service search
2021-04-13 12:21:16 +02:00
th33xitus
d6596d0a3d script: change kiauh update notification to a dialog 2021-04-08 18:07:30 +02:00
th33xitus
865fbc07dc script: updating webui nginx config and moonraker.conf template 2021-04-05 08:59:19 +02:00
th33xitus
40ba33eb19 fix: fix a bug that potentially caused writing a wrong config directory path to the moonraker.service file under special conditions 2021-04-03 19:29:59 +02:00
th33xitus
49b77162b0 fix: typo 2021-03-31 10:06:11 +02:00
th33xitus
adf087e3e5 script: activate [history] in moonraker.conf template 2021-03-31 09:16:31 +02:00
th33xitus
8220647564 script: rework mjpg-streamer service setup 2021-03-28 17:00:25 +02:00
th33xitus
57075ff525 script: rework klipper service setup 2021-03-28 16:45:16 +02:00
th33xitus
2f9de620bc script: rework moonraker service setup 2021-03-28 15:51:50 +02:00
th33xitus
d658c3a4cd fix: update nginx config 2021-03-28 15:46:48 +02:00
th33xitus
67f6a2c599 fix: broken update menu 2021-03-27 00:04:25 +01:00
th33xitus
f369c132d2 fix #74 - remove leftovers 2021-03-26 21:48:12 +01:00
th33xitus
cce6ac3c88 feat: add system upgrade 2021-03-26 18:36:05 +01:00
th33xitus
b9fe29068d script: apt-get update before apt-get install in dependency_check() 2021-03-25 21:40:16 +01:00
th33xitus
104089ea3d feat: add mjpg-streamer installer 2021-03-25 21:35:24 +01:00
th33xitus
48d97dab01 feat: backup moonraker database 2021-03-24 11:19:50 +01:00
th33xitus
e4a56564a1 fix: command for removing .octoprint dirs while uninstalling OctoPrint 2021-03-24 11:04:43 +01:00
th33xitus
6de8ce3278 script: add database_path to moonraker.conf template 2021-03-22 22:04:27 +01:00
th33xitus
b46457328f feat: followup to 7c7dd4e 2021-03-22 13:34:52 +01:00
th33xitus
7c7dd4ec3c feat: add mainsail theme installer 2021-03-22 10:55:24 +01:00
th33xitus
749293dde0 fix: visual bug 2021-03-17 16:13:53 +01:00
th33xitus
85f8ab4f24 fix: typo 2021-03-17 16:11:56 +01:00
th33xitus
e894496a6e script: add [history] to moonraker.conf template 2021-03-14 21:30:03 +01:00
th33xitus
19b220b772 fix: #71 2021-03-14 21:15:02 +01:00
th33xitus
a4eaa8952a script: remove unnecessary cors domains from moonraker.conf template 2021-03-12 11:20:38 +01:00
th33xitus
74a9bf783b script: deactivate moonrakers debug logging in moonraker.conf template 2021-03-11 22:08:05 +01:00
th33xitus
7597e999a1 fix: add 'octoprint_compat' entry to moonraker.conf template to enable slicer uploads 2021-03-05 09:12:00 +01:00
th33xitus
64d73ca86a refactor: determine installed services, combine single and multi remove into one step 2021-02-19 11:09:46 +01:00
th33xitus
d3283f7ab7 fix: try to fix a bug where the script errors out, telling that there is already a moonraker service installed but actually there isn't 2021-02-19 11:05:43 +01:00
th33xitus
cb443f6fee fix: rework remove processes 2021-02-17 20:50:36 +01:00
th33xitus
7162256e3f fix: remove klipperscreen log from tmp and user defined config folder 2021-02-17 20:31:26 +01:00
th33xitus
938b9d24f5 feature: add sdcard updates 2021-02-06 14:56:57 +01:00
th33xitus
38a3517c89 fix: autocommit.sh example uses .version files for getting mainsail and fluidd version 2021-02-06 12:16:04 +01:00
th33xitus
0b15cd0d9b fix: delete doubled status_msg in gcode_shell_command extension setup 2021-02-06 12:16:04 +01:00
th33xitus
9d7752a6c5 fix: typo in example pause macro 2021-02-04 19:36:57 +01:00
th33xitus
d1dff4d3b5 fix: logic error in build+flash function 2021-02-01 20:48:05 +01:00
th33xitus
49b7fe395b fix: detect an existing "legacy" klipper init.d installation 2021-01-31 18:34:05 +01:00
th33xitus
51469d8992 Update screenshot for KIAUH v3.0 2021-01-31 16:28:43 +01:00
th33xitus
16e6dde998 publish KIAUH v3.0 2021-01-31 16:20:52 +01:00
th33xitus
431f58af4b fix: code cleanup 2021-01-31 16:16:44 +01:00
th33xitus
c3af82745b Update docs 2021-01-31 16:09:00 +01:00
th33xitus
26eecbc94b fix: refactor main menu, add dwc and octoprint commands 2021-01-31 15:59:50 +01:00
th33xitus
fa8a9ff7ba fix: don't use systemctl commands anymore for reading the status if a service is installed and how much instances. instead only count the service files in /etc/systemd/system. this significantly improves performance of the script on low power hardware like a pi zero 2021-01-31 14:04:23 +01:00
th33xitus
dc08d8e7e3 fix: should fix #65 2021-01-31 13:32:16 +01:00
th33xitus
d0b895a469 fix.: make warning more clear 2021-01-30 20:42:32 +01:00
th33xitus
5aaebc2bec fix: add new cors domain to allow other ports than 80 only too. 2021-01-30 19:34:41 +01:00
th33xitus
538c179671 fix: visual bug in the webui installer 2021-01-30 19:33:38 +01:00
th33xitus
dc6fea8c3b fix: enable mainsail remoteMode if its already installed before moonraker 2021-01-30 18:19:49 +01:00
th33xitus
82227f8d0b fix: bug while creating the kiauh_macros.cfg 2021-01-30 16:13:20 +01:00
th33xitus
31c3f344e5 fix: add dialog: ask user to remove moonraker after klipper 2021-01-30 15:54:28 +01:00
th33xitus
a7b7b362f3 fix: typo in moonraker instance count status 2021-01-30 15:43:59 +01:00
th33xitus
5f142da1b6 fix: activate remoteMode for mainsail when moonraker multi-instances are found 2021-01-30 14:57:38 +01:00
th33xitus
99209f97de fix: refactor webui installer 2021-01-30 14:19:51 +01:00
th33xitus
8a64fe495e fix: add inactive klipperscreen entry to moonraker.conf 2021-01-30 12:52:58 +01:00
th33xitus
c3468c04e4 fix: bug when creating the local network ip range for moonraker.conf 2021-01-30 10:15:24 +01:00
th33xitus
2ef3273b74 fix: make remove function now also remove disabled octoprint services 2021-01-29 20:23:55 +01:00
th33xitus
47cf96ef74 fix: more verbose error message 2021-01-29 20:12:53 +01:00
th33xitus
17524bf49b fix: lock changing config folder function until klipper was installed through kiauh. 2021-01-29 20:10:04 +01:00
th33xitus
0d29bf9f31 fix: wording, description dialog 2021-01-29 18:00:47 +01:00
th33xitus
6105122467 fix: better explanation in the macro dialog 2021-01-29 17:13:19 +01:00
th33xitus
55dad5ffb6 fix: switch back to stephans repo, PR was merged. 2021-01-29 15:14:13 +01:00
th33xitus
53aa86d138 fix: missed updating a file name 2021-01-29 13:28:10 +01:00
th33xitus
a0e53655bd fix: bug with sourcing the kiauh.ini and improve config change function 2021-01-29 12:17:42 +01:00
th33xitus
69d134d9d1 fix: rework .octoprint folder remove function to be able to remove multiple instances 2021-01-28 23:42:38 +01:00
th33xitus
7224040f8a fix: check for multiple installed and enabled octoprint services 2021-01-28 23:41:54 +01:00
th33xitus
1570fd588e fix: display disabled octoprint services as installed, and show the number of instances 2021-01-28 23:40:37 +01:00
th33xitus
0eb2d066be fix: rework dwc and octoprint service handling 2021-01-28 23:39:42 +01:00
th33xitus
61d1c46694 fix: dependency check was missing for moonraker installation 2021-01-28 22:57:35 +01:00
th33xitus
04f204e4c7 fix: re-arrange mainsail and fluidd 2021-01-28 18:56:11 +01:00
th33xitus
f8aa88f480 fix: rework menus and UI 2021-01-28 18:54:02 +01:00
th33xitus
0c4f1a5378 fix: rework/refactor remove functions 2021-01-28 18:52:53 +01:00
th33xitus
4652e5c177 fix: added one more cors domain and changed ip-range for local network 2021-01-28 18:02:21 +01:00
th33xitus
a6156ebdf3 fix: make kiauh.ini a hidden file in users home folder 2021-01-28 17:56:23 +01:00
th33xitus
1c92987b42 fix: logic error 2021-01-28 17:50:35 +01:00
th33xitus
d01140638a fix: some typos when creating minimal cfg 2021-01-28 16:48:36 +01:00
th33xitus
254e1b8244 fix: create mainsail or fluidd nginx config from template 2021-01-28 16:45:12 +01:00
th33xitus
19aed15db0 fix: typos 2021-01-28 16:44:05 +01:00
th33xitus
b2b19f446b fix: use $klipper_cfg_loc in klipperscreen system check 2021-01-28 16:25:25 +01:00
th33xitus
8ad7f5d47c fix: remove update manager question. thanks to the recent changes to the update manager, mainsail and fluidd can be supported at the same time. 2021-01-28 16:21:24 +01:00
th33xitus
69eb96d006 fix: typo in moonraker backup function 2021-01-28 16:20:35 +01:00
th33xitus
e233d8435a fix: new date format, fix a typo, restructure backup.sh 2021-01-27 19:57:19 +01:00
th33xitus
fb52c7e4ab fix: relocate the kiauh.ini file to ~/.config to keep values even after reinstalling kiauh. 2021-01-27 18:51:48 +01:00
th33xitus
bc53de626f fix: version comparing and displaying issues 2021-01-27 18:13:21 +01:00
th33xitus
f10a604f97 fix: small clean-up 2021-01-25 19:09:30 +01:00
th33xitus
1527d7a25d Merge remote-tracking branch 'origin/master' into kiauh-rework 2021-01-25 19:01:55 +01:00
th33xitus
65062bdfda fix: update the macros used for pause, cancel resume by mainsail and fluidd to better ones 2021-01-25 18:51:31 +01:00
th33xitus
e3d242017d fix: update a comment in nginx configs 2021-01-25 18:50:49 +01:00
th33xitus
c14289a8a6 fix: add the new update manager entries to moonraker.conf 2021-01-25 18:50:25 +01:00
th33xitus
d9e697216f fix: small dwc2 related fixes 2021-01-21 23:47:29 +01:00
th33xitus
d958c1ba2a fix: prepare for possible multi instance capabilities of dwc2-for-klipper-socket 2021-01-21 23:34:25 +01:00
th33xitus
fb1d3a8cd9 fix: dwc installer rework, only for single instance atm. multi instance tbd... 2021-01-21 17:38:21 +01:00
th33xitus
7eb0fe24f8 fix: some typos in moonraker installer 2021-01-21 17:35:21 +01:00
th33xitus
738269adae fix: make use of the delivered .version files to read mainsail and fluidd version 2021-01-21 11:28:31 +01:00
th33xitus
d098eef08e fix: rename files to their correct name 2021-01-21 10:28:04 +01:00
th33xitus
598c106c3a fix: correct mainsail url 2021-01-21 10:23:08 +01:00
th33xitus
51207e2eb9 fix: remove file, config.yaml gets dynamically created now 2021-01-20 20:25:48 +01:00
th33xitus
ee252d185a fix: update octoprint installer for multi instances 2021-01-20 20:24:24 +01:00
th33xitus
cf1e37fb2a fix: rework octoprint remove function for removing multi instances 2021-01-20 20:23:55 +01:00
th33xitus
3d9722f877 fix: rename array 2021-01-20 20:19:53 +01:00
th33xitus
1ef67fa05c fix: insert blank lines in output 2021-01-20 15:16:41 +01:00
th33xitus
db856de8e5 fix: fix shell command installation 2021-01-20 15:16:22 +01:00
th33xitus
4748c15424 fix: update UI nginx configs 2021-01-20 15:00:12 +01:00
th33xitus
ab9d73b5b5 fix: minimal cfg 2021-01-20 14:55:20 +01:00
th33xitus
6c33282d43 fix: refactor main_menu 2021-01-17 14:50:55 +01:00
th33xitus
e71f1b9dfd fix: refactor install_menu 2021-01-17 14:44:10 +01:00
th33xitus
e24afa42ac fix: made log upload function multi instance capable 2021-01-17 14:29:36 +01:00
th33xitus
2fa975e3c2 fix: missed closing an if statement 2021-01-17 14:29:06 +01:00
th33xitus
feb912da8a fix: make adding the kiauh_macros optional 2021-01-17 12:58:25 +01:00
th33xitus
e5ce642018 fix: reorder the klippy_uds to the bottom 2021-01-17 12:44:42 +01:00
th33xitus
7a4ccfe4df fix: remove the functionality of patching an old/existing moonraker.conf only for making it compatible again. it will be way easier now to simply re-install moonraker and let those configs be created from scratch. 2021-01-17 11:50:20 +01:00
th33xitus
6b2175e439 fix: make klipperscreen installer use the klipper_cfg_loc variable for the printer config directory 2021-01-17 11:28:14 +01:00
th33xitus
dd2a26e2d0 del: remove now unused moonraker.conf template from resources 2021-01-17 11:23:26 +01:00
th33xitus
cd1489f0e5 fix: move the update manager function to the webinterface installations 2021-01-17 11:20:57 +01:00
th33xitus
d705a043c9 fix: add more trusted clients, cors domains, auto create a config folder if missing for whatever reason 2021-01-17 11:19:22 +01:00
th33xitus
c1a21c52b6 fix: create cfg directories if they are missing for whatever reason. 2021-01-17 11:18:09 +01:00
th33xitus
94762727ae fix: rename webui_macros.cfg to kiauh_macros.cfg 2021-01-17 11:17:37 +01:00
th33xitus
9cde005e08 fix: better default park position for printers with less than 230mm on x and y 2021-01-15 20:10:19 +01:00
th33xitus
86e7f37f7b fix: bigger refactoring of the klipper webui installer 2021-01-15 19:52:56 +01:00
th33xitus
4d2eb49e85 fix: big refactoring of the moonraker installer 2021-01-15 17:52:04 +01:00
th33xitus
715ab5f4e2 fix: display instance count in main menu status 2021-01-15 17:50:43 +01:00
th33xitus
146586f894 fix: correct mjpgstreamer port 2021-01-13 18:04:36 +01:00
th33xitus
bd78fa8ef7 add: quick and simple solution to start, stop, restart klipper/moonraker from within the main menu 2021-01-10 13:05:58 +01:00
th33xitus
b12d344b40 fix: update the config folder change function (its more like a "rename only" function now and should be plenty sufficient?) 2021-01-10 12:55:24 +01:00
th33xitus
9ea29bf995 fix: introduce new/better folder structure for multi instance setups 2021-01-09 23:17:45 +01:00
th33xitus
d066999d0b fix: little UI fixes 2021-01-09 18:02:59 +01:00
th33xitus
1ab681e71a fix: enable python3 check again, display moonraker IP at the end of the setup 2021-01-09 16:49:10 +01:00
th33xitus
f782a32e9c fix: bug in assigning correct port to instances 2021-01-09 16:08:29 +01:00
th33xitus
7dc1bc6cc8 fix: add full range of local network to auto-created moonraker.conf files 2021-01-08 20:02:58 +01:00
th33xitus
2a29716bb9 fix: make mcu ids verbose again for easier copy pasting into configs 2021-01-08 20:02:18 +01:00
th33xitus
33a9fef676 fix: check via md5sum of requirements text file if an update of the python env is necessary. if yes, do that update automatically. no user interaction anymore. 2021-01-08 14:57:51 +01:00
th33xitus
88afa55268 feat: support flashing of multiple connected mcus 2021-01-08 13:56:36 +01:00
th33xitus
65ec2e5e1a fix: bugs 2021-01-07 17:03:14 +01:00
th33xitus
08c1807cc7 fix: forgot to stop services first 2021-01-07 16:40:52 +01:00
th33xitus
218700b63d fix: add remove method for init.d moonraker service 2021-01-07 16:27:51 +01:00
th33xitus
bb1c5c4900 fix: add remove method for removing old init.d klipper service 2021-01-07 16:25:31 +01:00
th33xitus
08ae57d349 initial commit of a bigger kiauh rework to make multi instance installations possible 2021-01-07 15:26:19 +01:00
th33xitus
61dfab5683 feat: klipper config backup function 2021-01-07 15:24:25 +01:00
58 changed files with 4335 additions and 2736 deletions

12
.github/FUNDING.yml vendored Normal file
View File

@@ -0,0 +1,12 @@
# These are supported funding model platforms
github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
patreon: # Replace with a single Patreon username
open_collective: # Replace with a single Open Collective username
ko_fi: th33xitus
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

50
.github/ISSUE_TEMPLATE/bug_report.yml vendored Normal file
View File

@@ -0,0 +1,50 @@
name: Bug report
description: Create a report to help us improve
labels: ["bug"]
body:
- type: markdown
attributes:
value: |
This issue form is for reporting bugs only!
If you have a feature request, please use [feature_request](/new?template=feature_request.yml)
- type: textarea
id: distro
attributes:
label: Linux Distribution
description: >-
The linux distribution the issue occured on
validations:
required: true
- type: textarea
id: what-happened
attributes:
label: What happened
description: >-
A clear and concise description of what the bug is.
validations:
required: true
- type: textarea
id: expected-behavior
attributes:
label: What did you expect to happen
description: >-
A clear and concise description of what you expected to happen.
validations:
required: true
- type: textarea
id: repro-steps
attributes:
label: How to reproduce
description: >-
Minimal and precise steps to reproduce this bug.
validations:
required: true
- type: textarea
id: additional-info
attributes:
label: Additional information
description: |
If you have any additional information for us, use the field below.
Please note, you can attach screenshots or screen recordings here, by
dragging and dropping files in the field below.

5
.github/ISSUE_TEMPLATE/config.yml vendored Normal file
View File

@@ -0,0 +1,5 @@
blank_issues_enabled: false
contact_links:
- name: Klipper Discord
url: https://discord.klipper3d.org/
about: Quickest way to get in contact

View File

@@ -0,0 +1,40 @@
name: Feature request
description: Suggest an idea for this project
labels: ["feature request"]
body:
- type: markdown
attributes:
value: |
This issue form is for feature requests only!
If you've found a bug, please use [bug_report](/new?template=bug_report.yml)
- type: textarea
id: problem-description
attributes:
label: Is your feature request related to a problem? Please describe
description: >-
A clear and concise description of what the problem is.
validations:
required: true
- type: textarea
id: solution-description
attributes:
label: Describe the solution you'd like
description: >-
A clear and concise description of what you want to happen.
validations:
required: true
- type: textarea
id: possible-alternatives
attributes:
label: Describe alternatives you've considered
description: >-
A clear and concise description of any alternative solutions or features you've considered.
- type: textarea
id: additional-info
attributes:
label: Additional information
description: |
If you have any additional information for us, use the field below.
Please note, you can attach screenshots or screen recordings here, by
dragging and dropping files in the field below.

3
.gitignore vendored
View File

@@ -1 +1,2 @@
kiauh.ini .idea
.shellcheckrc

136
README.md
View File

@@ -1,53 +1,35 @@
# **KIAUH - Klipper Installation And Update Helper** ![main_menu](resources/screenshots/kiauh.png)
# Klipper Installation And Update Helper
![GitHub](https://img.shields.io/github/license/th33xitus/kiauh) ![GitHub Repo stars](https://img.shields.io/github/stars/th33xitus/kiauh) ![GitHub forks](https://img.shields.io/github/forks/th33xitus/kiauh) ![GitHub tag (latest SemVer)](https://img.shields.io/github/v/tag/th33xitus/kiauh) ![GitHub last commit](https://img.shields.io/github/last-commit/th33xitus/kiauh) ![GitHub contributors](https://img.shields.io/github/contributors/th33xitus/kiauh)
![main_menu](resources/screenshots/main.png) ### **📋 Please see the [Changelog](docs/changelog.md) for possible important information !**
--- **📢 Disclaimer: Usage of this script happens at your own risk!**
## **📋 Please see the [Changelog](docs/changelog.md) for possible important information !**
---
## **📢 Disclaimer: Usage of this script happens at your own risk!**
This script acts as a helping hand for you to get set up in a fast and comfortable way.\
**This does not mean, it will relieve you of using your brain.exe! 🧠**\
Feel free to give it a try. If you have suggestions or encounter any problems, please report them.
---
## **🛠️ Instructions:** ## **🛠️ Instructions:**
For downloading this script it is best to have git already installed.\ For downloading this script it is necessary to have git installed.\
If you haven't, please run `sudo apt-get install git -y` to install git first.\ If you haven't, please run `sudo apt-get install git -y` to install git first.\
You will need it anyways!
After git is installed, use the following commands in the given order to download and execute the script: After git is installed, use the following commands in the given order to download and execute the script:
```shell ```shell
cd ~ cd ~
git clone https://github.com/th33xitus/kiauh.git git clone https://github.com/th33xitus/kiauh.git
cd kiauh
chmod +x kiauh.sh scripts/* ./kiauh/kiauh.sh
./kiauh.sh
``` ```
## Additional Instructions:
If you need some more detailed instructions on how to install Klipper and Mainsail with KIAUH, check out this website:\
[Installing Klipper and Mainsail](https://3dp.tumbleweedlabs.com/firmware/klipper-firmware/installing-klipper-and-mainsail-on-your-raspberry-pi)\
Credits for these instructions go to [@tumbleweedlabs](https://github.com/tumbleweedlabs).\
Feel free to check out his work.
---
## **🧰 Functions and Features:** ## **🧰 Functions and Features:**
### **Core Functions:** ### **Core Functions:**
- **Installing** of the Klipper Firmware to your Raspberry Pi or other Linux Distribution which makes use of init.d. - **Installing** Klipper to your Raspberry Pi or other Debian based Linux Distribution.
- **Installing** of several different web interfaces such as Duet Web Control, Mainsail, Fluidd or OctoPrint including their dependencies. - **Installing** of the Moonraker API (needed for Mainsail, Fluidd and KlipperScreen)
- **Installing** of the Moonraker API - **Installing** several web interfaces such as Mainsail, Fluidd, Duet Web Control or OctoPrint including their dependencies.
- **Installing** of KlipperScreen (OctoScreen but for Klipper!)
- **Updating** of all the listed installations above excluding OctoPrint. For updating OctoPrint, please use the OctoPrint interface! - **Updating** of all the listed installations above excluding OctoPrint. For updating OctoPrint, please use the OctoPrint interface!
- **Removing** of all the listed installations above. - **Removing** of all the listed installations above.
- **Backup** of all the listed installations above. - **Backup** of all the listed installations above.
@@ -56,85 +38,35 @@ Feel free to check out his work.
- Build the Klipper Firmware - Build the Klipper Firmware
- Flash the MCU - Flash the MCU
- Read ID of the currently connected printer (only one at the time) - Read ID of the currently connected MCU
- Write necessary entries to your printer.cfg, some of them customizable right in the CLI.
- and more ... - and more ...
### **For a list of additional features please see: [Feature List](docs/features.md)** ### **For a list of additional features please see: [Feature List](docs/features.md)**
--- ## **❗ Notes:**
## **📝 Notes:** - Tested **only** on Raspberry Pi OS Lite (Debian 10 Buster)
- Other Debian based distributions can work
- Tested **only** on Raspberry Pi OS Lite (Debian Buster) - Reported to work on Armbian too
- During the use of this script you might be asked for your sudo password. There are several functions involved which need sudo privileges. - During the use of this script you might be asked for your sudo password. There are several functions involved which need sudo privileges.
--- ## **🌐 Sources & Further Information**
## **🛈 Sources & Further Information** For more information or instructions to the various components KIAUH can install, please check out the corresponding repositories listed below:
For more information or instructions, please check out the appropriate repositories listed below: * ⛵[Klipper](https://github.com/Klipper3d/klipper) by [KevinOConnor](https://github.com/KevinOConnor)
* 🌙[Moonraker](https://github.com/Arksine/moonraker) by [Arksine](https://github.com/Arksine)
* 💨[Mainsail](https://github.com/mainsail-crew/mainsail) by [mainsail-crew](https://github.com/mainsail-crew)
* 🌊[Fluidd](https://github.com/fluidd-core/fluidd) by [fluidd-core](https://github.com/fluidd-core)
* 🕸️[Duet Web Control](https://github.com/Duet3D/DuetWebControl) by [Duet3D](https://github.com/Duet3D)
* 🕸️[DWC2-for-Klipper-Socket](https://github.com/Stephan3/dwc2-for-klipper-socket) by [Stephan3](https://github.com/Stephan3)
* 🖥️[KlipperScreen](https://github.com/jordanruthe/KlipperScreen) by [jordanruthe](https://github.com/jordanruthe)
* 🐙[OctoPrint](https://github.com/OctoPrint/OctoPrint) by [OctoPrint](https://github.com/OctoPrint)
* 🔬[PrettyGCode](https://github.com/Kragrathea/pgcode) by [Kragrathea](https://github.com/Kragrathea)
* 🤖[Moonraker-Telegram-Bot](https://github.com/nlef/moonraker-telegram-bot) by [nlef](https://github.com/nlef)
--- ## **Credits**
### **⛵Klipper** by [KevinOConnor](https://github.com/KevinOConnor) : * A big thank you to [lixxbox](https://github.com/lixxbox) for that awesome KIAUH-Logo!
* Also a big thank you to everyone who supported my work with a [Ko-fi](https://ko-fi.com/th33xitus) !
https://github.com/KevinOConnor/klipper * Last but not least: Thank you to all contributors and members of the Klipper Community who like and share this project!
---
### **⛵Klipper S-Curve fork** by [dmbutyugin](https://github.com/dmbutyugin) :
https://github.com/dmbutyugin/klipper/tree/scurve-smoothing \
https://github.com/dmbutyugin/klipper/tree/scurve-shaping
---
### **🌙Moonraker** by [Arksine](https://github.com/Arksine) :
https://github.com/Arksine/moonraker
---
### **💨Mainsail Webinterface** by [meteyou](https://github.com/meteyou) :
https://github.com/meteyou/mainsail
---
### **🌊Fluidd Webinterface** by [cadriel](https://github.com/cadriel) :
https://github.com/cadriel/fluidd
---
### **🕸Duet Web Control** by [Duet3D](https://github.com/Duet3D) :
https://github.com/Duet3D/DuetWebControl
---
### **🕸DWC2-for-Klipper-Socket** by [Stephan3](https://github.com/Stephan3) :
https://github.com/Stephan3/dwc2-for-klipper-socket
---
### **🖥KlipperScreen** by [jordanruthe](https://github.com/jordanruthe) :
https://github.com/jordanruthe/KlipperScreen
---
### **🐙OctoPrint Webinterface** by [OctoPrint](https://github.com/OctoPrint) :
https://octoprint.org \
https://github.com/OctoPrint/OctoPrint
---
## **❓ FAQ**
**_Q: Can i use this script to install multiple instancec of Klipper on the same Pi? (Multisession?)_**
**A:** No, and at the moment i don't plan to implement this function. For multisession installations take a look at this script manu7irl created: https://github.com/manu7irl/klipper-DWC2-installer . Keep in mind that klipper-DWC2-installer and KIAUH are **NOT** compatible with each other.

View File

@@ -2,6 +2,128 @@
This document covers possible important changes to KIAUH. This document covers possible important changes to KIAUH.
### 2022-01-29
* Starting from the 28th of January, Moonraker can make use of PackageKit and PolicyKit.\
More details on that can be found [here](
https://github.com/Arksine/moonraker/issues/349) and [here](https://github.com/Arksine/moonraker/pull/346)
* KIAUH will install Moonrakers PolicyKit rules by default when __installing__ Moonraker
* KIAUH will also install Moonrakers PolicyKit rules when __updating__ Moonraker __via KIAUH__ as of now
### 2021-12-30
* Updated the doc for the usage of the [G-Code Shell Command Extension](docs/gcode_shell_command.md)
* It became apparent, that some user groups are missing on some systems. A missing video group \
membership for example caused issues when installing mjpg-streamer while not using the default pi user. \
Other issues could occur when trying to flash an MCU on Debian or Ubuntu distributions where a user might not be part
of the dialout group by default. A check for the tty group is also done. The tty group is needed for setting
up a linux MCU (currently not yet supported by KIAUH).
* There is an issue when trying to install Mainsail or Fluidd on Ubuntu 21.10. Permissions on that distro seem to have seen a rework
in comparison to 20.04 and users will be greeted with an "Error 403 - Permission denied" message after installing one of Klippers webinterfaces.
I still have to figure out a viable solution for that.
### 2021-09-28
* New Feature! Added an installer for the Telegram Bot for Moonraker by [nlef](https://github.com/nlef).
Checkout his project! Remember to report all issues and/or bugs regarding that project in its corresponding repo and not here 😛.\
You can find it here: https://github.com/nlef/moonraker-telegram-bot
### 2021-09-24
* The flashing function got adjusted a bit. It is now possible to also flash controllers which are connected over UART and thus accessible via `/dev/ttyAMA0`. You now have to select a connection methop prior flashing which is either USB or UART.
* Due to several requests over time I have now created a Ko-fi account for those who want to support this project and my work with a small donation. Many thanks in advance to all future donors. You can support me on Ko-fi with this link: https://ko-fi.com/th33xitus
* As usual, if you find any bugs or issues please report them. I tested the little rework i did with the hardware i have available and haven't encountered any malfunctions of flashing them yet.
### 2021-08-10
* KIAUH now supports the installation of the "PrettyGCode for Klipper" GCode-Viewer created by [Kragrathea](https://github.com/Kragrathea)! Installation, updating and removal are possible with KIAUH. For more details to this cool piece of software, please have a look here: https://github.com/Kragrathea/pgcode
### 2021-07-10
* The NGINX configuration files got updated to be in sync with MainsailOS and FluiddPi. Issues with the NGINX service not starting up due to wrong configuration should be resolved now. To get the updated configuration files, please remove Moonraker and Mainsail / Fluidd with KIAUH first and then re-install it. An automated file check for those configuration files might follow in the future which then automates updating those files if there were important changes.
* The default `moonraker.conf` was updated to reflect the recent changes to the update manager section. The update channel is set to `dev`.
### 2021-06-29
* KIAUH will now patch the new `log_path` to existing moonraker.conf files when updating Moonraker and the entry is missing. Before that, it was necessary that the user provided that path manually to make Fluidd display the logfiles in its interface. This issue should be resolved now.
### 2021-06-15
* Moonraker introduced an optional `log_path` which clients can make use of to show log files located in that folder to their users. More info here: https://github.com/Arksine/moonraker/commit/829b3a4ee80579af35dd64a37ccc092a1f67682a \
Client developers agreed upon using `~/klipper_logs` as the new default log path.\
That means, from now on, Klipper and Moonraker services installed with KIAUH will place their logfiles in that mentioned folder.
* Additionally, KIAUH will now detect Klipper and Moonraker systemd services that still use the old default location of `/tmp/<service>.log` and will update them next time the user updates Klipper and/or Moonraker with the KIAUH update function.
* Additional symlinks for the following logfiles will get created along those update procedures to make them accessible through the webinterface once its supported:
- webcamd.log
- mainsail-access.log
- mainsail-error.log
- fluidd-access.log
- fluidd-error.log
* For MainsailOS and FluiddPi users:\
MainsailOS and FluiddPi will switch the shipped Klipper service from SysVinit to systemd probably with their next release. KIAUH can already help migrate older MainsailOS (0.4.0 and below) and FluiddPi (v1.13.0) releases to match their new service-, file- and folder-structure so you don't have to re-flash the SD-Card of your Raspberry Pi.\
In detail here is what is going to happen when you use the new "CustomPiOS Migration Helper" from the Advanced Menu\
`(Main Menu -> 4 -> Enter -> 10 -> Enter)` in a short summary:
* The Klipper SysVinit service will get replaced by a Klipper systemd service
* Klipper and Moonraker will use the new log-directory `~/klipper_logs`
* The webcamd service gets updated
* The webcamd script gets updated and moved from `/root/bin/webcamd` to `/usr/local/bin/webcamd`
* The NGINX `upstreams.conf` gets updated to be able to configure up to 4 webcams
* The `mainsail.txt` / `fluiddpi.txt` gets moved from `/boot` to `~/klipper_config` and renamed to `webcam.txt`
* Symlinks for the webcamd.log and various NGINX logs get created in `~/klipper_config`
* Configuration files for Klipper, Moonraker and webcamd get added to `/etc/logrotate.d`
* If they still exist, two lines will be removed from the mainsail.cfg or client_macros.cfg macro configurations:\
`SAVE_GCODE_STATE NAME=PAUSE_state` and `RESTORE_GCODE_STATE NAME=PAUSE_state`
* **Please note:**\
The "CustomPiOS Migration Helper" is intended to only work on "vanilla" MainsailOS and FluiddPi systems. Do not try to migrate a modified MainsailOS or FluiddPi system (for example if you already used KIAUH to re-install services or to set up a multi-instance installation for Klipper / Moonraker). This won't work.
### 2021-01-31
* **This is a big one... KIAUH v3.0 is out.**\
With this update you can now install multiple instances of Klipper, Moonraker, Duet Web Control or Octoprint on the same Pi. This was quite a big rework of the whole script. So bugs can appear but with the help of some testers, i think there shouldn't be any critical ones anymore. In this regards thanks to @lixxbox and @zellneralex for testing.
* Important changes to how installations are set up now: All components get installed as systemd services. Installation via init.d was dropped completely! This shouldn't affect you at all, since the common linux distributions like RaspberryPi OS or custom distributions like MainsailOS, FluiddPi or OctoPi support both ways of installing services. I just wanted to mention it here.
* Now with KIAUH v3.0 and multi-instance installation capabilities, there are some things to point out. You will now need to tell KIAUH where your printers configurations are located when installing Klipper for the first time. Even though it is not recommended, you can change this location with the help of KIAUH and rewrite Klipper and Moonraker to use the new location.
* When setting up a multi-instance system, the folder structure will only change slightly. The goal was to keep it as compatible as possible with the custom distributions like mainsailOS and FluiddPi. This should help converting a single-instance setup of mainsailOS/FluiddPi to a multi-instance setup in no time, but keeping single-instance backwards compatibility if needed at a later point in time.
* The folder structure is as follows when setting up multi-instances:\
Each printer instance will get its own folder within your configuration location. The decision to this specific structure was made to make it as painless and easy as possible to convert to a multi-instance setup.
Here is an example:
```shell
/home/<username>
└── klipper_config
├── printer_1
│ ├── printer.cfg
│ └── moonraker.conf
├── printer_2
│ ├── printer.cfg
│ └── moonraker.conf
└── printer_n
├── printer.cfg
└── moonraker.conf
```
* Also when setting up multi-instances of each service, the name of each service slightly changes.
Each service gets its corresponding instance added to the service filename.
**This only applies to multi-instances! Single instance installations with KIAUH will keep their original names!**
Corresponding to the filetree example from above that would mean:
```
Klipper services:
--> klipper-1.service
--> klipper-2.service
--> klipper-n.service
Moonraker services:
--> moonraker-1.service
--> moonraker-2.service
--> moonraker-n.service
```
* The same service file rules from above apply to DWC and OctoPrint even though only Klipper and Moonraker are shown in this example.
* You can start, stop and restart all Klipper, Moonraker, DWC and OctoPrint instances from the KIAUH main menu. For doing this, just type "stop klipper", "start moonraker", "restart octoprint" and so on.
* KIAUH v3.0 relocated its ini-file. It is now a hidden file in the users home-directory calles `.kiauh.ini`. This has the benefit of keeping all values in that file between possible re-installations of KIAUH. Otherwise that file would be lost.
* The option of adding more trusted clients to the moonraker.conf file was dropped. Since you can edit this file right inside of Mainsail or Fluidd, only some basic entries are made which get you running.
* I bet i have missed mentioning other stuff as well because it took me quite some time to re-write many functions. So i just hope you like the new version 😄
### 2020-11-28 ### 2020-11-28
* KIAUH now supports the installation, update and removal of [KlipperScreen](https://github.com/jordanruthe/KlipperScreen). This feature was was provided by [jordanruthe](https://github.com/jordanruthe)! Thank you! * KIAUH now supports the installation, update and removal of [KlipperScreen](https://github.com/jordanruthe/KlipperScreen). This feature was was provided by [jordanruthe](https://github.com/jordanruthe)! Thank you!

View File

@@ -17,11 +17,6 @@ That means:
- set the behavior to "Cancel any ongoing prints but stay connected to the printer" - set the behavior to "Cancel any ongoing prints but stay connected to the printer"
- **Enable/Disable OctoPrint Service:**\ - **Enable/Disable OctoPrint Service:**\
Usefull when using DWC2/Mainsail/Fluidd and OctoPrint at the same time to prevent them interfering with each other Usefull when using DWC2/Mainsail/Fluidd and OctoPrint at the same time to prevent them interfering with each other
- **Set up reverse proxy for DWC2, Mainsail, Fluidd and OctoPrint and changing the hostname:**
- The script can install and configure Nginx for the selected webinterface
- It also allows you to make your webinterface reachable over an URL like `<hostname>.local` via avahi
- Example: If you name the host "my-printer", type `my-printer.local` in your webbrowser to open the installed webinterface
- If there is more than one webinterface installed, you have to append the port to that adress
- **Installing a G-Code Shell Command extension:**\ - **Installing a G-Code Shell Command extension:**\
For further information about that extension please see the [G-Code Shell Command Extension Doc](gcode_shell_command.md) For further information about that extension please see the [G-Code Shell Command Extension Doc](gcode_shell_command.md)

View File

@@ -40,6 +40,34 @@ verbose: True
Execute with: Execute with:
`RUN_SHELL_COMMAND CMD=hello_world` `RUN_SHELL_COMMAND CMD=hello_world`
### Passing parameters:
As of commit [f231fa9](https://github.com/th33xitus/kiauh/commit/f231fa9c69191f23277b4e3319f6b675bfa0ee42) it is also possible to pass optional parameters to a `gcode_shell_command`.
The following short example shows storing the extruder temperature into a variable, passing that value with a parameter to a `gcode_shell_command`, which then,
once the gcode_macro runs and the gcode_shell_command gets called, executes the `script.sh`. The script then echoes a message to the console (if `verbose: True`)
and writes the value of the parameter into a textfile called `test.txt` located in the home directory.
Content of the `gcode_shell_command` and the `gcode_macro`:
```
[gcode_shell_command print_to_file]
command: sh /home/pi/klipper_config/script.sh
timeout: 30.
verbose: True
[gcode_macro GET_TEMP]
gcode:
{% set temp = printer.extruder.temperature %}
{ action_respond_info("%s" % (temp)) }
RUN_SHELL_COMMAND CMD=print_to_file PARAMS={temp}
```
Content of `script.sh`:
```shell
#!/bin/sh
echo "temp is: $1"
echo "$1" >> "${HOME}/test.txt"
```
## Warning ## Warning
This extension may have a high potential for abuse if not used carefully! Also, depending on the command you execute, high system loads may occur and can cause system instabilities. This extension may have a high potential for abuse if not used carefully! Also, depending on the command you execute, high system loads may occur and can cause system instabilities.

View File

@@ -17,19 +17,14 @@ for script in "${SRCDIR}/kiauh/scripts/ui/"*.sh; do . $script; done
### set important directories ### set important directories
#klipper #klipper
KLIPPER_DIR=${HOME}/klipper KLIPPER_DIR=${HOME}/klipper
KLIPPY_ENV_DIR=${HOME}/klippy-env KLIPPY_ENV=${HOME}/klippy-env
KLIPPER_SERVICE1=/etc/init.d/klipper
KLIPPER_SERVICE2=/etc/default/klipper
KLIPPER_SERVICE3=/etc/systemd/system/klipper.service
#nginx #nginx
NGINX_SA=/etc/nginx/sites-available NGINX_SA=/etc/nginx/sites-available
NGINX_SE=/etc/nginx/sites-enabled NGINX_SE=/etc/nginx/sites-enabled
NGINX_CONFD=/etc/nginx/conf.d NGINX_CONFD=/etc/nginx/conf.d
#moonraker #moonraker
MOONRAKER_DIR=${HOME}/moonraker MOONRAKER_DIR=${HOME}/moonraker
MOONRAKER_ENV_DIR=${HOME}/moonraker-env MOONRAKER_ENV=${HOME}/moonraker-env
MOONRAKER_SERVICE1=/etc/init.d/moonraker
MOONRAKER_SERVICE2=/etc/default/moonraker
#mainsail #mainsail
MAINSAIL_DIR=${HOME}/mainsail MAINSAIL_DIR=${HOME}/mainsail
#fluidd #fluidd
@@ -37,26 +32,27 @@ FLUIDD_DIR=${HOME}/fluidd
#dwc2 #dwc2
DWC2FK_DIR=${HOME}/dwc2-for-klipper-socket DWC2FK_DIR=${HOME}/dwc2-for-klipper-socket
DWC_ENV_DIR=${HOME}/dwc-env DWC_ENV_DIR=${HOME}/dwc-env
DWC2_DIR=${HOME}/sdcard/web DWC2_DIR=${HOME}/duetwebcontrol
#octoprint #octoprint
OCTOPRINT_DIR=${HOME}/OctoPrint OCTOPRINT_DIR=${HOME}/OctoPrint
OCTOPRINT_CFG_DIR=${HOME}/.octoprint OCTOPRINT_CFG_DIR=${HOME}/.octoprint
OCTOPRINT_SERVICE1=/etc/init.d/octoprint
OCTOPRINT_SERVICE2=/etc/default/octoprint
#KlipperScreen #KlipperScreen
KLIPPERSCREEN_DIR=${HOME}/KlipperScreen KLIPPERSCREEN_DIR=${HOME}/KlipperScreen
KLIPPERSCREEN_ENV_DIR=${HOME}/.KlipperScreen-env KLIPPERSCREEN_ENV_DIR=${HOME}/.KlipperScreen-env
#MoonrakerTelegramBot
MOONRAKER_TELEGRAM_BOT_DIR=${HOME}/moonraker-telegram-bot
MOONRAKER_TELEGRAM_BOT_ENV_DIR=${HOME}/moonraker-telegram-bot-env
#misc #misc
INI_FILE=${SRCDIR}/kiauh/kiauh.ini INI_FILE=${HOME}/.kiauh.ini
BACKUP_DIR=${HOME}/kiauh-backups BACKUP_DIR=${HOME}/kiauh-backups
### set github repos ### set github repos
KLIPPER_REPO=https://github.com/KevinOConnor/klipper.git KLIPPER_REPO=https://github.com/Klipper3d/klipper.git
ARKSINE_REPO=https://github.com/Arksine/klipper.git ARKSINE_REPO=https://github.com/Arksine/klipper.git
DMBUTYUGIN_REPO=https://github.com/dmbutyugin/klipper.git DMBUTYUGIN_REPO=https://github.com/dmbutyugin/klipper.git
DWC2FK_REPO=https://github.com/Stephan3/dwc2-for-klipper-socket.git DWC2FK_REPO=https://github.com/Stephan3/dwc2-for-klipper-socket.git
MOONRAKER_REPO=https://github.com/Arksine/moonraker.git
KLIPPERSCREEN_REPO=https://github.com/jordanruthe/KlipperScreen.git KLIPPERSCREEN_REPO=https://github.com/jordanruthe/KlipperScreen.git
NLEF_REPO=https://github.com/nlef/moonraker-telegram-bot.git
#branches #branches
BRANCH_SCURVE_SMOOTHING=dmbutyugin/scurve-smoothing BRANCH_SCURVE_SMOOTHING=dmbutyugin/scurve-smoothing
BRANCH_SCURVE_SHAPING=dmbutyugin/scurve-shaping BRANCH_SCURVE_SHAPING=dmbutyugin/scurve-shaping
@@ -75,7 +71,7 @@ title_msg(){
echo -e "${cyan}$1${default}" echo -e "${cyan}$1${default}"
} }
get_date(){ get_date(){
current_date=$(date +"%Y-%m-%d_%H-%M") current_date=$(date +"%y%m%d-%H%M")
} }
print_unkown_cmd(){ print_unkown_cmd(){
ERROR_MSG="Invalid command!" ERROR_MSG="Invalid command!"

View File

@@ -40,13 +40,11 @@ grab_version(){
cd .. cd ..
fi fi
if [ ! -z "$mainsail_folder" ]; then if [ ! -z "$mainsail_folder" ]; then
mainsail_file=$(find $mainsail_folder/js -name "app.*.js" 2>/dev/null) mainsail_ver=$(head -n 1 $mainsail_folder/.version)
mainsail_ver=$(grep -o -E 'state:{packageVersion:.+' $mainsail_file | cut -d'"' -f2)
m3="Mainsail version: $mainsail_ver" m3="Mainsail version: $mainsail_ver"
fi fi
if [ ! -z "$fluidd_folder" ]; then if [ ! -z "$fluidd_folder" ]; then
fluidd_file=$(find $fluidd_folder/js -name "app.*.js" 2>/dev/null) fluidd_ver=$(head -n 1 $fluidd_folder/.version)
fluidd_ver=$(grep -o -E '"setVersion",".+"' $fluidd_file | cut -d'"' -f4)
m4="Fluidd version: $fluidd_ver" m4="Fluidd version: $fluidd_ver"
fi fi
} }

View File

@@ -1,87 +0,0 @@
# /etc/nginx/sites-available/fluidd
server {
listen 80;
listen [::]:80;
access_log /var/log/nginx/fluidd-access.log;
error_log /var/log/nginx/fluidd-error.log;
#disable this section on smaller hardware like a pi zero
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_proxied expired no-cache no-store private auth;
gzip_comp_level 4;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/json application/xml;
#web_path from fluidd static files
root /home/pi/fluidd;
index index.html;
server_name _;
#max upload size for gcodes
client_max_body_size 0;
location / {
try_files $uri $uri/ /index.html;
}
location /printer {
proxy_pass http://apiserver/printer;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
location /api {
proxy_pass http://apiserver/api;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
location /access {
proxy_pass http://apiserver/access;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
location /websocket {
proxy_pass http://apiserver/websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 86400;
}
location /machine {
proxy_pass http://apiserver/machine;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
location /server {
proxy_pass http://apiserver/server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
location /webcam/ {
proxy_pass http://mjpgstreamer/;
}
}

View File

@@ -1,83 +1,87 @@
# Run a shell command via gcode # Run a shell command via gcode
# #
# Copyright (C) 2019 Eric Callahan <arksine.code@gmail.com> # Copyright (C) 2019 Eric Callahan <arksine.code@gmail.com>
# #
# 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.
import os import os
import shlex import shlex
import subprocess import subprocess
import logging import logging
class ShellCommand: class ShellCommand:
def __init__(self, config): def __init__(self, config):
self.name = config.get_name().split()[-1] self.name = config.get_name().split()[-1]
self.printer = config.get_printer() self.printer = config.get_printer()
self.gcode = self.printer.lookup_object('gcode') self.gcode = self.printer.lookup_object('gcode')
cmd = config.get('command') cmd = config.get('command')
cmd = os.path.expanduser(cmd) cmd = os.path.expanduser(cmd)
self.command = shlex.split(cmd) self.command = shlex.split(cmd)
self.timeout = config.getfloat('timeout', 2., above=0.) self.timeout = config.getfloat('timeout', 2., above=0.)
self.verbose = config.getboolean('verbose', True) self.verbose = config.getboolean('verbose', True)
self.proc_fd = None self.proc_fd = None
self.partial_output = "" self.partial_output = ""
self.gcode.register_mux_command( self.gcode.register_mux_command(
"RUN_SHELL_COMMAND", "CMD", self.name, "RUN_SHELL_COMMAND", "CMD", self.name,
self.cmd_RUN_SHELL_COMMAND, self.cmd_RUN_SHELL_COMMAND,
desc=self.cmd_RUN_SHELL_COMMAND_help) desc=self.cmd_RUN_SHELL_COMMAND_help)
def _process_output(self, eventime): def _process_output(self, eventime):
if self.proc_fd is None: if self.proc_fd is None:
return return
try: try:
data = os.read(self.proc_fd, 4096) data = os.read(self.proc_fd, 4096)
except Exception: except Exception:
pass pass
data = self.partial_output + data data = self.partial_output + data.decode()
if '\n' not in data: if '\n' not in data:
self.partial_output = data self.partial_output = data
return return
elif data[-1] != '\n': elif data[-1] != '\n':
split = data.rfind('\n') + 1 split = data.rfind('\n') + 1
self.partial_output = data[split:] self.partial_output = data[split:]
data = data[:split] data = data[:split]
self.gcode.respond_info(data) else:
self.partial_output = ""
cmd_RUN_SHELL_COMMAND_help = "Run a linux shell command" self.gcode.respond_info(data)
def cmd_RUN_SHELL_COMMAND(self, params):
reactor = self.printer.get_reactor() cmd_RUN_SHELL_COMMAND_help = "Run a linux shell command"
try: def cmd_RUN_SHELL_COMMAND(self, params):
proc = subprocess.Popen( gcode_params = params.get('PARAMS','')
self.command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) gcode_params = shlex.split(gcode_params)
except Exception: reactor = self.printer.get_reactor()
logging.exception( try:
"shell_command: Command {%s} failed" % (self.name)) proc = subprocess.Popen(
raise self.gcode.error("Error running command {%s}" % (self.name)) self.command + gcode_params, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
if self.verbose: except Exception:
self.proc_fd = proc.stdout.fileno() logging.exception(
self.gcode.respond_info("Running Command {%s}...:" % (self.name)) "shell_command: Command {%s} failed" % (self.name))
hdl = reactor.register_fd(self.proc_fd, self._process_output) raise self.gcode.error("Error running command {%s}" % (self.name))
eventtime = reactor.monotonic() if self.verbose:
endtime = eventtime + self.timeout self.proc_fd = proc.stdout.fileno()
complete = False self.gcode.respond_info("Running Command {%s}...:" % (self.name))
while eventtime < endtime: hdl = reactor.register_fd(self.proc_fd, self._process_output)
eventtime = reactor.pause(eventtime + .05) eventtime = reactor.monotonic()
if proc.poll() is not None: endtime = eventtime + self.timeout
complete = True complete = False
break while eventtime < endtime:
if not complete: eventtime = reactor.pause(eventtime + .05)
proc.terminate() if proc.poll() is not None:
if self.verbose: complete = True
if self.partial_output: break
self.gcode.respond_info(self.partial_output) if not complete:
self.partial_output = "" proc.terminate()
if complete: if self.verbose:
msg = "Command {%s} finished\n" % (self.name) if self.partial_output:
else: self.gcode.respond_info(self.partial_output)
msg = "Command {%s} timed out" % (self.name) self.partial_output = ""
self.gcode.respond_info(msg) if complete:
reactor.unregister_fd(hdl) msg = "Command {%s} finished\n" % (self.name)
self.proc_fd = None else:
msg = "Command {%s} timed out" % (self.name)
self.gcode.respond_info(msg)
def load_config_prefix(config): reactor.unregister_fd(hdl)
return ShellCommand(config) self.proc_fd = None
def load_config_prefix(config):
return ShellCommand(config)

View File

@@ -0,0 +1,59 @@
################################################################################
# ~~~~~~~~~~~~~~~~~~~~~~~~ AUTOCREATED WITH KIAUH ~~~~~~~~~~~~~~~~~~~~~~~~~~ #
################################################################################
# Recommended macros and config entries if you use Mainsail or Fluidd! #
# You can edit or delete those macros if you already defined them elsewhere! #
################################################################################
[pause_resume]
[display_status]
[gcode_macro CANCEL_PRINT]
rename_existing: BASE_CANCEL_PRINT
gcode:
TURN_OFF_HEATERS
CLEAR_PAUSE
SDCARD_RESET_FILE
BASE_CANCEL_PRINT
[gcode_macro PAUSE]
rename_existing: BASE_PAUSE
gcode:
##### set defaults #####
{% set x = params.X|default(230) %} #edit to your park position
{% set y = params.Y|default(230) %} #edit to your park position
{% set z = params.Z|default(10)|float %} #edit to your park position
{% set e = params.E|default(1) %} #edit to your retract length
##### calculate save lift position #####
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set act_z = printer.toolhead.position.z|float %}
{% set lift_z = z|abs %}
{% if act_z < (max_z - lift_z) %}
{% set z_safe = lift_z %}
{% else %}
{% set z_safe = max_z - act_z %}
{% endif %}
##### end of definitions #####
SAVE_GCODE_STATE NAME=PAUSE_state
BASE_PAUSE
G91
G1 E-{e} F2100
G1 Z{z_safe}
G90
G1 X{x} Y{y} F6000
[gcode_macro RESUME]
rename_existing: BASE_RESUME
gcode:
##### set defaults #####
{% set e = params.E|default(1) %} #edit to your retract length
G91
G1 E{e} F2100
G90
RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1
BASE_RESUME
################################################################################
################################################################################

15
resources/klipper.service Normal file
View File

@@ -0,0 +1,15 @@
#Systemd service file for klipper
[Unit]
Description=Starts klipper instance %INST% on startup
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
User=%USER%
RemainAfterExit=yes
ExecStart=%KL_ENV%/bin/python %KL_DIR%/klippy/klippy.py %P_CFG% -I %P_TMP% -l %KL_LOG% -a %KL_UDS%
Restart=always
RestartSec=10

View File

@@ -0,0 +1,95 @@
# /etc/nginx/sites-available/<<UI>>
server {
listen 80;
access_log /var/log/nginx/<<UI>>-access.log;
error_log /var/log/nginx/<<UI>>-error.log;
# disable this section on smaller hardware like a pi zero
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_proxied expired no-cache no-store private auth;
gzip_comp_level 4;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css text/xml text/javascript application/javascript application/x-javascript application/json application/xml;
# web_path from <<UI>> static files
root /home/pi/<<UI>>;
index index.html;
server_name _;
# disable max upload size checks
client_max_body_size 0;
# disable proxy request buffering
proxy_request_buffering off;
location / {
try_files $uri $uri/ /index.html;
}
location = /index.html {
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
location /websocket {
proxy_pass http://apiserver/websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 86400;
}
location ~ ^/(printer|api|access|machine|server)/ {
proxy_pass http://apiserver$request_uri;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
location /webcam/ {
postpone_output 0;
proxy_buffering off;
proxy_ignore_headers X-Accel-Buffering;
access_log off;
error_log off;
proxy_pass http://mjpgstreamer1/;
}
location /webcam2/ {
postpone_output 0;
proxy_buffering off;
proxy_ignore_headers X-Accel-Buffering;
access_log off;
error_log off;
proxy_pass http://mjpgstreamer2/;
}
location /webcam3/ {
postpone_output 0;
proxy_buffering off;
proxy_ignore_headers X-Accel-Buffering;
access_log off;
error_log off;
proxy_pass http://mjpgstreamer3/;
}
location /webcam4/ {
postpone_output 0;
proxy_buffering off;
proxy_ignore_headers X-Accel-Buffering;
access_log off;
error_log off;
proxy_pass http://mjpgstreamer4/;
}
}

View File

@@ -1,87 +0,0 @@
# /etc/nginx/sites-available/mainsail
server {
listen 80;
listen [::]:80;
access_log /var/log/nginx/mainsail-access.log;
error_log /var/log/nginx/mainsail-error.log;
#disable this section on smaller hardware like a pi zero
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_proxied expired no-cache no-store private auth;
gzip_comp_level 4;
gzip_buffers 16 8k;
gzip_http_version 1.1;
gzip_types text/plain text/css text/xml text/javascript application/x-javascript application/json application/xml;
#web_path from mainsail static files
root /home/pi/mainsail;
index index.html;
server_name _;
#max upload size for gcodes
client_max_body_size 0;
location / {
try_files $uri $uri/ /index.html;
}
location /printer {
proxy_pass http://apiserver/printer;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
location /api {
proxy_pass http://apiserver/api;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
location /access {
proxy_pass http://apiserver/access;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
location /websocket {
proxy_pass http://apiserver/websocket;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 86400;
}
location /machine {
proxy_pass http://apiserver/machine;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
location /server {
proxy_pass http://apiserver/server;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Scheme $scheme;
}
location /webcam/ {
proxy_pass http://mjpgstreamer/;
}
}

View File

@@ -1,10 +1,56 @@
[server] [server]
host: 0.0.0.0 host: 0.0.0.0
port: 7125 port: %PORT%
enable_debug_logging: True enable_debug_logging: False
config_path: ~/klipper_config klippy_uds_address: %UDS%
[database]
database_path: %MR_DB%
[authorization] [authorization]
enabled: True
trusted_clients: trusted_clients:
127.0.0.1 %LAN%
10.0.0.0/8
127.0.0.0/8
169.254.0.0/16
172.16.0.0/12
192.168.0.0/16
FE80::/10
::1/128
cors_domains:
http://*.lan
http://*.local
https://my.mainsail.xyz
http://my.mainsail.xyz
https://app.fluidd.xyz
http://app.fluidd.xyz
[file_manager]
config_path: %CFG%
log_path: %LOG%
[octoprint_compat]
[history]
[update_manager]
channel: dev
refresh_interval: 168
[update_manager mainsail]
type: web
repo: mainsail-crew/mainsail
path: ~/mainsail
[update_manager fluidd]
type: web
repo: fluidd-core/fluidd
path: ~/fluidd
#[update_manager KlipperScreen]
#type: git_repo
#path: /home/%USER%/KlipperScreen
#origin: https://github.com/jordanruthe/KlipperScreen.git
#env: /home/%USER%/.KlipperScreen-env/bin/python
#requirements: scripts/KlipperScreen-requirements.txt
#install_script: scripts/KlipperScreen-install.sh

View File

@@ -0,0 +1,16 @@
#Systemd service file for moonraker
[Unit]
Description=Starts Moonraker %INST% on startup
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
SupplementaryGroups=moonraker-admin
User=%USER%
RemainAfterExit=yes
ExecStart=%MR_ENV%/bin/python %MR_DIR%/moonraker/moonraker.py -l %MR_LOG% -c %MR_CONF%
Restart=always
RestartSec=10

View File

@@ -1,13 +0,0 @@
# /etc/nginx/conf.d/upstreams.conf
upstream apiserver {
#edit your api port here
ip_hash;
server 127.0.0.1:7125;
}
upstream mjpgstreamer {
#edit your webcam port here
ip_hash;
server 127.0.0.1:8080;
}

View File

@@ -1,10 +0,0 @@
serial:
additionalPorts:
- /tmp/printer
disconnectOnErrors: false
port: /tmp/printer
server:
commands:
serverRestartCommand: sudo service octoprint restart
systemRestartCommand: sudo shutdown -r now
systemShutdownCommand: sudo shutdown -h now

14
resources/printer.cfg Normal file
View File

@@ -0,0 +1,14 @@
[mcu]
serial: /dev/serial/by-id/<your-mcu-id>
[pause_resume]
[display_status]
[virtual_sdcard]
path: ~/gcode_files
[printer]
kinematics: none
max_velocity: 1000
max_accel: 1000

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@@ -0,0 +1,7 @@
[gcode_shell_command hello_world]
command: echo hello world
timeout: 2.
verbose: True
[gcode_macro HELLO_WORLD]
gcode:
RUN_SHELL_COMMAND CMD=hello_world

25
resources/upstreams.conf Normal file
View File

@@ -0,0 +1,25 @@
# /etc/nginx/conf.d/upstreams.conf
upstream apiserver {
ip_hash;
server 127.0.0.1:7125;
}
upstream mjpgstreamer1 {
ip_hash;
server 127.0.0.1:8080;
}
upstream mjpgstreamer2 {
ip_hash;
server 127.0.0.1:8081;
}
upstream mjpgstreamer3 {
ip_hash;
server 127.0.0.1:8082;
}
upstream mjpgstreamer4 {
ip_hash;
server 127.0.0.1:8083;
}

15
resources/webcamd.service Normal file
View File

@@ -0,0 +1,15 @@
[Unit]
Description=Starts mjpg-streamer on startup
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=forking
User=%USER%
WorkingDirectory=/usr/local/bin
StandardOutput=append:/var/log/webcamd.log
StandardError=append:/var/log/webcamd.log
ExecStart=/usr/local/bin/webcamd
Restart=always

View File

@@ -1,38 +0,0 @@
### AUTOCREATED WITH KIAUH ###
#is required to load the pause_resume module in klipper
[pause_resume]
[gcode_macro PAUSE]
rename_existing: BASE_PAUSE
default_parameter_X: 230 #edit to your park position
default_parameter_Y: 230 #edit to your park position
default_parameter_Z: 10 #edit to your park position
default_parameter_E: 1 #edit to your retract length
gcode:
SAVE_GCODE_STATE NAME=PAUSE_state
BASE_PAUSE
G91
G1 E-{E} F2100
G1 Z{Z}
G90
G1 X{X} Y{Y} F6000
[gcode_macro RESUME]
rename_existing: BASE_RESUME
default_parameter_E: 1 #edit to your retract length
gcode:
G91
G1 E{E} F2100
G90
RESTORE_GCODE_STATE NAME=PAUSE_state MOVE=1
BASE_RESUME
[gcode_macro CANCEL_PRINT]
rename_existing: BASE_CANCEL_PRINT
gcode:
TURN_OFF_HEATERS
CLEAR_PAUSE
SDCARD_RESET_FILE
BASE_CANCEL_PRINT
##########################
##########################

View File

@@ -5,39 +5,8 @@ check_for_backup_dir(){
fi fi
} }
backup_printer_cfg(){
check_for_backup_dir
if [ -f $PRINTER_CFG ]; then
get_date
status_msg "Create backup of printer.cfg ..."
cp $PRINTER_CFG $BACKUP_DIR/printer.cfg."$current_date".backup && ok_msg "Backup complete!"
else
ok_msg "No printer.cfg found! Skipping backup ..."
fi
}
backup_moonraker_conf(){
check_for_backup_dir
if [ -f ${HOME}/moonraker.conf ]; then
get_date
status_msg "Create backup of moonraker.conf ..."
cp ${HOME}/moonraker.conf $BACKUP_DIR/moonraker.conf."$current_date".backup && ok_msg "Backup complete!"
else
ok_msg "No moonraker.conf found! Skipping backup ..."
fi
}
read_bb4u_stat(){
source_ini
if [ ! "$backup_before_update" = "true" ]; then
BB4U_STATUS="${green}[Enable]${default} backups before updating "
else
BB4U_STATUS="${red}[Disable]${default} backups before updating "
fi
}
toggle_backups(){ toggle_backups(){
source_ini source_kiauh_ini
if [ "$backup_before_update" = "true" ]; then if [ "$backup_before_update" = "true" ]; then
sed -i '/backup_before_update=/s/true/false/' $INI_FILE sed -i '/backup_before_update=/s/true/false/' $INI_FILE
BB4U_STATUS="${green}[Enable]${default} backups before updating " BB4U_STATUS="${green}[Enable]${default} backups before updating "
@@ -51,20 +20,80 @@ toggle_backups(){
} }
bb4u(){ bb4u(){
source_ini source_kiauh_ini
if [ "$backup_before_update" = "true" ]; then if [ "$backup_before_update" = "true" ]; then
backup_$1 backup_$1
fi fi
} }
read_bb4u_stat(){
source_kiauh_ini
if [ ! "$backup_before_update" = "true" ]; then
BB4U_STATUS="${green}[Enable]${default} backups before updating "
else
BB4U_STATUS="${red}[Disable]${default} backups before updating "
fi
}
################################################################################
#******************************************************************************#
################################################################################
backup_printer_cfg(){
check_for_backup_dir
if [ -f $PRINTER_CFG ]; then
get_date
status_msg "Timestamp: $current_date"
status_msg "Create backup of printer.cfg ..."
cp $PRINTER_CFG $BACKUP_DIR/printer.cfg."$current_date".backup && ok_msg "Backup complete!"
else
ok_msg "No printer.cfg found! Skipping backup ..."
fi
}
backup_klipper_config_dir(){
source_kiauh_ini
check_for_backup_dir
if [ -d "$klipper_cfg_loc" ]; then
get_date
status_msg "Timestamp: $current_date"
status_msg "Create backup of the Klipper config directory ..."
config_folder_name="$(echo "$klipper_cfg_loc" | rev | cut -d"/" -f1 | rev)"
mkdir -p $BACKUP_DIR/$config_folder_name/$current_date
cp -r "$klipper_cfg_loc" "$_" && ok_msg "Backup complete!"
echo
else
ok_msg "No config directory found! Skipping backup ..."
echo
fi
}
backup_moonraker_database(){
check_for_backup_dir
if ls -d ${HOME}/.moonraker_database* 2>/dev/null 1>&2; then
get_date
status_msg "Timestamp: $current_date"
mkdir -p "$BACKUP_DIR/mr_db_backup/$current_date"
for database in $(ls -d ${HOME}/.moonraker_database*)
do
status_msg "Create backup of $database ..."
cp -r $database "$BACKUP_DIR/mr_db_backup/$current_date"
ok_msg "Done!"
done
ok_msg "Backup complete!\n"
else
ok_msg "No Moonraker database found! Skipping backup ..."
fi
}
backup_klipper(){ backup_klipper(){
if [ -d $KLIPPER_DIR ] && [ -d $KLIPPY_ENV_DIR ]; then if [ -d $KLIPPER_DIR ] && [ -d $KLIPPY_ENV ]; then
status_msg "Creating Klipper backup ..." status_msg "Creating Klipper backup ..."
check_for_backup_dir check_for_backup_dir
get_date get_date
status_msg "Timestamp: $current_date" status_msg "Timestamp: $current_date"
mkdir -p $BACKUP_DIR/klipper-backups/"$current_date" mkdir -p $BACKUP_DIR/klipper-backups/"$current_date"
cp -r $KLIPPER_DIR $_ && cp -r $KLIPPY_ENV_DIR $_ && ok_msg "Backup complete!" cp -r $KLIPPER_DIR $_ && cp -r $KLIPPY_ENV $_ && ok_msg "Backup complete!"
else else
ERROR_MSG=" Can't backup klipper and/or klipper-env directory! Not found!" ERROR_MSG=" Can't backup klipper and/or klipper-env directory! Not found!"
fi fi
@@ -111,13 +140,13 @@ backup_fluidd(){
} }
backup_moonraker(){ backup_moonraker(){
if [ -d $MOONRAKER_DIR ] && [ -d $MOONRAKER_ENV_DIR ]; then if [ -d $MOONRAKER_DIR ] && [ -d $MOONRAKER_ENV ]; then
status_msg "Creating Moonraker backup ..." status_msg "Creating Moonraker backup ..."
check_for_backup_dir check_for_backup_dir
get_date get_date
status_msg "Timestamp: $current_date" status_msg "Timestamp: $current_date"
mkdir -p $BACKUP_DIR/moonraker-backups/"$current_date" mkdir -p $BACKUP_DIR/moonraker-backups/"$current_date"
cp -r $MOONRAKER_DIR $_ && cp -r $MOONRAKER_ENV_DIR $_ && ok_msg "Backup complete!" cp -r $MOONRAKER_DIR $_ && cp -r $MOONRAKER_ENV $_ && ok_msg "Backup complete!"
else else
ERROR_MSG=" Can't backup moonraker and/or moonraker-env directory! Not found!" ERROR_MSG=" Can't backup moonraker and/or moonraker-env directory! Not found!"
fi fi
@@ -150,3 +179,17 @@ backup_klipperscreen(){
ERROR_MSG=" Can't backup KlipperScreen directory!\n Not found!" ERROR_MSG=" Can't backup KlipperScreen directory!\n Not found!"
fi fi
} }
backup_MoonrakerTelegramBot(){
if [ -d $MOONRAKER_TELEGRAM_BOT_DIR ] ; then
status_msg "Creating MoonrakerTelegramBot backup ..."
check_for_backup_dir
get_date
status_msg "Timestamp: $current_date"
mkdir -p $BACKUP_DIR/MoonrakerTelegramBot-backups/"$current_date"
cp -r $MOONRAKER_TELEGRAM_BOT_DIR $_
ok_msg "Backup complete!"
else
ERROR_MSG=" Can't backup MoonrakerTelegramBot directory!\n Not found!"
fi
}

View File

@@ -27,7 +27,7 @@ install_packages()
# Update system package info # Update system package info
report_status "Running apt-get update..." report_status "Running apt-get update..."
sudo apt-get update sudo apt-get update --allow-releaseinfo-change
# Install desired packages # Install desired packages
report_status "Installing packages..." report_status "Installing packages..."

View File

@@ -25,7 +25,7 @@ install_packages()
# Update system package info # Update system package info
report_status "Running apt-get update..." report_status "Running apt-get update..."
sudo apt-get update sudo apt-get update --allow-releaseinfo-change
# Install desired packages # Install desired packages
report_status "Installing packages..." report_status "Installing packages..."

334
scripts/flash_mcu.sh Executable file
View File

@@ -0,0 +1,334 @@
#!/bin/bash
show_flash_method_help(){
top_border
echo -e "| ~~~~~~~~ < ? > Help: Flash MCU < ? > ~~~~~~~~ |"
hr
echo -e "| ${cyan}Regular flashing method:${default} |"
echo -e "| The default method to flash controller boards which |"
echo -e "| are connected and updated over USB and not by placing |"
echo -e "| a compiled firmware file onto an internal SD-Card. |"
blank_line
echo -e "| Common controllers that get flashed that way are: |"
echo -e "| - Arduino Mega 2560 |"
echo -e "| - Fysetc F6 / S6 (used without a Display + SD-Slot) |"
blank_line
echo -e "| ${cyan}Updating via SD-Card Update:${default} |"
echo -e "| Many popular controller boards ship with a bootloader |"
echo -e "| capable of updating the firmware via SD-Card. |"
echo -e "| Choose this method if your controller board supports |"
echo -e "| this way of updating. This method ONLY works for up- |"
echo -e "| grading firmware. The initial flashing procedure must |"
echo -e "| be done manually per the instructions that apply to |"
echo -e "| your controller board. |"
blank_line
echo -e "| Common controllers that can be flashed that way are: |"
echo -e "| - BigTreeTech SKR 1.3 / 1.4 (Turbo) / E3 / Mini E3 |"
echo -e "| - Fysetc F6 / S6 (used with a Display + SD-Slot) |"
echo -e "| - Fysetc Spider |"
blank_line
back_footer
while true; do
read -p "${cyan}###### Please select:${default} " choice
case "$choice" in
B|b)
clear && print_header
select_flash_method
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
}
select_flash_method(){
top_border
echo -e "| ~~~~~~~~~~~~ [ Flash MCU ] ~~~~~~~~~~~~ |"
hr
echo -e "| Please select the flashing method to flash your MCU. |"
echo -e "| Make sure to only select a method your MCU supports. |"
echo -e "| Not all MCUs support both methods! |"
hr
blank_line
echo -e "| 1) Regular flashing method |"
echo -e "| 2) Updating via SD-Card Update |"
blank_line
back_help_footer
while true; do
read -p "${cyan}###### Please select:${default} " choice
case "$choice" in
1)
echo -e "###### > Regular flashing method"
select_mcu_connection
select_mcu_id
[[ "$CONFIRM_FLASH" == true ]] && flash_mcu
break;;
2)
echo -e "###### > SD-Card Update"
select_mcu_connection
select_mcu_id
[[ "$CONFIRM_FLASH" == true ]] && flash_mcu_sd
break;;
B|b)
advanced_menu
break;;
H|h)
clear && print_header
show_flash_method_help
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
}
select_mcu_id(){
if [ ${#mcu_list[@]} -ge 1 ]; then
top_border
echo -e "| ${red}!!! ATTENTION !!!${default} |"
hr
echo -e "| Make sure, to select the correct MCU! |"
echo -e "| ${red}ONLY flash a firmware created for the respective MCU!${default} |"
bottom_border
echo -e "${cyan}###### List of available MCU:${default}"
### list all mcus
id=0
for mcu in ${mcu_list[@]}; do
let id++
echo -e " $id) $mcu"
done
### verify user input
sel_index=""
while [[ ! ($sel_index =~ ^[1-9]+$) ]] || [ "$sel_index" -gt "$id" ]; do
echo
read -p "${cyan}###### Select MCU to flash:${default} " sel_index
if [[ ! ($sel_index =~ ^[1-9]+$) ]]; then
warn_msg "Invalid input!"
elif [ "$sel_index" -lt 1 ] || [ "$sel_index" -gt "$id" ]; then
warn_msg "Please select a number between 1 and $id!"
fi
mcu_index=$(echo $((sel_index - 1)))
selected_mcu_id="${mcu_list[$mcu_index]}"
done
### confirm selection
while true; do
echo -e "\n###### You selected:\n ● MCU #$sel_index: $selected_mcu_id\n"
read -p "${cyan}###### Continue? (Y/n):${default} " yn
case "$yn" in
Y|y|Yes|yes|"")
echo -e "###### > Yes"
status_msg "Flashing $selected_mcu_id ..."
CONFIRM_FLASH=true
break;;
N|n|No|no)
echo -e "###### > No"
CONFIRM_FLASH=false
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
fi
}
flash_mcu(){
do_action_service "stop" "klipper"
make flash FLASH_DEVICE="${mcu_list[$mcu_index]}"
### evaluate exit code of make flash
if [ ! $? -eq 0 ]; then
warn_msg "Flashing failed!"
warn_msg "Please read the console output above!"
else
ok_msg "Flashing successfull!"
fi
do_action_service "start" "klipper"
}
flash_mcu_sd(){
flash_script="${HOME}/klipper/scripts/flash-sdcard.sh"
### write each supported board to the array to make it selectable
board_list=()
for board in $("$flash_script" -l | tail -n +2); do
board_list+=($board)
done
i=0
top_border
echo -e "| Please select the type of board that corresponds to |"
echo -e "| the currently selected MCU ID you chose before. |"
blank_line
echo -e "| The following boards are currently supported: |"
hr
### display all supported boards to the user
for board in ${board_list[@]}; do
if [ $i -lt 10 ]; then
printf "| $i) %-50s|\n" "${board_list[$i]}"
else
printf "| $i) %-49s|\n" "${board_list[$i]}"
fi
i=$((i + 1))
done
quit_footer
### make the user select one of the boards
while true; do
read -p "${cyan}###### Please select board type:${default} " choice
if [ "$choice" = "q" ] || [ "$choice" = "Q" ]; then
clear && advanced_menu && break
elif [ "$choice" -le ${#board_list[@]} ]; then
selected_board="${board_list[$choice]}"
break
else
clear && print_header
ERROR_MSG="Invalid choice!" && print_msg && clear_msg
flash_mcu_sd
fi
done
while true; do
top_border
echo -e "| If your board is flashed with firmware that connects |"
echo -e "| at a custom baud rate, please change it now. |"
blank_line
echo -e "| If you are unsure, stick to the default 250000! |"
bottom_border
echo -e "${cyan}###### Please set the baud rate:${default} "
unset baud_rate
while [[ ! $baud_rate =~ ^[0-9]+$ ]]; do
read -e -i "250000" -e baud_rate
selected_baud_rate=$baud_rate
break
done
break
done
###flash process
do_action_service "stop" "klipper"
"$flash_script" -b "$selected_baud_rate" "$selected_mcu_id" "$selected_board"
### evaluate exit code of flash-sdcard.sh execution
if [ ! $? -eq 0 ]; then
warn_msg "Flashing failed!"
warn_msg "Please read the console output above!"
else
ok_msg "Flashing successfull!"
fi
do_action_service "start" "klipper"
}
build_fw(){
if [ -d "$KLIPPER_DIR" ]; then
cd "$KLIPPER_DIR"
status_msg "Initializing firmware build ..."
dep=(build-essential dpkg-dev make)
dependency_check
make clean && make menuconfig
status_msg "Building firmware ..."
make && ok_msg "Firmware built!"
else
ERROR_MSG="Klipper was not found!\n Can not build firmware without Klipper!"
print_msg && clear_msg && return 1
fi
}
select_mcu_connection(){
echo
top_border
echo -e "| ${yellow}Make sure to have the controller board connected now!${default} |"
blank_line
echo -e "| How is the controller board connected to the host? |"
echo -e "| 1) USB |"
echo -e "| 2) UART |"
bottom_border
while true; do
read -p "${cyan}###### Connection method:${default} " choice
case "$choice" in
1)
retrieve_id "USB"
break;;
2)
retrieve_id "UART"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
unset mcu_count
if [[ "${#mcu_list[@]}" -lt 1 ]]; then
warn_msg "No MCU found!"
warn_msg "MCU not plugged in or not detectable!"
echo
fi
}
retrieve_id(){
status_msg "Identifying MCU ..."
sleep 1
mcu_list=()
mcu_count=1
[ "$1" = "USB" ] && path="/dev/serial/by-id/*"
[ "$1" = "UART" ] && path="/dev/ttyAMA0"
if [[ "$(ls $path)" != "" ]] ; then
for mcu in $path; do
declare "mcu_id_$mcu_count"="$mcu"
mcu_id="mcu_id_$mcu_count"
mcu_list+=("${!mcu_id}")
echo -e " ● ($1) MCU #$mcu_count: ${cyan}$mcu${default}\n"
let mcu_count++
done
fi 2>/dev/null
}
check_usergroup_dialout(){
if grep -q "dialout" </etc/group && ! grep -q "dialout" <(groups "${USER}"); then
group_dialout=false
else
group_dialout=true
fi
if grep -q "tty" </etc/group && ! grep -q "tty" <(groups "${USER}"); then
group_tty=false
else
group_tty=true
fi
if [ "$group_dialout" == "false" ] || [ "$group_tty" == "false" ] ; then
top_border
echo -e "| ${yellow}WARNING: Your current user is not in group:${default} |"
[ "$group_tty" == "false" ] && echo -e "| ${yellow}● tty${default} |"
[ "$group_dialout" == "false" ] && echo -e "| ${yellow}● dialout${default} |"
blank_line
echo -e "| It is possible that you won't be able to successfully |"
echo -e "| flash without your user being a member of that group. |"
echo -e "| If you want to add the current user to the group(s) |"
echo -e "| listed above, answer with 'Y'. Else skip with 'n'. |"
blank_line
echo -e "| ${yellow}INFO:${default} |"
echo -e "| ${yellow}Relog required for group assignments to take effect!${default} |"
bottom_border
while true; do
read -p "${cyan}###### Add user '${USER}' to group(s) now? (Y/n):${default} " yn
case "$yn" in
Y|y|Yes|yes|"")
echo -e "###### > Yes"
status_msg "Adding user '${USER}' to group(s) ..."
if [ "$group_tty" == "false" ]; then
sudo usermod -a -G tty "${USER}" && ok_msg "Group 'tty' assigned!"
fi
if [ "$group_dialout" == "false" ]; then
sudo usermod -a -G dialout "${USER}" && ok_msg "Group 'dialout' assigned!"
fi
ok_msg "You need to relog/restart for the group(s) to be applied!" && exit 0;;
N|n|No|no)
echo -e "###### > No"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
fi
}

View File

@@ -1,3 +1,6 @@
### base variables
SYSTEMDDIR="/etc/systemd/system"
# setting up some frequently used functions # setting up some frequently used functions
check_euid(){ check_euid(){
if [ "$EUID" -eq 0 ] if [ "$EUID" -eq 0 ]
@@ -11,130 +14,184 @@ check_euid(){
fi fi
} }
locate_printer_cfg(){ check_klipper_cfg_path(){
unset PRINTER_CFG source_kiauh_ini
if [ -e $KLIPPER_SERVICE2 ]; then if [ -z $klipper_cfg_loc ]; then
status_msg "Locating printer.cfg via $KLIPPER_SERVICE2 ..." echo
#reads /etc/default/klipper and gets the default printer.cfg location top_border
KLIPPY_ARGS_LINE="$(grep "KLIPPY_ARGS=" /etc/default/klipper)" echo -e "| ${red}!!! WARNING !!!${default} |"
KLIPPY_ARGS_COUNT="$(grep -o " " <<< "$KLIPPY_ARGS_LINE" | wc -l)" echo -e "| ${red}No Klipper configuration directory set!${default} |"
i=1 hr
PRINTER_CFG=$(while [ "$i" != "$KLIPPY_ARGS_COUNT" ]; do grep -E "(\/[A-Za-z0-9\_-]+)+\/printer\.cfg" /etc/default/klipper | cut -d" " -f"$i"; i=$(( $i + 1 )); done | grep "printer.cfg") echo -e "| Before we can continue, KIAUH needs to know where |"
ok_msg "printer.cfg location: '$PRINTER_CFG'" echo -e "| you want your printer configuration to be. |"
elif [ -e $KLIPPER_SERVICE3 ]; then blank_line
status_msg "Locating printer.cfg via $KLIPPER_SERVICE3 ..." echo -e "| Please specify a folder where your Klipper configu- |"
#reads /etc/systemd/system/klipper.service and gets the default printer.cfg location echo -e "| ration is stored or, if you don't have one yet, in |"
KLIPPY_ARGS_LINE="$(grep "ExecStart=" /etc/systemd/system/klipper.service)" echo -e "| which it should be saved after the installation. |"
KLIPPY_ARGS_COUNT="$(grep -o " " <<< "$KLIPPY_ARGS_LINE" | wc -l)" bottom_border
i=1 change_klipper_cfg_path
PRINTER_CFG=$(while [ "$i" != "$KLIPPY_ARGS_COUNT" ]; do grep -E "(\/[A-Za-z0-9\_-]+)+\/printer\.cfg" /etc/systemd/system/klipper.service | cut -d" " -f"$i"; i=$(( $i + 1 )); done | grep "printer.cfg")
ok_msg "printer.cfg location: '$PRINTER_CFG'"
else
PRINTER_CFG=""
warn_msg "Can't read printer.cfg location!"
fi fi
} }
source_ini(){ change_klipper_cfg_path(){
source ${SRCDIR}/kiauh/kiauh.ini source_kiauh_ini
old_klipper_cfg_loc="$klipper_cfg_loc"
EXAMPLE_FOLDER=$(printf "%s/your_config_folder" "${HOME}")
while true; do
top_border
echo -e "| ${red}IMPORTANT:${default} |"
echo -e "| Please enter the new path in the following format: |"
printf "| ${yellow}%-51s${default} |\n" "$EXAMPLE_FOLDER"
blank_line
echo -e "| By default 'klipper_config' is recommended! |"
bottom_border
echo
echo -e "${cyan}###### Please set the Klipper config directory:${default} "
if [ -z "$old_klipper_cfg_loc" ]; then
read -e -i "/home/${USER}/klipper_config" -e new_klipper_cfg_loc
else
read -e -i "$old_klipper_cfg_loc" -e new_klipper_cfg_loc
fi
echo
read -p "${cyan}###### Set config directory to '${yellow}$new_klipper_cfg_loc${cyan}' ? (Y/n):${default} " yn
case "$yn" in
Y|y|Yes|yes|"")
echo -e "###### > Yes"
### backup the old config dir
backup_klipper_config_dir
### write new location to kiauh.ini
sed -i "s|klipper_cfg_loc=$old_klipper_cfg_loc|klipper_cfg_loc=$new_klipper_cfg_loc|" $INI_FILE
status_msg "Directory set to '$new_klipper_cfg_loc'!"
### write new location to klipper and moonraker service
set_klipper_cfg_path
echo; ok_msg "Config directory changed!"
break;;
N|n|No|no)
echo -e "###### > No"
change_klipper_cfg_path
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
} }
start_klipper(){ set_klipper_cfg_path(){
status_msg "Starting Klipper Service ..." ### stop services
sudo systemctl start klipper && ok_msg "Klipper Service started!" do_action_service "stop" "klipper"
} do_action_service "stop" "moonraker"
stop_klipper(){ ### copy config files to new klipper config folder
status_msg "Stopping Klipper Service ..." if [ ! -z "$old_klipper_cfg_loc" ] && [ -d "$old_klipper_cfg_loc" ]; then
sudo systemctl stop klipper && ok_msg "Klipper Service stopped!" if [ ! -d "$new_klipper_cfg_loc" ]; then
} status_msg "Copy config files to '$new_klipper_cfg_loc' ..."
mkdir -p "$new_klipper_cfg_loc"
restart_klipper(){ cd $old_klipper_cfg_loc
status_msg "Restarting Klipper Service ..." cp -r -v ./* "$new_klipper_cfg_loc"
sudo systemctl restart klipper && ok_msg "Klipper Service restarted!" ok_msg "Done!"
} fi
start_dwc(){
status_msg "Starting DWC-for-Klipper-Socket Service ..."
sudo systemctl start dwc && ok_msg "DWC-for-Klipper-Socket Service started!"
}
stop_dwc(){
status_msg "Stopping DWC-for-Klipper-Socket Service ..."
sudo systemctl stop dwc && ok_msg "DWC-for-Klipper-Socket Service stopped!"
}
start_moonraker(){
status_msg "Starting Moonraker Service ..."
sudo systemctl start moonraker && ok_msg "Moonraker Service started!"
}
stop_moonraker(){
status_msg "Stopping Moonraker Service ..."
sudo systemctl stop moonraker && ok_msg "Moonraker Service stopped!"
}
restart_moonraker(){
status_msg "Restarting Moonraker Service ..."
sudo systemctl restart moonraker && ok_msg "Moonraker Service restarted!"
}
start_octoprint(){
status_msg "Starting OctoPrint Service ..."
sudo systemctl start octoprint && ok_msg "OctoPrint Service started!"
}
stop_octoprint(){
status_msg "Stopping OctoPrint Service ..."
sudo systemctl stop octoprint && ok_msg "OctoPrint Service stopped!"
}
restart_octoprint(){
status_msg "Restarting OctoPrint Service ..."
sudo systemctl restart octoprint && ok_msg "OctoPrint Service restarted!"
}
enable_octoprint_service(){
if [[ -f $OCTOPRINT_SERVICE1 && -f $OCTOPRINT_SERVICE2 ]]; then
status_msg "OctoPrint Service is disabled! Enabling now ..."
sudo systemctl enable octoprint -q && sudo systemctl start octoprint
fi fi
SERVICE_FILES=$(find "$SYSTEMDDIR" -regextype posix-extended -regex "$SYSTEMDDIR/klipper(-[^0])+[0-9]*.service")
### handle single klipper instance service file
if [ -f $SYSTEMDDIR/klipper.service ]; then
status_msg "Configuring Klipper for new path ..."
sudo sed -i -r "/ExecStart=/ s|klippy.py (.+)\/printer.cfg|klippy.py $new_klipper_cfg_loc/printer.cfg|" $SYSTEMDDIR/klipper.service
ok_msg "OK!"
elif [ -n "$SERVICE_FILES" ]; then
### handle multi klipper instance service file
status_msg "Configuring Klipper for new path ..."
for service in $SERVICE_FILES; do
sudo sed -i -r "/ExecStart=/ s|klippy.py (.+)\/printer_|klippy.py $new_klipper_cfg_loc/printer_|" "$service"
done
ok_msg "OK!"
fi
SERVICE_FILES=$(find "$SYSTEMDDIR" -regextype posix-extended -regex "$SYSTEMDDIR/moonraker(-[^0])+[0-9]*.service")
### handle single moonraker instance service and moonraker.conf file
if [ -f $SYSTEMDDIR/moonraker.service ]; then
status_msg "Configuring Moonraker for new path ..."
sudo sed -i -r "/ExecStart=/ s|-c (.+)\/moonraker\.conf|-c $new_klipper_cfg_loc/moonraker.conf|" $SYSTEMDDIR/moonraker.service
### replace old file path with new one in moonraker.conf
sed -i -r "/config_path:/ s|config_path:.*|config_path: $new_klipper_cfg_loc|" $new_klipper_cfg_loc/moonraker.conf
ok_msg "OK!"
elif [ -n "$SERVICE_FILES" ]; then
### handle multi moonraker instance service file
status_msg "Configuring Moonraker for new path ..."
for service in $SERVICE_FILES; do
sudo sed -i -r "/ExecStart=/ s|-c (.+)\/printer_|-c $new_klipper_cfg_loc/printer_|" "$service"
done
MR_CONFS=$(find "$new_klipper_cfg_loc" -regextype posix-extended -regex "$new_klipper_cfg_loc/printer_[1-9]+/moonraker.conf")
### replace old file path with new one in moonraker.conf
for moonraker_conf in $MR_CONFS; do
loc=$(echo "$moonraker_conf" | rev | cut -d"/" -f2- | rev)
sed -i -r "/config_path:/ s|config_path:.*|config_path: $loc|" "$moonraker_conf"
done
ok_msg "OK!"
fi
### reloading units
sudo systemctl daemon-reload
### restart services
do_action_service "restart" "klipper"
do_action_service "restart" "moonraker"
} }
disable_octoprint(){ source_kiauh_ini(){
if [ "$DISABLE_OPRINT" = "true" ]; then source $INI_FILE
disable_octoprint_service
fi
} }
disable_octoprint_service(){ do_action_service(){
if [[ -f $OCTOPRINT_SERVICE1 && -f $OCTOPRINT_SERVICE2 ]]; then shopt -s extglob # enable extended globbing
status_msg "OctoPrint Service is enabled! Disabling now ..." SERVICES="$SYSTEMDDIR/$2?(-*([0-9])).service"
sudo systemctl stop octoprint && sudo systemctl disable octoprint -q ### set a variable for the ok and status messages
[ "$1" == "start" ] && ACTION1="started" && ACTION2="Starting"
[ "$1" == "stop" ] && ACTION1="stopped" && ACTION2="Stopping"
[ "$1" == "restart" ] && ACTION1="restarted" && ACTION2="Restarting"
[ "$1" == "enable" ] && ACTION1="enabled" && ACTION2="Enabling"
[ "$1" == "disable" ] && ACTION1="disabled" && ACTION2="Disabling"
if ls $SERVICES 2>/dev/null 1>&2; then
for service in $(ls $SERVICES | rev | cut -d"/" -f1 | rev); do
status_msg "$ACTION2 $service ..."
sudo systemctl $1 "$service"
ok_msg "$service $ACTION1!"
done
fi fi
shopt -u extglob # disable extended globbing
} }
toggle_octoprint_service(){ toggle_octoprint_service(){
if [[ -f $OCTOPRINT_SERVICE1 && -f $OCTOPRINT_SERVICE2 ]]; then if systemctl list-unit-files | grep -E "octoprint.*" | grep "enabled" &>/dev/null; then
if systemctl is-enabled octoprint.service -q; then do_action_service "stop" "octoprint"
disable_octoprint_service do_action_service "disable" "octoprint"
sleep 2 sleep 2
CONFIRM_MSG=" OctoPrint Service is now >>> DISABLED <<< !" CONFIRM_MSG=" OctoPrint Service is now >>> DISABLED <<< !"
else elif systemctl list-unit-files | grep -E "octoprint.*" | grep "disabled" &>/dev/null; then
enable_octoprint_service do_action_service "enable" "octoprint"
sleep 2 do_action_service "start" "octoprint"
CONFIRM_MSG=" OctoPrint Service is now >>> ENABLED <<< !" sleep 2
fi CONFIRM_MSG=" OctoPrint Service is now >>> ENABLED <<< !"
else else
ERROR_MSG=" You cannot activate a service that does not exist!" ERROR_MSG=" You cannot activate a service that does not exist!"
fi fi
} }
read_octoprint_service_status(){ read_octoprint_service_status(){
if ! systemctl is-enabled octoprint.service -q &>/dev/null; then unset OPRINT_SERVICE_STATUS
OPRINT_SERVICE_STATUS="${green}[Enable]${default} OctoPrint Service " if [ ! -f "/etc/systemd/system/octoprint.service" ]; then
else return 0
fi
if systemctl list-unit-files | grep -E "octoprint*" | grep "enabled" &>/dev/null; then
OPRINT_SERVICE_STATUS="${red}[Disable]${default} OctoPrint Service " OPRINT_SERVICE_STATUS="${red}[Disable]${default} OctoPrint Service "
else
OPRINT_SERVICE_STATUS="${green}[Enable]${default} OctoPrint Service "
fi fi
} }
@@ -153,10 +210,25 @@ restart_klipperscreen(){
sudo systemctl restart KlipperScreen && ok_msg "KlipperScreen Service restarted!" sudo systemctl restart KlipperScreen && ok_msg "KlipperScreen Service restarted!"
} }
start_MoonrakerTelegramBot(){
status_msg "Starting MoonrakerTelegramBot Service ..."
sudo systemctl start moonraker-telegram-bot && ok_msg "MoonrakerTelegramBot Service started!"
}
stop_MoonrakerTelegramBot(){
status_msg "Stopping MoonrakerTelegramBot Service ..."
sudo systemctl stop moonraker-telegram-bot && ok_msg "MoonrakerTelegramBot Service stopped!"
}
restart_MoonrakerTelegramBot(){
status_msg "Restarting MoonrakerTelegramBot Service ..."
sudo systemctl restart moonraker-telegram-bot && ok_msg "MoonrakerTelegramBot Service restarted!"
}
restart_nginx(){ restart_nginx(){
if [ "$(systemctl list-units --full -all -t service --no-legend | grep -F "nginx.service")" ]; then if ls /lib/systemd/system/nginx.service 2>/dev/null 1>&2; then
status_msg "Restarting Nginx Service ..." status_msg "Restarting NGINX Service ..."
sudo systemctl restart nginx && ok_msg "Nginx Service restarted!" sudo systemctl restart nginx && ok_msg "NGINX Service restarted!"
fi fi
} }
@@ -178,7 +250,7 @@ dependency_check(){
echo -e "${cyan}$element ${default}" echo -e "${cyan}$element ${default}"
done done
echo echo
sudo apt-get install ${inst[@]} -y sudo apt-get update --allow-releaseinfo-change && sudo apt-get install ${inst[@]} -y
ok_msg "Dependencies installed!" ok_msg "Dependencies installed!"
#clearing the array #clearing the array
unset inst unset inst
@@ -220,10 +292,8 @@ setup_gcode_shell_command(){
Y|y|Yes|yes|"") Y|y|Yes|yes|"")
if [ -d $KLIPPER_DIR/klippy/extras ]; then if [ -d $KLIPPER_DIR/klippy/extras ]; then
status_msg "Installing gcode shell command extension ..." status_msg "Installing gcode shell command extension ..."
status_msg "Copy gcode_shell_command.py to '$KLIPPER_DIR/klippy/extras' ..."
if [ -f $KLIPPER_DIR/klippy/extras/gcode_shell_command.py ]; then if [ -f $KLIPPER_DIR/klippy/extras/gcode_shell_command.py ]; then
warn_msg "There is already a file named 'gcode_shell_command.py'" warn_msg "There is already a file named 'gcode_shell_command.py'\nin the destination location!"
warn_msg "in the destination location!"
while true; do while true; do
read -p "${cyan}###### Do you want to overwrite it? (Y/n):${default} " yn read -p "${cyan}###### Do you want to overwrite it? (Y/n):${default} " yn
case "$yn" in case "$yn" in
@@ -252,27 +322,49 @@ setup_gcode_shell_command(){
} }
install_gcode_shell_command(){ install_gcode_shell_command(){
stop_klipper do_action_service "stop" "klipper"
status_msg "Copy 'gcode_shell_command.py' to $KLIPPER_DIR/klippy/extras" status_msg "Copy 'gcode_shell_command.py' to '$KLIPPER_DIR/klippy/extras' ..."
cp ${HOME}/kiauh/resources/gcode_shell_command.py $KLIPPER_DIR/klippy/extras cp ${SRCDIR}/kiauh/resources/gcode_shell_command.py $KLIPPER_DIR/klippy/extras
echo
while true; do while true; do
echo
read -p "${cyan}###### Do you want to create the example shell command? (Y/n):${default} " yn read -p "${cyan}###### Do you want to create the example shell command? (Y/n):${default} " yn
case "$yn" in case "$yn" in
Y|y|Yes|yes|"") Y|y|Yes|yes|"")
ADD_SHELL_CMD_MACRO="true" status_msg "Copy shell_command.cfg ..."
status_msg "Creating example macro ..." ### create a backup of the config folder
locate_printer_cfg backup_klipper_config_dir
read_printer_cfg "gcode_shell_command"
write_printer_cfg ### handle single printer.cfg
ok_msg "Example macro created!" if [ -f $klipper_cfg_loc/printer.cfg ] && [ ! -f $klipper_cfg_loc/shell_command.cfg ]; then
### copy shell_command.cfg to config location
cp ${SRCDIR}/kiauh/resources/shell_command.cfg $klipper_cfg_loc
ok_msg "$klipper_cfg_loc/shell_command.cfg created!"
### write the include to the very first line of the printer.cfg
sed -i "1 i [include shell_command.cfg]" $klipper_cfg_loc/printer.cfg
fi
### handle multi printer.cfg
if ls $klipper_cfg_loc/printer_* 2>/dev/null 1>&2; then
for config in $(find $klipper_cfg_loc/printer_*/printer.cfg); do
path=$(echo $config | rev | cut -d"/" -f2- | rev)
if [ ! -f $path/shell_command.cfg ]; then
### copy shell_command.cfg to config location
cp ${SRCDIR}/kiauh/resources/shell_command.cfg $path
ok_msg "$path/shell_command.cfg created!"
### write the include to the very first line of the printer.cfg
sed -i "1 i [include shell_command.cfg]" $path/printer.cfg
fi
done
fi
break;; break;;
N|n|No|no) N|n|No|no)
break;; break;;
esac esac
done done
ok_msg "Shell command extension installed!" ok_msg "Shell command extension installed!"
restart_klipper do_action_service "restart" "klipper"
} }
create_minimal_cfg(){ create_minimal_cfg(){
@@ -296,66 +388,11 @@ EOF
fi fi
} }
read_printer_cfg(){
KIAUH_CFG="$(dirname $PRINTER_CFG)/kiauh.cfg"
[ ! -f $KIAUH_CFG ] && KIAUH_CFG_FOUND="false" || KIAUH_CFG_FOUND="true"
if [ -f $PRINTER_CFG ]; then
if [ "$1" = "moonraker" ]; then
[ ! "$(grep '^\[virtual_sdcard\]$' $PRINTER_CFG)" ] && VSD="false" && EDIT_CFG="true"
[ ! "$(grep '^\[pause_resume\]$' $PRINTER_CFG)" ] && PAUSE_RESUME="false" && EDIT_CFG="true"
[ ! "$(grep '^\[display_status\]$' $PRINTER_CFG)" ] && DISPLAY_STATUS="false" && EDIT_CFG="true"
elif [ "$1" = "mainsail" ] || [ "$1" = "fluidd" ]; then
[ ! "$(grep '^\[include webui_macros\.cfg\]$' $PRINTER_CFG)" ] && WEBUI_MACROS="false" && EDIT_CFG="true"
elif [ "$1" = "dwc2" ]; then
[ ! "$(grep '^\[virtual_sdcard\]$' $PRINTER_CFG)" ] && VSD="false" && EDIT_CFG="true"
fi
fi
}
write_printer_cfg(){
#backup printer.cfg if edits will be written
[ "$EDIT_CFG" = "true" ] && backup_printer_cfg
#create kiauh.cfg if its needed and doesn't exist
if [ "$KIAUH_CFG_FOUND" = "false" ] && [ "$EDIT_CFG" = "true" ]; then
status_msg "Creating kiauh.cfg ..."
echo -e "##### AUTOCREATED BY KIAUH #####" > $KIAUH_CFG
fi
#write each entry to kiauh.cfg if it doesn't exist
#Moonraker/DWC2 related config options
if [ "$VSD" = "false" ] && [[ ! $(grep '^\[virtual_sdcard\]$' $KIAUH_CFG) ]]; then
echo -e "\n[virtual_sdcard]\npath: ~/sdcard" >> $KIAUH_CFG
fi
if [ "$PAUSE_RESUME" = "false" ] && [[ ! $(grep '^\[pause_resume]$' $KIAUH_CFG) ]]; then
echo -e "\n[pause_resume]" >> $KIAUH_CFG
fi
if [ "$DISPLAY_STATUS" = "false" ] && [[ ! $(grep '^\[display_status]$' $KIAUH_CFG) ]]; then
echo -e "\n[display_status]" >> $KIAUH_CFG
fi
#Klipper webui related config options
if [ "$WEBUI_MACROS" = "false" ] && [ "$ADD_WEBUI_MACROS" = "true" ] && [[ ! $(grep '^\[include webui_macros.cfg]$' $KIAUH_CFG) ]]; then
echo -e "\n[include webui_macros.cfg]" >> $KIAUH_CFG
fi
#G-Code Shell Command extension related config options
if [ "$ADD_SHELL_CMD_MACRO" = "true" ] && [[ ! $(grep '^\[gcode_shell_command hello_world]$' $KIAUH_CFG) ]]; then
cat <<-EOF >> $KIAUH_CFG
[gcode_shell_command hello_world]
command: echo hello world
timeout: 2.
verbose: True
[gcode_macro HELLO_WORLD]
gcode:
RUN_SHELL_COMMAND CMD=hello_world
EOF
fi
#including the kiauh.cfg into printer.cfg if not already done
if [ ! "$(grep '^\[include kiauh\.cfg\]$' $PRINTER_CFG)" ] && [ "$EDIT_CFG" = "true" ]; then
status_msg "Writing [include kiauh.cfg] to printer.cfg ..."
sed -i '1 i ##### AUTOCREATED BY KIAUH #####\n[include kiauh.cfg]' $PRINTER_CFG
fi
ok_msg "Done!"
}
init_ini(){ init_ini(){
### copy an existing kiauh.ini to its new location to keep all possible saved values
if [ -f ${SRCDIR}/kiauh/kiauh.ini ] && [ ! -f $INI_FILE ]; then
cp ${SRCDIR}/kiauh/kiauh.ini $INI_FILE
fi
if [ ! -f $INI_FILE ]; then if [ ! -f $INI_FILE ]; then
echo -e "#don't edit this file if you don't know what you are doing...\c" > $INI_FILE echo -e "#don't edit this file if you don't know what you are doing...\c" > $INI_FILE
fi fi
@@ -374,4 +411,9 @@ init_ini(){
if [ ! $(grep -E "^logupload_accepted=." $INI_FILE) ]; then if [ ! $(grep -E "^logupload_accepted=." $INI_FILE) ]; then
echo -e "\nlogupload_accepted=false\c" >> $INI_FILE echo -e "\nlogupload_accepted=false\c" >> $INI_FILE
fi fi
###add empty klipper config path if missing
if [ ! $(grep -E "^klipper_cfg_loc=" $INI_FILE) ]; then
echo -e "\nklipper_cfg_loc=\c" >> $INI_FILE
fi
fetch_webui_ports
} }

View File

@@ -1,124 +1,95 @@
install_dwc2(){ ### base variables
if [ -d $KLIPPER_DIR ]; then SYSTEMDDIR="/etc/systemd/system"
system_check_dwc2 DWC_ENV="${HOME}/dwc-env"
#check for other enabled web interfaces DWC2_DIR="${HOME}/duetwebcontrol"
unset SET_LISTEN_PORT
detect_enabled_sites
#ask user for customization
get_user_selections_dwc2
#dwc2 main installation
stop_klipper
dwc2_setup
#setup config
setup_printer_config_dwc2
#execute customizations
disable_octoprint
set_nginx_cfg "dwc2"
set_hostname
#after install actions
restart_klipper
else
ERROR_MSG=" Please install Klipper first!\n Skipping..."
fi
}
system_check_dwc2(){ system_check_dwc(){
status_msg "Initializing DWC2 installation ..." ### check system for an installed octoprint service
#check for existing printer.cfg
locate_printer_cfg
if [ -f $PRINTER_CFG ]; then
PRINTER_CFG_FOUND="true"
else
PRINTER_CFG_FOUND="false"
fi
#check if octoprint is installed
if systemctl is-enabled octoprint.service -q 2>/dev/null; then if systemctl is-enabled octoprint.service -q 2>/dev/null; then
OCTOPRINT_ENABLED="true" OCTOPRINT_ENABLED="true"
fi fi
} }
get_user_selections_dwc2(){ dwc_setup_dialog(){
#let user choose to install systemd or init.d service status_msg "Initializing Duet Web Control installation ..."
### check system for several requirements before initializing the dwc2 installation
system_check_dwc
### check for existing klipper service installations
if [ ! "$(systemctl list-units --full -all -t service --no-legend | grep -F "klipper.service")" ] && [ ! "$(systemctl list-units --full -all -t service --no-legend | grep -E "klipper-[[:digit:]].service")" ]; then
ERROR_MSG="Klipper service not found, please install Klipper first!" && return 0
fi
### count amount of klipper services
if [ "$(systemctl list-units --full -all -t service --no-legend | grep -F "klipper.service")" ]; then
INSTANCE_COUNT=1
else
INSTANCE_COUNT=$(systemctl list-units --full -all -t service --no-legend | grep -E "klipper-[[:digit:]].service" | wc -l)
fi
### initial config path check
check_klipper_cfg_path
### ask user how to handle OctoPrint, Haproxy and Lighttpd
process_octoprint_dialog_dwc2
process_services_dialog
### instance confirmation dialog
while true; do while true; do
echo
top_border
echo -e "| Do you want to install dwc2-for-klipper-socket as |"
echo -e "| 1) Init.d Service (default) |"
echo -e "| 2) Systemd Service |"
hr
echo -e "| Please use the appropriate option for your chosen |"
echo -e "| Linux distribution. If you are unsure what to select, |"
echo -e "| please do a research before. |"
hr
echo -e "| If you run Raspberry Pi OS, both options will work. |"
bottom_border
read -p "${cyan}###### Please choose:${default} " action
case "$action" in
1|"")
echo -e "###### > 1) Init.d"
INST_DWC2_INITD="true"
INST_DWC2_SYSTEMD="false"
break;;
2)
echo -e "###### > 1) Systemd"
INST_DWC2_INITD="false"
INST_DWC2_SYSTEMD="true"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
#user selection for printer.cfg
if [ "$PRINTER_CFG_FOUND" = "false" ]; then
while true; do
echo echo
top_border top_border
echo -e "| ${red}WARNING! - No printer.cfg was found!${default} |" if [ "$INSTANCE_COUNT" -gt 1 ]; then
hr printf "|%-55s|\n" " $INSTANCE_COUNT Klipper instances were found!"
echo -e "| KIAUH can create a minimal printer.cfg with only the |" else
echo -e "| necessary config entries if you wish. |" echo -e "| 1 Klipper instance was found! | "
echo -e "| |" fi
echo -e "| Please be aware, that this option will ${red}NOT${default} create a |" echo -e "| You need one DWC instance per Klipper instance. | "
echo -e "| fully working printer.cfg for you! |"
bottom_border bottom_border
read -p "${cyan}###### Create a default printer.cfg? (Y/n):${default} " yn echo
read -p "${cyan}###### Create $INSTANCE_COUNT DWC instances? (Y/n):${default} " yn
case "$yn" in case "$yn" in
Y|y|Yes|yes|"") Y|y|Yes|yes|"")
echo -e "###### > Yes" echo -e "###### > Yes"
SEL_DEF_CFG="true" status_msg "Creating $INSTANCE_COUNT DWC instances ..."
dwc_setup
break;; break;;
N|n|No|no) N|n|No|no)
echo -e "###### > No" echo -e "###### > No"
SEL_DEF_CFG="false" warn_msg "Exiting DWC setup ..."
echo
break;; break;;
*) *)
print_unkown_cmd print_unkown_cmd
print_msg && clear_msg;; print_msg && clear_msg;;
esac esac
done done
fi }
#ask user to install reverse proxy
dwc2_reverse_proxy_dialog ###TODO for future: should be some kind of shared function between moonraker and this installer, since it does the same
#ask to change hostname process_octoprint_dialog_dwc2(){
[ "$SET_NGINX_CFG" = "true" ] && create_custom_hostname ### ask user to disable octoprint when its service was found
#ask user to disable octoprint when such installed service was found
if [ "$OCTOPRINT_ENABLED" = "true" ]; then if [ "$OCTOPRINT_ENABLED" = "true" ]; then
while true; do while true; do
echo echo
warn_msg "OctoPrint service found!" top_border
echo -e "You might consider disabling the OctoPrint service," echo -e "| ${red}!!! WARNING - OctoPrint service found !!!${default} |"
echo -e "since an active OctoPrint service may lead to unexpected" hr
echo -e "behavior of the DWC2 Webinterface." echo -e "| You might consider disabling the OctoPrint service, |"
echo -e "| since an active OctoPrint service may lead to unex- |"
echo -e "| pected behavior of Duet Web Control for Klipper. |"
bottom_border
read -p "${cyan}###### Do you want to disable OctoPrint now? (Y/n):${default} " yn read -p "${cyan}###### Do you want to disable OctoPrint now? (Y/n):${default} " yn
case "$yn" in case "$yn" in
Y|y|Yes|yes|"") Y|y|Yes|yes|"")
echo -e "###### > Yes" echo -e "###### > Yes"
DISABLE_OPRINT="true" status_msg "Stopping OctoPrint ..."
sudo systemctl stop octoprint && ok_msg "OctoPrint service stopped!"
status_msg "Disabling OctoPrint ..."
sudo systemctl disable octoprint && ok_msg "OctoPrint service disabled!"
break;; break;;
N|n|No|no) N|n|No|no)
echo -e "###### > No" echo -e "###### > No"
DISABLE_OPRINT="false"
break;; break;;
*) *)
print_unkown_cmd print_unkown_cmd
@@ -132,147 +103,288 @@ get_user_selections_dwc2(){
############################################################# #############################################################
############################################################# #############################################################
get_dwc2_ver(){ get_dwc_ver(){
DWC2_VERSION=$(curl -s https://api.github.com/repositories/28820678/releases/latest | grep tag_name | cut -d'"' -f4) DWC2_VERSION=$(curl -s https://api.github.com/repositories/28820678/releases/latest | grep tag_name | cut -d'"' -f4)
} }
dwc2_setup(){ dwc_setup(){
#check dependencies ### get printer config directory
source_kiauh_ini
DWC_CONF_LOC="$klipper_cfg_loc"
### check dependencies
dep=(git wget gzip tar curl) dep=(git wget gzip tar curl)
dependency_check dependency_check
#get dwc2-for-klipper
status_msg "Cloning DWC2-for-Klipper-Socket repository ..." ### step 1: get dwc2-for-klipper
cd ${HOME} && git clone $DWC2FK_REPO status_msg "Downloading DWC2-for-Klipper-Socket ..."
ok_msg "DWC2-for-Klipper successfully cloned!" cd "${HOME}" && git clone "$DWC2FK_REPO"
#copy installers from kiauh srcdir to dwc-for-klipper-socket ok_msg "Download complete!"
status_msg "Copy installers to $DWC2FK_DIR"
cp -r ${SRCDIR}/kiauh/scripts/dwc2-for-klipper-socket-installer $DWC2FK_DIR/scripts ### step 2: install dwc2 dependencies and create python virtualenv
ok_msg "Done!" status_msg "Installing dependencies ..."
status_msg "Starting service-installer ..." install_dwc_packages
if [ "$INST_DWC2_INITD" = "true" ]; then create_dwc_virtualenv
$DWC2FK_DIR/scripts/install-octopi.sh
elif [ "$INST_DWC2_SYSTEMD" = "true" ]; then ### step 3: create dwc2.cfg folder and dwc2.cfg
$DWC2FK_DIR/scripts/install-debian.sh [ ! -d "$DWC_CONF_LOC" ] && mkdir -p "$DWC_CONF_LOC"
dwc_cfg_creation
### step 4: download Duet Web Control
download_dwc_webui
### step 5: create dwc instances
INSTANCE=1
if [ "$INSTANCE_COUNT" -eq $INSTANCE ]; then
create_single_dwc_instance
else
#create_multi_dwc_instance
create_multi_dwc_instance
fi fi
ok_msg "Service installed!"
#patch /etc/default/klipper to append the uds argument
patch_klipper_sysfile "dwc2"
#download Duet Web Control
download_dwc2_webui
} }
download_dwc2_webui(){ download_dwc_webui(){
#get Duet Web Control #get Duet Web Control
GET_DWC2_URL=$(curl -s https://api.github.com/repositories/28820678/releases/latest | grep browser_download_url | cut -d'"' -f4) GET_DWC2_URL=$(curl -s https://api.github.com/repositories/28820678/releases/latest | grep browser_download_url | cut -d'"' -f4)
status_msg "Downloading DWC2 Web UI ..." status_msg "Downloading DWC2 Web UI ..."
[ ! -d $DWC2_DIR ] && mkdir -p $DWC2_DIR [ ! -d "$DWC2_DIR" ] && mkdir -p "$DWC2_DIR"
cd $DWC2_DIR && wget $GET_DWC2_URL cd "$DWC2_DIR" && wget "$GET_DWC2_URL"
ok_msg "Download complete!" ok_msg "Download complete!"
status_msg "Unzipping archive ..." status_msg "Extracting archive ..."
unzip -q -o *.zip unzip -q -o *.zip
for f_ in $(find . | grep '.gz') for f_ in $(find . | grep '.gz')
do do
gunzip -f ${f_} gunzip -f "${f_}"
done done
ok_msg "Done!" ok_msg "Done!"
status_msg "Writing DWC version to file ..." status_msg "Writing DWC version to file ..."
echo $GET_DWC2_URL | cut -d/ -f8 > $DWC2_DIR/version echo "$GET_DWC2_URL" | cut -d/ -f8 > "$DWC2_DIR/.version"
ok_msg "Done!" ok_msg "Done!"
status_msg "Do a little cleanup ..." status_msg "Remove downloaded archive ..."
rm -rf DuetWebControl-SD.zip rm -rf *.zip && ok_msg "Done!" && ok_msg "Duet Web Control installed!"
ok_msg "Done!"
ok_msg "DWC2 Web UI installed!"
} }
############################################################# ##############################################################################################
############################################################# #********************************************************************************************#
##############################################################################################
setup_printer_config_dwc2(){ install_dwc_packages()
if [ "$PRINTER_CFG_FOUND" = "true" ]; then {
#check printer.cfg for necessary dwc2 entries PKGLIST="python3-virtualenv python3-dev python3-tornado"
read_printer_cfg "dwc2" && write_printer_cfg
fi # Update system package info
if [ "$SEL_DEF_CFG" = "true" ]; then status_msg "Running apt-get update..."
status_msg "Creating minimal default printer.cfg ..." sudo apt-get update --allow-releaseinfo-change
create_minimal_cfg
ok_msg "printer.cfg location: '$PRINTER_CFG'" # Install desired packages
ok_msg "Done!" status_msg "Installing packages..."
fi sudo apt-get install --yes "${PKGLIST}"
} }
############################################################# create_dwc_virtualenv()
############################################################# {
status_msg "Installing python virtual environment..."
dwc2_reverse_proxy_dialog(){ # Create virtualenv if it doesn't already exist
echo [ ! -d "${DWC_ENV}" ] && virtualenv -p /usr/bin/python3 "${DWC_ENV}"
top_border
echo -e "| If you want to have a nicer URL or simply need/want | " # Install/update dependencies
echo -e "| DWC2 to run on port 80 (http's default port) you | " "${DWC_ENV}"/bin/pip install tornado==6.0.4
echo -e "| can set up a reverse proxy to run DWC2 on port 80. | " }
bottom_border
while true; do create_single_dwc_startscript(){
read -p "${cyan}###### Do you want to set up a reverse proxy now? (y/N):${default} " yn ### create systemd service file
case "$yn" in sudo /bin/sh -c "cat > ${SYSTEMDDIR}/dwc.service" << DWC
Y|y|Yes|yes) [Unit]
dwc2_port_check Description=DuetWebControl
break;; After=network.target
N|n|No|no|"") [Install]
break;; WantedBy=multi-user.target
*) [Service]
print_unkown_cmd Type=simple
print_msg && clear_msg;; User=${USER}
esac RemainAfterExit=yes
ExecStart=${DWC_ENV}/bin/python3 ${DWC2FK_DIR}/web_dwc2.py -l ${DWC_LOG} -c ${DWC_CFG}
Restart=always
RestartSec=10
DWC
}
create_multi_dwc_startscript(){
### create systemd service file
sudo /bin/sh -c "cat > ${SYSTEMDDIR}/dwc-$INSTANCE.service" << DWC
[Unit]
Description=DuetWebControl
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
User=${USER}
RemainAfterExit=yes
ExecStart=${DWC_ENV}/bin/python3 ${DWC2FK_DIR}/web_dwc2.py -l ${DWC_LOG} -c ${DWC_CFG}
Restart=always
RestartSec=10
DWC
}
create_single_dwcfk_cfg(){
### create single instance config file
/bin/sh -c "cat > $DWC_CONF_LOC/dwc2.cfg" << DWCCFG
[webserver]
listen_adress: 0.0.0.0
web_root: ${HOME}/duetwebcontrol
port: ${PORT}
[reply_filters]
regex:
max_accel: \d+.\d+
max_accel_to_decel: \d+.\d+
square_corner_velocity: \d+.\d+
max_velocity: \d+.\d+
DWCCFG
}
create_multi_dwcfk_cfg(){
### create single instance config file
/bin/sh -c "cat > $DWC_CONF_LOC/printer_$INSTANCE/dwc2.cfg" << DWCCFG
[webserver]
listen_adress: 0.0.0.0
web_root: ${HOME}/duetwebcontrol
port: ${PORT}
[reply_filters]
regex:
max_accel: \d+.\d+
max_accel_to_decel: \d+.\d+
square_corner_velocity: \d+.\d+
max_velocity: \d+.\d+
DWCCFG
}
##############################################################################################
#********************************************************************************************#
##############################################################################################
print_dwc_ip_list(){
i=1
for ip in ${dwc_ip_list[@]}; do
echo -e " ${cyan}● Instance $i:${default} $ip"
i=$((i + 1))
done done
} }
dwc2_port_check(){ create_single_dwc_instance(){
if [ "$DWC2_ENABLED" = "false" ]; then status_msg "Setting up 1 Duet Web Control instance ..."
if [ "$SITE_ENABLED" = "true" ]; then
status_msg "Detected other enabled interfaces:" ### single instance variables
[ "$OCTOPRINT_ENABLED" = "true" ] && echo " ${cyan}● OctoPrint - Port:$OCTOPRINT_PORT${default}" DWC_LOG=/tmp/dwc.log
[ "$MAINSAIL_ENABLED" = "true" ] && echo " ${cyan}● Mainsail - Port:$MAINSAIL_PORT${default}" DWC_CFG="$DWC_CONF_LOC/dwc2.cfg"
[ "$FLUIDD_ENABLED" = "true" ] && echo " ${cyan}● Fluidd - Port:$FLUIDD_PORT${default}"
if [ "$MAINSAIL_PORT" = "80" ] || [ "$OCTOPRINT_PORT" = "80" ] || [ "$FLUIDD_PORT" = "80" ]; then ### create instance
PORT_80_BLOCKED="true" status_msg "Creating single DWC instance ..."
select_dwc2_port create_single_dwc_startscript
fi
else ### enable instance
DEFAULT_PORT=$(grep listen ${SRCDIR}/kiauh/resources/dwc2_nginx.cfg | head -1 | sed 's/^\s*//' | cut -d" " -f2 | cut -d";" -f1) sudo systemctl enable dwc.service
SET_LISTEN_PORT=$DEFAULT_PORT ok_msg "Single DWC instance created!"
fi
SET_NGINX_CFG="true" ### launching instance
else status_msg "Launching DWC instance ..."
SET_NGINX_CFG="false" sudo systemctl start dwc
fi
### confirm message
CONFIRM_MSG="Single DWC instance has been set up!"
print_msg && clear_msg
### display moonraker ip to the user
print_dwc_ip_list; echo
} }
select_dwc2_port(){ create_multi_dwc_instance(){
if [ "$PORT_80_BLOCKED" = "true" ]; then status_msg "Setting up $INSTANCE_COUNT instances of Duet Web Control ..."
echo while [ $INSTANCE -le "$INSTANCE_COUNT" ]; do
top_border ### multi instance variables
echo -e "| ${red}!!!WARNING!!!${default} |" DWC_LOG=/tmp/dwc-$INSTANCE.log
echo -e "| ${red}You need to choose a different port for DWC2!${default} |" DWC_CFG="$DWC_CONF_LOC/printer_$INSTANCE/dwc2.cfg"
echo -e "| ${red}The following web interface is listening at port 80:${default} |"
blank_line ### create instance
[ "$OCTOPRINT_PORT" = "80" ] && echo "| ● OctoPrint |" status_msg "Creating instance #$INSTANCE ..."
[ "$MAINSAIL_PORT" = "80" ] && echo "| ● Mainsail |" create_multi_dwc_startscript
[ "$FLUIDD_PORT" = "80" ] && echo "| ● Fluidd |"
blank_line ### enable instance
echo -e "| Make sure you don't choose a port which was already |" sudo systemctl enable dwc-$INSTANCE.service
echo -e "| assigned to one of the other web interfaces! |" ok_msg "DWC instance $INSTANCE created!"
blank_line
echo -e "| Be aware: there is ${red}NO${default} sanity check for the following |" ### launching instance
echo -e "| input. So make sure to choose a valid port! |" status_msg "Launching DWC instance $INSTANCE ..."
bottom_border sudo systemctl start dwc-$INSTANCE
while true; do
read -p "${cyan}Please enter a new Port:${default} " NEW_PORT ### instance counter +1
if [ "$NEW_PORT" != "$MAINSAIL_PORT" ] && [ "$NEW_PORT" != "$FLUIDD_PORT" ] && [ "$NEW_PORT" != "$OCTOPRINT_PORT" ]; then INSTANCE=$(expr $INSTANCE + 1)
echo "Setting port $NEW_PORT for DWC2!" done
SET_LISTEN_PORT=$NEW_PORT
break ### confirm message
CONFIRM_MSG="$INSTANCE_COUNT DWC instances has been set up!"
print_msg && clear_msg
### display moonraker ip to the user
print_dwc_ip_list; echo
}
dwc_cfg_creation(){
### default dwc port
DEFAULT_PORT=4750
### get printer config directory
source_kiauh_ini
DWC_CONF_LOC="$klipper_cfg_loc"
### reset instances back to 1 again
INSTANCE=1
### declare empty array for ips which get displayed to the user at the end of the setup
HOSTNAME=$(hostname -I | cut -d" " -f1)
dwc_ip_list=()
### create single instance dwc2.cfg file
if [ "$INSTANCE_COUNT" -eq $INSTANCE ]; then
### set port
PORT=$DEFAULT_PORT
### write the ip and port to the ip list for displaying it later to the user
dwc_ip_list+=("$HOSTNAME:$PORT")
status_msg "Creating dwc2.cfg in $DWC_CONF_LOC"
[ ! -d "$DWC_CONF_LOC" ] && mkdir -p "$DWC_CONF_LOC"
if [ ! -f "$DWC_CONF_LOC/dwc2.cfg" ]; then
create_single_dwcfk_cfg && ok_msg "dwc2.cfg created!"
else
warn_msg "There is already a file called 'dwc2.cfg'!"
warn_msg "Skipping..."
fi
### create multi instance moonraker.conf files
else
while [ $INSTANCE -le "$INSTANCE_COUNT" ]; do
### set each instance to its own port
PORT=$(expr $DEFAULT_PORT + $INSTANCE - 1)
### write the ip and port to the ip list for displaying it later to the user
dwc_ip_list+=("$HOSTNAME:$PORT")
### start the creation of each instance
status_msg "Creating dwc2.cfg for instance #$INSTANCE"
[ ! -d "$DWC_CONF_LOC/printer_$INSTANCE" ] && mkdir -p "$DWC_CONF_LOC/printer_$INSTANCE"
if [ ! -f "$DWC_CONF_LOC/printer_$INSTANCE/dwc2.cfg" ]; then
create_multi_dwcfk_cfg && ok_msg "dwc2.cfg created!"
else else
echo "That port is already taken! Select a different one!" warn_msg "There is already a file called 'dwc2.cfg'!"
warn_msg "Skipping..."
fi fi
### raise instance counter by 1
INSTANCE=$(expr $INSTANCE + 1)
done done
fi fi
} }

View File

@@ -1,248 +1,195 @@
install_klipper(){ ### base variables
if [ -e $KLIPPER_SERVICE1 ] && [ -e $KLIPPER_SERVICE2 ] || [ -e $KLIPPER_SERVICE3 ]; then SYSTEMDDIR="/etc/systemd/system"
ERROR_MSG="Looks like Klipper is already installed!" KLIPPY_ENV="${HOME}/klippy-env"
else KLIPPER_DIR="${HOME}/klipper"
get_user_selections_klipper KLIPPER_REPO="https://github.com/Klipper3d/klipper.git"
klipper_setup
build_fw klipper_setup_dialog(){
flash_mcu ### check for existing klipper service installations
write_printer_usb SERVICE_FILES=""
fi INITD_SERVICE_FILES=$(find "/etc/init.d" -regextype posix-extended -regex "/etc/init.d/klipper(-[^0])?[0-9]*")
} SYSTEMD_SERVICE_FILES=$(find "$SYSTEMDDIR" -regextype posix-extended -regex "$SYSTEMDDIR/klipper(-[^0])?[0-9]*.service")
[ -n "$INITD_SERVICE_FILES" ] && SERVICE_FILES+="${INITD_SERVICE_FILES}"
[ -n "$SYSTEMD_SERVICE_FILES" ] && SERVICE_FILES+=" ${SYSTEMD_SERVICE_FILES}"
if [ -n "$SERVICE_FILES" ]; then
ERROR_MSG="At least one Klipper service is already installed:"
for service in $SERVICE_FILES; do
ERROR_MSG="${ERROR_MSG}\n ➔ $service"
done && return
fi
get_user_selections_klipper(){
status_msg "Initializing Klipper installation ..." status_msg "Initializing Klipper installation ..."
#let user choose to install systemd or init.d service
while true; do
echo
top_border
echo -e "| Do you want to install Klipper as: |"
echo -e "| 1) Init.d Service (default) |"
echo -e "| 2) Systemd Service |"
hr
echo -e "| Please use the appropriate option for your chosen |"
echo -e "| Linux distribution. If you are unsure what to select, |"
echo -e "| please do some research before. |"
hr
echo -e "| If you run Raspberry Pi OS, both options will work. |"
bottom_border
read -p "${cyan}###### Please choose:${default} " action
case "$action" in
1|"")
echo -e "###### > 1) Init.d"
INST_KLIPPER_INITD="true"
INST_KLIPPER_SYSTEMD="false"
break;;
2)
echo -e "###### > 2) Systemd"
INST_KLIPPER_INITD="false"
INST_KLIPPER_SYSTEMD="true"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
#ask user for building firmware
while true; do
echo
read -p "${cyan}###### Do you want to build the Firmware? (y/N):${default} " yn
case "$yn" in
Y|y|Yes|yes)
echo -e "###### > Yes"
BUILD_FIRMWARE="true"
break;;
N|n|No|no|"")
echo -e "###### > No"
BUILD_FIRMWARE="false"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
#ask user for flashing mcu
while true; do
echo
read -p "${cyan}###### Do you want to flash your MCU? (y/N):${default} " yn
case "$yn" in
Y|y|Yes|yes)
echo -e "###### > Yes"
FLASH_FIRMWARE="true"
flash_routine
break;;
N|n|No|no|"")
echo -e "###### > No"
FLASH_FIRMWARE="false"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
}
klipper_setup(){ ### initial printer.cfg path check
#check for dependencies check_klipper_cfg_path
dep=(git dbus)
dependency_check
#execute operation
cd ${HOME}
status_msg "Cloning Klipper repository ..."
git clone $KLIPPER_REPO
ok_msg "Klipper successfully cloned!"
status_msg "Installing Klipper Service ..."
if [ "$INST_KLIPPER_INITD" = "true" ]; then
$KLIPPER_DIR/scripts/install-octopi.sh
elif [ "$INST_KLIPPER_SYSTEMD" = "true" ]; then
$KLIPPER_DIR/scripts/install-debian.sh
fi
ok_msg "Klipper installation complete!"
}
flash_routine(){ ### ask for amount of instances to create
if [ "$FLASH_FIRMWARE" = "true" ]; then top_border
echo echo -e "| Please select the number of Klipper instances to set |"
top_border echo -e "| up. The number of Klipper instances will determine |"
echo -e "| ${red}~~~~~~~~~~~ [ ATTENTION! ] ~~~~~~~~~~~~${default} |" echo -e "| the amount of printers you can run from this machine. |"
hr blank_line
echo -e "| Flashing a Smoothie based board with this script will |" echo -e "| ${yellow}WARNING: There is no limit on the number of instances${default} |"
echo -e "| certainly fail. This applies to boards like the BTT |" echo -e "| ${yellow}you can set up with this script.${default} |"
echo -e "| SKR V1.3 or SKR V1.4(Turbo). You have to copy the |" bottom_border
echo -e "| firmware file to the microSD card manually and rename |" count=""
echo -e "| it to 'firmware.bin'. |" while [[ ! ($count =~ ^[1-9]+((0)+)?$) ]]; do
hr read -p "${cyan}###### Number of Klipper instances to set up:${default} " count
echo -e "| You can find the file in: ~/klipper/out/klipper.bin |" if [[ ! ($count =~ ^[1-9]+((0)+)?$) ]]; then
bottom_border warn_msg "Invalid Input!" && echo
while true; do else
read -p "${cyan}###### Do you want to continue? (Y/n):${default} " yn echo
read -p "${cyan}###### Install $count instance(s)? (Y/n):${default} " yn
case "$yn" in case "$yn" in
Y|y|Yes|yes|"") Y|y|Yes|yes|"")
echo -e "###### > Yes" echo -e "###### > Yes"
CONFIRM_FLASHING="true" status_msg "Installing $count Klipper instance(s) ..."
CONFIRM_WRITE_PRINTER_USB="true" klipper_setup "$count"
get_printer_usb
break;; break;;
N|n|No|no) N|n|No|no)
echo -e "###### > No" echo -e "###### > No"
CONFIRM_FLASHING="false" warn_msg "Exiting Klipper setup ..."
CONFIRM_WRITE_PRINTER_USB="false" echo
break;; break;;
*) *)
print_unkown_cmd print_unkown_cmd
print_msg && clear_msg;; print_msg && clear_msg;;
esac esac
done
fi
}
flash_mcu(){
if [ "$CONFIRM_FLASHING" = "true" ] && [ ! -z "$PRINTER_USB" ]; then
stop_klipper
if ! make flash FLASH_DEVICE="$PRINTER_USB" ; then
warn_msg "Flashing failed!"
warn_msg "Please read the console output above!"
else
ok_msg "Flashing successfull!"
fi fi
start_klipper
fi
}
build_fw(){
if [ "$BUILD_FIRMWARE" = "true" ]; then
if [ -d $KLIPPER_DIR ]; then
cd $KLIPPER_DIR
status_msg "Initializing Firmware Setup ..."
make menuconfig
status_msg "Building Firmware ..."
make clean && make && ok_msg "Firmware built!"
else
warn_msg "Can not build Firmware without a Klipper directory!"
fi
fi
}
### grab the printers id
get_printer_usb(){
echo
top_border
echo -e "| Please make sure your printer is connected to the Pi! |"
echo -e "| If the printer is not connected yet, connect it now. |"
hr
echo -e "| Also make sure, that it is the only USB device |"
echo -e "| connected at for now! Otherwise this step may fail! |"
bottom_border
while true; do
echo -e "${cyan}"
read -p "###### Press any key to continue ... " yn
echo -e "${default}"
case "$yn" in
*)
CONFIRM_PRINTER_USB="true"
break;;
esac
done done
status_msg "Identifying the correct USB port ..."
sleep 2
unset PRINTER_USB
if [ -e /dev/serial/by-id/* ]; then
if [ -e /dev/serial/by-id/* ]; then
PRINTER_USB=$(ls /dev/serial/by-id/*)
status_msg "The ID of your printer is:"
title_msg "$PRINTER_USB"
else
warn_msg "Could not retrieve ID!"
fi
elif [ -e /dev/serial/by-path/* ]; then
if [ -e /dev/serial/by-path/* ]; then
PRINTER_USB=$(ls /dev/serial/by-path/*)
status_msg "The path of your printer is:"
title_msg "$PRINTER_USB"
else
warn_msg "Could not retrieve path!"
fi
else
warn_msg "Printer not plugged in or not detectable!"
fi
} }
write_printer_usb(){ install_klipper_packages(){
locate_printer_cfg ### read PKGLIST from official install script
if [ ! -z "$PRINTER_CFG" ] && [ "$CONFIRM_WRITE_PRINTER_USB" = "true" ]; then status_msg "Reading dependencies..."
SERIAL_OLD=$(grep "serial" $PRINTER_CFG | tail -1 | cut -d" " -f2) install_script="${HOME}/klipper/scripts/install-octopi.sh"
SERIAL_NEW=$PRINTER_USB #PKGLIST=$(grep "PKGLIST=" $install_script | sed 's/PKGLIST//g; s/[$={}\n"]//g')
if [ "$SERIAL_OLD" != "$SERIAL_NEW" ]; then PKGLIST=$(grep "PKGLIST=" "$install_script" | sed 's/PKGLIST//g; s/[$"{}=]//g; s/\s\s*/ /g' | tr -d '\n')
unset write_entries ### add dbus requirement for DietPi distro
backup_printer_cfg [ -e "/boot/dietpi/.version" ] && PKGLIST+=" dbus"
write_entries+=("[mcu]\nserial: $SERIAL_NEW")
write_entries+=("\\\n############################\n##### CREATED BY KIAUH #####\n############################") for pkg in $PKGLIST; do
write_entries=("############################\n" "${write_entries[@]}") echo "${cyan}$pkg${default}"
#check for a SAVE_CONFIG entry done
SC="#*# <---------------------- SAVE_CONFIG ---------------------->" read -r -a PKGLIST <<< "$PKGLIST"
if [[ $(grep "$SC" $PRINTER_CFG) ]]; then
SC_LINE=$(grep -n "$SC" $PRINTER_CFG | cut -d ":" -f1) ### Update system package info
PRE_SC_LINE=$(expr $SC_LINE - 1) status_msg "Running apt-get update..."
SC_ENTRY="true" sudo apt-get update --allow-releaseinfo-change
else
SC_ENTRY="false" ### Install desired packages
fi status_msg "Installing packages..."
status_msg "Writing printer ID/path to printer.cfg ..." sudo apt-get install --yes "${PKGLIST[@]}"
if [ "$SC_ENTRY" = "true" ]; then }
PRE_SC_LINE="$(expr $SC_LINE - 1)a"
for entry in "${write_entries[@]}" create_klipper_virtualenv(){
do status_msg "Installing python virtual environment..."
sed -i "$PRE_SC_LINE $entry" $PRINTER_CFG # Create virtualenv if it doesn't already exist
done [ ! -d "${KLIPPY_ENV}" ] && virtualenv -p python2 "${KLIPPY_ENV}"
fi # Install/update dependencies
if [ "$SC_ENTRY" = "false" ]; then "${KLIPPY_ENV}"/bin/pip install -r "${KLIPPER_DIR}"/scripts/klippy-requirements.txt
LINE_COUNT="$(wc -l < $PRINTER_CFG)a" }
for entry in "${write_entries[@]}"
do klipper_setup(){
sed -i "$LINE_COUNT $entry" $PRINTER_CFG INSTANCE_COUNT=$1
done ### checking dependencies
fi dep=(git)
ok_msg "Done!" dependency_check
### step 1: clone klipper
status_msg "Downloading Klipper ..."
### force remove existing klipper dir and clone into fresh klipper dir
[ -d "$KLIPPER_DIR" ] && rm -rf "$KLIPPER_DIR"
cd "${HOME}" && git clone "$KLIPPER_REPO"
status_msg "Download complete!"
### step 2: install klipper dependencies and create python virtualenv
status_msg "Installing dependencies ..."
install_klipper_packages
create_klipper_virtualenv
### step 3: create shared gcode_files and logs folder
[ ! -d "${HOME}"/gcode_files ] && mkdir -p "${HOME}"/gcode_files
[ ! -d "${HOME}"/klipper_logs ] && mkdir -p "${HOME}"/klipper_logs
### step 4: create klipper instances
create_klipper_service
### confirm message
if [[ $INSTANCE_COUNT -eq 1 ]]; then
CONFIRM_MSG="Klipper has been set up!"
elif [[ $INSTANCE_COUNT -gt 1 ]]; then
CONFIRM_MSG="$INSTANCE_COUNT Klipper instances have been set up!"
fi && print_msg && clear_msg
}
create_klipper_service(){
### get config directory
source_kiauh_ini
### set up default values
SINGLE_INST=1
CFG_PATH="$klipper_cfg_loc"
KL_ENV=$KLIPPY_ENV
KL_DIR=$KLIPPER_DIR
KL_LOG="${HOME}/klipper_logs/klippy.log"
KL_UDS="/tmp/klippy_uds"
P_TMP="/tmp/printer"
P_CFG="$CFG_PATH/printer.cfg"
P_CFG_SRC="${SRCDIR}/kiauh/resources/printer.cfg"
KL_SERV_SRC="${SRCDIR}/kiauh/resources/klipper.service"
KL_SERV_TARGET="$SYSTEMDDIR/klipper.service"
write_kl_service(){
[ ! -d "$CFG_PATH" ] && mkdir -p "$CFG_PATH"
### create a minimal config if there is no printer.cfg
[ ! -f "$P_CFG" ] && cp "$P_CFG_SRC" "$P_CFG"
### replace placeholder
if [ ! -f $KL_SERV_TARGET ]; then
status_msg "Creating Klipper Service $i ..."
sudo cp "$KL_SERV_SRC" $KL_SERV_TARGET
sudo sed -i "s|%INST%|$i|" $KL_SERV_TARGET
sudo sed -i "s|%USER%|${USER}|" $KL_SERV_TARGET
sudo sed -i "s|%KL_ENV%|$KL_ENV|" $KL_SERV_TARGET
sudo sed -i "s|%KL_DIR%|$KL_DIR|" $KL_SERV_TARGET
sudo sed -i "s|%KL_LOG%|$KL_LOG|" $KL_SERV_TARGET
sudo sed -i "s|%P_CFG%|$P_CFG|" $KL_SERV_TARGET
sudo sed -i "s|%P_TMP%|$P_TMP|" $KL_SERV_TARGET
sudo sed -i "s|%KL_UDS%|$KL_UDS|" $KL_SERV_TARGET
fi fi
}
if [[ $SINGLE_INST -eq $INSTANCE_COUNT ]]; then
### write single instance service
write_kl_service
### enable instance
sudo systemctl enable klipper.service
ok_msg "Single Klipper instance created!"
### launching instance
status_msg "Launching Klipper instance ..."
sudo systemctl start klipper
else
i=1
while [[ $i -le $INSTANCE_COUNT ]]; do
### rewrite default variables for multi instance cases
CFG_PATH="$klipper_cfg_loc/printer_$i"
KL_SERV_TARGET="$SYSTEMDDIR/klipper-$i.service"
P_TMP="/tmp/printer-$i"
P_CFG="$CFG_PATH/printer.cfg"
KL_LOG="${HOME}/klipper_logs/klippy-$i.log"
KL_UDS="/tmp/klippy_uds-$i"
### write multi instance service
write_kl_service
### enable instance
sudo systemctl enable klipper-$i.service
ok_msg "Klipper instance #$i created!"
### launching instance
status_msg "Launching Klipper instance #$i ..."
sudo systemctl start klipper-$i
### raise values by 1
i=$((i+1))
done
unset i
fi fi
} }

View File

@@ -1,36 +1,51 @@
check_moonraker(){ MAINSAIL_REPO_API="https://api.github.com/repos/mainsail-crew/mainsail/releases"
status_msg "Checking for Moonraker service ..." FLUIDD_REPO_API="https://api.github.com/repos/fluidd-core/fluidd/releases"
if [ "$(systemctl list-units --full -all -t service --no-legend | grep -F "moonraker.service")" ]; then
ok_msg "Moonraker service found!"; echo system_check_webui(){
MOONRAKER_SERVICE_FOUND="true" ### check system for installed moonraker service
if ls /etc/systemd/system/moonraker.service 2>/dev/null 1>&2 || ls /etc/systemd/system | grep -q -E "moonraker-[[:digit:]]+.service"; then
moonraker_chk_ok="true"
else else
warn_msg "Moonraker service not found!" moonraker_chk_ok="false"
warn_msg "Please install Moonraker first!"; echo fi
MOONRAKER_SERVICE_FOUND="false"
### check system for an installed and enabled octoprint service
if sudo systemctl list-unit-files | grep -E "octoprint.*" | grep "enabled" &>/dev/null; then
OCTOPRINT_ENABLED="true"
fi
### check system for an installed haproxy service
if [[ $(dpkg-query -f'${Status}' --show haproxy 2>/dev/null) = *\ installed ]]; then
HAPROXY_FOUND="true"
fi
### check system for an installed lighttpd service
if [[ $(dpkg-query -f'${Status}' --show lighttpd 2>/dev/null) = *\ installed ]]; then
LIGHTTPD_FOUND="true"
fi
### check system for an installed apache2 service
if [[ $(dpkg-query -f'${Status}' --show apache2 2>/dev/null) = *\ installed ]]; then
APACHE2_FOUND="true"
fi fi
} }
get_user_selection_webui(){ get_user_selection_mjpg-streamer(){
#ask user for webui default macros
while true; do while true; do
unset ADD_WEBUI_MACROS unset INSTALL_MJPG
echo echo
top_border top_border
echo -e "| It is recommended to have some important macros to |" echo -e "| Install MJGP-Streamer for webcam support? |"
echo -e "| have full functionality of the web interface. |"
blank_line
echo -e "| If you do not have such macros, you can choose to |"
echo -e "| install the suggested default macros now. |"
bottom_border bottom_border
read -p "${cyan}###### Add the recommended macros? (Y/n):${default} " yn read -p "${cyan}###### Install MJPG-Streamer? (Y/n):${default} " yn
case "$yn" in case "$yn" in
Y|y|Yes|yes|"") Y|y|Yes|yes|"")
echo -e "###### > Yes" echo -e "###### > Yes"
ADD_WEBUI_MACROS="true" INSTALL_MJPG="true"
break;; break;;
N|n|No|no) N|n|No|no)
echo -e "###### > No" echo -e "###### > No"
ADD_WEBUI_MACROS="false" INSTALL_MJPG="false"
break;; break;;
*) *)
print_unkown_cmd print_unkown_cmd
@@ -39,56 +54,154 @@ get_user_selection_webui(){
done done
} }
install_mainsail(){ get_user_selection_kiauh_macros(){
get_user_selection_webui #ask user for webui default macros
#check if moonraker is already installed while true; do
check_moonraker unset ADD_KIAUH_MACROS
if [ "$MOONRAKER_SERVICE_FOUND" = "true" ]; then echo
#check for other enabled web interfaces top_border
unset SET_LISTEN_PORT echo -e "| It is recommended to have some important macros set |"
detect_enabled_sites echo -e "| up in your printer configuration to have $1|"
#check if another site already listens to port 80 echo -e "| fully functional and working. |"
mainsail_port_check blank_line
#creating the mainsail nginx cfg echo -e "| Those macros are: |"
set_nginx_cfg "mainsail" echo -e "| ${cyan}● [gcode_macro PAUSE]${default} |"
#test_nginx "$SET_LISTEN_PORT" echo -e "| ${cyan}● [gcode_macro RESUME]${default} |"
locate_printer_cfg && read_printer_cfg "mainsail" echo -e "| ${cyan}● [gcode_macro CANCEL_PRINT]${default} |"
install_webui_macros blank_line
mainsail_setup echo -e "| If you already have these macros in your config file |"
echo -e "| you can skip this step and choose 'no'. |"
echo -e "| Otherwise you should consider to answer with 'yes' to |"
echo -e "| add the recommended example macros to your config. |"
bottom_border
read -p "${cyan}###### Add the recommended macros? (Y/n):${default} " yn
case "$yn" in
Y|y|Yes|yes|"")
echo -e "###### > Yes"
ADD_KIAUH_MACROS="true"
break;;
N|n|No|no)
echo -e "###### > No"
ADD_KIAUH_MACROS="false"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
}
install_webui(){
source_kiauh_ini
### checking dependencies
dep=(nginx)
dependency_check
### check if moonraker is already installed
system_check_webui
### ask user how to handle OctoPrint, Haproxy, Lighttpd, Apache2 if found
process_octoprint_dialog
process_services_dialog
### process possible disruptive services
process_disruptive_services
[ "$1" == "mainsail" ] && IF_NAME1="Mainsail" && IF_NAME2="Mainsail "
[ "$1" == "fluidd" ] && IF_NAME1="Fluidd" && IF_NAME2="Fluidd "
### exit mainsail/fluidd setup if moonraker not found
if [ $moonraker_chk_ok = "false" ]; then
ERROR_MSG="Moonraker service not found!\n Please install Moonraker first!"
print_msg && clear_msg && return 0
fi
status_msg "Initializing $IF_NAME1 installation ..."
### check for other enabled web interfaces
unset SET_LISTEN_PORT
detect_enabled_sites
### check if another site already listens to port 80
$1_port_check
### ask user to install mjpg-streamer
if ! ls /etc/systemd/system/webcamd.service 2>/dev/null 1>&2; then
get_user_selection_mjpg-streamer
fi
### ask user to install the recommended webinterface macros
if ! ls "$klipper_cfg_loc"/kiauh_macros.cfg 2>/dev/null 1>&2 || ! ls "$klipper_cfg_loc"/printer_*/kiauh_macros.cfg 2>/dev/null 1>&2; then
get_user_selection_kiauh_macros "$IF_NAME2"
fi
### create /etc/nginx/conf.d/upstreams.conf
set_upstream_nginx_cfg
### create /etc/nginx/sites-available/<interface config>
set_nginx_cfg "$1"
### symlink nginx log
symlink_webui_nginx_log "$1"
### copy the kiauh_macros.cfg to the config location
install_kiauh_macros
### install mainsail/fluidd
$1_setup
### install mjpg-streamer
[ "$INSTALL_MJPG" = "true" ] && install_mjpg-streamer
fetch_webui_ports #WIP
### confirm message
CONFIRM_MSG="$IF_NAME1 has been set up!"
print_msg && clear_msg
}
symlink_webui_nginx_log(){
LPATH="${HOME}/klipper_logs"
UI_ACCESS_LOG="/var/log/nginx/$1-access.log"
UI_ERROR_LOG="/var/log/nginx/$1-error.log"
[ ! -d "$LPATH" ] && mkdir -p "$LPATH"
if [ -f "$UI_ACCESS_LOG" ] && [ ! -L "$LPATH/$1-access.log" ]; then
status_msg "Creating symlink for $UI_ACCESS_LOG ..."
ln -s "$UI_ACCESS_LOG" "$LPATH"
ok_msg "OK!"
fi
if [ -f "$UI_ERROR_LOG" ] && [ ! -L "$LPATH/$1-error.log" ]; then
status_msg "Creating symlink for $UI_ERROR_LOG ..."
ln -s "$UI_ERROR_LOG" "$LPATH"
ok_msg "OK!"
fi fi
} }
install_fluidd(){ install_kiauh_macros(){
get_user_selection_webui source_kiauh_ini
#check if moonraker is already installed ### copy kiauh_macros.cfg
check_moonraker if [ "$ADD_KIAUH_MACROS" = "true" ]; then
if [ "$MOONRAKER_SERVICE_FOUND" = "true" ]; then ### create a backup of the config folder
#check for other enabled web interfaces backup_klipper_config_dir
unset SET_LISTEN_PORT ### handle multi printer.cfg
detect_enabled_sites if ls "$klipper_cfg_loc"/printer_* 2>/dev/null 1>&2; then
#check if another site already listens to port 80 for config in $(find $klipper_cfg_loc/printer_*/printer.cfg); do
fluidd_port_check path=$(echo "$config" | rev | cut -d"/" -f2- | rev)
#creating the fluidd nginx cfg if [ ! -f "$path/kiauh_macros.cfg" ]; then
set_nginx_cfg "fluidd" ### copy kiauh_macros.cfg to config location
#test_nginx "$SET_LISTEN_PORT" status_msg "Creating macro config file ..."
locate_printer_cfg && read_printer_cfg "fluidd" cp "${SRCDIR}/kiauh/resources/kiauh_macros.cfg" "$path"
install_webui_macros ### write the include to the very first line of the printer.cfg
fluidd_setup sed -i "1 i [include kiauh_macros.cfg]" "$path/printer.cfg"
fi ok_msg "$path/kiauh_macros.cfg created!"
} fi
done
install_webui_macros(){ ### handle single printer.cfg
#copy webui_macros.cfg elif [ -f "$klipper_cfg_loc/printer.cfg" ] && [ ! -f "$klipper_cfg_loc/kiauh_macros.cfg" ]; then
if [ "$ADD_WEBUI_MACROS" = "true" ]; then ### copy kiauh_macros.cfg to config location
status_msg "Create webui_macros.cfg ..." status_msg "Creating macro config file ..."
if [ ! -f ${HOME}/klipper_config/webui_macros.cfg ]; then cp "${SRCDIR}/kiauh/resources/kiauh_macros.cfg" "$klipper_cfg_loc"
cp ${HOME}/kiauh/resources/webui_macros.cfg ${HOME}/klipper_config ### write the include to the very first line of the printer.cfg
ok_msg "File created!" sed -i "1 i [include kiauh_macros.cfg]" "$klipper_cfg_loc/printer.cfg"
else ok_msg "$klipper_cfg_loc/kiauh_macros.cfg created!"
warn_msg "File already exists! Skipping ..."
fi fi
### restart klipper service to parse the modified printer.cfg
do_action_service "restart" "klipper"
fi fi
write_printer_cfg
} }
mainsail_port_check(){ mainsail_port_check(){
@@ -103,7 +216,7 @@ mainsail_port_check(){
select_mainsail_port select_mainsail_port
fi fi
else else
DEFAULT_PORT=$(grep listen ${SRCDIR}/kiauh/resources/mainsail_nginx.cfg | head -1 | sed 's/^\s*//' | cut -d" " -f2 | cut -d";" -f1) DEFAULT_PORT=$(grep listen "${SRCDIR}/kiauh/resources/klipper_webui_nginx.cfg" | head -1 | sed 's/^\s*//' | cut -d" " -f2 | cut -d";" -f1)
SET_LISTEN_PORT=$DEFAULT_PORT SET_LISTEN_PORT=$DEFAULT_PORT
fi fi
SET_NGINX_CFG="true" SET_NGINX_CFG="true"
@@ -124,7 +237,7 @@ fluidd_port_check(){
select_fluidd_port select_fluidd_port
fi fi
else else
DEFAULT_PORT=$(grep listen ${SRCDIR}/kiauh/resources/fluidd_nginx.cfg | head -1 | sed 's/^\s*//' | cut -d" " -f2 | cut -d";" -f1) DEFAULT_PORT=$(grep listen "${SRCDIR}/kiauh/resources/klipper_webui_nginx.cfg" | head -1 | sed 's/^\s*//' | cut -d" " -f2 | cut -d";" -f1)
SET_LISTEN_PORT=$DEFAULT_PORT SET_LISTEN_PORT=$DEFAULT_PORT
fi fi
SET_NGINX_CFG="true" SET_NGINX_CFG="true"
@@ -146,7 +259,8 @@ select_mainsail_port(){
[ "$DWC2_PORT" = "80" ] && echo "| ● DWC2 |" [ "$DWC2_PORT" = "80" ] && echo "| ● DWC2 |"
blank_line blank_line
echo -e "| Make sure you don't choose a port which was already |" echo -e "| Make sure you don't choose a port which was already |"
echo -e "| assigned to one of the other web interfaces! |" echo -e "| assigned to one of the other webinterfaces and do ${red}NOT${default} |"
echo -e "| use ports in the range of 4750 or above! |"
blank_line blank_line
echo -e "| Be aware: there is ${red}NO${default} sanity check for the following |" echo -e "| Be aware: there is ${red}NO${default} sanity check for the following |"
echo -e "| input. So make sure to choose a valid port! |" echo -e "| input. So make sure to choose a valid port! |"
@@ -177,7 +291,8 @@ select_fluidd_port(){
[ "$DWC2_PORT" = "80" ] && echo "| ● DWC2 |" [ "$DWC2_PORT" = "80" ] && echo "| ● DWC2 |"
blank_line blank_line
echo -e "| Make sure you don't choose a port which was already |" echo -e "| Make sure you don't choose a port which was already |"
echo -e "| assigned to one of the other web interfaces! |" echo -e "| assigned to one of the other webinterfaces and do ${red}NOT${default} |"
echo -e "| use ports in the range of 4750 or above! |"
blank_line blank_line
echo -e "| Be aware: there is ${red}NO${default} sanity check for the following |" echo -e "| Be aware: there is ${red}NO${default} sanity check for the following |"
echo -e "| input. So make sure to choose a valid port! |" echo -e "| input. So make sure to choose a valid port! |"
@@ -196,83 +311,293 @@ select_fluidd_port(){
} }
get_mainsail_ver(){ get_mainsail_ver(){
MAINSAIL_VERSION=$(curl -s https://api.github.com/repositories/240875926/releases | grep tag_name | cut -d'"' -f4 | cut -d"v" -f2 | head -1) MAINSAIL_VERSION=$(curl -s $MAINSAIL_REPO_API | grep tag_name | cut -d'"' -f4 | head -1)
} }
get_fluidd_ver(){ get_fluidd_ver(){
FLUIDD_VERSION=$(curl -s https://api.github.com/repositories/295836951/releases | grep tag_name | cut -d'"' -f4 | cut -d"v" -f2 | head -1) FLUIDD_VERSION=$(curl -s $FLUIDD_REPO_API | grep tag_name | cut -d'"' -f4 | head -1)
} }
mainsail_setup(){ mainsail_setup(){
#get mainsail download url ### get mainsail download url
MAINSAIL_DL_URL=$(curl -s https://api.github.com/repositories/240875926/releases | grep browser_download_url | cut -d'"' -f4 | head -1) MAINSAIL_DL_URL=$(curl -s $MAINSAIL_REPO_API | grep browser_download_url | cut -d'"' -f4 | head -1)
#clean up an existing mainsail folder
[ -d $MAINSAIL_DIR ] && rm -rf $MAINSAIL_DIR ### remove existing and create fresh mainsail folder, then download mainsail
#create fresh mainsail folder and download mainsail [ -d "$MAINSAIL_DIR" ] && rm -rf "$MAINSAIL_DIR"
mkdir $MAINSAIL_DIR && cd $MAINSAIL_DIR mkdir "$MAINSAIL_DIR" && cd $MAINSAIL_DIR
status_msg "Downloading Mainsail $MAINSAIL_VERSION ..." status_msg "Downloading Mainsail $MAINSAIL_VERSION ..."
wget $MAINSAIL_DL_URL && ok_msg "Download complete!" wget "$MAINSAIL_DL_URL" && ok_msg "Download complete!"
#extract archive
### extract archive
status_msg "Extracting archive ..." status_msg "Extracting archive ..."
unzip -q -o *.zip && ok_msg "Done!" unzip -q -o *.zip && ok_msg "Done!"
#delete downloaded zip
### delete downloaded zip
status_msg "Remove downloaded archive ..." status_msg "Remove downloaded archive ..."
rm -rf *.zip && ok_msg "Done!" && ok_msg "Mainsail installation complete!" rm -rf *.zip && ok_msg "Done!"
echo
### check for moonraker multi-instance and if multi-instance was found, enable mainsails remoteMode
if [ $(ls /etc/systemd/system/moonraker* | grep -E "moonraker(-[[:digit:]]+)?\.service" | wc -l) -gt 1 ]; then
enable_mainsail_remotemode
fi
}
enable_mainsail_remotemode(){
rm -f "$MAINSAIL_DIR/config.json"
echo -e "{\n \"remoteMode\":true\n}" >> "$MAINSAIL_DIR/config.json"
} }
fluidd_setup(){ fluidd_setup(){
#get fluidd download url ### get fluidd download url
FLUIDD_DL_URL=$(curl -s https://api.github.com/repositories/295836951/releases/latest | grep browser_download_url | cut -d'"' -f4) FLUIDD_DL_URL=$(curl -s $FLUIDD_REPO_API | grep browser_download_url | cut -d'"' -f4 | head -1)
#clean up an existing fluidd folder
[ -d $FLUIDD_DIR ] && rm -rf $FLUIDD_DIR ### remove existing and create fresh fluidd folder, then download fluidd
#create fresh fluidd folder and download fluidd [ -d "$FLUIDD_DIR" ] && rm -rf "$FLUIDD_DIR"
mkdir $FLUIDD_DIR && cd $FLUIDD_DIR mkdir "$FLUIDD_DIR" && cd $FLUIDD_DIR
status_msg "Downloading Fluidd $FLUIDD_VERSION ..." status_msg "Downloading Fluidd $FLUIDD_VERSION ..."
wget $FLUIDD_DL_URL && ok_msg "Download complete!" wget "$FLUIDD_DL_URL" && ok_msg "Download complete!"
#extract archive
### extract archive
status_msg "Extracting archive ..." status_msg "Extracting archive ..."
unzip -q -o *.zip && ok_msg "Done!" unzip -q -o *.zip && ok_msg "Done!"
#patch moonraker.conf to apply cors domains if needed
backup_moonraker_conf ### delete downloaded zip
patch_moonraker
#delete downloaded zip
status_msg "Remove downloaded archive ..." status_msg "Remove downloaded archive ..."
rm -rf *.zip && ok_msg "Done!" && ok_msg "Fluidd installation complete!" rm -rf *.zip && ok_msg "Done!"
echo
} }
patch_moonraker(){ set_upstream_nginx_cfg(){
status_msg "Patching moonraker.conf ..." get_date
mr_conf=${HOME}/moonraker.conf ### backup existing nginx configs
# remove the now deprecated enable_cors option from moonraker.conf if it still exists [ ! -d "$BACKUP_DIR/nginx_cfg" ] && mkdir -p "$BACKUP_DIR/nginx_cfg"
if [ "$(grep "^enable_cors:" $mr_conf)" ]; then [ -f "$NGINX_CONFD/upstreams.conf" ] && sudo mv "$NGINX_CONFD/upstreams.conf" "$BACKUP_DIR/nginx_cfg/${current_date}_upstreams.conf"
line="$(grep -n "^enable_cors:" ~/moonraker.conf | cut -d":" -f1)d" [ -f "$NGINX_CONFD/common_vars.conf" ] && sudo mv "$NGINX_CONFD/common_vars.conf" "$BACKUP_DIR/nginx_cfg/${current_date}_common_vars.conf"
sed -i "$line" $mr_conf && mr_restart="true" ### transfer ownership of backed up files from root to ${USER}
for log in $(ls "$BACKUP_DIR/nginx_cfg"); do
sudo chown "${USER}" "$BACKUP_DIR/nginx_cfg/$log"
done
### copy nginx configs to target destination
if [ ! -f "$NGINX_CONFD/upstreams.conf" ]; then
sudo cp "${SRCDIR}/kiauh/resources/upstreams.conf" "$NGINX_CONFD"
fi fi
# looking for a cors_domain entry in moonraker.conf if [ ! -f "$NGINX_CONFD/common_vars.conf" ]; then
if [ ! "$(grep "^cors_domains:$" $mr_conf)" ]; then sudo cp "${SRCDIR}/kiauh/resources/common_vars.conf" "$NGINX_CONFD"
#find trusted_clients line number and subtract one, to insert cors_domains later fi
line="$(grep -n "^trusted_clients:$" $mr_conf | cut -d":" -f1)i" }
sed -i "$line cors_domains:" $mr_conf && mr_restart="true"
fi fetch_webui_ports(){
if [ "$(grep "^cors_domains:$" $mr_conf)" ]; then ### read listen ports from possible installed interfaces
hostname=$(hostname -I | cut -d" " -f1) ### and write them to ~/.kiauh.ini
url1="\ \ \ \ http://*.local" WEBIFS=(mainsail fluidd octoprint dwc2)
url2="\ \ \ \ http://app.fluidd.xyz" for interface in "${WEBIFS[@]}"; do
url3="\ \ \ \ https://app.fluidd.xyz" if [ -f "/etc/nginx/sites-available/${interface}" ]; then
url4="\ \ \ \ http://$hostname:*" port=$(grep -E "listen" "/etc/nginx/sites-available/$interface" | head -1 | sed 's/^\s*//' | sed 's/;$//' | cut -d" " -f2)
#find cors_domains line number and add one, to insert urls later if [ ! -n "$(grep -E "${interface}_port" "$INI_FILE")" ]; then
line="$(expr $(grep -n "cors_domains:" $mr_conf | cut -d":" -f1) + 1)i" sed -i '$a'"${interface}_port=${port}" "$INI_FILE"
[ ! "$(grep -E '^\s+http:\/\/\*\.local$' $mr_conf)" ] && sed -i "$line $url1" $mr_conf && mr_restart="true" else
[ ! "$(grep -E '^\s+http:\/\/app\.fluidd\.xyz$' $mr_conf)" ] && sed -i "$line $url2" $mr_conf && mr_restart="true" sed -i "/^${interface}_port/d" "$INI_FILE"
[ ! "$(grep -E '^\s+https:\/\/app\.fluidd\.xyz$' $mr_conf)" ] && sed -i "$line $url3" $mr_conf && mr_restart="true" sed -i '$a'"${interface}_port=${port}" "$INI_FILE"
[ ! "$(grep -E '^\s+http:\/\/([0-9]{1,3}\.){3}[0-9]{1,3}' $mr_conf)" ] && sed -i "$line $url4" $mr_conf && mr_restart="true" fi
fi else
#restart moonraker service if mr_restart was set to true sed -i "/^${interface}_port/d" "$INI_FILE"
if [[ $mr_restart == "true" ]]; then fi
ok_msg "Patching done!" && restart_moonraker done
else }
ok_msg "No patching was needed!"
match_nginx_configs(){
### reinstall nginx configs if the amount of upstreams don't match anymore
source_kiauh_ini
cfg_updated="false"
mainsail_nginx_cfg="/etc/nginx/sites-available/mainsail"
fluidd_nginx_cfg="/etc/nginx/sites-available/fluidd"
upstreams_webcams=$(grep -E "mjpgstreamer" /etc/nginx/conf.d/upstreams.conf | wc -l)
status_msg "Checking validity of NGINX configurations ..."
if [ -e "$mainsail_nginx_cfg" ]; then
mainsail_webcams=$(grep -E "mjpgstreamer" "$mainsail_nginx_cfg" | wc -l)
fi
if [ -e "$fluidd_nginx_cfg" ]; then
fluidd_webcams=$(grep -E "mjpgstreamer" "$fluidd_nginx_cfg" | wc -l)
fi
### check for outdated upstreams.conf
if [[ "$upstreams_webcams" -lt "$mainsail_webcams" ]] || [[ "$upstreams_webcams" -lt "$fluidd_webcams" ]]; then
status_msg "Outdated upstreams.conf found! Updating ..."
sudo rm -f "$NGINX_CONFD/upstreams.conf"
sudo rm -f "$NGINX_CONFD/common_vars.conf"
set_upstream_nginx_cfg
cfg_updated="true"
fi
### check for outdated mainsail config
if [ -e "$mainsail_nginx_cfg" ]; then
if [[ "$upstreams_webcams" -gt "$mainsail_webcams" ]]; then
status_msg "Outdated Mainsail config found! Updating ..."
sudo rm -f "$mainsail_nginx_cfg"
sudo cp "${SRCDIR}/kiauh/resources/klipper_webui_nginx.cfg" "$mainsail_nginx_cfg"
sudo sed -i "s/<<UI>>/mainsail/g" "$mainsail_nginx_cfg"
sudo sed -i "/root/s/pi/${USER}/" "$mainsail_nginx_cfg"
sudo sed -i "s/listen\s[0-9]*;/listen $mainsail_port;/" "$mainsail_nginx_cfg"
sudo sed -i "s/listen\s\[\:*\]\:[0-9]*;/listen \[::\]\:$mainsail_port;/" "$mainsail_nginx_cfg"
cfg_updated="true" && ok_msg "Done!"
fi
fi
### check for outdated fluidd config
if [ -e "$fluidd_nginx_cfg" ]; then
if [[ "$upstreams_webcams" -gt "$fluidd_webcams" ]]; then
status_msg "Outdated Fluidd config found! Updating ..."
sudo rm -f "$fluidd_nginx_cfg"
sudo cp "${SRCDIR}/kiauh/resources/klipper_webui_nginx.cfg" "$fluidd_nginx_cfg"
sudo sed -i "s/<<UI>>/fluidd/g" "$fluidd_nginx_cfg"
sudo sed -i "/root/s/pi/${USER}/" "$fluidd_nginx_cfg"
sudo sed -i "s/listen\s[0-9]*;/listen $fluidd_port;/" "$fluidd_nginx_cfg"
sudo sed -i "s/listen\s\[\:*\]\:[0-9]*;/listen \[::\]\:$fluidd_port;/" "$fluidd_nginx_cfg"
cfg_updated="true" && ok_msg "Done!"
fi
fi
### only restart nginx if configs were updated
if [ "$cfg_updated" == "true" ]; then
restart_nginx && unset cfg_updated
fi
}
process_octoprint_dialog(){
#ask user to disable octoprint when its service was found
if [ "$OCTOPRINT_ENABLED" = "true" ]; then
while true; do
echo
top_border
echo -e "| ${red}!!! WARNING - OctoPrint service found !!!${default} |"
hr
echo -e "| You might consider disabling the OctoPrint service, |"
echo -e "| since an active OctoPrint service may lead to unex- |"
echo -e "| pected behavior of the Klipper Webinterfaces. |"
bottom_border
read -p "${cyan}###### Do you want to disable OctoPrint now? (Y/n):${default} " yn
case "$yn" in
Y|y|Yes|yes|"")
echo -e "###### > Yes"
status_msg "Stopping OctoPrint ..."
do_action_service "stop" "octoprint" && ok_msg "OctoPrint service stopped!"
status_msg "Disabling OctoPrint ..."
do_action_service "disable" "octoprint" && ok_msg "OctoPrint service disabled!"
break;;
N|n|No|no)
echo -e "###### > No"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
fi
}
process_disruptive_services(){
#handle haproxy service
if [ "$DISABLE_HAPROXY" = "true" ] || [ "$REMOVE_HAPROXY" = "true" ]; then
if systemctl is-active haproxy -q; then
status_msg "Stopping haproxy service ..."
sudo systemctl stop haproxy && ok_msg "Service stopped!"
fi
### disable haproxy
if [ "$DISABLE_HAPROXY" = "true" ]; then
status_msg "Disabling haproxy ..."
sudo systemctl disable haproxy && ok_msg "Haproxy service disabled!"
### remove haproxy
if [ "$REMOVE_HAPROXY" = "true" ]; then
status_msg "Removing haproxy ..."
sudo apt-get remove haproxy -y && sudo update-rc.d -f haproxy remove && ok_msg "Haproxy removed!"
fi
fi
fi
### handle lighttpd service
if [ "$DISABLE_LIGHTTPD" = "true" ] || [ "$REMOVE_LIGHTTPD" = "true" ]; then
if systemctl is-active lighttpd -q; then
status_msg "Stopping lighttpd service ..."
sudo systemctl stop lighttpd && ok_msg "Service stopped!"
fi
### disable lighttpd
if [ "$DISABLE_LIGHTTPD" = "true" ]; then
status_msg "Disabling lighttpd ..."
sudo systemctl disable lighttpd && ok_msg "Lighttpd service disabled!"
### remove lighttpd
if [ "$REMOVE_LIGHTTPD" = "true" ]; then
status_msg "Removing lighttpd ..."
sudo apt-get remove lighttpd -y && sudo update-rc.d -f lighttpd remove && ok_msg "Lighttpd removed!"
fi
fi
fi
### handle apache2 service
if [ "$DISABLE_APACHE2" = "true" ] || [ "$REMOVE_APACHE2" = "true" ]; then
if systemctl is-active apache2 -q; then
status_msg "Stopping apache2 service ..."
sudo systemctl stop apache2 && ok_msg "Service stopped!"
fi
### disable lighttpd
if [ "$DISABLE_APACHE2" = "true" ]; then
status_msg "Disabling lighttpd ..."
sudo systemctl disable apache2 && ok_msg "Apache2 service disabled!"
### remove lighttpd
if [ "$REMOVE_APACHE2" = "true" ]; then
status_msg "Removing apache2 ..."
sudo apt-get remove apache2 -y && sudo update-rc.d -f apache2 remove && ok_msg "Apache2 removed!"
fi
fi
fi
}
process_services_dialog(){
#notify user about haproxy or lighttpd services found and possible issues
if [ "$HAPROXY_FOUND" = "true" ] || [ "$LIGHTTPD_FOUND" = "true" ] || [ "$APACHE2_FOUND" = "true" ]; then
while true; do
echo
top_border
echo -e "| ${red}Possibly disruptive/incompatible services found!${default} |"
hr
if [ "$HAPROXY_FOUND" = "true" ]; then
echo -e "| ● haproxy |"
fi
if [ "$LIGHTTPD_FOUND" = "true" ]; then
echo -e "| ● lighttpd |"
fi
if [ "$APACHE2_FOUND" = "true" ]; then
echo -e "| ● apache2 |"
fi
hr
echo -e "| Having those packages installed can lead to unwanted |"
echo -e "| behaviour. It is recommend to remove those packages. |"
echo -e "| |"
echo -e "| 1) Remove packages (recommend) |"
echo -e "| 2) Disable only (may cause issues) |"
echo -e "| ${red}3) Skip this step (not recommended)${default} |"
bottom_border
read -p "${cyan}###### Please choose:${default} " action
case "$action" in
1)
echo -e "###### > Remove packages"
REMOVE_HAPROXY="true"
REMOVE_LIGHTTPD="true"
REMOVE_APACHE2="true"
break;;
2)
echo -e "###### > Disable only"
DISABLE_HAPROXY="true"
DISABLE_LIGHTTPD="true"
DISABLE_APACHE2="true"
break;;
3)
echo -e "###### > Skip"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
fi fi
} }

View File

@@ -1,13 +1,9 @@
install_klipperscreen(){ install_klipperscreen(){
python3_check python3_check
if [ $py_chk_ok = "true" ]; then if [ $py_chk_ok = "true" ]; then
system_check_klipperscreen source_kiauh_ini
#ask user for customization
get_user_selections_klipperscreen
#KlipperScreen main installation #KlipperScreen main installation
klipperscreen_setup klipperscreen_setup
#execute customizations
symlinks_klipperscreen
#after install actions #after install actions
restart_klipperscreen restart_klipperscreen
else else
@@ -28,56 +24,16 @@ python3_check(){
fi fi
} }
system_check_klipperscreen(){
if [ ! -e ${HOME}/klipper_config/KlipperScreen.log ]; then
KLIPPERSCREEN_SL_FOUND="false"
else
KLIPPERSCREEN_SL_FOUND="true"
fi
}
get_user_selections_klipperscreen(){
#user selection for KlipperScreen.log symlink
if [ "$KLIPPERSCREEN_SL_FOUND" = "false" ]; then
while true; do
echo
read -p "${cyan}###### Create KlipperScreen.log symlink? (y/N):${default} " yn
case "$yn" in
Y|y|Yes|yes)
echo -e "###### > Yes"
SEL_KSLOG_SL="true"
break;;
N|n|No|no|"")
echo -e "###### > No"
SEL_KSLOG_SL="false"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
fi
}
klipperscreen_setup(){ klipperscreen_setup(){
dep=(wget curl unzip dfu-util) dep=(wget curl unzip dfu-util)
dependency_check dependency_check
status_msg "Downloading KlipperScreen ..." status_msg "Downloading KlipperScreen ..."
#force remove existing KlipperScreen dir # force remove existing KlipperScreen dir
[ -d $KLIPPERSCREEN_DIR ] && rm -rf $KLIPPERSCREEN_DIR [ -d $KLIPPERSCREEN_DIR ] && rm -rf $KLIPPERSCREEN_DIR
#clone into fresh KlipperScreen dir # clone into fresh KlipperScreen dir
cd ${HOME} && git clone $KLIPPERSCREEN_REPO cd ${HOME} && git clone $KLIPPERSCREEN_REPO
ok_msg "Download complete!" ok_msg "Download complete!"
status_msg "Installing KlipperScreen ..." status_msg "Installing KlipperScreen ..."
$KLIPPERSCREEN_DIR/scripts/KlipperScreen-install.sh $KLIPPERSCREEN_DIR/scripts/KlipperScreen-install.sh
echo; ok_msg "KlipperScreen successfully installed!" ok_msg "KlipperScreen successfully installed!"
}
symlinks_klipperscreen(){
#create a KlipperScreen.log symlink in klipper_config-dir just for convenience
if [ "$SEL_KSLOG_SL" = "true" ] && [ ! -e ${HOME}/klipper_config/KlipperScreen.log ]; then
status_msg "Creating KlipperScreen.log symlink ..."
ln -s /tmp/KlipperScreen.log ${HOME}/klipper_config
ok_msg "Symlink created!"
fi
} }

132
scripts/install_mjpg-streamer.sh Executable file
View File

@@ -0,0 +1,132 @@
### base variables
SYSTEMDDIR="/etc/systemd/system"
WEBCAMD_SRC="https://raw.githubusercontent.com/mainsail-crew/MainsailOS/master/src/modules/mjpgstreamer/filesystem/root/usr/local/bin/webcamd"
WEBCAM_TXT_SRC="https://raw.githubusercontent.com/mainsail-crew/MainsailOS/master/src/modules/mjpgstreamer/filesystem/home/pi/klipper_config/webcam.txt"
install_mjpg-streamer(){
check_klipper_cfg_path
source_kiauh_ini
### set default values
MJPG_SERV_SRC="${SRCDIR}/kiauh/resources/webcamd.service"
MJPG_SERV_TARGET="$SYSTEMDDIR/webcamd.service"
WEBCAM_TXT="$klipper_cfg_loc/webcam.txt"
### if there is a webcamd.service -> exit
if [ -f $MJPG_SERV_TARGET ]; then
ERROR_MSG="Looks like MJPG-streamer is already installed!\n Please remove it first before you try to re-install it!"
print_msg && clear_msg && return
fi
### check and install dependencies if missing
dep=(git cmake build-essential imagemagick libv4l-dev ffmpeg)
if apt-cache search libjpeg62-turbo-dev | grep -Eq "^libjpeg62-turbo-dev "; then
dep+=(libjpeg62-turbo-dev)
elif apt-cache search libjpeg8-dev | grep -Eq "^libjpeg8-dev "; then
dep+=(libjpeg8-dev)
fi
dependency_check
### step 1: clone moonraker
status_msg "Downloading MJPG-Streamer ..."
cd "${HOME}" && git clone https://github.com/jacksonliam/mjpg-streamer.git
ok_msg "Download complete!"
### step 2: compiling mjpg-streamer
status_msg "Compiling MJPG-Streamer ..."
cd "${HOME}"/mjpg-streamer/mjpg-streamer-experimental && make
ok_msg "Compiling complete!"
#step 3: install mjpg-streamer
status_msg "Installing MJPG-Streamer ..."
cd "${HOME}"/mjpg-streamer && mv mjpg-streamer-experimental/* .
mkdir www-mjpgstreamer
cat <<EOT >> ./www-mjpgstreamer/index.html
<html>
<head><title>mjpg_streamer test page</title></head>
<body>
<h1>Snapshot</h1>
<p>Refresh the page to refresh the snapshot</p>
<img src="./?action=snapshot" alt="Snapshot">
<h1>Stream</h1>
<img src="./?action=stream" alt="Stream">
</body>
</html>
EOT
sudo wget $WEBCAMD_SRC -O "/usr/local/bin/webcamd"
sudo sed -i "/^config_dir=/ s|=.*|=$klipper_cfg_loc|" /usr/local/bin/webcamd
sudo sed -i "/MJPGSTREAMER_HOME/ s/pi/${USER}/" /usr/local/bin/webcamd
sudo chmod +x /usr/local/bin/webcamd
### step 4: create webcam.txt config file
[ ! -d "$klipper_cfg_loc" ] && mkdir -p "$klipper_cfg_loc"
if [ ! -f "$WEBCAM_TXT" ]; then
status_msg "Creating webcam.txt config file ..."
wget $WEBCAM_TXT_SRC -O "$WEBCAM_TXT"
ok_msg "Done!"
fi
### step 5: create systemd service
status_msg "Creating MJPG-Streamer service ..."
sudo cp "$MJPG_SERV_SRC" $MJPG_SERV_TARGET
sudo sed -i "s|%USER%|${USER}|" $MJPG_SERV_TARGET
ok_msg "MJPG-Streamer service created!"
### step 6: enabling and starting mjpg-streamer service
status_msg "Starting MJPG-Streamer service ..."
sudo systemctl enable webcamd.service
sudo systemctl start webcamd.service
ok_msg "MJPG-Streamer service started!"
### step 6.1: create webcamd.log symlink
[ ! -d "${HOME}/klipper_logs" ] && mkdir -p "${HOME}/klipper_logs"
if [ -f "/var/log/webcamd.log" ] && [ ! -L "${HOME}/klipper_logs/webcamd.log" ]; then
ln -s "/var/log/webcamd.log" "${HOME}/klipper_logs/webcamd.log"
fi
### step 6.2: add webcamd.log logrotate
if [ ! -f "/etc/logrotate.d/webcamd" ]; then
status_msg "Create logrotate rule ..."
sudo /bin/sh -c "cat > /etc/logrotate.d/webcamd" << EOF
/var/log/webcamd.log
{
rotate 2
weekly
maxsize 32M
missingok
notifempty
compress
delaycompress
sharedscripts
}
EOF
ok_msg "Done!"
fi
### step 7: check if user is in group "video"
usergroup_changed=false
USER_IN_VIDEO_GROUP=$(groups "${USER}" | grep "video")
if [ -z "$USER_IN_VIDEO_GROUP" ]; then
status_msg "Adding user ${USER} to group 'video' ..."
sudo usermod -a -G video "${USER}" && ok_msg "Done!"
usergroup_changed=true
else
ok_msg "User ${USER} already in group 'video'!"
fi
### confirm message
CONFIRM_MSG="MJPG-Streamer has been set up!"
if [ "$usergroup_changed" == true ]; then
CONFIRM_MSG="${CONFIRM_MSG}\n ${yellow}INFO: Your User was added to a new group!${green}"
CONFIRM_MSG="${CONFIRM_MSG}\n ${yellow}You need to relog/restart for the group to be applied!${green}"
fi
print_msg && clear_msg
### print webcam ip adress/url
IP=$(hostname -I | cut -d" " -f1)
WEBCAM_IP="http://$IP:8080/?action=stream"
WEBCAM_URL="http://$IP/webcam/?action=stream"
echo -e " ${cyan}● Webcam URL:${default} $WEBCAM_IP"
echo -e " ${cyan}● Webcam URL:${default} $WEBCAM_URL"
echo
}

View File

@@ -0,0 +1,23 @@
install_MoonrakerTelegramBot(){
source_kiauh_ini
#MoonrakerTelegramBot main installation
MoonrakerTelegramBot_setup
#after install actions
restart_MoonrakerTelegramBot
}
MoonrakerTelegramBot_setup(){
source_kiauh_ini
export klipper_cfg_loc
dep=(virtualenv)
dependency_check
status_msg "Downloading MoonrakerTelegramBot ..."
#force remove existing MoonrakerTelegramBot dir
[ -d $MOONRAKER_TELEGRAM_BOT_DIR ] && rm -rf $MOONRAKER_TELEGRAM_BOT_DIR
#clone into fresh MoonrakerTelegramBot dir
cd ${HOME} && git clone $NLEF_REPO
ok_msg "Download complete!"
status_msg "Installing MoonrakerTelegramBot ..."
$MOONRAKER_TELEGRAM_BOT_DIR/scripts/install.sh
echo; ok_msg "MoonrakerTelegramBot successfully installed!"
}

View File

@@ -1,544 +1,321 @@
install_moonraker(){ ### base variables
python3_check SYSTEMDDIR="/etc/systemd/system"
if [ $py_chk_ok = "true" ]; then MOONRAKER_ENV="${HOME}/moonraker-env"
system_check_moonraker MOONRAKER_DIR="${HOME}/moonraker"
#ask user for customization MOONRAKER_REPO="https://github.com/Arksine/moonraker.git"
get_user_selections_moonraker
#disable/remove haproxy/lighttpd
handle_haproxy_lighttpd
#moonraker main installation
moonraker_setup
check_for_folder_moonraker
#setup configs
setup_printer_config_moonraker
setup_moonraker_conf
#execute customizations
write_custom_trusted_clients
symlinks_moonraker
disable_octoprint
#after install actions
restart_moonraker
restart_klipper
else
ERROR_MSG="Python 3.7 or above required!\n Please upgrade your Python version first."
print_msg && clear_msg
fi
}
python3_check(){ system_check_moonraker(){
### python 3 check
status_msg "Your Python 3 version is: $(python3 --version)" status_msg "Your Python 3 version is: $(python3 --version)"
major=$(python3 --version | cut -d" " -f2 | cut -d"." -f1) major=$(python3 --version | cut -d" " -f2 | cut -d"." -f1)
minor=$(python3 --version | cut -d"." -f2) minor=$(python3 --version | cut -d"." -f2)
if [ $major -ge 3 ] && [ $minor -ge 7 ]; then if [ "$major" -ge 3 ] && [ "$minor" -ge 7 ]; then
ok_msg "Python version ok!"
py_chk_ok="true" py_chk_ok="true"
else else
py_chk_ok="false" py_chk_ok="false"
fi fi
} }
system_check_moonraker(){ moonraker_setup_dialog(){
### check for existing moonraker service installations
SERVICE_FILES=$(find "$SYSTEMDDIR" -regextype posix-extended -regex "$SYSTEMDDIR/moonraker(-[^0])?[0-9]*.service")
if [ -n "$SERVICE_FILES" ]; then
ERROR_MSG="At least one Moonraker service is already installed:"
for service in $SERVICE_FILES; do
ERROR_MSG="${ERROR_MSG}\n ➔ $service"
done && return
fi
status_msg "Initializing Moonraker installation ..." status_msg "Initializing Moonraker installation ..."
#check for existing printer.cfg and for the location ### checking system for python3.7+
locate_printer_cfg system_check_moonraker
if [ -f $PRINTER_CFG ]; then ### exit moonraker setup if python versioncheck fails
PRINTER_CFG_FOUND="true" if [ $py_chk_ok = "false" ]; then
PRINTER_CFG_LOC=$PRINTER_CFG ERROR_MSG="Versioncheck failed! Python 3.7 or newer required!\n"
else ERROR_MSG="${ERROR_MSG} Please upgrade Python."
PRINTER_CFG_FOUND="false" print_msg && clear_msg && return
fi fi
#check for existing klippy.log symlink in /klipper_config
[ ! -e ${HOME}/klipper_config/klippy.log ] && KLIPPY_SL_FOUND="false"
#check for existing moonraker.log symlink in /klipper_config
[ ! -e ${HOME}/klipper_config/moonraker.log ] && MOONRAKER_SL_FOUND="false"
#check for existing moonraker.conf
if [ ! -f ${HOME}/moonraker.conf ]; then
MOONRAKER_CONF_FOUND="false"
else
MOONRAKER_CONF_FOUND="true"
fi
#check if octoprint is installed
if systemctl is-enabled octoprint.service -q 2>/dev/null; then
unset OCTOPRINT_ENABLED
OCTOPRINT_ENABLED="true"
fi
#check if haproxy is installed
if [[ $(dpkg-query -f'${Status}' --show haproxy 2>/dev/null) = *\ installed ]]; then
HAPROXY_FOUND="true"
fi
#check if lighttpd is installed
if [[ $(dpkg-query -f'${Status}' --show lighttpd 2>/dev/null) = *\ installed ]]; then
LIGHTTPD_FOUND="true"
fi
}
get_user_selections_moonraker(){ ### count amount of klipper services
#user selection for printer.cfg SERVICE_FILES=$(find "$SYSTEMDDIR" -regextype posix-extended -regex "$SYSTEMDDIR/klipper(-[^0])+[0-9]*.service")
if [ "$PRINTER_CFG_FOUND" = "false" ]; then if [ -f /etc/init.d/klipper ] || [ -f /etc/systemd/system/klipper.service ]; then
while true; do KLIPPER_COUNT=1
elif [ -n "$SERVICE_FILES" ]; then
KLIPPER_COUNT=$(echo "$SERVICE_FILES" | wc -l)
fi
### initial moonraker.conf path check
check_klipper_cfg_path
top_border
if [[ $KLIPPER_COUNT -eq 1 ]]; then
printf "|${green}%-55s${default}|\n" " 1 Klipper instance was found!"
elif [[ $KLIPPER_COUNT -gt 1 ]]; then
printf "|${green}%-55s${default}|\n" " $KLIPPER_COUNT Klipper instances were found!"
else
echo -e "| ${yellow}INFO: No existing Klipper installation found!${default} |"
fi
echo -e "| Usually you need one Moonraker instance per Klipper |"
echo -e "| instance. Though you can install as many as you wish. |"
bottom_border
echo
count=""
while [[ ! ($count =~ ^[1-9]+((0)+)?$) ]]; do
read -p "${cyan}###### Number of Moonraker instances to set up:${default} " count
if [[ ! ($count =~ ^[1-9]+((0)+)?$) ]]; then
warn_msg "Invalid Input!\n"
else
echo echo
top_border read -p "${cyan}###### Install $count instance(s)? (Y/n):${default} " yn
echo -e "| ${red}WARNING! - No printer.cfg was found!${default} |"
hr
echo -e "| KIAUH can create a minimal printer.cfg with only the |"
echo -e "| recommended Moonraker config entries if you wish. |"
echo -e "| |"
echo -e "| Please be aware, that this option will ${red}NOT${default} create a |"
echo -e "| fully working printer.cfg for you! |"
bottom_border
read -p "${cyan}###### Create a default printer.cfg? (Y/n):${default} " yn
case "$yn" in case "$yn" in
Y|y|Yes|yes|"") Y|y|Yes|yes|"")
echo -e "###### > Yes" echo -e "###### > Yes"
SEL_DEF_CFG="true" status_msg "Installing Moonraker ...\n"
moonraker_setup "$count"
break;; break;;
N|n|No|no) N|n|No|no)
echo -e "###### > No" echo -e "###### > No"
SEL_DEF_CFG="false" warn_msg "Exiting Moonraker setup ...\n"
break;; break;;
*) *)
print_unkown_cmd print_unkown_cmd
print_msg && clear_msg;; print_msg && clear_msg;;
esac esac
done fi
fi done
#user selection for moonraker.log symlink
if [ "$KLIPPY_SL_FOUND" = "false" ]; then
while true; do
echo
read -p "${cyan}###### Create klippy.log symlink? (y/N):${default} " yn
case "$yn" in
Y|y|Yes|yes)
echo -e "###### > Yes"
SEL_KLIPPYLOG_SL="true"
break;;
N|n|No|no|"")
echo -e "###### > No"
SEL_KLIPPYLOG_SL="false"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
fi
#user selection for moonraker.log symlink
if [ "$MOONRAKER_SL_FOUND" = "false" ]; then
while true; do
echo
read -p "${cyan}###### Create moonraker.log symlink? (y/N):${default} " yn
case "$yn" in
Y|y|Yes|yes)
echo -e "###### > Yes"
SEL_MRLOG_SL="true"
break;;
N|n|No|no|"")
echo -e "###### > No"
SEL_MRLOG_SL="false"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
fi
#ask user for more trusted clients
while true; do
echo
top_border
echo -e "| Apart from devices of your local network, you can add |"
echo -e "| additional trusted clients to the moonraker.conf file |"
bottom_border
read -p "${cyan}###### Add additional trusted clients? (y/N):${default} " yn
case "$yn" in
Y|y|Yes|yes)
echo -e "###### > Yes"
ADD_TRUSTED_CLIENT="true"
custom_trusted_clients
break;;
N|n|No|no|"")
echo -e "###### > No"
ADD_TRUSTED_CLIENT="false"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
#ask user to disable octoprint when such installed service was found
if [ "$OCTOPRINT_ENABLED" = "true" ]; then
unset DISABLE_OPRINT
while true; do
echo
warn_msg "OctoPrint service found!"
echo -e "You might consider disabling the OctoPrint service,"
echo -e "since an active OctoPrint service may lead to unexpected"
echo -e "behavior of the Mainsail Webinterface."
read -p "${cyan}###### Do you want to disable OctoPrint now? (Y/n):${default} " yn
case "$yn" in
Y|y|Yes|yes|"")
echo -e "###### > Yes"
DISABLE_OPRINT="true"
break;;
N|n|No|no)
echo -e "###### > No"
DISABLE_OPRINT="false"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
fi
#notify user about haproxy or lighttpd services found and possible issues
if [ "$HAPROXY_FOUND" = "true" ] || [ "$LIGHTTPD_FOUND" = "true" ]; then
while true; do
echo
top_border
echo -e "| ${red}Possibly disruptive/incompatible services found!${default} |"
hr
if [ "$HAPROXY_FOUND" = "true" ]; then
echo -e "| ● haproxy |"
fi
if [ "$LIGHTTPD_FOUND" = "true" ]; then
echo -e "| ● lighttpd |"
fi
hr
echo -e "| Having those packages installed can lead to unwanted |"
echo -e "| behaviour. It is recommend to remove those packages. |"
echo -e "| |"
echo -e "| 1) Remove packages (recommend) |"
echo -e "| 2) Disable only (may cause issues) |"
echo -e "| ${red}3) Skip this step (not recommended)${default} |"
bottom_border
read -p "${cyan}###### Please choose:${default} " action
case "$action" in
1)
echo -e "###### > Remove packages"
if [ "$HAPROXY_FOUND" = "true" ]; then
DISABLE_HAPROXY="false"
REMOVE_HAPROXY="true"
fi
if [ "$LIGHTTPD_FOUND" = "true" ]; then
DISABLE_LIGHTTPD="false"
REMOVE_LIGHTTPD="true"
fi
break;;
2)
echo -e "###### > Disable only"
if [ "$HAPROXY_FOUND" = "true" ]; then
DISABLE_HAPROXY="true"
REMOVE_HAPROXY="false"
fi
if [ "$LIGHTTPD_FOUND" = "true" ]; then
DISABLE_LIGHTTPD="true"
REMOVE_LIGHTTPD="false"
fi
break;;
3)
echo -e "###### > Skip"
DISABLE_LIGHTTPD="false"
REMOVE_LIGHTTPD="false"
DISABLE_HAPROXY="false"
REMOVE_HAPROXY="false"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
fi
status_msg "Installation will start now! Please wait ..."
} }
#############################################################
#############################################################
moonraker_setup(){ moonraker_setup(){
dep=(wget curl unzip dfu-util libjpeg-dev zlib1g-dev) INSTANCE_COUNT=$1
### checking dependencies
dep=(wget curl unzip dfu-util virtualenv)
### additional deps for kiauh compatibility for armbian
dep+=(libjpeg-dev zlib1g-dev)
dependency_check dependency_check
### step 1: clone moonraker
status_msg "Downloading Moonraker ..." status_msg "Downloading Moonraker ..."
#force remove existing moonraker dir ### force remove existing moonraker dir and clone into fresh moonraker dir
[ -d $MOONRAKER_DIR ] && rm -rf $MOONRAKER_DIR [ -d "$MOONRAKER_DIR" ] && rm -rf "$MOONRAKER_DIR"
#clone into fresh moonraker dir cd "${HOME}" && git clone $MOONRAKER_REPO
cd ${HOME} && git clone $MOONRAKER_REPO
ok_msg "Download complete!" ok_msg "Download complete!"
status_msg "Installing Moonraker ..."
$MOONRAKER_DIR/scripts/install-moonraker.sh ### step 2: install moonraker dependencies and create python virtualenv
#copy moonraker configuration for nginx to /etc/nginx/conf.d status_msg "Installing dependencies ..."
setup_moonraker_nginx_cfg install_moonraker_packages
#backup a possible existing printer.cfg at the old location and before patching in the new location create_moonraker_virtualenv
backup_printer_cfg
patch_klipper_sysfile "moonraker" ### step 3: create moonraker.conf folder and moonraker.confs
#re-run printer.cfg location function to read the new path for the printer.cfg create_moonraker_conf
locate_printer_cfg
echo; ok_msg "Moonraker successfully installed!" ### step 4: create final moonraker instances
create_moonraker_service
### step 5: create polkit rules for moonraker
moonraker_polkit
### confirm message
if [[ $INSTANCE_COUNT -eq 1 ]]; then
CONFIRM_MSG="Moonraker has been set up!"
elif [[ $INSTANCE_COUNT -gt 1 ]]; then
CONFIRM_MSG="$INSTANCE_COUNT Moonraker instances have been set up!"
fi && print_msg && clear_msg
### display moonraker ips to the user
print_mr_ip_list; echo
} }
patch_klipper_sysfile(){ install_moonraker_packages(){
if [ -e $KLIPPER_SERVICE2 ]; then ### read PKGLIST from official install script
status_msg "Checking /etc/default/klipper for necessary entries ..." status_msg "Reading dependencies..."
#patching new printer.cfg location to /etc/default/klipper install_script="${HOME}/moonraker/scripts/install-moonraker.sh"
if [ "$1" = "moonraker" ]; then PKGLIST=$(grep "PKGLIST=" "$install_script" | sed 's/PKGLIST//g; s/[$"{}=]//g; s/\s\s*/ /g' | tr -d '\n')
if ! grep -q "/klipper_config/printer.cfg" $KLIPPER_SERVICE2; then for pkg in $PKGLIST; do
status_msg "Patching new printer.cfg location to /etc/default/klipper ..." echo "${cyan}$pkg${default}"
sudo sed -i "/KLIPPY_ARGS=/ s|$PRINTER_CFG|/home/${USER}/klipper_config/printer.cfg|" $KLIPPER_SERVICE2 done
ok_msg "New location is: '/home/${USER}/klipper_config/printer.cfg'" read -r -a PKGLIST <<< "$PKGLIST"
fi
### Update system package info
status_msg "Running apt-get update..."
sudo apt-get update --allow-releaseinfo-change
### Install desired packages
status_msg "Installing packages..."
sudo apt-get install --yes "${PKGLIST[@]}"
}
create_moonraker_virtualenv(){
status_msg "Installing python virtual environment..."
### If venv exists and user prompts a rebuild, then do so
if [ -d "$MOONRAKER_ENV" ] && [ "$REBUILD_ENV" = "y" ]; then
status_msg "Removing old virtualenv"
rm -rf "$MOONRAKER_ENV"
fi
if [ ! -d "$MOONRAKER_ENV" ]; then
virtualenv -p /usr/bin/python3 "$MOONRAKER_ENV"
fi
### Install/update dependencies
"$MOONRAKER_ENV"/bin/pip install -r "$MOONRAKER_DIR"/scripts/moonraker-requirements.txt
}
create_moonraker_service(){
### get config directory
source_kiauh_ini
### set up default values
SINGLE_INST=1
CFG_PATH="$klipper_cfg_loc"
MR_ENV=$MOONRAKER_ENV
MR_DIR=$MOONRAKER_DIR
MR_LOG="${HOME}/klipper_logs/moonraker.log"
MR_CONF="$CFG_PATH/moonraker.conf"
MR_SERV_SRC="${SRCDIR}/kiauh/resources/moonraker.service"
MR_SERV_TARGET="$SYSTEMDDIR/moonraker.service"
write_mr_service(){
if [ ! -f $MR_SERV_TARGET ]; then
status_msg "Creating Moonraker Service $i ..."
sudo cp "$MR_SERV_SRC" $MR_SERV_TARGET
sudo sed -i "s|%INST%|$i|" $MR_SERV_TARGET
sudo sed -i "s|%USER%|${USER}|" $MR_SERV_TARGET
sudo sed -i "s|%MR_ENV%|$MR_ENV|" $MR_SERV_TARGET
sudo sed -i "s|%MR_DIR%|$MR_DIR|" $MR_SERV_TARGET
sudo sed -i "s|%MR_LOG%|$MR_LOG|" $MR_SERV_TARGET
sudo sed -i "s|%MR_CONF%|$MR_CONF|" $MR_SERV_TARGET
fi fi
#patching new UDS argument to /etc/default/klipper }
if [ "$1" = "moonraker" ] || [ "$1" = "dwc2" ]; then
if ! grep -q -- "-a /tmp/klippy_uds" $KLIPPER_SERVICE2; then
status_msg "Patching unix domain socket to /etc/default/klipper ..."
#append the new argument to /tmp/klippy.log argument
sudo sed -i "/KLIPPY_ARGS/s/\.log/\.log -a \/tmp\/klippy_uds/" $KLIPPER_SERVICE2
ok_msg "Patching done!"
fi
fi
fi
if [ -e $KLIPPER_SERVICE3 ]; then
status_msg "Checking /etc/systemd/system/klipper.service for necessary entries ..."
#patching new printer.cfg location to /etc/systemd/system/klipper.service
if [ "$1" = "moonraker" ]; then
if ! grep -q "/klipper_config/printer.cfg" $KLIPPER_SERVICE3; then
status_msg "Patching new printer.cfg location to /etc/systemd/system/klipper.service ..."
sudo sed -i "/ExecStart=/ s|$PRINTER_CFG|/home/${USER}/klipper_config/printer.cfg|" $KLIPPER_SERVICE3
ok_msg "New location is: '/home/${USER}/klipper_config/printer.cfg'"
#set variable if file got edited
SERVICE_FILE_PATCHED="true"
fi
fi
#patching new UDS argument to /etc/systemd/system/klipper.service
if [ "$1" = "moonraker" ] || [ "$1" = "dwc2" ]; then
if ! grep -q -- "-a /tmp/klippy_uds" $KLIPPER_SERVICE3; then
status_msg "Patching unix domain socket to /etc/systemd/system/klipper.service ..."
#append the new argument to /tmp/klippy.log argument
sudo sed -i "/ExecStart/s/\.log/\.log -a \/tmp\/klippy_uds/" $KLIPPER_SERVICE3
ok_msg "Patching done!"
#set variable if file got edited
SERVICE_FILE_PATCHED="true"
fi
fi
#reloading the units is only needed when the service file was patched.
[ "$SERVICE_FILE_PATCHED" = "true" ] && status_msg "Reloading unit ..." && sudo systemctl daemon-reload
fi
ok_msg "Check complete!"
echo
}
check_for_folder_moonraker(){ if [[ $SINGLE_INST -eq $INSTANCE_COUNT ]]; then
#check for / create sdcard folder ### write single instance service
if [ ! -d ${HOME}/sdcard ]; then write_mr_service
status_msg "Creating sdcard directory ..." ### enable instance
mkdir ${HOME}/sdcard do_action_service "enable" "moonraker"
ok_msg "sdcard directory created!" ok_msg "Single Moonraker instance created!"
fi ### launching instance
##check for / create klipper_config folder do_action_service "start" "moonraker"
if [ ! -d ${HOME}/klipper_config ]; then else
status_msg "Creating klipper_config directory ..." i=1
mkdir ${HOME}/klipper_config while [[ $i -le $INSTANCE_COUNT ]]; do
ok_msg "klipper_config directory created!" ### rewrite default variables for multi instance cases
fi CFG_PATH="$klipper_cfg_loc/printer_$i"
} MR_SERV_TARGET="$SYSTEMDDIR/moonraker-$i.service"
MR_CONF="$CFG_PATH/moonraker.conf"
############################################################# MR_LOG="${HOME}/klipper_logs/moonraker-$i.log"
############################################################# ### write multi instance service
write_mr_service
setup_printer_config_moonraker(){ ### enable instance
if [ "$PRINTER_CFG_FOUND" = "true" ]; then do_action_service "enable" "moonraker-$i"
#copy printer.cfg to new location if there is no printer.cfg at the new location already ok_msg "Moonraker instance #$i created!"
if [ -f ${HOME}/printer.cfg ] && [ ! -f ${HOME}/klipper_config/printer.cfg ]; then ### launching instance
status_msg "Copy printer.cfg to new location ..." do_action_service "start" "moonraker-$i"
cp ${HOME}/printer.cfg $PRINTER_CFG ### raise values by 1
ok_msg "printer.cfg location: '$PRINTER_CFG'" i=$((i+1))
ok_msg "Done!"
fi
#check printer.cfg for necessary moonraker entries
read_printer_cfg "moonraker" && write_printer_cfg
fi
if [ "$SEL_DEF_CFG" = "true" ]; then
status_msg "Creating minimal default printer.cfg ..."
create_minimal_cfg
ok_msg "printer.cfg location: '$PRINTER_CFG'"
ok_msg "Done!"
fi
}
setup_moonraker_conf(){
if [ "$MOONRAKER_CONF_FOUND" = "false" ]; then
status_msg "Creating moonraker.conf ..."
cp ${HOME}/kiauh/resources/moonraker.conf ${HOME}
ok_msg "moonraker.conf created!"
status_msg "Writing trusted clients to config ..."
write_default_trusted_clients
ok_msg "Trusted clients written!"
fi
#check for at least one trusted client in an already existing moonraker.conf
#if no entry is found, write default trusted client
if [ "$MOONRAKER_CONF_FOUND" = "true" ]; then
if grep "trusted_clients:" ${HOME}/moonraker.conf -q; then
TC_LINE=$(grep -n "trusted_clients:" ${HOME}/moonraker.conf | cut -d ":" -f1)
FIRST_IP_LINE=$(expr $TC_LINE + 1)
FIRST_IP=$(sed -n "$FIRST_IP_LINE"p ${HOME}/moonraker.conf | cut -d" " -f5)
#if [[ ! $FIRST_IP =~ ([0-9].[0-9].[0-9].[0-9]) ]]; then
if [ "$FIRST_IP" = "" ]; then
status_msg "Writing trusted clients to config ..."
backup_moonraker_conf && write_default_trusted_clients
ok_msg "Trusted clients written!"
fi
fi
fi
}
setup_moonraker_nginx_cfg(){
if [ ! -f $NGINX_CONFD/upstreams.conf ]; then
sudo cp ${SRCDIR}/kiauh/resources/moonraker_nginx.cfg $NGINX_CONFD/upstreams.conf
fi
if [ ! -f $NGINX_CONFD/common_vars.conf ]; then
sudo cp ${SRCDIR}/kiauh/resources/common_vars_nginx.cfg $NGINX_CONFD/common_vars.conf
fi
}
#############################################################
#############################################################
write_default_trusted_clients(){
DEFAULT_IP=$(hostname -I)
status_msg "Your devices current IP adress is:\n${cyan}$DEFAULT_IP ${default}"
#make IP of the device KIAUH is exectuted on as
#default trusted client and expand the IP range from 0 - 255
DEFAULT_IP_RANGE="$(echo "$DEFAULT_IP" | cut -d"." -f1-3).0/24"
status_msg "Writing the following IP range to moonraker.conf:\n${cyan}$DEFAULT_IP_RANGE ${default}"
#write the ip range in the first line below "trusted clients"
#example: 192.168.1.0/24
sed -i "/trusted_clients\:/a \ \ \ \ $DEFAULT_IP_RANGE" ${HOME}/moonraker.conf
ok_msg "IP range of ● $DEFAULT_IP_RANGE written to moonraker.conf!"
}
#############################################################
#############################################################
custom_trusted_clients(){
if [ "$ADD_TRUSTED_CLIENT" = "true" ]; then
unset trusted_arr
echo
top_border
echo -e "| You can now add additional trusted clients to your |"
echo -e "| moonraker.conf file. Be warned, that there is no |"
echo -e "| spellcheck to check for valid input. |"
echo -e "| Make sure to type the IP correct! |"
echo -e "| |"
echo -e "| If you want to add IP ranges, you can type in e.g.: |"
echo -e "| 192.168.1.0/24 |"
echo -e "| This will add the IPs 192.168.1.1 to 192.168.1.254 |"
echo -e "|-------------------------------------------------------|"
echo -e "| You can add as many IPs / IP ranges as you want. |"
echo -e "| When you are done type '${cyan}done${default}' to exit this dialoge. |"
bottom_border
while true; do
read -p "${cyan}###### Enter IP and press ENTER:${default} " TRUSTED_IP
case "$TRUSTED_IP" in
done)
echo
echo -e "List of IPs to add:"
for ip in ${trusted_arr[@]}
do
echo -e "${cyan}$ip ${default}"
done
while true; do
echo
echo -e "Select 'Yes' to confirm, 'No' to start again"
echo -e "or 'Q' to abort and skip."
read -p "${cyan}###### Confirm writing (Y/n/q):${default} " yn
case "$yn" in
Y|y|Yes|yes|"")
echo -e "###### > Yes"
TUSTED_CLIENT_CONFIRM="true"
break;;
N|n|No|no)
echo -e "###### > No"
custom_trusted_clients
break;;
Q|q)
unset trusted_arr
echo -e "###### > Abort"
echo -e "${red}Aborting ...${default}"
break;;
esac
done
break;;
*)
trusted_arr+=($TRUSTED_IP);;
esac
done done
fi unset i
}
write_custom_trusted_clients(){ ### enable mainsails remoteMode if mainsail is found
if [ "$TUSTED_CLIENT_CONFIRM" = "true" ]; then if [ -d "$MAINSAIL_DIR" ]; then
if [ "${#trusted_arr[@]}" != "0" ]; then status_msg "Mainsail installation found!"
for ip in ${trusted_arr[@]} status_msg "Enabling Mainsail remoteMode ..."
do enable_mainsail_remotemode
sed -i "/trusted_clients\:/a \ \ \ \ $ip" ${HOME}/moonraker.conf ok_msg "Mainsails remoteMode enabled!"
done
ok_msg "Custom IPs written to moonraker.conf!"
fi fi
fi fi
} }
symlinks_moonraker(){ create_moonraker_conf(){
#create a klippy.log/moonraker.log symlink in klipper_config-dir just for convenience ### get config directory
if [ "$SEL_KLIPPYLOG_SL" = "true" ] && [ ! -e ${HOME}/klipper_config/klippy.log ]; then source_kiauh_ini
status_msg "Creating klippy.log symlink ..."
ln -s /tmp/klippy.log ${HOME}/klipper_config
ok_msg "Symlink created!"
fi
if [ "$SEL_MRLOG_SL" = "true" ] && [ ! -e ${HOME}/klipper_config/moonraker.log ]; then
status_msg "Creating moonraker.log symlink ..."
ln -s /tmp/moonraker.log ${HOME}/klipper_config
ok_msg "Symlink created!"
fi
}
handle_haproxy_lighttpd(){ ### set up default values
#handle haproxy SINGLE_INST=1
if [ "$DISABLE_HAPROXY" = "true" ]; then PORT=7125
if systemctl is-active haproxy -q; then CFG_PATH="$klipper_cfg_loc"
status_msg "Stopping haproxy service ..." LOG_PATH="${HOME}/klipper_logs"
sudo /etc/init.d/haproxy stop && ok_msg "Service stopped!" MR_CONF="$CFG_PATH/moonraker.conf"
MR_DB="${HOME}/.moonraker_database"
KLIPPY_UDS="/tmp/klippy_uds"
MR_CONF_SRC="${SRCDIR}/kiauh/resources/moonraker.conf"
mr_ip_list=()
IP=$(hostname -I | cut -d" " -f1)
LAN="$(hostname -I | cut -d" " -f1 | cut -d"." -f1-2).0.0/16"
write_mr_conf(){
[ ! -d "$CFG_PATH" ] && mkdir -p "$CFG_PATH"
if [ ! -f "$MR_CONF" ]; then
status_msg "Creating moonraker.conf in $CFG_PATH ..."
cp "$MR_CONF_SRC" "$MR_CONF"
sed -i "s|%PORT%|$PORT|" "$MR_CONF"
sed -i "s|%CFG%|$CFG_PATH|" "$MR_CONF"
sed -i "s|%LOG%|$LOG_PATH|" "$MR_CONF"
sed -i "s|%MR_DB%|$MR_DB|" "$MR_CONF"
sed -i "s|%UDS%|$KLIPPY_UDS|" "$MR_CONF"
# if host ip is not in the default ip ranges, replace placeholder
# otherwise remove placeholder from config
if ! grep -q "$LAN" "$MR_CONF"; then
sed -i "s|%LAN%|$LAN|" "$MR_CONF"
else
sed -i "/%LAN%/d" "$MR_CONF"
fi
sed -i "s|%USER%|${USER}|g" "$MR_CONF"
ok_msg "moonraker.conf created!"
else
warn_msg "There is already a file called 'moonraker.conf'!"
warn_msg "Skipping..."
fi fi
sudo systemctl disable haproxy }
ok_msg "Haproxy service disabled!"
if [[ $SINGLE_INST -eq $INSTANCE_COUNT ]]; then
### write single instance config
write_mr_conf
mr_ip_list+=("$IP:$PORT")
else else
if [ "$REMOVE_HAPROXY" = "true" ]; then i=1
if systemctl is-active haproxy -q; then while [[ $i -le $INSTANCE_COUNT ]]; do
status_msg "Stopping haproxy service ..." ### rewrite default variables for multi instance cases
sudo /etc/init.d/haproxy stop && ok_msg "Service stopped!" CFG_PATH="$klipper_cfg_loc/printer_$i"
fi MR_CONF="$CFG_PATH/moonraker.conf"
status_msg "Removing haproxy ..." MR_DB="${HOME}/.moonraker_database_$i"
sudo apt-get remove haproxy -y KLIPPY_UDS="/tmp/klippy_uds-$i"
sudo update-rc.d -f haproxy remove
ok_msg "Haproxy removed!" ### write multi instance config
fi write_mr_conf
mr_ip_list+=("$IP:$PORT")
### raise values by 1
PORT=$((PORT+1))
i=$((i+1))
done
unset PORT && unset i
fi fi
#handle lighttpd }
if [ "$DISABLE_LIGHTTPD" = "true" ]; then
if systemctl is-active lighttpd -q; then print_mr_ip_list(){
status_msg "Stopping lighttpd service ..." i=1
sudo /etc/init.d/lighttpd stop && ok_msg "Service stopped!" for ip in "${mr_ip_list[@]}"; do
echo -e " ${cyan}● Instance $i:${default} $ip"
i=$((i + 1))
done
}
### introduced due to
### https://github.com/Arksine/moonraker/issues/349
### https://github.com/Arksine/moonraker/pull/346
moonraker_polkit(){
SYSTEMDDIR="/etc/systemd/system"
MOONRAKER_SERVICES=$(find "$SYSTEMDDIR" -regextype posix-extended -regex "$SYSTEMDDIR/moonraker(-[^0])?[0-9]*.service")
for service in $MOONRAKER_SERVICES; do
HAS_SUPP="$( grep -cm1 "SupplementaryGroups=moonraker-admin" "$service" || true )"
if [ "$HAS_SUPP" -eq 0 ]; then
status_msg "Adding moonraker-admin supplementary group to $service ..."
sudo sed -i "/^Type=simple$/a SupplementaryGroups=moonraker-admin" "$service" \
&& ok_msg "Adding moonraker-admin supplementary group successfull!"
fi fi
sudo systemctl disable lighttpd done
ok_msg "Lighttpd service disabled!" ### execute moonrakers policykit-rules script
else "${HOME}"/moonraker/scripts/set-policykit-rules.sh
if [ "$REMOVE_LIGHTTPD" = "true" ]; then sudo systemctl daemon-reload
if systemctl is-active lighttpd -q; then
status_msg "Stopping lighttpd service ..."
sudo /etc/init.d/lighttpd stop && ok_msg "Service stopped!"
fi
status_msg "Removing lighttpd ..."
sudo apt-get remove lighttpd -y
sudo update-rc.d -f lighttpd remove
ok_msg "Lighttpd removed!"
fi
fi
} }

View File

@@ -1,30 +1,46 @@
install_octoprint(){ ### base variables
#check for other enabled web interfaces SYSTEMDDIR="/etc/systemd/system"
unset SET_LISTEN_PORT OCTOPRINT_ENV="${HOME}/OctoPrint"
detect_enabled_sites
#ask user for customization
get_user_selections_octoprint
#octoprint main installation
octoprint_dependencies
octoprint_setup
add_groups
configure_autostart
add_reboot_permission
create_config_yaml
#execute customizations
set_nginx_cfg "octoprint"
set_hostname
#after install actions
load_octoprint_server
}
get_user_selections_octoprint(){ octoprint_setup_dialog(){
status_msg "Initializing OctoPrint installation ..." status_msg "Initializing OctoPrint installation ..."
#ask user to set a reverse proxy
octoprint_reverse_proxy_dialog ### count amount of klipper services
#ask to change hostname if [ "$(systemctl list-units --full -all -t service --no-legend | grep -F "klipper.service")" ]; then
[ "$SET_NGINX_CFG" = "true" ] && create_custom_hostname INSTANCE_COUNT=1
status_msg "Installation will start now! Please wait ..." else
INSTANCE_COUNT=$(systemctl list-units --full -all -t service --no-legend | grep -E "klipper-[[:digit:]].service" | wc -l)
fi
### instance confirmation dialog
while true; do
echo
top_border
if [ $INSTANCE_COUNT -gt 1 ]; then
printf "|%-55s|\n" " $INSTANCE_COUNT Klipper instances were found!"
else
echo -e "| 1 Klipper instance was found! | "
fi
echo -e "| You need one OctoPrint instance per Klipper instance. | "
bottom_border
echo
read -p "${cyan}###### Create $INSTANCE_COUNT OctoPrint instances? (Y/n):${default} " yn
case "$yn" in
Y|y|Yes|yes|"")
echo -e "###### > Yes"
status_msg "Creating $INSTANCE_COUNT OctoPrint instances ..."
octoprint_setup
break;;
N|n|No|no)
echo -e "###### > No"
warn_msg "Exiting OctoPrint setup ..."
echo
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
} }
octoprint_dependencies(){ octoprint_dependencies(){
@@ -42,25 +58,39 @@ octoprint_dependencies(){
} }
octoprint_setup(){ octoprint_setup(){
if [ ! -d $OCTOPRINT_DIR ];then ### check and install all dependencies
status_msg "Create OctoPrint directory ..." octoprint_dependencies
mkdir -p $OCTOPRINT_DIR && ok_msg "Directory created!"
fi ### add user to usergroups and add reboot permissions
cd $OCTOPRINT_DIR add_to_groups
#create the virtualenv add_reboot_permission
### create and activate the virtualenv
[ ! -d $OCTOPRINT_ENV ] && mkdir -p $OCTOPRINT_ENV
status_msg "Set up virtualenv ..." status_msg "Set up virtualenv ..."
virtualenv venv cd $OCTOPRINT_ENV
virtualenv --python=python3 venv
source venv/bin/activate source venv/bin/activate
#install octoprint with pip
### install octoprint with pip
status_msg "Download and install OctoPrint ..." status_msg "Download and install OctoPrint ..."
pip install pip --upgrade pip install pip --upgrade
pip install --no-cache-dir octoprint pip install --no-cache-dir octoprint
ok_msg "Download complete!" ok_msg "Download complete!"
#leave virtualenv
### leave virtualenv
deactivate deactivate
### set up instances
INSTANCE=1
if [ $INSTANCE_COUNT -eq $INSTANCE ]; then
create_single_octoprint_instance
else
create_multi_octoprint_instance
fi
} }
add_groups(){ add_to_groups(){
if [ ! "$(groups | grep tty)" ]; then if [ ! "$(groups | grep tty)" ]; then
status_msg "Adding user '${USER}' to group 'tty' ..." status_msg "Adding user '${USER}' to group 'tty' ..."
sudo usermod -a -G tty ${USER} && ok_msg "Done!" sudo usermod -a -G tty ${USER} && ok_msg "Done!"
@@ -71,143 +101,176 @@ add_groups(){
fi fi
} }
configure_autostart(){ create_single_octoprint_startscript(){
USER=$(whoami) ### create single instance systemd service file
cd $OCTOPRINT_DIR sudo /bin/sh -c "cat > ${SYSTEMDDIR}/octoprint.service" << OCTOPRINT
status_msg "Downloading files ..." [Unit]
wget https://github.com/foosel/OctoPrint/raw/master/scripts/octoprint.init Description=Starts OctoPrint on startup
wget https://github.com/foosel/OctoPrint/raw/master/scripts/octoprint.default After=network-online.target
ok_msg "Files downloaded successfully!" Wants=network-online.target
#make necessary changes in default file
status_msg "Configure OctoPrint Service ..." [Service]
DEFAULT_FILE=$OCTOPRINT_DIR/octoprint.default Environment="LC_ALL=C.UTF-8"
sed -i "s/pi/$USER/g" $DEFAULT_FILE Environment="LANG=C.UTF-8"
sed -i "s/#BASEDIR=/BASEDIR=/" $DEFAULT_FILE Type=simple
sed -i "s/#CONFIGFILE=/CONFIGFILE=/" $DEFAULT_FILE User=$USER
sed -i "s/#DAEMON=/DAEMON=/" $DEFAULT_FILE ExecStart=${OCTOPRINT_ENV}/venv/bin/octoprint --basedir ${BASEDIR} --config ${CONFIG_YAML} --port=${PORT} serve
#move files to correct location
sudo mv octoprint.init $OCTOPRINT_SERVICE1 [Install]
sudo mv octoprint.default $OCTOPRINT_SERVICE2 WantedBy=multi-user.target
#make file in init.d executable OCTOPRINT
sudo chmod +x $OCTOPRINT_SERVICE1 }
status_msg "Reload systemd configuration files"
sudo update-rc.d octoprint defaults create_multi_octoprint_startscript(){
sudo systemctl daemon-reload ### create multi instance systemd service file
ok_msg "Configuration complete!" sudo /bin/sh -c "cat > ${SYSTEMDDIR}/octoprint-$INSTANCE.service" << OCTOPRINT
ok_msg "OctoPrint installed!" [Unit]
Description=Starts OctoPrint instance $INSTANCE on startup
After=network-online.target
Wants=network-online.target
[Service]
Environment="LC_ALL=C.UTF-8"
Environment="LANG=C.UTF-8"
Type=simple
User=$USER
ExecStart=${OCTOPRINT_ENV}/venv/bin/octoprint --basedir ${BASEDIR} --config ${CONFIG_YAML} --port=${PORT} serve
[Install]
WantedBy=multi-user.target
OCTOPRINT
}
create_config_yaml(){
### create multi instance config.yaml file
/bin/sh -c "cat > ${BASEDIR}/config.yaml" << CONFIGYAML
serial:
additionalPorts:
- ${TMP_PRINTER}
disconnectOnErrors: false
port: ${TMP_PRINTER}
server:
commands:
serverRestartCommand: ${RESTART_COMMAND}
systemRestartCommand: sudo shutdown -r now
systemShutdownCommand: sudo shutdown -h now
CONFIGYAML
}
create_single_octoprint_instance(){
status_msg "Setting up 1 OctoPrint instance ..."
### single instance variables
PORT=5000
BASEDIR="${HOME}/.octoprint"
TMP_PRINTER="/tmp/printer"
CONFIG_YAML="$BASEDIR/config.yaml"
RESTART_COMMAND="sudo service octoprint restart"
### declare empty array for ips which get displayed to the user at the end of the setup
HOSTNAME=$(hostname -I | cut -d" " -f1)
op_ip_list=()
### create instance
status_msg "Creating single OctoPrint instance ..."
create_single_octoprint_startscript
op_ip_list+=("$HOSTNAME:$PORT")
### create the config.yaml
if [ ! -f $BASEDIR/config.yaml ]; then
status_msg "Creating config.yaml ..."
[ ! -d $BASEDIR ] && mkdir $BASEDIR
create_config_yaml
ok_msg "Config created!"
fi
### enable instance
sudo systemctl enable octoprint.service
ok_msg "Single OctoPrint instance created!"
### launching instance
status_msg "Launching OctoPrint instance ..."
sudo systemctl start octoprint
### confirm message
CONFIRM_MSG="Single OctoPrint instance has been set up!"
print_msg && clear_msg
### display all octoprint ips to the user
print_op_ip_list; echo
}
create_multi_octoprint_instance(){
status_msg "Setting up $INSTANCE_COUNT instances of OctoPrint ..."
### declare empty array for ips which get displayed to the user at the end of the setup
HOSTNAME=$(hostname -I | cut -d" " -f1)
op_ip_list=()
### default port
PORT=5000
while [ $INSTANCE -le $INSTANCE_COUNT ]; do
### multi instance variables
BASEDIR="${HOME}/.octoprint-$INSTANCE"
TMP_PRINTER="/tmp/printer-$INSTANCE"
CONFIG_YAML="$BASEDIR/config.yaml"
RESTART_COMMAND="sudo service octoprint restart"
### create instance
status_msg "Creating instance #$INSTANCE ..."
create_multi_octoprint_startscript
op_ip_list+=("$HOSTNAME:$PORT")
### create the config.yaml
if [ ! -f $BASEDIR/config.yaml ]; then
status_msg "Creating config.yaml for instance #$INSTANCE..."
[ ! -d $BASEDIR ] && mkdir $BASEDIR
create_config_yaml
ok_msg "Config #$INSTANCE created!"
fi
### enable instance
sudo systemctl enable octoprint-$INSTANCE.service
ok_msg "OctoPrint instance $INSTANCE created!"
### launching instance
status_msg "Launching OctoPrint instance $INSTANCE ..."
sudo systemctl start octoprint-$INSTANCE
### instance counter +1
INSTANCE=$(expr $INSTANCE + 1)
### port +1
PORT=$(expr $PORT + 1)
done
### confirm message
CONFIRM_MSG="$INSTANCE_COUNT OctoPrint instances have been set up!"
print_msg && clear_msg
### display all moonraker ips to the user
print_op_ip_list; echo
} }
add_reboot_permission(){ add_reboot_permission(){
USER=$(whoami) USER=${USER}
#create a backup when file already exists #create a backup when file already exists
if [ -f /etc/sudoers.d/octoprint-shutdown ]; then if [ -f /etc/sudoers.d/octoprint-shutdown ]; then
sudo mv /etc/sudoers.d/octoprint-shutdown /etc/sudoers.d/octoprint-shutdown.old sudo mv /etc/sudoers.d/octoprint-shutdown /etc/sudoers.d/octoprint-shutdown.old
fi fi
#create new permission file #create new permission file
status_msg "Add reboot permission to user '$USER' ..." status_msg "Add reboot permission to user '$USER' ..."
cd $OCTOPRINT_DIR cd ${HOME} && echo "$USER ALL=NOPASSWD: /sbin/shutdown" > octoprint-shutdown
echo "$USER ALL=NOPASSWD: /sbin/shutdown" > octoprint-shutdown
sudo chown 0 octoprint-shutdown sudo chown 0 octoprint-shutdown
sudo mv octoprint-shutdown /etc/sudoers.d/octoprint-shutdown sudo mv octoprint-shutdown /etc/sudoers.d/octoprint-shutdown
ok_msg "Permission set!" ok_msg "Permission set!"
sleep 2
} }
octoprint_reverse_proxy_dialog(){ print_op_ip_list(){
echo i=1
top_border for ip in ${op_ip_list[@]}; do
echo -e "| If you want to have nicer URLs or simply need | " echo -e " ${cyan}● Instance $i:${default} $ip"
echo -e "| OctoPrint to run on port 80 (http's default port) | " i=$((i + 1))
echo -e "| due to some network restrictions, you can set up a | "
echo -e "| reverse proxy instead of configuring OctoPrint to | "
echo -e "| run on port 80. | "
bottom_border
while true; do
echo -e "${cyan}"
read -p "###### Do you want to set up a reverse proxy now? (y/N): " yn
echo -e "${default}"
case "$yn" in
Y|y|Yes|yes)
octoprint_port_check
break;;
N|n|No|no|"")
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done done
} }
octoprint_port_check(){
if [ "$OCTOPRINT_ENABLED" = "false" ]; then
if [ "$SITE_ENABLED" = "true" ]; then
status_msg "Detected other enabled interfaces:"
[ "$MAINSAIL_ENABLED" = "true" ] && echo " ${cyan}● Mainsail - Port:$MAINSAIL_PORT${default}"
[ "$FLUIDD_ENABLED" = "true" ] && echo " ${cyan}● Fluidd - Port:$FLUIDD_PORT${default}"
[ "$DWC2_ENABLED" = "true" ] && echo " ${cyan}● DWC2 - Port:$DWC2_PORT${default}"
if [ "$MAINSAIL_PORT" = "80" ] || [ "$DWC2_PORT" = "80" ] || [ "$FLUIDD_PORT" = "80" ]; then
PORT_80_BLOCKED="true"
select_octoprint_port
fi
else
DEFAULT_PORT=$(grep listen ${SRCDIR}/kiauh/resources/octoprint_nginx.cfg | head -1 | sed 's/^\s*//' | cut -d" " -f2 | cut -d";" -f1)
SET_LISTEN_PORT=$DEFAULT_PORT
fi
SET_NGINX_CFG="true"
else
SET_NGINX_CFG="false"
fi
}
select_octoprint_port(){
if [ "$PORT_80_BLOCKED" = "true" ]; then
echo
top_border
echo -e "| ${red}!!!WARNING!!!${default} |"
echo -e "| ${red}You need to choose a different port for OctoPrint!${default} |"
echo -e "| ${red}The following web interface is listening at port 80:${default} |"
blank_line
[ "$MAINSAIL_PORT" = "80" ] && echo "| ● Mainsail |"
[ "$FLUIDD_PORT" = "80" ] && echo "| ● Fluidd |"
[ "$DWC2_PORT" = "80" ] && echo "| ● DWC2 |"
blank_line
echo -e "| Make sure you don't choose a port which was already |"
echo -e "| assigned to one of the other web interfaces! |"
blank_line
echo -e "| Be aware: there is ${red}NO${default} sanity check for the following |"
echo -e "| input. So make sure to choose a valid port! |"
bottom_border
while true; do
read -p "${cyan}Please enter a new Port:${default} " NEW_PORT
if [ "$NEW_PORT" != "$MAINSAIL_PORT" ] && [ "$NEW_PORT" != "$FLUIDD_PORT" ] && [ "$NEW_PORT" != "$DWC2_PORT" ]; then
echo "Setting port $NEW_PORT for OctoPrint!"
SET_LISTEN_PORT=$NEW_PORT
break
else
echo "That port is already taken! Select a different one!"
fi
done
fi
}
create_config_yaml(){
if [ ! -d $OCTOPRINT_CFG_DIR ]; then
status_msg "Creating config.yaml ..."
mkdir $OCTOPRINT_CFG_DIR
cp ${HOME}/kiauh/resources/octoprint_config.cfg $OCTOPRINT_CFG_DIR/config.yaml
ok_msg "Config created!"
fi
}
load_octoprint_server(){
start_octoprint
#create an octoprint.log symlink in home-dir just for convenience
if [ ! -e ${HOME}/octoprint.log ]; then
status_msg "Creating octoprint.log Symlink ..."
ln -s ${HOME}/.octoprint/logs/octoprint.log ${HOME}/octoprint.log && ok_msg "Symlink created!"
fi
ok_msg "OctoPrint is now running on:"
ok_msg "$(hostname -I | cut -d " " -f1):5000 or"
ok_msg "http://localhost:5000"; echo
}

View File

@@ -0,0 +1,37 @@
### base variables
PGC_FOR_KLIPPER_REPO="https://github.com/Kragrathea/pgcode"
PGC_DIR="${HOME}/pgcode"
install_pgc_for_klipper(){
pgconfsrc="$PGC_DIR/pgcode.local.conf"
pgconf="/etc/nginx/sites-available/pgcode.local.conf"
pgconfsl="/etc/nginx/sites-enabled/pgcode.local.conf"
pgc_default_port="7136"
status_msg "Installing PrettyGCode for Klipper ..."
### let the user decide which port is used
echo -e "${cyan}\n###### On which port should PrettyGCode run? (Default: $pgc_default_port)${default} "
read -e -p "${cyan}###### Port:${default} " -i "$pgc_default_port" pgc_custom_port
### check nginx dependency
dep=(nginx)
dependency_check
### clone repo
[ -d $PGC_DIR ] && rm -rf $PGC_DIR
cd ${HOME} && git clone $PGC_FOR_KLIPPER_REPO
### copy nginx config into destination directory
sudo cp $pgconfsrc $pgconf
### replace default pi user in case the user is called different
sudo sed -i "s|/home/pi/pgcode;|/home/${USER}/pgcode;|" $pgconf
### replace default port
if [ $pgc_custom_port != $pgc_default_port ]; then
sudo sed -i "s|listen $pgc_default_port;|listen $pgc_custom_port;|" $pgconf
sudo sed -i "s|listen \[::\]:$pgc_default_port;|listen \[::\]:$pgc_custom_port;|" $pgconf
fi
### create symlink
[ ! -L $pgconfsl ] && sudo ln -s $pgconf $pgconfsl
sudo systemctl restart nginx
### show URI
pgc_uri="http://$(hostname -I | cut -d" " -f1):$pgc_custom_port"
echo -e "${cyan}\n● Accessible via:${default} $pgc_uri"
ok_msg "PrettyGCode for Klipper installed!\n"
}

114
scripts/ms_theme_installer.sh Executable file
View File

@@ -0,0 +1,114 @@
### base variables
SYSTEMDDIR="/etc/systemd/system"
get_theme_list(){
theme_csv_url="https://raw.githubusercontent.com/mainsail-crew/docs/master/_data/themes.csv"
theme_csv=$(curl -s -L $theme_csv_url)
unset t_name
unset t_note
unset t_auth
unset t_url
i=0
while IFS="," read -r col1 col2 col3 col4; do
t_name+=("$col1")
t_note+=("$col2")
t_auth+=("$col3")
t_url+=("$col4")
if [ ! "$col1" == "name" ]; then
printf "| $i) %-50s|\n" "[$col1]"
fi
i=$((i+1))
done <<< "$theme_csv"
}
ms_theme_ui(){
top_border
echo -e "| ${red}~~~~~~~~ [ Mainsail Theme Installer ] ~~~~~~~${default} | "
hr
echo -e "| ${green}A preview of each Mainsail theme can be found here:${default} | "
echo -e "| https://docs.mainsail.xyz/theming/themes | "
blank_line
echo -e "| ${yellow}Important note:${default} | "
echo -e "| Installing a theme from this menu will overwrite an | "
echo -e "| already installed theme or modified custom.css file! | "
hr
get_theme_list # dynamically generate the themelist from a csv file
echo -e "| | "
echo -e "| R) [Remove Theme] | "
back_footer
}
ms_theme_menu(){
ms_theme_ui
while true; do
read -p "${cyan}Install theme:${default} " a; echo
if [ "$a" = "b" ] || [ "$a" = "B" ]; then
clear && advanced_menu && break
elif [ "$a" = "r" ] || [ "$a" = "R" ]; then
ms_theme_delete
ms_theme_menu
elif [ "$a" -le ${#t_url[@]} ]; then
ms_theme_install "${t_auth[$a]}" "${t_url[$a]}" "${t_name[$a]}" "${t_note[$a]}"
ms_theme_menu
else
clear && print_header
ERROR_MSG="Invalid command!" && print_msg && clear_msg
ms_theme_menu
fi
done
ms_theme_menu
}
check_select_printer(){
unset printer_num
### get klipper cfg loc and set default .theme folder loc
check_klipper_cfg_path
THEME_PATH="$klipper_cfg_loc"
### check if there is more than one moonraker instance and if yes
### ask the user to select the printer he wants to install/remove the theme
MR_SERVICE_COUNT=$(find "$SYSTEMDDIR" -regextype posix-extended -regex "$SYSTEMDDIR/moonraker(-[^0])?[0-9]*.service" | wc -l)
if [[ $MR_SERVICE_COUNT -gt 1 ]]; then
top_border
echo -e "| More than one printer was found on this system! | "
echo -e "| Please select the printer to which you want to | "
echo -e "| apply the previously selected action. | "
bottom_border
read -p "${cyan}Select printer:${default} " printer_num
### rewrite the .theme path matching the selected printer
THEME_PATH="$klipper_cfg_loc/printer_$printer_num"
fi
### create the cfg folder if there is none yet
[ ! -d "$THEME_PATH" ] && mkdir -p "$THEME_PATH"
}
ms_theme_install(){
THEME_URL="https://github.com/$1/$2"
### check and select printer if there is more than 1
check_select_printer
### download all files
status_msg "Installing $3 ..."
status_msg "Please wait ..."
[ -d "$THEME_PATH/.theme" ] && rm -rf "$THEME_PATH/.theme"
cd "$THEME_PATH" && git clone "$THEME_URL" ".theme"
ok_msg "Theme installation complete!"
[ -n "$4" ] && echo "${yellow}###### Theme Info: $4${default}"
ok_msg "Please remember to delete your browser cache!\n"
}
ms_theme_delete(){
check_select_printer
if [ -d "$THEME_PATH/.theme" ]; then
status_msg "Removing Theme ..."
rm -rf "$THEME_PATH/.theme" && ok_msg "Theme removed!\n"
else
status_msg "No Theme installed!\n"
fi
}

View File

@@ -6,8 +6,9 @@ set_nginx_cfg(){
#execute operations #execute operations
status_msg "Creating Nginx configuration for $1 ..." status_msg "Creating Nginx configuration for $1 ..."
#copy content from resources to the respective nginx config file #copy content from resources to the respective nginx config file
cat ${SRCDIR}/kiauh/resources/$1_nginx.cfg > ${SRCDIR}/kiauh/resources/$1 cat ${SRCDIR}/kiauh/resources/klipper_webui_nginx.cfg > ${SRCDIR}/kiauh/resources/$1
##edit the nginx config file before moving it ##edit the nginx config file before moving it
sed -i "s/<<UI>>/$1/g" ${SRCDIR}/kiauh/resources/$1
if [ "$SET_LISTEN_PORT" != "$DEFAULT_PORT" ]; then if [ "$SET_LISTEN_PORT" != "$DEFAULT_PORT" ]; then
status_msg "Configuring port for $1 ..." status_msg "Configuring port for $1 ..."
#set listen port ipv4 #set listen port ipv4

View File

@@ -1,102 +1,114 @@
### base variables
SYSTEMDDIR="/etc/systemd/system"
remove_klipper(){ remove_klipper(){
data_arr=( shopt -s extglob # enable extended globbing
/etc/init.d/klipper ### ask the user if he wants to uninstall moonraker too.
/etc/default/klipper ###? currently usefull if the user wants to switch from single-instance to multi-instance
/etc/systemd/system/klipper.service FILE="$SYSTEMDDIR/moonraker?(-*([0-9])).service"
$KLIPPER_DIR if ls $FILE 2>/dev/null 1>&2; then
$KLIPPY_ENV_DIR while true; do
${HOME}/klippy.log unset REM_MR
) top_border
print_error "Klipper" && data_count=() echo -e "| Do you want to remove Moonraker afterwards? |"
if [ "$ERROR_MSG" = "" ]; then echo -e "| |"
stop_klipper echo -e "| This is useful in case you want to switch from a |"
if [[ -e /etc/init.d/klipper || -e /etc/default/klipper ]]; then echo -e "| single-instance to a multi-instance installation, |"
status_msg "Removing Klipper Service ..." echo -e "| which makes a re-installation of Moonraker necessary. |"
sudo rm -rf /etc/init.d/klipper /etc/default/klipper echo -e "| |"
sudo update-rc.d -f klipper remove echo -e "| If for any other reason you only want to uninstall |"
sudo systemctl disable klipper echo -e "| Klipper, please select 'No' and continue. |"
sudo systemctl daemon-reload bottom_border
ok_msg "Klipper Service removed!" read -p "${cyan}###### Remove Moonraker afterwards? (y/N):${default} " yn
fi case "$yn" in
if [ -e /etc/systemd/system/klipper.service ]; then Y|y|Yes|yes)
status_msg "Removing Klipper Service ..." echo -e "###### > Yes"
sudo rm -rf /etc/systemd/system/klipper.service REM_MR="true"
sudo update-rc.d -f klipper remove break;;
sudo systemctl disable klipper N|n|No|no|"")
sudo systemctl daemon-reload echo -e "###### > No"
ok_msg "Klipper Service removed!" REM_MR="false"
fi break;;
if [[ -d $KLIPPER_DIR || -d $KLIPPY_ENV_DIR ]]; then *)
status_msg "Removing Klipper and klippy-env directory ..." print_unkown_cmd
rm -rf $KLIPPER_DIR $KLIPPY_ENV_DIR && ok_msg "Directories removed!" print_msg && clear_msg;;
fi esac
if [[ -L ${HOME}/klippy.log || -e /tmp/klippy.log ]]; then done
status_msg "Removing klippy.log Symlink ..."
rm -rf ${HOME}/klippy.log /tmp/klippy.log && ok_msg "Symlink removed!"
fi
CONFIRM_MSG=" Klipper successfully removed!"
fi fi
}
############################################################# ### remove "legacy" klipper init.d service
############################################################# if [ -e /etc/init.d/klipper ]; then
status_msg "Removing Klipper Service ..."
sudo systemctl stop klipper
sudo update-rc.d -f klipper remove
sudo rm -f /etc/init.d/klipper
sudo rm -f /etc/default/klipper
ok_msg "Klipper Service removed!"
fi
remove_dwc2(){ ### remove all klipper services
data_arr=( FILE="$SYSTEMDDIR/klipper?(-*([0-9])).service"
/etc/init.d/dwc if ls $FILE 2>/dev/null 1>&2; then
/etc/default/dwc status_msg "Removing Klipper Services ..."
/etc/systemd/system/dwc.service for service in $(ls $FILE | cut -d"/" -f5)
$DWC2FK_DIR do
$DWC_ENV_DIR status_msg "Removing $service ..."
$DWC2_DIR sudo systemctl stop $service
/etc/nginx/sites-available/dwc2 sudo systemctl disable $service
/etc/nginx/sites-enabled/dwc2 sudo rm -f $SYSTEMDDIR/$service
) ok_msg "Done!"
print_error "DWC2-for-Klipper-Socket &\n DWC2 Web UI" && data_count=() done
if [ "$ERROR_MSG" = "" ]; then ### reloading units
if systemctl is-active dwc -q; then sudo systemctl daemon-reload
status_msg "Stopping DWC2-for-Klipper-Socket Service ..." sudo systemctl reset-failed
sudo systemctl stop dwc && sudo systemctl disable dwc ok_msg "Klipper Service removed!"
ok_msg "Service stopped!" fi
fi
#remove if init.d service ### remove all logfiles
if [[ -e /etc/init.d/dwc || -e /etc/default/dwc ]]; then FILE="${HOME}/klipper_logs/klippy?(-*([0-9])).log"
status_msg "Init.d Service found ..." if ls $FILE 2>/dev/null 1>&2; then
status_msg "Removing DWC2-for-Klipper-Socket Service ..." for log in $(ls $FILE); do
sudo rm -rf /etc/init.d/dwc /etc/default/dwc status_msg "Removing $log ..."
sudo update-rc.d -f dwc remove rm -f $log
ok_msg "DWC2-for-Klipper-Socket Service removed!" ok_msg "$log removed!"
fi done
#remove if systemd service fi
if [ -e /etc/systemd/system/dwc.service ]; then
status_msg "Systemd Service found ..." ### remove all UDS
status_msg "Removing DWC2-for-Klipper-Socket Service ..." FILE="/tmp/klippy_uds?(-*([0-9]))"
sudo rm -rf /etc/systemd/system/dwc.service if ls $FILE 2>/dev/null 1>&2; then
ok_msg "DWC2-for-Klipper-Socket Service removed!" for uds in $(ls $FILE); do
fi status_msg "Removing $uds ..."
if [ -d $DWC2FK_DIR ]; then rm -f $uds
status_msg "Removing DWC2-for-Klipper-Socket directory ..." ok_msg "$uds removed!"
rm -rf $DWC2FK_DIR && ok_msg "Directory removed!" done
fi fi
if [ -d $DWC_ENV_DIR ]; then
status_msg "Removing DWC2-for-Klipper-Socket virtualenv ..." ### remove all tmp-printer
rm -rf $DWC_ENV_DIR && ok_msg "File removed!" FILE="/tmp/printer?(-*([0-9]))"
fi if ls $FILE 2>/dev/null 1>&2; then
if [ -d $DWC2_DIR ]; then for tmp_printer in $(ls $FILE); do
status_msg "Removing DWC2 directory ..." status_msg "Removing $tmp_printer ..."
rm -rf $DWC2_DIR && ok_msg "Directory removed!" rm -f $tmp_printer
fi ok_msg "$tmp_printer removed!"
#remove dwc2 config for nginx done
if [ -e /etc/nginx/sites-available/dwc2 ]; then fi
status_msg "Removing DWC2 configuration for Nginx ..."
sudo rm /etc/nginx/sites-available/dwc2 && ok_msg "File removed!" ### removing klipper and klippy-env folders
fi if [ -d $KLIPPER_DIR ]; then
#remove dwc2 symlink for nginx status_msg "Removing Klipper directory ..."
if [ -L /etc/nginx/sites-enabled/dwc2 ]; then rm -rf $KLIPPER_DIR && ok_msg "Directory removed!"
status_msg "Removing DWC2 Symlink for Nginx ..." fi
sudo rm /etc/nginx/sites-enabled/dwc2 && ok_msg "File removed!" if [ -d $KLIPPY_ENV ]; then
fi status_msg "Removing klippy-env directory ..."
CONFIRM_MSG=" DWC2-for-Klipper-Socket & DWC2 successfully removed!" rm -rf $KLIPPY_ENV && ok_msg "Directory removed!"
fi
CONFIRM_MSG=" Klipper was successfully removed!" && print_msg && clear_msg
shopt -u extglob # enable extended globbing
if [ "$REM_MR" == "true" ]; then
remove_moonraker && unset REM_MR
fi fi
} }
@@ -104,199 +116,258 @@ remove_dwc2(){
############################################################# #############################################################
remove_moonraker(){ remove_moonraker(){
data_arr=( shopt -s extglob # enable extended globbing
$MOONRAKER_SERVICE1 ### remove "legacy" moonraker init.d service
$MOONRAKER_SERVICE2 if [ -f /etc/init.d/moonraker ]; then
$MOONRAKER_DIR status_msg "Removing Moonraker Service ..."
$MOONRAKER_ENV_DIR sudo systemctl stop moonraker
$NGINX_CONFD/upstreams.conf sudo update-rc.d -f moonraker remove
$NGINX_CONFD/common_vars.conf sudo rm -f /etc/init.d/moonraker
${HOME}/moonraker.conf sudo rm -f /etc/default/moonraker
${HOME}/moonraker.log ok_msg "Moonraker Service removed!"
${HOME}/klipper_config/moonraker.log
${HOME}/klipper_config/klippy.log
${HOME}/.klippy_api_key
${HOME}/.moonraker_api_key
)
print_error "Moonraker" && data_count=()
if [ "$ERROR_MSG" = "" ]; then
if [ -e ${HOME}/moonraker.conf ]; then
unset REMOVE_MOONRAKER_CONF
while true; do
echo
read -p "${cyan}###### Delete moonraker.conf? (y/N):${default} " yn
case "$yn" in
Y|y|Yes|yes)
echo -e "###### > Yes"
REMOVE_MOONRAKER_CONF="true"
break;;
N|n|No|no|"")
echo -e "###### > No"
REMOVE_MOONRAKER_CONF="false"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
fi
status_msg "Processing ..."
stop_moonraker
#remove moonraker services
if [[ -e /etc/init.d/moonraker || -e /etc/default/moonraker ]]; then
status_msg "Removing Moonraker Service ..."
sudo update-rc.d -f moonraker remove
sudo rm -rf /etc/init.d/moonraker /etc/default/moonraker && ok_msg "Moonraker Service removed!"
fi
#remove moonraker and moonraker-env dir
if [[ -d $MOONRAKER_DIR || -d $MOONRAKER_ENV_DIR ]]; then
status_msg "Removing Moonraker and moonraker-env directory ..."
rm -rf $MOONRAKER_DIR $MOONRAKER_ENV_DIR && ok_msg "Directories removed!"
fi
#remove moonraker.conf
if [ "$REMOVE_MOONRAKER_CONF" = "true" ]; then
status_msg "Removing moonraker.conf ..."
rm -rf ${HOME}/moonraker.conf && ok_msg "File removed!"
fi
#remove moonraker.log and symlink
if [[ -L ${HOME}/moonraker.log || -L ${HOME}/klipper_config/moonraker.log || -L ${HOME}/klipper_config/klippy.log || -e /tmp/moonraker.log ]]; then
status_msg "Removing Logs and Symlinks ..."
rm -rf ${HOME}/moonraker.log ${HOME}/klipper_config/moonraker.log ${HOME}/klipper_config/klippy.log /tmp/moonraker.log
ok_msg "Files removed!"
fi
#remove moonraker nginx config
if [[ -e $NGINX_CONFD/upstreams.conf || -e $NGINX_CONFD/common_vars.conf ]]; then
status_msg "Removing Moonraker NGINX configuration ..."
sudo rm -f $NGINX_CONFD/upstreams.conf $NGINX_CONFD/common_vars.conf && ok_msg "Moonraker NGINX configuration removed!"
fi
#remove legacy api key
if [ -e ${HOME}/.klippy_api_key ]; then
status_msg "Removing legacy API Key ..."
rm ${HOME}/.klippy_api_key && ok_msg "Done!"
fi
#remove api key
if [ -e ${HOME}/.moonraker_api_key ]; then
status_msg "Removing API Key ..."
rm ${HOME}/.moonraker_api_key && ok_msg "Done!"
fi
CONFIRM_MSG="Moonraker successfully removed!"
fi fi
### remove all moonraker services
FILE="$SYSTEMDDIR/moonraker?(-*([0-9])).service"
if ls $FILE 2>/dev/null 1>&2; then
status_msg "Removing Moonraker Services ..."
for service in $(ls $FILE | cut -d"/" -f5)
do
status_msg "Removing $service ..."
sudo systemctl stop $service
sudo systemctl disable $service
sudo rm -f $SYSTEMDDIR/$service
ok_msg "Done!"
done
### reloading units
sudo systemctl daemon-reload
sudo systemctl reset-failed
ok_msg "Moonraker Service removed!"
fi
### remove all logfiles
FILE="${HOME}/klipper_logs/moonraker?(-*([0-9])).log"
if ls $FILE 2>/dev/null 1>&2; then
for log in $(ls $FILE); do
status_msg "Removing $log ..."
rm -f $log
ok_msg "$log removed!"
done
fi
### remove moonraker nginx config
if [[ -e $NGINX_CONFD/upstreams.conf || -e $NGINX_CONFD/common_vars.conf ]]; then
status_msg "Removing Moonraker NGINX configuration ..."
sudo rm -f $NGINX_CONFD/upstreams.conf $NGINX_CONFD/common_vars.conf && ok_msg "Moonraker NGINX configuration removed!"
fi
### remove legacy api key
if [ -e ${HOME}/.klippy_api_key ]; then
status_msg "Removing legacy API Key ..." && rm ${HOME}/.klippy_api_key && ok_msg "Done!"
fi
### remove api key
if [ -e ${HOME}/.moonraker_api_key ]; then
status_msg "Removing API Key ..." && rm ${HOME}/.moonraker_api_key && ok_msg "Done!"
fi
### removing moonraker and moonraker-env folder
if [ -d $MOONRAKER_DIR ]; then
status_msg "Removing Moonraker directory ..."
rm -rf $MOONRAKER_DIR && ok_msg "Directory removed!"
fi
if [ -d $MOONRAKER_ENV ]; then
status_msg "Removing moonraker-env directory ..."
rm -rf $MOONRAKER_ENV && ok_msg "Directory removed!"
fi
CONFIRM_MSG=" Moonraker was successfully removed!"
shopt -u extglob # disable extended globbing
}
#############################################################
#############################################################
remove_dwc2(){
### remove "legacy" init.d service
if [ -e /etc/init.d/dwc ]; then
status_msg "Removing DWC2-for-Klipper-Socket Service ..."
sudo systemctl stop dwc
sudo update-rc.d -f dwc remove
sudo rm -f /etc/init.d/dwc
sudo rm -f /etc/default/dwc
ok_msg "DWC2-for-Klipper-Socket Service removed!"
fi
### remove all dwc services
if ls /etc/systemd/system/dwc*.service 2>/dev/null 1>&2; then
status_msg "Removing DWC2-for-Klipper-Socket Services ..."
for service in $(ls /etc/systemd/system/dwc*.service | cut -d"/" -f5)
do
status_msg "Removing $service ..."
sudo systemctl stop $service
sudo systemctl disable $service
sudo rm -f $SYSTEMDDIR/$service
ok_msg "Done!"
done
### reloading units
sudo systemctl daemon-reload
sudo systemctl reset-failed
ok_msg "DWC2-for-Klipper-Socket Service removed!"
fi
### remove all logfiles
if ls /tmp/dwc*.log 2>/dev/null 1>&2; then
for logfile in $(ls /tmp/dwc*.log)
do
status_msg "Removing $logfile ..."
rm -f $logfile
ok_msg "File '$logfile' removed!"
done
fi
### removing the rest of the folders
if [ -d $DWC2FK_DIR ]; then
status_msg "Removing DWC2-for-Klipper-Socket directory ..."
rm -rf $DWC2FK_DIR && ok_msg "Directory removed!"
fi
if [ -d $DWC_ENV_DIR ]; then
status_msg "Removing DWC2-for-Klipper-Socket virtualenv ..."
rm -rf $DWC_ENV_DIR && ok_msg "Directory removed!"
fi
if [ -d $DWC2_DIR ]; then
status_msg "Removing DWC2 directory ..."
rm -rf $DWC2_DIR && ok_msg "Directory removed!"
fi
### remove dwc2_port from ~/.kiauh.ini
sed -i "/^dwc2_port=/d" $INI_FILE
CONFIRM_MSG=" DWC2-for-Klipper-Socket was successfully removed!"
} }
############################################################# #############################################################
############################################################# #############################################################
remove_mainsail(){ remove_mainsail(){
data_arr=( ### remove mainsail dir
$MAINSAIL_DIR if [ -d $MAINSAIL_DIR ]; then
/etc/nginx/sites-available/mainsail status_msg "Removing Mainsail directory ..."
/etc/nginx/sites-enabled/mainsail rm -rf $MAINSAIL_DIR && ok_msg "Directory removed!"
)
print_error "Mainsail" && data_count=()
if [ "$ERROR_MSG" = "" ]; then
#remove mainsail dir
if [ -d $MAINSAIL_DIR ]; then
status_msg "Removing Mainsail directory ..."
rm -rf $MAINSAIL_DIR && ok_msg "Directory removed!"
fi
#remove mainsail config for nginx
if [ -e /etc/nginx/sites-available/mainsail ]; then
status_msg "Removing Mainsail configuration for Nginx ..."
sudo rm /etc/nginx/sites-available/mainsail && ok_msg "File removed!"
fi
#remove mainsail symlink for nginx
if [ -L /etc/nginx/sites-enabled/mainsail ]; then
status_msg "Removing Mainsail Symlink for Nginx ..."
sudo rm /etc/nginx/sites-enabled/mainsail && ok_msg "File removed!"
fi
CONFIRM_MSG="Mainsail successfully removed!"
fi fi
### remove mainsail config for nginx
if [ -e /etc/nginx/sites-available/mainsail ]; then
status_msg "Removing Mainsail configuration for Nginx ..."
sudo rm /etc/nginx/sites-available/mainsail && ok_msg "File removed!"
fi
### remove mainsail symlink for nginx
if [ -L /etc/nginx/sites-enabled/mainsail ]; then
status_msg "Removing Mainsail Symlink for Nginx ..."
sudo rm /etc/nginx/sites-enabled/mainsail && ok_msg "File removed!"
fi
### remove mainsail nginx logs and log symlinks
for log in $(find /var/log/nginx -name "mainsail*"); do
sudo rm -f $log
done
for log in $(find ${HOME}/klipper_logs -name "mainsail*"); do
rm -f $log
done
### remove mainsail_port from ~/.kiauh.ini
sed -i "/^mainsail_port=/d" $INI_FILE
CONFIRM_MSG="Mainsail successfully removed!"
} }
remove_fluidd(){ remove_fluidd(){
data_arr=( ### remove fluidd dir
$FLUIDD_DIR if [ -d $FLUIDD_DIR ]; then
/etc/nginx/sites-available/fluidd status_msg "Removing Fluidd directory ..."
/etc/nginx/sites-enabled/fluidd rm -rf $FLUIDD_DIR && ok_msg "Directory removed!"
)
print_error "Fluidd" && data_count=()
if [ "$ERROR_MSG" = "" ]; then
#remove fluidd dir
if [ -d $FLUIDD_DIR ]; then
status_msg "Removing Fluidd directory ..."
rm -rf $FLUIDD_DIR && ok_msg "Directory removed!"
fi
#remove fluidd config for nginx
if [ -e /etc/nginx/sites-available/fluidd ]; then
status_msg "Removing Fluidd configuration for Nginx ..."
sudo rm /etc/nginx/sites-available/fluidd && ok_msg "File removed!"
fi
#remove fluidd symlink for nginx
if [ -L /etc/nginx/sites-enabled/fluidd ]; then
status_msg "Removing Fluidd Symlink for Nginx ..."
sudo rm /etc/nginx/sites-enabled/fluidd && ok_msg "File removed!"
fi
CONFIRM_MSG="Fluidd successfully removed!"
fi fi
### remove fluidd config for nginx
if [ -e /etc/nginx/sites-available/fluidd ]; then
status_msg "Removing Fluidd configuration for Nginx ..."
sudo rm /etc/nginx/sites-available/fluidd && ok_msg "File removed!"
fi
### remove fluidd symlink for nginx
if [ -L /etc/nginx/sites-enabled/fluidd ]; then
status_msg "Removing Fluidd Symlink for Nginx ..."
sudo rm /etc/nginx/sites-enabled/fluidd && ok_msg "File removed!"
fi
### remove mainsail nginx logs and log symlinks
for log in $(find /var/log/nginx -name "fluidd*"); do
sudo rm -f $log
done
for log in $(find ${HOME}/klipper_logs -name "fluidd*"); do
rm -f $log
done
### remove fluidd_port from ~/.kiauh.ini
sed -i "/^fluidd_port=/d" $INI_FILE
CONFIRM_MSG="Fluidd successfully removed!"
} }
############################################################# #############################################################
############################################################# #############################################################
remove_octoprint(){ remove_octoprint(){
data_arr=( ###remove all octoprint services
$OCTOPRINT_SERVICE1 if ls /etc/systemd/system/octoprint*.service 2>/dev/null 1>&2; then
$OCTOPRINT_SERVICE2 status_msg "Removing OctoPrint Services ..."
$OCTOPRINT_DIR for service in $(ls /etc/systemd/system/octoprint*.service | cut -d"/" -f5)
$OCTOPRINT_CFG_DIR do
${HOME}/octoprint.log status_msg "Removing $service ..."
/etc/sudoers.d/octoprint-shutdown sudo systemctl stop $service
/etc/nginx/sites-available/octoprint sudo systemctl disable $service
/etc/nginx/sites-enabled/octoprint sudo rm -f $SYSTEMDDIR/$service
) ok_msg "OctoPrint Service removed!"
print_error "OctoPrint" && data_count=() done
if [ "$ERROR_MSG" = "" ]; then ### reloading units
stop_octoprint sudo systemctl daemon-reload
if [[ -e $OCTOPRINT_SERVICE1 || -e $OCTOPRINT_SERVICE2 ]]; then sudo systemctl reset-failed
status_msg "Removing OctoPrint Service ..."
sudo update-rc.d -f octoprint remove
sudo rm -rf $OCTOPRINT_SERVICE1 $OCTOPRINT_SERVICE2 && ok_msg "OctoPrint Service removed!"
fi
if [[ -d $OCTOPRINT_DIR || -d $OCTOPRINT_CFG_DIR ]]; then
status_msg "Removing OctoPrint and .octoprint directory ..."
rm -rf $OCTOPRINT_DIR $OCTOPRINT_CFG_DIR && ok_msg "Directories removed!"
fi
if [ -f /etc/sudoers.d/octoprint-shutdown ]; then
sudo rm -rf /etc/sudoers.d/octoprint-shutdown
fi
if [ -L ${HOME}/octoprint.log ]; then
status_msg "Removing octoprint.log Symlink ..."
rm -rf ${HOME}/octoprint.log && ok_msg "Symlink removed!"
fi
#remove octoprint config for nginx
if [ -e /etc/nginx/sites-available/octoprint ]; then
status_msg "Removing OctoPrint configuration for Nginx ..."
sudo rm /etc/nginx/sites-available/octoprint && ok_msg "File removed!"
fi
#remove octoprint symlink for nginx
if [ -L /etc/nginx/sites-enabled/octoprint ]; then
status_msg "Removing OctoPrint Symlink for Nginx ..."
sudo rm /etc/nginx/sites-enabled/octoprint && ok_msg "File removed!"
fi
CONFIRM_MSG=" OctoPrint successfully removed!"
fi fi
### remove sudoers file
if [ -f /etc/sudoers.d/octoprint-shutdown ]; then
sudo rm -rf /etc/sudoers.d/octoprint-shutdown
fi
### remove OctoPrint directory
if [ -d ${HOME}/OctoPrint ]; then
status_msg "Removing OctoPrint directory ..."
rm -rf ${HOME}/OctoPrint && ok_msg "Directory removed!"
fi
###remove .octoprint directories
if ls -d ${HOME}/.octoprint* 2>/dev/null 1>&2; then
for folder in $(ls -d ${HOME}/.octoprint*)
do
status_msg "Removing $folder ..." && rm -rf $folder && ok_msg "Done!"
done
fi
### remove octoprint_port from ~/.kiauh.ini
sed -i "/^octoprint_port=/d" $INI_FILE
CONFIRM_MSG=" OctoPrint successfully removed!"
} }
############################################################# #############################################################
############################################################# #############################################################
remove_nginx(){ remove_nginx(){
if [[ $(dpkg-query -f'${Status}' --show nginx 2>/dev/null) = *\ installed ]] ; then if ls /lib/systemd/system/nginx.service 2>/dev/null 1>&2; then
if systemctl is-active nginx -q; then status_msg "Stopping Nginx service ..."
status_msg "Stopping Nginx service ..." sudo systemctl stop nginx && sudo systemctl disable nginx
sudo service nginx stop && sudo systemctl disable nginx ok_msg "Service stopped and disabled!"
ok_msg "Service stopped!"
fi
status_msg "Purging Nginx from system ..." status_msg "Purging Nginx from system ..."
sudo apt-get purge nginx nginx-common -y sudo apt-get purge nginx nginx-common -y
sudo update-rc.d -f nginx remove sudo update-rc.d -f nginx remove
@@ -307,27 +378,133 @@ remove_nginx(){
} }
remove_klipperscreen(){ remove_klipperscreen(){
data_arr=( source_kiauh_ini
$KLIPPERSCREEN_DIR
$KLIPPERSCREEN_ENV_DIR ### remove KlipperScreen dir
/etc/systemd/system/KlipperScreen.service if [ -d $KLIPPERSCREEN_DIR ]; then
) status_msg "Removing KlipperScreen directory ..."
print_error "KlipperScreen" && data_count=() rm -rf $KLIPPERSCREEN_DIR && ok_msg "Directory removed!"
if [ "$ERROR_MSG" = "" ]; then fi
#remove KlipperScreen dir
if [ -d $KLIPPERSCREEN_DIR ]; then ### remove KlipperScreen VENV dir
status_msg "Removing KlipperScreen directory ..." if [ -d $KLIPPERSCREEN_ENV_DIR ]; then
rm -rf $KLIPPERSCREEN_DIR && ok_msg "Directory removed!" status_msg "Removing KlipperScreen VENV directory ..."
fi rm -rf $KLIPPERSCREEN_ENV_DIR && ok_msg "Directory removed!"
if [ -d $KLIPPERSCREEN_ENV_DIR ]; then fi
status_msg "Removing KlipperScreen VENV directory ..."
rm -rf $KLIPPERSCREEN_ENV_DIR && ok_msg "Directory removed!" ### remove KlipperScreen service
fi if [ -e /etc/systemd/system/KlipperScreen.service ]; then
#remove KlipperScreen systemd file status_msg "Removing KlipperScreen service ..."
if [ -e /etc/systemd/system/KlipperScreen.service ]; then sudo systemctl stop KlipperScreen
status_msg "Removing KlipperScreen Service ..." sudo systemctl disable KlipperScreen
sudo rm /etc/systemd/system/KlipperScreen.service && ok_msg "File removed!" sudo rm -f $SYSTEMDDIR/KlipperScreen.service
fi ###reloading units
CONFIRM_MSG="KlipperScreen successfully removed!" sudo systemctl daemon-reload
sudo systemctl reset-failed
ok_msg "KlipperScreen Service removed!"
fi
### remove KlipperScreen log
if [ -e /tmp/KlipperScreen.log ]; then
status_msg "Removing KlipperScreen log file ..."
rm -f /tmp/KlipperScreen.log && ok_msg "File removed!"
fi
### remove KlipperScreen log symlink in config dir
if [ -e $klipper_cfg_loc/KlipperScreen.log ]; then
status_msg "Removing KlipperScreen log symlink ..."
rm -f $klipper_cfg_loc/KlipperScreen.log && ok_msg "File removed!"
fi
CONFIRM_MSG="KlipperScreen successfully removed!"
}
remove_MoonrakerTelegramBot(){
source_kiauh_ini
### remove MoonrakerTelegramBot dir
if [ -d $MOONRAKER_TELEGRAM_BOT_DIR ]; then
status_msg "Removing MoonrakerTelegramBot directory ..."
rm -rf $MOONRAKER_TELEGRAM_BOT_DIR && ok_msg "Directory removed!"
fi
### remove MoonrakerTelegramBot VENV dir
if [ -d $MOONRAKER_TELEGRAM_BOT_ENV_DIR ]; then
status_msg "Removing MoonrakerTelegramBot VENV directory ..."
rm -rf $MOONRAKER_TELEGRAM_BOT_ENV_DIR && ok_msg "Directory removed!"
fi
### remove MoonrakerTelegramBot service
if [ -e /etc/systemd/system/moonraker-telegram-bot.service ]; then
status_msg "Removing MoonrakerTelegramBot service ..."
sudo systemctl stop moonraker-telegram-bot
sudo systemctl disable moonraker-telegram-bot
sudo rm -f $SYSTEMDDIR/moonraker-telegram-bot.service
###reloading units
sudo systemctl daemon-reload
sudo systemctl reset-failed
ok_msg "MoonrakerTelegramBot Service removed!"
fi
### remove MoonrakerTelegramBot log
if [ -e /tmp/telegram.log ] || [ -e ${HOME}/klipper_logs/telegram.log ]; then
status_msg "Removing MoonrakerTelegramBot log file ..."
rm -f "/tmp/telegram.log" "${HOME}/klipper_logs/telegram.log" && ok_msg "File removed!"
fi
### remove MoonrakerTelegramBot log symlink in config dir
if [ -e $klipper_cfg_loc/telegram.log ]; then
status_msg "Removing MoonrakerTelegramBot log symlink ..."
rm -f $klipper_cfg_loc/telegram.log && ok_msg "File removed!"
fi
CONFIRM_MSG="MoonrakerTelegramBot successfully removed!"
}
remove_mjpg-streamer(){
### remove MJPG-Streamer service
if [ -e $SYSTEMDDIR/webcamd.service ]; then
status_msg "Removing MJPG-Streamer service ..."
sudo systemctl stop webcamd && sudo systemctl disable webcamd
sudo rm -f $SYSTEMDDIR/webcamd.service
###reloading units
sudo systemctl daemon-reload
sudo systemctl reset-failed
ok_msg "MJPG-Streamer Service removed!"
fi
### remove webcamd from /usr/local/bin
if [ -e "/usr/local/bin/webcamd" ]; then
sudo rm -f "/usr/local/bin/webcamd"
fi
### remove MJPG-Streamer directory
if [ -d ${HOME}/mjpg-streamer ]; then
status_msg "Removing MJPG-Streamer directory ..."
rm -rf ${HOME}/mjpg-streamer
ok_msg "MJPG-Streamer directory removed!"
fi
### remove webcamd log and symlink
[ -f "/var/log/webcamd.log" ] && sudo rm -f "/var/log/webcamd.log"
[ -L "${HOME}/klipper_logs/webcamd.log" ] && rm -f "${HOME}/klipper_logs/webcamd.log"
CONFIRM_MSG="MJPG-Streamer successfully removed!"
}
remove_prettygcode(){
pgconf="/etc/nginx/sites-available/pgcode.local.conf"
pgconfsl="/etc/nginx/sites-enabled/pgcode.local.conf"
if [ -d ${HOME}/pgcode ] || [ -f $pgconf ] || [ -L $pgconfsl ]; then
status_msg "Removing PrettyGCode for Klipper ..."
rm -rf ${HOME}/pgcode
sudo rm -f $pgconf
sudo rm -f $pgconfsl
sudo systemctl restart nginx
CONFIRM_MSG="PrettyGCode for Klipper successfully removed!"
else
ERROR_MSG="PrettyGCode for Klipper not found!\n Skipping..."
fi fi
} }

View File

@@ -1,5 +1,5 @@
save_klipper_state(){ save_klipper_state(){
source_ini source_kiauh_ini
#read current klipper state #read current klipper state
cd $KLIPPER_DIR cd $KLIPPER_DIR
COMMIT_STATE=$(git rev-parse --short HEAD) COMMIT_STATE=$(git rev-parse --short HEAD)
@@ -19,7 +19,7 @@ save_klipper_state(){
} }
load_klipper_state(){ load_klipper_state(){
source_ini source_kiauh_ini
print_branch print_branch
cd $KLIPPER_DIR cd $KLIPPER_DIR
CURRENT_COMMIT=$(git rev-parse --short=8 HEAD) CURRENT_COMMIT=$(git rev-parse --short=8 HEAD)
@@ -50,6 +50,25 @@ load_klipper_state(){
rollback_klipper rollback_klipper
} }
rollback_ui(){
top_border
echo -e "| $(title_msg "~~~~~~~~~~~~~ [ Rollback Menu ] ~~~~~~~~~~~~~") | "
hr
echo -e "| If serious errors occured after updating Klipper, | "
echo -e "| you can use this menu to return to the previously | "
echo -e "| used commit from which you have updated. | "
bottom_border
top_border
echo -e "| Active branch: ${green}$PRINT_BRANCH${default} | "
hr
echo -e "| Currently on commit: | "
echo -e "| $CURR_UI | "
hr
echo -e "| Commit last updated from: | "
echo -e "| $PREV_UI | "
back_footer
}
rollback_klipper(){ rollback_klipper(){
if [ "$PREVIOUS_COMMIT" != "0" ] && [ "$CURRENT_COMMIT" != "$PREVIOUS_COMMIT" ]; then if [ "$PREVIOUS_COMMIT" != "0" ] && [ "$CURRENT_COMMIT" != "$PREVIOUS_COMMIT" ]; then
while true; do while true; do
@@ -66,7 +85,7 @@ rollback_klipper(){
load_klipper_state load_klipper_state
break;; break;;
N|n|No|no) clear; advanced_menu; break;; N|n|No|no) clear; advanced_menu; break;;
Q|q) clear; advanced_menu; break;; B|b) clear; advanced_menu; break;;
*) *)
print_unkown_cmd print_unkown_cmd
print_msg && clear_msg;; print_msg && clear_msg;;
@@ -78,7 +97,7 @@ rollback_klipper(){
read -p "Perform action: " action; echo read -p "Perform action: " action; echo
echo -e "${default}" echo -e "${default}"
case "$action" in case "$action" in
Q|q) B|b)
clear; advanced_menu; break;; clear; advanced_menu; break;;
*) *)
clear clear
@@ -89,4 +108,4 @@ rollback_klipper(){
esac esac
done done
fi fi
} }

View File

@@ -1,8 +1,8 @@
kiauh_status(){ kiauh_status(){
if [ -d "${SRCDIR}/kiauh/.git" ]; then if [ -d "${SRCDIR}/kiauh/.git" ]; then
cd ${HOME}/kiauh cd ${SRCDIR}/kiauh
git fetch -q
if git branch -a | grep "* master" -q; then if git branch -a | grep "* master" -q; then
git fetch -q
if [[ "$(git rev-parse --short=8 origin/master)" != "$(git rev-parse --short=8 HEAD)" ]]; then if [[ "$(git rev-parse --short=8 origin/master)" != "$(git rev-parse --short=8 HEAD)" ]]; then
KIAUH_UPDATE_AVAIL="true" KIAUH_UPDATE_AVAIL="true"
fi fi
@@ -10,6 +10,18 @@ kiauh_status(){
fi fi
} }
check_system_updates(){
SYS_UPDATE=$(apt list --upgradeable 2>/dev/null | sed "1d")
if [ ! -z "$SYS_UPDATE" ]; then
# add system updates to the update all array for the update all function in the updater
SYS_UPDATE_AVAIL="true" && update_arr+=(update_system)
DISPLAY_SYS_UPDATE="${yellow}System upgrade available!${default}"
else
SYS_UPDATE_AVAIL="false"
DISPLAY_SYS_UPDATE="${green}System up to date! ${default}"
fi
}
klipper_status(){ klipper_status(){
kcount=0 kcount=0
klipper_data=( klipper_data=(
@@ -17,17 +29,29 @@ klipper_status(){
$KLIPPER_DIR $KLIPPER_DIR
$KLIPPY_ENV_DIR $KLIPPY_ENV_DIR
) )
#remove the "SERVICE" entry from the klipper_data array if a klipper service is installed
[ "$(systemctl list-units --full -all -t service --no-legend | grep -F "klipper.service")" ] && unset klipper_data[0] ### count amount of klipper service files in /etc/systemd/system
#count+1 for each found data-item from array SERVICE_FILE_COUNT=$(ls /etc/systemd/system | grep -E "^klipper(\-[[:digit:]]+)?\.service$" | wc -l)
### a fix to detect an existing "legacy" klipper init.d installation
if [ -f /etc/init.d/klipper ] && [ -f /etc/init.d/klipper ]; then
SERVICE_FILE_COUNT=1
fi
### remove the "SERVICE" entry from the klipper_data array if a klipper service is installed
[ $SERVICE_FILE_COUNT -gt 0 ] && unset klipper_data[0]
### count+1 for each found data-item from array
for kd in "${klipper_data[@]}" for kd in "${klipper_data[@]}"
do do
if [ -e $kd ]; then if [ -e $kd ]; then
kcount=$(expr $kcount + 1) kcount=$(expr $kcount + 1)
fi fi
done done
### display status
if [ "$kcount" == "${#klipper_data[*]}" ]; then if [ "$kcount" == "${#klipper_data[*]}" ]; then
KLIPPER_STATUS="${green}Installed!${default} " KLIPPER_STATUS="$(printf "${green}Installed: %-5s${default}" $SERVICE_FILE_COUNT)"
elif [ "$kcount" == 0 ]; then elif [ "$kcount" == 0 ]; then
KLIPPER_STATUS="${red}Not installed!${default} " KLIPPER_STATUS="${red}Not installed!${default} "
else else
@@ -37,20 +61,29 @@ klipper_status(){
dwc2_status(){ dwc2_status(){
dcount=0 dcount=0
dwc2_data=( dwc_data=(
SERVICE
$DWC2_DIR
$DWC2FK_DIR $DWC2FK_DIR
$DWC_ENV_DIR $DWC_ENV_DIR
$DWC2_DIR
) )
### count amount of dwc service files in /etc/systemd/system
SERVICE_FILE_COUNT=$(ls /etc/systemd/system | grep -E "^dwc(\-[[:digit:]]+)?\.service$" | wc -l)
### remove the "SERVICE" entry from the dwc_data array if a dwc service is installed
[ $SERVICE_FILE_COUNT -gt 0 ] && unset dwc_data[0]
#count+1 for each found data-item from array #count+1 for each found data-item from array
for dd in "${dwc2_data[@]}" for dd in "${dwc_data[@]}"
do do
if [ -e $dd ]; then if [ -e $dd ]; then
dcount=$(expr $dcount + 1) dcount=$(expr $dcount + 1)
fi fi
done done
if [ "$dcount" == "${#dwc2_data[*]}" ]; then
DWC2_STATUS="${green}Installed!${default} " if [ "$dcount" == "${#dwc_data[*]}" ]; then
DWC2_STATUS="$(printf "${green}Installed: %-5s${default}" $SERVICE_FILE_COUNT)"
elif [ "$dcount" == 0 ]; then elif [ "$dcount" == 0 ]; then
DWC2_STATUS="${red}Not installed!${default} " DWC2_STATUS="${red}Not installed!${default} "
else else
@@ -64,20 +97,25 @@ moonraker_status(){
SERVICE SERVICE
$MOONRAKER_DIR $MOONRAKER_DIR
$MOONRAKER_ENV_DIR $MOONRAKER_ENV_DIR
$NGINX_CONFD/upstreams.conf
$NGINX_CONFD/common_vars.conf
) )
#remove the "SERVICE" entry from the moonraker_data array if a moonraker service is installed
[ "$(systemctl list-units --full -all -t service --no-legend | grep -F "moonraker.service")" ] && unset moonraker_data[0] ### count amount of moonraker service files in /etc/systemd/system
#count+1 for each found data-item from array SERVICE_FILE_COUNT=$(ls /etc/systemd/system | grep -E "^moonraker(\-[[:digit:]]+)?\.service$" | wc -l)
### remove the "SERVICE" entry from the moonraker_data array if a moonraker service is installed
[ $SERVICE_FILE_COUNT -gt 0 ] && unset moonraker_data[0]
### count+1 for each found data-item from array
for mrd in "${moonraker_data[@]}" for mrd in "${moonraker_data[@]}"
do do
if [ -e $mrd ]; then if [ -e $mrd ]; then
mrcount=$(expr $mrcount + 1) mrcount=$(expr $mrcount + 1)
fi fi
done done
### display status
if [ "$mrcount" == "${#moonraker_data[*]}" ]; then if [ "$mrcount" == "${#moonraker_data[*]}" ]; then
MOONRAKER_STATUS="${green}Installed!${default} " MOONRAKER_STATUS="$(printf "${green}Installed: %-5s${default}" $SERVICE_FILE_COUNT)"
elif [ "$mrcount" == 0 ]; then elif [ "$mrcount" == 0 ]; then
MOONRAKER_STATUS="${red}Not installed!${default} " MOONRAKER_STATUS="${red}Not installed!${default} "
else else
@@ -134,11 +172,15 @@ fluidd_status(){
octoprint_status(){ octoprint_status(){
ocount=0 ocount=0
octoprint_data=( octoprint_data=(
SERVICE
$OCTOPRINT_DIR $OCTOPRINT_DIR
$OCTOPRINT_CFG_DIR
$OCTOPRINT_SERVICE1
$OCTOPRINT_SERVICE2
) )
### count amount of octoprint service files in /etc/systemd/system
SERVICE_FILE_COUNT=$(ls /etc/systemd/system | grep -E "^octoprint(\-[[:digit:]]+)?\.service$" | wc -l)
### remove the "SERVICE" entry from the octoprint_data array if a octoprint service is installed
[ $SERVICE_FILE_COUNT -gt 0 ] && unset octoprint_data[0]
#count+1 for each found data-item from array #count+1 for each found data-item from array
for op in "${octoprint_data[@]}" for op in "${octoprint_data[@]}"
do do
@@ -146,8 +188,10 @@ octoprint_status(){
ocount=$(expr $ocount + 1) ocount=$(expr $ocount + 1)
fi fi
done done
### display status
if [ "$ocount" == "${#octoprint_data[*]}" ]; then if [ "$ocount" == "${#octoprint_data[*]}" ]; then
OCTOPRINT_STATUS="${green}Installed!${default} " OCTOPRINT_STATUS="$(printf "${green}Installed: %-5s${default}" $SERVICE_FILE_COUNT)"
elif [ "$ocount" == 0 ]; then elif [ "$ocount" == 0 ]; then
OCTOPRINT_STATUS="${red}Not installed!${default} " OCTOPRINT_STATUS="${red}Not installed!${default} "
else else
@@ -162,8 +206,13 @@ klipperscreen_status(){
$KLIPPERSCREEN_DIR $KLIPPERSCREEN_DIR
$KLIPPERSCREEN_ENV_DIR $KLIPPERSCREEN_ENV_DIR
) )
#remove the "SERVICE" entry from the klipperscreen_data array if a klipperscreen service is installed
[ "$(systemctl list-units --full -all -t service --no-legend | grep -F "KlipperScreen.service")" ] && unset klipperscreen_data[0] ### count amount of klipperscreen_data service files in /etc/systemd/system
SERVICE_FILE_COUNT=$(ls /etc/systemd/system | grep -E "KlipperScreen" | wc -l)
### remove the "SERVICE" entry from the klipperscreen_data array if a KlipperScreen service is installed
[ $SERVICE_FILE_COUNT -gt 0 ] && unset klipperscreen_data[0]
#count+1 for each found data-item from array #count+1 for each found data-item from array
for klscd in "${klipperscreen_data[@]}" for klscd in "${klipperscreen_data[@]}"
do do
@@ -180,6 +229,36 @@ klipperscreen_status(){
fi fi
} }
MoonrakerTelegramBot_status(){
mtbcount=0
MoonrakerTelegramBot_data=(
SERVICE
$MOONRAKER_TELEGRAM_BOT_DIR
$MOONRAKER_TELEGRAM_BOT_ENV_DIR
)
### count amount of MoonrakerTelegramBot_data service files in /etc/systemd/system
SERVICE_FILE_COUNT=$(ls /etc/systemd/system | grep -E "moonraker-telegram-bot" | wc -l)
### remove the "SERVICE" entry from the MoonrakerTelegramBot_data array if a MoonrakerTelegramBot service is installed
[ $SERVICE_FILE_COUNT -gt 0 ] && unset MoonrakerTelegramBot_data[0]
#count+1 for each found data-item from array
for mtbd in "${MoonrakerTelegramBot_data[@]}"
do
if [ -e $mtbd ]; then
mtbcount=$(expr $mtbcount + 1)
fi
done
if [ "$mtbcount" == "${#MoonrakerTelegramBot_data[*]}" ]; then
MOONRAKER_TELEGRAM_BOT_STATUS="${green}Installed!${default} "
elif [ "$mtbcount" == 0 ]; then
MOONRAKER_TELEGRAM_BOT_STATUS="${red}Not installed!${default} "
else
MOONRAKER_TELEGRAM_BOT_STATUS="${yellow}Incomplete!${default} "
fi
}
############################################################# #############################################################
############################################################# #############################################################
@@ -252,8 +331,8 @@ compare_klipper_versions(){
if [ "$LOCAL_COMMIT" != "$REMOTE_COMMIT" ]; then if [ "$LOCAL_COMMIT" != "$REMOTE_COMMIT" ]; then
LOCAL_COMMIT="${yellow}$(printf "%-12s" "$LOCAL_COMMIT")${default}" LOCAL_COMMIT="${yellow}$(printf "%-12s" "$LOCAL_COMMIT")${default}"
REMOTE_COMMIT="${green}$(printf "%-12s" "$REMOTE_COMMIT")${default}" REMOTE_COMMIT="${green}$(printf "%-12s" "$REMOTE_COMMIT")${default}"
KLIPPER_UPDATE_AVAIL="true" # add klipper to the update all array for the update all function in the updater
update_arr+=(update_klipper) KLIPPER_UPDATE_AVAIL="true" && update_arr+=(update_klipper)
else else
LOCAL_COMMIT="${green}$(printf "%-12s" "$LOCAL_COMMIT")${default}" LOCAL_COMMIT="${green}$(printf "%-12s" "$LOCAL_COMMIT")${default}"
REMOTE_COMMIT="${green}$(printf "%-12s" "$REMOTE_COMMIT")${default}" REMOTE_COMMIT="${green}$(printf "%-12s" "$REMOTE_COMMIT")${default}"
@@ -286,8 +365,8 @@ compare_dwc2fk_versions(){
if [ "$LOCAL_DWC2FK_COMMIT" != "$REMOTE_DWC2FK_COMMIT" ]; then if [ "$LOCAL_DWC2FK_COMMIT" != "$REMOTE_DWC2FK_COMMIT" ]; then
LOCAL_DWC2FK_COMMIT="${yellow}$(printf "%-12s" "$LOCAL_DWC2FK_COMMIT")${default}" LOCAL_DWC2FK_COMMIT="${yellow}$(printf "%-12s" "$LOCAL_DWC2FK_COMMIT")${default}"
REMOTE_DWC2FK_COMMIT="${green}$(printf "%-12s" "$REMOTE_DWC2FK_COMMIT")${default}" REMOTE_DWC2FK_COMMIT="${green}$(printf "%-12s" "$REMOTE_DWC2FK_COMMIT")${default}"
DWC2FK_UPDATE_AVAIL="true" # add dwc2fk to the update all array for the update all function in the updater
update_arr+=(update_dwc2fk) DWC2FK_UPDATE_AVAIL="true" && update_arr+=(update_dwc2fk)
else else
LOCAL_DWC2FK_COMMIT="${green}$(printf "%-12s" "$LOCAL_DWC2FK_COMMIT")${default}" LOCAL_DWC2FK_COMMIT="${green}$(printf "%-12s" "$LOCAL_DWC2FK_COMMIT")${default}"
REMOTE_DWC2FK_COMMIT="${green}$(printf "%-12s" "$REMOTE_DWC2FK_COMMIT")${default}" REMOTE_DWC2FK_COMMIT="${green}$(printf "%-12s" "$REMOTE_DWC2FK_COMMIT")${default}"
@@ -297,9 +376,9 @@ compare_dwc2fk_versions(){
read_local_dwc2_version(){ read_local_dwc2_version(){
unset DWC2_VER_FOUND unset DWC2_VER_FOUND
if [ -e $DWC2_DIR/version ]; then if [ -e $DWC2_DIR/.version ]; then
DWC2_VER_FOUND="true" DWC2_VER_FOUND="true"
DWC2_LOCAL_VER=$(head -n 1 $DWC2_DIR/version) DWC2_LOCAL_VER=$(head -n 1 $DWC2_DIR/.version)
else else
DWC2_VER_FOUND="false" && unset DWC2_LOCAL_VER DWC2_VER_FOUND="false" && unset DWC2_LOCAL_VER
fi fi
@@ -310,7 +389,7 @@ read_remote_dwc2_version(){
if [[ ! $(dpkg-query -f'${Status}' --show curl 2>/dev/null) = *\ installed ]]; then if [[ ! $(dpkg-query -f'${Status}' --show curl 2>/dev/null) = *\ installed ]]; then
DWC2_REMOTE_VER=$NONE DWC2_REMOTE_VER=$NONE
else else
get_dwc2_ver get_dwc_ver
DWC2_REMOTE_VER=$DWC2_VERSION DWC2_REMOTE_VER=$DWC2_VERSION
fi fi
} }
@@ -320,16 +399,16 @@ compare_dwc2_versions(){
read_local_dwc2_version && read_remote_dwc2_version read_local_dwc2_version && read_remote_dwc2_version
if [[ $DWC2_VER_FOUND = "true" ]] && [[ $DWC2_LOCAL_VER == $DWC2_REMOTE_VER ]]; then if [[ $DWC2_VER_FOUND = "true" ]] && [[ $DWC2_LOCAL_VER == $DWC2_REMOTE_VER ]]; then
#printf fits the string for displaying it in the ui to a total char length of 12 #printf fits the string for displaying it in the ui to a total char length of 12
DWC2_LOCAL_VER="${green}$(printf "v%-11s" "$DWC2_LOCAL_VER")${default}" DWC2_LOCAL_VER="${green}$(printf "%-12s" "$DWC2_LOCAL_VER")${default}"
DWC2_REMOTE_VER="${green}$(printf "v%-11s" "$DWC2_REMOTE_VER")${default}" DWC2_REMOTE_VER="${green}$(printf "%-12s" "$DWC2_REMOTE_VER")${default}"
elif [[ $DWC2_VER_FOUND = "true" ]] && [[ $DWC2_LOCAL_VER != $DWC2_REMOTE_VER ]]; then elif [[ $DWC2_VER_FOUND = "true" ]] && [[ $DWC2_LOCAL_VER != $DWC2_REMOTE_VER ]]; then
DWC2_LOCAL_VER="${yellow}$(printf "v%-11s" "$DWC2_LOCAL_VER")${default}" DWC2_LOCAL_VER="${yellow}$(printf "%-12s" "$DWC2_LOCAL_VER")${default}"
DWC2_REMOTE_VER="${green}$(printf "v%-11s" "$DWC2_REMOTE_VER")${default}" DWC2_REMOTE_VER="${green}$(printf "%-12s" "$DWC2_REMOTE_VER")${default}"
# set flag for the multi update function # add dwc to the update all array for the update all function in the updater
DWC2_UPDATE_AVAIL="true" && update_arr+=(update_dwc2) DWC2_UPDATE_AVAIL="true" && update_arr+=(update_dwc2)
else else
DWC2_LOCAL_VER=$NONE DWC2_LOCAL_VER=$NONE
DWC2_REMOTE_VER="${green}$(printf "v%-11s" "$DWC2_REMOTE_VER")${default}" DWC2_REMOTE_VER="${green}$(printf "%-12s" "$DWC2_REMOTE_VER")${default}"
DWC2_UPDATE_AVAIL="false" DWC2_UPDATE_AVAIL="false"
fi fi
} }
@@ -355,8 +434,8 @@ compare_moonraker_versions(){
if [ "$LOCAL_MOONRAKER_COMMIT" != "$REMOTE_MOONRAKER_COMMIT" ]; then if [ "$LOCAL_MOONRAKER_COMMIT" != "$REMOTE_MOONRAKER_COMMIT" ]; then
LOCAL_MOONRAKER_COMMIT="${yellow}$(printf "%-12s" "$LOCAL_MOONRAKER_COMMIT")${default}" LOCAL_MOONRAKER_COMMIT="${yellow}$(printf "%-12s" "$LOCAL_MOONRAKER_COMMIT")${default}"
REMOTE_MOONRAKER_COMMIT="${green}$(printf "%-12s" "$REMOTE_MOONRAKER_COMMIT")${default}" REMOTE_MOONRAKER_COMMIT="${green}$(printf "%-12s" "$REMOTE_MOONRAKER_COMMIT")${default}"
MOONRAKER_UPDATE_AVAIL="true" # add moonraker to the update all array for the update all function in the updater
update_arr+=(update_moonraker) MOONRAKER_UPDATE_AVAIL="true" && update_arr+=(update_moonraker)
else else
LOCAL_MOONRAKER_COMMIT="${green}$(printf "%-12s" "$LOCAL_MOONRAKER_COMMIT")${default}" LOCAL_MOONRAKER_COMMIT="${green}$(printf "%-12s" "$LOCAL_MOONRAKER_COMMIT")${default}"
REMOTE_MOONRAKER_COMMIT="${green}$(printf "%-12s" "$REMOTE_MOONRAKER_COMMIT")${default}" REMOTE_MOONRAKER_COMMIT="${green}$(printf "%-12s" "$REMOTE_MOONRAKER_COMMIT")${default}"
@@ -366,10 +445,9 @@ compare_moonraker_versions(){
read_local_mainsail_version(){ read_local_mainsail_version(){
unset MAINSAIL_VER_FOUND unset MAINSAIL_VER_FOUND
MAINSAIL_APP_FILE=$(find $MAINSAIL_DIR/js -name "app.*.js" 2>/dev/null) if [ -e $MAINSAIL_DIR/.version ]; then
if [ ! -z $MAINSAIL_APP_FILE ]; then
MAINSAIL_LOCAL_VER=$(grep -o -E 'state:{packageVersion:.+' $MAINSAIL_APP_FILE | cut -d'"' -f2)
MAINSAIL_VER_FOUND="true" MAINSAIL_VER_FOUND="true"
MAINSAIL_LOCAL_VER=$(head -n 1 $MAINSAIL_DIR/.version)
else else
MAINSAIL_VER_FOUND="false" && unset MAINSAIL_LOCAL_VER MAINSAIL_VER_FOUND="false" && unset MAINSAIL_LOCAL_VER
fi fi
@@ -390,26 +468,25 @@ compare_mainsail_versions(){
read_local_mainsail_version && read_remote_mainsail_version read_local_mainsail_version && read_remote_mainsail_version
if [[ $MAINSAIL_VER_FOUND = "true" ]] && [[ $MAINSAIL_LOCAL_VER == $MAINSAIL_REMOTE_VER ]]; then if [[ $MAINSAIL_VER_FOUND = "true" ]] && [[ $MAINSAIL_LOCAL_VER == $MAINSAIL_REMOTE_VER ]]; then
#printf fits the string for displaying it in the ui to a total char length of 12 #printf fits the string for displaying it in the ui to a total char length of 12
MAINSAIL_LOCAL_VER="${green}$(printf "v%-11s" "$MAINSAIL_LOCAL_VER")${default}" MAINSAIL_LOCAL_VER="${green}$(printf "%-12s" "$MAINSAIL_LOCAL_VER")${default}"
MAINSAIL_REMOTE_VER="${green}$(printf "v%-11s" "$MAINSAIL_REMOTE_VER")${default}" MAINSAIL_REMOTE_VER="${green}$(printf "%-12s" "$MAINSAIL_REMOTE_VER")${default}"
elif [[ $MAINSAIL_VER_FOUND = "true" ]] && [[ $MAINSAIL_LOCAL_VER != $MAINSAIL_REMOTE_VER ]]; then elif [[ $MAINSAIL_VER_FOUND = "true" ]] && [[ $MAINSAIL_LOCAL_VER != $MAINSAIL_REMOTE_VER ]]; then
MAINSAIL_LOCAL_VER="${yellow}$(printf "v%-11s" "$MAINSAIL_LOCAL_VER")${default}" MAINSAIL_LOCAL_VER="${yellow}$(printf "%-12s" "$MAINSAIL_LOCAL_VER")${default}"
MAINSAIL_REMOTE_VER="${green}$(printf "v%-11s" "$MAINSAIL_REMOTE_VER")${default}" MAINSAIL_REMOTE_VER="${green}$(printf "%-12s" "$MAINSAIL_REMOTE_VER")${default}"
# set flag for the multi update function # add mainsail to the update all array for the update all function in the updater
MAINSAIL_UPDATE_AVAIL="true" && update_arr+=(update_mainsail) MAINSAIL_UPDATE_AVAIL="true" && update_arr+=(update_mainsail)
else else
MAINSAIL_LOCAL_VER=$NONE MAINSAIL_LOCAL_VER=$NONE
MAINSAIL_REMOTE_VER="${green}$(printf "v%-11s" "$MAINSAIL_REMOTE_VER")${default}" MAINSAIL_REMOTE_VER="${green}$(printf "%-12s" "$MAINSAIL_REMOTE_VER")${default}"
MAINSAIL_UPDATE_AVAIL="false" MAINSAIL_UPDATE_AVAIL="false"
fi fi
} }
read_local_fluidd_version(){ read_local_fluidd_version(){
unset FLUIDD_VER_FOUND unset FLUIDD_VER_FOUND
FLUIDD_APP_FILE=$(find $FLUIDD_DIR/js -name "app.*.js" 2>/dev/null) if [ -e $FLUIDD_DIR/.version ]; then
if [ ! -z $FLUIDD_APP_FILE ]; then
FLUIDD_LOCAL_VER=$(grep -o -E '"version/setVersion",".+"' $FLUIDD_APP_FILE | cut -d'"' -f4)
FLUIDD_VER_FOUND="true" FLUIDD_VER_FOUND="true"
FLUIDD_LOCAL_VER=$(head -n 1 $FLUIDD_DIR/.version)
else else
FLUIDD_VER_FOUND="false" && unset FLUIDD_LOCAL_VER FLUIDD_VER_FOUND="false" && unset FLUIDD_LOCAL_VER
fi fi
@@ -430,16 +507,16 @@ compare_fluidd_versions(){
read_local_fluidd_version && read_remote_fluidd_version read_local_fluidd_version && read_remote_fluidd_version
if [[ $FLUIDD_VER_FOUND = "true" ]] && [[ $FLUIDD_LOCAL_VER == $FLUIDD_REMOTE_VER ]]; then if [[ $FLUIDD_VER_FOUND = "true" ]] && [[ $FLUIDD_LOCAL_VER == $FLUIDD_REMOTE_VER ]]; then
#printf fits the string for displaying it in the ui to a total char length of 12 #printf fits the string for displaying it in the ui to a total char length of 12
FLUIDD_LOCAL_VER="${green}$(printf "v%-11s" "$FLUIDD_LOCAL_VER")${default}" FLUIDD_LOCAL_VER="${green}$(printf "%-12s" "$FLUIDD_LOCAL_VER")${default}"
FLUIDD_REMOTE_VER="${green}$(printf "v%-11s" "$FLUIDD_REMOTE_VER")${default}" FLUIDD_REMOTE_VER="${green}$(printf "%-12s" "$FLUIDD_REMOTE_VER")${default}"
elif [[ $FLUIDD_VER_FOUND = "true" ]] && [[ $FLUIDD_LOCAL_VER != $FLUIDD_REMOTE_VER ]]; then elif [[ $FLUIDD_VER_FOUND = "true" ]] && [[ $FLUIDD_LOCAL_VER != $FLUIDD_REMOTE_VER ]]; then
FLUIDD_LOCAL_VER="${yellow}$(printf "v%-11s" "$FLUIDD_LOCAL_VER")${default}" FLUIDD_LOCAL_VER="${yellow}$(printf "%-12s" "$FLUIDD_LOCAL_VER")${default}"
FLUIDD_REMOTE_VER="${green}$(printf "v%-11s" "$FLUIDD_REMOTE_VER")${default}" FLUIDD_REMOTE_VER="${green}$(printf "%-12s" "$FLUIDD_REMOTE_VER")${default}"
# set flag for the multi update function # add fluidd to the update all array for the update all function in the updater
FLUIDD_UPDATE_AVAIL="true" && update_arr+=(update_fluidd) FLUIDD_UPDATE_AVAIL="true" && update_arr+=(update_fluidd)
else else
FLUIDD_LOCAL_VER=$NONE FLUIDD_LOCAL_VER=$NONE
FLUIDD_REMOTE_VER="${green}$(printf "v%-11s" "$FLUIDD_REMOTE_VER")${default}" FLUIDD_REMOTE_VER="${green}$(printf "%-12s" "$FLUIDD_REMOTE_VER")${default}"
FLUIDD_UPDATE_AVAIL="false" FLUIDD_UPDATE_AVAIL="false"
fi fi
} }
@@ -471,6 +548,65 @@ compare_klipperscreen_versions(){
fi fi
} }
read_MoonrakerTelegramBot_versions(){
if [ -d $MOONRAKER_TELEGRAM_BOT_DIR ] && [ -d $MOONRAKER_TELEGRAM_BOT_DIR/.git ]; then
cd $MOONRAKER_TELEGRAM_BOT_DIR
git fetch origin master -q
LOCAL_MOONRAKER_TELEGRAM_BOT_COMMIT=$(git describe HEAD --always --tags | cut -d "-" -f 1,2)
REMOTE_MOONRAKER_TELEGRAM_BOT_COMMIT=$(git describe origin/master --always --tags | cut -d "-" -f 1,2)
else
LOCAL_MOONRAKER_TELEGRAM_BOT_COMMIT=$NONE
REMOTE_MOONRAKER_TELEGRAM_BOT_COMMIT=$NONE
fi
}
compare_MoonrakerTelegramBot_versions(){
unset MOONRAKER_TELEGRAM_BOT_UPDATE_AVAIL
read_MoonrakerTelegramBot_versions
if [ "$LOCAL_MOONRAKER_TELEGRAM_BOT_COMMIT" != "$REMOTE_MOONRAKER_TELEGRAM_BOT_COMMIT" ]; then
LOCAL_MOONRAKER_TELEGRAM_BOT_COMMIT="${yellow}$(printf "%-12s" "$LOCAL_MOONRAKER_TELEGRAM_BOT_COMMIT")${default}"
REMOTE_MOONRAKER_TELEGRAM_BOT_COMMIT="${green}$(printf "%-12s" "$REMOTE_MOONRAKER_TELEGRAM_BOT_COMMIT")${default}"
# add moonraker telegram bot to the update all array for the update all function in the updater
MOONRAKER_TELEGRAM_BOT_UPDATE_AVAIL="true" && update_arr+=(update_MoonrakerTelegramBot)
else
LOCAL_MOONRAKER_TELEGRAM_BOT_COMMIT="${green}$(printf "%-12s" "$LOCAL_MOONRAKER_TELEGRAM_BOT_COMMIT")${default}"
REMOTE_MOONRAKER_TELEGRAM_BOT_COMMIT="${green}$(printf "%-12s" "$REMOTE_MOONRAKER_TELEGRAM_BOT_COMMIT")${default}"
MOONRAKER_TELEGRAM_BOT_UPDATE_AVAIL="false"
fi
}
#############################################################
#############################################################
read_pgc_versions(){
PGC_DIR="${HOME}/pgcode"
if [ -d $PGC_DIR ] && [ -d $PGC_DIR/.git ]; then
cd $PGC_DIR
git fetch origin main -q
LOCAL_PGC_COMMIT=$(git describe HEAD --always --tags | cut -d "-" -f 1,2)
REMOTE_PGC_COMMIT=$(git describe origin/main --always --tags | cut -d "-" -f 1,2)
else
LOCAL_PGC_COMMIT=$NONE
REMOTE_PGC_COMMIT=$NONE
fi
}
compare_pgc_versions(){
unset PGC_UPDATE_AVAIL
read_pgc_versions
if [ "$LOCAL_PGC_COMMIT" != "$REMOTE_PGC_COMMIT" ]; then
LOCAL_PGC_COMMIT="${yellow}$(printf "%-12s" "$LOCAL_PGC_COMMIT")${default}"
REMOTE_PGC_COMMIT="${green}$(printf "%-12s" "$REMOTE_PGC_COMMIT")${default}"
# add PGC to the update all array for the update all function in the updater
PGC_UPDATE_AVAIL="true" && update_arr+=(update_pgc_for_klipper)
else
LOCAL_PGC_COMMIT="${green}$(printf "%-12s" "$LOCAL_PGC_COMMIT")${default}"
REMOTE_PGC_COMMIT="${green}$(printf "%-12s" "$REMOTE_PGC_COMMIT")${default}"
PGC_UPDATE_AVAIL="false"
fi
}
############################################################# #############################################################
############################################################# #############################################################
@@ -479,6 +615,7 @@ NONE="${red}$(printf "%-12s" "--------")${default}"
ui_print_versions(){ ui_print_versions(){
unset update_arr unset update_arr
check_system_updates
compare_klipper_versions compare_klipper_versions
compare_dwc2fk_versions compare_dwc2fk_versions
compare_dwc2_versions compare_dwc2_versions
@@ -486,4 +623,6 @@ ui_print_versions(){
compare_mainsail_versions compare_mainsail_versions
compare_fluidd_versions compare_fluidd_versions
compare_klipperscreen_versions compare_klipperscreen_versions
compare_MoonrakerTelegramBot_versions
compare_pgc_versions
} }

View File

@@ -2,26 +2,28 @@ advanced_ui(){
top_border top_border
echo -e "| ${yellow}~~~~~~~~~~~~~ [ Advanced Menu ] ~~~~~~~~~~~~~${default} | " echo -e "| ${yellow}~~~~~~~~~~~~~ [ Advanced Menu ] ~~~~~~~~~~~~~${default} | "
hr hr
echo -e "| 0) $OPRINT_SERVICE_STATUS| " if [ ! "$OPRINT_SERVICE_STATUS" == "" ]; then
hr echo -e "| 0) $OPRINT_SERVICE_STATUS| "
echo -e "| | | " hr
echo -e "| Klipper: | System: | " echo -e "| | | "
echo -e "| 1) [Switch Version] | 6) [Change hostname] | " fi
echo -e "| Klipper: | Mainsail: | "
echo -e "| 1) [Switch Branch] | 7) [Theme installer] | "
echo -e "| 2) [Rollback] | | " echo -e "| 2) [Rollback] | | "
echo -e "| | Extensions: | " echo -e "| | System: | "
echo -e "| Firmware: | 7) [Shell Command] | " echo -e "| Firmware: | 8) [Change hostname] | "
echo -e "| 3) [Build only] | | " echo -e "| 3) [Build only] | | "
echo -e "| 4) [Build + Flash MCU] | | " echo -e "| 4) [Flash only] | Extensions: | "
echo -e "| 5) [Get Printer-USB] | | " echo -e "| 5) [Build + Flash] | 9) [Shell Command] | "
echo -e "| | | " echo -e "| 6) [Get MCU ID] | | "
quit_footer echo -e "| | CustomPiOS: | "
echo -e "| | 10) [Migration Helper] | "
back_footer
} }
advanced_menu(){ advanced_menu(){
print_header
print_msg && clear_msg
read_octoprint_service_status read_octoprint_service_status
advanced_ui do_action "" "advanced_ui"
while true; do while true; do
read -p "${cyan}Perform action:${default} " action; echo read -p "${cyan}Perform action:${default} " action; echo
case "$action" in case "$action" in
@@ -33,61 +35,40 @@ advanced_menu(){
print_msg && clear_msg print_msg && clear_msg
advanced_ui;; advanced_ui;;
1) 1)
clear do_action "switch_menu";;
print_header
switch_menu
print_msg && clear_msg
advanced_ui;;
2) 2)
clear do_action "load_klipper_state" "advanced_ui";;
print_header
load_klipper_state
print_msg && clear_msg
advanced_ui;;
3) 3)
clear do_action "build_fw" "advanced_ui";;
print_header
unset BUILD_FIRMWARE && BUILD_FIRMWARE="true"
build_fw
print_msg && clear_msg
advanced_ui;;
4) 4)
clear clear && print_header
print_header check_usergroup_dialout
unset FLASH_FIRMWARE && FLASH_FIRMWARE="true" do_action "select_flash_method" "advanced_ui";;
flash_routine
unset BUILD_FIRMWARE && BUILD_FIRMWARE="true"
build_fw
unset CONFIRM_FLASHING && CONFIRM_FLASHING="true"
flash_mcu
print_msg && clear_msg
advanced_ui;;
5) 5)
clear clear && print_header
print_header check_usergroup_dialout
get_printer_usb status_msg "Please wait..."
build_fw && select_flash_method
print_msg && clear_msg print_msg && clear_msg
advanced_ui;; advanced_ui;;
6) 6)
do_action "select_mcu_connection" "advanced_ui";;
7)
do_action "ms_theme_menu";;
8)
clear clear
print_header print_header
create_custom_hostname && set_hostname create_custom_hostname && set_hostname
print_msg && clear_msg print_msg && clear_msg
advanced_ui;; advanced_ui;;
7) 9)
clear do_action "setup_gcode_shell_command" "advanced_ui";;
print_header 10)
setup_gcode_shell_command do_action "migration_menu";;
print_msg && clear_msg B|b)
advanced_ui;;
Q|q)
clear; main_menu; break;; clear; main_menu; break;;
*) *)
clear deny_action "advanced_ui";;
print_header
print_unkown_cmd
print_msg && clear_msg
advanced_ui;;
esac esac
done done
advanced_menu advanced_menu
@@ -111,14 +92,13 @@ switch_ui(){
echo -e "| dmbutyugin: | " echo -e "| dmbutyugin: | "
echo -e "| 2) [--> scurve-shaping] | " echo -e "| 2) [--> scurve-shaping] | "
echo -e "| 3) [--> scurve-smoothing] | " echo -e "| 3) [--> scurve-smoothing] | "
quit_footer back_footer
} }
switch_menu(){ switch_menu(){
if [ -d $KLIPPER_DIR ]; then if [ -d $KLIPPER_DIR ]; then
read_branch read_branch
print_msg && clear_msg do_action "" "switch_ui"
switch_ui
while true; do while true; do
read -p "${cyan}Perform action:${default} " action; echo read -p "${cyan}Perform action:${default} " action; echo
case "$action" in case "$action" in
@@ -150,14 +130,10 @@ switch_menu(){
read_branch read_branch
print_msg && clear_msg print_msg && clear_msg
switch_ui;; switch_ui;;
Q|q) B|b)
clear; advanced_menu; break;; clear; advanced_menu; break;;
*) *)
clear deny_action "switch_ui";;
print_header
print_unkown_cmd
print_msg && clear_msg
switch_ui;;
esac esac
done done
else else
@@ -168,21 +144,36 @@ switch_menu(){
############################################################# #############################################################
############################################################# #############################################################
rollback_ui(){ migration_ui(){
top_border top_border
echo -e "| $(title_msg "~~~~~~~~~~~~~ [ Rollback Menu ] ~~~~~~~~~~~~~") | " echo -e "| $(title_msg "~~~~~~~~~ [ CustomPiOS Migration ] ~~~~~~~~~~") | "
hr hr
echo -e "| If serious errors occured after updating Klipper, | " echo -e "| This function will help you to migrate a vanilla | "
echo -e "| you can use this menu to return to the previously | " echo -e "| MainsailOS or FluiddPi image to a newer state. | "
echo -e "| used commit from which you have updated. | " blank_line
bottom_border echo -e "| Only use this function if you use MainsailOS 0.4.0 | "
top_border echo -e "| or lower, or FluiddPi v1.13.0 or lower. | "
echo -e "| Active branch: ${green}$PRINT_BRANCH${default} | " blank_line
echo -e "| Please have a look at the KIAUH changelog for more | "
echo -e "| details on what this function will do. | "
hr hr
echo -e "| Currently on commit: | " echo -e "| | "
echo -e "| $CURR_UI | " echo -e "| 1) [Migrate MainsailOS] | "
hr echo -e "| 2) [Migrate FluiddPi] | "
echo -e "| Commit last updated from: | " echo -e "| | "
echo -e "| $PREV_UI | " back_footer
quit_footer }
migration_menu(){
print_msg && clear_msg
migration_ui
while true; do
read -p "${cyan}Perform action:${default} " action; echo
case "$action" in
1) migrate_custompios "mainsail"; migration_menu;;
2) migrate_custompios "fluiddpi"; migration_menu;;
B|b) clear; advanced_menu; break;;
*) print_unkown_cmd; migration_menu;;
esac
done
} }

View File

@@ -4,81 +4,49 @@ backup_ui(){
hr hr
echo -e "| ${yellow}Backup location: ~/kiauh-backups${default} | " echo -e "| ${yellow}Backup location: ~/kiauh-backups${default} | "
hr hr
echo -e "| Firmware: | " echo -e "| Configuration folder: | Klipper Webinterface: | "
echo -e "| 1) [Klipper] | " echo -e "| 0) [Klipper configs] | 4) [Mainsail] | "
echo -e "| | " echo -e "| | 5) [Fluidd] | "
echo -e "| Klipper API: | " echo -e "| Firmware: | | "
echo -e "| 2) [Moonraker] | " echo -e "| 1) [Klipper] | HDMI Screen: | "
echo -e "| | " echo -e "| | 6) [KlipperScreen] | "
echo -e "| Webinterface: | " echo -e "| Klipper API: | | "
echo -e "| 3) [Mainsail] | " echo -e "| 2) [Moonraker] | Other: | "
echo -e "| 4) [Fluidd] | " echo -e "| 3) [Moonraker DB] | 7) [Duet Web Control] | "
echo -e "| 5) [DWC2 Web UI] | " echo -e "| | 8) [OctoPrint] | "
echo -e "| 6) [OctoPrint] | " echo -e "| | 9) [MoonrakerTelegramBot] | "
echo -e "| | " back_footer
echo -e "| HDMI Screen: | "
echo -e "| 7) [KlipperScreen] | "
echo -e "| | "
quit_footer
} }
backup_menu(){ backup_menu(){
print_header do_action "" "backup_ui"
print_msg && clear_msg
backup_ui
while true; do while true; do
read -p "${cyan}Perform action:${default} " action; echo read -p "${cyan}Perform action:${default} " action; echo
case "$action" in case "$action" in
0)
do_action "backup_klipper_config_dir" "backup_ui";;
1) 1)
clear do_action "backup_klipper" "backup_ui";;
print_header
backup_klipper
print_msg && clear_msg
backup_ui;;
2) 2)
clear do_action "backup_moonraker" "backup_ui";;
print_header
backup_moonraker
print_msg && clear_msg
backup_ui;;
3) 3)
clear do_action "backup_moonraker_database" "backup_ui";;
print_header
backup_mainsail
print_msg && clear_msg
backup_ui;;
4) 4)
clear do_action "backup_mainsail" "backup_ui";;
print_header
backup_fluidd
print_msg && clear_msg
backup_ui;;
5) 5)
clear do_action "backup_fluidd" "backup_ui";;
print_header
backup_dwc2
print_msg && clear_msg
backup_ui;;
6) 6)
clear do_action "backup_klipperscreen" "backup_ui";;
print_header
backup_octoprint
print_msg && clear_msg
backup_ui;;
7) 7)
clear do_action "backup_dwc2" "backup_ui";;
print_header 8)
backup_klipperscreen do_action "backup_octoprint" "backup_ui";;
print_msg && clear_msg 9)
backup_ui;; do_action "backup_MoonrakerTelegramBot" "backup_ui";;
Q|q) B|b)
clear; main_menu; break;; clear; main_menu; break;;
*) *)
clear deny_action "backup_ui";;
print_header
print_unkown_cmd
print_msg && clear_msg
backup_ui;;
esac esac
done done
backup_menu backup_menu

View File

@@ -1,6 +1,6 @@
#ui total width = 57 chars #ui total width = 57 chars
top_border(){ top_border(){
echo -e "/=======================================================\ " echo -e "/=======================================================\\"
} }
bottom_border(){ bottom_border(){
@@ -8,7 +8,7 @@ bottom_border(){
} }
blank_line(){ blank_line(){
echo -e "| | " echo -e "| |"
} }
hr(){ hr(){
@@ -17,7 +17,19 @@ hr(){
quit_footer(){ quit_footer(){
hr hr
echo -e "| ${red}Q) Quit${default} | " echo -e "| ${red}Q) Quit${default} |"
bottom_border
}
back_footer(){
hr
echo -e "| ${green}B) « Back${default} |"
bottom_border
}
back_help_footer(){
hr
echo -e "| ${green}B) « Back${default} | ${yellow}H) Help [?]${default} |"
bottom_border bottom_border
} }
@@ -31,10 +43,33 @@ print_header(){
kiauh_update_msg(){ kiauh_update_msg(){
top_border top_border
echo -e "| ${yellow}There is a newer version of this script available!${default} | " echo -e "|${green} New KIAUH update available! ${default}| "
echo -e "| ${yellow}Type 'update' if you want to update KIAUH now.${default} | " hr
echo -e "|${green} View Changelog: https://git.io/JnmlX ${default}| "
blank_line blank_line
echo -e "| ${yellow}Check out the KIAUH changelog for important changes${default} | " echo -e "|${yellow} It is recommended to keep KIAUH up to date. Updates ${default}| "
echo -e "| ${yellow}either to the script or the installable components!${default} | " echo -e "|${yellow} usually contain bugfixes, important changes or new ${default}| "
echo -e "|${yellow} features. Please consider updating! ${default}| "
bottom_border bottom_border
} }
################################################################################
#******************************************************************************#
################################################################################
### TODO: rework other menus to make use of the following functions too and make them more readable
do_action(){
clear && print_header
### $1 is the action the user wants to fire
$1
print_msg && clear_msg
### $2 is the menu the user usually gets directed back to after an action is completed
$2
}
deny_action(){
clear && print_header
print_unkown_cmd
print_msg && clear_msg
$1
}

View File

@@ -6,73 +6,49 @@ install_ui(){
echo -e "| all necessary dependencies for the various | " echo -e "| all necessary dependencies for the various | "
echo -e "| functions on a completely fresh system. | " echo -e "| functions on a completely fresh system. | "
hr hr
echo -e "| Firmware: | Webinterface: | " echo -e "| Firmware: | Touchscreen GUI: | "
echo -e "| 1) [Klipper] | 3) [DWC2] | " echo -e "| 1) [Klipper] | 5) [KlipperScreen] | "
echo -e "| | 4) [Mainsail] | " echo -e "| | | "
echo -e "| Klipper API: | 5) [Fluidd] | " echo -e "| Klipper API: | Other: | "
echo -e "| 2) [Moonraker] | 6) [Octoprint] | " echo -e "| 2) [Moonraker] | 6) [Duet Web Control] | "
echo -e "| | | " echo -e "| | 7) [OctoPrint] | "
echo -e "| | HDMI Screen | " echo -e "| Klipper Webinterface: | 8) [PrettyGCode] | "
echo -e "| | 7) [KlipperScreen] | " echo -e "| 3) [Mainsail] | 9) [Telegram Bot] | "
quit_footer echo -e "| 4) [Fluidd] | | "
echo -e "| | Webcam: | "
echo -e "| | 10) [MJPG-Streamer] | "
back_footer
} }
install_menu(){ install_menu(){
print_header do_action "" "install_ui"
install_ui
while true; do while true; do
read -p "${cyan}Perform action:${default} " action; echo read -p "${cyan}Perform action:${default} " action; echo
case "$action" in case "$action" in
1) 1)
clear do_action "klipper_setup_dialog" "install_ui";;
print_header
install_klipper
print_msg && clear_msg
install_ui;;
2) 2)
clear do_action "moonraker_setup_dialog" "install_ui";;
print_header
install_moonraker
print_msg && clear_msg
install_ui;;
3) 3)
clear do_action "install_webui mainsail" "install_ui";;
print_header
install_dwc2
print_msg && clear_msg
install_ui;;
4) 4)
clear do_action "install_webui fluidd" "install_ui";;
print_header
install_mainsail
print_msg && clear_msg
install_ui;;
5) 5)
clear do_action "install_klipperscreen" "install_ui";;
print_header
install_fluidd
print_msg && clear_msg
install_ui;;
6) 6)
clear do_action "dwc_setup_dialog" "install_ui";;
print_header
install_octoprint
print_msg && clear_msg
install_ui;;
7) 7)
clear do_action "octoprint_setup_dialog" "install_ui";;
print_header 8)
install_klipperscreen do_action "install_pgc_for_klipper" "install_ui";;
print_msg && clear_msg 9)
install_ui;; do_action "install_MoonrakerTelegramBot" "install_ui";;
Q|q) 10)
do_action "install_mjpg-streamer" "install_ui";;
B|b)
clear; main_menu; break;; clear; main_menu; break;;
*) *)
clear deny_action "install_ui";;
print_header
print_unkown_cmd
print_msg && clear_msg
install_ui;;
esac esac
done done
install_menu install_menu

View File

@@ -1,4 +1,5 @@
main_ui(){ main_ui(){
#[ $KIAUH_UPDATE_REMIND="true" ] && kiauh_update_reminder
top_border top_border
echo -e "| $(title_msg "~~~~~~~~~~~~~~~ [ Main Menu ] ~~~~~~~~~~~~~~~") |" echo -e "| $(title_msg "~~~~~~~~~~~~~~~ [ Main Menu ] ~~~~~~~~~~~~~~~") |"
hr hr
@@ -7,12 +8,13 @@ main_ui(){
echo -e "| 1) [Install] | |" echo -e "| 1) [Install] | |"
echo -e "| 2) [Update] | Moonraker: $MOONRAKER_STATUS|" echo -e "| 2) [Update] | Moonraker: $MOONRAKER_STATUS|"
echo -e "| 3) [Remove] | |" echo -e "| 3) [Remove] | |"
echo -e "| | DWC2: $DWC2_STATUS|" echo -e "| 4) [Advanced] | Mainsail: $MAINSAIL_STATUS|"
echo -e "| 4) [Advanced] | Fluidd: $FLUIDD_STATUS|" echo -e "| 5) [Backup] | Fluidd: $FLUIDD_STATUS|"
echo -e "| 5) [Backup] | Mainsail: $MAINSAIL_STATUS|" echo -e "| | KlipperScreen: $KLIPPERSCREEN_STATUS|"
echo -e "| | Octoprint: $OCTOPRINT_STATUS|" echo -e "| 6) [Settings] | Telegram Bot: $MOONRAKER_TELEGRAM_BOT_STATUS|"
echo -e "| | |" echo -e "| | |"
echo -e "| ${cyan}$KIAUH_VER${default}| KlipperScreen: $KLIPPERSCREEN_STATUS|" echo -e "| | DWC2: $DWC2_STATUS|"
echo -e "| ${cyan}$KIAUH_VER${default}| Octoprint: $OCTOPRINT_STATUS|"
quit_footer quit_footer
} }
@@ -22,11 +24,26 @@ print_kiauh_version(){
KIAUH_VER="$(printf "%-20s" "$KIAUH_VER")" KIAUH_VER="$(printf "%-20s" "$KIAUH_VER")"
} }
kiauh_update_dialog(){
kiauh_update_msg
read -p "${cyan}Do you want to update now? (Y/n):${default} " yn
while true; do
case "$yn" in
Y|y|Yes|yes|"")
do_action "update_kiauh"
break;;
N|n|No|no) break;;
*)
deny_action "kiauh_update_dialog";;
esac
done
}
main_menu(){ main_menu(){
print_header print_header
#print KIAUH update msg if update available #print KIAUH update msg if update available
if [ "$KIAUH_UPDATE_AVAIL" = "true" ]; then if [ "$KIAUH_UPDATE_AVAIL" = "true" ]; then
kiauh_update_msg kiauh_update_dialog
fi fi
#check install status #check install status
print_kiauh_version print_kiauh_version
@@ -37,53 +54,38 @@ main_menu(){
mainsail_status mainsail_status
octoprint_status octoprint_status
klipperscreen_status klipperscreen_status
MoonrakerTelegramBot_status
print_branch print_branch
print_msg && clear_msg print_msg && clear_msg
main_ui main_ui
while true; do while true; do
read -p "${cyan}Perform action:${default} " action; echo read -p "${cyan}Perform action:${default} " action; echo
case "$action" in case "$action" in
update) "start klipper") do_action_service "start" "klipper"; main_ui;;
clear "stop klipper") do_action_service "stop" "klipper"; main_ui;;
print_header "restart klipper") do_action_service "restart" "klipper"; main_ui;;
update_kiauh "start moonraker") do_action_service "start" "moonraker"; main_ui;;
print_msg && clear_msg "stop moonraker") do_action_service "stop" "moonraker"; main_ui;;
main_ui;; "restart moonraker")do_action_service "restart" "moonraker"; main_ui;;
0) "start dwc") do_action_service "start" "dwc"; main_ui;;
clear "stop dwc") do_action_service "stop" "dwc"; main_ui;;
print_header "restart dwc") do_action_service "restart" "dwc"; main_ui;;
upload_selection "start octoprint") do_action_service "start" "octoprint"; main_ui;;
print_msg && clear_msg "stop octoprint") do_action_service "stop" "octoprint"; main_ui;;
main_ui;; "restart octoprint") do_action_service "restart" "octoprint"; main_ui;;
1) update) do_action "update_kiauh" "main_ui";;
clear 0) do_action "upload_selection" "main_ui";;
install_menu 1) clear && install_menu && break;;
break;; 2) clear && update_menu && break;;
2) 3) clear && remove_menu && break;;
clear 4) clear && advanced_menu && break;;
update_menu 5) clear && backup_menu && break;;
break;; 6) clear && settings_menu && break;;
3)
clear
remove_menu
break;;
4)
clear
advanced_menu
break;;
5)
clear
backup_menu
break;;
Q|q) Q|q)
echo -e "${green}###### Happy printing! ######${default}"; echo echo -e "${green}###### Happy printing! ######${default}"; echo
exit -1;; exit -1;;
*) *)
clear deny_action "main_ui";;
print_header
print_unkown_cmd
print_msg && clear_msg
main_ui;;
esac esac
done done
clear; main_menu clear; main_menu

View File

@@ -2,88 +2,56 @@ remove_ui(){
top_border top_border
echo -e "| ${red}~~~~~~~~~~~~~~ [ Remove Menu ] ~~~~~~~~~~~~~~${default} | " echo -e "| ${red}~~~~~~~~~~~~~~ [ Remove Menu ] ~~~~~~~~~~~~~~${default} | "
hr hr
echo -e "| Files and directories which remain untouched: | " echo -e "| Directories which remain untouched: | "
echo -e "| --> ~/printer.cfg | " echo -e "| --> Your printer configuration directory | "
echo -e "| --> ~/klipper_config | "
echo -e "| --> ~/kiauh-backups | " echo -e "| --> ~/kiauh-backups | "
echo -e "| You need remove them manually if you wish so. | " echo -e "| You need remove them manually if you wish so. | "
hr hr
echo -e "| Firmware: | Webinterface: | " echo -e "| Firmware: | Touchscreen GUI: | "
echo -e "| 1) [Klipper] | 3) [DWC2] | " echo -e "| 1) [Klipper] | 5) [KlipperScreen] | "
echo -e "| | 4) [Mainsail] | " echo -e "| | | "
echo -e "| Klipper API: | 5) [Fluidd] | " echo -e "| Klipper API: | Other: | "
echo -e "| 2) [Moonraker] | 6) [Octoprint] | " echo -e "| 2) [Moonraker] | 6) [Duet Web Control] | "
echo -e "| | | " echo -e "| | 7) [OctoPrint] | "
echo -e "| | Webserver: | " echo -e "| Klipper Webinterface: | 8) [PrettyGCode] | "
echo -e "| | 7) [Nginx] | " echo -e "| 3) [Mainsail] | 9) [Telegram Bot] | "
echo -e "| | | " echo -e "| 4) [Fluidd] | | "
echo -e "| | HDMI Screen: | " echo -e "| | 10) [MJPG-Streamer] | "
echo -e "| | 8) [KlipperScreen] | " echo -e "| | 11) [NGINX] | "
quit_footer back_footer
} }
remove_menu(){ remove_menu(){
print_header do_action "" "remove_ui"
remove_ui
while true; do while true; do
read -p "${cyan}Perform action:${default} " action; echo read -p "${cyan}Perform action:${default} " action; echo
case "$action" in case "$action" in
1) 1)
clear do_action "remove_klipper" "remove_ui";;
print_header
remove_klipper
print_msg && clear_msg
remove_ui;;
2) 2)
clear do_action "remove_moonraker" "remove_ui";;
print_header
remove_moonraker
print_msg && clear_msg
remove_ui;;
3) 3)
clear do_action "remove_mainsail" "remove_ui";;
print_header
remove_dwc2
print_msg && clear_msg
remove_ui;;
4) 4)
clear do_action "remove_fluidd" "remove_ui";;
print_header
remove_mainsail
print_msg && clear_msg
remove_ui;;
5) 5)
clear do_action "remove_klipperscreen" "remove_ui";;
print_header
remove_fluidd
print_msg && clear_msg
remove_ui;;
6) 6)
clear do_action "remove_dwc2" "remove_ui";;
print_header
remove_octoprint
print_msg && clear_msg
remove_ui;;
7) 7)
clear do_action "remove_octoprint" "remove_ui";;
print_header
remove_nginx
print_msg && clear_msg
remove_ui;;
8) 8)
clear do_action "remove_prettygcode" "remove_ui";;
print_header 9)
remove_klipperscreen do_action "remove_MoonrakerTelegramBot" "remove_ui";;
print_msg && clear_msg 10)
remove_ui;; do_action "remove_mjpg-streamer" "remove_ui";;
Q|q) 11)
do_action "remove_nginx" "remove_ui";;
B|b)
clear; main_menu; break;; clear; main_menu; break;;
*) *)
clear deny_action "remove_ui";;
print_header
print_unkown_cmd
print_msg && clear_msg
remove_ui;;
esac esac
done done
remove_menu remove_menu

44
scripts/ui/settings_menu.sh Executable file
View File

@@ -0,0 +1,44 @@
settings_ui(){
source_kiauh_ini
top_border
echo -e "| $(title_msg "~~~~~~~~~~~~ [ KIAUH Settings ] ~~~~~~~~~~~~~") | "
hr
echo -e "| ${red}Caution:${default} | "
echo -e "| When you change the config folder, be aware that ALL | "
echo -e "| Klipper and Moonraker services will be STOPPED, | "
echo -e "| reconfigured and then restarted again. | "
blank_line
echo -e "| ${red}DO NOT change the folder during printing!${default} | "
hr
blank_line
echo -e "| ${cyan}● Current Klipper config folder:${default} | "
printf "|%-55s|\n" " $klipper_cfg_loc"
blank_line
hr
if [ -z $klipper_cfg_loc ]; then
echo -e "| ${red}N/A) Install Klipper with KIAUH first to unlock!${default} | "
else
echo -e "| 1) Change config folder | "
fi
back_footer
}
settings_menu(){
do_action "" "settings_ui"
while true; do
read -p "${cyan}Perform action:${default} " action; echo
case "$action" in
1)
if [ ! -z $klipper_cfg_loc ]; then
do_action "change_klipper_cfg_path" "settings_ui"
else
deny_action "settings_ui"
fi;;
B|b)
clear; main_menu; break;;
*)
deny_action "settings_ui";;
esac
done
settings_ui
}

View File

@@ -1,106 +1,67 @@
update_ui(){ update_ui(){
ui_print_versions
top_border top_border
echo -e "| ${green}~~~~~~~~~~~~~~ [ Update Menu ] ~~~~~~~~~~~~~~${default} | " echo -e "| ${green}~~~~~~~~~~~~~~ [ Update Menu ] ~~~~~~~~~~~~~~${default} | "
hr hr
echo -e "| Check the following website for important software | "
echo -e "| changes to the config file before updating Klipper: | "
echo -e "| | "
echo -e "| ${yellow}https://www.klipper3d.org/Config_Changes.html${default} | "
bottom_border
top_border
echo -e "| 0) $BB4U_STATUS| " echo -e "| 0) $BB4U_STATUS| "
hr hr
echo -e "| a) [Update all] | Local Vers: | Remote Vers: | " echo -e "| a) [Update all] | | | "
echo -e "| | | | " echo -e "| | Local Vers: | Remote Vers: | "
echo -e "| Firmware: | | | " echo -e "| Klipper/Klipper API: |---------------|--------------| "
echo -e "| 1) [Klipper] | $LOCAL_COMMIT | $REMOTE_COMMIT | " echo -e "| 1) [Klipper] | $LOCAL_COMMIT | $REMOTE_COMMIT | "
echo -e "| 2) [Moonraker] | $LOCAL_MOONRAKER_COMMIT | $REMOTE_MOONRAKER_COMMIT | "
echo -e "| | | | " echo -e "| | | | "
echo -e "| Webinterface: |---------------|--------------| " echo -e "| Klipper Webinterface: |---------------|--------------| "
echo -e "| 2) [DWC2-for-Klipper] | $LOCAL_DWC2FK_COMMIT | $REMOTE_DWC2FK_COMMIT | " echo -e "| 3) [Mainsail] | $MAINSAIL_LOCAL_VER | $MAINSAIL_REMOTE_VER | "
echo -e "| 3) [DWC2 Web UI] | $DWC2_LOCAL_VER | $DWC2_REMOTE_VER | " echo -e "| 4) [Fluidd] | $FLUIDD_LOCAL_VER | $FLUIDD_REMOTE_VER | "
echo -e "| |---------------|--------------| "
echo -e "| 4) [Moonraker] | $LOCAL_MOONRAKER_COMMIT | $REMOTE_MOONRAKER_COMMIT | "
echo -e "| 5) [Mainsail] | $MAINSAIL_LOCAL_VER | $MAINSAIL_REMOTE_VER | "
echo -e "| 6) [Fluidd] | $FLUIDD_LOCAL_VER | $FLUIDD_REMOTE_VER | "
echo -e "| | | | " echo -e "| | | | "
echo -e "| HDMI Screen: |---------------|--------------| " echo -e "| Touchscreen GUI: |---------------|--------------| "
echo -e "| 7) [KlipperScreen] | $LOCAL_KLIPPERSCREEN_COMMIT | $REMOTE_KLIPPERSCREEN_COMMIT | " echo -e "| 5) [KlipperScreen] | $LOCAL_KLIPPERSCREEN_COMMIT | $REMOTE_KLIPPERSCREEN_COMMIT | "
quit_footer echo -e "| | | | "
echo -e "| Other: |---------------|--------------| "
echo -e "| 6) [DWC2-for-Klipper] | $LOCAL_DWC2FK_COMMIT | $REMOTE_DWC2FK_COMMIT | "
echo -e "| 7) [DWC2 Web UI] | $DWC2_LOCAL_VER | $DWC2_REMOTE_VER | "
echo -e "| 8) [PrettyGCode] | $LOCAL_PGC_COMMIT | $REMOTE_PGC_COMMIT | "
echo -e "| 9) [Telegram Bot] | $LOCAL_MOONRAKER_TELEGRAM_BOT_COMMIT | $REMOTE_MOONRAKER_TELEGRAM_BOT_COMMIT | "
echo -e "| |------------------------------| "
echo -e "| 10) [System] | $DISPLAY_SYS_UPDATE | "
back_footer
} }
update_menu(){ update_menu(){
print_header
#compare versions
ui_print_versions
print_msg && clear_msg
read_bb4u_stat read_bb4u_stat
update_ui do_action "" "update_ui"
while true; do while true; do
read -p "${cyan}Perform action:${default} " action; echo read -p "${cyan}Perform action:${default} " action; echo
case "$action" in case "$action" in
0) 0)
clear do_action "toggle_backups" "update_ui";;
print_header
toggle_backups
print_msg && clear_msg
update_ui;;
1) 1)
clear do_action "update_klipper" "update_ui";;
print_header
update_klipper && ui_print_versions
print_msg && clear_msg
update_ui;;
2) 2)
clear do_action "update_moonraker" "update_ui";;
print_header
update_dwc2fk && ui_print_versions
print_msg && clear_msg
update_ui;;
3) 3)
clear do_action "update_mainsail" "update_ui";;
print_header
update_dwc2 && ui_print_versions
print_msg && clear_msg
update_ui;;
4) 4)
clear do_action "update_fluidd" "update_ui";;
print_header
update_moonraker && ui_print_versions
print_msg && clear_msg
update_ui;;
5) 5)
clear do_action "update_klipperscreen" "update_ui";;
print_header
update_mainsail && ui_print_versions
print_msg && clear_msg
update_ui;;
6) 6)
clear do_action "update_dwc2fk" "update_ui";;
print_header
update_fluidd && ui_print_versions
print_msg && clear_msg
update_ui;;
7) 7)
clear do_action "update_dwc2" "update_ui";;
print_header 8)
update_klipperscreen && ui_print_versions do_action "update_pgc_for_klipper" "update_ui";;
print_msg && clear_msg 9)
update_ui;; do_action "update_MoonrakerTelegramBot" "update_ui";;
10)
do_action "update_system" "update_ui";;
a) a)
clear do_action "update_all" "update_ui";;
print_header B|b)
update_all && ui_print_versions
print_msg && clear_msg
update_ui;;
Q|q)
clear; main_menu; break;; clear; main_menu; break;;
*) *)
clear deny_action "update_ui";;
print_header
print_unkown_cmd
print_msg && clear_msg
ui_print_versions
update_ui;;
esac esac
done done
update_menu update_menu

View File

@@ -1,7 +1,7 @@
update_kiauh(){ update_kiauh(){
if [ "$KIAUH_UPDATE_AVAIL" = "true" ]; then if [ "$KIAUH_UPDATE_AVAIL" = "true" ]; then
status_msg "Updating KIAUH ..." status_msg "Updating KIAUH ..."
cd ${HOME}/kiauh cd ${SRCDIR}/kiauh
### force reset kiauh before updating ### force reset kiauh before updating
git reset --hard git reset --hard
git pull && ok_msg "Update complete! Please restart KIAUH." git pull && ok_msg "Update complete! Please restart KIAUH."
@@ -39,6 +39,15 @@ update_all(){
if [ "$KLIPPERSCREEN_UPDATE_AVAIL" = "true" ]; then if [ "$KLIPPERSCREEN_UPDATE_AVAIL" = "true" ]; then
echo -e "| ${cyan}● KlipperScreen${default} |" echo -e "| ${cyan}● KlipperScreen${default} |"
fi fi
if [ "$PGC_UPDATE_AVAIL" = "true" ]; then
echo -e "| ${cyan}● PrettyGCode for Klipper${default} |"
fi
if [ "$MOONRAKER_TELEGRAM_BOT_UPDATE_AVAIL" = "true" ]; then
echo -e "| ${cyan}● MoonrakerTelegramBot${default} |"
fi
if [ "$SYS_UPDATE_AVAIL" = "true" ]; then
echo -e "| ${cyan}● System${default} |"
fi
bottom_border bottom_border
if [ "${#update_arr[@]}" != "0" ]; then if [ "${#update_arr[@]}" != "0" ]; then
read -p "${cyan}###### Do you want to proceed? (Y/n):${default} " yn read -p "${cyan}###### Do you want to proceed? (Y/n):${default} " yn
@@ -59,8 +68,159 @@ update_all(){
done done
} }
update_log_paths(){
### update services to make use of moonrakers new log_path option
### https://github.com/Arksine/moonraker/commit/829b3a4ee80579af35dd64a37ccc092a1f67682a
shopt -s extglob # enable extended globbing
source_kiauh_ini
LPATH="${HOME}/klipper_logs"
[ ! -d "$LPATH" ] && mkdir -p "$LPATH"
FILE="$SYSTEMDDIR/$1?(-*([0-9])).service"
for file in $(ls $FILE); do
[ "$1" == "klipper" ] && LOG="klippy"
[ "$1" == "moonraker" ] && LOG="moonraker"
if [ ! "$(grep "\-l" $file)" ]; then
status_msg "Updating $file ..."
sudo sed -i -r "/ExecStart=/ s|$| -l $LPATH/$LOG.log|" $file
ok_msg "$file updated!"
elif [ "$(grep "\-l \/tmp\/$LOG" $file)" ]; then
status_msg "Updating $file ..."
sudo sed -i -r "/ExecStart=/ s|-l \/tmp\/$LOG|-l $LPATH/$LOG|" $file
ok_msg "$file updated!"
fi
done
sudo systemctl daemon-reload
# patch log_path entry if not found
dir1="$klipper_cfg_loc"
dir2="$klipper_cfg_loc/printer_*"
for conf in $(find $dir1 $dir2 -name "moonraker.conf" 2> /dev/null); do
if ! grep -q "log_path" $conf; then
status_msg "Patching $conf"
sed -i "/^config_path/a log_path: $LPATH" $conf
ok_msg "OK!"
fi
done
# create symlink for mainsail and fluidd nginx logs
symlink_webui_nginx_log "mainsail"
symlink_webui_nginx_log "fluidd"
# create symlink for webcamd log
if [ -f "/var/log/webcamd.log" ] && [ ! -L "$LPATH/webcamd.log" ]; then
status_msg "Creating symlink for '/var/log/webcamd.log' ..."
ln -s "/var/log/webcamd.log" "$LPATH"
ok_msg "OK!"
fi
shopt -u extglob # disable extended globbing
}
migrate_custompios(){
### migrate vanilla mainsailOS 0.4.0 / fluiddPI v1.13.0
### and older to be in sync with newer releases
WEBCAMD_SRC="https://raw.githubusercontent.com/raymondh2/MainsailOS/master/src/modules/mjpgstreamer/filesystem/root/usr/local/bin/webcamd"
MJPG_SERV_SRC="https://raw.githubusercontent.com/raymondh2/MainsailOS/master/src/modules/mjpgstreamer/filesystem/root/etc/systemd/system/webcamd.service"
KL_SERV_SRC="https://raw.githubusercontent.com/raymondh2/MainsailOS/master/src/modules/klipper/filesystem/root/etc/systemd/system/klipper.service"
NGINX_CFG1="https://raw.githubusercontent.com/raymondh2/MainsailOS/master/src/modules/mainsail/filesystem/root/etc/nginx/conf.d/upstreams.conf"
NGINX_CFG2="https://raw.githubusercontent.com/raymondh2/MainsailOS/master/src/modules/mainsail/filesystem/root/etc/nginx/sites-available/mainsail"
LOG_ROTATE_KLIPPER="https://raw.githubusercontent.com/raymondh2/MainsailOS/master/src/modules/klipper/filesystem/root/etc/logrotate.d/klipper"
LOG_ROTATE_MOONRAKER="https://raw.githubusercontent.com/raymondh2/MainsailOS/master/src/modules/moonraker/filesystem/root/etc/logrotate.d/moonraker"
LOG_ROTATE_WEBCAMD="https://raw.githubusercontent.com/raymondh2/MainsailOS/master/src/modules/mjpgstreamer/filesystem/root/etc/logrotate.d/webcamd"
if [ "$1" == "mainsail" ]; then
OS_VER="MainsailOS"
MACRO_CFG="mainsail.cfg"
fi
if [ "$1" == "fluiddpi" ]; then
OS_VER="FluiddPi"
MACRO_CFG="client_macros.cfg"
fi
if [ ! -f "/boot/$1.txt" ] || [ ! -f "/etc/init.d/klipper" ]; then
# abort function if there is no sign of an old CustomPiOS anymore
ERROR_MSG="No vanilla $OS_VER found. Aborting..." && return 0
fi
status_msg "Starting migration of $OS_VER... Please wait..."
if [ -d "${HOME}/klipper_logs" ]; then
# delete an existing klipper_logs directory
# shouldn't be there in the first place if its a true vanilla CustomPiOS
status_msg "Recreate '~/klipper_logs' directory..."
rm -rf "${HOME}/klipper_logs" && mkdir "${HOME}/klipper_logs"
ok_msg "OK!"
fi
if [ -f "/boot/$1.txt" ]; then
# replace old webcamd.service and webcamd
status_msg "Migrating MJPG-Streamer..."
sudo systemctl stop webcamd
sudo rm -f "/etc/systemd/system/webcamd.service"
sudo rm -f "/root/bin/webcamd"
sudo wget $WEBCAMD_SRC -O "/usr/local/bin/webcamd"
sudo wget $MJPG_SERV_SRC -O "/etc/systemd/system/webcamd.service"
sudo sed -i "s/MainsailOS/$OS_VER/" "/etc/systemd/system/webcamd.service"
sudo chmod +x "/usr/local/bin/webcamd"
# move mainsail.txt/fluiddpi.txt from boot to klipper_config and rename it
sudo mv "/boot/$1.txt" "${HOME}/klipper_config/webcam.txt"
sudo chown pi:pi "${HOME}/klipper_config/webcam.txt"
sudo systemctl daemon-reload
sudo systemctl restart webcamd
ok_msg "OK!"
fi
if [ -f "/etc/init.d/klipper" ] && [ ! -f "/etc/systemd/system/klipper.service" ]; then
# replace klipper SysVinit service with systemd service
status_msg "Migrating Klipper Service..."
sudo systemctl stop klipper
sudo update-rc.d -f klipper remove
sudo rm -f "/etc/init.d/klipper"
sudo rm -f "/etc/default/klipper"
sudo wget $KL_SERV_SRC -O "/etc/systemd/system/klipper.service"
sudo systemctl enable klipper.service
sudo systemctl daemon-reload
sudo systemctl restart klipper
ok_msg "OK!"
fi
if [ -f "/etc/systemd/system/moonraker.service" ]; then
# update new log path in existing moonraker service
status_msg "Updating Moonraker Service..."
sudo systemctl stop moonraker
update_log_paths "moonraker"
sudo systemctl restart moonraker
ok_msg "OK!"
fi
if [ -f "/etc/nginx/conf.d/upstreams.conf" ]; then
[ "$1" == "mainsail" ] && cfg="mainsail"
[ "$1" == "fluiddpi" ] && cfg="fluidd"
# update nginx upstreams.conf and mainsail/fluidd config file
status_msg "Updating NGINX configurations..."
sudo systemctl stop nginx
sudo rm -f "/etc/nginx/conf.d/upstreams.conf"
sudo rm -f "/etc/nginx/sites-available/$cfg"
sudo wget $NGINX_CFG1 -O "/etc/nginx/conf.d/upstreams.conf"
sudo wget $NGINX_CFG2 -O "/etc/nginx/sites-available/$cfg"
sudo sed -i "s/mainsail/$cfg/g" "/etc/nginx/sites-available/$cfg"
sudo systemctl restart nginx
ok_msg "OK!"
fi
if [ -f "${HOME}/klipper_config/$MACRO_CFG" ]; then
# update macro files
status_msg "Updating $MACRO_CFG ..."
MACRO_CFG_PATH="${HOME}/klipper_config/$MACRO_CFG"
sed -i "/SAVE_GCODE_STATE NAME=PAUSE_state/d" $MACRO_CFG_PATH
sed -i "/RESTORE_GCODE_STATE NAME=PAUSE_state/d" $MACRO_CFG_PATH
ok_msg "OK!"
fi
if [ -d "/etc/logrotate.d" ]; then
# download logrotate configs
status_msg "Setting up logrotations..."
sudo wget $LOG_ROTATE_KLIPPER -O "/etc/logrotate.d/klipper"
sudo wget $LOG_ROTATE_MOONRAKER -O "/etc/logrotate.d/moonraker"
sudo wget $LOG_ROTATE_WEBCAMD -O "/etc/logrotate.d/webcamd"
ok_msg "OK!"
fi
ok_msg "Migration done!"
}
update_klipper(){ update_klipper(){
stop_klipper do_action_service "stop" "klipper"
if [ ! -d $KLIPPER_DIR ]; then if [ ! -d $KLIPPER_DIR ]; then
cd ${HOME} && git clone $KLIPPER_REPO cd ${HOME} && git clone $KLIPPER_REPO
else else
@@ -73,96 +233,69 @@ update_klipper(){
git checkout $GET_BRANCH git checkout $GET_BRANCH
unset DETACHED_HEAD unset DETACHED_HEAD
fi fi
git pull && ok_msg "Update successfull!" ### pull latest files from github
git pull
#check for possible new dependencies and install them ### read PKGLIST and install possible new dependencies
status_msg "Checking for possible new dependencies ..." install_klipper_packages
PKGLIST=$(grep "PKGLIST=" ~/klipper/scripts/install-octopi.sh | cut -d'"' -f2- | cut -d'"' -f1 | cut -d"}" -f2) ### install possible new python dependencies
PYTHONDIR="${HOME}/klippy-env" KLIPPER_REQ_TXT="$KLIPPER_DIR/scripts/klippy-requirements.txt"
sudo apt-get update && sudo apt-get install --yes $PKGLIST $KLIPPY_ENV/bin/pip install -r $KLIPPER_REQ_TXT
$PYTHONDIR/bin/pip install -r ~/klipper/scripts/klippy-requirements.txt
ok_msg "Dependencies already met or have been installed!"
ok_msg "Update complete!"
fi fi
start_klipper update_log_paths "klipper"
ok_msg "Update complete!"
do_action_service "restart" "klipper"
} }
update_dwc2fk(){ update_dwc2fk(){
stop_dwc do_action_service "stop" "dwc"
bb4u "dwc2" bb4u "dwc2"
if [ ! -d $DWC2FK_DIR ]; then if [ ! -d $DWC2FK_DIR ]; then
cd ${HOME} && git clone $DWC2FK_REPO cd ${HOME} && git clone $DWC2FK_REPO
else else
cd $DWC2FK_DIR && git pull cd $DWC2FK_DIR && git pull
fi fi
start_dwc do_action_service "start" "dwc"
} }
update_dwc2(){ update_dwc2(){
bb4u "dwc2" bb4u "dwc2"
download_dwc2_webui download_dwc_webui
} }
update_mainsail(){ update_mainsail(){
bb4u "mainsail" bb4u "mainsail"
status_msg "Updating Mainsail ..." status_msg "Updating Mainsail ..."
mainsail_setup mainsail_setup
match_nginx_configs
symlink_webui_nginx_log "mainsail"
} }
update_fluidd(){ update_fluidd(){
bb4u "fluidd" bb4u "fluidd"
status_msg "Updating Fluidd ..." status_msg "Updating Fluidd ..."
fluidd_setup fluidd_setup
match_nginx_configs
symlink_webui_nginx_log "fluidd"
} }
update_moonraker(){ update_moonraker(){
do_action_service "stop" "moonraker"
bb4u "moonraker" bb4u "moonraker"
status_msg "Updating Moonraker ..." status_msg "Updating Moonraker ..."
while true; do ### pull latest files from github
echo cd "$MOONRAKER_DIR" && git pull
top_border ### read PKGLIST and install possible new dependencies
echo -e "| You can now choose how you want to update Moonraker. |" install_moonraker_packages
blank_line ### install possible new python dependencies
echo -e "| Changes made to the Moonraker code and/or its depen- |" MR_REQ_TXT="$MOONRAKER_DIR/scripts/moonraker-requirements.txt"
echo -e "| dencies might require a rebuild of the python virtual |" "$MOONRAKER_ENV"/bin/pip install -r "$MR_REQ_TXT"
echo -e "| environment or downloading of additional packages. |" update_log_paths "moonraker"
blank_line
echo -e "| ${red}Check the docs in the Moonraker repository to see if${default} |" ### required due to https://github.com/Arksine/moonraker/issues/349
echo -e "| ${red}rebuilding is necessary (user_changes.md)!${default} |" moonraker_polkit
blank_line
echo -e "| 1) Update Moonraker (default) |"
echo -e "| 2) Update Moonraker + rebuild virtualenv/dependencies |"
quit_footer
read -p "${cyan}###### Please choose:${default} " action
case "$action" in
1|"")
echo -e "###### > Update Moonraker"
update_mr="true" && rebuild_env="false"
break;;
2)
echo -e "###### > Update Moonraker + rebuild virtualenv/dependencies"
update_mr="true" && rebuild_env="true"
break;;
Q|q)
clear; update_menu; break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
stop_moonraker; echo
if [[ $update_mr = "true" ]] && [[ $rebuild_env = "false" ]]; then
unset update_mr && unset rebuild_env
cd $MOONRAKER_DIR && git pull
fi
if [[ $update_mr = "true" ]] && [[ $rebuild_env = "true" ]]; then
unset update_mr && unset rebuild_env
cd $MOONRAKER_DIR && git pull && ./scripts/install-moonraker.sh -r
fi
#read printer.cfg location and patch /etc/default/klipper if entries don't match
locate_printer_cfg && patch_klipper_sysfile
ok_msg "Update complete!" ok_msg "Update complete!"
restart_moonraker do_action_service "restart" "moonraker"
} }
update_klipperscreen(){ update_klipperscreen(){
@@ -170,7 +303,7 @@ update_klipperscreen(){
cd $KLIPPERSCREEN_DIR cd $KLIPPERSCREEN_DIR
KLIPPERSCREEN_OLDREQ_MD5SUM=$(md5sum $KLIPPERSCREEN_DIR/scripts/KlipperScreen-requirements.txt | cut -d " " -f1) KLIPPERSCREEN_OLDREQ_MD5SUM=$(md5sum $KLIPPERSCREEN_DIR/scripts/KlipperScreen-requirements.txt | cut -d " " -f1)
git pull origin master -q && ok_msg "Fetch successfull!" git pull origin master -q && ok_msg "Fetch successfull!"
git checkout -f origin/master && ok_msg "Checkout successfull" git checkout -f master && ok_msg "Checkout successfull"
#KLIPPERSCREEN_NEWREQ_MD5SUM=$(md5sum $KLIPPERSCREEN_DIR/scripts/KlipperScreen-requirements.txt) #KLIPPERSCREEN_NEWREQ_MD5SUM=$(md5sum $KLIPPERSCREEN_DIR/scripts/KlipperScreen-requirements.txt)
if [[ $(md5sum $KLIPPERSCREEN_DIR/scripts/KlipperScreen-requirements.txt | cut -d " " -f1) != $KLIPPERSCREEN_OLDREQ_MD5SUM ]]; then if [[ $(md5sum $KLIPPERSCREEN_DIR/scripts/KlipperScreen-requirements.txt | cut -d " " -f1) != $KLIPPERSCREEN_OLDREQ_MD5SUM ]]; then
status_msg "New dependecies detected..." status_msg "New dependecies detected..."
@@ -181,3 +314,28 @@ update_klipperscreen(){
ok_msg "Update complete!" ok_msg "Update complete!"
start_klipperscreen start_klipperscreen
} }
update_pgc_for_klipper(){
PGC_DIR="${HOME}/pgcode"
status_msg "Updating PrettyGCode for Klipper ..."
cd $PGC_DIR && git pull
ok_msg "Update complete!"
}
update_MoonrakerTelegramBot(){
source_kiauh_ini
export klipper_cfg_loc
stop_MoonrakerTelegramBot
cd $MOONRAKER_TELEGRAM_BOT_DIR
git pull
./scripts/install.sh
ok_msg "Update complete!"
start_MoonrakerTelegramBot
}
update_system(){
status_msg "Updating System ..."
sudo apt-get update --allow-releaseinfo-change && sudo apt-get upgrade -y
CONFIRM_MSG="Update complete! Check the log above!\n ${yellow}KIAUH will not install any dist-upgrades or\n any packages which have been kept back!${green}"
print_msg && clear_msg
}

View File

@@ -37,44 +37,59 @@ accept_upload_conditions(){
} }
upload_selection(){ upload_selection(){
source_ini source_kiauh_ini
[ "$logupload_accepted" = "false" ] && accept_upload_conditions [ "$logupload_accepted" = "false" ] && accept_upload_conditions
KLIPPY_LOG=/tmp/klippy.log
MOONRAKER_LOG=/tmp/moonraker.log ### find all suitable logfiles for klipper
DWC2_LOG=/tmp/dwc2.log logfiles=()
klipper_logs="${HOME}/klipper_logs/klippy*.log"
moonraker_logs="${HOME}/klipper_logs/moonraker*.log"
if ls $klipper_logs 2>/dev/null 1>&2; then
for kl_log in $(find $klipper_logs); do
logfiles+=($kl_log)
done
fi
if ls $moonraker_logs 2>/dev/null 1>&2; then
for mr_log in $(find $moonraker_logs); do
logfiles+=($mr_log)
done
fi
if ls /tmp/dwc2*.log 2>/dev/null 1>&2; then
for dwc_log in $(find /tmp/dwc2*.log); do
logfiles+=($dwc_log)
done
fi
### draw interface
i=0
top_border top_border
echo -e "| ${yellow}~~~~~~~~~~~~~~~ [ Log Upload ] ~~~~~~~~~~~~~~${default} |" echo -e "| ${yellow}~~~~~~~~~~~~~~~ [ Log Upload ] ~~~~~~~~~~~~~~${default} |"
hr hr
echo -e "| You can choose the following files for uploading: |" echo -e "| You can choose the following files for uploading: |"
echo -e "| 1) klippy.log |" for log in ${logfiles[@]}; do
echo -e "| 2) moonraker.log |" printf "| $i) %-50s|\n" "${logfiles[$i]}"
echo -e "| 3) dwc2.log |" i=$((i + 1))
quit_footer done
back_footer
while true; do while true; do
read -p "${cyan}Please select:${default} " choice read -p "${cyan}Please select:${default} " choice
case "$choice" in if [ $choice = "b" ] || [ $choice = "B" ]; then
1) clear && main_menu && break
clear && print_header elif [ $choice -le ${#logfiles[@]} ]; then
upload_log "$KLIPPY_LOG" upload_log "${logfiles[$choice]}"
upload_selection upload_selection
;; else
2)
clear && print_header clear && print_header
upload_log "$MOONRAKER_LOG" ERROR_MSG="File not found!" && print_msg && clear_msg
upload_selection upload_selection
;; fi
3)
clear && print_header
upload_log "$DWC2_LOG"
upload_selection
;;
q | Q) clear; main_menu; break;;
esac
done done
} }
upload_log(){ upload_log(){
if [ -f "$1" ]; then if [ -f "$1" ]; then
clear && print_header
status_msg "Uploading $1 ..." status_msg "Uploading $1 ..."
LINK=$(curl -s --upload-file $1 'http://paste.c-net.org/') LINK=$(curl -s --upload-file $1 'http://paste.c-net.org/')
[ ! -z "$LINK" ] && ok_msg "$1 upload successfull!" [ ! -z "$LINK" ] && ok_msg "$1 upload successfull!"
@@ -83,7 +98,7 @@ upload_log(){
unset LINK unset LINK
else else
clear && print_header clear && print_header
ERROR_MSG="$1 not found!" && print_msg && clear_msg ERROR_MSG="File not found!" && print_msg && clear_msg
upload_selection upload_selection
fi fi
} }