#!/bin/bash

VNX_DIR=/usr/share/vnx

# Parse arguments
while getopts "v" opt; do
  echo "Options:"
  case $opt in
    v)
      echo "Verbose mode" >&2
      VERBOSE=-v
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
	  echo "Usage: install_vnx [-v]"
	  echo "           -v verbose mode"
      ;;
  esac
done


VNX_VERSION="2.0b"
ROOTFS_VERSION="es-v022b"
EDIV_ALG_MODULES_DIR="${VNX_DIR}/lib/seg-alg"

# Move to the directory where this script is
cdir=$( dirname $0 )
cd $cdir

# Load current version numbers
source ./VERSION
echo "VERSIONS:"
echo VNX_MAJOR=${VNX_MAJOR}
echo VNX_MINOR=${VNX_MINOR}
echo VNX_LATEST_REVISION=${VNX_LATEST_REVISION}

VNX_VERSION=${VNX_MAJOR}.${VNX_MINOR}.${VNX_LATEST_REVISION}
#VNX_VERSION_DATE=${VNX_VERSION}-`date +%Y%m%d%H%M`


# Get perl modules directory (/usr/local/share/perl/5.10.0/ in Ubuntu)
PERL_LIBS=$(perl -e 'use Config; print $Config{installvendorlib}')
if [ ! $PERL_LIBS ]
then
   echo "ERROR: cannot find perl modules directory"
   exit 1
fi
VNX_LIBS="$PERL_LIBS/VNX/"
#EDIV_LIBS="$PERL_LIBS/EDIV/"
EDIV_LIBS="$PERL_LIBS/VNX/"

echo "** "
echo "** Installing VNX v${VNX_VERSION}... "
echo "** "

#
# Create directories if not already created
#
mkdir -p $VERBOSE ${VNX_LIBS}
mkdir -p $VERBOSE  ${EDIV_LIBS}
mkdir -p $VERBOSE ${EDIV_ALG_MODULES_DIR}
mkdir -p $VERBOSE /usr/share/xml/vnx
mkdir -p $VERBOSE /usr/local/share/xml/vnx
mkdir -p $VERBOSE ${VNX_DIR}/bin
mkdir -p $VERBOSE ${VNX_DIR}/examples/
mkdir -p $VERBOSE ${VNX_DIR}/filesystems
mkdir -p $VERBOSE ${VNX_DIR}/kernels
mkdir -p $VERBOSE ${VNX_DIR}/aced
mkdir -p $VERBOSE ${VNX_DIR}/plugins
mkdir -p $VERBOSE ${VNX_DIR}/src
#mkdir -p $VERBOSE /etc/ediv
mkdir -p $VERBOSE ${VNX_DIR}/etc

