260 lines
7.1 KiB
Bash
Executable File
260 lines
7.1 KiB
Bash
Executable File
#!/bin/bash -e
|
|
|
|
NEW_USER="pi"
|
|
|
|
TOMCAT_VERSION=9.0.36
|
|
TOMCAT_FILE=apache-tomcat-9.0.36.tar.gz
|
|
TOMCAT_URL=https://downloads.apache.org/tomcat/tomcat-9/v9.0.36/bin/apache-tomcat-9.0.36.tar.gz
|
|
|
|
WIRING_PI_VERSION=2.60
|
|
WIRING_PI_DEB=wiringpi-2.60-1_arm64.deb
|
|
|
|
JAVA_VERSION=11.0.6+10
|
|
JAVA_DEB=bellsoft-jdk11.0.6+10-linux-aarch64.deb
|
|
JAVA_URL=https://download.bell-sw.com/java/11.0.6+10/bellsoft-jdk11.0.6+10-linux-aarch64.deb
|
|
|
|
SOURCEDIR="$(cd ${0%/*} ; pwd)"
|
|
ROOTDIR="$1"
|
|
|
|
# Do not start services during installation.
|
|
echo exit 101 > ${ROOTDIR}/usr/sbin/policy-rc.d
|
|
chmod +x ${ROOTDIR}/usr/sbin/policy-rc.d
|
|
|
|
export LANG=POSIX
|
|
|
|
|
|
# Configure apt.
|
|
echo
|
|
echo "INFO: Configuring APT..."
|
|
export DEBIAN_FRONTEND=noninteractive
|
|
mkdir -p ${ROOTDIR}/etc/apt/sources.list.d/
|
|
mkdir -p ${ROOTDIR}/etc/apt/apt.conf.d/
|
|
echo "Acquire::http { Proxy \"http://localhost:3142\"; };" > ${ROOTDIR}/etc/apt/apt.conf.d/50apt-cacher-ng
|
|
#cp ${SOURCEDIR}/etc/apt/sources_64.list ${ROOTDIR}/etc/apt/sources.list
|
|
cp ${SOURCEDIR}/etc/apt/apt.conf.d/50raspi ${ROOTDIR}/etc/apt/apt.conf.d/50raspi
|
|
chroot ${ROOTDIR} apt-get update
|
|
chroot ${ROOTDIR} apt-get -y dist-upgrade
|
|
chroot ${ROOTDIR} apt-get clean -y
|
|
chroot ${ROOTDIR} apt-get autoclean -y
|
|
chroot ${ROOTDIR} apt-get autoremove -y
|
|
|
|
|
|
# configure locale
|
|
echo
|
|
echo "INFO: Configuring locale..."
|
|
chroot ${ROOTDIR} apt-get install -y locales tzdata
|
|
cp ${SOURCEDIR}/etc/default/locale ${ROOTDIR}/etc/default/locale
|
|
cp ${SOURCEDIR}/etc/default/keyboard ${ROOTDIR}/etc/default/keyboard
|
|
cp ${SOURCEDIR}/etc/locale.gen ${ROOTDIR}/etc/locale.gen
|
|
chroot ${ROOTDIR} locale-gen
|
|
TIMEZONE="Europe/Zurich"
|
|
echo $TIMEZONE > ${ROOTDIR}/etc/timezone
|
|
ln -sf /usr/share/zoneinfo/${TIMEZONE} ${ROOTDIR}/etc/localtime
|
|
|
|
|
|
# Install packages
|
|
echo
|
|
echo "INFO: Installing packages..."
|
|
chroot ${ROOTDIR} apt-get --no-install-recommends install -y \
|
|
anacron \
|
|
apt-utils \
|
|
bash-completion \
|
|
byobu \
|
|
python-cliapp \
|
|
binutils \
|
|
bzip2 \
|
|
console-data \
|
|
ca-certificates \
|
|
cron-apt \
|
|
curl \
|
|
debian-keyring \
|
|
debian-archive-keyring \
|
|
dbus \
|
|
dhcpcd5 \
|
|
dirmngr \
|
|
fail2ban \
|
|
fake-hwclock \
|
|
git \
|
|
i2c-tools \
|
|
ifupdown \
|
|
iptables \
|
|
iputils-ping \
|
|
isc-dhcp-client \
|
|
kbd \
|
|
kmod \
|
|
less \
|
|
libapr1 \
|
|
locales \
|
|
man-db \
|
|
nano \
|
|
needrestart \
|
|
net-tools \
|
|
netbase \
|
|
ntp \
|
|
ntpdate \
|
|
openssh-server \
|
|
owfs \
|
|
parted \
|
|
python-ow \
|
|
rng-tools \
|
|
rsync \
|
|
uuid-runtime \
|
|
unzip \
|
|
vim \
|
|
wget
|
|
|
|
chroot ${ROOTDIR} apt-get autoclean -y
|
|
chroot ${ROOTDIR} apt-get autoremove -y
|
|
|
|
|
|
# Install Java
|
|
echo
|
|
echo "INFO: Downloading JDK ${JAVA_VERSION}..."
|
|
if [[ ! -f ${JAVA_DEB} ]] ; then
|
|
echo "INFO: Downloading JDK ${JAVA_VERSION} from ${JAVA_URL}..."
|
|
if ! wget --quiet --continue -O ${SOURCEDIR}/debs64/${JAVA_DEB} ${JAVA_URL} ; then
|
|
echo "ERROR: Failed to download JDK!"
|
|
fi
|
|
else
|
|
echo "INFO: JDK ${JAVA_VERSION} already downloaded."
|
|
fi
|
|
|
|
echo "INFO: Installing Java deb ${JAVA_DEB}"
|
|
mkdir -p ${ROOTDIR}/opt/downloads
|
|
cp ${SOURCEDIR}/debs64/${JAVA_DEB} ${ROOTDIR}/opt/downloads/
|
|
chroot ${ROOTDIR} apt-get --no-install-recommends install -y libasound2 libfreetype6 libx11-6 libxau6 libxcb1 libxdmcp6 libxext6 libxi6 libxrender1 libxtst6
|
|
chroot ${ROOTDIR} apt-get autoclean -y
|
|
chroot ${ROOTDIR} apt-get autoremove -y
|
|
chroot ${ROOTDIR} dpkg -i /opt/downloads/${JAVA_DEB}
|
|
rm ${ROOTDIR}/opt/downloads/${JAVA_DEB}
|
|
echo "INFO: JDK ${JAVA_VERSION} installed."
|
|
|
|
|
|
# Configuring boot
|
|
echo
|
|
echo "INFO: Configuring boot..."
|
|
cp ${SOURCEDIR}/boot/cmdline_64.txt ${ROOTDIR}/boot/cmdline.txt
|
|
cp ${SOURCEDIR}/boot/config_64.txt ${ROOTDIR}/boot/config.txt
|
|
cp ${SOURCEDIR}/etc/default/* ${ROOTDIR}/etc/default/
|
|
cp ${SOURCEDIR}/etc/fstab ${ROOTDIR}/etc/fstab
|
|
cp ${SOURCEDIR}/etc/modules ${ROOTDIR}/etc/modules
|
|
cp ${SOURCEDIR}/etc/network/iptables.rules ${ROOTDIR}/etc/network/iptables.rules
|
|
cp ${SOURCEDIR}/etc/rc.local ${ROOTDIR}/etc/rc.local
|
|
ln -fs /dev/null ${ROOTDIR}/etc/systemd/network/99-dhcp.network
|
|
chmod a+x ${ROOTDIR}/etc/rc.local
|
|
|
|
|
|
# Install kernel.
|
|
echo
|
|
echo "INFO: Installing kernel..."
|
|
${SOURCEDIR}/install-kernel-64.sh ${ROOTDIR}
|
|
|
|
|
|
# Regenerate SSH host keys on first boot.
|
|
echo
|
|
echo "INFO: Deleting generated SSH host keys..."
|
|
chroot ${ROOTDIR} apt-get install -y
|
|
rm -f ${ROOTDIR}/etc/ssh/ssh_host_*
|
|
mkdir -p ${ROOTDIR}/etc/systemd/system
|
|
cp ${SOURCEDIR}/etc/systemd/system/regen-ssh-keys.service ${ROOTDIR}/etc/systemd/system/regen-ssh-keys.service
|
|
chroot ${ROOTDIR} systemctl enable regen-ssh-keys
|
|
|
|
|
|
# Raspberry Pi features.
|
|
echo
|
|
echo "INFO: Configuring Raspberry Pi features..."
|
|
|
|
# get raspi-config
|
|
echo "INFO: Cloning raspi-config..."
|
|
cd ${ROOTDIR}/opt/
|
|
git clone https://github.com/RPi-Distro/raspi-config.git
|
|
|
|
# configure non-root interfaces
|
|
echo "INFO: Adding special groups..."
|
|
chroot ${ROOTDIR} groupadd --force gpio
|
|
chroot ${ROOTDIR} groupadd --force i2c
|
|
chroot ${ROOTDIR} groupadd --force spi
|
|
|
|
echo "INFO: Adding udev rules..."
|
|
cp ${SOURCEDIR}/etc/udev/rules.d/99-com.rules ${ROOTDIR}/etc/udev/rules.d/99-com.rules
|
|
|
|
# copy binaries
|
|
echo "INFO: Copying special binaries..."
|
|
mkdir -p ${ROOTDIR}/usr/local/bin
|
|
cp ${SOURCEDIR}/bin-files64/* ${ROOTDIR}/usr/local/bin/
|
|
chmod u+s ${ROOTDIR}/usr/local/bin/pwm
|
|
chmod u+s ${ROOTDIR}/usr/local/bin/i2c_get_clkt_tout
|
|
chmod u+s ${ROOTDIR}/usr/local/bin/i2c_set_clkt_tout
|
|
cd ${SOURCEDIR}
|
|
|
|
|
|
# WiringPi
|
|
echo
|
|
echo "INFO: Installing wiringPi ${WIRING_PI_VERSION}"
|
|
mkdir -p ${ROOTDIR}/opt/downloads
|
|
cp ${SOURCEDIR}/debs64/${WIRING_PI_DEB} ${ROOTDIR}/opt/downloads/
|
|
chroot ${ROOTDIR} dpkg -i /opt/downloads/${WIRING_PI_DEB}
|
|
rm ${ROOTDIR}/opt/downloads/${WIRING_PI_DEB}
|
|
echo "INFO: wiringPi ${WIRING_PI_VERSION} installed."
|
|
|
|
|
|
# Configure OWFS
|
|
echo
|
|
echo "INFO: Configuring OWFS..."
|
|
cp ${SOURCEDIR}/etc/owfs.conf ${ROOTDIR}/etc/owfs.conf
|
|
mkdir -p ${ROOTDIR}/mnt/1wire0
|
|
chroot ${ROOTDIR} systemctl disable owftpd
|
|
chroot ${ROOTDIR} systemctl disable owhttpd
|
|
|
|
|
|
# Configure user
|
|
echo
|
|
echo "INFO: Configuring User ${NEW_USER}..."
|
|
chroot ${ROOTDIR} usermod ${NEW_USER} --append --groups i2c,spi,gpio,dialout
|
|
|
|
|
|
# Create a swapfile.
|
|
echo
|
|
echo "INFO: Creating SWAP file..."
|
|
dd if=/dev/zero of=${ROOTDIR}/var/swapfile bs=1M count=512
|
|
chroot ${ROOTDIR} chmod 600 /var/swapfile
|
|
chroot ${ROOTDIR} mkswap /var/swapfile
|
|
echo /var/swapfile none swap sw 0 0 >> ${ROOTDIR}/etc/fstab
|
|
|
|
|
|
# Tomcat preparations
|
|
echo
|
|
echo "INFO: Preparing Apache Tomcat ${TOMCAT_VERSION}..."
|
|
if [[ ! -f ${TOMCAT_FILE} ]] ; then
|
|
echo "INFO: Downloading Apache Tomcat..."
|
|
if ! wget --quiet -O ${SOURCEDIR}/${TOMCAT_FILE} ${TOMCAT_URL} ; then
|
|
echo "ERROR: Failed to download Tomcat!"
|
|
fi
|
|
fi
|
|
tar -xzf ${TOMCAT_FILE}
|
|
rm -rf apache-tomcat-${TOMCAT_VERSION}/webapps/{docs,examples,host-manager,manager}
|
|
mv apache-tomcat-${TOMCAT_VERSION} ${ROOTDIR}/opt/
|
|
cd ${ROOTDIR}/opt/
|
|
ln -s apache-tomcat-${TOMCAT_VERSION} tomcat
|
|
|
|
cp ${SOURCEDIR}/tomcat-setenv.sh ${ROOTDIR}/opt/tomcat/bin/setenv.sh
|
|
|
|
echo
|
|
echo "INFO: Preparing directories..."
|
|
chroot ${ROOTDIR} chown -R ${NEW_USER}:${NEW_USER} /opt/downloads
|
|
chroot ${ROOTDIR} chown -R ${NEW_USER}:${NEW_USER} /opt/apache-tomcat-${TOMCAT_VERSION}
|
|
chroot ${ROOTDIR} chown -R ${NEW_USER}:${NEW_USER} /opt/tomcat
|
|
|
|
|
|
# Done.
|
|
echo
|
|
echo "INFO: Cleaning up..."
|
|
chroot ${ROOTDIR} apt-get clean -y
|
|
chroot ${ROOTDIR} apt-get autoclean -y
|
|
chroot ${ROOTDIR} apt-get autoremove -y
|
|
rm ${ROOTDIR}/usr/sbin/policy-rc.d
|
|
rm ${ROOTDIR}/etc/apt/apt.conf.d/50apt-cacher-ng
|
|
echo "INFO: Done."
|
|
echo
|
|
echo
|