Skip to content

Instantly share code, notes, and snippets.

@rgstephens
Last active May 18, 2021 12:49
Show Gist options
  • Save rgstephens/2a13fd3f78f847bc3e1d768a577b25d2 to your computer and use it in GitHub Desktop.
Save rgstephens/2a13fd3f78f847bc3e1d768a577b25d2 to your computer and use it in GitHub Desktop.
Raspberry Pi Setup Script
#!/bin/bash
# Whiptail examples - http://xmodulo.com/create-dialog-boxes-interactive-shell-script.html
oldhostname=$(hostname)
newhostname=$(whiptail --title "Hostname" --inputbox "Change hostname?" 10 60 $oldhostname 3>&1 1>&2 2>&3)
export exitstatus=$?
if [ $exitstatus != 0 ]; then
exit $exitstatus
fi
toemail=$(whiptail --title "gmail" --inputbox "Enter gmail (w/o @gmail.com) address to notify when script is done" 10 60 3>&1 1>&2 2>&3)
export exitstatus=$?
if [ $exitstatus != 0 ]; then
exit $exitstatus
fi
if [ -n "$toemail" ]
then
emailpass=$(whiptail --title "${toemail} Password" --passwordbox "Enter ${toemail}'s password" 10 60 3>&1 1>&2 2>&3)
fi
# pass=$(whiptail --title "Pi Password" --inputbox "Enter the Pi user password" 10 60 raspberry 3>&1 1>&2 2>&3)
timezone=$(whiptail --title "Timezone" --radiolist \
"What is your timezone?" 15 60 4 \
"US/Pacific" "" ON \
"Europe/Berlin" "" OFF 3>&1 1>&2 2>&3)
export exitstatus=$?
if [ $exitstatus != 0 ]; then
exit $exitstatus
fi
newuser=$(whiptail --title "Username" --inputbox "Enter new username if you want one" 10 60 3>&1 1>&2 2>&3)
if [ -n "$newuser" ]
then
newuserpass=$(whiptail --title "${newuser} Password" --passwordbox "Enter ${newuser}'s password" 10 60 3>&1 1>&2 2>&3)
newuserpasscrypt=$(openssl passwd -crypt ${newuserpass})
sudo useradd -b /home -c ${newuser} -g users -m -p ${newuserpasscrypt} -s /bin/bash ${newuser}
fi
# Optional packages to install
upgradetype=$(whiptail --title "Upgrade" --radiolist \
"Which upgrade type" 20 60 15 \
"none" "None" OFF \
"upgrade" "upgrade" ON \
"dist-upgrade" "dist-upgrade" OFF \
3>&1 1>&2 2>&3)
# Optional packages to install
pkglist=$(whiptail --title "Install Checklist" --checklist \
"Choose packages to install" 20 60 15 \
"emacs" "Emacs" ON \
"git" "Git" ON \
"htop" "htop" ON \
"dnsutils" "dnsutils" ON \
"sendmail" "Sendmail & Mailutils" ON \
"docker" "docker & compose" ON \
"ctop" "ctop" ON \
"xrdp" "XRDP & Conky" OFF \
"dnsmasq" "DNSMasq" OFF \
"shellinabox" "Shell In A Box" OFF \
"rpi" "RPi Monitor" OFF \
"chrome" "Chromium" OFF \
"node" "Upgrade Node.js to 0.12.x" OFF \
"mongodb" "MongoDB" OFF \
"apache" "Apache" OFF \
"freeboard" "Freeboard Dashboard" OFF \
"mqtt" "MQTT Tools" OFF \
"mosquitto" "Mosquitto" OFF \
"mqtt" "MQTT Tools" OFF \
3>&1 1>&2 2>&3)
export exitstatus=$?
if [ $exitstatus != 0 ]; then
exit $exitstatus
fi
# Configuration options
configopts=$(whiptail --title "Configure Options" --checklist \
"Do you want these configured" 15 60 8 \
"nodered" "Node Red nodes" OFF \
"wpa" "WiFi credentials file" OFF \
"Display.News" "Display.News X11 autostart file" OFF \
"rpi" "RPi Monitor" OFF \
3>&1 1>&2 2>&3)
export exitstatus=$?
if [ $exitstatus != 0 ]; then
exit $exitstatus
fi
#for pkg in $pkglist
#do
# case $pkg in
# \"mosca\")
# mqttuser=$(whiptail --title "MQTT User" --inputbox "Enter new Mosca MQTT user" 10 60 3>&1 1>&2 2>&3)
# if [ -n "$mqttuser" ]
# then
# mqttpass=$(whiptail --title "${mqttuser} Password" --passwordbox "Enter ${mqttuser}'s password" 10 60 3>&1 1>&2 2>&3)
# fi
# ;;
# esac
#done
#### start the setup process ####
STARTTIME=$(date +%s)
sudo echo "alias ll='ls -l'" >> ~/.bashrc
# Update timezone
sudo rm /etc/localtime
#sudo ln -s /usr/share/zoneinfo/US/Pacific /etc/localtime
sudo ln -s /usr/share/zoneinfo/${timezone} /etc/localtime
# change hostname
echo "-- Setting hostname"
if [ "$oldhostname" != "$newhostname" ]
then
sudo sed -i "s/$oldhostname/$newhostname/g" /etc/hostname
sudo sed -i "s/$oldhostname/$newhostname/g" /etc/hosts
fi
# create users
echo "-- Removing unneeded packages"
sudo apt-get remove -y wolfram-engine
sudo apt-get remove -y sonic-pi
sudo apt-get -y update
echo apt-get update status: $?
# update and upgrade
if [ "$upgradetype" != "upgrade" ]
then
echo "-- Upgrading all packages"
sudo apt-get -y upgrade
echo apt-get upgrade status: $?
fi
if [ "$upgradetype" != "dist-upgrade" ]
then
echo "-- Running dist-upgrade"
sudo apt-get -y dist-upgrade
echo apt-get dist-upgrade status: $?
fi
# remove unneeded packages, ideas from https://blog.samat.org/2015/02/05/slimming-an-existing-raspbian-install/
# nmap network discovery
sudo apt-get -y nmap aptitude
## package selected from install list
for pkg in $pkglist
do
case $pkg in
\"node\")
#echo "-- Removing old Node.js, Mosca needs newer version"
#sudo apt-get -y remove nodejs-legacy nodejs-dev nodejs
#sudo apt-get -y remove npm
#echo "-- Installing latest Node.js for Mosca"
# these steps got me v4.4.0 in March 2016
#curl -sL https://deb.nodesource.com/setup_4.x | sudo bash -
#sudo apt-get install -y build-essential python-dev python-rpi.gpio nodejs
# Need 0.12 for Mosca - this does 0.12.6
#wget http://node-arm.herokuapp.com/node_archive_armhf.deb
#sudo dpkg -i node_archive_armhf.deb
#sudo ln -s /usr/local/bin/node /usr/bin/node
#sudo apt-get install -y npm
# Install startup files
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/nodered.service -O /lib/systemd/system/nodered.service
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-start -O /usr/bin/node-red-start
sudo wget https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/node-red-stop -O /usr/bin/node-red-stop
sudo chmod +x /usr/bin/node-red-st*
sudo systemctl daemon-reload
sudo systemctl start nodered
sudo systemctl enable nodered.service
# For older Pi's (installed 4.2.1 in March 2016)
# wget http://node-arm.herokuapp.com/node_latest_armhf.deb
# sudo dpkg -i node_latest_armhf.deb
# sudo apt-get install -y build-essential python-dev npm
;;
\"xrdp\")
echo "-- Installing XRDP"
sudo apt-get install -y xrdp
sudo apt-get install -y conky
;;
\"emacs\")
echo "-- Installing emacs"
sudo apt-get install -y emacs
;;
\"htop\")
echo "-- Installing htop"
sudo apt-get install -y htop
;;
\"git\")
echo "-- Installing git"
sudo apt-get install -y git
;;
\"dnsutils\")
echo "-- Installing dnsutils"
sudo apt-get install -y dnsutils
;;
\"docker\")
sudo apt install -y python3-pip
echo "-- Installing docker"
sudo apt-get install -y docker.io
echo "-- Installing docker-compose"
sudo pip3 install docker-compose
;;
\"ctop\")
echo "-- Installing ctop"
sudo wget https://github.com/bcicen/ctop/releases/download/v0.7.2/ctop-0.7.2-linux-arm -O /usr/local/bin/ctop
sudo chmod +x /usr/local/bin/ctop
;;
\"dnsmasq\")
echo "-- Installing dnsmasq"
# DNS & DHCP
sudo apt-get -y install dnsmasq
;;
\"sendmail\")
echo "-- Installing sendmail"
# Sendmail
sudo apt-get -y install sendemail libio-socket-ssl-perl libnet-ssleay-perl
sudo apt-get -y mail mbox mailutils
;;
\"shellinabox\")
echo "-- Installing shellinabox"
# shell in a box /Webgui
sudo apt-get -y install shellinabox
;;
\"rpi\")
echo "-- Installing RPi Monitor"
# RPi Monitor
sudo apt-get -y install apt-transport-https ca-certificates
sudo apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 2C0D3C0F
sudo wget http://goo.gl/rsel0F -O /etc/apt/sources.list.d/rpimonitor.list
sudo apt-get update
sudo apt-get -y install rpimonitor
sudo apt-get -y install aptitude
sudo apt-get upgrade
sudo /usr/share/rpimonitor/scripts/updatePackagesStatus.pl
# Remove the RPi Monitor list because it causes cache problems updating other packages
sudo rm /etc/apt/sources.list.d/rpimonitor.list
# RPi Monitor
#wget https://github.com/XavierBerger/RPi-Monitor-deb/raw/master/packages/rpimonitor_2.10.1-1_all.deb
#wget https://github.com/XavierBerger/RPi-Monitor-deb/blob/master/packages/rpimonitor_2.10-1_all.deb
;;
\"chrome\")
echo "-- Installing Chromium"
# chrome
wget https://dl.dropboxusercontent.com/u/87113035/chromium-browser-l10n_45.0.2454.85-0ubuntu0.15.04.1.1181_all.deb
wget https://dl.dropboxusercontent.com/u/87113035/chromium-browser_45.0.2454.85-0ubuntu0.15.04.1.1181_armhf.deb
wget https://dl.dropboxusercontent.com/u/87113035/chromium-codecs-ffmpeg-extra_45.0.2454.85-0ubuntu0.15.04.1.1181_armhf.deb
sudo dpkg -i chromium-codecs-ffmpeg-extra_45.0.2454.85-0ubuntu0.15.04.1.1181_armhf.deb
sudo dpkg -i chromium-browser-l10n_45.0.2454.85-0ubuntu0.15.04.1.1181_all.deb chromium-browser_45.0.2454.85-0ubuntu0.15.04.1.1181_armhf.deb
rm chromium*
;;
\"mongodb\")
echo "-- Installing MongoDB"
# Mongo test commands: https://docs.mongodb.org/manual/reference/mongo-shell/
# Logfile: /var/log/mongodb/mongod.log
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv EA312927
#echo "deb http://repo.mongodb.org/apt/debian wheezy/mongodb-org/3.2 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.2.list
#sudo apt-get update
#sudo apt-get install -y mongodb-org
#sudo service mongod start
sudo apt-get -y install mongodb
# sudo systemctl status mongodb.service
;;
\"apache\")
echo "-- Installing Apache"
sudo apt-get -y install apache2 php5 libapache2-mod-php5
sudo service apache2 restart
;;
\"freeboard\")
echo "-- Installing Freeboard"
git clone https://github.com/Freeboard/freeboard.git
sudo ln -s freeboard /var/www/freeboard
# /etc/apache2/sites-available/000-default.conf
# <VirtualHost *:81>
# DocumentRoot /var/www/freeboard
# </VirtualHost>
;;
\"mqtt\")
echo "-- Installing MQTT Tools"
sudo npm install mqtt-cli -y -g
;;
\"mosquitto\")
echo "-- Installing Mosquitto"
sudo wget http://repo.mosquitto.org/debian/mosquitto-repo.gpg.key
sudo apt-key add mosquitto-repo.gpg.key
cd /etc/apt/sources.list.d/
sudo wget http://repo.mosquitto.org/debian/mosquitto-jessie.list
sudo apt-get update
# sudo apt-get -y install mosquitto
sudo apt-get -y install mosquitto mosquitto-clients python-mosquitto
sudo git https://gist.github.com/basuke/7777918 /etc/init.d.mosquitto
;;
*)
;;
esac
done
## config options
echo "-- Configuration options"
for pkg in $configopts
do
case $pkg in
\"nodered\")
echo "-- Add nodered packages"
mkdir .node-red
cd .node-red
npm install -y node-gyp node-red-node-mongodb request thethingbox-node-timestamp node-red-contrib-deduplicate node-red-contrib-textbelt
# Startup services
sudo systemctl enable nodered.service
;;
\"wpa\")
sudo cp wpa_supplicant.conf /etc/wpa_supplicant
;;
\"Display.News\")
sudo cp 80autostart /etc/X11/Xsession.d
;;
\"rpi\")
sudo cp /usr/share/rpimonitor/web/addons/top3/top3.cron /etc/cron.d/top3
sudo echo "web.addons.1.name=Shellinabox" >>/etc/rpimonitor/data.conf
sudo echo "web.addons.1.addons=shellinabox" >>/etc/rpimonitor/data.conf
sudo echo "web.addons.2.name=Top3" >>/etc/rpimonitor/data.conf
sudo echo "web.addons.2.addons=top3" >> /etc/rpimonitor/data.conf
sudo sed -i "s/$nbtop=3/$nbtop=10/" /usr/share/rpimonitor/web/addons/top3/top3
sudo service rpimonitor restart
;;
*)
;;
esac
done
ENDTIME=$(date +%s)
ELAPSED=$(($ENDTIME - $STARTTIME))
NICETIME=$(printf '%dh:%dm:%ds\n' $(($ELAPSED/3600)) $(($ELAPSED%3600/60)) $(($ELAPSED%60)))
# Send a text message
ip=`ifconfig|xargs|awk '{print $7}'|sed -e 's/[a-z]*:/''/'`
if [ -n "$phonenum" ]
then
curl http://textbelt.com/text -d number=${phonenum} -d "message=Setup complete, ${NICETIME}, rebooting ${newhostname}, access at IP: ${ip}"
fi
if [ -n "$toemail" ]
then
sendemail -f ${toemail}@gmail.com -t ${toemail}@gmail.com -u "${newhostname} Pi Setup Complete" -m "message=Setup complete, ${NICETIME}, rebooting ${newhostname}, access at IP: ${ip}" -s smtp.gmail.com:587 -o tls=yes -xu ${toemail} -xp ${emailpass}
fi
echo "Setup complete, ${NICETIME}, rebooting ${newhostname}, access at IP: ${ip}"
echo "-- I'm done, rebooting"
sudo reboot
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment