mirror of
				https://github.com/brain-hackers/brain-config.git
				synced 2025-11-04 14:38:36 +09:00 
			
		
		
		
	
		
			
				
	
	
		
			1394 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			1394 lines
		
	
	
		
			40 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
#!/bin/sh
 | 
						|
# Part of raspi-config https://github.com/RPi-Distro/raspi-config
 | 
						|
#
 | 
						|
# See LICENSE file for copyright and license details
 | 
						|
 | 
						|
INTERACTIVE=True
 | 
						|
ASK_TO_REBOOT=0
 | 
						|
BLACKLIST=/etc/modprobe.d/raspi-blacklist.conf
 | 
						|
CONFIG=/boot/config.txt
 | 
						|
 | 
						|
is_pione() {
 | 
						|
   if grep -q "^Revision\s*:\s*00[0-9a-fA-F][0-9a-fA-F]$" /proc/cpuinfo; then
 | 
						|
      return 0
 | 
						|
   elif  grep -q "^Revision\s*:\s*[ 123][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]0[0-36][0-9a-fA-F]$" /proc/cpuinfo ; then
 | 
						|
      return 0
 | 
						|
   else
 | 
						|
      return 1
 | 
						|
   fi
 | 
						|
}
 | 
						|
 | 
						|
is_pitwo() {
 | 
						|
   grep -q "^Revision\s*:\s*[ 123][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]04[0-9a-fA-F]$" /proc/cpuinfo
 | 
						|
   return $?
 | 
						|
}
 | 
						|
 | 
						|
is_pizero() {
 | 
						|
   grep -q "^Revision\s*:\s*[ 123][0-9a-fA-F][0-9a-fA-F][0-9a-fA-F]09[0-9a-fA-F]$" /proc/cpuinfo
 | 
						|
   return $?
 | 
						|
}
 | 
						|
 | 
						|
get_pi_type() {
 | 
						|
   if is_pione; then
 | 
						|
      echo 1
 | 
						|
   elif is_pitwo; then
 | 
						|
      echo 2
 | 
						|
   else
 | 
						|
      echo 0
 | 
						|
   fi
 | 
						|
}
 | 
						|
 | 
						|
