#! /bin/bash

YLL='\033[0;33m'
LGR='\033[1;37m'
GRY='\033[1;30m'
GRN='\033[0;32m'
LGRN='\033[1;32m'
RED='\033[0;31m'
LRED='\033[1;31m'
CYN='\033[0;36m'
BLU='\033[1;36m'
NC='\033[0m'

if [[ -z ${@:1} ]]; then
echo "------------------------------------------------------------"
echo "“ipreb, rebuild installed Applications”"

echo "usage : ipreb [options] <bundle id>"

echo "opt."
echo "build   : build ipa file and backup its data"
echo "list    : show list of installed applications"
echo "res     : install app and restore its data"
echo "------------------------------------------------------------"
exit 1
fi


rm -r /var/tmp/bak > /dev/null 2>&1
mkdir /var/mobile/ipreb > /dev/null 2>&1

path=/var/containers/Bundle/Application
dat=/var/mobile/Containers/Data/Application
mrks=.com.apple.mobile_container_manager.metadata
list=/var/tmp/l.txt
mrk=/var/tmp/mrk.txt
chk=/var/tmp/chk.txt
dpath=/var/tmp/dat.txt
touch /var/tmp/mrk.txt

rm $list > /dev/null 2>&1
rm $chk > /dev/null 2>&1
rm $mrk > /dev/null 2>&1
rm /var/tmp/list.txt > /dev/null 2>&1

#restore

if [ $1 == res ]; then

Q=$(echo -e ${RED}QUIT${NC})

ls /var/mobile/ipreb > /var/tmp/res.txt
resto=/var/tmp/res.txt
cpath=/var/mobile/Containers/Shared/AppGroup/
jbr=$(ls -a $cpath | grep jbroot)
fle=/var/mobile/ipreb

chck()
{
if [ $count == 0 ]; then
echo "ipreb: ipa file not found, please backup first"
elif [ $countd == 0 ]; then
echo "ipreb: back up file not found, please backup first"
exit
fi
}

