#!/usr/bin/env bash
#
# Author: Dmitry Razumov <asmeron@ublinux.com>
# Copyright (c) 2021-2025 UBLinux <support@ublinux.com>
#

ENABLED=no
[[ ${ENABLED} == "yes" ]] || exit 0
#grep -q 1 /run/ublinux_started || exit 0

. /usr/lib/ublinux/functions
. /usr/lib/ublinux/default

SOURCE=${SYSCONF}/config; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null
SOURCE=${SYSCONF}/system; [[ -f ${SOURCE} ]] && . ${SOURCE} 2>/dev/null

SAVETOMODULEOPTIONS="$MKSQFS_FASTALG"

PATH=/usr/lib/ublinux/scripts:$PATH

# save2module mode parser
MODULEFORMAT="ubm"
CHSRC=$(readlink -f /mnt/live/memory/changes)
IMSRC=$(readlink -f /mnt/live/memory/images)
[ -z "$SAVETOMODULENAME" -a -w /mnt/livedata/$LIVECDNAME-data/modules ] && SAVETOMODULENAME=/mnt/livedata/$LIVECDNAME-data/modules/zz-save.$MODULEFORMAT
[ -z "$SAVETOMODULENAME" -a -w /mnt/livemedia/$LIVECDNAME/modules ] && SAVETOMODULENAME=/mnt/livemedia/$LIVECDNAME/modules/zz-save.$MODULEFORMAT
[ -f /.savetomodule ] && grep -q . /.savetomodule && SAVETOMODULENAME="$(cat /.savetomodule)"
[ -f /.savetomodule ] && SAVETOMODULE=${SAVETOMODULE-yes}
grep -q save2module /proc/cmdline && SAVETOMODULE=${SAVETOMODULE-yes}
# if machine was freezed
grep -Eq '/dynamic/|/static/' /.savetomodule 2>/dev/null  && [ -f "$(sed s=dynamic=static= /.savetomodule)" ] && SAVETOMODULE=no
# if machine was unfreezed
grep -q /static/ /.savetomodule 2>/dev/null && [ ! -f "$(cat /.savetomodule)" ] && SAVETOMODULENAME=$(sed s=static=dynamic= /.savetomodule)
SAVETOMODULEDIR="$(dirname $SAVETOMODULENAME)"
FILELIST=/.savelist
if [ -w $SAVETOMODULEDIR -a "$SAVETOMODULE" = "yes" ] ;then
   echo "Please wait. Saving changes to module $SAVETOMODULENAME"
   # if old module exists we have to concatenate it
   if [ -d $IMSRC/${SAVETOMODULENAME##*/} ]; then
      echo "Old module exists, we have to concatenate it"
      SRC=/mnt/live/tmp/save2module
      mkdir -p $SRC $SRC-rw
      mount -t aufs -o shwh,br:$SRC-rw=rw:$CHSRC=rr:$IMSRC/${SAVETOMODULENAME##*/}=rr aufs $SRC
   else 
      SRC=$CHSRC
   fi
   [ -d /memory/ovl/changes ] && SRC=/memory/ovl/changes
   # preparing excluded files list
   echo -e "/tmp/includedfiles\n/tmp/excludedfiles" > /tmp/excludedfiles
   if [ -f "$FILELIST" ] ;then
      grep ^! "$FILELIST" | cut -c 2- >/tmp/savelist.black
      grep -v '^[!#]' "$FILELIST" | grep . >/tmp/savelist.white
      grep -q . /tmp/savelist.white || echo '.' > /tmp/savelist.white
      find $SRC/ -type l >/tmp/allfiles
      find $SRC/ -type f >>/tmp/allfiles
      sed -i 's|'$SRC'||' /tmp/allfiles
      grep -f /tmp/savelist.white /tmp/allfiles | grep -vf /tmp/savelist.black > /tmp/includedfiles
      grep -q . /tmp/savelist.black && grep -f /tmp/savelist.black /tmp/allfiles >> /tmp/excludedfiles
      grep -vf /tmp/savelist.white /tmp/allfiles >> /tmp/excludedfiles
      find $SRC/ -type d | sed 's|'$SRC'||' | while read a ;do
          grep -q "^$a" /tmp/includedfiles && continue
          echo "$a" | grep -vf /tmp/savelist.black | grep -qf /tmp/savelist.white && continue
          echo "$a" >> /tmp/excludedfiles
      done
      rm -f /tmp/savelist* /tmp/allfiles /tmp/includedfiles
   fi
   sed -i 's|^/||' /tmp/excludedfiles
   # backuping old module
   [ -f "$SAVETOMODULENAME" ] && mv -f "$SAVETOMODULENAME" "${SAVETOMODULENAME}.bak"
   # making module
   [ "$SAVETONOXZM" = "yes" ] && SAVETOMODULEOPTIONS="-noI -noD -noF"
   create_module $SRC "$SAVETOMODULENAME" -ef /tmp/excludedfiles $SAVETOMODULEOPTIONS
   echo
   [ "$SRC" = "$CHSRC" ] || umount "$SRC"
fi