get_init_sys() {
 | 
						|
  if command -v systemctl > /dev/null && systemctl | grep -q '\-\.mount'; then
 | 
						|
    SYSTEMD=1
 | 
						|
  elif [ -f /etc/init.d/cron ] && [ ! -h /etc/init.d/cron ]; then
 | 
						|
    SYSTEMD=0
 | 
						|
  else
 | 
						|
    echo "Unrecognised init system"
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
calc_wt_size() {
 | 
						|
  # NOTE: it's tempting to redirect stderr to /dev/null, so supress error 
 | 
						|
  # output from tput. However in this case, tput detects neither stdout or 
 | 
						|
  # stderr is a tty and so only gives default 80, 24 values
 | 
						|
  WT_HEIGHT=17
 | 
						|
  WT_WIDTH=$(tput cols)
 | 
						|
 | 
						|
  if [ -z "$WT_WIDTH" ] || [ "$WT_WIDTH" -lt 60 ]; then
 | 
						|
    WT_WIDTH=80
 | 
						|
  fi
 | 
						|
  if [ "$WT_WIDTH" -gt 178 ]; then
 | 
						|
    WT_WIDTH=120
 | 
						|
  fi
 | 
						|
  WT_MENU_HEIGHT=$(($WT_HEIGHT-7))
 | 
						|
}
 | 
						|
 | 
						|
do_about() {
 | 
						|
  whiptail --msgbox "\
 | 
						|
This tool provides a straight-forward way of doing initial
 | 
						|
configuration of the Raspberry Pi. Although it can be run
 | 
						|
at any time, some of the options may have difficulties if
 | 
						|
you have heavily customised your installation.\
 | 
						|
" 20 70 1
 | 
						|
}
 | 
						|
 | 
						|
do_expand_rootfs() {
 | 
						|
  get_init_sys
 | 
						|
  if [ $SYSTEMD -eq 1 ]; then
 | 
						|
    ROOT_PART=$(mount | sed -n 's|^/dev/\(.*\) on / .*|\1|p')
 | 
						|
  else
 | 
						|
    if ! [ -h /dev/root ]; then
 | 
						|
      whiptail --msgbox "/dev/root does not exist or is not a symlink. Don't know how to expand" 20 60 2
 | 
						|
      return 0
 | 
						|
    fi
 | 
						|
    ROOT_PART=$(readlink /dev/root)
 | 
						|
  fi
 | 
						|
 | 
						|
  PART_NUM=${ROOT_PART#mmcblk0p}
 | 
						|
  if [ "$PART_NUM" = "$ROOT_PART" ]; then
 | 
						|
    whiptail --msgbox "$ROOT_PART is not an SD card. Don't know how to expand" 20 60 2
 | 
						|
    return 0
 | 
						|
  fi
 | 
						|
 | 
						|
  # NOTE: the NOOBS partition layout confuses parted. For now, let's only 
 | 
						|
  # agree to work with a sufficiently simple partition layout
 | 
						|
  if [ "$PART_NUM" -ne 2 ]; then
 | 
						|
    whiptail --msgbox "Your partition layout is not currently supported by this tool. You are probably using NOOBS, in which case your root filesystem is already expanded anyway." 20 60 2
 | 
						|
    return 0
 | 
						|
  fi
 | 
						|
 | 
						|
  LAST_PART_NUM=$(parted /dev/mmcblk0 -ms unit s p | tail -n 1 | cut -f 1 -d:)
 | 
						|
  if [ $LAST_PART_NUM -ne $PART_NUM ]; then
 | 
						|
    whiptail --msgbox "$ROOT_PART is not the last partition. Don't know how to expand" 20 60 2
 | 
						|
    return 0
 | 
						|
  fi
 | 
						|
 | 
						|
  # Get the starting offset of the root partition
 | 
						|
  PART_START=$(parted /dev/mmcblk0 -ms unit s p | grep "^${PART_NUM}" | cut -f 2 -d: | sed 's/[^0-9]//g')
 | 
						|
  [ "$PART_START" ] || return 1
 | 
						|
  # Return value will likely be error for fdisk as it fails to reload the
 | 
						|
  # partition table because the root fs is mounted
 | 
						|
  fdisk /dev/mmcblk0 <<EOF
 | 
						|
p
 | 
						|
d
 | 
						|
$PART_NUM
 | 
						|
n
 | 
						|
p
 | 
						|
$PART_NUM
 | 
						|
$PART_START
 | 
						|
 | 
						|
p
 | 
						|
w
 | 
						|
EOF
 | 
						|
  ASK_TO_REBOOT=1
 | 
						|
 | 
						|
  # now set up an init.d script
 | 
						|
cat <<EOF > /etc/init.d/resize2fs_once &&
 | 
						|
#!/bin/sh
 | 
						|
### BEGIN INIT INFO
 | 
						|
# Provides:          resize2fs_once
 | 
						|
# Required-Start:
 | 
						|
# Required-Stop:
 | 
						|
# Default-Start: 3
 | 
						|
# Default-Stop:
 | 
						|
# Short-Description: Resize the root filesystem to fill partition
 | 
						|
# Description:
 | 
						|
### END INIT INFO
 | 
						|
 | 
						|
. /lib/lsb/init-functions
 | 
						|
 | 
						|
case "\$1" in
 | 
						|
  start)
 | 
						|
    log_daemon_msg "Starting resize2fs_once" &&
 | 
						|
    resize2fs /dev/$ROOT_PART &&
 | 
						|
    update-rc.d resize2fs_once remove &&
 | 
						|
    rm /etc/init.d/resize2fs_once &&
 | 
						|
    log_end_msg \$?
 | 
						|
    ;;
 | 
						|
  *)
 | 
						|
    echo "Usage: \$0 start" >&2
 | 
						|
    exit 3
 | 
						|
    ;;
 | 
						|
esac
 | 
						|
EOF
 | 
						|
  chmod +x /etc/init.d/resize2fs_once &&
 | 
						|
  update-rc.d resize2fs_once defaults &&
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    whiptail --msgbox "Root partition has been resized.\nThe filesystem will be enlarged upon the next reboot" 20 60 2
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
set_config_var() {
 | 
						|
  lua - "$1" "$2" "$3" <<EOF > "$3.bak"
 | 
						|
local key=assert(arg[1])
 | 
						|
local value=assert(arg[2])
 | 
						|
local fn=assert(arg[3])
 | 
						|
local file=assert(io.open(fn))
 | 
						|
local made_change=false
 | 
						|
for line in file:lines() do
 | 
						|
  if line:match("^#?%s*"..key.."=.*$") then
 | 
						|
    line=key.."="..value
 | 
						|
    made_change=true
 | 
						|
  end
 | 
						|
  print(line)
 | 
						|
end
 | 
						|
 | 
						|
if not made_change then
 | 
						|
  print(key.."="..value)
 | 
						|
end
 | 
						|
EOF
 | 
						|
mv "$3.bak" "$3"
 | 
						|
}
 | 
						|
 | 
						|
clear_config_var() {
 | 
						|
  lua - "$1" "$2" <<EOF > "$2.bak"
 | 
						|
local key=assert(arg[1])
 | 
						|
local fn=assert(arg[2])
 | 
						|
local file=assert(io.open(fn))
 | 
						|
for line in file:lines() do
 | 
						|
  if line:match("^%s*"..key.."=.*$") then
 | 
						|
    line="#"..line
 | 
						|
  end
 | 
						|
  print(line)
 | 
						|
end
 | 
						|
EOF
 | 
						|
mv "$2.bak" "$2"
 | 
						|
}
 | 
						|
 | 
						|
get_config_var() {
 | 
						|
  lua - "$1" "$2" <<EOF
 | 
						|
local key=assert(arg[1])
 | 
						|
local fn=assert(arg[2])
 | 
						|
local file=assert(io.open(fn))
 | 
						|
local found=false
 | 
						|
for line in file:lines() do
 | 
						|
  local val = line:match("^%s*"..key.."=(.*)$")
 | 
						|
  if (val ~= nil) then
 | 
						|
    print(val)
 | 
						|
    found=true
 | 
						|
    break
 | 
						|
  end
 | 
						|
end
 | 
						|
if not found then
 | 
						|
   print(0)
 | 
						|
end
 | 
						|
EOF
 | 
						|
}
 | 
						|
 | 
						|
# $1 is 0 to disable overscan, 1 to disable it
 | 
						|
set_overscan() {
 | 
						|
  # Stop if /boot is not a mountpoint
 | 
						|
  if ! mountpoint -q /boot; then
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
 | 
						|
  [ -e $CONFIG ] || touch $CONFIG
 | 
						|
 | 
						|
  if [ "$1" -eq 0 ]; then # disable overscan
 | 
						|
    sed $CONFIG -i -e "s/^overscan_/#overscan_/"
 | 
						|
    set_config_var disable_overscan 1 $CONFIG
 | 
						|
  else # enable overscan
 | 
						|
    set_config_var disable_overscan 0 $CONFIG
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_overscan() {
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    whiptail --yesno "What would you like to do with overscan" 20 60 2 \
 | 
						|
      --yes-button Disable --no-button Enable
 | 
						|
    RET=$?
 | 
						|
  else
 | 
						|
    RET=$1
 | 
						|
  fi
 | 
						|
  if [ $RET -eq 0 ] || [ $RET -eq 1 ]; then
 | 
						|
    ASK_TO_REBOOT=1
 | 
						|
    set_overscan $RET;
 | 
						|
  else
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_change_pass() {
 | 
						|
  whiptail --msgbox "You will now be asked to enter a new password for the pi user" 20 60 1
 | 
						|
  passwd pi &&
 | 
						|
  whiptail --msgbox "Password changed successfully" 20 60 1
 | 
						|
}
 | 
						|
 | 
						|
do_configure_keyboard() {
 | 
						|
  dpkg-reconfigure keyboard-configuration &&
 | 
						|
  printf "Reloading keymap. This may take a short while\n" &&
 | 
						|
  invoke-rc.d keyboard-setup start || return $?
 | 
						|
  udevadm trigger --subsystem-match=input --action=change
 | 
						|
  return 0
 | 
						|
}
 | 
						|
 | 
						|
do_change_locale() {
 | 
						|
  dpkg-reconfigure locales
 | 
						|
}
 | 
						|
 | 
						|
do_change_timezone() {
 | 
						|
  dpkg-reconfigure tzdata
 | 
						|
}
 | 
						|
 | 
						|
do_configure_wifi_country() {
 | 
						|
  oIFS="$IFS"
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    IFS="/"
 | 
						|
    value=$(cat /usr/share/zoneinfo/iso3166.tab | tail -n +26 | tr '\t' '/' | tr '\n' '/')
 | 
						|
    COUNTRY=$(whiptail --menu "Select the country in which the Pi is to be used" 20 60 10 ${value} 3>&1 1>&2 2>&3)
 | 
						|
  else
 | 
						|
    COUNTRY=$1
 | 
						|
    true
 | 
						|
  fi
 | 
						|
  if [ $? -eq 0 ];then
 | 
						|
    if [ -e /etc/wpa_supplicant/wpa_supplicant.conf ]; then
 | 
						|
        if grep -q "^country=" /etc/wpa_supplicant/wpa_supplicant.conf ; then
 | 
						|
            sed -i "s/^country=.*/country=$COUNTRY/g" /etc/wpa_supplicant/wpa_supplicant.conf
 | 
						|
        else
 | 
						|
            sed -i "1i country=$COUNTRY" /etc/wpa_supplicant/wpa_supplicant.conf
 | 
						|
        fi
 | 
						|
    else
 | 
						|
        echo "country=$COUNTRY" > /etc/wpa_supplicant/wpa_supplicant.conf
 | 
						|
    fi
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
        whiptail --msgbox "Wi-fi country set to $COUNTRY" 20 60 1
 | 
						|
    fi
 | 
						|
    ASK_TO_REBOOT=1
 | 
						|
  fi
 | 
						|
  IFS=$oIFS
 | 
						|
}
 | 
						|
 | 
						|
do_change_hostname() {
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    whiptail --msgbox "\
 | 
						|
Please note: RFCs mandate that a hostname's labels \
 | 
						|
may contain only the ASCII letters 'a' through 'z' (case-insensitive), 
 | 
						|
the digits '0' through '9', and the hyphen.
 | 
						|
Hostname labels cannot begin or end with a hyphen. 
 | 
						|
No other symbols, punctuation characters, or blank spaces are permitted.\
 | 
						|
" 20 70 1
 | 
						|
  fi
 | 
						|
  CURRENT_HOSTNAME=`cat /etc/hostname | tr -d " \t\n\r"`
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    NEW_HOSTNAME=$(whiptail --inputbox "Please enter a hostname" 20 60 "$CURRENT_HOSTNAME" 3>&1 1>&2 2>&3)
 | 
						|
  else
 | 
						|
    NEW_HOSTNAME=$1
 | 
						|
    true
 | 
						|
  fi
 | 
						|
  if [ $? -eq 0 ]; then
 | 
						|
    echo $NEW_HOSTNAME > /etc/hostname
 | 
						|
    sed -i "s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\t$NEW_HOSTNAME/g" /etc/hosts
 | 
						|
    ASK_TO_REBOOT=1
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_memory_split() { # Memory Split
 | 
						|
  if [ -e /boot/start_cd.elf ]; then
 | 
						|
    # New-style memory split setting
 | 
						|
    if ! mountpoint -q /boot; then
 | 
						|
      return 1
 | 
						|
    fi
 | 
						|
    ## get current memory split from /boot/config.txt
 | 
						|
	arm=$(vcgencmd get_mem arm | cut -d '=' -f 2 | cut -d 'M' -f 1)
 | 
						|
	gpu=$(vcgencmd get_mem gpu | cut -d '=' -f 2 | cut -d 'M' -f 1)
 | 
						|
	tot=$(($arm+$gpu))
 | 
						|
    if [ $tot -gt 512 ]; then
 | 
						|
		CUR_GPU_MEM=$(get_config_var gpu_mem_1024 $CONFIG)
 | 
						|
	elif [ $tot -gt 256 ]; then
 | 
						|
		CUR_GPU_MEM=$(get_config_var gpu_mem_512 $CONFIG)
 | 
						|
	else
 | 
						|
		CUR_GPU_MEM=$(get_config_var gpu_mem_256 $CONFIG)
 | 
						|
	fi
 | 
						|
    if [ -z "$CUR_GPU_MEM" ] || [ $CUR_GPU_MEM = "0" ]; then
 | 
						|
		CUR_GPU_MEM=$(get_config_var gpu_mem $CONFIG)
 | 
						|
	fi
 | 
						|
    [ -z "$CUR_GPU_MEM" ] || [ $CUR_GPU_MEM = "0" ] && CUR_GPU_MEM=64
 | 
						|
    ## ask users what gpu_mem they want
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      NEW_GPU_MEM=$(whiptail --inputbox "How much memory should the GPU have?  e.g. 16/32/64/128/256" \
 | 
						|
        20 70 -- "$CUR_GPU_MEM" 3>&1 1>&2 2>&3)
 | 
						|
    else
 | 
						|
      NEW_GPU_MEM=$1
 | 
						|
      true
 | 
						|
    fi
 | 
						|
    if [ $? -eq 0 ]; then
 | 
						|
	  if [ $(get_config_var gpu_mem_1024 $CONFIG) != "0" ] || [ $(get_config_var gpu_mem_512 $CONFIG) != "0" ] || [ $(get_config_var gpu_mem_256 $CONFIG) != "0" ]; then
 | 
						|
        if [ "$INTERACTIVE" = True ]; then
 | 
						|
		  whiptail --msgbox "Device-specific memory settings were found. These have been cleared." 20 60 2
 | 
						|
		fi
 | 
						|
		clear_config_var gpu_mem_1024 $CONFIG
 | 
						|
		clear_config_var gpu_mem_512 $CONFIG
 | 
						|
		clear_config_var gpu_mem_256 $CONFIG
 | 
						|
	  fi
 | 
						|
      set_config_var gpu_mem "$NEW_GPU_MEM" $CONFIG
 | 
						|
      ASK_TO_REBOOT=1
 | 
						|
    fi
 | 
						|
  else # Old firmware so do start.elf renaming
 | 
						|
    get_current_memory_split
 | 
						|
    MEMSPLIT=$(whiptail --menu "Set memory split.\n$MEMSPLIT_DESCRIPTION" 20 60 10 \
 | 
						|
      "240" "240MiB for ARM, 16MiB for VideoCore" \
 | 
						|
      "224" "224MiB for ARM, 32MiB for VideoCore" \
 | 
						|
      "192" "192MiB for ARM, 64MiB for VideoCore" \
 | 
						|
      "128" "128MiB for ARM, 128MiB for VideoCore" \
 | 
						|
      3>&1 1>&2 2>&3)
 | 
						|
    if [ $? -eq 0 ]; then
 | 
						|
      set_memory_split ${MEMSPLIT}
 | 
						|
      ASK_TO_REBOOT=1
 | 
						|
    fi
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
get_current_memory_split() {
 | 
						|
  # Stop if /boot is not a mountpoint
 | 
						|
  if ! mountpoint -q /boot; then
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
  AVAILABLE_SPLITS="128 192 224 240"
 | 
						|
  MEMSPLIT_DESCRIPTION=""
 | 
						|
  for SPLIT in $AVAILABLE_SPLITS;do
 | 
						|
    if [ -e /boot/arm${SPLIT}_start.elf ] && cmp /boot/arm${SPLIT}_start.elf /boot/start.elf >/dev/null 2>&1;then
 | 
						|
      CURRENT_MEMSPLIT=$SPLIT
 | 
						|
      MEMSPLIT_DESCRIPTION="Current: ${CURRENT_MEMSPLIT}MiB for ARM, $((256 - $CURRENT_MEMSPLIT))MiB for VideoCore"
 | 
						|
      break
 | 
						|
    fi
 | 
						|
  done
 | 
						|
}
 | 
						|
 | 
						|
set_memory_split() {
 | 
						|
  cp -a /boot/arm${1}_start.elf /boot/start.elf
 | 
						|
  sync
 | 
						|
}
 | 
						|
 | 
						|
do_overclock() {
 | 
						|
  if ! is_pione && ! is_pitwo; then
 | 
						|
    whiptail --msgbox "This Pi cannot be overclocked." 20 60 2
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    whiptail --msgbox "\
 | 
						|
Be aware that overclocking may reduce the lifetime of your
 | 
						|
Raspberry Pi. If overclocking at a certain level causes
 | 
						|
system instability, try a more modest overclock. Hold down
 | 
						|
shift during boot to temporarily disable overclock.
 | 
						|
See http://elinux.org/RPi_Overclocking for more information.\
 | 
						|
" 20 70 1
 | 
						|
   if is_pione; then
 | 
						|
    OVERCLOCK=$(whiptail --menu "Choose overclock preset" 20 60 10 \
 | 
						|
      "None" "700MHz ARM, 250MHz core, 400MHz SDRAM, 0 overvolt" \
 | 
						|
      "Modest" "800MHz ARM, 250MHz core, 400MHz SDRAM, 0 overvolt" \
 | 
						|
      "Medium" "900MHz ARM, 250MHz core, 450MHz SDRAM, 2 overvolt" \
 | 
						|
      "High" "950MHz ARM, 250MHz core, 450MHz SDRAM, 6 overvolt" \
 | 
						|
      "Turbo" "1000MHz ARM, 500MHz core, 600MHz SDRAM, 6 overvolt" \
 | 
						|
      3>&1 1>&2 2>&3)
 | 
						|
   elif is_pitwo; then
 | 
						|
    OVERCLOCK=$(whiptail --menu "Choose overclock preset" 20 60 10 \
 | 
						|
      "None" "900MHz ARM, 250MHz core, 450MHz SDRAM, 0 overvolt" \
 | 
						|
      "High" "1000MHz ARM, 500MHz core, 500MHz SDRAM, 2 overvolt" \
 | 
						|
      3>&1 1>&2 2>&3)
 | 
						|
   fi
 | 
						|
  else
 | 
						|
    OVERCLOCK=$1
 | 
						|
    true
 | 
						|
  fi
 | 
						|
  if [ $? -eq 0 ]; then
 | 
						|
    case "$OVERCLOCK" in
 | 
						|
      None)
 | 
						|
        clear_overclock
 | 
						|
        ;;
 | 
						|
      Modest)
 | 
						|
        set_overclock Modest 800 250 400 0
 | 
						|
        ;;
 | 
						|
      Medium)
 | 
						|
        set_overclock Medium 900 250 450 2
 | 
						|
        ;;
 | 
						|
      High)
 | 
						|
        if is_pione; then
 | 
						|
          set_overclock High 950 250 450 6
 | 
						|
        else
 | 
						|
          set_overclock High 1000 500 500 2
 | 
						|
        fi
 | 
						|
        ;;
 | 
						|
      Turbo)
 | 
						|
        set_overclock Turbo 1000 500 600 6
 | 
						|
        ;;
 | 
						|
      *)
 | 
						|
        whiptail --msgbox "Programmer error, unrecognised overclock preset" 20 60 2
 | 
						|
        return 1
 | 
						|
        ;;
 | 
						|
    esac
 | 
						|
    ASK_TO_REBOOT=1
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
set_overclock() {
 | 
						|
  set_config_var arm_freq $2 $CONFIG &&
 | 
						|
  set_config_var core_freq $3 $CONFIG &&
 | 
						|
  set_config_var sdram_freq $4 $CONFIG &&
 | 
						|
  set_config_var over_voltage $5 $CONFIG &&
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    whiptail --msgbox "Set overclock to preset '$1'" 20 60 2
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
clear_overclock () {
 | 
						|
  clear_config_var arm_freq $CONFIG &&
 | 
						|
  clear_config_var core_freq $CONFIG &&
 | 
						|
  clear_config_var sdram_freq $CONFIG &&
 | 
						|
  clear_config_var over_voltage $CONFIG &&
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    whiptail --msgbox "Set overclock to preset 'None'" 20 60 2
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_ssh() {
 | 
						|
  if [ -e /var/log/regen_ssh_keys.log ] && ! grep -q "^finished" /var/log/regen_ssh_keys.log; then
 | 
						|
    whiptail --msgbox "Initial ssh key generation still running. Please wait and try again." 20 60 2
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    whiptail --yesno "Would you like the SSH server enabled or disabled?" 20 60 2 \
 | 
						|
      --yes-button Enable --no-button Disable
 | 
						|
    RET=$?
 | 
						|
  else
 | 
						|
    RET=$1
 | 
						|
  fi
 | 
						|
  if [ $RET -eq 0 ]; then
 | 
						|
    update-rc.d ssh enable &&
 | 
						|
    invoke-rc.d ssh start &&
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      whiptail --msgbox "SSH server enabled" 20 60 1
 | 
						|
    fi
 | 
						|
  elif [ $RET -eq 1 ]; then
 | 
						|
    update-rc.d ssh disable &&
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      whiptail --msgbox "SSH server disabled" 20 60 1
 | 
						|
    fi
 | 
						|
  else
 | 
						|
    return $RET
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_devicetree() {
 | 
						|
  CURRENT_SETTING="enabled" # assume not disabled
 | 
						|
  DEFAULT=
 | 
						|
  if [ -e $CONFIG ] && grep -q "^device_tree=$" $CONFIG; then
 | 
						|
    CURRENT_SETTING="disabled"
 | 
						|
    DEFAULT=--defaultno
 | 
						|
  fi
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    whiptail --yesno "Would you like the kernel to use Device Tree?" $DEFAULT 20 60 2
 | 
						|
    RET=$?
 | 
						|
  else
 | 
						|
    RET=$1
 | 
						|
  fi
 | 
						|
  if [ $RET -eq 0 ]; then
 | 
						|
    sed $CONFIG -i -e "s/^\(device_tree=\)$/#\1/"
 | 
						|
    sed $CONFIG -i -e "s/^#\(device_tree=.\)/\1/"
 | 
						|
    SETTING=enabled
 | 
						|
  elif [ $RET -eq 1 ]; then
 | 
						|
    sed $CONFIG -i -e "s/^#\(device_tree=\)$/\1/"
 | 
						|
    sed $CONFIG -i -e "s/^\(device_tree=.\)/#\1/"
 | 
						|
    if ! grep -q "^device_tree=$" $CONFIG; then
 | 
						|
      printf "device_tree=\n" >> $CONFIG
 | 
						|
    fi
 | 
						|
    SETTING=disabled
 | 
						|
  else
 | 
						|
    return 0
 | 
						|
  fi
 | 
						|
  TENSE=is
 | 
						|
  REBOOT=
 | 
						|
  if [ $SETTING != $CURRENT_SETTING ]; then
 | 
						|
    TENSE="will be"
 | 
						|
    REBOOT=" after a reboot"
 | 
						|
    ASK_TO_REBOOT=1
 | 
						|
  fi
 | 
						|
  whiptail --msgbox "Device Tree $TENSE $SETTING$REBOOT" 20 60 1
 | 
						|
}
 | 
						|
 | 
						|
do_spi() {
 | 
						|
  DEVICE_TREE="yes" # assume not disabled
 | 
						|
  DEFAULT=
 | 
						|
  if [ -e $CONFIG ] && grep -q "^device_tree=$" $CONFIG; then
 | 
						|
    DEVICE_TREE="no"
 | 
						|
  fi
 | 
						|
 | 
						|
  CURRENT_SETTING="off" # assume disabled
 | 
						|
  DEFAULT=--defaultno
 | 
						|
  if [ -e $CONFIG ] && grep -q -E "^(device_tree_param|dtparam)=([^,]*,)*spi(=(on|true|yes|1))?(,.*)?$" $CONFIG; then
 | 
						|
    CURRENT_SETTING="on"
 | 
						|
    DEFAULT=
 | 
						|
  fi
 | 
						|
 | 
						|
  if [ $DEVICE_TREE = "yes" ]; then
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      whiptail --yesno "Would you like the SPI interface to be enabled?" $DEFAULT 20 60 2
 | 
						|
      RET=$?
 | 
						|
    else
 | 
						|
      RET=$1
 | 
						|
    fi
 | 
						|
    if [ $RET -eq 0 ]; then
 | 
						|
      SETTING=on
 | 
						|
      STATUS=enabled
 | 
						|
    elif [ $RET -eq 1 ]; then
 | 
						|
      SETTING=off
 | 
						|
      STATUS=disabled
 | 
						|
    else
 | 
						|
      return 0
 | 
						|
    fi
 | 
						|
    TENSE=is
 | 
						|
    REBOOT=
 | 
						|
    if [ $SETTING != $CURRENT_SETTING ]; then
 | 
						|
      TENSE="will be"
 | 
						|
      REBOOT=" after a reboot"
 | 
						|
      ASK_TO_REBOOT=1
 | 
						|
    fi
 | 
						|
    sed $CONFIG -i -r -e "s/^((device_tree_param|dtparam)=([^,]*,)*spi)(=[^,]*)?/\1=$SETTING/"
 | 
						|
    if ! grep -q -E "^(device_tree_param|dtparam)=([^,]*,)*spi=[^,]*" $CONFIG; then
 | 
						|
      printf "dtparam=spi=$SETTING\n" >> $CONFIG
 | 
						|
    fi
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      whiptail --msgbox "The SPI interface $TENSE $STATUS$REBOOT" 20 60 1
 | 
						|
    fi
 | 
						|
    if [ $SETTING = "off" ]; then
 | 
						|
      return 0
 | 
						|
    fi
 | 
						|
  fi
 | 
						|
 | 
						|
  CURRENT_STATUS="yes" # assume not blacklisted
 | 
						|
  DEFAULT=
 | 
						|
  if [ -e $BLACKLIST ] && grep -q "^blacklist[[:space:]]*spi[-_]bcm2708" $BLACKLIST; then
 | 
						|
    CURRENT_STATUS="no"
 | 
						|
    DEFAULT=--defaultno
 | 
						|
  fi
 | 
						|
 | 
						|
  if ! [ -e $BLACKLIST ]; then
 | 
						|
    touch $BLACKLIST
 | 
						|
  fi
 | 
						|
 | 
						|
  sed $BLACKLIST -i -e "s/^\(blacklist[[:space:]]*spi[-_]bcm2708\)/#\1/"
 | 
						|
  sudo dtparam spi=on
 | 
						|
}
 | 
						|
 | 
						|
do_i2c() {
 | 
						|
  DEVICE_TREE="yes" # assume not disabled
 | 
						|
  DEFAULT=
 | 
						|
  if [ -e $CONFIG ] && grep -q "^device_tree=$" $CONFIG; then
 | 
						|
    DEVICE_TREE="no"
 | 
						|
  fi
 | 
						|
 | 
						|
  CURRENT_SETTING="off" # assume disabled
 | 
						|
  DEFAULT=--defaultno
 | 
						|
  if [ -e $CONFIG ] && grep -q -E "^(device_tree_param|dtparam)=([^,]*,)*i2c(_arm)?(=(on|true|yes|1))?(,.*)?$" $CONFIG; then
 | 
						|
    CURRENT_SETTING="on"
 | 
						|
    DEFAULT=
 | 
						|
  fi
 | 
						|
 | 
						|
  if [ $DEVICE_TREE = "yes" ]; then
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      whiptail --yesno "Would you like the ARM I2C interface to be enabled?" $DEFAULT 20 60 2
 | 
						|
      RET=$?
 | 
						|
    else
 | 
						|
      RET=$1
 | 
						|
    fi
 | 
						|
    if [ $RET -eq 0 ]; then
 | 
						|
      SETTING=on
 | 
						|
      STATUS=enabled
 | 
						|
    elif [ $RET -eq 1 ]; then
 | 
						|
      SETTING=off
 | 
						|
      STATUS=disabled
 | 
						|
    else
 | 
						|
      return 0
 | 
						|
    fi
 | 
						|
    TENSE=is
 | 
						|
    REBOOT=
 | 
						|
    if [ $SETTING != $CURRENT_SETTING ]; then
 | 
						|
      TENSE="will be"
 | 
						|
      REBOOT=" after a reboot"
 | 
						|
      ASK_TO_REBOOT=1
 | 
						|
    fi
 | 
						|
    sed $CONFIG -i -r -e "s/^((device_tree_param|dtparam)=([^,]*,)*i2c(_arm)?)(=[^,]*)?/\1=$SETTING/"
 | 
						|
    if ! grep -q -E "^(device_tree_param|dtparam)=([^,]*,)*i2c(_arm)?=[^,]*" $CONFIG; then
 | 
						|
      printf "dtparam=i2c_arm=$SETTING\n" >> $CONFIG
 | 
						|
    fi
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      whiptail --msgbox "The ARM I2C interface $TENSE $STATUS$REBOOT" 20 60 1
 | 
						|
    fi
 | 
						|
    if [ $SETTING = "off" ]; then
 | 
						|
      return 0
 | 
						|
    fi
 | 
						|
  fi
 | 
						|
 | 
						|
  CURRENT_STATUS="yes" # assume not blacklisted
 | 
						|
  DEFAULT=
 | 
						|
  if [ -e $BLACKLIST ] && grep -q "^blacklist[[:space:]]*i2c[-_]bcm2708" $BLACKLIST; then
 | 
						|
    CURRENT_STATUS="no"
 | 
						|
    DEFAULT=--defaultno
 | 
						|
  fi
 | 
						|
 | 
						|
  if ! [ -e $BLACKLIST ]; then
 | 
						|
    touch $BLACKLIST
 | 
						|
  fi
 | 
						|
 | 
						|
  sed $BLACKLIST -i -e "s/^\(blacklist[[:space:]]*i2c[-_]bcm2708\)/#\1/"
 | 
						|
  sed /etc/modules -i -e "s/^#[[:space:]]*\(i2c[-_]dev\)/\1/"
 | 
						|
  if ! grep -q "^i2c[-_]dev" /etc/modules; then
 | 
						|
    printf "i2c-dev\n" >> /etc/modules
 | 
						|
  fi
 | 
						|
  sudo dtparam i2c_arm=on
 | 
						|
  modprobe i2c-dev
 | 
						|
}
 | 
						|
 | 
						|
do_serial() {
 | 
						|
  DEFAULT=
 | 
						|
  if ! grep -q "console=ttyAMA0" /boot/cmdline.txt && ! grep -q "console=serial0" /boot/cmdline.txt ; then
 | 
						|
      DEFAULT=--defaultno
 | 
						|
  fi
 | 
						|
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    whiptail --yesno "Would you like a login shell to be accessible over serial?" $DEFAULT 20 60 2
 | 
						|
    RET=$?
 | 
						|
  else
 | 
						|
    get_init_sys
 | 
						|
    RET=$1
 | 
						|
  fi
 | 
						|
  if [ $RET -eq 1 ]; then
 | 
						|
    if [ $SYSTEMD -eq 0 ]; then
 | 
						|
      sed -i /etc/inittab -e "s|^.*:.*:respawn:.*ttyAMA0|#&|"
 | 
						|
    fi
 | 
						|
    sed -i /boot/cmdline.txt -e "s/console=ttyAMA0,[0-9]\+ //"
 | 
						|
    sed -i /boot/cmdline.txt -e "s/console=serial0,[0-9]\+ //"
 | 
						|
    set_config_var enable_uart 0 $CONFIG
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      whiptail --msgbox "Serial is now disabled" 20 60 1
 | 
						|
    fi
 | 
						|
  elif [ $RET -eq 0 ]; then
 | 
						|
    if [ $SYSTEMD -eq 0 ]; then
 | 
						|
      sed -i /etc/inittab -e "s|^#\(.*:.*:respawn:.*ttyAMA0\)|\1|"
 | 
						|
      if ! grep -q "^T.*:.*:respawn:.*ttyAMA0" /etc/inittab; then
 | 
						|
        printf "T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100\n" >> /etc/inittab
 | 
						|
      fi
 | 
						|
    fi
 | 
						|
    if grep -q "console=ttyAMA0" /boot/cmdline.txt ; then
 | 
						|
      if [ -e /proc/device-tree/aliases/serial0 ]; then
 | 
						|
        sed -i /boot/cmdline.txt -e "s/console=ttyAMA0/console=serial0/"
 | 
						|
      fi
 | 
						|
    elif ! grep -q "console=ttyAMA0" /boot/cmdline.txt && ! grep -q "console=serial0" /boot/cmdline.txt ; then
 | 
						|
      if [ -e /proc/device-tree/aliases/serial0 ]; then
 | 
						|
        sed -i /boot/cmdline.txt -e "s/root=/console=serial0,115200 root=/"
 | 
						|
      else
 | 
						|
        sed -i /boot/cmdline.txt -e "s/root=/console=ttyAMA0,115200 root=/"
 | 
						|
      fi
 | 
						|
    fi
 | 
						|
    set_config_var enable_uart 1 $CONFIG
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      whiptail --msgbox "Serial is now enabled" 20 60 1
 | 
						|
    fi
 | 
						|
  else
 | 
						|
    return $RET
 | 
						|
  fi
 | 
						|
  ASK_TO_REBOOT=1
 | 
						|
}
 | 
						|
 | 
						|
disable_raspi_config_at_boot() {
 | 
						|
  if [ -e /etc/profile.d/raspi-config.sh ]; then
 | 
						|
    rm -f /etc/profile.d/raspi-config.sh
 | 
						|
    if [ $SYSTEMD -eq 1 ]; then
 | 
						|
      if [ -e /etc/systemd/system/getty@tty1.service.d/raspi-config-override.conf ]; then
 | 
						|
        rm /etc/systemd/system/getty@tty1.service.d/raspi-config-override.conf
 | 
						|
      fi
 | 
						|
    else
 | 
						|
      sed -i /etc/inittab \
 | 
						|
        -e "s/^#\(.*\)#\s*RPICFG_TO_ENABLE\s*/\1/" \
 | 
						|
        -e "/#\s*RPICFG_TO_DISABLE/d"
 | 
						|
    fi
 | 
						|
    telinit q
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_boot_behaviour_new() {
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    BOOTOPT=$(whiptail --title "Raspberry Pi Software Configuration Tool (raspi-config)" --menu "Boot Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT \
 | 
						|
      "B1 Console" "Text console, requiring user to login" \
 | 
						|
      "B2 Console Autologin" "Text console, automatically logged in as 'pi' user" \
 | 
						|
      "B3 Desktop" "Desktop GUI, requiring user to login" \
 | 
						|
      "B4 Desktop Autologin" "Desktop GUI, automatically logged in as 'pi' user" \
 | 
						|
      3>&1 1>&2 2>&3)
 | 
						|
  else
 | 
						|
    get_init_sys
 | 
						|
    BOOTOPT=$1
 | 
						|
    true
 | 
						|
  fi
 | 
						|
  if [ $? -eq 0 ]; then
 | 
						|
    case "$BOOTOPT" in
 | 
						|
      B1*)
 | 
						|
        if [ $SYSTEMD -eq 1 ]; then
 | 
						|
          systemctl set-default multi-user.target
 | 
						|
          ln -fs /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
 | 
						|
        else
 | 
						|
          [ -e /etc/init.d/lightdm ] && update-rc.d lightdm disable 2
 | 
						|
          sed /etc/inittab -i -e "s/1:2345:respawn:\/bin\/login -f pi tty1 <\/dev\/tty1 >\/dev\/tty1 2>&1/1:2345:respawn:\/sbin\/getty --noclear 38400 tty1/"
 | 
						|
        fi
 | 
						|
        ;;
 | 
						|
      B2*)
 | 
						|
        if [ $SYSTEMD -eq 1 ]; then
 | 
						|
          systemctl set-default multi-user.target
 | 
						|
          ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
 | 
						|
        else
 | 
						|
          [ -e /etc/init.d/lightdm ] && update-rc.d lightdm disable 2
 | 
						|
          sed /etc/inittab -i -e "s/1:2345:respawn:\/sbin\/getty --noclear 38400 tty1/1:2345:respawn:\/bin\/login -f pi tty1 <\/dev\/tty1 >\/dev\/tty1 2>&1/"
 | 
						|
        fi
 | 
						|
        ;;
 | 
						|
      B3*)
 | 
						|
        if [ -e /etc/init.d/lightdm ]; then
 | 
						|
          if [ $SYSTEMD -eq 1 ]; then
 | 
						|
            systemctl set-default graphical.target
 | 
						|
            ln -fs /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
 | 
						|
          else
 | 
						|
            update-rc.d lightdm enable 2
 | 
						|
          fi
 | 
						|
          sed /etc/lightdm/lightdm.conf -i -e "s/^autologin-user=pi/#autologin-user=/"
 | 
						|
          disable_raspi_config_at_boot
 | 
						|
        else
 | 
						|
          whiptail --msgbox "Do sudo apt-get install lightdm to allow configuration of boot to desktop" 20 60 2
 | 
						|
          return 1
 | 
						|
        fi
 | 
						|
        ;;
 | 
						|
      B4*)
 | 
						|
        if [ -e /etc/init.d/lightdm ]; then
 | 
						|
          if id -u pi > /dev/null 2>&1; then
 | 
						|
            if [ $SYSTEMD -eq 1 ]; then
 | 
						|
              systemctl set-default graphical.target
 | 
						|
              ln -fs /etc/systemd/system/autologin@.service /etc/systemd/system/getty.target.wants/getty@tty1.service
 | 
						|
            else
 | 
						|
              update-rc.d lightdm enable 2
 | 
						|
            fi
 | 
						|
            sed /etc/lightdm/lightdm.conf -i -e "s/^#autologin-user=.*/autologin-user=pi/"
 | 
						|
            disable_raspi_config_at_boot
 | 
						|
          else
 | 
						|
            whiptail --msgbox "The pi user has been removed, can't set up boot to desktop" 20 60 2
 | 
						|
          fi
 | 
						|
        else
 | 
						|
          whiptail --msgbox "Do sudo apt-get install lightdm to allow configuration of boot to desktop" 20 60 2
 | 
						|
          return 1
 | 
						|
        fi
 | 
						|
        ;;
 | 
						|
      *)
 | 
						|
        whiptail --msgbox "Programmer error, unrecognised boot option" 20 60 2
 | 
						|
        return 1
 | 
						|
        ;;
 | 
						|
    esac
 | 
						|
    ASK_TO_REBOOT=1
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_wait_for_network() {
 | 
						|
  get_init_sys
 | 
						|
  if [ $SYSTEMD -eq 0 ]; then
 | 
						|
    whiptail --msgbox "This option can only be selected when using systemd" 20 60 2
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    RET=$(whiptail --menu "Choose boot option" 20 70 10 \
 | 
						|
      "Fast" "Boot without waiting for network connection" \
 | 
						|
      "Slow" "Wait for network connection before completing boot" \
 | 
						|
      3>&1 1>&2 2>&3)
 | 
						|
  else
 | 
						|
    get_init_sys
 | 
						|
    RET=$1
 | 
						|
    true
 | 
						|
  fi
 | 
						|
  if [ $? -eq 0 ]; then
 | 
						|
    case "$RET" in
 | 
						|
      Fast)
 | 
						|
        rm -f /etc/systemd/system/dhcpcd.service.d/wait.conf
 | 
						|
        ;;
 | 
						|
      Slow)
 | 
						|
        mkdir -p /etc/systemd/system/dhcpcd.service.d/
 | 
						|
        cat > /etc/systemd/system/dhcpcd.service.d/wait.conf << EOF
 | 
						|
