Designdesk

AutoRpi automatic headless image maker for Raspberry PI

Run as root. Copy and paste in a file named autorpi.sh or wget designdesk.org/bash/autorpi.sh && source autorpi.sh

#!/bin/sh
#Start with "source autorpi.sh"
#AutoRPI 1.0 Automatic headless image maker for Raspbian Lite
#2017 Designdesk.org

#Options
basedir="$HOME/AutoRpi"
advanced=;username=;passhashed=;passwd=;wlanset=;wlanssid=;wlanpsk=;hostname=;sshkey=;layout=;resize=;extend=;sndledoff=;skip=;
###Optional automatic setup like this :### username="turtle"; passhashed=y ; passwd="\$1\$VaoXRUzMB/VyxP6VnT7Fbs9y9LjXEFFDd" ; wlanssid="hAfpFKX" ; wlanpsk="HMhMYzyIpy5u0mr0SKBCxVb6lN4lc3NaptfktNNAHv+geUcmQgb" ; hostname="tinycomputer" ; sshkey="ssh-rsa /84r14PMuU7Xv4PLeAiHsQzVXc7zSInsZuVBFIyhJGHU+iC7fITU3kzLvMG2ZzB6A/Zp/+lJu+6IjSGcFFo4vx84ZJ2Rj9OUoFWjE2qMlGwKmr== user@yourpc" ; layout="us" ; resize=y ; extend=y ; sndledoff=y ; advanced=y ; wlanset=y ; skip=y

#Prompts
echo -e "\nAutoRpi 1.0 Automatic headless image maker for Raspbian Lite\n2017 Designdesk.org"
if [ "$skip" != "y" ];then echo -e "\n\nFields marked with * are mandatory\n" ;fi
if [ -z "$advanced" ];then read -p "  Advanced Mode y/N : " advanced ;fi
#Basic
if [ -z "$username" ];then read -p "* Username : " username ; if [ -z $username ];then return;fi;fi
if [ -z "$passwd" ];then read -p "* Password : " passwd ; if [ -z $passwd ];then return;fi;fi
if [ -z "$wlanset" ];then read -p "  Setup wireless lan network Y/n : " wlanset ; if [ -z $wlanset ];then wlanset=y ;fi;fi
if [ "$wlanset" = "y" ];then if [ -z "$wlanssid" ];then read -p "* Wireless network name (SSID) : " wlanssid ;fi
if [ -z "$wlanpsk" ];then read -p "* Wireless network passphrase (PSK) : " wlanpsk ;fi;fi
#Advanced
if [ "$advanced" = "y" ];then
if [ -z "$hostname" ];then read -p "* Hostname for your raspberry pi : " hostname ;fi
if [ -z "$sshkey" ];then read -p "  Enter your public ssh key : " sshkey ; if [ -z $sshkey ];then sshkey=n ;fi
if [ -z "$keyonly" ];then read -p "  Restrict ssh to key only login y/N : " keyonly ;fi;fi
if [ -z "$layout" ];then read -p "  Keyboard Layout choice (default=uk) : " layout ; if [ -z $layout ];then layout=uk ;fi;fi
if [ -z "$resize" ];then read -p "  Disable Auto-Resize y/N : " resize
if [ -z "$extend" ];then read -p "  Extend system partition by 1go Y/n : " extend ; if [ -z $extend ];then extend=y ;fi;fi;fi
if [ -z "$sndledoff" ];then read -p "  Disable Audio and Led y/N : " sndledoff ;fi
else hostname=raspberrypi ;fi; imgname=`echo $hostname".img"`

#Creating directories
mkdir -p $basedir/0/ ; if [ -z "$skip" ];then mkdir -p $basedir/$hostname/etc ; mkdir -p $basedir/$hostname/home ; mkdir -p $basedir/$hostname/root ;else mkdir -p $basedir/$hostname ;fi; mkdir -p $basedir/mnt/boot ; mkdir -p $basedir/mnt/system ; cd $basedir/ ; echo
if [ -z "$skip" ];then read -p "You can add config files / personal files to the etc, home and root directories in : $basedir/$hostname/  before you continue [OK]";fi

#Downloading last raspbian, install pigz for faster decompression and unpack zip
if [ ! -f $basedir/raspbian_lite.zip ]; then echo -e "\nDownloading latest raspbian image and installing pigz for faster decompression\n" ; wget -O raspbian_lite.zip https://downloads.raspberrypi.org/raspbian_lite_latest ; apt-get -y install pigz ; else echo -e "Using previously downloaded raspbian image, make sure its up to date" ;fi
echo -e "\nExtracting ... This can take a few minutes\n" ; pigz -dk $basedir/raspbian_lite.zip && mv $basedir/raspbian_lite $basedir/$imgname

