Replaced whiptail, moved OctoPrint, added plugin manager
Replaced whiptail with dialog since dialog has more features and looks nicer imo OctoPrint has been moved to /srv/octoprint There is now an OctoPrint group as well as an OctoPrint user First-time will now ask if you want to preinstall some curated plugins Added warning advising end users that this is nowhere near production ready. Added more stuff to TODO README improvements
This commit is contained in:
parent
e41bb81f5e
commit
0d495115aa
10 changed files with 104 additions and 48 deletions
10
README.md
10
README.md
|
@ -1,8 +1,16 @@
|
||||||
# Raspberry Pi OctoPrint Kiosk
|
# Raspberry Pi OctoPrint Kiosk
|
||||||
This repository contains the source for building an OctoPrint kiosk.
|
This repository contains the source for building an OctoPrint kiosk.
|
||||||
|
|
||||||
|
## Highlights
|
||||||
|
- Lightweight graphical frontend using Surf to display OctoPrint
|
||||||
|
- Easy to use TUI installer
|
||||||
|
- Built for security
|
||||||
|
|
||||||
|
## Screenshots
|
||||||
|
TODO
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
Download the latest image from the Releases section and flash it onto a microSD card with at least 4GB of storage
|
[Download the latest image from the releases section](/releases) and flash it onto a microSD card with at least 4GB of storage.
|
||||||
|
|
||||||
## Requirements
|
## Requirements
|
||||||
### Minimum:
|
### Minimum:
|
||||||
|
|
5
TODO.md
5
TODO.md
|
@ -3,10 +3,13 @@
|
||||||
## First time/Octo-Config
|
## First time/Octo-Config
|
||||||
- Change OctoPrint listening address and port
|
- Change OctoPrint listening address and port
|
||||||
- Change frontend listening address and port
|
- Change frontend listening address and port
|
||||||
- Add plugin menu
|
- Add network configuration (replace nmtui)
|
||||||
|
- Add hostname configuration (replace nmtui)
|
||||||
|
- Consolidate shared functions into a single file
|
||||||
|
|
||||||
## Frontend
|
## Frontend
|
||||||
- Autodetect OctoPrint port if hosted locally
|
- Autodetect OctoPrint port if hosted locally
|
||||||
|
- Add on screen keyboard to Openbox autostart
|
||||||
|
|
||||||
## Misc
|
## Misc
|
||||||
- 64 bit builds
|
- 64 bit builds
|
||||||
|
|
|
@ -5,6 +5,7 @@ install -m 644 files/noclear.conf "${ROOTFS_DIR}/etc/systemd/system/getty@tty1.s
|
||||||
install -v -m 644 files/fstab "${ROOTFS_DIR}/etc/fstab"
|
install -v -m 644 files/fstab "${ROOTFS_DIR}/etc/fstab"
|
||||||
install -m 755 files/.xprofile "${ROOTFS_DIR}/etc/skel/.xprofile"
|
install -m 755 files/.xprofile "${ROOTFS_DIR}/etc/skel/.xprofile"
|
||||||
install -m 755 files/.browser.sh "${ROOTFS_DIR}/etc/skel/.browser.sh"
|
install -m 755 files/.browser.sh "${ROOTFS_DIR}/etc/skel/.browser.sh"
|
||||||
|
install -m 644 files/.dialogrc "${ROOTFS_DIR}/etc/skel/.dialogrc"
|
||||||
mkdir -p "${ROOTFS_DIR}/etc/skel/.config/openbox"
|
mkdir -p "${ROOTFS_DIR}/etc/skel/.config/openbox"
|
||||||
install -m 644 files/autostart "${ROOTFS_DIR}/etc/skel/.config/openbox/autostart"
|
install -m 644 files/autostart "${ROOTFS_DIR}/etc/skel/.config/openbox/autostart"
|
||||||
|
|
||||||
|
@ -13,9 +14,9 @@ if ! id -u ${FIRST_USER_NAME} >/dev/null 2>&1; then
|
||||||
adduser --disabled-password --gecos "" ${FIRST_USER_NAME}
|
adduser --disabled-password --gecos "" ${FIRST_USER_NAME}
|
||||||
fi
|
fi
|
||||||
if ! id -u octoprint >/dev/null 2>&1; then
|
if ! id -u octoprint >/dev/null 2>&1; then
|
||||||
adduser --system --shell /usr/sbin/nologin --disabled-password --gecos "" octoprint
|
adduser --system --shell /usr/sbin/nologin --group --disabled-password --gecos "" octoprint
|
||||||
fi
|
fi
|
||||||
echo "${FIRST_USER_NAME}:${FIRST_USER_PASS}" | chpasswd
|
echo "${FIRST_USER_NAME}:${FIRST_USER_PASS}" | chpasswd
|
||||||
echo "octoprint:$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c20)" | chpasswd
|
echo "octoprint:$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c40)" | chpasswd
|
||||||
echo "root:$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c20)" | chpasswd
|
echo "root:$(cat /dev/urandom | tr -dc _A-Z-a-z-0-9 | head -c40)" | chpasswd
|
||||||
EOF
|
EOF
|
||||||
|
|
1
stage1/01-sys-tweaks/files/.dialogrc
Normal file
1
stage1/01-sys-tweaks/files/.dialogrc
Normal file
|
@ -0,0 +1 @@
|
||||||
|
screen_color = (CYAN,BLACK,ON)
|
|
@ -51,3 +51,4 @@ rpi-eeprom
|
||||||
raspinfo
|
raspinfo
|
||||||
unattended-upgrades
|
unattended-upgrades
|
||||||
apt-listchanges
|
apt-listchanges
|
||||||
|
dialog
|
||||||
|
|
|
@ -4,15 +4,13 @@ install -m 644 files/octoprint.service ${ROOTFS_DIR}/etc/systemd/system/octoprin
|
||||||
|
|
||||||
on_chroot << EOF
|
on_chroot << EOF
|
||||||
if ! pip list | grep -F octoprint; then
|
if ! pip list | grep -F octoprint; then
|
||||||
if [ -d /home/octoprint ]; then
|
if [[ ! -d /srv/octoprint ]]; then mkdir -p /srv/octoprint; fi
|
||||||
cd /home/octoprint || exit 1
|
cd /srv/octoprint || exit 1
|
||||||
if [[ ! -d OctoPrint ]]; then mkdir OctoPrint; fi || exit 1
|
chown octoprint:octoprint /srv/octoprint || exit 1
|
||||||
cd OctoPrint || exit 1
|
virtualenv venv || exit 1
|
||||||
virtualenv venv || exit 1
|
source venv/bin/activate || exit 1
|
||||||
source venv/bin/activate || exit 1
|
pip install pip --upgrade
|
||||||
pip install pip --upgrade || exit 1
|
pip install octoprint || exit 1
|
||||||
pip install octoprint || exit 1
|
chown -R octoprint:octoprint /srv/octoprint
|
||||||
pip install "https://github.com/BillyBlaze/OctoPrint-TouchUI/archive/master.zip" || exit 1
|
|
||||||
fi
|
|
||||||
fi
|
fi
|
||||||
EOF
|
EOF
|
||||||
|
|
|
@ -4,7 +4,8 @@ Description=OctoPrint Daemon
|
||||||
[Service]
|
[Service]
|
||||||
Type=simple
|
Type=simple
|
||||||
User=octoprint
|
User=octoprint
|
||||||
ExecStart=/home/octoprint/OctoPrint/venv/bin/octoprint serve
|
Group=octoprint
|
||||||
|
ExecStart=/srv/octoprint/venv/bin/octoprint serve
|
||||||
|
|
||||||
[Install]
|
[Install]
|
||||||
WantedBy=multi-user.target
|
WantedBy=multi-user.target
|
||||||
|
|
|
@ -7,18 +7,18 @@ if [ "$EUID" -ne 0 ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
change_password () {
|
change_password () {
|
||||||
local PASSWORD="$(whiptail --title "Change Password" --nocancel --passwordbox "Enter new password for user \"pi\"" 10 50 3>&1 1>&2 2>&3)"
|
local PASSWORD="$(dialog --title "Change Password" --nocancel --insecure --passwordbox "Enter new password for user \"pi\"" 10 50 3>&1 1>&2 2>&3)"
|
||||||
if [[ $? != 0 ]]; then change_password; return 0; fi
|
if [[ $? != 0 ]]; then change_password; return 0; fi
|
||||||
if [[ "$PASSWORD" == "raspberry" ]]; then
|
if [[ "$PASSWORD" == "raspberry" ]]; then
|
||||||
whiptail --title "Change Password" --nocancel --msgbox "That password sucks. Please use a different one :)" 10 50
|
dialog --title "Change Password" --nocancel --msgbox "That password sucks. Please use a different one :)" 10 50
|
||||||
change_password
|
change_password
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
if [[ "$(whiptail --nocancel --passwordbox "Confirm new password for user \"pi\"" 10 50 3>&1 1>&2 2>&3)" == "$PASSWORD" ]]; then
|
if [[ "$(dialog --nocancel --insecure --passwordbox "Confirm new password for user \"pi\"" 10 50 3>&1 1>&2 2>&3)" == "$PASSWORD" ]]; then
|
||||||
if [[ $? != 0 ]]; then return 1; fi
|
if [[ $? != 0 ]]; then return 1; fi
|
||||||
echo -e "pi:$PASSWORD" | chpasswd
|
echo -e "pi:$PASSWORD" | chpasswd
|
||||||
else
|
else
|
||||||
whiptail --title "Change Password" --nocancel --msgbox "Passwords did not match!" 10 50
|
dialog --title "Change Password" --nocancel --msgbox "Passwords did not match!" 10 50
|
||||||
change_password
|
change_password
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
@ -32,7 +32,7 @@ change_password () {
|
||||||
}
|
}
|
||||||
|
|
||||||
service_select () {
|
service_select () {
|
||||||
local SERVICE_MENU=$(whiptail --separate-output --nocancel --title "Select services" --checklist "Enable/disable services" 0 0 0 \
|
local SERVICE_MENU=$(dialog --nocancel --title "Select services" --checklist "Enable/disable services" 0 0 0 \
|
||||||
"1" "OctoPrint" ON \
|
"1" "OctoPrint" ON \
|
||||||
"2" "GUI" ON \
|
"2" "GUI" ON \
|
||||||
"3" "SSH" OFF 3>&1 1>&2 2>&3)
|
"3" "SSH" OFF 3>&1 1>&2 2>&3)
|
||||||
|
@ -50,7 +50,7 @@ service_select () {
|
||||||
}
|
}
|
||||||
|
|
||||||
screen_timeout() {
|
screen_timeout() {
|
||||||
local TIMEOUT=$(whiptail --nocancel --title "Screen Timeout" --inputbox "Input your desired screen timeout in seconds.\nEnter \"off\" to disable the screen timeout.\n\nAdding a screen timeout can reduce screen burn in." 11 60 "0" 3>&1 1>&2 2>&3)
|
local TIMEOUT=$(dialog --nocancel --title "Screen Timeout" --inputbox "Input your desired screen timeout in seconds.\nEnter \"off\" to disable the screen timeout.\n\nAdding a screen timeout can reduce screen burn in." 11 60 "off" 3>&1 1>&2 2>&3)
|
||||||
cat > /home/pi/.xprofile << EOF
|
cat > /home/pi/.xprofile << EOF
|
||||||
xset s ${TIMEOUT}
|
xset s ${TIMEOUT}
|
||||||
xset -dpms
|
xset -dpms
|
||||||
|
@ -58,28 +58,71 @@ screen_timeout() {
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
<< 'EOF'
|
install_package () {
|
||||||
main_menu () {
|
echo "==========Installing $1==========" >>/home/pi/install.log
|
||||||
local MAINMENU=$(whiptail --separate-output --nocancel --title "Pi Setup" --menu "" 10 50 0 \
|
cd /srv/octoprint/ || return 1
|
||||||
"1" "Setup Networking" \
|
source venv/bin/activate || return 1
|
||||||
"2" "Configure services" \
|
pip install $1 2>&1 >>/home/pi/install.log || return 1
|
||||||
"3" "Configure screen timeout" \
|
|
||||||
"4" "Exit" 3>&1 1>&2 2>&3)
|
|
||||||
|
|
||||||
case $MAINMENU in
|
|
||||||
"1") nmtui; main_menu; return 0;;
|
|
||||||
"2") service_select; main_menu; return 0;;
|
|
||||||
"3") screen_timeout; main_menu; return 0;;
|
|
||||||
"4") return 0;;
|
|
||||||
esac
|
|
||||||
}
|
}
|
||||||
EOF
|
|
||||||
|
|
||||||
|
error_install () {
|
||||||
|
dialog --title "ERROR" --msgbox "Error installing $1!" 10 50
|
||||||
|
}
|
||||||
|
|
||||||
|
recommended_menu () {
|
||||||
|
local RECOMMEND_MENU=$(dialog --nocancel --title "Plugin Manager | Recommended Plugins" --checklist "Check plugins that you wish to install" 0 0 0 \
|
||||||
|
"OctoPrint-Dashboard" "Adds a nice dashboard to OctoPrint" ON \
|
||||||
|
"ExcludeRegion" "Select regions of the bed where you don't want to print" ON \
|
||||||
|
"NavbarTemp" "Shows the temperature of the Pi, extruder(s) and bed in the navigation bar" ON \
|
||||||
|
"PrintTimeGenius" "Provides more accurate print time estimates" ON \
|
||||||
|
"HeaterTimeout" "Turns off the hotend and bed after a set amount of time" ON \
|
||||||
|
"Themeify" "Adds theming supports and a few themes to OctoPrint" ON 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
|
RECOMMEND_MENU=($RECOMMEND_MENU)
|
||||||
|
|
||||||
|
for ((i = 0; i < ${#RECOMMEND_MENU[@]}; i++)); do
|
||||||
|
echo $(( $i * 100 / ${#RECOMMEND_MENU[@]} )) | dialog --title "Plugin Manager" --gauge "Installing ${RECOMMEND_MENU[$i]}" 10 50
|
||||||
|
case ${RECOMMEND_MENU[$i]} in
|
||||||
|
"OctoPrint-Dashboard") install_package "https://github.com/StefanCohen/OctoPrint-Dashboard/archive/master.zip" || error_install "OctoPrint-Dashboard"; install_package "https://github.com/OllisGit/OctoPrint-DisplayLayerProgress/releases/latest/download/master.zip" || error_install "OctoPrint-Dashboard";;
|
||||||
|
"ExcludeRegion") install_package "https://github.com/bradcfisher/OctoPrint-ExcludeRegionPlugin/archive/master.zip" || error_install "ExcludeRegion";;
|
||||||
|
"NavbarTemp") install_package "https://github.com/imrahil/OctoPrint-NavbarTemp/archive/master.zip" || error_install "NavbarTemp";;
|
||||||
|
"PrintTimeGenius") install_package "https://github.com/eyal0/OctoPrint-PrintTimeGenius/archive/master.zip" || error_install "PrintTimeGenius";;
|
||||||
|
"HeaterTimeout") install_package "https://github.com/google/OctoPrint-HeaterTimeout/archive/master.zip" || error_install "HeaterTimeout";;
|
||||||
|
"Themeify") install_package "https://github.com/birkbjo/OctoPrint-Themeify/archive/master.zip" || error_install "Themeify";;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
suggested_menu () {
|
||||||
|
local SUGGEST_MENU=$(dialog --nocancel --title "Plugin Manager | Suggested Plugins" --checklist "Check plugins that you wish to install" 0 0 0 \
|
||||||
|
"TouchUI" "Makes the UI easier to use on touchscreens" OFF \
|
||||||
|
"Preheat" "Adds a preheat button to preheat the bed and extruder to the temperature set in the selected gcode file" OFF \
|
||||||
|
"ConsolidatedTabs" "Allows you to combine several tabs into one larger tab with draggable and resizable panels" OFF \
|
||||||
|
"DetailedProgress" "Sends commands to your printer to display current printing progress" OFF 3>&1 1>&2 2>&3)
|
||||||
|
|
||||||
|
SUGGEST_MENU=($SUGGEST_MENU)
|
||||||
|
|
||||||
|
for ((i = 0; i < ${#SUGGEST_MENU[@]}; i++)); do
|
||||||
|
echo $(( $i * 100 / ${#SUGGEST_MENU[@]} )) | dialog --title "Plugin Manager" --gauge "Installing ${SUGGEST_MENU[$i]}" 10 50
|
||||||
|
case ${SUGGEST_MENU[$i]} in
|
||||||
|
"TouchUI") install_package "https://github.com/BillyBlaze/OctoPrint-TouchUI/archive/master.zip" || error_install "TouchUI";;
|
||||||
|
"Preheat") install_package "https://github.com/marian42/octoprint-preheat/archive/master.zip" || error_install "Preheat";;
|
||||||
|
"ConsolidatedTabs") install_package "https://github.com/jneilliii/OctoPrint-ConsolidatedTabs/archive/master.zip" || error_install "ConsolidatedTabs";;
|
||||||
|
"DetailedProgress") install_package "https://github.com/tpmullan/OctoPrint-DetailedProgress/archive/master.zip" || error_install "DetailedProgress";;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
dialog --title "NOTICE" --nocancel --colors --msgbox "This collection of software is currently in alpha. It is lacking several critical features. \Zb\Z1DO NOT\Zn use this in a production environment. This image has been provided for testing purposes only." 10 50
|
||||||
change_password || return 1
|
change_password || return 1
|
||||||
whiptail --title "Network Configuration" --nocancel --msgbox "Setup will now open nmtui, a program to help configure your ethernet/wireless interfaces. Hit Quit when you are done." 10 50
|
dialog --title "Network Configuration" --nocancel --msgbox "Setup will now open nmtui, a program to help configure your ethernet/wireless interfaces. Hit Quit when you are done." 10 50
|
||||||
nmtui
|
nmtui
|
||||||
service_select || return 1
|
service_select || return 1
|
||||||
screen_timeout || return 1
|
screen_timeout || return 1
|
||||||
|
if dialog --title "Plugin Manager" --yesno "Do you wish to preinstall some suggested plugins?" 10 60; then
|
||||||
|
recommended_menu || return 1
|
||||||
|
suggested_menu || return 1
|
||||||
|
fi
|
||||||
rm /etc/systemd/system/getty@tty1.service.d/override.conf
|
rm /etc/systemd/system/getty@tty1.service.d/override.conf
|
||||||
rm /etc/profile.d/first-time.sh
|
rm /etc/profile.d/first-time.sh
|
||||||
reboot
|
reboot
|
||||||
|
|
|
@ -7,26 +7,26 @@ fi
|
||||||
|
|
||||||
|
|
||||||
change_password () {
|
change_password () {
|
||||||
local PASSWORD="$(whiptail --title "Change Password" --nocancel --passwordbox "Enter new password for user \"pi\"" 10 50 3>&1 1>&2 2>&3)"
|
local PASSWORD="$(dialog --title "Change Password" --nocancel --insecure --passwordbox "Enter new password for user \"pi\"" 10 50 3>&1 1>&2 2>&3)"
|
||||||
if [[ $? -eq 0 ]] || [[ $PASSWORD == "" ]]; then return 1; fi
|
if [[ $? -ne 0 ]] || [[ $PASSWORD == "" ]]; then return 1; fi
|
||||||
if [[ "$PASSWORD" == "raspberry" ]]; then
|
if [[ "$PASSWORD" == "raspberry" ]]; then
|
||||||
whiptail --title "Change Password" --nocancel --msgbox "That password sucks. Please use a different one :)" 10 50
|
dialog --title "Change Password" --nocancel --msgbox "That password sucks. Please use a different one :)" 10 50
|
||||||
change_password
|
change_password
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
if [[ "$(whiptail --nocancel --passwordbox "Confirm new password for user \"pi\"" 10 50 3>&1 1>&2 2>&3)" == "$PASSWORD" ]]; then
|
if [[ "$(dialog --nocancel --insecure --passwordbox "Confirm new password for user \"pi\"" 10 50 3>&1 1>&2 2>&3)" == "$PASSWORD" ]]; then
|
||||||
if [[ $? != 0 ]]; then return 1; fi
|
if [[ $? != 0 ]]; then return 1; fi
|
||||||
echo -e "pi:$PASSWORD" | chpasswd
|
echo -e "pi:$PASSWORD" | chpasswd
|
||||||
else
|
else
|
||||||
whiptail --title "Change Password" --nocancel --msgbox "Passwords did not match!" 10 50
|
dialog --title "Change Password" --nocancel --msgbox "Passwords did not match!" 10 50
|
||||||
change_password
|
change_password
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
unset $PASSWORD
|
unset PASSWORD
|
||||||
}
|
}
|
||||||
|
|
||||||
service_select () {
|
service_select () {
|
||||||
local SERVICE_MENU=$(whiptail --separate-output --nocancel --title "Select services" --checklist "Enable/disable services" 0 0 0 \
|
local SERVICE_MENU=$(dialog --separate-output --nocancel --title "Select services" --checklist "Enable/disable services" 0 0 0 \
|
||||||
"1" "OctoPrint" $(if [[ -f /etc/systemd/system/multi-user.target.wants/octoprint.service ]]; then echo "ON"; else echo "OFF"; fi) \
|
"1" "OctoPrint" $(if [[ -f /etc/systemd/system/multi-user.target.wants/octoprint.service ]]; then echo "ON"; else echo "OFF"; fi) \
|
||||||
"2" "GUI" $(if [[ $(systemctl get-default) == "graphical.target" ]]; then echo "ON"; else echo "OFF"; fi) \
|
"2" "GUI" $(if [[ $(systemctl get-default) == "graphical.target" ]]; then echo "ON"; else echo "OFF"; fi) \
|
||||||
"3" "SSH" $(if [[ -f /etc/systemd/system/multi-user.target.wants/ssh.service ]]; then echo "ON"; else echo "OFF"; fi) 3>&1 1>&2 2>&3)
|
"3" "SSH" $(if [[ -f /etc/systemd/system/multi-user.target.wants/ssh.service ]]; then echo "ON"; else echo "OFF"; fi) 3>&1 1>&2 2>&3)
|
||||||
|
@ -86,7 +86,7 @@ EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
screen_timeout() {
|
screen_timeout() {
|
||||||
local TIMEOUT=$(whiptail --nocancel --title "Screen Timeout" --inputbox "Input your desired screen timeout in seconds.\nEnter \"off\" to disable the screen timeout.\n\nAdding a screen timeout can reduce screen burn in." 11 60 "0" 3>&1 1>&2 2>&3)
|
local TIMEOUT=$(dialog --nocancel --title "Screen Timeout" --inputbox "Input your desired screen timeout in seconds.\nEnter \"off\" to disable the screen timeout.\n\nAdding a screen timeout can reduce screen burn in." 11 60 "0" 3>&1 1>&2 2>&3)
|
||||||
cat > /home/pi/.xprofile << EOF
|
cat > /home/pi/.xprofile << EOF
|
||||||
xset s ${TIMEOUT}
|
xset s ${TIMEOUT}
|
||||||
xset -dpms
|
xset -dpms
|
||||||
|
@ -95,7 +95,7 @@ EOF
|
||||||
}
|
}
|
||||||
|
|
||||||
main_menu () {
|
main_menu () {
|
||||||
local MAINMENU=$(whiptail --separate-output --nocancel --title "Pi Setup" --menu "" 10 50 0 \
|
local MAINMENU=$(dialog --nocancel --title "Pi Setup" --menu "" 10 50 0 \
|
||||||
"1" "Configure Networking" \
|
"1" "Configure Networking" \
|
||||||
"2" "Change password for pi" \
|
"2" "Change password for pi" \
|
||||||
"3" "Configure services" \
|
"3" "Configure services" \
|
||||||
|
@ -112,6 +112,6 @@ main_menu () {
|
||||||
}
|
}
|
||||||
|
|
||||||
main_menu
|
main_menu
|
||||||
if whiptail --title "Reboot Confirmation" --yesno "Some changes require a reboot to take effect.\nDo you want to reboot now?" 10 50; then
|
if dialog --title "Reboot Confirmation" --yesno "Some changes require a reboot to take effect.\nDo you want to reboot now?" 10 50; then
|
||||||
reboot
|
reboot
|
||||||
fi
|
fi
|
||||||
|
|
Loading…
Reference in a new issue