#!/bin/bash

#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License v3 as published by
#    the Free Software Foundation.
#
#    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, see <http://www.gnu.org/licenses/>.

VL_ARCH=${VL_ARCH:-"i586"}
VL_VERSION=${VL_VERSION:-"7.1"}
VL_CACHE=${VL_CACHE:-"/var/lib/lxc/cache"}
SLAPTGET=$(which slapt-get)
INSTALLPKG=$(which installpkg)

function test_host {
	# Run some tests on the host to make sure we can create a VL container there
	if [ -z $SLAPTGET ]; then
		echo "NO"
	elif [ -z $INSTALLPKG ]; then
		echo "NO"
	else
		echo "YES"
	fi
}	

function slaptconfig {
    header=$(cat <<EOF
WORKINGDIR=$VL_CACHE/veclinux/packages
EXCLUDE=kernel,kernel-ide,kernel-source,kernel-src,kernel-headers,kernel-modules
EOF
)
    case $VL_ARCH in
	i?86)
		case $VL_VERSION in 
			"7.0")
				cat <<EOF
$header
SOURCE=http://vectorlinux.osuosl.org/veclinux-7.0/packages
SOURCE=http://vectorlinux.osuosl.org/veclinux-7.0/extra
SOURCE=http://vectorlinux.osuosl.org/veclinux-7.0/patches
EOF
			;;
			"7.1"|"7.2")
				cat <<EOF
$header
SOURCE=http://vlcore.vectorlinux.com/pkg/untested/veclinux-${VL_VERSION}/x86
EOF
			;;
		esac
		;;
	x86_64)
		case $VL_VERSION in
			"7.0")
				cat <<EOF
$header
SOURCE=http://vectorlinux.osuosl.org/VL64-7.0/packages
SOURCE=http://vectorlinux.osuosl.org/VL64-7.0/extra
SOURCE=http://vectorlinux.osuosl.org/VL64-7.0/patches
EOF
			;;
			"7.1"|"7.2")
				cat <<EOF
$header
SOURCE=http://vlcore.vectorlinux.com/pkg/untested/veclinux-${VL_VERSION}/x86_64
EOF
			;;
		esac
		;;
esac
}

function configure_container_init {
	rootfs=$1
	name=$2
	(
	cd $rootfs/etc/rc.d || exit 1
	# Disable some of the init scripts we dont need in an lxc container
	for file in rc.{A,4,K,X,acpid,apm,autologin,bootsplash,inetd,keymap,modules,network,nfsd,pnp,scanluns,diamond,fc-cache,vlinit}; do
		if [ -x $file ]; then
			chmod -x $file
		fi
	done

	# Write modified rc.6
	cat >rc.6 <<EOF
#! /bin/sh
#
# rc.6		This file is executed by init when it goes into runlevel
#		0 (halt) or runlevel 6 (reboot). It kills all processes,
#		unmounts file systems and then either halts or reboots.
#
# Version:	@(#)/etc/rc.d/rc.6	2.47 Sat Jan 13 13:37:26 PST 2001
#
# Author:	Miquel van Smoorenburg <miquels@drinkel.nl.mugnet.org>
# Modified by:  Patrick J. Volkerding, <volkerdi@slackware.com>
#
# Modified by M0E-lnx for lxc compatibility.
# WARNING:  DO NOT use this script on a bare metal install

container="lxc"

# Set the path.
PATH=/sbin:/etc:/bin:/usr/bin

# If there are SystemV init scripts for this runlevel, run them.
if [ -x /etc/rc.d/rc.sysvinit ]; then
  . /etc/rc.d/rc.sysvinit
fi

# Set linefeed mode to avoid staircase effect.
/bin/stty onlcr

echo "Running shutdown script \$0:"

# Find out how we were called.
case "\$0" in
	*0)
		command="halt"
		;;
	*6)
		command=reboot
		;;
	*)
		echo "\$0: call me as \"rc.0\" or \"rc.6\" please!"
		exit 1
		;;
esac

# Run any local shutdown scripts:
if [ -x /etc/rc.d/rc.local_shutdown ]; then
  /etc/rc.d/rc.local_shutdown stop
fi

# Stop the Apache web server:
if [ -x /etc/rc.d/rc.httpd ]; then
  /etc/rc.d/rc.httpd stop
fi

# Stop the MySQL database:
if [ -r /var/run/mysql/mysql.pid ]; then
  . /etc/rc.d/rc.mysqld stop
fi

# Stop the Samba server:
if [ -x /etc/rc.d/rc.samba ]; then
  . /etc/rc.d/rc.samba stop
fi

# Shut down the NFS server:
if [ -x /etc/rc.d/rc.nfsd ]; then
  /etc/rc.d/rc.nfsd stop
fi

# Shut down the SSH server:
if [ -x /etc/rc.d/rc.sshd ]; then
  /etc/rc.d/rc.sshd stop
fi

# Shut down the SASL authentication daemon:
if [ -x /etc/rc.d/rc.saslauthd ]; then
  /etc/rc.d/rc.saslauthd stop
fi

# Shut down OpenLDAP:
if [ -x /etc/rc.d/rc.openldap ]; then
  /etc/rc.d/rc.openldap stop
fi

# Stop D-Bus:
if [ -x /etc/rc.d/rc.messagebus ]; then
  sh /etc/rc.d/rc.messagebus stop
fi

# Unmount any NFS, SMB, or CIFS filesystems:
# echo "Unmounting remote filesystems."
/bin/umount -v -a -r -t nfs,smbfs,cifs

# Try to shut down pppd:
PS="\$(ps ax)"
if echo "\$PS" | /bin/grep -q -w pppd ; then
  if [ -x /usr/sbin/ppp-off ]; then
    /usr/sbin/ppp-off
  fi
fi

# Bring down the networking system, but first make sure that this
# isn't a diskless client with the / partition mounted via NFS:
if ! /bin/mount | /bin/grep -q 'on / type nfs' ; then
  if [ -x /etc/rc.d/rc.inet1 ]; then
    . /etc/rc.d/rc.inet1 stop
  fi