#Mount boot/system partition
mount -o loop,offset=$((8192 * 512)) $basedir/$imgname $basedir/mnt/boot
mount -o loop,offset=$((94208 * 512)) $basedir/$imgname $basedir/mnt/system

#System settings
#Changing default hostname
echo $hostname > $basedir/mnt/system/etc/hostname && sed -i '/127.0.1.1/d' $basedir/mnt/system/etc/hosts && echo "127.0.1.1 $hostname" >> $basedir/mnt/system/etc/hosts

#Changing username/Apply permissions
mv $basedir/mnt/system/home/pi $basedir/mnt/system/home/$username && sed -i '/exit 0/d' $basedir/mnt/system/etc/rc.local
echo "cd /etc && sed -i."\$"(date +'%y%m%d_%H%M%S') 's/"\\"bpi"\\"b/"$username"/g' passwd group shadow gshadow sudoers systemd/system/autologin@.service sudoers.d/* && chown -R "$username":"$username" /home/"$username"/ && chmod 700 /home/"$username"/.ssh/ && chmod 600 /home/"$username"/.ssh/* && sed -i '/#TODEL/d' /etc/rc.local" >> $basedir/mnt/system/etc/rc.local
echo "exit 0" >> $basedir/mnt/system/etc/rc.local

#Changing password
if [ "$passhashed" != "y" ];then passwd=`openssl passwd -1 "$passwd"` ;fi; sed -i '/pi:/d' $basedir/mnt/system/etc/shadow && echo "$username"":""$passwd"":17228:0:99999:7:::" >> $basedir/mnt/system/etc/shadow

#Changing keyboard layout
sed -i '/XKBLAYOUT=/d' $basedir/mnt/system/etc/default/keyboard && echo "XKBLAYOUT=""\""$layout"\"" >> $basedir/mnt/system/etc/default/keyboard

#Setup wireless lan network
if [ "$wlanset" = "y" ];then sed -i -- 's/allow-hotplug wlan0/auto wlan0/g' $basedir/mnt/system/etc/network/interfaces && sed -i -- 's/wlan0 inet manual/wlan0 inet dhcp/g' $basedir/mnt/system/etc/network/interfaces
echo -e "\nnetwork={\nssid="\"""$wlanssid""\""\npsk="\"""$wlanpsk""\""\n}" >> $basedir/mnt/system/etc/wpa_supplicant/wpa_supplicant.conf ;fi

#Add public ssh key
if [ "$sshkey" != "n" ];then mkdir -p $basedir/mnt/system/home/$username/.ssh/ && echo "$sshkey" >> $basedir/mnt/system/home/$username/.ssh/authorized_keys ;fi

#Restrict ssh to unique non-root user/key only login
if [ "$keyonly" = "y" ];then sed -i -- 's/PermitRootLogin without-password/PermitRootLogin no/g' $basedir/mnt/system/etc/ssh/sshd_config ; sed -i -- 's/#PasswordAuthentication yes/PasswordAuthentication no/g' $basedir/mnt/system/etc/ssh/sshd_config ; echo -e "AllowUsers "$username"\nUseDNS no" >> $basedir/mnt/system/etc/ssh/sshd_config ;fi

#Boot settings
#Enable ssh
echo > $basedir/mnt/boot/ssh

#Auto-resize off
if [ "$resize" = "y" ];then sed -i -- 's/ init=\/usr\/lib\/raspi-config\/init_resize.sh//g' $basedir/mnt/boot/cmdline.txt ;fi

#Audio and led off
if [ "$sndledoff" = "y" ];then sed -i '/dtparam=audio/d' $basedir/mnt/boot/config.txt && echo -e "dtparam=audio=off\n\n# Disable Led\ndtparam=act_led_trigger=none\ndtparam=act_led_activelow=on" >> $basedir/mnt/boot/config.txt ;fi
#/Boot settings

#Copy directories with config files / personal files to image
cp -r $basedir/0/. $basedir/mnt/system
cp -r $basedir/$hostname/. $basedir/mnt/system

#Unmounting image
cd && umount $basedir/mnt/boot
umount $basedir/mnt/system

#Extend size of the partition - Add 1go of space to the image
if [ "$extend" = "y" ];then dd if=/dev/zero bs=1M count=1024 >> $basedir/$imgname && parted $basedir/$imgname resizepart 2 100% && fdisk -lu $basedir/$imgname ;fi

echo -e "Image processing finished. Ready to write to memory card\n\n$basedir/$imgname"