#!/bin/bash

# LXCF - LXC Facility
# Copyright (C) 2013-2014 FUJITSU LIMITED

# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; version 2
# of the License.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
# 02110-1301, USA.

# check distro
DISTRO=`/usr/lib64/lxcf/lxcf-distro`

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

umask 022

FLG_H=FALSE
FLG_O=FALSE
FLG_S=FALSE
while getopts hosj OPT ; do
  case $OPT in
  h) FLG_H=TRUE ;;
  o) FLG_O=TRUE ;;
  s) FLG_S=TRUE ;;
  esac
done
shift $((OPTIND - 1))

if [ $# -ne 1 ] ; then
  echo "usage: ${0##*/} [-h] [-o] [-s] [-j] LXCNAME"
  exit 1
fi

LXCNAME=$1

if ! /usr/lib64/lxcf/lxcf-parmchk-cname $LXCNAME ; then
  cat <<- EOF
	error: $LXCNAME is not a container name
	       The container name must be alphanumeric character, "-" and "_".
	EOF
  exit 1
fi

rootfs=/opt/lxcf/$LXCNAME

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

# create new lxcf management dir
mkdir -p /etc/lxcf/rsc/$LXCNAME

# create root dir
echo "creating $rootfs..."
mkdir -p $rootfs

# create /proc dir
echo "creating $rootfs/proc..."
mkdir -p $rootfs/proc

# create /etc
echo "creating $rootfs/etc..."
cp -a /etc $rootfs
rm -rf $rootfs/etc/libvirt/{*,.*} 2> /dev/null
rm -rf $rootfs/etc/lxcf
mkdir -p $rootfs/etc/lxcf/rsc/$LXCNAME

# create /run
echo "creating $rootfs/run..."
mkdir -p $rootfs/run

# create /opt
echo "creating $rootfs/opt..."
if [ $FLG_O == TRUE ] ; then
  rsync -a --inplace --exclude=lxcf/ /opt/ $rootfs/opt
else
  mkdir -p $rootfs/opt
fi

# create /home
echo "creating $rootfs/home..."
if [ $FLG_H == TRUE ] ; then
  rsync -a --inplace --exclude=lxcf/ /home/ $rootfs/home
else
  mkdir -p $rootfs/home
fi

# create /root
echo "creating $rootfs/root..."
if [ $FLG_H == TRUE ] ; then
  rsync -a --inplace --exclude=lxcf/ /root/ $rootfs/root
  if [ -f /root/.bash_profile ] ; then
    cp -p /root/.bash_profile $rootfs/root
  fi
  if [ -f /root/.bashrc ] ; then
    cp -p /root/.bashrc $rootfs/root
  fi
else 
  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;
fi
mkdir -p $rootfs/root/.ssh
chmod 700 $rootfs/root/.ssh
if [ -f /root/.ssh/lxcf_rsa.pub ]; then
  mkdir -p $rootfs/root/.ssh/
  cp -p /root/.ssh/lxcf_rsa.pub $rootfs/root/.ssh/authorized_keys
  chmod 600 $rootfs/root/.ssh/authorized_keys
fi

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
    chown -R $i.$i $rootfs/home/$i
done

# create /boot
echo "creating $rootfs/boot..."
mkdir -p $rootfs/boot

# create /var
echo "creating $rootfs/var..."
mkdir -p $rootfs/var
for i in `lsdir /var` ; do
  if [ $i == cache ] ; then
    mkdir -p $rootfs/var/$i
    for j in `lsdir /var/$i` ; do
      if [ $j == lxc ] ; then
        mkdir -p $rootfs/var/$i/$j
      else
        cp -a /var/$i/$j $rootfs/var/$i
      fi
    done
    echo -n "."
  elif [ $i == lib ] ; then
    mkdir -p $rootfs/var/$i
    for j in `lsdir /var/$i` ; do
      if [ $j == libvirt ] ; then
        mkdir -p $rootfs/var/$i/$j
        for k in `lsdir /var/$i/$j` ; do
          if [ $k == images ] ; then
            mkdir -p $rootfs/var/$i/$j/$k
          else
            cp -a /var/$i/$j/$k $rootfs/var/$i/$j
          fi
        done
      elif [ $j == lxc -o $j == docker ] ; then
        mkdir -p $rootfs/var/$i/$j
      else
        cp -a /var/$i/$j $rootfs/var/$i
      fi
    done
    echo -n "."
  else
    cp -a /var/$i $rootfs/var
    echo -n "."
  fi
done
echo
rm -f $rootfs/var/lib/libvirt/images/*
rm -rf $rootfs/var/log/libvirt/{*,.*} 2> /dev/null
rm -rf $rootfs/var/log/lxc/{*,.*} 2> /dev/null
cat /dev/null > $rootfs/var/log/messages
if [ -d $rootfs/var/log/audit ] ; then
  rm -rf $rootfs/var/log/audit/{*,.*} 2> /dev/null
  touch $rootfs/var/log/audit/audit.log
  chmod 600 $rootfs/var/log/audit/audit.log
fi
if [ -d $rootfs/var/tmp/abrt ] ; then
  rm -rf $rootfs/var/tmp/abrt/{*,.*} 2> /dev/null
fi
if [ -d $rootfs/var/tmp/kdecache-root ] ; then
  rm -rf $rootfs/var/tmp/kdecache-root/{*,.*} 2> /dev/null
fi

if [ x$DISTRO == x"u" ] ; then
  # create /tmp
  cp -pr /tmp $rootfs/.
fi

# create /usr
echo "creating $rootfs/usr..."
if [ $FLG_S == TRUE ] ; then
  mkdir -p $rootfs/usr
  for i in `lsdir /usr` ; do
    cp -a /usr/$i $rootfs/usr
    echo -n "."
  done
  echo
else
  mkdir -p $rootfs/usr
fi

# create /sbin
echo "creating $rootfs/sbin..."
cp -a /sbin $rootfs

# create /bin
echo "creating $rootfs/bin..."
cp -a /bin $rootfs

# create /lib
echo "creating $rootfs/lib..."
if [ ! -h /lib ] ; then
  mkdir -p $rootfs/lib
  for i in `lsdir /lib` ; do
    if [ $i == modules ] ; then
      mkdir -p $rootfs/lib/$i
    else
      cp -a /lib/$i $rootfs/lib
    fi
  done
else
  cp -a /lib $rootfs
fi

# create /lib64
if [ -d /lib64 ] ; then
  echo "creating $rootfs/lib64..."
  cp -a /lib64 $rootfs
fi

exit 0