fi

if [ ! \$container = "lxc" ]; then
# In case dhcpcd might have been manually started on the command line,
# look for the .pid file, and shut dhcpcd down if it's found:
if /bin/ls /etc/dhcpc/*.pid 1> /dev/null 2> /dev/null ; then
  /sbin/dhcpcd -k 1> /dev/null 2> /dev/null
  # A little time for /etc/resolv.conf and/or other files to
  # restore themselves.
  sleep 2
fi
fi # End container check
if [ ! \$container = "lxc" ]; then
# Shut down PCMCIA devices:
if [ -x /etc/rc.d/rc.pcmcia ]; then
  . /etc/rc.d/rc.pcmcia stop
  # The cards might need a little extra time here to deactivate:
  /bin/sleep 5
fi
fi # End of container check

# Turn off process accounting:
if [ -x /sbin/accton -a -r /var/log/pacct ]; then
  /sbin/accton off
fi

if [ ! \$container = "lxc" ]; then # Container check
# Terminate acpid before syslog:
if [ -x /etc/rc.d/rc.acpid -a -r /var/run/acpid.pid ]; then # quit
  . /etc/rc.d/rc.acpid stop
fi
fi # End container check

# Kill all processes.
# INIT is supposed to handle this entirely now, but this didn't always
# work correctly without this second pass at killing off the processes.
# Since INIT already notified the user that processes were being killed,
# we'll avoid echoing this info this time around.
if [ ! "\$1" = "fast" ]; then # shutdown did not already kill all processes
  /sbin/killall5 -15 
  /bin/sleep 5
  /sbin/killall5 -9
fi

# Try to turn off quota.
if /bin/grep -q quota /etc/fstab ; then
  if [ -x /sbin/quotaoff ]; then
    echo "Turning off filesystem quotas."
    /sbin/quotaoff -a
  fi
fi

# Carry a random seed between reboots.
echo "Saving random seed from /dev/urandom in /etc/random-seed."
# Use the pool size from /proc, or 512 bytes:
if [ -r /proc/sys/kernel/random/poolsize ]; then
  /bin/dd if=/dev/urandom of=/etc/random-seed count=1 bs=\$(cat /proc/sys/kernel/random/poolsize) 2> /dev/null
else
  /bin/dd if=/dev/urandom of=/etc/random-seed count=1 bs=512 2> /dev/null
fi
/bin/chmod 600 /etc/random-seed

# Before unmounting file systems write a reboot or halt record to wtmp.
\$command -w

# Clear /var/lock/subsys.
if [ -d /var/lock/subsys ]; then
  rm -f /var/lock/subsys/*
fi

# Turn off swap:
echo "Turning off swap."
/sbin/swapoff -a
/bin/sync

# Umount any LVM volumes:
if /bin/mount | /bin/grep -q '^/dev/mapper/' ; then
  #echo "Unmounting LVM volumes."
  /bin/umount -v \$(/bin/mount | /bin/grep '^/dev/mapper/' | /bin/cut -d ' ' -f 3 | /bin/tac)
fi

#echo "Unmounting local file systems."
#/bin/umount -v -a -t no,proc,sysfs

# We won't remount ro since we may want to edit from host system
#
#echo "Remounting root filesystem read-only."
#/bin/mount -v -n -o remount,ro /

# This never hurts:
/bin/sync

# Close any volumes opened by cryptsetup:
if [ -f /etc/crypttab -a -x /sbin/cryptsetup ]; then
  cat /etc/crypttab | grep -v "^#" | grep -v "^\$" | while read line; do
    # NOTE: we only support LUKS formatted volumes (except for swap)!
    LUKS=\$(echo \$line | tr '\t' ' ' | tr -s ' ' | cut -f1 -d' ')
    DEV=\$(echo \$line | tr '\t' ' ' | tr -s ' ' | cut -f2 -d' ')
    OPTS=\$(echo \$line | tr '\t' ' ' | tr -s ' ' | cut -f4 -d' ')
    if /sbin/cryptsetup isLuks \$DEV 2>/dev/null ; then
      echo "Locking LUKS crypt volume '\${LUKS}':"
      /sbin/cryptsetup luksClose \${LUKS}
    elif echo \$OPTS | grep -wq swap ; then
      # If any of the volumes was used as encrypted swap,
      # then run mkswap on the underlying device -
      # in case other Linux installations on this computer should use it:
      echo "Erasing encrypted swap '\${LUKS}' and restoring normal swap on \${DEV}:"
      /sbin/cryptsetup remove \${LUKS}
      mkswap \$DEV
    fi
  done
fi

# Deactivate LVM volume groups:
if [ -r /etc/lvmtab -o -d /etc/lvm/backup ]; then
  echo "Deactivating LVM volume groups:"
  /sbin/vgchange -an --ignorelockingfailure
fi

# This never hurts again (especially since root-on-LVM always fails
# to deactivate the / logical volume...  but at least it was
# remounted as read-only first)
/bin/sync

if [ ! \$container = "lxc" ]; then # Container check
if [ -x /sbin/genpowerd ]; then
  # See if this is a powerfail situation:
  if /bin/egrep -q "FAIL|SCRAM" /etc/upsstatus 2> /dev/null ; then
    # Signal UPS to shut off the inverter:
    /sbin/genpowerd -k
    if [ ! \$? = 0 ]; then
      echo
      echo "There was an error signaling the UPS."
      echo "Perhaps you need to edit /etc/genpowerd.conf to configure"
      echo "the serial line and UPS type."
      # Wasting 15 seconds of precious power:
      /bin/sleep 15
    fi
  fi
fi
else
	# Just verify the container has stopped
	echo ; echo "* LXC Container has stopped *"; echo
fi # End container check

if [ ! \$container = "lxc" ]; then
# Now halt (poweroff with APM or ACPI enabled kernels) or reboot.
if [ "\$command" = "reboot" ]; then
  echo "Rebooting."
  /sbin/reboot
fi
fi

EOF
	
	# Write modified rc.S
	cat >rc.S <<EOF
#!/bin/sh
#
# /etc/rc.d/rc.S:  System initialization script.
#
# Mostly written by:  Patrick J. Volkerding, <volkerdi@slackware.com>
#
# Modified by M0E-lnx for lxc compatibility.
# WARNING:  DO NOT use this script on a bare metal install

container="lxc"

PATH=/sbin:/usr/sbin:/bin:/usr/bin

# Container check
if [ ! \$container = "lxc" ]; then
# Try to mount /proc:
/sbin/mount -v proc /proc -n -t proc 2> /dev/null

# Mount sysfs next, if the kernel supports it:
if [ -d /sys ]; then
  if grep -wq sysfs /proc/filesystems ; then
    if ! grep -wq sysfs /proc/mounts ; then
      /sbin/mount -v sysfs /sys -n -t sysfs
    fi
  fi
fi

# Any /etc/mtab that exists here is old, so we delete it to start over:
/bin/rm -f /etc/mtab*
# Remounting the / partition will initialize the new /etc/mtab:
/sbin/mount -w -o remount /

# Read in the correct / filesystem complete with arguments so mount will
# show them correctly. This does not stop those arguments from functioning
# but does prevent a small bug with /etc/mtab.
/bin/grep ' / ' /proc/mounts | grep -v "^rootfs" > /etc/mtab

# Fix /etc/mtab to list sys and proc if they were not yet entered in
# /etc/mtab because / was still mounted read-only:
if [ -d /proc/sys ]; then
  /sbin/mount -f proc /proc -t proc
fi
if [ -d /sys/bus ]; then
  /sbin/mount -f sysfs /sys -t sysfs
fi

# Check all the non-root filesystems:
if [ ! -r /etc/fastboot ]; then
#  echo "Checking non-root filesystems:"
  /sbin/fsck \$FORCEFSCK -C -R -A -a 
fi
fi # End container check

if [ ! \$container = "lxc" ]; then # Container check.  We wont be using USB devices inside containers
# Mount usbfs:
if grep -wq usbfs /proc/filesystems; then
  if ! grep -wq usbfs /proc/mounts ; then
    if ! grep -wq usbfs /etc/fstab; then
      /sbin/mount -v usbfs /proc/bus/usb -t usbfs
    else
      /sbin/mount -v /proc/bus/usb
    fi
  fi
fi
fi # End of container check

# Mount non-root file systems in fstab, but not NFS or SMB 
# because TCP/IP is not yet configured, and not proc or sysfs
# because those have already been mounted.  Also check that
# devpts is not already mounted before attempting to mount
# it.  With a 2.6.x or newer kernel udev mounts devpts.
# We also need to wait a little bit to let USB and other
# hotplugged devices settle (sorry to slow down the boot):
# echo "Mounting non-root local filesystems:"
sleep 3
if /bin/grep -wq devpts /proc/mounts ; then
  /sbin/mount -a -v -t nonfs,nosmbfs,nocifs,noproc,nosysfs,nodevpts
else
  /sbin/mount -a -v -t nonfs,nosmbfs,nocifs,noproc,nosysfs
fi

# Clean up some temporary files:
rm -f /var/run/* /var/run/*/* /var/run/*/*/* /etc/nologin \
  /etc/dhcpc/*.pid /etc/forcefsck /etc/fastboot \
  /var/state/saslauthd/saslauthd.pid \
  /tmp/.Xauth* 1> /dev/null 2> /dev/null
  ( cd /var/log/setup/tmp && rm -rf * )
  ( cd /tmp && rm -rf kde-[a-zA-Z]* ksocket-[a-zA-Z]* hsperfdata_[a-zA-Z]* plugtmp* )

# Create /tmp/{.ICE-unix,.X11-unix} if they are not present:
if [ ! -e /tmp/.ICE-unix ]; then
  mkdir -p /tmp/.ICE-unix
  chmod 1777 /tmp/.ICE-unix
fi
if [ ! -e /tmp/.X11-unix ]; then
  mkdir -p /tmp/.X11-unix
  chmod 1777 /tmp/.X11-unix
fi

# Create a fresh utmp file:
touch /var/run/utmp
chown root:utmp /var/run/utmp
chmod 664 /var/run/utmp

# Update the current kernel level in the /etc/motd (Message Of The Day) file,
# if the first line of that file begins with the word 'Linux'.
# You are free to modify the rest of the file as you see fit.
if [ -x /bin/sed ]; then
  /bin/sed -i "{1s/^Linux.*/\$(/bin/uname -sr)\./}" /etc/motd
