Compare commits

..

99 Commits
v2 ... v3.0.0

Author SHA1 Message Date
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
35 changed files with 2659 additions and 2185 deletions

View File

@@ -12,24 +12,23 @@
This script acts as a helping hand for you to get set up in a fast and comfortable way.\ 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! 🧠**\ **This does not mean, it will relieve you of using your brain.exe! 🧠**\
Please also always pay attention to the individual component repositories (all linked below).\
Feel free to give it a try. If you have suggestions or encounter any problems, please report them. 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! 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 ./kiauh/kiauh.sh
chmod +x kiauh.sh scripts/*
./kiauh.sh
``` ```
## Additional Instructions: ## Additional Instructions:
@@ -43,11 +42,14 @@ Feel free to check out his work.
## **🧰 Functions and Features:** ## **🧰 Functions and Features:**
- **New in v3.0** You can now install multiple instances (Klipper/Moonraker/DWC/Octoprint) on the same Pi!
---
### **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 different 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,8 +58,7 @@ 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)**
@@ -67,13 +68,18 @@ Feel free to check out his work.
## **📝 Notes:** ## **📝 Notes:**
- Tested **only** on Raspberry Pi OS Lite (Debian Buster) - Tested **only** on Raspberry Pi OS Lite (Debian Buster)
- ( Although similar Debian based distributions might also work... )
- 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, please check out the appropriate repositories listed below: 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).
For more information or instructions to the various components KIAUH can install, please check out the corresponding repositories listed below:
--- ---
@@ -135,6 +141,6 @@ https://github.com/OctoPrint/OctoPrint
## **❓ FAQ** ## **❓ FAQ**
**_Q: Can i use this script to install multiple instancec of Klipper on the same Pi? (Multisession?)_** **_Q: Can i use this script to install multiple instances 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. **A:** Yes, it is finally possible 🙂

View File

@@ -2,6 +2,60 @@
This document covers possible important changes to KIAUH. This document covers possible important changes to KIAUH.
### 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

@@ -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,17 +32,14 @@ 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_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
#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
@@ -75,7 +67,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

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

@@ -0,0 +1,60 @@
#########################################################################################
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ AUTOCREATED WITH KIAUH ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #
#########################################################################################
# Those are the recommended macros and config entries if you use Mainsail or Fluidd! #
# Feel free to edit or delete those macros if you already have them defined 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
# change this if you need more or less extrusion
variable_extrude: 1.0
gcode:
##### read E from pause macro #####
{% set E = printer["gcode_macro PAUSE"].extrude|float %}
##### set park positon for x and y #####
# default is your max posion from your printer.cfg
{% set x_park = printer.toolhead.axis_maximum.x|float - 5.0 %}
{% set y_park = printer.toolhead.axis_maximum.y|float - 5.0 %}
##### calculate save lift position #####
{% set max_z = printer.toolhead.axis_maximum.z|float %}
{% set act_z = printer.toolhead.position.x|float %}
{% if act_z < (max_z - 2.0) %}
{% set z_safe = 2.0 %}
{% 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} F900
G90
G1 X{x_park} Y{y_park} F6000
[gcode_macro RESUME]
rename_existing: BASE_RESUME
gcode:
##### read E from pause macro #####
{% set E = printer["gcode_macro PAUSE"].extrude|float %}
##### end of definitions #####
G91
G1 E{E} F2100
RESTORE_GCODE_STATE NAME=PAUSE_state
BASE_RESUME
#########################################################################################
#########################################################################################

View File

@@ -0,0 +1,59 @@
# /etc/nginx/sites-available/<<UI>>
server {
listen 80;
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/x-javascript application/json application/xml;
#web_path from <<UI>> static files
root /home/pi/<<UI>>;
index index.html;
server_name _;
#max upload size for gcodes (0 = no limit)
client_max_body_size 0;
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_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,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 +0,0 @@
[server]
host: 0.0.0.0
port: 7125
enable_debug_logging: True
config_path: ~/klipper_config
[authorization]
enabled: True
trusted_clients:
127.0.0.1

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

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

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,76 @@ 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
}
###TODO re-evaluate if this function is still needed (just backup the full klipper_config dir instead?)
backup_moonraker_conf(){
check_for_backup_dir
if [ -f ${HOME}/moonraker.conf ]; then
get_date
status_msg "Timestamp: $current_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
}
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 +136,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

View File

@@ -11,130 +11,243 @@ 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(){ ###? if path was changed in 'change_klipper_cfg_path', we need to edit the service files
status_msg "Starting Klipper Service ..." ###? and set the new path. after that, rename the old folder and reload service units.
sudo systemctl start klipper && ok_msg "Klipper Service started!" ###! users shouldn't try and move the files into subfolders with this function! as the mv command will fail
###! but the new path still gets written to the service files. if they really need to, they need to move all
###! config files or printer folder into that subfolder (still not recommended!)
set_klipper_cfg_path(){
### stop services
klipper_service "stop" && moonraker_service "stop"
### rename the klipper config folder
if [ ! -z "$old_klipper_cfg_loc" ] && [ -d "$old_klipper_cfg_loc" ]; then
status_msg "Renaming '$old_klipper_cfg_loc' to '$new_klipper_cfg_loc'!"; echo
mv -v "$old_klipper_cfg_loc" "$new_klipper_cfg_loc" && ok_msg "Done!"
fi
### handle single klipper instance service file
if [ -f /etc/systemd/system/klipper.service ]; then
status_msg "Configuring Klipper for new path ..."
sudo sed -i "/ExecStart=/ s|$old_klipper_cfg_loc/printer.cfg|$new_klipper_cfg_loc/printer.cfg|" /etc/systemd/system/klipper.service
ok_msg "OK!"
fi
### handle multi klipper instance service file
if ls /etc/systemd/system/klipper-*.service 2>/dev/null 1>&2; then
status_msg "Configuring Klipper for new path ..."
for service in $(find /etc/systemd/system/klipper-*.service); do
sudo sed -i "/ExecStart=/ s|$old_klipper_cfg_loc/printer_|$new_klipper_cfg_loc/printer_|" $service
done
ok_msg "OK!"
fi
### handle single moonraker instance service and moonraker.conf file
if [ -f /etc/systemd/system/moonraker.service ]; then
status_msg "Configuring Moonraker for new path ..."
sudo sed -i "/ExecStart=/ s|$old_klipper_cfg_loc/moonraker.conf|$new_klipper_cfg_loc/moonraker.conf|" /etc/systemd/system/moonraker.service
### replace old file path with new one in moonraker.conf
sed -i "/config_path:/ s|config_path:.*|config_path: $new_klipper_cfg_loc|" $new_klipper_cfg_loc/moonraker.conf
ok_msg "OK!"
fi
### handle multi moonraker instance service file
if ls /etc/systemd/system/moonraker-*.service 2>/dev/null 1>&2; then
status_msg "Configuring Moonraker for new path ..."
for service in $(find /etc/systemd/system/moonraker-*.service); do
sudo sed -i "/ExecStart=/ s|$old_klipper_cfg_loc/printer_|$new_klipper_cfg_loc/printer_|" $service
done
### replace old file path with new one in moonraker.conf
for moonraker_conf in $(find $new_klipper_cfg_loc/printer_*/moonraker.conf); do
loc=$(echo "$moonraker_conf" | rev | cut -d"/" -f2- | rev)
sed -i "/config_path:/ s|config_path:.*|config_path: $loc|" $moonraker_conf
done
ok_msg "OK!"
fi
### reloading units
sudo systemctl daemon-reload
### restart services
klipper_service "restart" && moonraker_service "restart"
} }
stop_klipper(){ source_kiauh_ini(){
status_msg "Stopping Klipper Service ..." source $INI_FILE
sudo systemctl stop klipper && ok_msg "Klipper Service stopped!"
} }
restart_klipper(){ klipper_service(){
status_msg "Restarting Klipper Service ..." ### set a variable for the ok and status messages
sudo systemctl restart klipper && ok_msg "Klipper Service restarted!" [ "$1" == "start" ] && ACTION1="started" && ACTION2="Starting"
} [ "$1" == "stop" ] && ACTION1="stopped" && ACTION2="Stopping"
[ "$1" == "restart" ] && ACTION1="restarted" && ACTION2="Restarting"
start_dwc(){ if ls /etc/systemd/system/klipper-*.service 2>/dev/null 1>&2; then
status_msg "Starting DWC-for-Klipper-Socket Service ..." INSTANCE_COUNT=$(systemctl list-units --full -all -t service --no-legend | grep -E "klipper-[[:digit:]].service" | wc -l)
sudo systemctl start dwc && ok_msg "DWC-for-Klipper-Socket Service started!" INSTANCE=1
} status_msg "$ACTION2 $INSTANCE_COUNT Klipper Services ..."
while [ $INSTANCE -le $INSTANCE_COUNT ]; do
stop_dwc(){ sudo systemctl $1 klipper-$INSTANCE && ok_msg "Klipper Service #$INSTANCE $ACTION1!"
status_msg "Stopping DWC-for-Klipper-Socket Service ..." ### instance counter +1
sudo systemctl stop dwc && ok_msg "DWC-for-Klipper-Socket Service stopped!" INSTANCE=$(expr $INSTANCE + 1)
} done
elif [ "$(systemctl list-units --full -all -t service --no-legend | grep -E "klipper.service")" ]; then
start_moonraker(){ status_msg "$ACTION2 Klipper Service ..."
status_msg "Starting Moonraker Service ..." sudo systemctl $1 klipper && ok_msg "Klipper Service $ACTION1!"
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
} }
disable_octoprint(){ moonraker_service(){
if [ "$DISABLE_OPRINT" = "true" ]; then ### set a variable for the ok and status messages
disable_octoprint_service [ "$1" == "start" ] && ACTION1="started" && ACTION2="Starting"
[ "$1" == "stop" ] && ACTION1="stopped" && ACTION2="Stopping"
[ "$1" == "restart" ] && ACTION1="restarted" && ACTION2="Restarting"
if ls /etc/systemd/system/moonraker-*.service 2>/dev/null 1>&2; then
INSTANCE_COUNT=$(systemctl list-units --full -all -t service --no-legend | grep -E "moonraker-[[:digit:]].service" | wc -l)
INSTANCE=1
status_msg "$ACTION2 $INSTANCE_COUNT Moonraker Services ..."
while [ $INSTANCE -le $INSTANCE_COUNT ]; do
sudo systemctl $1 moonraker-$INSTANCE && ok_msg "Moonraker Service #$INSTANCE $ACTION1!"
### instance counter +1
INSTANCE=$(expr $INSTANCE + 1)
done
elif [ "$(systemctl list-units --full -all -t service --no-legend | grep -E "moonraker.service")" ]; then
status_msg "$ACTION2 Moonraker Service ..."
sudo systemctl $1 moonraker && ok_msg "Moonraker Service $ACTION1!"
fi fi
} }
disable_octoprint_service(){ dwc_service(){
if [[ -f $OCTOPRINT_SERVICE1 && -f $OCTOPRINT_SERVICE2 ]]; then ### set a variable for the ok and status messages
status_msg "OctoPrint Service is enabled! Disabling now ..." [ "$1" == "start" ] && ACTION1="started" && ACTION2="Starting"
sudo systemctl stop octoprint && sudo systemctl disable octoprint -q [ "$1" == "stop" ] && ACTION1="stopped" && ACTION2="Stopping"
[ "$1" == "restart" ] && ACTION1="restarted" && ACTION2="Restarting"
if ls /etc/systemd/system/dwc-*.service 2>/dev/null 1>&2; then
INSTANCE_COUNT=$(systemctl list-units --full -all -t service --no-legend | grep -E "dwc-[[:digit:]].service" | wc -l)
INSTANCE=1
status_msg "$ACTION2 $INSTANCE_COUNT DWC-for-Klipper-Socket Services ..."
while [ $INSTANCE -le $INSTANCE_COUNT ]; do
sudo systemctl $1 dwc-$INSTANCE && ok_msg "DWC-for-Klipper-Socket Service #$INSTANCE $ACTION1!"
### instance counter +1
INSTANCE=$(expr $INSTANCE + 1)
done
elif [ "$(systemctl list-units --full -all -t service --no-legend | grep -E "dwc.service")" ]; then
status_msg "$ACTION2 DWC-for-Klipper-Socket Service ..."
sudo systemctl $1 dwc && ok_msg "DWC-for-Klipper-Socket Service $ACTION1!"
fi
}
octoprint_service(){
### 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 /etc/systemd/system/octoprint-*.service 2>/dev/null 1>&2; then
INSTANCE=1
INSTANCE_COUNT=$(systemctl list-unit-files | grep -E "octoprint.*" | wc -l)
status_msg "$ACTION2 $INSTANCE_COUNT OctoPrint Services ..."
while [ $INSTANCE -le $INSTANCE_COUNT ]; do
sudo systemctl $1 octoprint-$INSTANCE && ok_msg "OctoPrint Service #$INSTANCE $ACTION1!"
### instance counter +1
INSTANCE=$(expr $INSTANCE + 1)
done
elif [ "$(systemctl list-unit-files | grep -E "octoprint.*")" ]; then
status_msg "$ACTION2 OctoPrint Service ..."
sudo systemctl $1 octoprint && ok_msg "OctoPrint Service $ACTION1!"
fi fi
} }
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 octoprint_service "stop"
disable_octoprint_service octoprint_service "disable"
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 octoprint_service "enable"
sleep 2 octoprint_service "start"
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 systemctl list-unit-files | grep -E "octoprint*" | grep "enabled" &>/dev/null; then
else
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
} }
@@ -155,8 +268,8 @@ restart_klipperscreen(){
restart_nginx(){ restart_nginx(){
if [ "$(systemctl list-units --full -all -t service --no-legend | grep -F "nginx.service")" ]; then if [ "$(systemctl list-units --full -all -t service --no-legend | grep -F "nginx.service")" ]; 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
} }
@@ -252,27 +365,49 @@ setup_gcode_shell_command(){
} }
install_gcode_shell_command(){ install_gcode_shell_command(){
stop_klipper klipper_service "stop"
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 echo
while true; do while true; do
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 klipper_service "restart"
} }
create_minimal_cfg(){ create_minimal_cfg(){
@@ -331,22 +466,6 @@ write_printer_cfg(){
if [ "$DISPLAY_STATUS" = "false" ] && [[ ! $(grep '^\[display_status]$' $KIAUH_CFG) ]]; then if [ "$DISPLAY_STATUS" = "false" ] && [[ ! $(grep '^\[display_status]$' $KIAUH_CFG) ]]; then
echo -e "\n[display_status]" >> $KIAUH_CFG echo -e "\n[display_status]" >> $KIAUH_CFG
fi 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 #including the kiauh.cfg into printer.cfg if not already done
if [ ! "$(grep '^\[include kiauh\.cfg\]$' $PRINTER_CFG)" ] && [ "$EDIT_CFG" = "true" ]; then if [ ! "$(grep '^\[include kiauh\.cfg\]$' $PRINTER_CFG)" ] && [ "$EDIT_CFG" = "true" ]; then
status_msg "Writing [include kiauh.cfg] to printer.cfg ..." status_msg "Writing [include kiauh.cfg] to printer.cfg ..."
@@ -356,6 +475,10 @@ EOF
} }
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 +497,8 @@ 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
} }

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_haproxy_lighttpd_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,43 +103,54 @@ 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
status_msg "Downloading DWC2-for-Klipper-Socket ..."
cd ${HOME} && git clone $DWC2FK_REPO cd ${HOME} && git clone $DWC2FK_REPO
ok_msg "DWC2-for-Klipper successfully cloned!" ok_msg "Download complete!"
#copy installers from kiauh srcdir to dwc-for-klipper-socket
status_msg "Copy installers to $DWC2FK_DIR" ### step 2: install dwc2 dependencies and create python virtualenv
cp -r ${SRCDIR}/kiauh/scripts/dwc2-for-klipper-socket-installer $DWC2FK_DIR/scripts status_msg "Installing dependencies ..."
ok_msg "Done!" install_dwc_packages
status_msg "Starting service-installer ..." create_dwc_virtualenv
if [ "$INST_DWC2_INITD" = "true" ]; then
$DWC2FK_DIR/scripts/install-octopi.sh ### step 3: create dwc2.cfg folder and dwc2.cfg
elif [ "$INST_DWC2_SYSTEMD" = "true" ]; then [ ! -d $DWC_CONF_LOC ] && mkdir -p $DWC_CONF_LOC
$DWC2FK_DIR/scripts/install-debian.sh 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
@@ -176,103 +158,233 @@ download_dwc2_webui(){
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
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,177 +1,342 @@
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"
KLIPPER_DIR="${HOME}/klipper"
klipper_setup_dialog(){
status_msg "Initializing Klipper installation ..."
### 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="At least one Klipper service is already installed!\n Please remove Klipper first, before installing it again." && return 0
fi
### initial printer.cfg path check
check_klipper_cfg_path
### ask for amount of instances to create
while true; do
echo
read -p "${cyan}###### How many Klipper instances do you want to set up?:${default} " INSTANCE_COUNT
echo
if [ $INSTANCE_COUNT == 1 ]; then
read -p "${cyan}###### Create $INSTANCE_COUNT single instance? (Y/n):${default} " yn
else
read -p "${cyan}###### Create $INSTANCE_COUNT instances? (Y/n):${default} " yn
fi
case "$yn" in
Y|y|Yes|yes|"")
echo -e "###### > Yes"
status_msg "Creating $INSTANCE_COUNT Klipper instances ..."
klipper_setup
break;;
N|n|No|no)
echo -e "###### > No"
warn_msg "Exiting Klipper setup ..."
echo
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
}
install_klipper_packages(){
### Packages for python cffi
PKGLIST="python-virtualenv virtualenv python-dev libffi-dev build-essential"
### kconfig requirements
PKGLIST="${PKGLIST} libncurses-dev"
### hub-ctrl
PKGLIST="${PKGLIST} libusb-dev"
### AVR chip installation and building
PKGLIST="${PKGLIST} avrdude gcc-avr binutils-avr avr-libc"
### ARM chip installation and building
PKGLIST="${PKGLIST} stm32flash libnewlib-arm-none-eabi"
PKGLIST="${PKGLIST} gcc-arm-none-eabi binutils-arm-none-eabi libusb-1.0"
### dbus requirement for DietPi
PKGLIST="${PKGLIST} dbus"
### Update system package info
status_msg "Running apt-get update..."
sudo apt-get update
### Install desired packages
status_msg "Installing packages..."
sudo apt-get install --yes ${PKGLIST}
}
create_klipper_virtualenv(){
status_msg "Installing python virtual environment..."
# Create virtualenv if it doesn't already exist
[ ! -d ${KLIPPY_ENV} ] && virtualenv -p python2 ${KLIPPY_ENV}
# Install/update dependencies
${KLIPPY_ENV}/bin/pip install -r ${KLIPPER_DIR}/scripts/klippy-requirements.txt
}
create_single_klipper_startscript(){
### create systemd service file
sudo /bin/sh -c "cat > $SYSTEMDDIR/klipper.service" << SINGLE_STARTSCRIPT
#Systemd service file for klipper
[Unit]
Description=Starts klipper on startup
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
User=$USER
RemainAfterExit=yes
ExecStart=${KLIPPY_ENV}/bin/python ${KLIPPER_DIR}/klippy/klippy.py ${PRINTER_CFG} -l ${KLIPPER_LOG} -a ${KLIPPY_UDS}
Restart=always
RestartSec=10
SINGLE_STARTSCRIPT
}
create_multi_klipper_startscript(){
### create multi instance systemd service file
sudo /bin/sh -c "cat > $SYSTEMDDIR/klipper-$INSTANCE.service" << MULTI_STARTSCRIPT
#Systemd service file for klipper
[Unit]
Description=Starts klipper instance $INSTANCE on startup
After=network.target
[Install]
WantedBy=multi-user.target
[Service]
Type=simple
User=$USER
RemainAfterExit=yes
ExecStart=${KLIPPY_ENV}/bin/python ${KLIPPER_DIR}/klippy/klippy.py ${PRINTER_CFG} -I ${TMP_PRINTER} -l ${KLIPPER_LOG} -a ${KLIPPY_UDS}
Restart=always
RestartSec=10
MULTI_STARTSCRIPT
}
create_minimal_printer_cfg(){
/bin/sh -c "cat > $1" << MINIMAL_CFG
[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
MINIMAL_CFG
}
klipper_setup(){
### get printer config directory
source_kiauh_ini
PRINTER_CFG_LOC="$klipper_cfg_loc"
### clone klipper
cd ${HOME}
status_msg "Downloading Klipper ..."
[ -d $KLIPPER_DIR ] && rm -rf $KLIPPER_DIR
git clone $KLIPPER_REPO
status_msg "Download complete!"
### install klipper dependencies and create python virtualenv
status_msg "Installing dependencies ..."
install_klipper_packages
create_klipper_virtualenv
### create shared gcode_files folder
[ ! -d ${HOME}/gcode_files ] && mkdir -p ${HOME}/gcode_files
### create shared config folder
[ ! -d $PRINTER_CFG_LOC ] && mkdir -p $PRINTER_CFG_LOC
### create klipper instances
INSTANCE=1
if [ $INSTANCE_COUNT -eq $INSTANCE ]; then
create_single_klipper_instance
else else
get_user_selections_klipper create_multi_klipper_instance
klipper_setup
build_fw
flash_mcu
write_printer_usb
fi fi
} }
get_user_selections_klipper(){ create_single_klipper_instance(){
status_msg "Initializing Klipper installation ..." status_msg "Setting up 1 Klipper instance ..."
#let user choose to install systemd or init.d service
### single instance variables
KLIPPER_LOG=/tmp/klippy.log
KLIPPY_UDS=/tmp/klippy_uds
PRINTER_CFG="$PRINTER_CFG_LOC/printer.cfg"
### create instance
status_msg "Creating single Klipper instance ..."
status_msg "Installing system start script ..."
create_single_klipper_startscript
### create printer config directory if missing
[ ! -d $PRINTER_CFG_LOC ] && mkdir -p $PRINTER_CFG_LOC
### create basic configs if missing
[ ! -f $PRINTER_CFG ] && create_minimal_printer_cfg "$PRINTER_CFG"
### enable instance
sudo systemctl enable klipper.service
ok_msg "Single Klipper instance created!"
### launching instance
status_msg "Launching Klipper instance ..."
sudo systemctl start klipper
### confirm message
CONFIRM_MSG="Single Klipper instance has been set up!"
print_msg && clear_msg
}
create_multi_klipper_instance(){
status_msg "Setting up $INSTANCE_COUNT instances of Klipper ..."
while [ $INSTANCE -le $INSTANCE_COUNT ]; do
### multi instance variables
KLIPPER_LOG=/tmp/klippy-$INSTANCE.log
KLIPPY_UDS=/tmp/klippy_uds-$INSTANCE
TMP_PRINTER=/tmp/printer-$INSTANCE
PRINTER_CFG="$PRINTER_CFG_LOC/printer_$INSTANCE/printer.cfg"
### create instance
status_msg "Creating instance #$INSTANCE ..."
create_multi_klipper_startscript
### create printer config directory if missing
[ ! -d $PRINTER_CFG_LOC/printer_$INSTANCE ] && mkdir -p $PRINTER_CFG_LOC/printer_$INSTANCE
### create basic configs if missing
[ ! -f $PRINTER_CFG ] && create_minimal_printer_cfg "$PRINTER_CFG"
### enable instance
sudo systemctl enable klipper-$INSTANCE.service
ok_msg "Klipper instance $INSTANCE created!"
### launching instance
status_msg "Launching Klipper instance $INSTANCE ..."
sudo systemctl start klipper-$INSTANCE
### instance counter +1
INSTANCE=$(expr $INSTANCE + 1)
done
### confirm message
CONFIRM_MSG="$INSTANCE_COUNT Klipper instances have been set up!"
print_msg && clear_msg
}
##############################################################################################
#********************************************************************************************#
##############################################################################################
flash_routine(){
echo
top_border
echo -e "| ${red}~~~~~~~~~~~ [ ATTENTION! ] ~~~~~~~~~~~~${default} |"
hr
echo -e "| Flashing a Smoothie based board with this script will |"
echo -e "| certainly fail. This applies to boards like the BTT |"
echo -e "| SKR V1.3 or SKR V1.4(Turbo). You have to copy the |"
echo -e "| firmware file to the microSD card manually and rename |"
echo -e "| it to 'firmware.bin'. |"
hr
echo -e "| You can find the file in: ~/klipper/out/klipper.bin |"
bottom_border
while true; do while true; do
echo read -p "${cyan}###### Do you want to continue? (Y/n):${default} " yn
top_border case "$yn" in
echo -e "| Do you want to install Klipper as: |" Y|y|Yes|yes|"")
echo -e "| 1) Init.d Service (default) |" echo -e "###### > Yes"
echo -e "| 2) Systemd Service |" get_mcu_id
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;; break;;
2) N|n|No|no)
echo -e "###### > 2) Systemd" echo -e "###### > No"
INST_KLIPPER_INITD="false"
INST_KLIPPER_SYSTEMD="true"
break;; break;;
*) *)
print_unkown_cmd print_unkown_cmd
print_msg && clear_msg;; print_msg && clear_msg;;
esac esac
done 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(){ flash_mcu(){
#check for dependencies if [ ${#mcu_list[@]} -ge 1 ]; then
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(){
if [ "$FLASH_FIRMWARE" = "true" ]; then
echo
top_border top_border
echo -e "| ${red}~~~~~~~~~~~ [ ATTENTION! ] ~~~~~~~~~~~~${default} |" echo -e "| ${red}!!! IMPORTANT WARNING !!!${default} |"
hr hr
echo -e "| Flashing a Smoothie based board with this script will |" echo -e "| Make sure, that you select the correct ID for the MCU |"
echo -e "| certainly fail. This applies to boards like the BTT |" echo -e "| you have build the firmware for in the previous step! |"
echo -e "| SKR V1.3 or SKR V1.4(Turbo). You have to copy the |" blank_line
echo -e "| firmware file to the microSD card manually and rename |" echo -e "| This is especially important if you use different MCU |"
echo -e "| it to 'firmware.bin'. |" echo -e "| models which each require their own firmware! |"
hr blank_line
echo -e "| You can find the file in: ~/klipper/out/klipper.bin |" echo -e "| ${red}ONLY flash a firmware created for the respective MCU!${default} |"
bottom_border bottom_border
### list all mcus
i=1
for mcu in ${mcu_list[@]}; do
echo -e "$i) ${cyan}$mcu${default}"
i=$(expr $i + 1)
done
while true; do while true; do
read -p "${cyan}###### Do you want to continue? (Y/n):${default} " yn echo
case "$yn" in read -p "${cyan}###### Please select the ID for flashing:${default} " selected_id
Y|y|Yes|yes|"") mcu_index=$(echo $((selected_id - 1)))
echo -e "###### > Yes" echo -e "\nYou have selected to flash:\n● MCU #$selected_id: ${mcu_list[$mcu_index]}\n"
CONFIRM_FLASHING="true" while true; do
CONFIRM_WRITE_PRINTER_USB="true" read -p "${cyan}###### Do you want to continue? (Y/n):${default} " yn
get_printer_usb case "$yn" in
break;; Y|y|Yes|yes|"")
N|n|No|no) echo -e "###### > Yes"
echo -e "###### > No" status_msg "Flashing ${mcu_list[$mcu_index]} ..."
CONFIRM_FLASHING="false" klipper_service "stop"
CONFIRM_WRITE_PRINTER_USB="false" if ! make flash FLASH_DEVICE="${mcu_list[$mcu_index]}" ; then
break;; warn_msg "Flashing failed!"
*) warn_msg "Please read the console output above!"
print_unkown_cmd else
print_msg && clear_msg;; ok_msg "Flashing successfull!"
esac fi
klipper_service "start"
break;;
N|n|No|no)
echo -e "###### > No"
break;;
*)
print_unkown_cmd
print_msg && clear_msg;;
esac
done
break
done done
fi 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
start_klipper
fi
}
build_fw(){ build_fw(){
if [ "$BUILD_FIRMWARE" = "true" ]; then if [ -d $KLIPPER_DIR ]; then
if [ -d $KLIPPER_DIR ]; then cd $KLIPPER_DIR
cd $KLIPPER_DIR status_msg "Initializing firmware Setup ..."
status_msg "Initializing Firmware Setup ..." make menuconfig
make menuconfig status_msg "Building firmware ..."
status_msg "Building Firmware ..." make clean && make && ok_msg "Firmware built!"
make clean && make && ok_msg "Firmware built!" else
else warn_msg "Can not build firmware without a Klipper directory!"
warn_msg "Can not build Firmware without a Klipper directory!"
fi
fi fi
} }
### grab the printers id ### grab the mcu id
get_printer_usb(){ get_mcu_id(){
echo echo
top_border top_border
echo -e "| Please make sure your printer is connected to the Pi! |" echo -e "| Please make sure your MCU is connected to the Pi! |"
echo -e "| If the printer is not connected yet, connect it now. |" echo -e "| If the MCU 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 bottom_border
while true; do while true; do
echo -e "${cyan}" echo -e "${cyan}"
@@ -179,70 +344,28 @@ get_printer_usb(){
echo -e "${default}" echo -e "${default}"
case "$yn" in case "$yn" in
*) *)
CONFIRM_PRINTER_USB="true"
break;; break;;
esac esac
done done
status_msg "Identifying the correct USB port ..." status_msg "Identifying the ID of your MCU ..."
sleep 2 sleep 2
unset PRINTER_USB unset MCU_ID
if [ -e /dev/serial/by-id/* ]; then ### if there are devices found, continue, else show warn message
if [ -e /dev/serial/by-id/* ]; then if ls /dev/serial/by-id/* 2>/dev/null 1>&2; then
PRINTER_USB=$(ls /dev/serial/by-id/*) mcu_count=1
status_msg "The ID of your printer is:" mcu_list=()
title_msg "$PRINTER_USB" status_msg "The ID of your printers MCU is:"
else ### loop over the IDs, write every ID as an item of the array 'mcu_list'
warn_msg "Could not retrieve ID!" for mcu in /dev/serial/by-id/*; do
fi declare "mcu_id_$mcu_count"="$mcu"
elif [ -e /dev/serial/by-path/* ]; then mcu_id="mcu_id_$mcu_count"
if [ -e /dev/serial/by-path/* ]; then mcu_list+=("${!mcu_id}")
PRINTER_USB=$(ls /dev/serial/by-path/*) echo " ● MCU #$mcu_count: ${cyan}$mcu${default}"
status_msg "The path of your printer is:" mcu_count=$(expr $mcu_count + 1)
title_msg "$PRINTER_USB" done
else unset mcu_count
warn_msg "Could not retrieve path!"
fi
else else
warn_msg "Could not retrieve ID!"
warn_msg "Printer not plugged in or not detectable!" warn_msg "Printer not plugged in or not detectable!"
fi
}
write_printer_usb(){
locate_printer_cfg
if [ ! -z "$PRINTER_CFG" ] && [ "$CONFIRM_WRITE_PRINTER_USB" = "true" ]; then
SERIAL_OLD=$(grep "serial" $PRINTER_CFG | tail -1 | cut -d" " -f2)
SERIAL_NEW=$PRINTER_USB
if [ "$SERIAL_OLD" != "$SERIAL_NEW" ]; then
unset write_entries
backup_printer_cfg
write_entries+=("[mcu]\nserial: $SERIAL_NEW")
write_entries+=("\\\n############################\n##### CREATED BY KIAUH #####\n############################")
write_entries=("############################\n" "${write_entries[@]}")
#check for a SAVE_CONFIG entry
SC="#*# <---------------------- SAVE_CONFIG ---------------------->"
if [[ $(grep "$SC" $PRINTER_CFG) ]]; then
SC_LINE=$(grep -n "$SC" $PRINTER_CFG | cut -d ":" -f1)
PRE_SC_LINE=$(expr $SC_LINE - 1)
SC_ENTRY="true"
else
SC_ENTRY="false"
fi
status_msg "Writing printer ID/path to printer.cfg ..."
if [ "$SC_ENTRY" = "true" ]; then
PRE_SC_LINE="$(expr $SC_LINE - 1)a"
for entry in "${write_entries[@]}"
do
sed -i "$PRE_SC_LINE $entry" $PRINTER_CFG
done
fi
if [ "$SC_ENTRY" = "false" ]; then
LINE_COUNT="$(wc -l < $PRINTER_CFG)a"
for entry in "${write_entries[@]}"
do
sed -i "$LINE_COUNT $entry" $PRINTER_CFG
done
fi
ok_msg "Done!"
fi
fi fi
} }

View File

@@ -1,36 +1,41 @@
check_moonraker(){ check_moonraker(){
status_msg "Checking for Moonraker service ..." status_msg "Checking for Moonraker service ..."
if [ "$(systemctl list-units --full -all -t service --no-legend | grep -F "moonraker.service")" ]; then if [ "$(systemctl list-units --full -all -t service --no-legend | grep -F "moonraker.service")" ] || [ "$(systemctl list-units --full -all -t service --no-legend | grep -E "moonraker-[[:digit:]].service")" ]; then
ok_msg "Moonraker service found!"; echo moonraker_chk_ok="true"
MOONRAKER_SERVICE_FOUND="true"
else else
warn_msg "Moonraker service not found!" moonraker_chk_ok="false"
warn_msg "Please install Moonraker first!"; echo
MOONRAKER_SERVICE_FOUND="false"
fi fi
} }
get_user_selection_webui(){ get_user_selection_kiauh_macros(){
#ask user for webui default macros #ask user for webui default macros
while true; do while true; do
unset ADD_WEBUI_MACROS unset ADD_KIAUH_MACROS
echo echo
top_border top_border
echo -e "| It is recommended to have some important macros to |" echo -e "| It is recommended to have some important macros set |"
echo -e "| have full functionality of the web interface. |" echo -e "| up in your printer configuration to have $1|"
echo -e "| fully functional and working. |"
blank_line blank_line
echo -e "| If you do not have such macros, you can choose to |" echo -e "| Those macros are: |"
echo -e "| install the suggested default macros now. |" echo -e "| ${cyan}● [gcode_macro PAUSE]${default} |"
echo -e "| ${cyan}● [gcode_macro RESUME]${default} |"
echo -e "| ${cyan}● [gcode_macro CANCEL_PRINT]${default} |"
blank_line
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 bottom_border
read -p "${cyan}###### Add the recommended macros? (Y/n):${default} " yn read -p "${cyan}###### Add the recommended macros? (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" ADD_KIAUH_MACROS="true"
break;; break;;
N|n|No|no) N|n|No|no)
echo -e "###### > No" echo -e "###### > No"
ADD_WEBUI_MACROS="false" ADD_KIAUH_MACROS="false"
break;; break;;
*) *)
print_unkown_cmd print_unkown_cmd
@@ -39,56 +44,71 @@ get_user_selection_webui(){
done done
} }
install_mainsail(){ install_webui(){
get_user_selection_webui ### check if moonraker is already installed
#check if moonraker is already installed
check_moonraker check_moonraker
if [ "$MOONRAKER_SERVICE_FOUND" = "true" ]; then
#check for other enabled web interfaces [ $1 == "mainsail" ] && IF_NAME1="Mainsail" && IF_NAME2="Mainsail "
unset SET_LISTEN_PORT [ $1 == "fluidd" ] && IF_NAME1="Fluidd" && IF_NAME2="Fluidd "
detect_enabled_sites
#check if another site already listens to port 80 ### exit mainsail/fluidd setup if moonraker not found
mainsail_port_check if [ $moonraker_chk_ok = "false" ]; then
#creating the mainsail nginx cfg ERROR_MSG="Moonraker service not found!\n Please install Moonraker first!"
set_nginx_cfg "mainsail" print_msg && clear_msg && return 0
#test_nginx "$SET_LISTEN_PORT" else
locate_printer_cfg && read_printer_cfg "mainsail" ok_msg "Moonraker service found!"
install_webui_macros status_msg "Initializing $IF_NAME1 installation ..."
mainsail_setup
fi fi
### 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 the recommended webinterface macros
get_user_selection_kiauh_macros "$IF_NAME2"
### creating the mainsail/fluidd nginx cfg
set_nginx_cfg "$1"
### copy the kiauh_macros.cfg to the config location
install_kiauh_macros
### install mainsail/fluidd
$1_setup
} }
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" cp ${SRCDIR}/kiauh/resources/kiauh_macros.cfg $path
locate_printer_cfg && read_printer_cfg "fluidd" ok_msg "$path/kiauh_macros.cfg created!"
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 fi
} done
### handle single printer.cfg
install_webui_macros(){ elif [ -f $klipper_cfg_loc/printer.cfg ] && [ ! -f $klipper_cfg_loc/kiauh_macros.cfg ]; then
#copy webui_macros.cfg ### copy kiauh_macros.cfg to config location
if [ "$ADD_WEBUI_MACROS" = "true" ]; then cp ${SRCDIR}/kiauh/resources/kiauh_macros.cfg $klipper_cfg_loc
status_msg "Create webui_macros.cfg ..." ok_msg "$klipper_cfg_loc/kiauh_macros.cfg created!"
if [ ! -f ${HOME}/klipper_config/webui_macros.cfg ]; then ### write the include to the very first line of the printer.cfg
cp ${HOME}/kiauh/resources/webui_macros.cfg ${HOME}/klipper_config sed -i "1 i [include kiauh_macros.cfg]" $klipper_cfg_loc/printer.cfg
ok_msg "File created!"
else
warn_msg "File already exists! Skipping ..."
fi fi
### restart klipper service to parse the modified printer.cfg
klipper_service "restart"
fi fi
write_printer_cfg
} }
mainsail_port_check(){ mainsail_port_check(){
@@ -103,7 +123,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 +144,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 +166,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 +198,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 +218,60 @@ 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 https://api.github.com/repositories/240875926/releases | 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 https://api.github.com/repositories/295836951/releases | 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 https://api.github.com/repositories/240875926/releases | grep browser_download_url | cut -d'"' -f4 | head -1)
#clean up an existing mainsail folder
### remove existing and create fresh mainsail folder, then download mainsail
[ -d $MAINSAIL_DIR ] && rm -rf $MAINSAIL_DIR [ -d $MAINSAIL_DIR ] && rm -rf $MAINSAIL_DIR
#create fresh mainsail folder and download mainsail
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* | wc -l) -gt 1 ]; then
enable_mainsail_remotemode
fi
ok_msg "Mainsail installation complete!\n"
}
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 https://api.github.com/repositories/295836951/releases/latest | grep browser_download_url | cut -d'"' -f4)
#clean up an existing fluidd folder
### remove existing and create fresh fluidd folder, then download fluidd
[ -d $FLUIDD_DIR ] && rm -rf $FLUIDD_DIR [ -d $FLUIDD_DIR ] && rm -rf $FLUIDD_DIR
#create fresh fluidd folder and download fluidd
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!" && ok_msg "Fluidd installation complete!"
echo echo
} }
patch_moonraker(){
status_msg "Patching moonraker.conf ..."
mr_conf=${HOME}/moonraker.conf
# remove the now deprecated enable_cors option from moonraker.conf if it still exists
if [ "$(grep "^enable_cors:" $mr_conf)" ]; then
line="$(grep -n "^enable_cors:" ~/moonraker.conf | cut -d":" -f1)d"
sed -i "$line" $mr_conf && mr_restart="true"
fi
# looking for a cors_domain entry in moonraker.conf
if [ ! "$(grep "^cors_domains:$" $mr_conf)" ]; then
#find trusted_clients line number and subtract one, to insert cors_domains later
line="$(grep -n "^trusted_clients:$" $mr_conf | cut -d":" -f1)i"
sed -i "$line cors_domains:" $mr_conf && mr_restart="true"
fi
if [ "$(grep "^cors_domains:$" $mr_conf)" ]; then
hostname=$(hostname -I | cut -d" " -f1)
url1="\ \ \ \ http://*.local"
url2="\ \ \ \ http://app.fluidd.xyz"
url3="\ \ \ \ https://app.fluidd.xyz"
url4="\ \ \ \ http://$hostname:*"
#find cors_domains line number and add one, to insert urls later
line="$(expr $(grep -n "cors_domains:" $mr_conf | cut -d":" -f1) + 1)i"
[ ! "$(grep -E '^\s+http:\/\/\*\.local$' $mr_conf)" ] && sed -i "$line $url1" $mr_conf && mr_restart="true"
[ ! "$(grep -E '^\s+http:\/\/app\.fluidd\.xyz$' $mr_conf)" ] && sed -i "$line $url2" $mr_conf && mr_restart="true"
[ ! "$(grep -E '^\s+https:\/\/app\.fluidd\.xyz$' $mr_conf)" ] && sed -i "$line $url3" $mr_conf && mr_restart="true"
[ ! "$(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
#restart moonraker service if mr_restart was set to true
if [[ $mr_restart == "true" ]]; then
ok_msg "Patching done!" && restart_moonraker
else
ok_msg "No patching was needed!"
fi
}

View File

@@ -1,6 +1,7 @@
install_klipperscreen(){ install_klipperscreen(){
python3_check python3_check
if [ $py_chk_ok = "true" ]; then if [ $py_chk_ok = "true" ]; then
source_kiauh_ini
system_check_klipperscreen system_check_klipperscreen
#ask user for customization #ask user for customization
get_user_selections_klipperscreen get_user_selections_klipperscreen
@@ -29,7 +30,8 @@ python3_check(){
} }
system_check_klipperscreen(){ system_check_klipperscreen(){
if [ ! -e ${HOME}/klipper_config/KlipperScreen.log ]; then source_kiauh_ini
if [ ! -e $klipper_cfg_loc/KlipperScreen.log ]; then
KLIPPERSCREEN_SL_FOUND="false" KLIPPERSCREEN_SL_FOUND="false"
else else
KLIPPERSCREEN_SL_FOUND="true" KLIPPERSCREEN_SL_FOUND="true"
@@ -75,9 +77,9 @@ klipperscreen_setup(){
symlinks_klipperscreen(){ symlinks_klipperscreen(){
#create a KlipperScreen.log symlink in klipper_config-dir just for convenience #create a KlipperScreen.log symlink in klipper_config-dir just for convenience
if [ "$SEL_KSLOG_SL" = "true" ] && [ ! -e ${HOME}/klipper_config/KlipperScreen.log ]; then if [ "$SEL_KSLOG_SL" = "true" ] && [ ! -e $klipper_cfg_loc/KlipperScreen.log ]; then
status_msg "Creating KlipperScreen.log symlink ..." status_msg "Creating KlipperScreen.log symlink ..."
ln -s /tmp/KlipperScreen.log ${HOME}/klipper_config ln -s /tmp/KlipperScreen.log $klipper_cfg_loc
ok_msg "Symlink created!" ok_msg "Symlink created!"
fi fi
} }

File diff suppressed because it is too large Load Diff

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 ..."
cd $OCTOPRINT_ENV
virtualenv venv virtualenv 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

@@ -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,40 +1,119 @@
remove_klipper(){ remove_klipper(){
data_arr=( ### ask the user if he wants to uninstall moonraker too.
/etc/init.d/klipper ###? currently usefull if the user wants to switch from single-instance to multi-instance
/etc/default/klipper if [ "$(systemctl list-units --full -all -t service --no-legend | grep -E "moonraker*.")" ]; then
/etc/systemd/system/klipper.service while true; do
$KLIPPER_DIR unset REM_MR
$KLIPPY_ENV_DIR top_border
${HOME}/klippy.log echo -e "| Do you want to remove Moonraker afterwards? |"
) echo -e "| |"
print_error "Klipper" && data_count=() echo -e "| This is useful in case you want to switch from a |"
if [ "$ERROR_MSG" = "" ]; then echo -e "| single-instance to a multi-instance installation, |"
stop_klipper echo -e "| which makes a re-installation of Moonraker necessary. |"
if [[ -e /etc/init.d/klipper || -e /etc/default/klipper ]]; then echo -e "| |"
status_msg "Removing Klipper Service ..." echo -e "| If for any other reason you only want to uninstall |"
sudo rm -rf /etc/init.d/klipper /etc/default/klipper echo -e "| Klipper, please select 'No' and continue. |"
sudo update-rc.d -f klipper remove bottom_border
sudo systemctl disable klipper read -p "${cyan}###### Remove Moonraker afterwards? (y/N):${default} " yn
sudo systemctl daemon-reload case "$yn" in
ok_msg "Klipper Service removed!" Y|y|Yes|yes)
fi echo -e "###### > Yes"
if [ -e /etc/systemd/system/klipper.service ]; then REM_MR="true"
status_msg "Removing Klipper Service ..." break;;
sudo rm -rf /etc/systemd/system/klipper.service N|n|No|no|"")
sudo update-rc.d -f klipper remove echo -e "###### > No"
sudo systemctl disable klipper REM_MR="false"
sudo systemctl daemon-reload break;;
ok_msg "Klipper Service removed!" *)
fi print_unkown_cmd
if [[ -d $KLIPPER_DIR || -d $KLIPPY_ENV_DIR ]]; then print_msg && clear_msg;;
status_msg "Removing Klipper and klippy-env directory ..." esac
rm -rf $KLIPPER_DIR $KLIPPY_ENV_DIR && ok_msg "Directories removed!" done
fi fi
if [[ -L ${HOME}/klippy.log || -e /tmp/klippy.log ]]; then
status_msg "Removing klippy.log Symlink ..." ### remove "legacy" klipper init.d service
rm -rf ${HOME}/klippy.log /tmp/klippy.log && ok_msg "Symlink removed!" if [[ -e /etc/init.d/klipper || -e /etc/default/klipper ]]; then
fi status_msg "Removing Klipper Service ..."
CONFIRM_MSG=" Klipper successfully removed!" sudo systemctl stop klipper
sudo systemctl disable klipper
sudo rm -rf /etc/init.d/klipper /etc/default/klipper
sudo update-rc.d -f klipper remove
sudo systemctl daemon-reload
ok_msg "Klipper Service removed!"
fi
###remove single instance
if [ "$(systemctl list-units --full -all -t service --no-legend | grep -F "klipper.service")" ]; then
status_msg "Removing Klipper Service ..."
sudo systemctl stop klipper
sudo systemctl disable klipper
sudo rm -f $SYSTEMDDIR/klipper.service
ok_msg "Klipper Service removed!"
fi
if [ -f /tmp/klippy.log ]; then
status_msg "Removing /tmp/klippy.log ..." && rm -f /tmp/klippy.log && ok_msg "Done!"
fi
if [ -e /tmp/klippy_uds ]; then
status_msg "Removing /tmp/klippy_uds ..." && rm -f /tmp/klippy_uds && ok_msg "Done!"
fi
if [ -h /tmp/printer ]; then
status_msg "Removing /tmp/printer ..." && rm -f /tmp/printer && ok_msg "Done!"
fi
###remove multi instance services
if [ "$(systemctl list-units --full -all -t service --no-legend | grep -E "klipper-[[:digit:]].service")" ]; then
status_msg "Removing Klipper Services ..."
for service in $(find $SYSTEMDDIR -maxdepth 1 -name "klipper-*.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
fi
###remove multi instance logfiles
if [ "$(find /tmp -maxdepth 1 -name "klippy-*.log")" ]; then
for logfile in $(find /tmp -maxdepth 1 -name "klippy-*.log")
do
status_msg "Removing $logfile ..." && rm -f $logfile && ok_msg "Done!"
done
fi
###remove multi instance UDS
if [ "$(find /tmp -maxdepth 1 -name "klippy_uds-*")" ]; then
for uds in $(find /tmp -maxdepth 1 -name "klippy_uds-*")
do
status_msg "Removing $uds ..." && rm -f $uds && ok_msg "Done!"
done
fi
###remove multi instance tmp-printer
if [ "$(find /tmp -maxdepth 1 -name "printer-*")" ]; then
for tmp_printer in $(find /tmp -maxdepth 1 -name "printer-*")
do
status_msg "Removing $tmp_printer ..." && rm -f $tmp_printer && ok_msg "Done!"
done
fi
###reloading units
sudo systemctl daemon-reload
###removing klipper and klippy-env folders
if [ -d $KLIPPER_DIR ]; then
status_msg "Removing Klipper directory ..."
rm -rf $KLIPPER_DIR && ok_msg "Directory removed!"
fi
if [ -d $KLIPPY_ENV ]; then
status_msg "Removing klippy-env directory ..."
rm -rf $KLIPPY_ENV && ok_msg "Directory removed!"
fi
CONFIRM_MSG=" Klipper was successfully removed!" && print_msg && clear_msg
if [ "$REM_MR" == "true" ]; then
remove_moonraker
fi fi
} }
@@ -42,249 +121,244 @@ remove_klipper(){
############################################################# #############################################################
remove_dwc2(){ remove_dwc2(){
data_arr=( ### remove "legacy" init.d service
/etc/init.d/dwc if [[ -e /etc/init.d/dwc || -e /etc/default/dwc ]]; then
/etc/default/dwc status_msg "Removing DWC2-for-Klipper-Socket Service ..."
/etc/systemd/system/dwc.service sudo systemctl stop dwc
$DWC2FK_DIR sudo systemctl disable dwc
$DWC_ENV_DIR sudo rm -rf /etc/init.d/dwc /etc/default/dwc
$DWC2_DIR sudo update-rc.d -f dwc remove
/etc/nginx/sites-available/dwc2 sudo systemctl daemon-reload
/etc/nginx/sites-enabled/dwc2 ok_msg "DWC2-for-Klipper-Socket Service removed!"
)
print_error "DWC2-for-Klipper-Socket &\n DWC2 Web UI" && data_count=()
if [ "$ERROR_MSG" = "" ]; then
if systemctl is-active dwc -q; then
status_msg "Stopping DWC2-for-Klipper-Socket Service ..."
sudo systemctl stop dwc && sudo systemctl disable dwc
ok_msg "Service stopped!"
fi
#remove if init.d service
if [[ -e /etc/init.d/dwc || -e /etc/default/dwc ]]; then
status_msg "Init.d Service found ..."
status_msg "Removing DWC2-for-Klipper-Socket Service ..."
sudo rm -rf /etc/init.d/dwc /etc/default/dwc
sudo update-rc.d -f dwc remove
ok_msg "DWC2-for-Klipper-Socket Service removed!"
fi
#remove if systemd service
if [ -e /etc/systemd/system/dwc.service ]; then
status_msg "Systemd Service found ..."
status_msg "Removing DWC2-for-Klipper-Socket Service ..."
sudo rm -rf /etc/systemd/system/dwc.service
ok_msg "DWC2-for-Klipper-Socket Service removed!"
fi
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 "File removed!"
fi
if [ -d $DWC2_DIR ]; then
status_msg "Removing DWC2 directory ..."
rm -rf $DWC2_DIR && ok_msg "Directory removed!"
fi
#remove dwc2 config for nginx
if [ -e /etc/nginx/sites-available/dwc2 ]; then
status_msg "Removing DWC2 configuration for Nginx ..."
sudo rm /etc/nginx/sites-available/dwc2 && ok_msg "File removed!"
fi
#remove dwc2 symlink for nginx
if [ -L /etc/nginx/sites-enabled/dwc2 ]; then
status_msg "Removing DWC2 Symlink for Nginx ..."
sudo rm /etc/nginx/sites-enabled/dwc2 && ok_msg "File removed!"
fi
CONFIRM_MSG=" DWC2-for-Klipper-Socket & DWC2 successfully removed!"
fi fi
### remove single instance
if [ "$(systemctl list-units --full -all -t service --no-legend | grep -F "dwc.service")" ]; then
status_msg "Removing DWC2-for-Klipper-Socket Service ..."
sudo systemctl stop dwc
sudo systemctl disable dwc
sudo rm -f $SYSTEMDDIR/dwc.service
ok_msg "DWC2-for-Klipper-Socket Service removed!"
fi
if [ -f /tmp/dwc.log ]; then
status_msg "Removing /tmp/dwc.log ..." && rm -f /tmp/dwc.log && ok_msg "Done!"
fi
### remove multi instance services
if [ "$(systemctl list-units --full -all -t service --no-legend | grep -E "dwc-[[:digit:]].service")" ]; then
status_msg "Removing DWC2-for-Klipper-Socket Services ..."
for service in $(find $SYSTEMDDIR -maxdepth 1 -name "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
fi
### remove multi instance logfiles
if [ "$(find /tmp -maxdepth 1 -name "dwc-*.log")" ]; then
for logfile in $(find /tmp -maxdepth 1 -name "dwc-*.log")
do
status_msg "Removing $logfile ..." && rm -f $logfile && ok_msg "Done!"
done
fi
### reloading units
sudo systemctl daemon-reload
### 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
CONFIRM_MSG=" DWC2-for-Klipper-Socket was successfully removed!"
} }
############################################################# #############################################################
############################################################# #############################################################
remove_moonraker(){ remove_moonraker(){
data_arr=( ### remove "legacy" moonraker init.d service
$MOONRAKER_SERVICE1 if [[ -e /etc/init.d/moonraker || -e /etc/default/moonraker ]]; then
$MOONRAKER_SERVICE2 status_msg "Removing Moonraker Service ..."
$MOONRAKER_DIR sudo systemctl stop moonraker
$MOONRAKER_ENV_DIR sudo systemctl disable moonraker
$NGINX_CONFD/upstreams.conf sudo rm -rf /etc/init.d/moonraker /etc/default/moonraker
$NGINX_CONFD/common_vars.conf sudo update-rc.d -f moonraker remove
${HOME}/moonraker.conf sudo systemctl daemon-reload
${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 single instance
if [ "$(systemctl list-units --full -all -t service --no-legend | grep -F "moonraker.service")" ]; then
status_msg "Removing Moonraker Service ..."
sudo systemctl stop moonraker
sudo systemctl disable moonraker
sudo rm -f $SYSTEMDDIR/moonraker.service
ok_msg "Moonraker Service removed!"
fi
if [ -f /tmp/moonraker.log ]; then
status_msg "Removing /tmp/moonraker.log ..." && rm -f /tmp/moonraker.log && ok_msg "Done!"
fi
###remove multi instance services
if [ "$(systemctl list-units --full -all -t service --no-legend | grep -E "moonraker-[[:digit:]].service")" ]; then
status_msg "Removing Moonraker Services ..."
for service in $(find $SYSTEMDDIR -maxdepth 1 -name "moonraker-*.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
fi
###remove multi instance logfiles
if [ "$(find /tmp -maxdepth 1 -name "moonraker-*.log")" ]; then
for logfile in $(find /tmp -maxdepth 1 -name "moonraker-*.log")
do
status_msg "Removing $logfile ..." && rm -f $logfile && ok_msg "Done!"
done
fi
###reloading units
sudo systemctl daemon-reload
#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!"
} }
############################################################# #############################################################
############################################################# #############################################################
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
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
CONFIRM_MSG="Fluidd successfully removed!"
} }
############################################################# #############################################################
############################################################# #############################################################
remove_octoprint(){ remove_octoprint(){
data_arr=( ###remove single instance
$OCTOPRINT_SERVICE1 if [ "$(systemctl list-unit-files | grep -F "octoprint.service")" ]; then
$OCTOPRINT_SERVICE2 status_msg "Removing OctoPrint Service ..."
$OCTOPRINT_DIR sudo systemctl stop octoprint
$OCTOPRINT_CFG_DIR sudo systemctl disable octoprint
${HOME}/octoprint.log sudo rm -f $SYSTEMDDIR/octoprint.service
/etc/sudoers.d/octoprint-shutdown ok_msg "OctoPrint Service removed!"
/etc/nginx/sites-available/octoprint
/etc/nginx/sites-enabled/octoprint
)
print_error "OctoPrint" && data_count=()
if [ "$ERROR_MSG" = "" ]; then
stop_octoprint
if [[ -e $OCTOPRINT_SERVICE1 || -e $OCTOPRINT_SERVICE2 ]]; then
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 multi instance services
if [ "$(systemctl list-unit-files | grep -E "octoprint-[[:digit:]].service")" ]; then
status_msg "Removing OctoPrint Services ..."
for service in $(find $SYSTEMDDIR -maxdepth 1 -name "octoprint-*.service" | cut -d"/" -f5)
do
status_msg "Removing $service ..."
sudo systemctl stop $service
sudo systemctl disable $service
sudo rm -f $SYSTEMDDIR/$service
ok_msg "OctoPrint Service removed!"
done
fi
###reloading units
sudo systemctl daemon-reload
### 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 [ "$(find ${HOME} -maxdepth 1 -name ".octoprint*")" ]; then
for folder in $(find ${HOME} -maxdepth 1 -name ".octoprint*")
do
status_msg "Removing $folder ..." && rm -rf $folder && ok_msg "Done!"
done
fi
CONFIRM_MSG=" OctoPrint successfully removed!"
} }
############################################################# #############################################################
@@ -307,27 +381,23 @@ remove_nginx(){
} }
remove_klipperscreen(){ remove_klipperscreen(){
data_arr=( ### remove KlipperScreen dir
$KLIPPERSCREEN_DIR if [ -d $KLIPPERSCREEN_DIR ]; then
$KLIPPERSCREEN_ENV_DIR status_msg "Removing KlipperScreen directory ..."
/etc/systemd/system/KlipperScreen.service rm -rf $KLIPPERSCREEN_DIR && ok_msg "Directory removed!"
)
print_error "KlipperScreen" && data_count=()
if [ "$ERROR_MSG" = "" ]; then
#remove KlipperScreen dir
if [ -d $KLIPPERSCREEN_DIR ]; then
status_msg "Removing KlipperScreen directory ..."
rm -rf $KLIPPERSCREEN_DIR && ok_msg "Directory removed!"
fi
if [ -d $KLIPPERSCREEN_ENV_DIR ]; then
status_msg "Removing KlipperScreen VENV directory ..."
rm -rf $KLIPPERSCREEN_ENV_DIR && ok_msg "Directory removed!"
fi
#remove KlipperScreen systemd file
if [ -e /etc/systemd/system/KlipperScreen.service ]; then
status_msg "Removing KlipperScreen Service ..."
sudo rm /etc/systemd/system/KlipperScreen.service && ok_msg "File removed!"
fi
CONFIRM_MSG="KlipperScreen successfully removed!"
fi fi
### remove KlipperScreen VENV dir
if [ -d $KLIPPERSCREEN_ENV_DIR ]; then
status_msg "Removing KlipperScreen VENV directory ..."
rm -rf $KLIPPERSCREEN_ENV_DIR && ok_msg "Directory removed!"
fi
### remove KlipperScreen systemd file
if [ -e /etc/systemd/system/KlipperScreen.service ]; then
status_msg "Removing KlipperScreen Service ..."
sudo rm /etc/systemd/system/KlipperScreen.service && ok_msg "File removed!"
fi
CONFIRM_MSG="KlipperScreen successfully removed!"
} }

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)

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
@@ -17,17 +17,24 @@ 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" | wc -l)
### 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 +44,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" | 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 +80,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" | 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 +155,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" | 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 +171,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 +189,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
@@ -297,9 +329,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 +342,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
} }
@@ -366,10 +398,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 +421,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 # set flag for the multi update function
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 +460,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 # set flag for the multi update function
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
} }

View File

@@ -12,16 +12,14 @@ advanced_ui(){
echo -e "| Firmware: | 7) [Shell Command] | " echo -e "| Firmware: | 7) [Shell Command] | "
echo -e "| 3) [Build only] | | " echo -e "| 3) [Build only] | | "
echo -e "| 4) [Build + Flash MCU] | | " echo -e "| 4) [Build + Flash MCU] | | "
echo -e "| 5) [Get Printer-USB] | | " echo -e "| 5) [Get MCU ID] | | "
echo -e "| | | " echo -e "| | | "
quit_footer quit_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,41 +31,23 @@ advanced_menu(){
print_msg && clear_msg print_msg && clear_msg
advanced_ui;; advanced_ui;;
1) 1)
clear do_action "switch_menu" "advanced_ui";;
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
unset FLASH_FIRMWARE && FLASH_FIRMWARE="true"
flash_routine flash_routine
unset BUILD_FIRMWARE && BUILD_FIRMWARE="true" ### build in a sleep to give the user a chance to have a look at the
build_fw ### MCU IDs before directly starting to build the klipper firmware
unset CONFIRM_FLASHING && CONFIRM_FLASHING="true" status_msg "Please wait..." && sleep 10 && build_fw
flash_mcu flash_mcu
print_msg && clear_msg print_msg && clear_msg
advanced_ui;; advanced_ui;;
5) 5)
clear do_action "get_mcu_id" "advanced_ui";;
print_header
get_printer_usb
print_msg && clear_msg
advanced_ui;;
6) 6)
clear clear
print_header print_header
@@ -75,19 +55,11 @@ advanced_menu(){
print_msg && clear_msg print_msg && clear_msg
advanced_ui;; advanced_ui;;
7) 7)
clear do_action "setup_gcode_shell_command" "advanced_ui";;
print_header
setup_gcode_shell_command
print_msg && clear_msg
advanced_ui;;
Q|q) 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
@@ -117,8 +89,7 @@ switch_ui(){
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
@@ -153,11 +124,7 @@ switch_menu(){
Q|q) Q|q)
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

View File

@@ -4,82 +4,45 @@ 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] | 3) [Mainsail] | "
echo -e "| | " echo -e "| | 4) [Fluidd] | "
echo -e "| Klipper API: | " echo -e "| Firmware: | | "
echo -e "| 2) [Moonraker] | " echo -e "| 1) [Klipper] | HDMI Screen: | "
echo -e "| | " echo -e "| | 5) [KlipperScreen] | "
echo -e "| Webinterface: | " echo -e "| Klipper API: | | "
echo -e "| 3) [Mainsail] | " echo -e "| 2) [Moonraker] | Other: | "
echo -e "| 4) [Fluidd] | " echo -e "| | 6) [Duet Web Control] | "
echo -e "| 5) [DWC2 Web UI] | " echo -e "| | 7) [OctoPrint] | "
echo -e "| 6) [OctoPrint] | "
echo -e "| | "
echo -e "| HDMI Screen: | "
echo -e "| 7) [KlipperScreen] | "
echo -e "| | "
quit_footer 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_mainsail" "backup_ui";;
print_header
backup_mainsail
print_msg && clear_msg
backup_ui;;
4) 4)
clear do_action "backup_fluidd" "backup_ui";;
print_header
backup_fluidd
print_msg && clear_msg
backup_ui;;
5) 5)
clear do_action "backup_klipperscreen" "backup_ui";;
print_header
backup_dwc2
print_msg && clear_msg
backup_ui;;
6) 6)
clear do_action "backup_dwc2" "backup_ui";;
print_header
backup_octoprint
print_msg && clear_msg
backup_ui;;
7) 7)
clear do_action "backup_octoprint" "backup_ui";;
print_header
backup_klipperscreen
print_msg && clear_msg
backup_ui;;
Q|q) Q|q)
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

@@ -38,3 +38,24 @@ kiauh_update_msg(){
echo -e "| ${yellow}either to the script or the installable components!${default} | " echo -e "| ${yellow}either to the script or the installable components!${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,42 @@ 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: | Klipper Webinterface: | "
echo -e "| 1) [Klipper] | 3) [DWC2] | " echo -e "| 1) [Klipper] | 3) [Mainsail] | "
echo -e "| | 4) [Mainsail] | " echo -e "| | 4) [Fluidd] | "
echo -e "| Klipper API: | 5) [Fluidd] | " echo -e "| Klipper API: | | "
echo -e "| 2) [Moonraker] | 6) [Octoprint] | " echo -e "| 2) [Moonraker] | HDMI Screen: | "
echo -e "| | 5) [KlipperScreen] | "
echo -e "| | | " echo -e "| | | "
echo -e "| | HDMI Screen | " echo -e "| | Other: | "
echo -e "| | 7) [KlipperScreen] | " echo -e "| | 6) [Duet Web Control] | "
echo -e "| | 7) [OctoPrint] | "
quit_footer quit_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
install_klipperscreen
print_msg && clear_msg
install_ui;;
Q|q) Q|q)
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

@@ -7,12 +7,12 @@ 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 "| 4) [Advanced] | Mainsail: $MAINSAIL_STATUS|"
echo -e "| 5) [Backup] | Fluidd: $FLUIDD_STATUS|"
echo -e "| | KlipperScreen: $KLIPPERSCREEN_STATUS|"
echo -e "| 6) [Settings] | |"
echo -e "| | DWC2: $DWC2_STATUS|" echo -e "| | DWC2: $DWC2_STATUS|"
echo -e "| 4) [Advanced] | Fluidd: $FLUIDD_STATUS|" echo -e "| ${cyan}$KIAUH_VER${default}| Octoprint: $OCTOPRINT_STATUS|"
echo -e "| 5) [Backup] | Mainsail: $MAINSAIL_STATUS|"
echo -e "| | Octoprint: $OCTOPRINT_STATUS|"
echo -e "| | |"
echo -e "| ${cyan}$KIAUH_VER${default}| KlipperScreen: $KLIPPERSCREEN_STATUS|"
quit_footer quit_footer
} }
@@ -43,47 +43,51 @@ main_menu(){
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
"start klipper")
do_action "klipper_service start" "main_ui";;
"stop klipper")
do_action "klipper_service stop" "main_ui";;
"restart klipper")
do_action "klipper_service restart" "main_ui";;
"start moonraker")
do_action "moonraker_service start" "main_ui";;
"stop moonraker")
do_action "moonraker_service stop" "main_ui";;
"restart moonraker")
do_action "moonraker_service restart" "main_ui";;
"start dwc")
do_action "dwc_service start" "main_ui";;
"stop dwc")
do_action "dwc_service stop" "main_ui";;
"restart dwc")
do_action "dwc_service restart" "main_ui";;
"start octoprint")
do_action "octoprint_service start" "main_ui";;
"stop octoprint")
do_action "octoprint_service stop" "main_ui";;
"restart octoprint")
do_action "octoprint_service restart" "main_ui";;
update) update)
clear do_action "update_kiauh" "main_ui";;
print_header
update_kiauh
print_msg && clear_msg
main_ui;;
0) 0)
clear do_action "upload_selection" "main_ui";;
print_header
upload_selection
print_msg && clear_msg
main_ui;;
1) 1)
clear clear && install_menu && break;;
install_menu
break;;
2) 2)
clear clear && update_menu && break;;
update_menu
break;;
3) 3)
clear clear && remove_menu && break;;
remove_menu
break;;
4) 4)
clear clear && advanced_menu && break;;
advanced_menu
break;;
5) 5)
clear clear && backup_menu && break;;
backup_menu 6)
break;; clear && settings_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,50 @@ 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: | Klipper Webinterface: | "
echo -e "| 1) [Klipper] | 3) [DWC2] | " echo -e "| 1) [Klipper] | 3) [Mainsail] | "
echo -e "| | 4) [Mainsail] | " echo -e "| | 4) [Fluidd] | "
echo -e "| Klipper API: | 5) [Fluidd] | " echo -e "| Klipper API: | | "
echo -e "| 2) [Moonraker] | 6) [Octoprint] | " echo -e "| 2) [Moonraker] | HDMI Screen: | "
echo -e "| | 5) [KlipperScreen] | "
echo -e "| | | " echo -e "| | | "
echo -e "| | Webserver: | " echo -e "| | Other: | "
echo -e "| | 7) [Nginx] | " echo -e "| | 6) [Duet Web Control] | "
echo -e "| | | " echo -e "| | 7) [OctoPrint] | "
echo -e "| | HDMI Screen: | " echo -e "| | 8) [NGINX] | "
echo -e "| | 8) [KlipperScreen] | "
quit_footer quit_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_nginx" "remove_ui";;
print_header
remove_klipperscreen
print_msg && clear_msg
remove_ui;;
Q|q) Q|q)
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
quit_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;;
Q|q)
clear; main_menu; break;;
*)
deny_action "settings_ui";;
esac
done
settings_ui
}

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."
@@ -60,7 +60,7 @@ update_all(){
} }
update_klipper(){ update_klipper(){
stop_klipper klipper_service "stop"
if [ ! -d $KLIPPER_DIR ]; then if [ ! -d $KLIPPER_DIR ]; then
cd ${HOME} && git clone $KLIPPER_REPO cd ${HOME} && git clone $KLIPPER_REPO
else else
@@ -69,33 +69,42 @@ update_klipper(){
save_klipper_state save_klipper_state
status_msg "Updating $GET_BRANCH" status_msg "Updating $GET_BRANCH"
cd $KLIPPER_DIR cd $KLIPPER_DIR
KLIPPER_OLDREQ_MD5SUM="$(md5sum $KLIPPER_DIR/scripts/klippy-requirements.txt | cut -d " " -f1)"
if [ "$DETACHED_HEAD" == "true" ]; then if [ "$DETACHED_HEAD" == "true" ]; then
git checkout $GET_BRANCH git checkout $GET_BRANCH
unset DETACHED_HEAD unset DETACHED_HEAD
fi fi
### pull latest files from github
git pull && ok_msg "Update successfull!" git pull && ok_msg "Update successfull!"
#check for possible new dependencies and install them ### check for possible new dependencies and install them
status_msg "Checking for possible new dependencies ..." if [[ $(md5sum $KLIPPER_DIR/scripts/klippy-requirements.txt | cut -d " " -f1) != $KLIPPER_OLDREQ_MD5SUM ]]; then
PKGLIST=$(grep "PKGLIST=" ~/klipper/scripts/install-octopi.sh | cut -d'"' -f2- | cut -d'"' -f1 | cut -d"}" -f2) PYTHONDIR="${HOME}/klippy-env"
PYTHONDIR="${HOME}/klippy-env" status_msg "New dependecies detected..."
sudo apt-get update && sudo apt-get install --yes $PKGLIST
$PYTHONDIR/bin/pip install -r ~/klipper/scripts/klippy-requirements.txt ### always rebuild the pythondir from scratch if new dependencies were detected
ok_msg "Dependencies already met or have been installed!" rm -rf ${PYTHONDIR}
virtualenv -p python2 ${PYTHONDIR}
$PYTHONDIR/bin/pip install -r $KLIPPER_DIR/scripts/klippy-requirements.txt
ok_msg "Dependencies have been installed!"
fi
ok_msg "Update complete!" ok_msg "Update complete!"
fi fi
start_klipper klipper_service "restart"
} }
update_dwc2fk(){ update_dwc2fk(){
stop_dwc dwc_service "stop"
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 dwc_service "start"
} }
update_dwc2(){ update_dwc2(){
@@ -116,53 +125,29 @@ update_fluidd(){
} }
update_moonraker(){ update_moonraker(){
moonraker_service "stop"
bb4u "moonraker" bb4u "moonraker"
status_msg "Updating Moonraker ..." status_msg "Updating Moonraker ..."
while true; do cd $MOONRAKER_DIR
echo MOONRAKER_OLDREQ_MD5SUM=$(md5sum $MOONRAKER_DIR/scripts/moonraker-requirements.txt | cut -d " " -f1)
top_border
echo -e "| You can now choose how you want to update Moonraker. |" ### pull latest files from github
blank_line git pull && ok_msg "Update successfull!"
echo -e "| Changes made to the Moonraker code and/or its depen- |"
echo -e "| dencies might require a rebuild of the python virtual |" ### check for possible new dependencies and install them
echo -e "| environment or downloading of additional packages. |" if [[ $(md5sum $MOONRAKER_DIR/scripts/moonraker-requirements.txt | cut -d " " -f1) != $MOONRAKER_OLDREQ_MD5SUM ]]; then
blank_line PYTHONDIR="${HOME}/moonraker-env"
echo -e "| ${red}Check the docs in the Moonraker repository to see if${default} |" status_msg "New dependecies detected..."
echo -e "| ${red}rebuilding is necessary (user_changes.md)!${default} |" ### always rebuild the pythondir from scratch if new dependencies were detected
blank_line rm -rf ${PYTHONDIR}
echo -e "| 1) Update Moonraker (default) |" virtualenv -p /usr/bin/python3 ${PYTHONDIR}
echo -e "| 2) Update Moonraker + rebuild virtualenv/dependencies |" ln -s /usr/lib/python3/dist-packages/gpiod* ${PYTHONDIR}/lib/python*/site-packages
quit_footer ${PYTHONDIR}/bin/pip install -r $MOONRAKER_DIR/scripts/moonraker-requirements.txt
read -p "${cyan}###### Please choose:${default} " action ok_msg "Dependencies have been installed!"
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 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 moonraker_service "restart"
} }
update_klipperscreen(){ update_klipperscreen(){

View File

@@ -37,44 +37,56 @@ 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=()
if ls /tmp/klippy*.log 2>/dev/null 1>&2; then
for kl_log in $(find /tmp/klippy*.log); do
logfiles+=($kl_log)
done
fi
if ls /tmp/moonraker*.log 2>/dev/null 1>&2; then
for mr_log in $(find /tmp/moonraker*.log); 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))
done
quit_footer quit_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 = "q" ] || [ $choice = "Q" ]; 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 +95,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
} }