#!/bin/bash

# Copyright (C) 2016 NIWA Hideyuki

PATH=/usr/lib/fulcon/lib/:$PATH

# BASE dir
CONTAINER_DIR=/var/lib/fulcon/setup

# check root
if [ ${EUID:-$UID} -ne 0 ] ; then
  echo "error: Because you are not root, you cannot execute this command."
  exit 1
fi

usage () {
	echo "usage ; create-rootfs NAME"
}

# check arts
if [ $# -ne 1 ]; then
	usage
	exit -1
fi

umask 022

LXCNAME=$1

rootfs=$CONTAINER_DIR/$LXCNAME/rootfs

lsdir() {
  ls -f --ind=none $1 | sed '/^\.\{1,2\}$/d'
}

# clear rootfs
release-rootfs $LXCNAME

# create root dir
mkdir -p $rootfs

# create dir
for i in `lsdir /`
do
	if [ -L /$i ] ; then
		if [ ! -f $rootfs/$i ]; then
			cp -a /$i $rootfs/$i
		fi
	elif [ -d /$i ]; then
		mkdir -p $rootfs/$i
		DIRATTR=`stat --format='%a' /$i`
		chmod $DIRATTR $rootfs/$i
	fi
done

# create /usr
umount $rootfs/usr >& /dev/null
mount --bind /usr $rootfs/usr

# create /bin
if [ ! -L $rootfs/bin ]; then
	umount $rootfs/bin >& /dev/null
	mount --bind /bin $rootfs/bin
fi

# create /sbin
if [ ! -L $rootfs/sbin ]; then
	umount $rootfs/sbin >& /dev/null
	mount --bind /sbin $rootfs/sbin
fi

# create /lib
if [ ! -L $rootfs/lib ]; then
	cp -a /lib $rootfs
	rm -rf $rootfs/lib/modules
	rm -rf $rootfs/lib/firmware
fi

# create /lib64
if [ ! -L $rootfs/lib64 ]; then
	umount $rootfs/lib64 >& /dev/null
	mount --bind /lib64 $rootfs/lib64
fi

# create /etc
cp -a /etc $rootfs
rm -rf $rootfs/etc/libvirt/{*,.*} 2> /dev/null

# create /root
mkdir -p $rootfs/root;
for i in .bash_{profile,login} .profile .bash{rc,_logout} ; do
	[ -f /root/$i ] && cp -p /root/$i $rootfs/root
done;

# create /home
for i in `lsdir /home`
do
	mkdir -p $rootfs/home/$i
	if [ -f /home/$i/.bashrc ]; then
		cp -f /home/$i/.bashrc $rootfs/home/$i/.
	fi
	if [ -f /home/$i/.bash_logout ]; then
		cp -f /home/$i/.bash_logout $rootfs/home/$i/.
	fi
	HMUID=`ls -ld /home/$i | awk '{print $3}'`
	HMGID=`ls -ld /home/$i | awk '{print $4}'`
	chown -R ${HMUID}.${HMGID} $rootfs/home/$i
done

# create /var
for i in `lsdir /var` ; do
	if [ -L /var/$i ] ; then
		cp -a /var/$i $rootfs/var/$i
	elif [ -d /var/$i ] ; then
		mkdir -p $rootfs/var/$i
		DIRATTR=`stat --format='%a' /var/$i`
		chmod $DIRATTR $rootfs/var/$i
		if [ x"$i" != x"log" -a x"$i" != x"lib" -a x"$i" != x"spool" ]; then
			umount $rootfs/var/$i >& /dev/null
			mount --bind /var/$i $rootfs/var/$i
		fi
	fi
done

for i in `lsdir /var/lib`; do
	if [ -L /var/lib/$i ] ; then
		cp -a /var/lib/$i $rootfs/var/lib/$i
	elif [ -d /var/lib/$i ] ; then
		mkdir -p $rootfs/var/lib/$i
		DIRATTR=`stat --format='%a' /var/lib/$i`
		chmod $DIRATTR $rootfs/var/lib/$i
		if [ x"$i" != x"fulcon" -a x"$i" != x"tmp" -a \
				x"$i" != x"log" -a x"$i" != x"docker" -a \
				x"$i" != x"libvirt" -a x"$i" != x"slot-os" ]; then
			umount $rootfs/var/lib/$i >& /dev/null
			mount --bind /var/lib/$i $rootfs/var/lib/$i
		fi
	fi
done

# make /var/spool
cp -pr /var/spool $rootfs/var
if [ -d $rootfs/var/spool/abrt ]; then
	rm -rf $rootfs/var/spool/abrt/*
fi
if [ -d $rootfs/var/spool/abrt-upload ]; then
	rm -rf $rootfs/var/spool/abrt-upload/*
fi
if [ -d $rootfs/var/spool/mail ]; then
	rm -rf $rootfs/var/spool/mail/*
fi

# clear /var/log
cp -pr /var/log $rootfs/var
find $rootfs/var/log -type f -regex ".*[-.][0-9]+" -exec rm -f {} \;
find $rootfs/var/log -type f -name '*.gz' -exec rm -f {} \;
for i in `find $rootfs/var/log -type f`
do
	cat /dev/null > $i
done

# clear /etc/fstab
cat /dev/null > $rootfs/etc/fstab

# disable selinux
if [ -d /sys/fs/selinux ]; then
	printf "\numount /sys/fs/selinux\n" >> $rootfs/etc/rc.d/rc.local
	chmod +x $rootfs/etc/rc.d/rc.local
fi

# setup systemd
rm -f $rootfs/etc/systemd/system/plymouth-quit.service
ln -s /dev/null $rootfs/etc/systemd/system/plymouth-quit.service

rm -f $rootfs/etc/systemd/system/plymouth-quit-wait.service
ln -s /dev/null  $rootfs/etc/systemd/system/plymouth-quit-wait.service

rm -f $rootfs/etc/systemd/system/plymouth-read-write.service
ln -s /dev/null $rootfs/etc/systemd/system/plymouth-read-write.service

rm -f $rootfs/etc/systemd/system/plymouth-halt.service
ln -s /dev/null $rootfs/etc/systemd/system/plymouth-halt.service

rm -f $rootfs/etc/systemd/system/plymouth-poweroff.service
ln -s /dev/null $rootfs/etc/systemd/system/plymouth-poweroff.service

rm -f  $rootfs/etc/systemd/system/plymouth-reboot.service
ln -s /dev/null $rootfs/etc/systemd/system/plymouth-reboot.service

rm -f  $rootfs/etc/systemd/system/plymouth-start.service
ln -s /dev/null $rootfs/etc/systemd/system/plymouth-start.service

rm -f $rootfs/etc/systemd/system/avahi-daemon.service
ln -s /dev/null $rootfs/etc/systemd/system/avahi-daemon.service

rm -f $rootfs/etc/systemd/system/chronyd.service
ln -s /dev/null $rootfs/etc/systemd/system/chronyd.service

rm -f $rootfs/etc/systemd/system/systemd-modules-load.service
ln -s /dev/null $rootfs/etc/systemd/system/systemd-modules-load.service

rm -f $rootfs/etc/systemd/system/abrtd.service
ln -s /dev/null $rootfs/etc/systemd/system/abrtd.service

rm -f $rootfs/etc/systemd/system/getty.target
rm -f $rootfs/etc/systemd/system/getty.target.wants/*
ln -s /dev/null $rootfs/etc/systemd/system/getty.target

rm -f $rootfs/etc/systemd/system/graphical.target
rm -f $rootfs/etc/systemd/system/graphical.target.wants/*
ln -s /dev/null $rootfs/etc/systemd/system/graphical.target

rm -f $rootfs/etc/systemd/system/sysinit.target.wants/*

rm -f $rootfs/etc/systemd/system/systemd-udevd.service
ln -s /dev/null $rootfs/etc/systemd/system/systemd-udevd.service

rm -f $rootfs/etc/systemd/system/basic.target.wants/*
rm -f $rootfs/etc/systemd/system/default.target.wants/*
rm -f $rootfs/etc/systemd/system/multi-user.target.wants/*
if [ -f /lib/systemd/system/sshd.service ]; then
	ln -s /lib/systemd/system/sshd.service $rootfs/etc/systemd/system/multi-user.target.wants/sshd.service
fi
if [ -f /lib/systemd/system/ssh.service ]; then
	ln -s /lib/systemd/system/ssh.service $rootfs/etc/systemd/system/multi-user.target.wants/ssh.service
fi
if [ -f /lib/systemd/system/cron.service ]; then
	ln -s /lib/systemd/system/cron.service $rootfs/etc/systemd/system/multi-user.target.wants/cron.service
fi
if [ -f /lib/systemd/system/crond.service ]; then
	ln -s /lib/systemd/system/crond.service $rootfs/etc/systemd/system/multi-user.target.wants/crond.service
fi
if [ -f /lib/systemd/system/rsyslog.service ]; then
	ln -s /lib/systemd/system/rsyslog.service $rootfs/etc/systemd/system/multi-user.target.wants/rsyslog.service
fi
rm -f $rootfs/etc/systemd/system/graphical.target.wants/*

rm -f $rootfs/etc/systemd/system/irqbalance.service
ln -s /dev/null $rootfs/etc/systemd/system/irqbalance.service

rm -f $rootfs/etc/systemd/system/alsa-state.service
ln -s /dev/null $rootfs/etc/systemd/system/alsa-state.service

rm -f $rootfs/etc/rc?.d/*irqbalance
rm -f $rootfs/etc/rc?.d/*kerneloops

# setup multi-user.target
rm -f $rootfs/etc/systemd/system/default.target
ln -s /lib/systemd/system/multi-user.target $rootfs/etc/systemd/system/default.target

exit 0
