#!/bin/bash

# Rebd Command-line to rebuild deb packages.

YLL='\033[1;33m'
LGR='\033[1;37m'
GRY='\033[1;30m'
GRN='\033[0;32m'
ORN='\033[0;33m'
RED='\033[1;31m'
CYN='\033[0;36m'
BLU='\033[1;36m'
NC='\033[0m'
if [[ -z ${@:1} || $1 == --help ]]; then
echo -e "Rebuild installed deb packages.

usage : rebd [opt] <package> <..> <..> [des]

opt.
-q : quiet mode
-exs : exclude Jailbreak system package.

create new directory if it doesn't exist [des]
without [des] will be saved in ${LGR}/var/mobile/Documents/rebd${NC}"
exit 0
fi
des=/var/mobile/Documents/rebd
dir=/var/tmp/rebd/DEBIAN
reb=/var/tmp/rebd
temp=/var/tmp/tempreb
pec=$(uname -p)

if [[ ! "${@: -1}" == *[/]* ]]; then
	mkdir $des > /dev/null 2>&1
fi

rm -r $temp > /dev/null 2>&1
rm -r $reb > /dev/null 2>&1
mkdir -p $dir > /dev/null 2>&1
mkdir $temp > /dev/null 2>&1

while [ $# -gt 0 ]; do
	case "$1" in
		-q) if [ $2 == -exs ]; then
					if [[ "${@: -1}" == *[/]* ]]; then
						echo "${@:3}" | tr " " "\n" | sed '$d' > /var/tmp/list.txt
					else
						echo "${@:3}" | tr " " "\n" > /var/tmp/list.txt
					fi
				else
					if [[ "${@: -1}" == *[/]* ]]; then
						echo "${@:2}" | tr " " "\n" | sed '$d' > /var/tmp/list.txt
					else
						echo "${@:2}" | tr " " "\n" > /var/tmp/list.txt
					fi
				fi
		;;
		-exs) if [ $2 == -q ]; then
						if [[ "${@: -1}" == *[/]* ]]; then
							echo "${@:3}" | tr " " "\n" | sed '$d' > /var/tmp/list.txt
						else
							echo "${@:3}" | tr " " "\n" > /var/tmp/list.txt
						fi
					else
						if [[ "${@: -1}" == *[/]* ]]; then
							echo "${@:2}" | tr " " "\n" | sed '$d' > /var/tmp/list.txt
						else
							echo "${@:2}" | tr " " "\n" > /var/tmp/list.txt
						fi
					fi
		;;
		*) if [[ "${@: -1}" == *[/]* ]]; then
				echo "${@:1}" | tr " " "\n" | sed '$d' > /var/tmp/list.txt
			else
				echo "${@:1}" | tr " " "\n" > /var/tmp/list.txt
			fi
		;;
	esac
break;
done

dyn=/Library/MobileSubstrate/DynamicLibraries
bck=/var/tmp/DynamicLibraries
tmp=/Library/MobileSubstrate/temp
if [ $pec == arm ]; then
	cp -r $dyn $bck
	readlink $dyn > /dev/null 2>&1;
	if [ $? -eq 0 ]; then
		mv $dyn $tmp
		cp -r `readlink $tmp` $dyn
	fi
fi

batch=/var/tmp/list.txt
while read -r lines; 
do
mkdir -p $dir

while true; do
if [[ $1 == -exs || $2 == -exs ]]; then
nm=$(dpkg-query -s $lines | grep Maintainer)
	if [[ $nm == *"Sam Bingner"* ]]; then
echo -e "${LGR}rebd: ${YLL}ignore: ${ORN}$lines ${GRY}IS A SYSTEM PACKAGE.${NC}"
	break;
	elif [[ $nm == *"Jay Freeman"* ]]; then
echo -e "${LGR}rebd: ${YLL}ignore: ${ORN}$lines ${GRY}IS A SYSTEM PACKAGE.${NC}"
	break;
	elif [[ $nm == *"Hayden Seay"* ]]; then
echo -e "${LGR}rebd: ${YLL}ignore: ${ORN}$lines ${GRY}IS A SYSTEM PACKAGE.${NC}"
	break;
	fi
fi
#DEBIAN
dpkg-query -c $lines 2> /dev/null | xargs cp -t $dir 2> /dev/null
	if [[ ! ${?} -eq 0 ]]; then