fi

# If there are SystemV init scripts for this runlevel, run them.
if [ -x /etc/rc.d/rc.sysvinit ]; then
  . /etc/rc.d/rc.sysvinit
fi

# Carry an entropy pool between reboots to improve randomness.
if [ -f /etc/random-seed ]; then
  echo "Using /etc/random-seed to initialize /dev/urandom."
  cat /etc/random-seed > /dev/urandom
fi
# Use the pool size from /proc, or 512 bytes:
if [ -r /proc/sys/kernel/random/poolsize ]; then
  dd if=/dev/urandom of=/etc/random-seed count=1 bs=\$(cat /proc/sys/kernel/random/poolsize) 2> /dev/null
else
  dd if=/dev/urandom of=/etc/random-seed count=1 bs=512 2> /dev/null
fi
chmod 600 /etc/random-seed

EOF

	# Write modified rc.M
	cat >rc.M <<EOF
#!/bin/sh
#
# rc.M		This file is executed by init(8) when the system is being
#		initialized for one of the "multi user" run levels (i.e.
#		levels 1 through 6).  It usually does mounting of file
#		systems et al.
#
# Version:	@(#)/etc/rc.d/rc.M	2.23	Wed Feb 26 19:20:58 PST 2003
#
# Author:	Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org>
#		Heavily modified by Patrick Volkerding <volkerdi@slackware.com>
#
# minor tweaks for an lxc container
# by Matteo Bernardini <ponce@slackbuilds.org>:
# a check for a container variable is made to jump sections
#
# Modified by M0E-lnx for lxc compatibility.
# WARNING:  DO NOT use this script on a bare metal install

