#!/bin/sh
ver=230403 #sfs
HLP(){
echo "Создание индексов apt и pacman модуля.pfs. Дает возможность удалить модуль,
установленный распаковкой (unsquashfs -dest / модуль.pfs) модуля.pfs в корень FULL дистрибутива 
его стандартным пакетным менеджером (apt purge или pacman -R)
Для apt нужно после распаковки дополнительно нужно использовать dpkg-fix
    Usage: $0 [-1] [-l] [-a] [-p] dir 
	dir : директория с распакованным составным модулем.pfs , т.е. dir/mod1 dir/mod2 ...
	-1  : директория с распакованным одиночным  модулем.pfs. Можно не указывать - автоопределится
	-l  : показать устанновленные в систему такие модули. 
	    apt    - группа portable. 
	    pacman - группа mk-dp
	-a  : создать только apt индексы
	-p  : создать только pacman индексы
	-r  : удалить */var/lib/dpkg и */var/lib/pacman" && exit 1
}
    case "$1" in
	-r) rm=1 ; shift ;;
	-1) pfs1=1 && shift ;;
	-l) which pacman > /dev/null 2>&1 && pacman -Qg mk-dp |awk '{print $2}'
	    which apt    > /dev/null 2>&1 && dpkg-query -W -f='${Package} ${Version}\t${Section}\n' |grep -Ee "portable$"
	    exit
	    ;;
	-a) a0=1 ; echo "Only apt created" ; shift ;;
	-p) f0=1 ; echo "Only pacman created" ; shift ;;
	*)  [ ! -d "$1" ] && HLP ;;
    esac
mkdpkg=
m1="`ls -1 "$1" |grep -Ee '^etc$|^home$|^bin$|$sbin$|^usr$|^opt$|^var$'`" 
[ "$m1" ] && echo "Автоопределен одиночный модуль" && pfs1=1

RM(){
    if [ ! "`cat "$1"/var/lib/dpkg/_status/*.stt  2>/dev/null |grep -Ee '^Section: portable'`" ] ;then
	echo "	!!!: .../dpkg/_status/*.stt is not mk-dp generated"
    else rm -R "$1"/var/lib/dpkg && echo "	Removed: .../var/lib/dpkg"
    fi
    if [ ! "`cat "$1"/var/lib/pacman/local/*/desc 2>/dev/null |grep -1 -Ee '^%GROUPS%' |grep -Ee '^mk-dp$'`" ] ;then
	[ -d "$1"/var/lib/pacman ] && echo "	!!!: .../pacman/local/*/desc is not mk-dp generated" ||
	    echo "	!!!: ...no /var/lib/pacman"
    else rm -R "$1"/var/lib/pacman && echo "	Removed: .../var/lib/pacman"
    fi
}
if [ "$pfs1"  ] && [ "$rm" ] ;then
    RM "$1" ;     exit
