progress dialog working

The ellipses cause errors, so they were removed.

I was on the right track with the associate array, but it would
previously execute the commands out of order.  Following directions
from the URL in the comments, I made another array that helps keep the
array in the order.
This commit is contained in:
Jacob Salmela 2015-10-29 20:10:30 -05:00 committed by dschaper
parent 4229a3e5e9
commit dfe1b126c4

View file

@ -33,7 +33,7 @@ IPv6addr=$(ip addr show | awk '/scope\ global/ && /ff:fe/ {print $2}' | cut -d'/
backupLegacyPihole() backupLegacyPihole()
{ {
if [[ -f /etc/dnsmasq.d/adList.conf ]];then if [[ -f /etc/dnsmasq.d/adList.conf ]];then
echo "Original Pi-hole detected. Initiating sub space transport..." echo "Original Pi-hole detected. Initiating sub space transport"
sudo mkdir -p /etc/pihole/original/ sudo mkdir -p /etc/pihole/original/
sudo mv /etc/dnsmasq.d/adList.conf /etc/pihole/original/adList.conf.$(date "+%Y-%m-%d") sudo mv /etc/dnsmasq.d/adList.conf /etc/pihole/original/adList.conf.$(date "+%Y-%m-%d")
sudo mv /etc/dnsmasq.conf /etc/pihole/original/dnsmasq.conf.$(date "+%Y-%m-%d") sudo mv /etc/dnsmasq.conf /etc/pihole/original/dnsmasq.conf.$(date "+%Y-%m-%d")
@ -51,10 +51,10 @@ fi
backupLegacyPihole backupLegacyPihole
# Display the welcome dialog # Display the welcome dialog
whiptail --msgbox --backtitle "Welcome..." --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" $r $c whiptail --msgbox --backtitle "Welcome" --title "Pi-hole automated installer" "This installer will transform your Raspberry Pi into a network-wide ad blocker!" $r $c
# Explain the need for a static address # Explain the need for a static address
whiptail --msgbox --backtitle "Initating network interface..." --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly. whiptail --msgbox --backtitle "Initating network interface" --title "Static IP Needed" "The Pi-hole is a SERVER so it needs a STATIC IP ADDRESS to function properly.
In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c In the next section, you can choose to use your current network settings (DHCP) or to manually edit them." $r $c
@ -65,7 +65,7 @@ if (whiptail --title "Static IP Address" --yesno "Do you want to use your curren
Subnet mask: $IPv4mask Subnet mask: $IPv4mask
Gateway: $IPv4gw" $r $c) then Gateway: $IPv4gw" $r $c) then
# If they choose yes, let the user know that the IP address will not be available via DHCP and may cause a conflict. # If they choose yes, let the user know that the IP address will not be available via DHCP and may cause a conflict.
whiptail --msgbox --backtitle "IP information..." --title "FYI: IP Conflict" "It is possible your router could still try to assign this IP to a device, which would cause a conflict. But in most cases the router is smart enough to not do that. whiptail --msgbox --backtitle "IP information" --title "FYI: IP Conflict" "It is possible your router could still try to assign this IP to a device, which would cause a conflict. But in most cases the router is smart enough to not do that.
If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want. If you are worried, either manually set the address, or modify the DHCP reservation pool so it does not include the IP you want.
@ -78,15 +78,15 @@ else
until [[ $ipSettingsCorrect = True ]] until [[ $ipSettingsCorrect = True ]]
do do
# Ask for the IPv4 address # Ask for the IPv4 address
IPv4addr=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3) IPv4addr=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 address" --inputbox "Enter your desired IPv4 address" $r $c $IPv4addr 3>&1 1>&2 2>&3)
if [[ $? = 0 ]];then if [[ $? = 0 ]];then
echo "Your static IPv4 address: $IPv4addr" echo "Your static IPv4 address: $IPv4addr"
# Ask for the subnet mask # Ask for the subnet mask
IPv4mask=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3) IPv4mask=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 netmask" --inputbox "Enter your desired IPv4 subnet mask" $r $c $IPv4mask 3>&1 1>&2 2>&3)
if [[ $? = 0 ]];then if [[ $? = 0 ]];then
echo "Your static IPv4 netmask: $IPv4mask" echo "Your static IPv4 netmask: $IPv4mask"
# Ask for the gateway # Ask for the gateway
IPv4gw=$(whiptail --backtitle "Calibrating network interface..." --title "IPv4 gateway (router)" --inputbox "Enter your desired IPv4 default gateway" $r $c $IPv4gw 3>&1 1>&2 2>&3) IPv4gw=$(whiptail --backtitle "Calibrating network interface" --title "IPv4 gateway (router)" --inputbox "Enter your desired IPv4 default gateway" $r $c $IPv4gw 3>&1 1>&2 2>&3)
if [[ $? = 0 ]];then if [[ $? = 0 ]];then
echo "Your static IPv4 gateway: $IPv4gw" echo "Your static IPv4 gateway: $IPv4gw"
# Give the user a chance to review their settings before moving on # Give the user a chance to review their settings before moving on
@ -127,50 +127,52 @@ else
fi fi
# These are the commands to actually install the Pi-hole # These are the commands to actually install the Pi-hole
# Create an associative array so we can display text to the user but run the associated command in the background. # This is pretty ugly, but it works to present a nice front-end
declare -A cmdsAndEchoes=([sudo apt-get update]='Updating...' # http://stackoverflow.com/questions/29161323/how-to-keep-associative-array-order-in-bash
[sudo apt-get -y upgrade]='Upgrading...' # Maybe it would be better to just show the command output instead of the progress bar
[sudo apt-get -y install dnsutils bc toilet]='Installing chronomoter tools...' declare -A commands; declare -a echoes;
[sudo apt-get -y install dnsmasq]='Installing a DNS server...' commands["Updating"]="sudo apt-get update"; echoes+=( "Updating" )
[sudo apt-get -y install lighttpd php5-common php5-cgi php5]='Instaling a Web server and PHP...' commands["Upgrading"]="sudo apt-get -y upgrade"; echoes+=( "Upgrading" )
[sudo mkdir /var/www/html]='Making an HTML folder...' commands["Installing chronomoter tools"]="sudo apt-get -y install dnsutils bc toilet"; echoes+=( "Installing chronomoter tools" )
[sudo chown www-data:www-data /var/www/html]='Setting permissions for the Web server...' commands["Installing a DNS server"]="sudo apt-get -y install dnsmasq"; echoes+=( "Installing a DNS server" )
[sudo chmod 775 /var/www/html]='Setting permissions for the Web server...' commands["Instaling a Web server and PHP"]="sudo apt-get -y install lighttpd php5-common php5-cgi php5"; echoes+=( "Instaling a Web server and PHP" )
[sudo usermod -a -G www-data pi]='Setting permissions for the Web server...' commands["Making an HTML folder"]="sudo mkdir /var/www/html"; echoes+=( "Making an HTML folder" )
[sudo service dnsmasq stop]='Stopping dnsmasq to modify it...' commands["chowning the Web server"]="sudo chown www-data:www-data /var/www/html"; echoes+=( "chowning the Web server" )
[sudo service lighttpd stop]='Stopping lighttpd to modify it...' commands["chmodding the Web server"]="sudo chmod 775 /var/www/html"; echoes+=( "chmodding the Web server" )
[sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig]='Backing up the dnsmasq config file...' commands["Giving pi access to the Web server"]="sudo usermod -a -G www-data pi"; echoes+=( "Giving pi access to the Web server" )
[sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig]='Backing up the lighttpd config file...' commands["Stopping dnsmasq to modify it"]="sudo service dnsmasq stop"; echoes+=( "Stopping dnsmasq to modify it" )
[sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig]='Backing up the default Web page...' commands["Stopping lighttpd to modify it"]="sudo service lighttpd stop"; echoes+=( "Stopping lighttpd to modify it" )
[sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf]='Installing the dnsmasq config file...' commands["Backing up the dnsmasq config file"]="sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig"; echoes+=( "Backing up the dnsmasq config file" )
[sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf]='Installing the lighttpd config file...' commands["Backing up the lighttpd config file"]="sudo mv /etc/lighttpd/lighttpd.conf /etc/lighttpd/lighttpd.conf.orig"; echoes+=( "Backing up the lighttpd config file" )
[sudo lighty-enable-mod fastcgi fastcgi-php]='Enabling PHP...' commands["Backing up the default Web page"]="sudo mv /var/www/html/index.lighttpd.html /var/www/html/index.lighttpd.orig"; echoes+=( "Backing up the default Web page" )
[sudo mkdir /var/www/html/pihole]='Making a directory for the Web interface...' commands["Installing the dnsmasq config file"]="sudo curl -o /etc/dnsmasq.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/dnsmasq.conf"; echoes+=( "Installing the dnsmasq config file" )
[sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html]='Installing a blank HTML page to take place of ads...' commands["Installing the lighttpd config file"]="sudo curl -o /etc/lighttpd/lighttpd.conf https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/lighttpd.conf"; echoes+=( "Installing the lighttpd config file" )
[sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip]='Downloading the Pi-hole dashboard...' commands["Enabling PHP"]="sudo lighty-enable-mod fastcgi fastcgi-php"; echoes+=( "Enabling PHP" )
[sudo unzip /var/www/master.zip -d /var/www/html/]='Unpacking the dashboard...' commands["Making a directory for the Web interface"]="sudo mkdir /var/www/html/pihole"; echoes+=( "Making a directory for the Web interface" )
[sudo mv /var/www/html/AdminLTE-master /var/www/html/admin]='Renaming the dashboard...' commands["Installing a blank HTML page to take place of ads"]="sudo curl -o /var/www/html/pihole/index.html https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/index.html"; echoes+=( "Installing a blank HTML page to take place of ads" )
[sudo rm /var/www/master.zip 2>/dev/null]='Cleaning up the dashboard temp files...' commands["Downloading the Pi-hole dashboard"]="sudo wget https://github.com/jacobsalmela/AdminLTE/archive/master.zip -O /var/www/master.zip"; echoes+=( "Downloading the Pi-hole dashboard" )
[sudo touch /var/log/pihole.log]='Creating a log file for the Pi-hole...' commands["Unpacking the dashboard"]="sudo unzip /var/www/master.zip -d /var/www/html/"; echoes+=( "Unpacking the dashboard" )
[sudo chmod 644 /var/log/pihole.log]='Making sure the log is readable...' commands["Renaming the dashboard"]="sudo mv /var/www/html/AdminLTE-master /var/www/html/admin"; echoes+=( "Renaming the dashboard" )
[sudo chown dnsmasq:root /var/log/pihole.log]='Letting dnsmasq see the log file so stats can be displayed...' commands["Cleaning up the dashboard temp files"]="sudo rm /var/www/master.zip 2>/dev/null"; echoes+=( "Cleaning up the dashboard temp files" )
[sudo curl -o /usr/local/bin/gravity.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh"]='Initating sub-space transport...' commands["Creating a log file for the Pi-hole"]="sudo touch /var/log/pihole.log"; echoes+=( "Creating a log file for the Pi-hole" )
[sudo curl -o /usr/local/bin/chronometer.sh "https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"]='Initating sub-space transport...' commands["chmodding the log file"]="sudo chmod 644 /var/log/pihole.log"; echoes+=( "chmodding the log file" )
[sudo chmod 755 /usr/local/bin/gravity.sh]='Making the scripts executable...' commands["chowning the log file so stats can be displayed"]="sudo chown dnsmasq:root /var/log/pihole.log"; echoes+=( "chowning the log file so stats can be displayed" )
[sudo chmod 755 /usr/local/bin/chronometer.sh]='Making the scripts executable...' commands["Initating sub-space transport of gravity"]="sudo curl -o /usr/local/bin/gravity.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/gravity.sh"; echoes+=( "Initating sub-space transport of gravity" )
[sudo /usr/local/bin/gravity.sh]='Entering the event horizion...' commands["Initating sub-space transport of chronometer"]="sudo curl -o /usr/local/bin/chronometer.sh https://raw.githubusercontent.com/jacobsalmela/pi-hole/master/advanced/Scripts/chronometer.sh"; echoes+=( "Initating sub-space transport of chronometer" )
[sudo reboot]='Restarting...') commands["chmodding gravity"]="sudo chmod 755 /usr/local/bin/gravity.sh"; echoes+=( "chmodding gravity" )
commands["chmodding the chronometer"]="sudo chmod 755 /usr/local/bin/chronometer.sh"; echoes+=( "chmodding the chronometer" )
commands["Entering the event horizion"]="sudo /usr/local/bin/gravity.sh"; echoes+=( "Entering the event horizion" )
commands["Rebooting"]="sudo reboot"; echoes+=( "Rebooting" )
# Everything in the parentheses is part of displaying the progress bar # Everything in the parentheses is part of displaying the progress bar
( (
# Get total number of commands to be run from the array # Get total number of commands to be run from the array
n=${#cmdsAndEchoes[*]}; n=${#commands[*]};
# Set counter to increase every time a loop completes # Set counter to increase every time a loop completes
i=0 i=0
# For each key in the array # For each item in the array
for key in "${!cmdsAndEchoes[@]}" for k in "${!echoes[@]}"
do do
# Calculate the overall progress # Calculate the overall progress
@ -181,11 +183,13 @@ percent=$(( 100*(++i)/n ))
cat <<EOF cat <<EOF
XXX XXX
$percent $percent
${cmdsAndEchoes[$key]} Step $i of $n: ${echoes[$k]}
XXX XXX
EOF EOF
# Execute the command in the background (hidden from the user, not actually a background process) # Execute the command in the background (hidden from the user, not actually a background process)
$key #${echoes[$k]}
${commands[${echoes[$k]}]}
sleep 1
done done
# As the loop is progressing, the output is sent to whiptail to be displayed to the user # As the loop is progressing, the output is sent to whiptail to be displayed to the user
) | ) |