freedomboneeee/src/freedombone-prep

300 lines
9.4 KiB
Bash
Executable File

#!/bin/bash
#
# .---. . .
# | | |
# |--- .--. .-. .-. .-.| .-. .--.--. |.-. .-. .--. .-.
# | | (.-' (.-' ( | ( )| | | | )( )| | (.-'
# ' ' --' --' -' - -' ' ' -' -' -' ' - --'
#
# Freedom in the Cloud
#
# This script installs the Debian image to the microSD card, and should
# be run on your laptop/desktop with the microSD card plugged in.
# License
# =======
#
# Copyright (C) 2014-2015 Bob Mottram <bob@robotics.uk.to>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# The number of arguments
NO_OF_ARGS=$#
# Version number of this script
VERSION="1.01"
# typically /dev/sdb or /dev/sdc, depending upon how
# many drives there are on your system
MICROSD_DRIVE=
# IP address of the router (gateway)
ROUTER_IP_ADDRESS="192.168.1.254"
# The fixed IP address of the Beaglebone Black on your local network
BBB_FIXED_IP_ADDRESS="192.168.1.55"
# DNS
NAMESERVER1='213.73.91.35'
NAMESERVER2='85.214.20.141'
MICROSD_MOUNT_POINT="/media/$USER"
DEBIAN_FILE_NAME="bone-debian-8.1-console-armhf-2015-07-12-2gb"
# Downloads for the Debian installer
DOWNLOAD_LINK1="https://rcn-ee.com/rootfs/bb.org/testing/2015-07-12/console/$DEBIAN_FILE_NAME.img.xz"
ROOTFS='rootfs'
PARTITION_NUMBER=1
function show_help {
echo ''
echo 'freedombone-prep -d [microSD device] --ip [BBB LAN IP address] --iprouter [Router LAN IP address] --mount [mount directory]'
echo ''
echo 'See the manpage for more details'
echo ''
}
# if no arguments are given
if [[ $NO_OF_ARGS == 0 ]]; then
show_help
exit 0
fi
if [ -d /media ]; then
# different directories for Debian
if [ -d /media/usb1 ]; then
MICROSD_MOUNT_POINT=/media
ROOTFS=usb1
fi
if [ -d /media/usb0 ]; then
MICROSD_MOUNT_POINT=/media
fi
fi
if [ ! -d $MICROSD_MOUNT_POINT ]; then
echo "The mount directory $MICROSD_MOUNT_POINT does not exist."
echo 'Use the --mount option to specify where the microSD gets mounted to.'
exit 67563
fi
echo "MICROSD_MOUNT_POINT=$MICROSD_MOUNT_POINT"
while [[ $# > 1 ]]
do
key="$1"
case $key in
-h|--help)
show_help
;;
# Drive path for the microSD
-d|--drive)
shift
MICROSD_DRIVE="$1"
;;
# BBB static IP address on the LAN
--ip)
shift
BBB_FIXED_IP_ADDRESS="$1"
;;
# Router IP address on the LAN
--iprouter)
shift
ROUTER_IP_ADDRESS="$1"
;;
# mount point
--mount)
shift
MICROSD_MOUNT_POINT="$1"
;;
# nameserver 1
--ns1)
shift
NAMESERVER1="$1"
;;
# nameserver 2
--ns2)
shift
NAMESERVER2="$1"
;;
*)
# unknown option
;;
esac
shift
done
if [ ! $MICROSD_DRIVE ]; then
echo 'You need to specify a drive for the connected microSD.'
echo 'This can most easily be found by removing the microSD, then'
echo 'running:'
echo ''
echo ' ls /dev/sd*'
echo ''
echo 'or'
echo ''
echo ' ls /dev/mmcblk*'
echo ''
echo 'Then plugging the microSD back in and entering the same command again'
exit 1
fi
if [ ! -b ${MICROSD_DRIVE}${PARTITION_NUMBER} ]; then
if [ -b ${MICROSD_DRIVE}p${PARTITION_NUMBER} ]; then
PARTITION_NUMBER=p${PARTITION_NUMBER}
else
echo "The microSD drive could not be found at ${MICROSD_DRIVE}1"
exit 2
fi
fi
SUDO=
if [ -f /usr/bin/sudo ]; then
SUDO='sudo'
fi
$SUDO apt-get install p7zip dd wget
if [ ! -d ~/freedombone ]; then
mkdir ~/freedombone
fi
cd ~/freedombone
if [ ! -f ~/freedombone/$DEBIAN_FILE_NAME.img.xz ]; then
if [ ! -f ~/freedombone/$DEBIAN_FILE_NAME.img ]; then
wget $DOWNLOAD_LINK1
fi
fi
echo 'Extracting image...'
xz -d $DEBIAN_FILE_NAME.img.xz
if [ ! -f ~/freedombone/$DEBIAN_FILE_NAME.img ]; then
echo "Couldn't extract image"
exit 4
fi
cd ~/freedombone
echo 'Flashing image. This may take a while.'
$SUDO dd if=$DEBIAN_FILE_NAME.img of=$MICROSD_DRIVE
sync
sleep 5
if [ -d $MICROSD_MOUNT_POINT/$ROOTFS ]; then
umount $MICROSD_MOUNT_POINT/$ROOTFS
$SUDO rm $MICROSD_MOUNT_POINT/$ROOTFS
fi
$SUDO mkdir -p $MICROSD_MOUNT_POINT/$ROOTFS
$SUDO mount ${MICROSD_DRIVE}${PARTITION_NUMBER} $MICROSD_MOUNT_POINT/$ROOTFS
sync
if [ ! -b ${MICROSD_DRIVE}${PARTITION_NUMBER} ]; then
echo ''
echo "The microSD drive could not be found at ${MICROSD_DRIVE}${PARTITION_NUMBER}"
read -p "Wait for the drive to mount then press any key... " -n1 -s
if [ ! -b ${MICROSD_DRIVE}${PARTITION_NUMBER} ]; then
echo "microSD drive not found at ${MICROSD_DRIVE}${PARTITION_NUMBER}"
exit 5
fi
fi
if [ ! -d $MICROSD_MOUNT_POINT/$ROOTFS ]; then
echo ''
echo "The rootfs partition $MICROSD_MOUNT_POINT/$ROOTFS was not found."
ls $MICROSD_MOUNT_POINT
exit 65688
fi
if [ ! -d $MICROSD_MOUNT_POINT/$ROOTFS/home ]; then
echo ''
echo "The rootfs partition was not written correctly."
ls $MICROSD_MOUNT_POINT/$ROOTFS
exit 65688
fi
$SUDO sed -i 's/iface eth0 inet dhcp/iface eth0 inet static/g' $MICROSD_MOUNT_POINT/$ROOTFS/etc/network/interfaces
$SUDO sed -i "/iface eth0 inet static/a\ dns-nameservers $NAMESERVER1 $NAMESERVER2" $MICROSD_MOUNT_POINT/$ROOTFS/etc/network/interfaces
$SUDO sed -i "/iface eth0 inet static/a\ gateway $ROUTER_IP_ADDRESS" $MICROSD_MOUNT_POINT/$ROOTFS/etc/network/interfaces
$SUDO sed -i '/iface eth0 inet static/a\ netmask 255.255.255.0' $MICROSD_MOUNT_POINT/$ROOTFS/etc/network/interfaces
$SUDO sed -i "/iface eth0 inet static/a\ address $BBB_FIXED_IP_ADDRESS" $MICROSD_MOUNT_POINT/$ROOTFS/etc/network/interfaces
$SUDO sed -i '/iface usb0 inet static/,/ gateway 192.168.7.1/ s/^/#/' $MICROSD_MOUNT_POINT/$ROOTFS/etc/network/interfaces
hexarray=( 1 2 3 4 5 6 7 8 9 0 a b c d e f )
a=${hexarray[$RANDOM%16]}${hexarray[$RANDOM%16]}
b=${hexarray[$RANDOM%16]}${hexarray[$RANDOM%16]}
c=${hexarray[$RANDOM%16]}${hexarray[$RANDOM%16]}
d=${hexarray[$RANDOM%16]}${hexarray[$RANDOM%16]}
e=${hexarray[$RANDOM%16]}${hexarray[$RANDOM%16]}
$SUDO sed -i "s|#hwaddress ether.*|hwaddress ether de:$a:$b:$c:$d:$e|g" $MICROSD_MOUNT_POINT/$ROOTFS/etc/network/interfaces
$SUDO sed -i "s/nameserver.*/nameserver $NAMESERVER1/g" $MICROSD_MOUNT_POINT/$ROOTFS/etc/resolv.conf
$SUDO sed -i "/nameserver $NAMESERVER1/a\nameserver $NAMESERVER2" $MICROSD_MOUNT_POINT/$ROOTFS/etc/resolv.conf
# copy the commands to the card
$SUDO cp -f $(which freedombone)* $MICROSD_MOUNT_POINT/$ROOTFS/usr/local/bin/
$SUDO cp -f $(which zeronetavahi)* $MICROSD_MOUNT_POINT/$ROOTFS/usr/local/bin/
$SUDO cp -f $MICROSD_MOUNT_POINT/$ROOTFS/usr/local/bin/freedombone-mesh $MICROSD_MOUNT_POINT/$ROOTFS/usr/local/bin/mesh
$SUDO cp -f $MICROSD_MOUNT_POINT/$ROOTFS/usr/local/bin/freedombone-meshweb $MICROSD_MOUNT_POINT/$ROOTFS/usr/local/bin/meshweb
if [ ! -f $MICROSD_MOUNT_POINT/$ROOTFS/usr/local/bin/freedombone ]; then
echo 'There was a problem with writing freedombone commands to the SD card'
exit 8736
fi
# remove automatic motd creator if it exists
if [ -f $MICROSD_MOUNT_POINT/$ROOTFS/etc/init.d/motd ]; then
$SUDO rm -f $MICROSD_MOUNT_POINT/$ROOTFS/etc/init.d/motd
fi
# change the motd to show further install instructions
echo '' >> /tmp/freedombone_motd
echo 'Create a user for the system with:' >> /tmp/freedombone_motd
echo '' >> /tmp/freedombone_motd
echo ' adduser [username]' >> /tmp/freedombone_motd
echo '' >> /tmp/freedombone_motd
echo 'Enter the command "exit" a couple of times to get back to your main system' >> /tmp/freedombone_motd
echo 'then log back in as the user you just created with:' >> /tmp/freedombone_motd
echo '' >> /tmp/freedombone_motd
echo " ssh [username]@$BBB_FIXED_IP_ADDRESS" >> /tmp/freedombone_motd
echo '' >> /tmp/freedombone_motd
echo 'and use the "su" command to become the root user again.' >> /tmp/freedombone_motd
echo '' >> /tmp/freedombone_motd
echo 'Finally you can use the freedombone command to install a server configuration:' >> /tmp/freedombone_motd
echo '' >> /tmp/freedombone_motd
echo ' apt-get update' >> /tmp/freedombone_motd
echo ' apt-get -y install git dialog build-essential' >> /tmp/freedombone_motd
echo ' freedombone menuconfig' >> /tmp/freedombone_motd
$SUDO cp -f /tmp/freedombone_motd $MICROSD_MOUNT_POINT/$ROOTFS/etc/motd
clear
echo '*** Initial microSD card setup is complete ***'
echo ''
echo 'To avoid running out of disk space you may first wish to resize the'
echo 'partition to the size of your microSD card, using something like gparted.'
echo ''
echo 'The microSD card can now be removed and inserted into the Beaglebone Black.'
echo 'Once the Beaglebone has booted then you can log in with:'
echo ''
echo " ssh root@$BBB_FIXED_IP_ADDRESS"
echo ''
echo 'The root password should be changed with the command "passwd".'
cat /tmp/freedombone_motd
rm /tmp/freedombone_motd
$SUDO umount $MICROSD_MOUNT_POINT/$ROOTFS
sync
if [ -d $MICROSD_MOUNT_POINT/$ROOTFS ]; then
$SUDO rm -rf $MICROSD_MOUNT_POINT/$ROOTFS
fi
exit 0