container="lxc"

# Tell the viewers what's going to happen.
#echo "Going multiuser..."

# Update all the shared library links:
if [ -x /sbin/ldconfig ]; then
#  echo "Updating shared library links:  /sbin/ldconfig &"
  /sbin/ldconfig &
fi

# lxc container check
if [ ! \$container = "lxc" ]; then

# Screen blanks after 15 minutes idle time, and powers down in one hour
# if the kernel supports APM or ACPI power management:
/bin/setterm -blank 15 -powersave powerdown -powerdown 60

# Set the hostname.
if [ -r /etc/HOSTNAME ]; then
  /bin/hostname \$(cat /etc/HOSTNAME | cut -f1 -d .)
else
  # fall back on this old default:
  echo "darkstar.example.net" > /etc/HOSTNAME
  /bin/hostname darkstar
fi

fi # end container check

# Set the permissions on /var/log/dmesg according to whether the kernel
# permits non-root users to access kernel dmesg information:
if [ -r /proc/sys/kernel/dmesg_restrict ]; then
  if [ \$(cat /proc/sys/kernel/dmesg_restrict) = 1 ]; then
    touch /var/log/dmesg
    chmod 640 /var/log/dmesg
  fi
else
  touch /var/log/dmesg
  chmod 644 /var/log/dmesg
fi
# Save the contents of 'dmesg':
/bin/dmesg -s 65536 > /var/log/dmesg

if [ ! \$container = "lxc" ]; then # Container check.
# Initialize PCMCIA devices:
#
# NOTE: This used to be started near the top of rc.S so that PCMCIA devices
# could be fsck'ed along with the other drives.  This had some unfortunate
# side effects, however, since root isn't yet read-write, and /var might not
# even be mounted the .pid files can't be correctly written in /var/run and
# the pcmcia system can't be correctly shut down.  If you want some PCMCIA
# partition to be mounted at boot (or when the card is inserted) then add
# the appropriate lines to /etc/pcmcia/scsi.opts.
#
# Note that the stuff in /etc/pcmcia/ is only for 2.4.x kernels using
# 16-bit PCMCIA cards (not 32-bit Cardbus cards!).  For example, with a
# wireless card you might need to set options in /etc/pcmcia OR in
# /etc/rc.d/rc.wireless.conf, or even in /etc/rc.d/rc.inet1.conf (with
# extra options if needed for the encryption key, ESSID, etc.)
#
# Hopefully this situation will be unified in the future, but for now
# that's how it is...
#
if [ -x /etc/rc.d/rc.pcmcia ]; then
  . /etc/rc.d/rc.pcmcia start
  # The cards might need a little extra time here to initialize.
  sleep 5
fi

# Start the system logger.
if [ -x /etc/rc.d/rc.syslog -a -x /usr/sbin/syslogd -a -d /var/log ]; then
  . /etc/rc.d/rc.syslog start
fi
fi # End container check

# Update the X font indexes:
if [ -x /usr/bin/fc-cache ]; then
#  echo "Updating X font indexes:  /usr/bin/fc-cache -f &"
  /usr/bin/fc-cache -f &
fi

if [ ! \$container = "lxc" ]; then # Container check.  Udev should not be started
# Run rc.udev again.  This will start udev if it is not already running
# (for example, upon return from runlevel 1), otherwise it will trigger it
# to look for device changes and to generate persistent rules if needed.
if grep -wq sysfs /proc/mounts && grep -q tmpfs /proc/filesystems ; then
  if ! grep -wq nohotplug /proc/cmdline ; then
    if [ -x /etc/rc.d/rc.udev ]; then
      /bin/sh /etc/rc.d/rc.udev start
    fi
  fi
fi
fi # End container check

# Initialize the networking hardware.
if [ -x /etc/rc.d/rc.inet1 ]; then
  . /etc/rc.d/rc.inet1 start 
fi

if [ ! \$container = "lxc" ]; then # Container check
# Look for additional USB/SCSI/IEEE1394/etc devices on multiple LUNs:
if [ -x /etc/rc.d/rc.scanluns ]; then
  . /etc/rc.d/rc.scanluns
fi
fi # End container check

# Mount any additional filesystem types that haven't already been mounted:
mount -a -v 2> /dev/null | grep -v "already mounted"

# Start the Control Script for automounter:
if [ -x /etc/rc.d/rc.autofs ]; then
  sh /etc/rc.d/rc.autofs start
fi

# Start the Network Time Protocol daemon:
if [ -x /etc/rc.d/rc.ntpd ]; then
  sh /etc/rc.d/rc.ntpd start
fi