[Service]
 | 
						|
ExecStart=
 | 
						|
ExecStart=/sbin/dhcpcd -q -w
 | 
						|
EOF
 | 
						|
        ;;
 | 
						|
      *)
 | 
						|
        whiptail --msgbox "Programmer error, unrecognised option" 20 60 2
 | 
						|
        return 1
 | 
						|
        ;;
 | 
						|
    esac
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_gpiosec() {
 | 
						|
  get_init_sys
 | 
						|
  if [ $SYSTEMD -eq 0 ]; then
 | 
						|
    whiptail --msgbox "This option can only be selected when using systemd" 20 60 2
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    RET=$(whiptail --menu "Choose GPIO Access Mode" 20 70 10 \
 | 
						|
      "Public" "GPIO server can be accessed remotely" \
 | 
						|
      "Private" "GPIO server can only be accessed locally" \
 | 
						|
      3>&1 1>&2 2>&3)
 | 
						|
  else
 | 
						|
    get_init_sys
 | 
						|
    RET=$1
 | 
						|
    true
 | 
						|
  fi
 | 
						|
  if [ $? -eq 0 ]; then
 | 
						|
    case "$RET" in
 | 
						|
      Private)
 | 
						|
        rm -f /etc/systemd/system/pigpiod.service.d/public.conf
 | 
						|
        ;;
 | 
						|
      Public)
 | 
						|
        mkdir -p /etc/systemd/system/pigpiod.service.d/
 | 
						|
        cat > /etc/systemd/system/pigpiod.service.d/public.conf << EOF
 | 
						|
