#!/bin/bash
. /etc/mpsd.conf
. /root/bin/fonks.sh
versiyon="0.1"
paketdepo="/depo/paketler/"
sunucu="192.168.3.193:8000/paketdepo/"
git_sunucu="https://github.com/milisarge/malfs-milis"
ikaynak=""
betikad=${0##*/}
kurulum_onay="evet"
dokunulmaz="/etc/dokunulmaz"
talimatname_dizin="/root/talimatname"
kokdizin="/"
VT="/var/lib/pkg/DB"


icerik_ekle(){
	paketad=`echo "$1" | cut -d'#' -f1`	
	paketad=`basename $paketad`
	ryaz 34 $paketad" paketi kuruluyor."
	tar -C /tmp --extract --file=$1 .PRE 1 2> /tmp/$paketad_pre.log
	#kos-kur kontrolu
	if [ -f /tmp/.PRE ];then
		bash  /tmp/.PRE
		rm  /tmp/.PRE
	fi
	mkdir -p tmpk.$paketad
	tar xf $1 -C tmpk.$paketad  &&
	mkdir -p /var/lib/pkg/DB/"$paketad" &&
	cp -avf tmpk.$paketad/* $kokdizin > tmpk.$paketad/kurulan &&
	cat tmpk.$paketad/kurulan | cut -d '>' -f2 > /var/lib/pkg/DB/"$paketad"/kurulan
	#mv  tmpk.$paketad/.MTREE /var/lib/pkg/DB/"$paketad"/files &&
	mv  tmpk.$paketad/.META /var/lib/pkg/DB/"$paketad"/META &&
	
	#kur-kos calistirilmasi
	if [ -f tmpk.$paketad/.POST ];then
		bash  tmpk.$paketad/.POST
		rm  tmpk.$paketad/.POST
	fi
	#if [ -f $kokdizin.PRE ];then
	#	rm  $kokdizin.PRE
	#fi
	#if [ -f $kokdizin/.okubeni ];then
	#	rm  $kokdizin/.okubeni
	#fi
	#if [ -f $kokdizin/.README ];then
	#	rm  $kokdizin/.README
	#fi
	rm -r tmpk.$paketad
	if [ -f /etc/ld.so.conf ];then
		ldconfig
	fi
	ryaz 34 $paketad" paketi kuruldu."
}

paket_siles(){
	local paket kkont sil_onay
	if [ -f $dokunulmaz ];then
		kkont=`kurulu_kontrol "$1"`
		if [ "$kkont" = "kurulu" ];then
			paket="$1"
			ryaz 34 $paket" paketi siliniyor."
			#while IFS='' read -r line || [[ -n "$line" ]]; do
			while read -r dosya
			do
				touch /tmp/$paket.sil
				if [[ $(grep -c $dosya $dokunulmaz) -eq 0 ]]; then
					echo "/$dosya" >> /tmp/$paket.sil 
					#guvenlik amacli simdilik kapali
					#rm -r -f /$dosya
				fi
			done < /var/lib/pkg/DB/"$paket"/files
			while true; do
				read -p "$1 paketi kaldırılsın mı?" eh
				case $eh in
					[Ee]* ) sil_onay="e"; break;;
					[Hh]* ) break;;
					* ) echo "e veya h";;
				esac
			done
			if [ "$sil_onay" = "e" ];then
				xargs rm -r -f < /tmp/$paket.sil &&
				rm -r -f /var/lib/pkg/DB/"$paket" &&
				ryaz 34 $paket" paketi silindi."
			fi
			rm -f /tmp/$paket.sil
		else
			ryaz 31 "paket zaten kurulu değil!"
		fi
	else
		echo "kritik mesaj:$dokunulmaz dosyası yok."
		#tamirat
		cp /root/ayarlar/dokunulmaz /etc/
		echo "dokunulmazlık tamiri yapıldı.,komutu yineleyiniz."
	fi

}

paket_sil(){
	local paket kkont sil_onay
	paket="$1"
	if [ -f "/var/lib/pkg/DB/$paket/kurulan" ];then
		kkont=`kurulu_kontrol "$1"`
		if [ "$kkont" = "kurulu" ];then
			#
			#while IFS='' read -r line || [[ -n "$line" ]]; do
			
			cat /var/lib/pkg/DB/$paket/kurulan | cut -d '>' -f2 > /tmp/$paket.sil
			
			while true; do
				ryaz 34 $paket" paketi kaldırılsın mı?";read -p "e veya h-> " eh
				case $eh in
					[Ee]* ) sil_onay="e"; break;;
					[Hh]* ) break;;
					* ) echo "e veya h";;
				esac
			done
			if [ "$sil_onay" = "e" ];then
				xargs rm -r -f < /tmp/$paket.sil &&
				rm -r -f /var/lib/pkg/DB/"$paket" &&
				ryaz 34 $paket" paketi silindi."
			fi
			rm -f /tmp/$paket.sil
		else
			ryaz 31 "paket zaten kurulu değil!"
		fi
	else
		echo "kritik mesaj:kurulanlar dosyası yok."
	fi

}

paket_bilgi(){
	local paket kkont
	kkont=`kurulu_kontrol "$1"`
	if [ "$kkont" = "kurulu" ];then
		paket="$1"
		cat /var/lib/pkg/DB/"$paket"/META
	else
		echo "paket kurulu değil!"
	fi

}

derleme_listyap(){
	bagimlist=`bagimlilar "$1"`
	for bagim in $bagimlist;do
		if [ "`cat derleme.liste | grep $bagim`" != "$bagim" ];then
			derleme_listyap "$bagim"
		fi
	done
	#if [ "`cat derleme.liste | grep $1`" != "$1" ];then
	#	echo "derleme.liste yazılıyor:" "$1"
	#	echo "$1" >> derleme.liste 
	#fi
	if  ! grep -Fxq "$1" derleme.liste
	then
	#	echo "pas"
	#else
		ana="`find $talimatname_dizin -name $1`"
		echo ${ana#"$talimatname_dizin"}
		#sadece genel bagimliliklar derlenecek
		echo "$1" >> derleme.liste 
		if [ -d "$talimatname_dizin/genel/$1" ];then
			echo "$1" >> genel.derleme.liste 
		fi
	fi
} 

derleme_listbilgi(){
	ryaz 34 "yapim asamasında"
}

paket_derle_oto(){
	for dpkt in `cat $1`;do
		echo $dpkt "derleniyor...."
		paket_derle $dpkt
	done
}
#otomatik derle kontrollu kur
paket_derle_oto2(){
	mps -dly "$1" > /dev/null && mps -odk genel.derleme.liste
}

paket_kur_oto(){
	local kpkt pkt
	for kpkt in `cat $1`;do
		for pkt in `ls $kpkt* | cut -d'#' -f1`;do
			mps -k "$pkt#"*
		done
	done
}
      
paket_derle(){
	#eski derleme kalıntılarını temizle
	rm -r tmp.*
	kaynakdizin_kontrol
	local konum derleme_onay eh bagimd
	derleme_onay="h"
	konum="`find "$talimatname_dizin" -name $1`"
	if [ -d "$konum" ];then
		mkdir -p tmp."$1" 
		cp -a $konum/* tmp."$1"/
		cd tmp."$1"
		if [ "`kurulu_kontrol "$1"`" = "kurulu" ] && [ "$zorla_derle" = "yok" ];then
			derleme_onay="h"
		else
			echo "-----"
			derleme_onay="e"
		fi 
		if [ "$derleme_onay" = "e" ];then
			ryaz 33 "$1" "derleniyor...."
			#mpsd -d > /dev/null
			#mpsd -d
			echo "------------------------"
			mpsd -d 2>&1|tee /tmp/"$1".log
			if ( grep "^=======>" /tmp/"$1".log| tail -1 |grep "ERROR"  > /dev/null);then
				echo "derleme sisteminde hata oluştu -----> " /tmp/"$1".log
				exit 1
			fi
			if [ "$kurulum_onay" = "evet" ];then
				for kpkt in `ls $1* | cut -d'#' -f1`;do
					mps -k "$kpkt#"*
				done	
			fi
			mv *.mps.lz ../
		else
			ryaz 32 "paket zaten kurulu,yine de derlemek için:
			mps -zd $1"
		fi 
		cd ..
		rm -r tmp."$1"
	else
		ryaz 31 "talimat dosyası bulunamadı."
	fi

}


bagimlilar(){
	local bagimd konum
	konum="`find "$talimatname_dizin" -name $1`"
	bagimd=`cat $konum/talimat | grep "Depends on" | cut -d':' -f2`
	if [ -n "$bagimd" ]; then
		bagimd=`echo "$bagimd" | sed 's/,/ /g'`
		#sıralı gösterme
		echo `echo "$bagimd" | sed 's/,/ /g'`
	fi
}

bagimli_bilgi(){
	local bagimd konum bag
	konum="`find "$talimatname_dizin" -name $1`"
	bagimd=`cat $konum/talimat | grep "Depends" | cut -d':' -f2`
	if [ -n "$bagimd" ]; then
		bagimd=`echo "$bagimd" | sed 's/,/ /g'`
		#sıralı gösterme
		#echo `echo "$bagimd" | sed 's/,/ /g'`
		#kurulu kontrollu gosterim
		for bag in $bagimd;do
			echo $bag "`kurulu_kontrol $bag`"
		done
	fi
	echo "$1" "`kurulu_kontrol $1`"
	
}

kurulu_kontrol(){
	if [ -d "/var/lib/pkg/DB/$1" ];then
		echo "kurulu"
		exit 1
	fi
	echo "degil"
}

kaynakdizin_kontrol(){
	if [ ! -d $DERLEME_KAYNAKDIZIN ];then
		mkdir $DERLEME_KAYNAKDIZIN
	fi
}

git_guncelle() {
	kaynakdizin_kontrol
	cd $DERLEME_KAYNAKDIZIN
	#git sunucudan guncelleme
	ryaz 33 "git sunucudan güncelleme çekiliyor."
	if [ ! -d milis.git ];then
		git clone $git_sunucu milis.git
	else
		cd milis.git
		git pull
	fi
	ryaz 33 "yerele eşitleniyor."
	rsync -a $DERLEME_KAYNAKDIZIN/milis.git/talimatname/ $talimatname_dizin
	rsync -a $DERLEME_KAYNAKDIZIN/milis.git/bin/ `dirname $talimatname_dizin`/bin
}

paketvt_guncelle(){
	wget -q --spider "$sunucu""paket.vt"
	#if wget -P /tmp -q "$sunucu""paket.vt" > /dev/null; then
	if [ $? -eq 0 ]; then	
		ryaz 32 "paket veritabanı guncellenıyor." "$paketdepo""paket.vt"
		if [ -f "$paketdepo""paket.vt" ];then
			mv "$paketdepo""paket.vt" "$paketdepo""paket.vt.eski"
		fi
		wget -P "$paketdepo" "$sunucu""paket.vt"
		#rm /tmp/paket.vt*
		exit 1
	fi
	ryaz 31 "paket veritabanı guncelleme olumsuz."
}

talimat_bilgi(){
	local konum HEAD
	konum="`find "$talimatname_dizin" -name $1`"
	HEAD=`grep -B 12 "build()" $konum/talimat`
	echo $HEAD
}

sistem_kontrol(){
	paketvt_kontrol
	sunucu_kontrol
}

sunucu_kontrol(){
	wget -q --spider $sunucu
	if [ $? -eq 0 ]; then
		ryaz 32 "paket sunucu aktif"
	else
		ryaz 31 "sunucu erişim dışı"
		exit 1
	fi
}	

paketvt_kontrol(){
	mkdir -p /depo/paketler
	if [ ! -f /depo/paketler/paket.vt ];then
		touch /depo/paketler/paket.vt
	fi
}

yardim(){
 echo "yardim"
}


ayarlar() {
	
	while [ "$1" ]; do
		case $1 in
			-i|--indir)
				ikaynak="ag" 
				kurulum_onay="olumsuz";;
			-ik|--inku)
				ikaynak="ag" ;;
			-k|--yrku)
				ikaynak="yerel" ;;
			-sil|--pksl)
				paket_siles "$2" ;;
			-s|--pksil)
				paket_sil "$2" ;;
			-d|--pkde)
				zorla_derle="yok"
				kurulum_onay="olumsuz"
				paket_derle "$2" ;;
			-zd|--pkzde)
				zorla_derle="evet"
				kurulum_onay="olumsuz"
				paket_derle "$2" ;;
			-dk|--pkdk)
				paket_derle "$2" ;;	
			-odk|--pkodk)
				paket_derle_oto "$2" ;;	
			-odkk|--pkodk2)
				paket_derle_oto2 "$2" ;;	
			-ok|--pkok)
				paket_kur_oto "$2" ;;	
			-kl|--kurulu-liste)
				ls $VT ;;	
			-dly|--drly)
				if [ -f derleme.liste ];then
					mv derleme.liste derleme.liste.eski
				fi
				if [ -f genel.derleme.liste ];then
					mv genel.derleme.liste genel.derleme.liste.eski
				fi
				touch derleme.liste 
				touch genel.derleme.liste 
				derleme_listyap "$2" ;;	
			-dlb|--drlb)
				derleme_listbilgi "$2";;	
			-b|--pkbl)
				paket_bilgi "$2" ;;
			-bb|--pkbb)
				bagimli_bilgi "$2" | column -t;;
			-tb|--talb)
				talimat_bilgi "$2" | column -t;;
			-Ggit|--gitgun)
				git_guncelle ;;
			-G|--pvtg)
				paketvt_guncelle ;;
			-g|--pkgu)
				if [ ! "$2" ]; then
					ryaz 31 "paket ismi eksik"
					exit 1
				fi
				paket_guncelle "$2";;
			-kk|--kurulu-kontrol)
				if [ ! "$2" ]; then
					ryaz 31 "paket ismi eksik"
					exit 1
				fi
				ryaz 31 `kurulu_kontrol "$2"`;;
			-suko)
				sunucu_kontrol ;;
			-cf|--config-file)
				if [ ! "$2" ]; then
					echo "ayardosyası gerek $1"
					exit 1
				fi
				ayar_dosyasi="$2"
				shift ;;
			-v)
				ryaz 33 "$betikad $versiyon"
				exit 0 ;;
			-h|--help)
				yardim
				exit 0 ;;
			
		esac
		shift
	done
}
ana(){
ayarlar "$@"

if [ "$ikaynak" = "ag" ]; then
	
	ryaz 33 "agdan cekiliyor:" "$2"
	#pkt=`cat "$paketdepo""paket.vt" | grep -w "$2" | cut -d' ' -f2` 
	paketvt_kontrol
	pkt=`cat "$paketdepo""paket.vt" | grep "$2"# | cut -d' ' -f2`
	if [ ! -z "$pkt" -a "$pkt" != "" ]; then
		cpaket="${pkt/'#'/'%23'}"
		#paket sunucuda varsa
		wget -q --spider "$sunucu$cpaket"
		#if wget -P /tmp -q "$sunucu$cpaket" > /dev/null; then
		if [ $? -eq 0 ]; then
			wget -nc -P "$paketdepo" "$sunucu$cpaket"
			#mv /tmp/$pkt "$paketdepo"
			if [ "$kurulum_onay" = "evet" ];then
				kkont=`kurulu_kontrol "$2"`
				if [ "$kkont" = "degil" ];then
					icerik_ekle "$paketdepo$pkt"
					exit 1
				else
					rya 31 "paket zaten kurulu!"
				fi
			fi
		
		fi
	else
		ryaz 31 "paket agda bulunamadı!"
	fi
	exit 1
	
fi

if [ "$ikaynak" = "yerel" ]; then
	local silme
	pkontrol=`basename $2 | grep -w "mps.lz"`
	if [ ! -z "$pkontrol" -a "$pkontrol" != "" ]; then
		paketad=`echo "$2" | cut -d'#' -f1`	
		kkont=`kurulu_kontrol "$paketad"`
		if [ "$kkont" = "degil" ];then
			icerik_ekle "$2"
		else
			while true; do
				ryaz 31 "$2 paketi zaten kurulu silinip kurulsun mu?"
				read -p "e veya h -> " eh
				case $eh in
					[Ee]* ) silme="e"; break;;
					[Hh]* ) break;;
					* ) echo "e veya h";;
				esac
			done
			if [ "$silme" = "e" ];then
				ryaz 33 "silinecekelerin kontrolu için"
				paket_sil "$paketad"
				icerik_ekle "$2"
			fi
		fi
	else
		ryaz 31 "yerelde mps paketi bulunamadı."
	fi
fi

}
ana "$@"


#31 kirmizi
#32 yesil
#33 sari
#34 mavi
#34 mor