#
# save a copy of vnx tar file to ${VNX_DIR}/src directory
#
FNAME=vnx-${VNX_VERSION}
PWD=$(pwd)
DIRNAME=${PWD##*/}
pushd .. > /dev/null
if [ $VERBOSE ]; then
    tar cfvz ${VNX_DIR}/src/${FNAME}.tgz $DIRNAME
else
    tar cfz ${VNX_DIR}/src/${FNAME}.tgz $DIRNAME
fi
rm -vf ${VNX_DIR}/src/vnx-latest.tgz
ln -s ${FNAME}.tgz ${VNX_DIR}/src/vnx-latest.tgz
popd > /dev/null

#
# Copy vnx
#
cp $VERBOSE bin/vnx.pl /usr/bin/vnx
chmod +x /usr/bin/vnx

#
# Copy {vnx|ediv}_bash_completion
#
if [ -d /usr/share/bash-completion/completions/ ]; then
  cp $VERBOSE bin/vnx_bash_completion /usr/share/bash-completion/completions/vnx
  chmod 644 /usr/share/bash-completion/completions/vnx
  #cp $VERBOSE bin/ediv_bash_completion /usr/share/bash-completion/completions/ediv
  #chmod 644 /usr/share/bash-completion/completions/ediv
fi
if [ -d /etc/bash_completion.d/ ]; then
  cp $VERBOSE bin/vnx_bash_completion /etc/bash_completion.d/vnx
  chmod 644 /etc/bash_completion.d/vnx
  #cp $VERBOSE bin/ediv_bash_completion /etc/bash_completion.d/ediv
  #chmod 644 /etc/bash_completion.d/ediv
fi

#
# Copy ediv executables
#
cp $VERBOSE bin/ediv_ctl_vnx.pl /usr/bin/ediv
cp $VERBOSE bin/vn /usr/bin
cp $VERBOSE bin/ediv_monitor.pl /usr/bin/ediv_monitor
chmod +x /usr/bin/ediv* /usr/bin/vn
#
# Delete deprecated ediv utilities
#
DEPRECATED_EDIV_CMDS="ediv_monitor.pl ediv_cluster_cleanup.pl ediv_ctl_vnuml.pl ediv_db_manage.pl ediv_db_reset.pl ediv_segmentation_info.pl ediv_console.pl ediv_ctl.pl"
for f in $DEPRECATED_EDIV_CMDS; do 
  rm -f /usr/bin/$f
done

#
# Copy other utilities
#
cp $VERBOSE bin/vnx2dot.pl /usr/bin/vnx2dot
chmod +x /usr/bin/vnx2dot
cp $VERBOSE bin/vnx_pack_scenario.sh /usr/bin/vnx_pack_scenario
chmod +x /usr/bin/vnx2dot

#
# Copy vnx perl modules
#
cp $VERBOSE perl-modules/VNX/* ${VNX_LIBS}
chmod 644 ${VNX_LIBS}*

#
# Copy ediv perl modules
#
cp $VERBOSE perl-modules/EDIV/* ${EDIV_LIBS}
chmod 644 ${VNX_LIBS}*
cp $VERBOSE perl-modules/algorithms/* ${EDIV_ALG_MODULES_DIR}
chmod 644 ${VNX_LIBS}*

#
# Copy VNX xsd
#
#cp $VERBOSE data/*.dtd /usr/share/xml/vnx/
cp $VERBOSE data/*.xsd /usr/share/xml/vnx/
cp $VERBOSE data/*.xsd /usr/local/share/xml/vnx/

#
# Copy examples
#
cp $VERBOSE data/*.xml data/*.net ${VNX_DIR}/examples/
cp $VERBOSE data/*.cvnx data/*.net ${VNX_DIR}/examples/
cp $VERBOSE -r data/conf ${VNX_DIR}/examples/
cp $VERBOSE -r data/scripts ${VNX_DIR}/examples/
cp $VERBOSE -r data/tutorial_ubuntu_modify ${VNX_DIR}/examples/
mkdir -p ${VNX_DIR}/examples/shared
#chmod 644 ${VNX_DIR}/examples/*
find ${VNX_DIR}/examples/ -maxdepth 1 -type f -print0 | xargs -0 chmod 644
chmod +x ${VNX_DIR}/examples/conf

#
# Copy other things in data directory
#
#cp $VERBOSE data/create-tutorial* ${VNX_DIR}/examples/
#chmod 755 ${VNX_DIR}/examples/create-tutorial*

#
# Copy other utils
#
#cp $VERBOSE bin/update_daemon.pl ${VNX_DIR}/bin/vnx_update_aced

# Delete vnx_modify_rootfs* -> obsoleted by vnx --modify-rootfs option
rm -f $VERBOSE ${VNX_DIR}/bin/vnx_modify_rootfs*

# Files copied to /usr/bin directory
cp $VERBOSE bin/vnx_update.sh /usr/bin/vnx_update
cp $VERBOSE bin/vnx_download_rootfs.sh /usr/bin/vnx_download_rootfs
cp $VERBOSE bin/vnx_mount_rootfs.sh /usr/bin/vnx_mount_rootfs
cp $VERBOSE bin/vnx_config_nat.sh /usr/bin/vnx_config_nat
cp $VERBOSE bin/vnx_convert_lxc_config.sh /usr/bin/vnx_convert_lxc_config

# Files copied to vnx bin directory
cp $VERBOSE bin/vnx_update_host.sh ${VNX_DIR}/bin/vnx_update_host
cp $VERBOSE bin/vnx_set_def_rootfs.pl ${VNX_DIR}/bin/vnx_set_def_rootfs
cp $VERBOSE bin/vnx_create_lxc_rootfs.sh ${VNX_DIR}/bin/vnx_create-rootfs_lxc
cp $VERBOSE bin/vnx_create_kvm_rootfs.sh ${VNX_DIR}/bin/vnx_create-rootfs_kvm

# Delete old versions copied to /usr/share/vnx/bin
rm -f ${VNX_DIR}/bin/vnx_download_rootfs
rm -f ${VNX_DIR}/bin/vnx_mount_rootfs
rm -f ${VNX_DIR}/bin/vnx_update
chmod 755 ${VNX_DIR}/bin/*
chmod 755 /usr/bin/vnx_*

#
# Copy vnx config file
#
#if [ -e /etc/vnx.conf ]; then
#	mv /etc/vnx.conf /etc/vnx.conf.bak
#fi
cp $VERBOSE etc/vnx.conf ${VNX_DIR}/etc/vnx.conf.sample
chmod 600 ${VNX_DIR}/etc/vnx.conf.sample

#
# Copy ediv config file
#
cp $VERBOSE etc/cluster.conf ${VNX_DIR}/etc/vnx.cluster.conf.sample
chmod 600 ${VNX_DIR}/etc/vnx.cluster.conf.sample

#
# Copy AppArmor profile
#
cp $VERBOSE etc/lxc-default-with-netns /etc/apparmor.d/lxc
#rm $VERBOSE /etc/apparmor.d/lxc/lxc-default-with-netns 

#
# Copy ace daemons 
#
cp $VERBOSE -d aced/* ${VNX_DIR}/aced

#
# Copy plugins
#
cp $VERBOSE plugins/*.pm ${VNX_DIR}/plugins/
#cp -v plugins/*.dtd /usr/share/xml/vnx/
cp $VERBOSE plugins/*.xsd /usr/share/xml/vnx/
cp $VERBOSE -r plugins/examples ${VNX_DIR}/plugins/ 

#
# Copy bios for olive routers
#
mkdir -p /usr/share/kvm/
cp $VERBOSE lib/bios-olive.bin /usr/share/kvm/


echo "** "
echo "** ...done"
echo "** "

#
# Create vnx user and group (taken from postinst script of vnumlXXX.deb
#

VNX_TUN=/dev/net/tun
TUN_GROUP=uml-net
VNX_USER=vnx
VNX_GROUP=vnx
DATA=/var/run/vnx

if ! grep "^$TUN_GROUP:" /etc/group > /dev/null 2>&1
then
   echo "creating TUN group: $TUN_GROUP"
   groupadd $TUN_GROUP
fi

if ! grep "^$VNX_GROUP:" /etc/group > /dev/null 2>&1       
then 
   echo "creating VNX group: $VNX_GROUP"
   groupadd $VNX_GROUP
fi

if ! grep "^$VNX_USER:" /etc/passwd > /dev/null 2>&1
then
   echo "creating VNX user: $VNX_USER"
   useradd -d $DATA -g $VNX_GROUP -G $TUN_GROUP -s /bin/false -r $VNX_USER
fi

if ! [ -e $DATA ]
then
   # FIXME: is this the right place for mkdir?
   echo "creating data dir: $DATA"
   mkdir -p $DATA
fi

chgrp $TUN_GROUP $VNX_TUN
chmod g+w $VNX_TUN
chown $VNX_USER:$VNX_GROUP $DATA
chmod 755 $DATA

# Restart apparmor if active
if systemctl | grep apparmor.service | grep active > /dev/null 2>&1; then 
  echo "restarting apparmor service..."
  systemctl restart apparmor
fi

# Show VNX version
vnx -V
