#!/bin/sh
###############################################################################
#                                                                             #
# IPFire.org - A linux based firewall                                         #
# Copyright (C) 2007-2023  IPFire Team  <info@ipfire.org>                     #
#                                                                             #
# 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/>.       #
#                                                                             #
###############################################################################

. /etc/sysconfig/rc
. ${rc_functions}

case "${1}" in
	start)
		if [ -e "/.partresize" ]; then

			boot_mesg "Mounting root file system in read/write mode ..."
			mount -o remount,rw / > /dev/null
			evaluate_retval

			# check if serial console enabled
			scon="off";
			if [ ! "$(grep "console=ttyS0" /proc/cmdline)" == "" ]; then
				scon="on";
			fi
			if [ -e /sys/class/dmi/id/product_name ]; then
				IFS= read -r DMI_PRODUCT_NAME < /sys/class/dmi/id/product_name;
				case ${DMI_PRODUCT_NAME} in
					APU|apu[1-4]|PC\ Engines\ apu[1-4] )
							scon="on";
						;;
				esac
			fi

			# Enable the serial console on all systems on AWS EC2, Oracle Cloud,
			# Azure and Google Compute Platform
			if running_on_ec2 || running_on_oci || running_on_azure || running_on_gcp; then
				scon="on"
				journal="on"
			fi

			mount /boot > /dev/null
			case "$(< /proc/device-tree/model )" in
				FriendlyElec\ NanoPi?R1* )
					# Install AP6112 wlan config on NanoPi R1
					cp -f   /lib/firmware/brcm/brcmfmac43430-sdio.AP6212.txt \
						/lib/firmware/brcm/brcmfmac43430-sdio.txt
					cp -f   /lib/firmware/brcm/brcmfmac43430a0-sdio.ONDA-V80_PLUS.txt \
						/lib/firmware/brcm/brcmfmac43430a0-sdio.txt
				;;
				FriendlyElec\ NanoPi?R2* )
					# Generate MAC address at first boot
					SWMAC=`printf "%1x2:%02x:%02x:%02x:%02x" $[RANDOM%16] $[RANDOM%256] $[RANDOM%256] $[RANDOM%256] $[RANDOM%256]`
					echo ethaddr=$SWMAC:00 >> /boot/uEnv.txt
					echo eth1addr=$SWMAC:01 >> /boot/uEnv.txt
				;;
				FriendlyElec\ NanoPi?R4* )
					# Generate MAC address at first boot
					SWMAC=`printf "%1x2:%02x:%02x:%02x:%02x" $[RANDOM%16] $[RANDOM%256] $[RANDOM%256] $[RANDOM%256] $[RANDOM%256]`
					echo ethaddr=$SWMAC:00 >> /boot/uEnv.txt
					echo eth1addr=$SWMAC:01 >> /boot/uEnv.txt
				;;
				Xunlong\ Orange\ Pi\ R1\ Plus* )
					# Generate MAC address at first boot
					# This board should have mac addresses in rom but uboot
					# doesnt set it for fist nic
					SWMAC=`printf "%1x2:%02x:%02x:%02x:%02x" $[RANDOM%16] $[RANDOM%256] $[RANDOM%256] $[RANDOM%256] $[RANDOM%256]`
					echo ethaddr=$SWMAC:00 >> /boot/uEnv.txt
					echo eth1addr=$SWMAC:01 >> /boot/uEnv.txt
				;;
			esac 2>/dev/null

			if [ -e /boot/grub/grub.cfg ]; then
				# swtich permanent to serial console if it was selected on first boot
				if [ "${scon}" = "on" ]; then
					# Enable also serial console on GRUB
					echo "GRUB_TERMINAL=\"serial console\"" >> /etc/default/grub
					echo "GRUB_SERIAL_COMMAND=\"serial --unit=0 --speed=115200\"" >> /etc/default/grub
					sed -i -e "s|panic=10|& console=ttyS0,115200n8|g" /etc/default/grub
				fi

				# Re-generate GRUB configuration
				/usr/sbin/grub-mkconfig -o /boot/grub/grub.cfg
			fi
			umount /boot > /dev/null

			# Detect device
			mount | while read -r dev tmp1 mountpoint tmp2; do
				[ "${dev}" = "rootfs" ] && continue

				if [ "${mountpoint}" = "/" ]; then
					# Find root partition number
					part_num="${dev: -1}"

					# Find path to the root device
					root_dev="${dev::-1}"
					if [ ! -b "${dev::-1}" -a "${root_dev: -1}" = "p" ]; then
						root_dev="${dev::-2}"
					fi

					# Check if the device support smart
					smartctl --smart=on "${root_dev}" > /dev/null
					if [ ${?} = 0 ]; then
						journal="on"
					fi

					# Enable journal
					if [ "${journal}" = "on" ]; then
						boot_mesg "Create journal on "${dev}" ..."
						tune2fs -O has_journal "${dev}"
					fi

					boot_mesg "Growing root partition to maximum size..."
					echo -e ',+' | sfdisk --no-reread -f -N${part_num} "${root_dev}" 2>/dev/null

					# The filesystem should be resized after
					# this operation
					touch /.resizefs

					# Remove marker
					rm -f /.partresize

					# Reboot
					boot_mesg "Rebooting system..."
					mount -o remount,ro / &>/dev/null
					sleep 15
					reboot -f
				fi
			done
		fi
		;;
	*)
		echo "Usage: ${0} {start}"
		exit 1
		;;
esac