[Service]
 | 
						|
ExecStart=
 | 
						|
ExecStart=/usr/bin/pigpiod
 | 
						|
EOF
 | 
						|
        ;;
 | 
						|
      *)
 | 
						|
        whiptail --msgbox "Programmer error, unrecognised option" 20 60 2
 | 
						|
        return 1
 | 
						|
        ;;
 | 
						|
    esac
 | 
						|
    systemctl daemon-reload
 | 
						|
    systemctl restart pigpiod
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_boot_behaviour() {
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    BOOTOPT=$(whiptail --menu "Choose boot option" 20 60 10 \
 | 
						|
      "Console" "Text console, requiring login (default)" \
 | 
						|
      "Desktop" "Log in as user 'pi' at the graphical desktop" \
 | 
						|
      3>&1 1>&2 2>&3)
 | 
						|
  else
 | 
						|
    get_init_sys
 | 
						|
    BOOTOPT=$1
 | 
						|
    true
 | 
						|
  fi
 | 
						|
  if [ $? -eq 0 ]; then
 | 
						|
    case "$BOOTOPT" in
 | 
						|
      Console)
 | 
						|
        if [ -e /etc/init.d/lightdm ]; then
 | 
						|
          if [ $SYSTEMD -eq 1 ]; then
 | 
						|
            systemctl set-default multi-user.target
 | 
						|
          else
 | 
						|
            update-rc.d lightdm disable 2
 | 
						|
          fi
 | 
						|
        fi
 | 
						|
        ;;
 | 
						|
      Desktop)
 | 
						|
        if [ -e /etc/init.d/lightdm ]; then
 | 
						|
          if id -u pi > /dev/null 2>&1; then
 | 
						|
            if [ $SYSTEMD -eq 1 ]; then
 | 
						|
              systemctl set-default graphical.target
 | 
						|
            else
 | 
						|
              update-rc.d lightdm enable 2
 | 
						|
            fi
 | 
						|
            sed /etc/lightdm/lightdm.conf -i -e "s/^#autologin-user=.*/autologin-user=pi/"
 | 
						|
            disable_raspi_config_at_boot
 | 
						|
          else
 | 
						|
            whiptail --msgbox "The pi user has been removed, can't set up boot to desktop" 20 60 2
 | 
						|
          fi
 | 
						|
        else
 | 
						|
          whiptail --msgbox "Do sudo apt-get install lightdm to allow configuration of boot to desktop" 20 60 2
 | 
						|
          return 1
 | 
						|
        fi
 | 
						|
        ;;
 | 
						|
      *)
 | 
						|
        whiptail --msgbox "Programmer error, unrecognised boot option" 20 60 2
 | 
						|
        return 1
 | 
						|
        ;;
 | 
						|
    esac
 | 
						|
    ASK_TO_REBOOT=1
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_rastrack() {
 | 
						|
  whiptail --msgbox "\
 | 
						|
Rastrack (http://rastrack.co.uk) is a website run by Ryan Walmsley
 | 
						|
for tracking where people are using Raspberry Pis around the world.
 | 
						|
If you have an internet connection, you can add yourself directly
 | 
						|
using this tool. This is just a bit of fun, not any sort of official
 | 
						|
registration.\
 | 
						|
" 20 70 1
 | 
						|
  if [ $? -ne 0 ]; then
 | 
						|
    return 0;
 | 
						|
  fi
 | 
						|
  UNAME=$(whiptail --inputbox "Username / Nickname For Rastrack Addition" 20 70 3>&1 1>&2 2>&3)
 | 
						|
  if [ $? -ne 0 ]; then
 | 
						|
    return 1;
 | 
						|
  fi
 | 
						|
  EMAIL=$(whiptail --inputbox "Email Address For Rastrack Addition" 20 70 3>&1 1>&2 2>&3)
 | 
						|
  if [ $? -ne 0 ]; then
 | 
						|
    return 1;
 | 
						|
  fi
 | 
						|
  curl --data "name=$UNAME&email=$EMAIL" http://rastrack.co.uk/api.php
 | 
						|
  printf "Hit enter to continue\n"
 | 
						|
  read TMP
 | 
						|
}
 | 
						|
 | 
						|
# $1 is 0 to disable camera, 1 to enable it
 | 
						|
set_camera() {
 | 
						|
  # Stop if /boot is not a mountpoint
 | 
						|
  if ! mountpoint -q /boot; then
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
 | 
						|
  [ -e $CONFIG ] || touch $CONFIG
 | 
						|
 | 
						|
  if [ "$1" -eq 0 ]; then # disable camera
 | 
						|
    set_config_var start_x 0 $CONFIG
 | 
						|
    sed $CONFIG -i -e "s/^startx/#startx/"
 | 
						|
    sed $CONFIG -i -e "s/^start_file/#start_file/"
 | 
						|
    sed $CONFIG -i -e "s/^fixup_file/#fixup_file/"
 | 
						|
  else # enable camera
 | 
						|
    set_config_var start_x 1 $CONFIG
 | 
						|
    CUR_GPU_MEM=$(get_config_var gpu_mem $CONFIG)
 | 
						|
    if [ -z "$CUR_GPU_MEM" ] || [ "$CUR_GPU_MEM" -lt 128 ]; then
 | 
						|
      set_config_var gpu_mem 128 $CONFIG
 | 
						|
    fi
 | 
						|
    sed $CONFIG -i -e "s/^startx/#startx/"
 | 
						|
    sed $CONFIG -i -e "s/^fixup_file/#fixup_file/"
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_camera() {
 | 
						|
  if [ ! -e /boot/start_x.elf ]; then
 | 
						|
    whiptail --msgbox "Your firmware appears to be out of date (no start_x.elf). Please update" 20 60 2
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    whiptail --yesno "Enable support for Raspberry Pi camera?" 20 60 2 \
 | 
						|
      --yes-button Disable --no-button Enable
 | 
						|
    RET=$?
 | 
						|
  else
 | 
						|
    RET=$1
 | 
						|
  fi
 | 
						|
  if [ $RET -eq 0 ] || [ $RET -eq 1 ]; then
 | 
						|
    ASK_TO_REBOOT=1
 | 
						|
    set_camera $RET;
 | 
						|
  else
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
# $1 is 1 to disable interface, 0 to enable it
 | 
						|
set_onewire() {
 | 
						|
  [ -e $CONFIG ] || touch $CONFIG
 | 
						|
  if [ "$1" -eq 1 ]; then # disable driver
 | 
						|
    sed $CONFIG -i -e "s/^dtoverlay=w1-gpio/#dtoverlay=w1-gpio/"
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      whiptail --msgbox "One-wire interface is disabled" 20 60 1
 | 
						|
    fi
 | 
						|
  else # enable driver
 | 
						|
    sed $CONFIG -i -e "s/^#dtoverlay=w1-gpio/dtoverlay=w1-gpio/"
 | 
						|
    if ! grep -q -E "^dtoverlay=w1-gpio" $CONFIG; then
 | 
						|
      printf "dtoverlay=w1-gpio\n" >> $CONFIG
 | 
						|
    fi
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      whiptail --msgbox "One-wire interface is enabled" 20 60 1
 | 
						|
    fi
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_onewire() {
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    whiptail --yesno "Enable one-wire interface?" 20 60 2 \
 | 
						|
      --yes-button Enable --no-button Disable
 | 
						|
    RET=$?
 | 
						|
  else
 | 
						|
    RET=$1
 | 
						|
  fi
 | 
						|
  if [ $RET -eq 0 ] || [ $RET -eq 1 ]; then
 | 
						|
    ASK_TO_REBOOT=1
 | 
						|
    set_onewire $RET;
 | 
						|
  else
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
# $1 is 0 to disable driver, 1 to enable it
 | 
						|
set_gldriver() {
 | 
						|
  [ -e $CONFIG ] || touch $CONFIG
 | 
						|
 | 
						|
  if [ "$1" -eq 0 ]; then # disable driver
 | 
						|
    sed $CONFIG -i -e "s/^dtoverlay=vc4-kms-v3d/#dtoverlay=vc4-kms-v3d/"
 | 
						|
    rm /etc/xdg/autostart/xcompmgr.desktop
 | 
						|
    mv /usr/share/X11/xorg.conf.d/99-fbturbo.~ /usr/share/X11/xorg.conf.d/99-fbturbo.conf
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      whiptail --msgbox "Desktop GL driver is disabled" 20 60 1
 | 
						|
    fi
 | 
						|
  else # enable driver
 | 
						|
    sed $CONFIG -i -e "s/^#dtoverlay=vc4-kms-v3d/dtoverlay=vc4-kms-v3d/"
 | 
						|
    if ! grep -q -E "^dtoverlay=vc4-kms-v3d" $CONFIG; then
 | 
						|
      printf "dtoverlay=vc4-kms-v3d\n" >> $CONFIG
 | 
						|
    fi
 | 
						|
    cat <<EOF >/etc/xdg/autostart/xcompmgr.desktop
 | 
						|
[Desktop Entry]
 | 
						|
Type=Application
 | 
						|
Name=xcompmgr
 | 
						|
Comment=Start simple compositor
 | 
						|
NoDisplay=true
 | 
						|
Exec=xcompmgr -a
 | 
						|
EOF
 | 
						|
    mv /usr/share/X11/xorg.conf.d/99-fbturbo.conf /usr/share/X11/xorg.conf.d/99-fbturbo.~
 | 
						|
    sed $CONFIG -i -e "s/^gpu_mem/#gpu_mem/"
 | 
						|
    if [ "$INTERACTIVE" = True ]; then
 | 
						|
      whiptail --msgbox "Desktop GL driver is enabled" 20 60 1
 | 
						|
    fi
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_gldriver() {
 | 
						|
  if is_pione || is_pizero; then
 | 
						|
    whiptail --msgbox "GL driver cannot be used on Pi 1 or Pi 0" 20 60 2
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
  if [ ! -e /boot/overlays/vc4-kms-v3d-overlay.dtb ]; then
 | 
						|
    whiptail --msgbox "Driver and kernel not present on your system. Please update" 20 60 2
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
  if [ $(dpkg -l libgl1-mesa-dri | tail -n 1 | cut -d ' ' -f 1) != "ii" ]; then
 | 
						|
    whiptail --msgbox "libgl1-mesa-dri not found - please install" 20 60 2
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
  if [ ! -e /usr/bin/xcompmgr ]; then
 | 
						|
    whiptail --msgbox "xcompmgr not found - please install" 20 60 2
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
  if [ "$INTERACTIVE" = True ]; then
 | 
						|
    whiptail --yesno "Enable experimental GL driver for desktop?" 20 60 2 \
 | 
						|
      --yes-button Disable --no-button Enable
 | 
						|
    RET=$?
 | 
						|
  else
 | 
						|
    RET=$1
 | 
						|
  fi
 | 
						|
  if [ $RET -eq 0 ] || [ $RET -eq 1 ]; then
 | 
						|
    ASK_TO_REBOOT=1
 | 
						|
    set_gldriver $RET;
 | 
						|
  else
 | 
						|
    return 1
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_update() {
 | 
						|
  apt-get update &&
 | 
						|
  apt-get install raspi-config &&
 | 
						|
  printf "Sleeping 5 seconds before reloading raspi-config\n" &&
 | 
						|
  sleep 5 &&
 | 
						|
  exec raspi-config
 | 
						|
}
 | 
						|
 | 
						|
do_audio() {
 | 
						|
  AUDIO_OUT=$(whiptail --menu "Choose the audio output" 20 60 10 \
 | 
						|
    "0" "Auto" \
 | 
						|
    "1" "Force 3.5mm ('headphone') jack" \
 | 
						|
    "2" "Force HDMI" \
 | 
						|
    3>&1 1>&2 2>&3)
 | 
						|
  if [ $? -eq 0 ]; then
 | 
						|
    amixer cset numid=3 "$AUDIO_OUT"
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_finish() {
 | 
						|
  disable_raspi_config_at_boot
 | 
						|
  if [ $ASK_TO_REBOOT -eq 1 ]; then
 | 
						|
    whiptail --yesno "Would you like to reboot now?" 20 60 2
 | 
						|
    if [ $? -eq 0 ]; then # yes
 | 
						|
      sync
 | 
						|
      reboot
 | 
						|
    fi
 | 
						|
  fi
 | 
						|
  exit 0
 | 
						|
}
 | 
						|
 | 
						|
# $1 = filename, $2 = key name
 | 
						|
get_json_string_val() {
 | 
						|
  sed -n -e "s/^[[:space:]]*\"$2\"[[:space:]]*:[[:space:]]*\"\(.*\)\"[[:space:]]*,$/\1/p" $1
 | 
						|
}
 | 
						|
 | 
						|
# TODO: This is probably broken
 | 
						|
do_apply_os_config() {
 | 
						|
  [ -e /boot/os_config.json ] || return 0
 | 
						|
  NOOBSFLAVOUR=$(get_json_string_val /boot/os_config.json flavour)
 | 
						|
  NOOBSLANGUAGE=$(get_json_string_val /boot/os_config.json language)
 | 
						|
  NOOBSKEYBOARD=$(get_json_string_val /boot/os_config.json keyboard)
 | 
						|
 | 
						|
  if [ -n "$NOOBSFLAVOUR" ]; then
 | 
						|
    printf "Setting flavour to %s based on os_config.json from NOOBS. May take a while\n" "$NOOBSFLAVOUR"
 | 
						|
 | 
						|
    printf "Unrecognised flavour. Ignoring\n"
 | 
						|
  fi
 | 
						|
 | 
						|
  # TODO: currently ignores en_gb settings as we assume we are running in a 
 | 
						|
  # first boot context, where UK English settings are default
 | 
						|
  case "$NOOBSLANGUAGE" in
 | 
						|
    "en")
 | 
						|
      if [ "$NOOBSKEYBOARD" = "gb" ]; then
 | 
						|
        DEBLANGUAGE="" # UK english is the default, so ignore
 | 
						|
      else
 | 
						|
        DEBLANGUAGE="en_US.UTF-8"
 | 
						|
      fi
 | 
						|
      ;;
 | 
						|
    "de")
 | 
						|
      DEBLANGUAGE="de_DE.UTF-8"
 | 
						|
      ;;
 | 
						|
    "fi")
 | 
						|
      DEBLANGUAGE="fi_FI.UTF-8"
 | 
						|
      ;;
 | 
						|
    "fr")
 | 
						|
      DEBLANGUAGE="fr_FR.UTF-8"
 | 
						|
      ;;
 | 
						|
    "hu")
 | 
						|
      DEBLANGUAGE="hu_HU.UTF-8"
 | 
						|
      ;;
 | 
						|
    "ja")
 | 
						|
      DEBLANGUAGE="ja_JP.UTF-8"
 | 
						|
      ;;
 | 
						|
    "nl")
 | 
						|
      DEBLANGUAGE="nl_NL.UTF-8"
 | 
						|
      ;;
 | 
						|
    "pt")
 | 
						|
      DEBLANGUAGE="pt_PT.UTF-8"
 | 
						|
      ;;
 | 
						|
    "ru")
 | 
						|
      DEBLANGUAGE="ru_RU.UTF-8"
 | 
						|
      ;;
 | 
						|
    "zh_CN")
 | 
						|
      DEBLANGUAGE="zh_CN.UTF-8"
 | 
						|
      ;;
 | 
						|
    *)
 | 
						|
      printf "Language '%s' not handled currently. Run sudo raspi-config to set up" "$NOOBSLANGUAGE"
 | 
						|
      ;;
 | 
						|
  esac
 | 
						|
 | 
						|
  if [ -n "$DEBLANGUAGE" ]; then
 | 
						|
    printf "Setting language to %s based on os_config.json from NOOBS. May take a while\n" "$DEBLANGUAGE"
 | 
						|
    cat << EOF | debconf-set-selections
 | 
						|
