#!/bin/sh

export PATH=/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
UPDATE_TARBALL=update.tar.gz

echo "Update Script started"
pre_vers=`head -n 1 /etc/cabversion`

path=$PWD

# Working directory for passwd, group, and shadow merges
pwdupdir="/tmp/pwdupdir"
mkdir -p ${pwdupdir}
#<PASSWD>
#<GROUP>
#<SHADOW>

# Save password files before extracting the TAR archive
for f in passwd group shadow; do
	cp "/etc/${f}" "${pwdupdir}/${f}.bkp"
done

cd /
## tar will fail immediately if a directory is about to be replaced
## by a file or a symlink. Thus, check here for this problem and
## remove directories before unpacking the tar file.
tar tf ${path}/${UPDATE_TARBALL} | while IFS= read -r line; do
	test -z "${line}" && continue

	case "${line}" in
	*/)
		f="${line%/}"
		if [ -L "${f}" ] || [ -e "${f}" -a ! -d "${f}" ]; then
			echo "  Replacing file or symlink '${f}' with directory"
			rm -f "${f}"
		fi
		;;
	*)
		if [ -d "${line}" -a ! -L "${line}" ]; then
			echo "  Replacing directory '${line}' with file or symlink"
			rm -rf "${line}"
		fi
		;;
	esac
done
tar xzf ${path}/${UPDATE_TARBALL}
sync