options=($(cat $resto))
	PS3="Please select ipa to restore: "

		select opt in "${options[@]}" "$Q"; do

			if (( REPLY == 1 + ${#options[@]} )) 2>/dev/null; then
				rm $resto
				exit

			elif (( REPLY > 0 && REPLY <= ${#options[@]} )) 2>/dev/null; then

count=$(ls /$fle/$opt/*.ipa 2>/dev/null | wc -l)
countd=$(ls /$fle/$opt/*.dat 2>/dev/null | wc -l)

chck

echo -e "${LGR}ipreb:${NC} Installing ${LGR}$opt${NC}"

cd $cpath/$jbr$fle/$opt
appinst ./*.ipa > /dev/null 2>&1

sleep 1;
  			echo "      ..."
 			sleep 1;
  			echo "   ..."
  			sleep 1;
         echo "..."
  			sleep 1;

echo -e "${LGR}ipreb:${NC} Restoring data ${LGR}$opt${NC}"

pth=/var/mobile/Containers/Data/Application
srt=$(ls -t $pth | awk 'NR==1')
data=$(find $fle/$opt -type f -name "*.dat*")

cp $data /var/tmp/bak.zip 2>/dev/null

if [ $? -eq 0 ]; then
    :
  else
cp $data /var/tmp/bak.zip 2>/dev/null
fi

cd /var/tmp

unzip -oq bak.zip && cp -r /var/tmp/bak/{.,}* $pth/$srt

         echo "..."
 			sleep 1;
  			echo "   ..."
  			sleep 1;
         echo "      ..."
  			sleep 1;

rm /var/tmp/bak.zip 2>/dev/null
rm -r /var/tmp/bak 2>/dev/null
rm $resto
fi
break
done
echo -e "${LGR}ipreb:${NC} done! ${LGR}$opt${NC} installed"
exit
fi

echo -e "${LGR}ipreb:${NC} Making list..."

#making list

cd $path

find . -maxdepth 2 -type d -iname "*.app*" | awk -F'/' '{print $NF, $0}' | sort -f | cut -f3- -d '.' > /var/tmp/l.txt

lists=$(cat $list | cut -d'/' -f2)

for l in $lists
do
defaults read $path/$l/$mrks MCMMetadataIdentifier | awk '{print "["$0"]"}' | sed -e 's/^/---> /'>> $mrk
done

paste -d ' ' $list $mrk > /var/tmp/list.txt

#list installed apps

if [ $1 == list ]; then
#checking file

cat $list | awk -F'/' '{print $3}' | awk -F'.' '{print $1}' > /var/tmp/chk.txt

echo -e "${LGR}Installed Applications:${NC}"
cat /var/tmp/list.txt | awk '{ gsub(".app", "", $1); print }' | awk -F'/' '{print $3}' | awk '{print NR ") " $s}'

rm $list
rm $chk
rm $mrk
rm /var/tmp/list.txt
exit
fi

#builder

cat /var/tmp/list.txt | awk '{print $NF}' > /var/tmp/chk.txt
chk=/var/tmp/chk.txt

if grep -oq $2 $chk; then

if [ $1 == build ]; then

if [ -z $3 ]; then
:
else
nm=$(cat $list | grep $2)
cp -r $path/"$nm" /var/tmp

cd /var/tmp

nme=$(echo $nm | awk -F'/' '{print $NF}'| cut -d '.' -f1)

mkdir /var/tmp/Payload && mv /var/tmp/"$nme".app /var/tmp/Payload

echo -e "${LGR}ipreb:${NC} rebuild ipa..."

zip -r /var/tmp/"$nme".zip Payload > /dev/null 2>&1

ver=$(cat ./Payload/"$nme".app/Info.plist | awk '/CFBundleShortVersionString/{getline; print}' | awk -F'>' '{print $2}' | awk -F'<' '{print $1}')

mv "$nme".zip /var/mobile/"$nme"_$ver.ipa

rm -dr /var/tmp/Payload 2>/dev/null

         sleep 1;
  			echo "..."
  			sleep 1;
  			echo "   ..."
  			sleep 1;
         echo "      ..."
  			sleep 1;

echo -e "${LGR}ipreb:${NC} done! into ${LGR}/var/mobile${NC}"
exit
fi

cd $path

app=$(cat /var/tmp/list.txt | grep $2 | cut -d/ -f3 | awk '{print $1}' | sed 's/.app//g')
nm=$(cat /var/tmp/list.txt | grep $2 | awk '{print $1}')
ver=$(defaults read $path/$nm/Info CFBundleShortVersionString)
name=$(defaults read $path/$nm/Info CFBundleName)
cp -r $path/$nm /var/tmp

mkdir /var/tmp/Payload && mv /var/tmp/$name.app /var/tmp/Payload

cd /var/tmp

echo -e "${LGR}ipreb:${NC} rebuild ipa for ${LGR}$app${NC}"

zip -r /var/tmp/$name.zip Payload > /dev/null 2>&1
mkdir /var/mobile/ipreb/$name > /dev/null 2>&1
mv $name.zip /var/mobile/ipreb/$name/$name\_$ver.ipa

  			sleep 1;
  			echo "..."
  			sleep 1;
  			echo "   ..."
  			sleep 1;
         echo "      ..."
  			sleep 1;
fi

else

echo -e "${LGR}ipreb:${NC} Please type correctly."
exit

fi

#data backup

echo -e "${LGR}ipreb:${NC} back up data for ${LGR}$app${NC}"

cd $dat

find . -maxdepth 2 -type f -name "*.apple.mobile_container_manager.metadata.plist*" | cut -c2- | sed 's/.plist//g' > /var/tmp/dat.txt

while read -r lines;
do

bun=$(defaults read $dat$lines MCMMetadataIdentifier)

if [ $2 == $bun ]; then

fin=$(echo $dat$lines | cut -d. -f1)

mkdir /var/tmp/bak && cp -r $fin. /var/tmp/bak

cd /var/tmp

zip -y -r /var/tmp/$2.zip bak > /dev/null 2>&1 && mv /var/tmp/$2.zip /var/mobile/ipreb/$name/$2.dat

rm -r /var/tmp/bak 2>/dev/null
fi
done < $dpath
 

        sleep 1;
        echo "      ..."		
  			sleep 1;
  			echo "   ..."
  			sleep 1;
        echo "..."
  			sleep 1;

rm /var/tmp/dat.txt 2>/dev/null

echo -e "${LGR}ipreb:${NC} done! into ${LGR}/var/mobile/ipreb${NC}"

rm -dr /var/tmp/Payload 2>/dev/null
rm $list
rm $chk
rm $mrk
rm /var/tmp/list.txt
exit 0