#!/bin/bash user_groups() { echo 'Adding current user to dialout and video groups.' usermod -a -G dialout,video $user if [ $INSTALL -eq 4 ]; then usermod -a -G uucp,video $user fi } prepare () { echo "Checking if Docker is installed....." if command_exists docker; then echo "Docker found at `which docker`" else echo "Docker not found, will install." DOCKERINSTALL=1 fi echo echo PS3="${green}Installation type: ${white}" local options=("Ubuntu 20+, Mint, Debian, Raspberry Pi OS" "Fedora/CentOS" "ArchLinux" "openSUSE" "Quit") select opt in "${options[@]}" do case $opt in "Ubuntu 20+, Mint, Debian, Raspberry Pi OS") INSTALL=2 break ;; "Fedora/CentOS") INSTALL=3 break ;; "ArchLinux") INSTALL=4 break ;; "openSUSE") INSTALL=5 break ;; "Quit") exit 1 ;; *) echo "invalid option $REPLY";; esac done if prompt_confirm "Ready to begin?"; then install fi main_menu } install() { user_groups OCTOEXEC=/usr/local/bin/octoprint echo "Adding systemctl and reboot to sudo" echo "$user ALL=NOPASSWD: /usr/bin/systemctl" > /etc/sudoers.d/octoprint_systemctl echo "$user ALL=NOPASSWD: /usr/sbin/reboot" > /etc/sudoers.d/octoprint_reboot echo "This will install necessary packages, install OctoPrint and setup an instance." #SELinux if command_exists getenforce && [ "$(getenforce)" == "Enforcing" ]; then echo "SELinux is enabled" echo "This causes a fair bit of trouble for running OctoPrint." echo "You have the option of disabling this now." if prompt_confirm "${green}Disable SELinux?${white}"; then sed -i s/^SELINUX=.*$/SELINUX=disabled/ /etc/selinux/config echo "${magenta}You will need to reboot after system preparation.${white}" fi fi if [ -n "$DOCKERINSTALL" ]; then curl -sL https://get.docker.com | sh fi echo "Enabling ssh server..." systemctl enable ssh.service haproxy_install streamer_install #These will retreived as settings echo "octoexec: /usr/local/bin/octoprint" >> /etc/octodocker_deploy echo "octopip: /usr/local/bin/pip" >> /etc/octodocker_deploy #Create first instance echo echo echo echo echo "${cyan}It is time to create your first OctoPrint instance!!!${white}" new_instance true echo echo if prompt_confirm "Would you like to install recommended plugins now?"; then plugin_menu fi } haproxy_install() { echo echo echo 'You have the option of setting up haproxy.' echo 'This binds instances to a name on port 80 instead of having to type the port.' echo echo if prompt_confirm "Use haproxy?"; then echo 'haproxy: true' >> /etc/octodocker_deploy #Check if using improved haproxy rules #echo 'haproxynew: true' >> /etc/octodocker_deploy systemctl stop haproxy #get haproxy version HAversion=$(haproxy -v | sed -n 's/^.*version \([0-9]\).*/\1/p') mv /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.orig if [ $HAversion -gt 1 ]; then cp $SCRIPTDIR/haproxy2x.basic /etc/haproxy/haproxy.cfg else cp $SCRIPTDIR/haproxy1x.basic /etc/haproxy/haproxy.cfg fi systemctl start haproxy systemctl enable haproxy else systemctl stop haproxy systemctl disable haproxy fi echo echo echo } streamer_install() { PS3="${green}Which video streamer you would like to install?: ${white}" options=("ustreamer (recommended)" "camera-streamer" "None/Skip") select opt in "${options[@]}" do case $opt in "mjpeg-streamer") VID=1 break ;; "ustreamer (recommended)") VID=2 break ;; "camera-streamer") VID=4 break ;; "None/Skip") VID=3 break ;; *) echo "invalid option $REPLY";; esac done #If we run this function directly, clean up streamer setting before installing get_settings sed -i "/streamer/d" /etc/octodocker_deploy if [ $VID -eq 1 ]; then rm -rf /opt/octoprint/mjpg_streamer 2>/dev/null #install mjpg-streamer, not doing any error checking or anything echo 'Installing mjpeg-streamer' git -C /opt/octoprint/ clone https://github.com/jacksonliam/mjpg-streamer.git mjpeg #apt -y install make -C /opt/octoprint/mjpeg/mjpg-streamer-experimental > /dev/null mv /opt/octoprint/mjpeg/mjpg-streamer-experimental /opt/octoprint/mjpg-streamer rm -rf /opt/octoprint/mjpeg if [ -f "/opt/octoprint/mjpg-streamer/mjpg_streamer" ]; then echo "Streamer installed successfully" else echo "${red}WARNING! WARNING! WARNING!${white}" echo "Streamer has not been installed correctly." if prompt_confirm "Try installation again?"; then streamer_install fi fi echo 'streamer: mjpg-streamer' >> /etc/octodocker_deploy fi if [ $VID -eq 2 ]; then rm -rf /opt/octoprint/ustreamer 2>/dev/null #install ustreamer git -C /opt/octoprint clone --depth=1 https://github.com/pikvm/ustreamer make -C /opt/octoprint/ustreamer > /dev/null if [ -f "/opt/octoprint/ustreamer/ustreamer" ] || [ -f "/opt/octoprint/ustreamer/ustreamer.bin" ]; then echo "Streamer installed successfully" else echo "${red}WARNING! WARNING! WARNING!${white}" echo "Streamer has not been installed correctly." if prompt_confirm "Try installation again?"; then streamer_install fi fi if [ -f "/opt/octoprint/ustreamer/ustreamer.bin" ]; then ln -s /opt/octoprint/ustreamer/ustreamer.bin /opt/octoprint/ustreamer/ustreamer fi echo 'streamer: ustreamer' >> /etc/octodocker_deploy fi if [ $VID -eq 4 ]; then rm -rf /opt/octoprint/camera-streamer 2>/dev/null #install camera-streamer git -C /opt/octoprint clone https://github.com/ayufan-research/camera-streamer.git --recursive make -C /opt/octoprint/camera-streamer > /dev/null if [ -f "/opt/octoprint/camera-streamer/camera-streamer" ]; then echo "Streamer installed successfully" else echo "${red}WARNING! WARNING! WARNING!${white}" echo "Streamer has not been installed correctly." if prompt_confirm "Try installation again?"; then streamer_install fi fi echo 'streamer: camera-streamer' >> /etc/octodocker_deploy fi if [ $VID -eq 3 ]; then echo 'streamer: none' >> /etc/octodocker_deploy echo "Good for you! Cameras are just annoying anyway." fi } firstrun_install() { echo echo echo 'The first instance can be configured at this time.' echo 'This includes setting up the admin user and finishing the startup wizards.' echo echo if prompt_confirm "Do you want to setup your admin user now?"; then while true; do echo 'Enter admin user name (no spaces): ' read OCTOADMIN if [ -z "$OCTOADMIN" ]; then echo -e "No admin user given! Defaulting to: \033[0;31moctoadmin\033[0m" OCTOADMIN=octoadmin fi if ! has-space "$OCTOADMIN"; then break else echo "Admin user name must not have spaces." fi done echo "Admin user: ${cyan}$OCTOADMIN${white}" while true; do echo 'Enter admin user password (no spaces): ' read OCTOPASS if [ -z "$OCTOPASS" ]; then echo -e "No password given! Defaulting to: ${cyan}fooselrulz${white}. Please CHANGE this." OCTOPASS=fooselrulz fi if ! has-space "$OCTOPASS"; then break else echo "Admin password cannot contain spaces" fi done echo "Admin password: ${cyan}$OCTOPASS${white}" docker exec -it $INSTANCE $OCTOEXEC --basedir $BASE user add $OCTOADMIN --password $OCTOPASS --admin fi if [ -n "$OCTOADMIN" ]; then echo echo echo "The script can complete the first run wizards now." echo "For more information on these, see the OctoPrint website." echo "It is standard to accept this, as no identifying information is exposed through their usage." echo echo if prompt_confirm "Complete first run wizards now?"; then docker exec -it $INSTANCE $OCTOEXEC --basedir $BASE config set server.firstRun false --bool docker exec -it $INSTANCE $OCTOEXEC --basedir $BASE config set server.seenWizards.backup null docker exec -it $INSTANCE $OCTOEXEC --basedir $BASE config set server.seenWizards.corewizard 4 --int docker exec -it $INSTANCE $OCTOEXEC --basedir $BASE config set server.onlineCheck.enabled true --bool docker exec -it $INSTANCE $OCTOEXEC --basedir $BASE config set server.pluginBlacklist.enabled true --bool docker exec -it $INSTANCE $OCTOEXEC --basedir $BASE config set plugins.tracking.enabled true --bool docker exec -it $INSTANCE $OCTOEXEC --basedir $BASE config set printerProfiles.default _default fi fi echo "Restarting instance....." systemctl restart $INSTANCE }