locales   locales/locales_to_be_generated multiselect     $DEBLANGUAGE UTF-8
 | 
						|
EOF
 | 
						|
    rm /etc/locale.gen
 | 
						|
    dpkg-reconfigure -f noninteractive locales
 | 
						|
    update-locale LANG="$DEBLANGUAGE"
 | 
						|
    cat << EOF | debconf-set-selections
 | 
						|
locales   locales/default_environment_locale select       $DEBLANGUAGE
 | 
						|
EOF
 | 
						|
  fi
 | 
						|
 | 
						|
  if [ -n "$NOOBSKEYBOARD" -a "$NOOBSKEYBOARD" != "gb" ]; then
 | 
						|
    printf "Setting keyboard layout to %s based on os_config.json from NOOBS. May take a while\n" "$NOOBSKEYBOARD"
 | 
						|
    sed -i /etc/default/keyboard -e "s/^XKBLAYOUT.*/XKBLAYOUT=\"$NOOBSKEYBOARD\"/"
 | 
						|
    dpkg-reconfigure -f noninteractive keyboard-configuration
 | 
						|
    invoke-rc.d keyboard-setup start
 | 
						|
  fi
 | 
						|
  return 0
 | 
						|
}
 | 
						|
 | 
						|
nonint() {
 | 
						|
    $*
 | 
						|
}
 | 
						|
 | 
						|