echo -e "${LGR}rebd:${NC} ${RED}error:${NC} Package is not installed."
		rm /var/tmp/list.txt 2> /dev/null
		rm -r $reb  2> /dev/null
		rm -r $temp 2> /dev/null
		exit
	fi
	for file in $dir/*; do
	l=$(echo "$file" | awk -F. 'NF>1{print $NF}')
		mv "$file" $dir/$l 2> /dev/null
	done
chmod +rwx $dir/*
date=$(date +%R_%x)
dpkg-query -s $lines | sed '/Status: /d' | sed -r '/.{7,}/!d' | sed '/Rebuild/,+1d' > $dir/control && echo -e " .
                                          Rebuild by rebd.
                                        ( $date )" | tee -a $dir/control > /dev/null 2>&1

#Library,usr,Applications,etc
echo -e "${CYN}Build Package${NC} for ${GRY}\e[3m$lines\e[0m${NC}"

sleep 0.6;


if [ $1 == -q ]; then

echo -e "${LGR}rebd:${NC} ${BLU}repack:${NC} build directory structure..."

build()
{
	app=$(dpkg-query -L $lines | grep -E "Applications|.app" | awk -F/ 'NF==3')
	rsync -aR $app $reb > /dev/null 2>&1
}
	build
	buildpid=$!
	wait $buildpid
	
	files=$(dpkg-query -L $lines | sed '/\.app\?/d' | sed '/diverts\|^\/usr$\|\/Library$\|\/\.$\|\/Applications$\|\/private$\|\/var$/d' | sed 's/\ /?/g' | tr '\n' ' ')

builds()
{
	rsync -dlRq $files $reb > /dev/null 2>&1 || :
}
	if [ $lines == com.r333d.eqe ]; then
		:
	else
		builds
		buildpids=$!
		wait $buildpids
	fi

else
	dpkg-query -L $lines | sed '/\.app\?/d' | sed '1d' | while read line; do
		if [ -d "$line" ]; then
echo -e "${LGR}rebd:${NC} ${YLL}ignore:${NC} "$line" ${GRY}IS A FOLDER.${NC}"
		fi
	done

echo -e "${LGR}rebd:${NC} ${BLU}repack:${NC} build directory structure..."
build()
{
	app=$(dpkg-query -L $lines | grep -E "Applications|.app" | awk -F/ 'NF==3')
	rsync -aR $app $reb 2> /dev/null
}
	build
	buildpid=$!
	wait $buildpid
	
	files=$(dpkg-query -L $lines | sed '/\.app\?/d' | sed '/diverts\|^\/usr$\|\/Library$\|\/\.$\|\/Applications$\|\/private$\|\/var$/d' | sed 's/\ /?/g' | tr '\n' ' ')

builds()
{
	rsync -dlRq $files $reb 2>/dev/null || :
}
	if [ $lines == com.r333d.eqe ]; then
		:
	else
		builds
		buildpids=$!
		wait $buildpids
	fi
fi

#Misc
arm()
{
pec=$(uname -p)
if [ $pec == arm ]; then
	while true; do
	src=/var/mobile/Library/Caches/com.saurik.Cydia/sources.list
	echo "$rep" >> $src
	apt-get update > /dev/null 2>&1;
	curl -Ik https://google.com > /dev/null 2>&1;
	num=$(echo $?)
	if [ ! $num -eq 0 ]; then
echo -e "${LGR}rebd:${NC} No Network, fail:$num"
	break;
	fi
	dpkg -r --force-all $pckg > /dev/null 2>&1;
	rm /var/cache/apt/archives/*.deb > /dev/null 2>&1;
	apt-get --allow-unauthenticated -d install $pckg > /dev/null 2>&1;
	apt-get --allow-unauthenticated install $pckg -y > /dev/null 2>&1;
	mv /var/cache/apt/archives/*.deb $reb/$pckg.deb
	break;
	done
fi
}

if [ $lines == git ]; then
	mkdir -p $reb/usr/share/git-core/templates/branches
	
elif [ $lines == cydia.com.ipc.crackerxi ]; then
path=/Library/MobileSubstrate/DynamicLibraries
	cp $path/crackerxihook.dylib $reb/Applications/crackerxi.app
	cp $path/crackerxihook.plist $reb/Applications/crackerxi.app
	cp /var/mobile/Library/Preferences/CrackerXIPrefs.plist $reb/Applications/crackerxi.app

elif [ $lines == com.r333d.eqe ]; then
mkdir /var/tmp/misc
misc=/var/tmp/misc
file=$(dpkg-query -L com.r333d.eqe | sed '/\
.app\?/d' | sed '/diverts\|^\/usr$\|\/Library$\|\/\.$\|\/Applications$\|\/private$\|\/var$/d' | sed 's/\ /?/g' | sed 's/(/\\(/g; s/)/\\)/g' > $misc/a.txt)
$file && split -n l/2 $misc/a.txt $misc/temp
a=$(cat $misc/tempaa)
b=$(cat $misc/tempab)
rsync -dlRq $a $reb
rsync -dlRq $b $reb
rm -r $misc

elif [ $lines == flex3beta ]; then
	if [ $pec == arm ]; then
		:
	else
		mv $reb/Applications/Flex.app $reb/var/mobile/Library/Flex3 2>/dev/null
		mkdir $reb/Applications/Flex.app 2>/dev/null
	fi

elif [ $lines == net.angelxwind.appsyncunified ]; then
	pckg=net.angelxwind.appsyncunified
	rep="deb https://cydia.akemi.ai ./"
	mv $dir/control $temp 2>/dev/null
	rm -r $reb/* 2>/dev/null
  arm
  curl -o $reb/$pckg.deb https://cydia.akemi.ai/debs/nodelete-net.angelxwind.appsyncunified.deb > /dev/null 2>&1
  num=$(echo $?)
  if [ $pec == arm ]; then
  	:
  else
  while true; do
  	if [ ! $num -eq 0 ]; then
echo -e "${LGR}rebd:${NC} No Network, fail:$num"
		break;
		fi
	break;
	done
	fi
  dpkg-deb -R $reb/$pckg.deb $reb 2>/dev/null
  mv $temp/control $dir 2>/dev/null
  rm $reb/$pckg.deb 2>/dev/null
  
elif [ $lines == com.exile90.icleanerpro ]; then
	pckg=com.exile90.icleanerpro
	rep="deb https://cydia.akemi.ai ./"
	mv $dir/control $temp 2>/dev/null
	rm -r $reb/* 2>/dev/null
	arm
	curl -o $reb/$pckg.deb https://ib-soft.net/cydia/beta/debs/com.exile90.icleanerpro_7.9.1_iphoneos-arm.deb > /dev/null 2>&1
	num=$(echo $?)
	if [ $pec == arm ]; then
		:
	else
	while true; do
		if [ ! $num -eq 0 ]; then
echo -e "${LGR}rebd:${NC} No Network, fail:$num"
		break;
		fi
	break;
	done
	fi
	dpkg-deb -R $reb/$pckg.deb $reb 2>/dev/null
	mv $temp/control $dir 2>/dev/null
	rm $reb/$pckg.deb 2>/dev/null
fi

#Builder
builder()
{
dpkg-deb -b -Zgzip $reb $temp/$lines.deb > /dev/null 2>&1;
}
while true; do
builder
num=$(echo $?)
	if [ ! $num -eq 0 ]; then
echo -e "${LGR}rebd: ${RED}error:${NC} rebuild failed:$num, files not found."
	break;
fi
	if [ -d "${@: -1}" ]; then
echo -e "${LGR}rebd:${NC} rebuild ${LGR}\e[3m$lines\e[0m${NC} into '"${@: -1}"'"
	elif [[ ! -d "${@: -1}" && "${@: -1}" == *[/]* ]]; then
		mkdir "${@: -1}"
echo -e "${LGR}rebd:${NC} rebuild ${LGR}\e[3m$lines\e[0m${NC} into '"${@: -1}"'"
	else
echo -e "${LGR}rebd:${NC} rebuild ${LGR}\e[3m$lines\e[0m${NC} into '$des'"
	fi
break;
done
break;
done
rm -r $reb
done < $batch

if [ $pec == arm ]; then
	rm -r $dyn 2>/dev/null
	rm -r $tmp 2>/dev/null
	mv $bck $dyn 2>/dev/null
fi

#FINISHING
cn=$(ls $temp/*.deb 2> /dev/null | wc -l)
echo -e "${GRN}$cn Package Completed.${NC}"
if [[ ! "${@: -1}" == *[/]* ]]; then
	mv $temp/*.deb $des > /dev/null 2>&1
else
	mv $temp/*.deb "${@: -1}" > /dev/null 2>&1
fi
rm -r $temp 2> /dev/null
rm -r $reb 2> /dev/null
rm /var/tmp/list.txt 2> /dev/null
exit 0


# Moose <gathering011@gmail.com>