#!/bin/bash
### Este script crea las iso Online y Offline de JKArch desde parte de los archivos de una iso original de archlinux (Descargada desde rediris)
### Creado por JKANetwork
### Este script debe ser ejecutado con el clone del git de JKArch sin mover ningun fichero
### Se puede usar como parametro Online o Offline para crear solo una de las dos imagenes

sfslocate="/tmp/sfsfile" #Donde se harán las modificaciones temporales (El chroot)

#Funciones

##Esta funcion actualiza el sistema del sfs, borra e instala paquetes, y crea el sfs final no dejando temporales
function modifyimage {
	sudo arch-chroot $sfslocate/ /usr/bin/pacman-key --init
	sudo arch-chroot $sfslocate/ /usr/bin/pacman-key --populate
	sudo arch-chroot $sfslocate/ /usr/bin/pacman -Sy archlinux-keyring --noconfirm

	sudo arch-chroot $sfslocate/ /usr/bin/pacman -S reflector --noconfirm
	sudo arch-chroot $sfslocate/ /usr/bin/reflector --verbose -l 6 --sort rate --save /etc/pacman.d/mirrorlist
	#Delete packages not needed from official iso
	sudo arch-chroot $sfslocate/ /usr/bin/pacman -R clonezilla darkhttpd diffutils grml-zsh-config irssi linux-atm lvm2 man-db man-pages mc ndisc6 nmap smartmontools testdisk vi vim vim-runtime zsh openconnect pcsclite python2 --noconfirm
	#Restore bash shell (not zsh)
	sudo arch-chroot $sfslocate/ /usr/bin/chsh -s /bin/bash root
	#Install new
	sudo arch-chroot $sfslocate/ /usr/bin/pacman -Su gparted xf86-video-vesa xorg-xinit --noconfirm --ignore linux #Do not upgrade kernel automatically
	sudo rm -rf $sfslocate/var/cache/pacman/pkg/*
	sudo rm $sfslocate/root/.bash_history
	#Devolver permisos de root
	sudo chmod 700 $sfslocate/root/

	#Crear nuevo sfs y comprobar su creacion
	sudo mksquashfs $sfslocate/ iso/arch/x86_64/airootfs.sfs.new -comp xz
	if [[ $? == 0 ]];then
			sudo rm -r iso/arch/x86_64/airootfs.sfs
			sudo mv iso/arch/x86_64/airootfs.sfs.new iso/arch/x86_64/airootfs.sfs
	else #Error en mksquashfs
			sudo rm -r iso/arch/x86_64/airootfs.sfs.new
			sudo umount $sfslocate/*
			sudo rm -rf $sfslocate/
			echo "ERROR AL INTENTAR CREAR EL SFS, PROGRAMA DETENIDO"
			exit
	fi
	#md5
	md5sum iso/arch/x86_64/airootfs.sfs > iso/arch/x86_64/airootfs.md5
	#Borrar archivos temporales del pc real
	sudo umount $sfslocate/*
	sudo rm -rf $sfslocate/
}

##Esta funcion genera el .bash_profile
function bashprofile {
	sudo rm $sfslocate/root/.bash_profile
	sudo echo "#" > $sfslocate/root/.bash_profile
	sudo echo "# ~/.bash_profile" >> $sfslocate/root/.bash_profile
	sudo echo "#" >> $sfslocate/root/.bash_profile
	if [[ $1 = "Online" ]];then
		sudo echo "cd /root/" >> $sfslocate/root/.bash_profile
		sudo echo "./downloadinstall.sh" >> $sfslocate/root/.bash_profile
	else #Offline
		sudo echo "cd /root/offlinefiles/" >> $sfslocate/root/.bash_profile
		sudo echo "./selectlang.sh" >> $sfslocate/root/.bash_profile
	fi
	sudo echo "[[ -f ~/.bashrc ]] && . ~/.bashrc" >> $sfslocate/root/.bash_profile
}

##Esta funcion prepara la carpeta iso
function prepareISOFolder {
	rm -rf iso/*
	mkdir iso
	cp -r data/* iso/
	mkdir -p iso/arch/x86_64 #This folder is needed
	cp temp/archiso.img iso/arch/archiso.img
	cp temp/vmlinuz iso/arch/vmlinuz
	cp temp/intel_ucode.img iso/arch/intel_ucode.img
	cp temp/intel_ucode.LICENSE iso/arch/intel_ucode.LICENSE
	cp temp/airootfs.sfs iso/arch/x86_64/airootfs.sfs
}

#Borramos carpeta temporal
rm -rf temp/
mkdir temp

#Download necessary files
wget http://sunsite.rediris.es/mirror/archlinux/iso/latest/arch/boot/x86_64/archiso.img -O temp/archiso.img
wget http://sunsite.rediris.es/mirror/archlinux/iso/latest/arch/boot/x86_64/vmlinuz -O temp/vmlinuz
wget http://sunsite.rediris.es/mirror/archlinux/iso/latest/arch/boot/intel_ucode.img -O temp/intel_ucode.img
wget http://sunsite.rediris.es/mirror/archlinux/iso/latest/arch/boot/intel_ucode.LICENSE -O temp/intel_ucode.LICENSE
wget http://sunsite.rediris.es/mirror/archlinux/iso/latest/arch/x86_64/airootfs.sfs -O temp/airootfs.sfs
#


##Function online iso create
function createOnline {
	#							Online ISO Procedure
	#Copy important files
	prepareISOFolder

	sudo unsquashfs -d $sfslocate/ iso/arch/x86_64/airootfs.sfs

	#Permisos de root de la imagen cambiar temporalmente
	sudo chmod 777 $sfslocate/root/
	sudo rm $sfslocate/root/*

	#.bash_profile Online
	bashprofile "Online"

	#Copiar ficheros instalador
	sudo cp ../archinstall/* $sfslocate/root/
	sudo rm $sfslocate/root/pacman-offline.conf

	#Resto de modificaciones (las comunes) y cerrado del sfs 
	modifyimage

	#Creamos la ISO 
	mkisofs -b isolinux/isolinux.bin -r -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -V "JKARCH-ISO" -o output-Online.iso iso/
	sudo rm -rf iso/
	echo "ISO Online creada"
}

function createOffline {
	#							Offline ISO Procedure
	#Copy important files
	prepareISOFolder

	#Unsquash sfs file
	sudo unsquashfs -d $sfslocate/ iso/arch/x86_64/airootfs.sfs

	#Permisos de root de la imagen cambiar temporalmente
	sudo chmod 777 $sfslocate/root/
	sudo rm $sfslocate/root/*

	#.bash_profile Offline
	bashprofile "Offline"

	#Create subfolder and folder at same time
	sudo mkdir -p $sfslocate/root/offlinefiles/mods/
	#Esta ruta es absoluta, no vale para todos los sistemas (Es "temporal")
	sudo cp ../archinstall/* $sfslocate/root/offlinefiles/
	sudo rm $sfslocate/root/offlinefiles/downloadinstall.sh $sfslocate/root/offlinefiles/archinstall-dev.sh
	sudo cp ../mods/* $sfslocate/root/offlinefiles/mods/

	#Resto de modificaciones (las comunes) y cerrado del sfs 
	modifyimage

	#Creamos el repositorio
	sudo sh depsjkarch.sh
	#Lo movemos a su sitio
	mkdir -p iso/repo/
	mv repoofflinejkarch/* iso/repo/
	rm -rf repoofflinejkarch/

	#Creamos la ISO 
	mkisofs -b isolinux/isolinux.bin -r -c isolinux/boot.cat -no-emul-boot -boot-load-size 4 -boot-info-table -V "JKARCH-ISO" -o output-Offline.iso iso/
	sudo rm -rf iso/
	echo "ISO Offline creada"
}


#Switch del argumento $1 para ver si solo se quiere crear una de las dos imagenes iso
case $1 in
	"Online") createOnline;;
	"Offline") createOffline;;
	"")
		createOnline
		createOffline
		;;
esac


#Borramos carpeta temporal antes de finalizar
rm -rf temp/
mkdir temp
echo "Script terminado"