#
 | 
						|
# Command line options for non-interactive use
 | 
						|
#
 | 
						|
for i in $*
 | 
						|
do
 | 
						|
  case $i in
 | 
						|
  --memory-split)
 | 
						|
    OPT_MEMORY_SPLIT=GET
 | 
						|
    printf "Not currently supported\n"
 | 
						|
    exit 1
 | 
						|
    ;;
 | 
						|
  --memory-split=*)
 | 
						|
    OPT_MEMORY_SPLIT=`echo $i | sed 's/[-a-zA-Z0-9]*=//'`
 | 
						|
    printf "Not currently supported\n"
 | 
						|
    exit 1
 | 
						|
    ;;
 | 
						|
  --expand-rootfs)
 | 
						|
    INTERACTIVE=False
 | 
						|
    do_expand_rootfs
 | 
						|
    printf "Please reboot\n"
 | 
						|
    exit 0
 | 
						|
    ;;
 | 
						|
  --apply-os-config)
 | 
						|
    INTERACTIVE=False
 | 
						|
    do_apply_os_config
 | 
						|
    exit $?
 | 
						|
    ;;
 | 
						|
  nonint)
 | 
						|
    INTERACTIVE=False
 | 
						|
    $@
 | 
						|
    ;;
 | 
						|
  *)
 | 
						|
    # unknown option
 | 
						|
    ;;
 | 
						|
  esac
 | 
						|