fi
#if [ "$rm" ] ;then
#    r="`ls -d "$1"/*/var/lib/dpkg` `ls -d "$1"/*/var/lib/pacman`"
#    [ "$r" != " " ] && rm -R $r && printf "Removed :\n`echo $r |tr " " "\n"`\n"
#    exit
#    RM "$1" "/*"
#fi
F(){
#trim "$d" 2>/dev/null
mkdir -p "$dn"/var/lib/dpkg/info
#p="`echo "$d" |awk -F"-p-" '{print $1"-p"}'`"
#echo $p ;exit
p="`echo $p |sed 's/~/-/'g`"
find "$d" |sed 's#^'$d'##' |egrep -v '^/DEBIAN|^/var/lib/dpkg' |sort |egrep -v '^$' >"$dn"/var/lib/dpkg/info/$p$mkdpkg.list
#for m in `find "$d" -type f |sed 's/^'$d'//' |egrep -v '^/DEBIAN|^/var/lib/dpkg' |sort` ;do
find "$d" -type f |sed 's#^'$d'##' |egrep -v '^/DEBIAN|^/var/lib/dpkg' |sort| while read m ;do
    md5sum "$d$m" |sed 's# '$d'/##' >>"$dn"/var/lib/dpkg/info/$p$mkdpkg.md5sums
done

mkdir -p "$dn"/var/lib/dpkg/_status
echo "
Package: $p$mkdpkg
Status: install ok installed
Priority: optional
Section: portable
Installed-Size: `du -s "$d" |awk '{print $1}'`
Maintainer: LF
Architecture: all
Version: `date +%y.%m.%d-1`
Description: Portable soft v.$ver
" >>"$dn"/var/lib/dpkg/_status/$p$mkdpkg.stt
}
A(){
[ -d "$dn/var/lib/pacman/local/$p" ] && echo "ERROR: .../pacman/local/$p present" && return
    pv="`date "+%y.%m-%d"`"
    mkdir -p "$dn/var/lib/pacman/local/$p-$pv"
    size1="$(du -sk --apparent-size "$d")"
    size="$(( ${size1%%[^0-9]*} * 1024 ))"
echo "\
%NAME%
"$p"

%VERSION%
"$pv"

%BASE%
lf-mk-dp

%DESC%
LF mk-dp pseudo package v.$ver

%URL%
https://forum.puppyrus.org

%ARCH%
`uname -m`

%BUILDDATE%
`date "+%s"`

%INSTALLDATE%
`date "+%s"`

%PACKAGER%
mk-dp

%SIZE%
"$size"

%GROUPS%
mk-dp

" >"$dn/var/lib/pacman/local/$p-$pv/desc"
FL(){
source_dir="$(realpath "$1")/"
echo "%FILES%"
find "${source_dir}" ! -type d | sed "s:$source_dir::" |egrep -v '^.PKGINFO$|^.INSTALL$|^var/lib/pacman/local/' #> "${dest_dir}${PFSDIR}/mount/${pack_name}/pfs.files" &&
find "${source_dir}"   -type d | sed "s:$source_dir::" |awk '{print $0"/"}'  #|egrep -v '^/.wh..wh.|^'$PFSDIR'' #> "${dest_dir}${PFSDIR}/mount/${pack_name}/pfs.dirs.empty" &&
}
FL "$d" >"$dn/var/lib/pacman/local/$p-$pv/files"
}
FA(){
if [ ! "$f0" ] && [ "$f" = 0 ] ;then
    [ "`ls "$dn"/var/lib/dpkg/_status/*stt 2>/dev/null`" ] && echo "	!!!: .../dpkg/_status is not empty. Skip" && f=1 
    #[ -f "$dn"/var/lib/dpkg/status ] && echo "	Warning: "$dn"/var/lib/dpkg/status present. Skip" && f=1 
    [ -f "$dn"/var/lib/dpkg/status ] && { trim "$dn" 2>/dev/null ; dpkg-trim "$dn" ; f=1 ; }
fi
if [ ! "$a0" ] && [ "$a" = 0 ] ;then
    [ "`ls -1  "$dn"/var/lib/pacman/local/ 2>/dev/null`" ] && echo "	!!!: .../pacman/local/ is not empty. Skip" && a=1
fi
    [ $(($a + $f))  -lt 2 ] && trim "$d" 2>/dev/null
    [ ! "$a0" ] && [ "$a" = 0 ] && A
    [ ! "$f0" ] && [ "$f" = 0 ] && F 
}

if [ "$pfs1"  ] ;then
    f="0" ;a="0" 
    d="$1" ; dn="$d" ;  p="`basename "$d"`" ;FA
else #=dir
    dd="`find "$1" -maxdepth 1 -mindepth 1 -type d |sort`"
    [ "$dd" ] && ddir=1 || dd="`find "$1" -maxdepth 1 -mindepth 1 -type f |grep -E '.pfs$'`"
#    dn="$1/"zz-dpkg-"$(basename "`realpath "$1"`" .pfs)"
#    [ -d "$dn" ] && echo "ERROR: $dn present in $1" && exit 1
    for i in `echo $dd` ;do
	f="0" ;a="0" 
	echo $i
 if [ "$rm" ] ;then
    RM "$i"
 else
	#d2="$1/`basename "$i" .pfs`"
	#dn="$(basename "`realpath "$i"`" .pfs)"-dpkg
	#if  [ ! "$ddir" ] ;then 
	#    mkdir "$d2" && mount -o ro "$i" "$d2" || { echo "ERROR mount $d2" ; exit 1 ; }
	#fi
	d="$i"; dn="$i" ; p="`basename "$d"`" 
	if [ -f "$i/var/lib/dpkg/status" ] ;then
	    #mkdir -p "$dn"/var/lib/dpkg/_status
	    #cp "$d2/var/lib/dpkg/status" "$dn"/var/lib/dpkg/_status/"`basename "$i"`"
	    #cat "$d2/var/lib/dpkg/status"  >>"$dn"/var/lib/dpkg/status1
	    trim "$i" 2>/dev/null ; dpkg-trim "$i"
	elif [ "`ls "$i"/var/lib/dpkg/_status/*stt 2>/dev/null`" ] ;then
	    echo "	!!!: .../var/lib/dpkg/_status/*stt present. Skip"
	else  a2="$a" ;a=1 ;FA ;a="$a2"
	fi
	f2="$f" ;f=1; FA; f="$f2"
	#[ ! "$ddir" ] && umount "$d2" && rmdir "$d2"
 fi
    done
fi