# Remove stale locks and junk files (must be done after mount -a!)
/bin/rm -f /var/lock/* /var/spool/uucp/LCK..* /tmp/.X*lock /tmp/core /core 2> /dev/null

# Remove stale hunt sockets so the game can start.
if [ -r /tmp/hunt -o -r /tmp/hunt.stats ]; then
  echo "Removing your stale hunt sockets from /tmp."
  /bin/rm -f /tmp/hunt*
fi

# Ensure basic filesystem permissions sanity.
chmod 755 / 2> /dev/null
chmod 1777 /tmp /var/tmp

# lxc container check
if [ ! \$container = "lxc" ]; then

# Start APM or ACPI daemon.
# If APM is enabled in the kernel, start apmd:
if [ -e /proc/apm ]; then
  if [ -x /usr/sbin/apmd ]; then
    echo "Starting APM daemon:  /usr/sbin/apmd"
    /usr/sbin/apmd
  fi
elif [ -x /etc/rc.d/rc.acpid ]; then # otherwise, start acpid:
  . /etc/rc.d/rc.acpid start
fi

fi # end container check

# Update any existing icon cache files:
if find /usr/share/icons 2> /dev/null | grep -q icon-theme.cache ; then
  for theme_dir in /usr/share/icons/* ; do
    if [ -r \${theme_dir}/icon-theme.cache ]; then
#      echo "Updating icon-theme.cache in \${theme_dir}..."
      /usr/bin/gtk-update-icon-cache -t -f \${theme_dir} 1> /dev/null 2> /dev/null &
    fi
  done
  # This would be a large file and probably shouldn't be there.
  if [ -r /usr/share/icons/icon-theme.cache ]; then
 #   echo "Deleting icon-theme.cache in /usr/share/icons..."
    #/usr/bin/gtk-update-icon-cache -t -f /usr/share/icons 1> /dev/null 2> /dev/null &
    rm -f /usr/share/icons/icon-theme.cache
  fi
fi

# Update mime database:
if [ -x /usr/bin/update-mime-database -a -d /usr/share/mime ]; then
#  echo "Updating MIME database:  /usr/bin/update-mime-database /usr/share/mime &"
  /usr/bin/update-mime-database /usr/share/mime 1> /dev/null 2> /dev/null &
fi

# Start D-Bus:
if [ -x /etc/rc.d/rc.messagebus ]; then
  sh /etc/rc.d/rc.messagebus start
fi

# Start console-kit-daemon:
if [ -x /etc/rc.d/rc.consolekit ]; then
  sh /etc/rc.d/rc.consolekit start
fi

# Start HAL:
if [ -x /etc/rc.d/rc.hald ]; then
  sh /etc/rc.d/rc.hald start
fi

# Start Bluetooth:
if [ -x /etc/rc.d/rc.bluetooth ]; then
  sh /etc/rc.d/rc.bluetooth start
fi

# Start wicd or networkmanager:
if [ -x /etc/rc.d/rc.wicd -a -x /usr/sbin/wicd ]; then
  sh /etc/rc.d/rc.wicd start
elif [ -x /etc/rc.d/rc.networkmanager ]; then
  sh /etc/rc.d/rc.networkmanager start
fi

# These GTK+/pango files need to be kept up to date for
# proper input method, pixbuf loaders, and font support.
if [ -x /usr/bin/update-gtk-immodules ]; then
  /usr/bin/update-gtk-immodules --verbose
fi
if [ -x /usr/bin/update-gdk-pixbuf-loaders ]; then
  /usr/bin/update-gdk-pixbuf-loaders --verbose
fi
if [ -x /usr/bin/update-pango-querymodules ]; then
  /usr/bin/update-pango-querymodules --verbose
fi

# Start dnsmasq, a simple DHCP/DNS server:
if [ -x /etc/rc.d/rc.dnsmasq ]; then
  /etc/rc.d/rc.dnsmasq start
fi

# Start snmpd:
if [ -x /etc/rc.d/rc.snmpd ]; then
  /etc/rc.d/rc.snmpd start
fi

# Start the print spooling system.  This will usually be LPRng (lpd) or CUPS.
if [ -x /etc/rc.d/rc.cups ]; then
  # Start CUPS:
  /etc/rc.d/rc.cups start
elif [ -x /etc/rc.d/rc.lprng ]; then
  # Start LPRng (lpd):
  . /etc/rc.d/rc.lprng start
fi

# Start netatalk. (a file/print server for Macs using Appletalk)
if [ -x /etc/rc.d/rc.atalk ]; then
  /etc/rc.d/rc.atalk start
fi

if [ ! \$container = "lxc" ]; then # Container Check
# If we're using udev, make /dev/cdrom and any other optical drive symlinks
# if some udev rule hasn't made them already:
if grep -wq sysfs /proc/mounts && grep -q tmpfs /proc/filesystems; then
  if ! grep -wq nohotplug /proc/cmdline ; then
    if [ -x /lib/udev/rc.optical-symlinks -a -x /etc/rc.d/rc.udev ]; then
      /bin/sh /lib/udev/rc.optical-symlinks
    fi
  fi
fi

# Monitor the UPS with genpowerd.
# To use this, uncomment this section and edit your settings in
# /etc/genpowerd.conf (serial device, UPS type, etc).  For more information,
# see "man genpowerd" or the extensive documentation in the
# /usr/doc/genpower-*/ directory.
# You'll also need to configure a similar block in /etc/rc.d/rc.6 if you want
# support for stopping the UPS's inverter after the machine halts.
#if [ -x /sbin/genpowerd ]; then
#  echo "Starting genpowerd daemon..."
#  /sbin/genpowerd
#fi
fi # End container check

# Turn on process accounting.  To enable process accounting, make sure the
# option for BSD process accounting is enabled in your kernel, and then
# create the file /var/log/pacct (touch /var/log/pacct).  By default, process
# accounting is not enabled (since /var/log/pacct does not exist).  This is
# because the log file can get VERY large.
if [ -x /sbin/accton -a -r /var/log/pacct ]; then
  chmod 640 /var/log/pacct
  /sbin/accton /var/log/pacct
fi

# Start crond (Dillon's crond):
# If you want cron to actually log activity to /var/log/cron, then change
# -l notice to -l info to increase the logging level.
if [ -x /usr/sbin/crond ]; then
  /usr/sbin/crond -l notice
fi

# Start atd (manages jobs scheduled with 'at'):
if [ -x /usr/sbin/atd ]; then
  /usr/sbin/atd -b 15 -l 1
fi


# Check quotas and then turn quota system on:
if grep -q quota /etc/fstab ; then
  for quotafs in \$(awk '/quota/ {print \$2}' /etc/fstab) ; do
    /bin/rm -f \$quotafs/{a,}quota.{group,user}.new
  done
  if [ -x /sbin/quotacheck ]; then
    echo "Checking filesystem quotas:  /sbin/quotacheck -avugm"
    /sbin/quotacheck -avugm
  fi
  if [ -x /sbin/quotaon ]; then
    echo "Activating filesystem quotas:  /sbin/quotaon -avug"
    /sbin/quotaon -avug
  fi