done
 | 
						|
 | 
						|
#if [ "GET" = "${OPT_MEMORY_SPLIT:-}" ]; then
 | 
						|
#  set -u # Fail on unset variables
 | 
						|
#  get_current_memory_split
 | 
						|
#  echo $CURRENT_MEMSPLIT
 | 
						|
#  exit 0
 | 
						|
#fi
 | 
						|
 | 
						|
# Everything else needs to be run as root
 | 
						|
if [ $(id -u) -ne 0 ]; then
 | 
						|
  printf "Script must be run as root. Try 'sudo raspi-config'\n"
 | 
						|
  exit 1
 | 
						|
fi
 | 
						|
 | 
						|
if [ -n "${OPT_MEMORY_SPLIT:-}" ]; then
 | 
						|
  set -e # Fail when a command errors
 | 
						|
  set_memory_split "${OPT_MEMORY_SPLIT}"
 | 
						|
  exit 0
 | 
						|
fi
 | 
						|
 | 
						|
do_internationalisation_menu() {
 | 
						|
  FUN=$(whiptail --title "Raspberry Pi Software Configuration Tool (raspi-config)" --menu "Internationalisation Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \
 | 
						|
    "I1 Change Locale" "Set up language and regional settings to match your location" \
 | 
						|
    "I2 Change Timezone" "Set up timezone to match your location" \
 | 
						|
    "I3 Change Keyboard Layout" "Set the keyboard layout to match your keyboard" \
 | 
						|
    "I4 Change Wi-fi Country" "Set the legal channels used in your country" \
 | 
						|
    3>&1 1>&2 2>&3)
 | 
						|
  RET=$?
 | 
						|
  if [ $RET -eq 1 ]; then
 | 
						|
    return 0
 | 
						|
  elif [ $RET -eq 0 ]; then
 | 
						|
    case "$FUN" in
 | 
						|
      I1\ *) do_change_locale ;;
 | 
						|
      I2\ *) do_change_timezone ;;
 | 
						|
      I3\ *) do_configure_keyboard ;;
 | 
						|
      I4\ *) do_configure_wifi_country ;;
 | 
						|
      *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
 | 
						|
    esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