#<REMOVE>
rm -f "/etc/ssl/certs/f387163d.0"
rm -f "/etc/ssl/certs/f3377b1b.0"
rm -f "/etc/ssl/certs/f081611a.0"
rm -f "/etc/ssl/certs/ee64a828.0"
rm -f "/etc/ssl/certs/aee5f10d.0"
rm -f "/etc/ssl/certs/XRamp_Global_CA_Root.pem"
rm -f "/etc/ssl/certs/TrustCor_RootCert_CA-2.pem"
rm -f "/etc/ssl/certs/TrustCor_RootCert_CA-1.pem"
rm -f "/etc/ssl/certs/TrustCor_ECA-1.pem"
rm -f "/etc/ssl/certs/SwissSign_Silver_CA_-_G2.pem"
rm -f "/etc/ssl/certs/Starfield_Class_2_CA.pem"
rm -f "/etc/ssl/certs/Security_Communication_Root_CA.pem"
rm -f "/etc/ssl/certs/Security_Communication_RootCA3.pem"
rm -f "/etc/ssl/certs/SecureSign_RootCA11.pem"
rm -f "/etc/ssl/certs/Hongkong_Post_Root_CA_1.pem"
rm -f "/etc/ssl/certs/Go_Daddy_Class_2_CA.pem"
rm -f "/etc/ssl/certs/GlobalSign_Root_CA.pem"
rm -f "/etc/ssl/certs/Entrust_Root_Certification_Authority_-_G4.pem"
rm -f "/etc/ssl/certs/Entrust.net_Premium_2048_Secure_Server_CA.pem"
rm -f "/etc/ssl/certs/E-Tugra_Global_Root_CA_RSA_v3.pem"
rm -f "/etc/ssl/certs/E-Tugra_Global_Root_CA_ECC_v3.pem"
rm -f "/etc/ssl/certs/E-Tugra_Certification_Authority.pem"
rm -f "/etc/ssl/certs/Comodo_AAA_Services_root.pem"
rm -f "/etc/ssl/certs/Baltimore_CyberTrust_Root.pem"
rm -f "/etc/ssl/certs/Autoridad_de_Certificacion_Firmaprofesional_CIF_A62634068_2.pem"
rm -f "/etc/ssl/certs/7aaf71c0.0"
rm -f "/etc/ssl/certs/706f604c.0"
rm -f "/etc/ssl/certs/66445960.0"
rm -f "/etc/ssl/certs/653b494a.0"
rm -f "/etc/ssl/certs/5e98733a.0"
rm -f "/etc/ssl/certs/5d3033c5.0"
rm -f "/etc/ssl/certs/5ad8a5d6.0"
rm -f "/etc/ssl/certs/5a7722fb.0"
rm -f "/etc/ssl/certs/57bcb2da.0"
rm -f "/etc/ssl/certs/5273a94c.0"
rm -f "/etc/ssl/certs/3e45d192.0"
rm -f "/etc/ssl/certs/3e44d2f7.0"
rm -f "/etc/ssl/certs/3bde41ac.1"
rm -f "/etc/ssl/certs/18856ac4.0"
rm -f "/etc/ssl/certs/08063a00.0"
rm -f "/lib/modules/6.1.132/kernel/net/xfrm/xfrm_interface.ko"
rm -rf "/lib/modules/6.1.132/kernel/net/xfrm/"
rm -f "/lib/modules/6.1.132/kernel/net/sched/sch_teql.ko"
rm -rf "/lib/modules/6.1.132/kernel/net/sched/"
rm -f "/lib/modules/6.1.132/kernel/net/netfilter/xt_TCPMSS.ko"
rm -rf "/lib/modules/6.1.132/kernel/net/netfilter/"
rm -f "/lib/modules/6.1.132/kernel/net/ipv6/ip6_udp_tunnel.ko"
rm -rf "/lib/modules/6.1.132/kernel/net/ipv6/"
rm -f "/lib/modules/6.1.132/kernel/net/ipv4/udp_tunnel.ko"
rm -f "/lib/modules/6.1.132/kernel/net/ipv4/esp4_offload.ko"
rm -rf "/lib/modules/6.1.132/kernel/net/ipv4/"
rm -f "/lib/modules/6.1.132/kernel/net/batman-adv/batman-adv.ko"
rm -rf "/lib/modules/6.1.132/kernel/net/batman-adv/"
rm -rf "/lib/modules/6.1.132/kernel/net/"
rm -f "/lib/modules/6.1.132/kernel/lib/crypto/libcurve25519.ko"
rm -f "/lib/modules/6.1.132/kernel/lib/crypto/libcurve25519-generic.ko"
rm -f "/lib/modules/6.1.132/kernel/lib/crypto/libchacha20poly1305.ko"
rm -rf "/lib/modules/6.1.132/kernel/lib/crypto/"
rm -f "/lib/modules/6.1.132/kernel/lib/libcrc32c.ko"
rm -f "/lib/modules/6.1.132/kernel/lib/crc7.ko"
rm -f "/lib/modules/6.1.132/kernel/lib/crc-itu-t.ko"
rm -rf "/lib/modules/6.1.132/kernel/lib/"
rm -f "/lib/modules/6.1.132/kernel/kernel/configs.ko"
rm -rf "/lib/modules/6.1.132/kernel/kernel/"
rm -f "/lib/modules/6.1.132/kernel/fs/configfs/configfs.ko"
rm -rf "/lib/modules/6.1.132/kernel/fs/configfs/"
rm -f "/lib/modules/6.1.132/kernel/fs/binfmt_misc.ko"
rm -rf "/lib/modules/6.1.132/kernel/fs/"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/serial/usbserial.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/serial/usb_wwan.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/serial/usb-serial-simple.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/serial/sierra.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/serial/pl2303.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/serial/option.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/serial/ftdi_sio.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/serial/cp210x.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/usb/serial/"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/gadget/legacy/g_mass_storage.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/gadget/legacy/g_ether.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/usb/gadget/legacy/"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/gadget/function/usb_f_rndis.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/gadget/function/usb_f_mass_storage.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/gadget/function/usb_f_ecm_subset.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/gadget/function/usb_f_ecm.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/gadget/function/u_ether.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/usb/gadget/function/"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/gadget/libcomposite.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/usb/gadget/"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/class/cdc-wdm.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/usb/class/cdc-acm.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/usb/class/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/usb/"
rm -f "/lib/modules/6.1.132/kernel/drivers/tty/serial/sc16is7xx.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/tty/serial/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/tty/"
rm -f "/lib/modules/6.1.132/kernel/drivers/soc/qcom/qmi_helpers.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/soc/qcom/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/soc/"
rm -f "/lib/modules/6.1.132/kernel/drivers/ptp/ptp-qoriq.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/ptp/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/ralink/rt2x00/rt2x00usb.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/ralink/rt2x00/rt2x00lib.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/ralink/rt2x00/rt2800usb.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/ralink/rt2x00/rt2800lib.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireless/ralink/rt2x00/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireless/ralink/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/mediatek/mt76/mt7921/mt7921e.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/mediatek/mt76/mt7921/mt7921-common.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireless/mediatek/mt76/mt7921/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/mediatek/mt76/mt7915/mt7915e.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireless/mediatek/mt76/mt7915/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/mediatek/mt76/mt76.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/mediatek/mt76/mt76-connac-lib.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireless/mediatek/mt76/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireless/mediatek/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/intel/iwlwifi/mvm/iwlmvm.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireless/intel/iwlwifi/mvm/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/intel/iwlwifi/iwlwifi.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireless/intel/iwlwifi/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireless/intel/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/ath/ath11k/ath11k_pci.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/ath/ath11k/ath11k.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireless/ath/ath11k/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireless/ath/ath.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireless/ath/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireless/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/wireguard/wireguard.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/wireguard/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/usb/usbnet.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/usb/smsc75xx.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/usb/sierra_net.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/usb/r8153_ecm.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/usb/qmi_wwan.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/usb/huawei_cdc_ncm.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/usb/cdc_ncm.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/usb/cdc_mbim.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/usb/cdc_ether.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/usb/asix.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/usb/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/phy/sfp.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/phy/phylink.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/phy/ax88796b.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/phy/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/pcs/pcs-lynx.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/pcs/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/mdio/mdio-netlink.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/mdio/mdio-i2c.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/mdio/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/ipvlan/ipvtap.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/ipvlan/ipvlan.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/ipvlan/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/ethernet/freescale/enetc/fsl-enetc.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/ethernet/freescale/enetc/fsl-enetc-mdio.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/ethernet/freescale/enetc/fsl-enetc-ierb.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/ethernet/freescale/enetc/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/ethernet/freescale/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/ethernet/"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/tap.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/mhi_net.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/net/bareudp.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/net/"
rm -f "/lib/modules/6.1.132/kernel/drivers/modules/pae/pae.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/modules/pae/"
rm -f "/lib/modules/6.1.132/kernel/drivers/modules/gpio/gpio.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/modules/gpio/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/modules/"
rm -f "/lib/modules/6.1.132/kernel/drivers/misc/eeprom/eeprom_93cx6.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/misc/eeprom/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/misc/"
rm -f "/lib/modules/6.1.132/kernel/drivers/irqchip/irq-imx-mu-msi.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/irqchip/"
rm -f "/lib/modules/6.1.132/kernel/drivers/input/serio/serport.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/input/serio/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/input/"
rm -f "/lib/modules/6.1.132/kernel/drivers/i2c/algos/i2c-algo-pcf.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/i2c/algos/i2c-algo-pca.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/i2c/algos/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/i2c/"
rm -f "/lib/modules/6.1.132/kernel/drivers/dma/virt-dma.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/dma/imx-sdma.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/dma/"
rm -f "/lib/modules/6.1.132/kernel/drivers/crypto/caam/error.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/crypto/caam/caamhash_desc.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/crypto/caam/caamalg_desc.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/crypto/caam/caam_jr.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/crypto/caam/caam.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/crypto/caam/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/crypto/"
rm -f "/lib/modules/6.1.132/kernel/drivers/char/tpm/tpm_tis_spi.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/char/tpm/tpm_tis_core.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/char/tpm/tpm_i2c_atmel.ko"
rm -f "/lib/modules/6.1.132/kernel/drivers/char/tpm/tpm.ko"
rm -rf "/lib/modules/6.1.132/kernel/drivers/char/tpm/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/char/"
rm -rf "/lib/modules/6.1.132/kernel/drivers/"
rm -f "/lib/modules/6.1.132/kernel/crypto/xts.ko"
rm -f "/lib/modules/6.1.132/kernel/crypto/ecb.ko"
rm -f "/lib/modules/6.1.132/kernel/crypto/curve25519-generic.ko"
rm -f "/lib/modules/6.1.132/kernel/crypto/crypto_engine.ko"
rm -rf "/lib/modules/6.1.132/kernel/crypto/"
rm -f "/lib/modules/6.1.132/kernel/arch/arm/crypto/poly1305-arm.ko"
rm -f "/lib/modules/6.1.132/kernel/arch/arm/crypto/chacha-neon.ko"
rm -rf "/lib/modules/6.1.132/kernel/arch/arm/crypto/"
rm -rf "/lib/modules/6.1.132/kernel/arch/arm/"
rm -rf "/lib/modules/6.1.132/kernel/arch/"
rm -rf "/lib/modules/6.1.132/kernel/"
rm -f "/lib/modules/6.1.132/modules.symbols.bin"
rm -f "/lib/modules/6.1.132/modules.symbols"
rm -f "/lib/modules/6.1.132/modules.softdep"
rm -f "/lib/modules/6.1.132/modules.order"
rm -f "/lib/modules/6.1.132/modules.devname"
rm -f "/lib/modules/6.1.132/modules.dep.bin"
rm -f "/lib/modules/6.1.132/modules.dep"
rm -f "/lib/modules/6.1.132/modules.builtin.modinfo"
rm -f "/lib/modules/6.1.132/modules.builtin.bin"
rm -f "/lib/modules/6.1.132/modules.builtin"
rm -f "/lib/modules/6.1.132/modules.alias.bin"
rm -f "/lib/modules/6.1.132/modules.alias"
rm -rf "/lib/modules/6.1.132/"
rm -f "/usr/bin/asn1Parser"
rm -f "/usr/bin/asn1Decoding"
rm -f "/usr/bin/asn1Coding"
rm -f "/usr/lib/tmpfiles.d/sudo.conf"
rm -rf "/usr/lib/tmpfiles.d/"
rm -f "/usr/lib/libtasn1.so.6.5.5"
rm -f "/usr/lib/libnettle.so.6.5"
rm -f "/usr/lib/libnettle.so.6"
rm -f "/usr/lib/libhogweed.so.4.5"
rm -f "/usr/lib/libhogweed.so.4"
rm -f "/usr/share/ca-certificates/mozilla/XRamp_Global_CA_Root.crt"
rm -f "/usr/share/ca-certificates/mozilla/TrustCor_RootCert_CA-2.crt"
rm -f "/usr/share/ca-certificates/mozilla/TrustCor_RootCert_CA-1.crt"
rm -f "/usr/share/ca-certificates/mozilla/TrustCor_ECA-1.crt"
rm -f "/usr/share/ca-certificates/mozilla/SwissSign_Silver_CA_-_G2.crt"
rm -f "/usr/share/ca-certificates/mozilla/Starfield_Class_2_CA.crt"
rm -f "/usr/share/ca-certificates/mozilla/Security_Communication_Root_CA.crt"
rm -f "/usr/share/ca-certificates/mozilla/Security_Communication_RootCA3.crt"
rm -f "/usr/share/ca-certificates/mozilla/SecureSign_RootCA11.crt"
rm -f "/usr/share/ca-certificates/mozilla/Hongkong_Post_Root_CA_1.crt"
rm -f "/usr/share/ca-certificates/mozilla/Go_Daddy_Class_2_CA.crt"
rm -f "/usr/share/ca-certificates/mozilla/GlobalSign_Root_CA.crt"
rm -f "/usr/share/ca-certificates/mozilla/Entrust_Root_Certification_Authority_-_G4.crt"
rm -f "/usr/share/ca-certificates/mozilla/Entrust.net_Premium_2048_Secure_Server_CA.crt"
rm -f "/usr/share/ca-certificates/mozilla/E-Tugra_Global_Root_CA_RSA_v3.crt"
rm -f "/usr/share/ca-certificates/mozilla/E-Tugra_Global_Root_CA_ECC_v3.crt"
rm -f "/usr/share/ca-certificates/mozilla/E-Tugra_Certification_Authority.crt"
rm -f "/usr/share/ca-certificates/mozilla/Comodo_AAA_Services_root.crt"
rm -f "/usr/share/ca-certificates/mozilla/Baltimore_CyberTrust_Root.crt"
rm -f "/usr/share/ca-certificates/mozilla/Autoridad_de_Certificacion_Firmaprofesional_CIF_A62634068_2.crt"
sync

