mirror of
https://github.com/femtofox/femtofox.git
synced 2026-10-26 19:02:00 -04:00
404 lines
No EOL
14 KiB
Bash
Executable file
404 lines
No EOL
14 KiB
Bash
Executable file
#!/bin/bash
|
|
|
|
if [[ $(id -u) != 0 ]]; then
|
|
echo "This script must be run as root; use sudo"
|
|
exit 1
|
|
fi
|
|
|
|
sudoer=$(echo $SUDO_USER)
|
|
|
|
################ STEPS ################
|
|
# now found at bottom as function calls
|
|
#######################################
|
|
|
|
################ TODO ################
|
|
# Add more error handling
|
|
# Address potential issues in comments
|
|
# Package selection with curses
|
|
# Switch chroot packages install
|
|
# Modify DTS etc to enable SPI1
|
|
######################################
|
|
|
|
install_prerequisites() {
|
|
echo “Setting up Foxbuntu build environment…”
|
|
apt update
|
|
apt install -y git ssh make gcc gcc-multilib g++-multilib module-assistant expect g++ gawk texinfo libssl-dev bison flex fakeroot cmake unzip gperf autoconf device-tree-compiler libncurses5-dev pkg-config bc python-is-python3 passwd openssl openssh-server openssh-client vim file cpio rsync qemu-user-static binfmt-support dialog
|
|
}
|
|
|
|
clone_repos() {
|
|
echo "Cloning repos..."
|
|
#mkdir /home/${sudoer}/
|
|
cd /home/${sudoer}/
|
|
git clone https://github.com/LuckfoxTECH/luckfox-pico.git
|
|
git clone https://github.com/noon92/femtofox.git
|
|
}
|
|
|
|
build_env() {
|
|
echo "Setting up SDK env..."
|
|
echo "When the menu appears to choose your board choose Luckfox Pico Mini A (1), SDCard (0) and Ubuntu (1)."
|
|
echo "Press any key to continue building the enviroment..."
|
|
read -n 1 -s -r
|
|
cd /home/${sudoer}/luckfox-pico
|
|
./build.sh env
|
|
}
|
|
|
|
build_sysdrv() {
|
|
echo "Building sysdrv..."
|
|
cd /home/${sudoer}/luckfox-pico
|
|
./build.sh sysdrv
|
|
}
|
|
|
|
build_uboot() {
|
|
echo "Building uboot..."
|
|
cd /home/${sudoer}/luckfox-pico
|
|
./build.sh uboot
|
|
}
|
|
|
|
build_rootfs() {
|
|
echo "Building rootfs..."
|
|
cd /home/${sudoer}/luckfox-pico
|
|
./build.sh rootfs
|
|
}
|
|
|
|
copy_femtofox_kernelcfg() {
|
|
echo "Merging in Foxbuntu modifications..."
|
|
cd /home/${sudoer}/femtofox/foxbuntu/
|
|
# need to change updatefs.sh, kernel stuff here and rootfs stuff later
|
|
# ./updatefs.sh
|
|
rsync -aHAXv --progress --keep-dirlinks --itemize-changes /home/${sudoer}/femtofox/foxbuntu/sysdrv/ /home/${sudoer}/luckfox-pico/sysdrv/
|
|
rsync -aHAXv --progress --keep-dirlinks --itemize-changes /home/${sudoer}/femtofox/foxbuntu/project/ /home/${sudoer}/luckfox-pico/project/
|
|
rsync -aHAXv --progress --keep-dirlinks --itemize-changes /home/${sudoer}/femtofox/foxbuntu/output/image/ /home/${sudoer}/luckfox-pico/output/image/
|
|
|
|
}
|
|
|
|
build_kernelconfig() {
|
|
echo "Building kernelconfig... Please exit without making any changes unless you know what you are doing."
|
|
echo "Press any key to continue building the kernel..."
|
|
read -n 1 -s -r
|
|
cd /home/${sudoer}/luckfox-pico
|
|
./build.sh kernelconfig
|
|
./build.sh kernel
|
|
}
|
|
|
|
modify_kernel() {
|
|
echo "Building kernel... ."
|
|
echo "After making kernel configuration changes, make sure to save as .config (default) before exiting."
|
|
echo "Press any key to continue building the kernel..."
|
|
read -n 1 -s -r
|
|
cd /home/${sudoer}/luckfox-pico
|
|
./build.sh kernelconfig
|
|
./build.sh kernel
|
|
build_rootfs
|
|
build_firmware
|
|
cp /home/${sudoer}/luckfox-pico/sysdrv/out/kernel_drv_ko/* /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/lib/modules/5.10.160/
|
|
echo "Entering chroot..."
|
|
mount --bind /proc /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/proc
|
|
mount --bind /sys /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/sys
|
|
mount --bind /dev /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/dev
|
|
mount --bind /dev/pts /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/dev/pts
|
|
chroot /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106 /bin/bash <<EOF
|
|
echo "Inside chroot environment..."
|
|
echo "Setting up kernel modules..."
|
|
depmod -a 5.10.160
|
|
echo "Cleaning up chroot..."
|
|
apt clean && rm -rf /var/lib/apt/lists/* && rm -rf /tmp/* && rm -rf /var/tmp/* && find /var/log -type f -exec truncate -s 0 {} + && : > /root/.bash_history && history -c
|
|
exit
|
|
EOF
|
|
|
|
umount /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/dev/pts
|
|
umount /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/proc
|
|
umount /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/sys
|
|
umount /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/dev
|
|
build_rootfs
|
|
build_firmware
|
|
create_image
|
|
}
|
|
|
|
|
|
modify_chroot() {
|
|
echo "Entering chroot... make your changes and then type exit when you are done and it will build the image with your changes."
|
|
echo "Press any key to continue entering chroot..."
|
|
read -n 1 -s -r
|
|
mount --bind /proc /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/proc
|
|
mount --bind /sys /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/sys
|
|
mount --bind /dev /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/dev
|
|
mount --bind /dev/pts /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/dev/pts
|
|
chroot /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106 /bin/bash
|
|
umount /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/dev/pts
|
|
umount /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/proc
|
|
umount /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/sys
|
|
umount /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/dev
|
|
build_rootfs
|
|
build_firmware
|
|
create_image
|
|
}
|
|
|
|
update_image() {
|
|
#we still need the chroot scripts function but this will work for now.
|
|
echo "Updating repo..."
|
|
cd /home/${sudoer}/femtofox
|
|
git pull
|
|
cd /home/${sudoer}/
|
|
copy_femtofox_kernelcfg
|
|
build_kernelconfig
|
|
build_rootfs
|
|
build_firmware
|
|
create_image
|
|
}
|
|
|
|
modify_rootfs() {
|
|
echo "Modifying rootfs..."
|
|
cd /home/${sudoer}/luckfox-pico/output/image
|
|
echo "Copying kernel modules..."
|
|
mkdir -p /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/lib/modules/5.10.160
|
|
cp /home/${sudoer}/luckfox-pico/sysdrv/out/kernel_drv_ko/* /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/lib/modules/5.10.160/
|
|
which qemu-arm-static
|
|
echo "Entering chroot and running commands..."
|
|
cp /usr/bin/qemu-arm-static /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/usr/bin/
|
|
mount --bind /proc /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/proc
|
|
mount --bind /sys /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/sys
|
|
mount --bind /dev /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/dev
|
|
mount --bind /dev/pts /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/dev/pts
|
|
# can i indent with EOF ??
|
|
chroot /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106 /bin/bash <<EOF
|
|
echo "Inside chroot environment..."
|
|
echo "tmpfs /run tmpfs rw,nodev,nosuid,size=32M 0 0" | tee -a /etc/fstab
|
|
|
|
# Temporarily removed for SEGFAULT fix done after upgrade below.
|
|
#echo "Installing Meshtastic..."
|
|
|
|
#wget -qO- https://meshtastic.github.io/meshtastic-deb.asc | tee /etc/apt/keyrings/meshtastic-deb.asc >/dev/null
|
|
#if [[ $? -eq 2 ]]; then echo "Error, step failed..."; fi
|
|
#echo "deb [arch=all signed-by=/etc/apt/keyrings/meshtastic-deb.asc] https://meshtastic.github.io/deb stable main" | tee /etc/apt/sources.list.d/meshtastic-deb.list >/dev/null
|
|
|
|
echo "Removing netdevice rules..."
|
|
|
|
ln -s /dev/null /etc/udev/rules.d/80-net-setup-link.rules
|
|
|
|
echo "Setting up kernel modules..."
|
|
|
|
touch /lib/modules/5.10.160/modules.order
|
|
touch /lib/modules/5.10.160/modules.builtin
|
|
depmod -a 5.10.160
|
|
if [[ $? -eq 2 ]]; then echo "Error, step failed..."; fi
|
|
|
|
echo "Setting localtime to UTC..."
|
|
|
|
rm /etc/localtime
|
|
ln -sf /usr/share/zoneinfo/UTC /etc/localtime
|
|
|
|
echo "Installing packages..."
|
|
|
|
apt update
|
|
DEBIAN_FRONTEND=noninteractive apt install -y --option Dpkg::Options::="--force-confold" linux-firmware wireless-tools git python3.10-venv libgpiod-dev libyaml-cpp-dev libbluetooth-dev openssl libssl-dev libulfius-dev liborcania-dev evtest screen avahi-daemon protobuf-compiler telnet fonts-noto-color-emoji ninja-build chrony qrencode
|
|
if [[ $? -eq 2 ]]; then echo "Error, step failed..."; fi
|
|
DEBIAN_FRONTEND=noninteractive apt upgrade -y --option Dpkg::Options::="--force-confold"
|
|
|
|
# Tempfix for SEGFAULT
|
|
wget https://github.com/meshtastic/firmware/releases/download/v2.5.11.8e2a3e5/meshtasticd_2.5.11.8e2a3e5_armhf.deb
|
|
DEBIAN_FRONTEND=noninteractive apt install -y --option Dpkg::Options::="--force-confold" ./meshtasticd_2.5.11.8e2a3e5_armhf.deb
|
|
|
|
|
|
echo "Installing dependencies for meshing-around and meshtastic cli..."
|
|
|
|
pip3 install requests pyephem pytap2 meshtastic pypubsub geopy maidenhead beautifulsoup4 dadjokes schedule wikipedia googlesearch-python
|
|
if [[ $? -eq 2 ]]; then echo "Error, step failed..."; fi
|
|
|
|
echo "Setting MOTD..."
|
|
|
|
mv /etc/update-motd.d/10-help-text /etc/update-motd.d/10-help-text.bak
|
|
mv /etc/update-motd.d/60-unminimize /etc/update-motd.d/60-unminimize.bak
|
|
|
|
echo "Setting hostname to femtofox..."
|
|
|
|
echo "femtofox" | tee /etc/hostname > /dev/null
|
|
|
|
echo "Configuring autostart of systemd services..."
|
|
|
|
systemctl enable button
|
|
systemctl enable wifi-mesh-control
|
|
systemctl disable NetworkManager
|
|
systemctl disable NetworkManager-dispatcher
|
|
systemctl disable NetworkManager-wait-online
|
|
systemctl disable vsftpd.service
|
|
systemctl disable ModemManager.service
|
|
systemctl disable getty@tty1.service
|
|
systemctl disable acpid
|
|
systemctl disable acpid.socket
|
|
systemctl disable acpid.service
|
|
systemctl mask alsa-restore.service
|
|
systemctl disable alsa-restore.service
|
|
systemctl disable alsa-state.service
|
|
systemctl mask sound.target
|
|
systemctl disable sound.target
|
|
systemctl disable veritysetup.target
|
|
systemctl disable systemd-pstore.service
|
|
|
|
echo "Adding femto and pico users/groups..."
|
|
|
|
groupmod -n femto pico
|
|
usermod -l femto pico
|
|
usermod -aG sudo,input femto
|
|
echo "femto ALL=(ALL:ALL) ALL" | tee /etc/sudoers.d/femto > /dev/null
|
|
chmod 440 /etc/sudoers.d/femto
|
|
|
|
# this seems messy, user:group should be set cleanly and not corrected after? OSC: somethings were owned my pico from factory
|
|
|
|
find / -group pico -exec chgrp femto {} \; 2>/dev/null
|
|
find / -user pico -exec chown femto {} \; 2>/dev/null
|
|
usermod -d /home/femto -m femto
|
|
ls -ld /home/femto
|
|
echo 'femto:femto' | chpasswd
|
|
sudo chage -d 0 femto
|
|
usermod -a -G tty femto
|
|
usermod -a -G dialout femto
|
|
|
|
echo "Cleaning up chroot..."
|
|
|
|
apt clean && rm -rf /var/lib/apt/lists/* && rm -rf /tmp/* && rm -rf /var/tmp/* && find /var/log -type f -exec truncate -s 0 {} + && : > /root/.bash_history && history -c
|
|
exit
|
|
EOF
|
|
|
|
umount /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/dev/pts
|
|
umount /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/proc
|
|
umount /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/sys
|
|
umount /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/dev
|
|
}
|
|
|
|
build_firmware() {
|
|
echo "Building firmware..."
|
|
cd /home/${sudoer}/luckfox-pico/
|
|
./build.sh firmware
|
|
}
|
|
|
|
create_image() {
|
|
echo "Creating final sdcard img..."
|
|
cd /home/${sudoer}/luckfox-pico/output/image
|
|
sudo /home/${sudoer}/luckfox-pico/output/image/blkenvflash /home/${sudoer}/luckfox-pico/foxbuntu.img
|
|
if [[ $? -eq 2 ]]; then echo "Error, sdcard img failed to build..."; exit 2; else echo "foxbuntu.img build completed."; fi
|
|
du -h /home/${sudoer}/luckfox-pico/foxbuntu.img
|
|
}
|
|
|
|
sdk_install() {
|
|
{ echo 'Defaults timestamp_timeout=180' | sudo EDITOR='tee -a' visudo; } > /dev/null 2>&1
|
|
start_time=$(date +%s)
|
|
install_prerequisites
|
|
clone_repos
|
|
build_env
|
|
build_uboot
|
|
copy_femtofox_kernelcfg
|
|
build_kernelconfig
|
|
build_rootfs
|
|
rsync -aHAXv --progress --keep-dirlinks --itemize-changes /home/${sudoer}/femtofox/foxbuntu/sysdrv/out/rootfs_uclibc_rv1106/ /home/${sudoer}/luckfox-pico/sysdrv/out/rootfs_uclibc_rv1106/
|
|
build_firmware
|
|
modify_rootfs
|
|
build_rootfs
|
|
build_firmware
|
|
create_image
|
|
{ sudo sed -i '/Defaults timestamp_timeout=180/d' /etc/sudoers; } > /dev/null 2>&1
|
|
end_time=$(date +%s)
|
|
elapsed=$(( end_time - start_time ))
|
|
hours=$(( elapsed / 3600 ))
|
|
minutes=$(( (elapsed % 3600) / 60 ))
|
|
seconds=$(( elapsed % 60 ))
|
|
printf "Environment installation time: %02d:%02d:%02d\n" $hours $minutes $seconds
|
|
}
|
|
|
|
usage() {
|
|
echo "The following functions are available in this script:"
|
|
echo "To install the development environment use the arg 'sdk_install' and is intended to be run ONCE only."
|
|
echo "To modify the chroot and build an updated image use the arg 'modify_chroot'."
|
|
echo "To modify the kernel and build an updated image use the arg 'modify_kernel'."
|
|
echo "other args: install_prerequisites clone_repos build_env build_sysdrv copy_femtofox_kernelcfg build_kernelconfig modify_rootfs build_rootf build_uboot build_firmware get_envblkflash create_image"
|
|
echo "Example: sudo ~/foxbunto_env_setup.sh sdk_install"
|
|
echo "Example: sudo ~/foxbunto_env_setup.sh modify_chroot"
|
|
exit 0
|
|
}
|
|
|
|
################### MENU SYSTEM ###################
|
|
|
|
while true; do
|
|
CHOICE=$(dialog --clear --backtitle "Foxbuntu SDK Builder" \
|
|
--title "Main Menu" \
|
|
--menu "Choose an action:" 20 60 12 \
|
|
1 "Update Image" \
|
|
2 "Modify Chroot" \
|
|
3 "Modify Kernel" \
|
|
4 "Install Prerequisites" \
|
|
5 "Clone Repositories" \
|
|
6 "Build Environment" \
|
|
7 "Build SysDrv" \
|
|
8 "Build U-Boot" \
|
|
9 "Build RootFS" \
|
|
10 "Create Final Image" \
|
|
11 "SDK Install (Run All Steps)" \
|
|
12 "Exit" \
|
|
2>&1 >/dev/tty)
|
|
|
|
clear
|
|
|
|
case $CHOICE in
|
|
1)
|
|
update_image
|
|
;;
|
|
2)
|
|
modify_chroot
|
|
;;
|
|
3)
|
|
modify_kernel
|
|
;;
|
|
4)
|
|
install_prerequisites
|
|
;;
|
|
5)
|
|
clone_repos
|
|
;;
|
|
6)
|
|
build_env
|
|
;;
|
|
7)
|
|
build_sysdrv
|
|
;;
|
|
8)
|
|
build_uboot
|
|
;;
|
|
9)
|
|
build_rootfs
|
|
;;
|
|
10)
|
|
create_image
|
|
;;
|
|
11)
|
|
sdk_install
|
|
;;
|
|
12)
|
|
echo "Exiting..."
|
|
break
|
|
;;
|
|
*)
|
|
echo "Invalid option, please try again."
|
|
;;
|
|
esac
|
|
done
|
|
|
|
### Run all functions. Broken out so any individual step can be performed if failed.
|
|
# Should add clean functions...
|
|
# probably rewrite this as case switch
|
|
|
|
if [[ $(echo ${1} | egrep -i "^(h|help)$") ]]; then
|
|
usage
|
|
elif [[ -z ${1} ]]; then
|
|
usage
|
|
elif [[ ${1} == "modify_chroot" ]]; then
|
|
modify_chroot
|
|
elif [[ ${1} == "modify_kernel" ]]; then
|
|
modify_kernel
|
|
elif [[ ${1} == "update_image" ]]; then
|
|
update_image
|
|
elif [[ ${1} == "sdk_install" ]]; then
|
|
sdk_install
|
|
else
|
|
${1}
|
|
fi
|
|
|
|
exit 0 |