do_advanced_menu() {
 | 
						|
  FUN=$(whiptail --title "Raspberry Pi Software Configuration Tool (raspi-config)" --menu "Advanced Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Back --ok-button Select \
 | 
						|
    "A1 Overscan" "You may need to configure overscan if black bars are present on display" \
 | 
						|
    "A2 Hostname" "Set the visible name for this Pi on a network" \
 | 
						|
    "A3 Memory Split" "Change the amount of memory made available to the GPU" \
 | 
						|
    "A4 SSH" "Enable/Disable remote command line access to your Pi using SSH" \
 | 
						|
    "A5 Device Tree" "Enable/Disable the use of Device Tree" \
 | 
						|
    "A6 SPI" "Enable/Disable automatic loading of SPI kernel module (needed for e.g. PiFace)" \
 | 
						|
    "A7 I2C" "Enable/Disable automatic loading of I2C kernel module" \
 | 
						|
    "A8 Serial" "Enable/Disable shell and kernel messages on the serial connection" \
 | 
						|
    "A9 Audio" "Force audio out through HDMI or 3.5mm jack" \
 | 
						|
    "AA GL Driver" "Enable/Disable experimental desktop GL driver" \
 | 
						|
    "AB 1-Wire" "Enable/Disable one-wire interface" \
 | 
						|
    "AC GPIO Server" "Enable/Disable remote access to GPIO pins" \
 | 
						|
    "A0 Update" "Update this tool to the latest version" \
 | 
						|
    3>&1 1>&2 2>&3)
 | 
						|
  RET=$?
 | 
						|
  if [ $RET -eq 1 ]; then
 | 
						|
    return 0
 | 
						|
  elif [ $RET -eq 0 ]; then
 | 
						|
    case "$FUN" in
 | 
						|
      A1\ *) do_overscan ;;
 | 
						|
      A2\ *) do_change_hostname ;;
 | 
						|
      A3\ *) do_memory_split ;;
 | 
						|
      A4\ *) do_ssh ;;
 | 
						|
      A5\ *) do_devicetree ;;
 | 
						|
      A6\ *) do_spi ;;
 | 
						|
      A7\ *) do_i2c ;;
 | 
						|
      A8\ *) do_serial ;;
 | 
						|
      A9\ *) do_audio ;;
 | 
						|
      AA\ *) do_gldriver ;;
 | 
						|
      AB\ *) do_onewire ;;
 | 
						|
      AC\ *) do_gpiosec ;;
 | 
						|
      A0\ *) do_update ;;
 | 
						|
      *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
 | 
						|
    esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
 | 
						|
  fi
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
#
 | 
						|
# Interactive use loop
 | 
						|
#
 | 
						|
if [ "$INTERACTIVE" = True ]; then
 | 
						|
  get_init_sys
 | 
						|
  calc_wt_size
 | 
						|
  while true; do
 | 
						|
    FUN=$(whiptail --title "Raspberry Pi Software Configuration Tool (raspi-config)" --menu "Setup Options" $WT_HEIGHT $WT_WIDTH $WT_MENU_HEIGHT --cancel-button Finish --ok-button Select \
 | 
						|
      "1 Expand Filesystem" "Ensures that all of the SD card storage is available to the OS" \
 | 
						|
      "2 Change User Password" "Change password for the default user (pi)" \
 | 
						|
      "3 Boot Options" "Choose whether to boot into a desktop environment or the command line" \
 | 
						|
      "4 Wait for Network at Boot" "Choose whether to wait for network connection during boot" \
 | 
						|
      "5 Internationalisation Options" "Set up language and regional settings to match your location" \
 | 
						|
      "6 Enable Camera" "Enable this Pi to work with the Raspberry Pi Camera" \
 | 
						|
      "7 Add to Rastrack" "Add this Pi to the online Raspberry Pi Map (Rastrack)" \
 | 
						|
      "8 Overclock" "Configure overclocking for your Pi" \
 | 
						|
      "9 Advanced Options" "Configure advanced settings" \
 | 
						|
      "0 About raspi-config" "Information about this configuration tool" \
 | 
						|
      3>&1 1>&2 2>&3)
 | 
						|
    RET=$?
 | 
						|
    if [ $RET -eq 1 ]; then
 | 
						|
      do_finish
 | 
						|
    elif [ $RET -eq 0 ]; then
 | 
						|
      case "$FUN" in
 | 
						|
        1\ *) do_expand_rootfs ;;
 | 
						|
        2\ *) do_change_pass ;;
 | 
						|
        3\ *) do_boot_behaviour_new ;;
 | 
						|
        4\ *) do_wait_for_network ;;
 | 
						|
        5\ *) do_internationalisation_menu ;;
 | 
						|
        6\ *) do_camera ;;
 | 
						|
        7\ *) do_rastrack ;;
 | 
						|
        8\ *) do_overclock ;;
 | 
						|
        9\ *) do_advanced_menu ;;
 | 
						|
        0\ *) do_about ;;
 | 
						|
        *) whiptail --msgbox "Programmer error: unrecognized option" 20 60 1 ;;
 | 
						|
      esac || whiptail --msgbox "There was an error running option $FUN" 20 60 1
 | 
						|
    else
 | 
						|
      exit 1
 | 
						|
    fi
 | 
						|
  done
 | 
						|
fi
 |