# Unpack tar file again.
# If directories are replaced by a symlink,
# the removes above might delete files.
# Restore them here again.
tar xzf ${path}/${UPDATE_TARBALL}
sync

## Merge password files if they have changed.
## Therefore, determine which entries are new
## or have changed and apply them to the new
## file from the update.
## A changed entry will be dropped if the entry
## is removed by the update.
for file in passwd group shadow; do
	# Variables
	fnew="/etc/${file}"
	fbkp="${pwdupdir}/${file}.bkp"
	fold="${pwdupdir}/${file}"
	fdiff="${pwdupdir}/${file}.diff"
	mode="$(stat -c '%a' ${fnew})"
	fileowner="$(stat -c '%U' "${fnew}")"
	filegroup="$(stat -c '%G' "${fnew}")"

	# Skip if file has not changed
	diff -q ${fnew} ${fbkp} &>/dev/null && continue

	# Removing all exactly matching lines of old and new from the
	# backup file. The result is changed or new entries.
	grep -v -x -F -f ${fnew} -f ${fold} ${fbkp} > ${fdiff}

	# Create a temporary file for the modifications
	tmp="$(mktemp ${pwdupdir}/${file}-XXXXXX)"
	# Apply the changes to the new file
	awk -F: '
	function pr(type, msg) {
		printf( "  %-7s %7s %s\n", "'"${file}"':", type, msg) > "/dev/stderr";
	}
	function FileToMap(file, map,    a, cmd, line, n) {
		# Get entries from file and store them in an array
		# using the first token until ":" as key.
		while ( (getline line < file) > 0 ) {
			n = split(line, a, ":");
			if ( n < 2 )
				continue;
			map[a[1]] = line;
		}
		close(file);
	}
	function append(a, b) {
		if ( a != "" )
			a = a ", ";

		return a b;
	}
	BEGIN {
		# Store file entries in arrays
		# Note that awk passes arrays as reference
		FileToMap("'"${fdiff}"'", dMap);
		FileToMap("'"${fold}"'", oMap);
		FileToMap("'"${fbkp}"'", bMap);
	}
	/^[^:]+:/ {
		# Check if this entry has been changed
		if ( $1 in dMap ) {
			# Yes, use changed entry
			print dMap[$1];
			delete dMap[$1];
			msg["MERGED"] = append(msg["MERGED"], $1);
		} else {
			# No, keep the entry
			if ( !($1 in oMap) && !($1 in bMap) ) {
				# Was neither in old nor in bkp file,
				# so it must be a new entry
				msg["NEW"] = append(msg["NEW"], $1);
			}
			print $0;
		}
		# Remove entries from old map. Eventually, the remaining
		# entries in the old map are the entries that were removed.
		delete oMap[$1];
		next;
	}
	{
		# Other lines, keep them as they are
		print $0;
		next;
	}
	END {
		# Loop over entries that were in the old but not in the
		# new file anymore.
		for ( i in oMap ) {
			if ( i in dMap ) {
				# Entry has been changed but is removed now.
				delete dMap[i];
				msg["DROPPED"] = append(msg["DROPPED"], i);
			} else {
				# Entry was removed during the update.
				msg["REMOVED"] = append(msg["REMOVED"], i);
			}
		}

		# Loop over remaining changed entries
		for ( i in dMap ) {
			# Entries that were neither in old nor new file.
			print dMap[i];
			msg["EXTRA"] = append(msg["EXTRA"], i);
		}

		# Print results
		for ( i in msg )
			pr(i, msg[i]);

	}
	' ${fnew} 2>&1 >${tmp}
	if [ $? -ne 0 ]; then
		echo -e "${file}:\tMERGE FAILED, CHECK PASSWORDS AND GROUPS!!!"
		continue
	fi

	# Update new file but keep the previous file as backup
	mv ${fbkp} ${fnew}-
	mv ${tmp} ${fnew}
	# ${tmp} had mode 600, so change it correctly
	chown "${fileowner}:${filegroup}" ${fnew} ${fnew}-	
	chmod ${mode} ${fnew} ${fnew}-