fi

# Start the SASL authentication server.  This provides SASL
# authentication services for sendmail:
if [ -x /etc/rc.d/rc.saslauthd ]; then
  . /etc/rc.d/rc.saslauthd start
fi

# Start the sendmail daemon:
if [ -x /etc/rc.d/rc.sendmail ]; then
  . /etc/rc.d/rc.sendmail start
fi

if [ ! \$container = "lxc" ]; then # Sound in the lxc container?  Hah!.. no way
# Load ALSA (sound) defaults:
if [ -x /etc/rc.d/rc.alsa ]; then
  . /etc/rc.d/rc.alsa start 
fi
fi # End container check

if [ ! \$container = "lxc" ]; then # Container check
# Load a custom screen font if the user has an rc.font script.
if [ -x /etc/rc.d/rc.font ]; then
  . /etc/rc.d/rc.font
fi
fi # End container check

# Load a custom keymap if the user has an rc.keymap script.
if [ -x /etc/rc.d/rc.keymap ]; then
  . /etc/rc.d/rc.keymap
fi

# Start the MySQL database:
if [ -x /etc/rc.d/rc.mysqld ]; then
  . /etc/rc.d/rc.mysqld start
fi

# Start Apache web server:
if [ -x /etc/rc.d/rc.httpd ]; then
  . /etc/rc.d/rc.httpd start
fi

# Start OpenLDAP:
if [ -x /etc/rc.d/rc.openldap ]; then
  . /etc/rc.d/rc.openldap start
fi

# Start Samba (a file/print server for Win95/NT machines).
# Samba can be started in /etc/inetd.conf instead.
if [ -x /etc/rc.d/rc.samba ]; then
  . /etc/rc.d/rc.samba start
fi

# Start the GPM mouse server:
if [ -x /etc/rc.d/rc.gpm ]; then
  . /etc/rc.d/rc.gpm start
fi

# If there are SystemV init scripts for this runlevel, run them.
if [ -x /etc/rc.d/rc.sysvinit ]; then
  . /etc/rc.d/rc.sysvinit
fi

# Start the local setup procedure.
if [ -x /etc/rc.d/rc.local ]; then
  . /etc/rc.d/rc.local
fi

# All done.

EOF

	# Overwrite the default inittab 
	cat > $rootfs/etc/inittab <<EOF
#/etc/inittab
# inittab	This file describes how the INIT process should set up
#		the system in a certain run-level.
#
# Version:	@(#)inittab		2.04	17/05/93	MvS
#                                       2.10    02/10/95        PV
#                                       3.00    02/06/1999      PV
#                                       4.00    04/10/2002      PV
#                                      13.37    2011-03-25      PJV
#
# Author:	Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified by:	Patrick J. Volkerding, <volkerdi@slackware.com>
#

# These are the default runlevels in Slackware:
#   0 = halt
#   1 = single user mode
#   2 = unused (but configured the same as runlevel 3)
#   3 = multiuser mode (default Slackware runlevel)
#   4 = X11 with KDM/GDM/XDM (session managers)
#   5 = unused (but configured the same as runlevel 3)
#   6 = reboot

# Default runlevel. (Do not set to 0 or 6)
id:3:initdefault:

# System initialization (runs when system boots).
si:S:sysinit:/etc/rc.d/rc.S

# Script to run when going single user (runlevel 1).
su:1S:wait:/etc/rc.d/rc.K

# Script to run when going multi user.
rc:2345:wait:/etc/rc.d/rc.M

# Runlevel 0 halts the system.
l0:0:wait:/etc/rc.d/rc.0

# Runlevel 6 reboots the system.
l6:6:wait:/etc/rc.d/rc.6


# These are the standard console login getties in multiuser mode:
c1:12345:respawn:/sbin/mingetty tty1
c2:12345:respawn:/sbin/mingetty tty2


# End of /etc/inittab
EOF
	
	# Overwrite the default rc.local
	cat > rc.local <<EOF
#!/bin/sh
# rc.local
# This file is provided for custom initialisation because
# Admin is not encouraged to touch rc.S or rc.M.
#
# This file is launched on the end of entering multi user mode (2-5)
# load functions
. /etc/rc.d/functions-display

PATH="/bin:/sbin:/usr/bin:/usr/sbin:\$PATH"
# /etc/rc.d/rc.inet1 start 

EOF

	# Link rc.6 to rc.0
	ln -sf rc.6 rc.0
	# Disable the annoying text progress indicator
	chmod -x rc.text
	# Enable the ssh service to be managed by the init scripts
	chmod +x init.d/sshd
	# Make sure inet1 is execurable
	if [ -f rc.inet1 ]; then
		chmod +x rc.inet1 
	fi
	# Disable all service except ssh for all runlevels
	for i in 0 1 2 3 4 5 6; do
		(cd rc${i}.d
			rm -rf *
			ln -sf ../init.d/sshd K48sshd
			ln -sf ../init.d/sshd S52sshd
		)
	done
		
)
}

function pkglist() {
	PKGLIST=""
	case $VL_VERSION in
		"7.0")
		PKGLIST="aaa_base aaa_elflibs aaa_terminfo bash bin bzip2 coreutils \
dhcpcd dialog diffutils e2fsprogs nano etc findutils gawk glibc-solibs gnupg grep \
gzip iputils logrotate net-tools network-scripts ncurses openssh pkgtools-tukaani \
procps sed shadow sharutils sysklogd sysvinit sysvinit-functions tar udev \
util-linux wget which xz vlinit slapt-get file openssl-solibs curl gpgme libgpg-error libassuan \
cyrus-sasl traceroute mingetty rtmpdump"
		;;
		"7.1"|"7.2")
		PKGLIST="aaa_base aaa_elflibs aaa_terminfo bash bin bzip2 coreutils \
dhcpcd dialog diffutils e2fsprogs nano etc findutils gawk glibc gnupg grep \
gzip iputils logrotate net-tools network-scripts ncurses openssh pkgtools-tukaani \
procps sed shadow sharutils sysklogd sysvinit sysvinit-functions tar udev \
util-linux wget which xz vlinit slapt-get file openssl curl gpgme libgpg-error libassuan \
cyrus-sasl traceroute mingetty zlib tcp_wrappers texinfo gnutls texinfo gettext-tools"
		;;
	esac
	echo $PKGLIST
}

function install_vector() {
	echo "Running some tests on the host ..."
	res=$(test_host)
	if [ ! $res = "YES" ]; then
		echo ;
		echo "This system cannot host a Vectorlinux or VLocity container."
		echo "HINT:  slapt-get and/or installpkg is missing"
		echo ;
		exit 1
	fi
	echo "Host tests PASSED... Creating container."
	echo ;
	path=$1
	name=$2
	_CACHE=$VL_CACHE #$path/cache 
	mkdir -p $_CACHE || exit 1
	_SLAPTGETRC=${_SLAPTGETRC:-"$_CACHE/slapt-getrc.lxc"}
	_ROOT=$path/rootfs

	# WRITE SLAPT-GETRC
	rm -f $_SLAPTGETRC # Remove old one just in case
	for line in $(echo `slaptconfig`); do
		echo $line >> $_SLAPTGETRC
	done

# Get the package list for the desired version
PKGLIST=$(echo `pkglist`)

mkdir -p $_ROOT/rootfs
# Clean out previous installs
rm -fR $_ROOT/*

# Update slapt-get 
$SLAPTGET -c $_SLAPTGETRC -u || exit 1

# Download the stuff
for component in $PKGLIST; do
	$SLAPTGET -c $_SLAPTGETRC -i -d --no-dep --reinstall $component || exit 1
done

# Find out what kind of structure we have in the cache dir
if [ "x$(grep vlcore $_SLAPTGETRC)" = "x" ]; then
	cache_base="$_CACHE/veclinux/packages/*"
else
	cache_base="$_CACHE/veclinux/packages"
fi
# Install the stuff
for component in $PKGLIST; do
	$INSTALLPKG --root $_ROOT $cache_base/$component-*.t?z || exit 1
done

# Fix the init system in the container
configure_container_init $_ROOT $name

# Write the default /etc/passwd file
cat > $_ROOT/etc/passwd <<EOF
root:x:0:0:root:/root:/bin/bash
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
EOF

# Install the slapt-getrc used for install in the target
cat $_SLAPTGETRC > $_ROOT/etc/slapt-get/slapt-getrc
# Fix the working dir in the containers slapt-getrc
sed -i "s|WORKINGDIR=.*|WORKINGDIR=/home/ftp/pub/veclinux/packages|g" $_ROOT/etc/slapt-get/slapt-getrc

# Write a fake vector version
echo "VectorLinux | VLocity $VL_VERSION $VL_ARCH LXC Container installed on $(date +%D)" > $_ROOT/etc/vector-version

# Touch a fake vlconfig2 because packaging requires this
case $VL_ARCH in 
	i[3456]86 | x86)
		pkgarch="i586"
			# Install fake uname. This amkes compiles work on 64-bit hosts
		mv $_ROOT/bin/uname $_ROOT/bin/uname.bin
		cat >$_ROOT/bin/uname <<EOUNAME
#!/bin/bash
if [ "\$1" = "-m" ]; then
	echo "i686"
else
	/bin/uname.bin \$@
fi
EOUNAME
	# Set the fake uname executable
	chmod +x $_ROOT/bin/uname
		;;
	x86_64)
		pkgarch="x86_64"
		;;
	*)
		pkgarch="noarch"
		#FIXME: ^^ This should still be acceptable for vlconfig2
		;;
esac
		
touch $_ROOT/var/log/packages/vlconfig2-${VL_VERSION}-${pkgarch}-1vl$(echo $VL_VERSION |sed 's|\.||g')

#cleanup the cache dir
rm -rf $_CACHE
}

function configure_container() {
	rootfs=$1
	hostname=$2
	
	(cd $rootfs; chmod 0755 ./ )
	(cd $rootfs; chmod 0755 ./var )
	
	if [ -d $rootfs/usr/src/linux ]; then
		chmod 0755 $rootfs/usr/src/linux
	fi
	if [ ! -d $rootfs/proc ]; then
		mkdir $rootfs/proc
		chown root.root $rootfs/proc
	fi
	if [ ! -d $rootfs/sys ]; then
		mkdir $rootfs/sys
		chown root.root $rootfs/sys
	fi
	chmod 1777 $rootfs/tmp
	if [ ! -d $rootfs/var/spool/mail ]; then
		mkdir -p $rootfs/var/spool/mail
		chmod 0755 $rootfs/var/spool
		chown root.mail $rootfs/var/spool/mail
		chmod 1777 $rootfs/var/spool/mail
	fi
	
	echo <<FIN > $rootfs/etc/rc.d/rc.keymap
#!/bin/bash
# Load the keyboard map.  More maps are in /usr/share/kbd/keymaps."
if [ -x /usr/bin/loadkeys ]; then
	/usr/bin/loadkeys us
fi
FIN
	chmod 0755 $rootfs/etc/rc.d/rc.keymap

	
	# Network configuration is left to the user, that have to edit
	# /etc/rc.d/rc.inet1.conf and /etc/resolv.conf of the container
	# just set the hostname
	echo "$hostname.vector-lxc.net" > $rootfs/etc/HOSTNAME
	cp $rootfs/etc/HOSTNAME $rootfs/etc/hostname
	
	# make needed devices, from Chris Willing's MAKEDEV.sh
	# http://www.vislab.uq.edu.au/howto/lxc/MAKEDEV.sh
	DEV=$rootfs/dev
	mkdir -p ${DEV}
	mknod -m 666 ${DEV}/null c 1 3
	mknod -m 666 ${DEV}/zero c 1 5
	mknod -m 666 ${DEV}/random c 1 8
	mknod -m 666 ${DEV}/urandom c 1 9
	mkdir -m 755 ${DEV}/pts
	mkdir -m 1777 ${DEV}/shm
	mknod -m 666 ${DEV}/tty c 5 0
	mknod -m 600 ${DEV}/console c 5 1
	mknod -m 666 ${DEV}/tty0 c 4 0
	mknod -m 666 ${DEV}/tty1 c 4 1
	mknod -m 666 ${DEV}/tty2 c 4 2
	mknod -m 666 ${DEV}/tty3 c 4 3
	mknod -m 666 ${DEV}/tty4 c 4 4
	mknod -m 666 ${DEV}/tty5 c 4 5
	mknod -m 666 ${DEV}/full c 1 7
	mknod -m 600 ${DEV}/initctl p
	mknod -m 660 ${DEV}/loop0 b 7 0
	mknod -m 660 ${DEV}/loop1 b 7 1
	ln -s pts/ptmx ${DEV}/ptmx
	ln -s /proc/self/fd ${DEV}/fd

	# FSTAB
	
	echo "Adding an etc/fstab that must be modified later with the"
	echo "full path of the container if you decide to move it."
#	cat >$rootfs/etc/fstab <<EOF
	cat >$rootfs/../fstab <<EOF
## NOT USED ON CONTAINERS.
## See lxc.moun.entry entires in config file
#lxcpts $rootfs/dev/pts devpts defaults,newinstance 0 0
#none $rootfs/proc    proc   defaults 0 0
#none $rootfs/sys     sysfs  defaults 0 0
#none /dev/shm tmpfs  defaults 0 0
EOF

		cat >$rootfs/../config <<CONTCONFIG
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0
lxc.network.hwaddr = 02:aa:11:bb:2c:1a

lxc.utsname = @UTSNAME@

lxc.mount = /var/lib/lxc/@UTSNAME@/fstab
lxc.mount.entry = lxcpts dev/pts devpts defaults,newinstance 0 0
lxc.mount.entry = none proc proc defaults 0 0
lxc.mount.entry = none sys sysfs defaults 0 0
lxc.mount.entry = tmpfs dev/shm tmpfs defaults 0 0

lxc.tty = 6
lxc.pts = 1024
lxc.rootfs = /var/lib/lxc/@UTSNAME@/rootfs

lxc.cgroup.devices.deny = a
# /dev/null and zero
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
# consoles
lxc.cgroup.devices.allow = c 5:1 rwm
lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 4:0 rwm
lxc.cgroup.devices.allow = c 4:1 rwm
# /dev/{,u}random
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 136:* rwm
lxc.cgroup.devices.allow = c 5:2 rwm
# rtc
lxc.cgroup.devices.allow = c 254:0 rwm

# loop devices
lxc.cgroup.devices.allow = b 7:* rwm
lxc.cgroup.devices.allow = c 10:237 rwm
# we don't trust even the root user in the container, better safe than sorry.
# comment out only if you know what you're doing.
lxc.cap.drop = sys_module mknod mac_override mac_admin sys_time setfcap setpcap sys_boot

# you can try also this alternative to the line above, whatever suits you better.
# lxc.cap.drop=sys_admin
		
CONTCONFIG
	
	# Set a good default dns server
	echo "nameserver 8.8.8.8" > $rootfs/etc/resolv.conf

	# Disable some unneeded services starting up
	chmod a-x $rootfs/etc/rc.d/rc.{gpm,udev,wireless,yp} >/dev/null 2>&1

	# add a message to rc.local that confirms successful container startup
	echo "echo ; echo \"* container $name started. *\" ; echo" >> $rootfs/etc/rc.d/rc.local

	# set a default combination for the luggage
	echo "root:root" | chroot $rootfs chpasswd
	echo "Root default password is 'root', please change it!"
	
}

function usage() {

    cat <<EOF
$1 -h|--help -p|--path=<path>

Creates LXC containers for Vectorlinux and VLocity versions 7.0 and later.

Behaviour control:  Set the following variables to alter behaviour

VL_VERSION 
  Set this to the Vector or VLocity version you want to create container for.
VL_ARCH 
  Set this to which ever architecture the container should be

Example:
VL_VERSION="7.0" VL_ARCH="i586" $0 -n container_name -t vector
^^ That would create a vector 7.0 i586 container ^^

See lxc-create --help for more.
EOF
    return 0
}

function create_container {
	rootpath=$1
	contname=$2
	install_vector $rootpath $contname
	configure_container $rootpath/rootfs "vector"
	# fix the config file
	conf=$rootpath/config
	sed -i "s|@UTSNAME@|${contname}|g" $conf
	
	exit 0
}

trap "{ echo ; echo; echo 'Cleaning up ...'; echo ; rm -rf $VL_CACHE; exit 255; }" SIGINT SIGTERM

options=$(getopt -o hp:n: -l help,path:,name: -- "$@")
if [ $? -ne 0 ]; then
        usage $(basename $0)
    exit 1
fi
eval set -- "$options"

while true
do
    case "$1" in
        -h|--help)      usage $0 && exit 0;;
        -p|--path)      path=$2; shift 2;;
        -n|--name)      name=$2; shift 2;;
        --)             shift 1; break ;;
        *)              break ;;
    esac
done

# Check to make sure we got correct values for VL_VERSION and VL_ARCH
case $VL_ARCH in
	x86)
		export VL_ARCH="i586"
		;;
	i?86)
		# This is OK... continue
		export VL_ARCH="i586"
		;;
	x86_64)
		export VL_ARCH="x86_64"
		;;
	amd64)
		export VL_ARCH="x86_64"
		;;
	*)
		echo "Invalid VL_ARCH value. "
		echo "This template only supports i586 and x86_64"
		echo ;
		exit 1
		;;
esac

case $VL_VERSION in
	"7.0" | "7.1" | "7.2")
		;;
	*)
		echo "Invalid VL_VERSION value.  This template only supports 7.0 and later"
		echo ;
		exit 1
		;;
esac

create_container $path $name