done

# Clean-up
rm -rf ${pwdupdir}
sync

cd ${path}

## Update Kernel if present
if [ -r /root/apf6-linux.bin ]; then
	echo "Installing new kernel"
	mount -t ext4 /dev/mmcblk2p1 /mnt

	mv /root/apf6-linux.bin /mnt/

	sync
	umount /mnt
fi

## Update Device Trees if present
if ls /root/imx6*.dtb &> /dev/null; then
	echo "Installing new Device Trees"
	mount -t ext4 /dev/mmcblk2p1 /mnt

	for i in /root/imx6*.dtb; do
		if [ -r "$i" ]; then
			echo "  * $(basename "$i")"
			mv $i /mnt/
		fi
	done
	sync
	umount /mnt
fi

## Update Bootloader (u-boot) if present
if [ -r /root/apf6-u-boot.img -a -r /root/apf6-u-boot.spl ]; then
	echo "Installing new bootloader"

	echo 0 > /sys/block/mmcblk2boot0/force_ro

	# Flash SPL
	dd if=/root/apf6-u-boot.spl of=/dev/mmcblk2boot0 bs=512 seek=2 status=none
	# Flash bootloader
	dd if=/root/apf6-u-boot.img of=/dev/mmcblk2boot0 bs=512 seek=138 status=none
	# Erase environment and backup environment
	dd if=/dev/zero of=/dev/mmcblk2boot0 bs=512 seek=2048 count=2048 status=none

	echo 1 > /sys/block/mmcblk2boot0/force_ro

	rm /root/apf6-u-boot.*

	sync
fi
ldconfig

echo "Update finished."


post_vers=`head -n 1 /etc/cabversion`
echo "Updated from ${pre_vers} to ${post_vers}"

echo "The config file /etc/cablynx.conf was untouched."
echo "Please use the new config file in /etc/conf.d/cablynx.factory"
