#!/usr/bin/perl
## nappit add-on phpvbox
## 2013-10-31, written by zos

#######################################################
## Setup phpvbox (Oracle VirtualBox + phpvirtualbox) ##
#######################################################

###########
# root only 
###########
	$ant=`whoami`;
	chomp $ant;

	if ($ant ne "root") {
		print "user $ant not allowed\nlogin as root or su and run setup again!";
		exit;
	}

#########################	
# run from $HOME ie /root
#########################
	$t=`pwd`;
	$ant=`echo \$HOME`;
	
	if ($t ne $ant){
		print "\n\n#####################\nYou must call wget as from your \$HOME-directory.\n Please do a cd /\$HOME and try again.\n\n";
		exit;
	}

	if (-f "$ant/vbox.log") {
	  `rm $ant/vbox.log`;
	}
	
##############################	
# check if file php.ini exists
##############################
	if (!(-f '/opt/local/etc/php.ini')) {
		print "\n\n#####################\nFile /opt/local/etc/php.ini not found !\n\n\n";
		print "\n\n#####################\nPlease install AMP-stack first (wget -O - www.napp-it.org/ampo | perl)\n\n\n";
		exit;
	}
	
######
# Date
######
 ($sec,$min,$hour,$mday,$mon,$year,$wday,$ydat,$isdst) = localtime(time);
 $mon++;
 if ($min < 10)  { $min  = "0$min";  }
 if ($hour < 10) { $hour = "0$hour"; }
 if ($mday < 10) { $mday = "0$mday"; }
 if ($mon < 10)  { $mon  = "0$mon";  }
 $year=1900+$year;

##############
# Startmessage
##############
	$t=`echo \$HOME`;
	chomp($t);        # remove newline
	print "\n"x10;
	print "***************************************************************************\n";
	print "**    Setup napp-it phpvbox ZFS Server addon Ver. 0.5 beta - Oct 2013    **\n";
	print "**    intended for OmniOS                                                **\n";
	print "***************************************************************************\n";
	print "**    Install Oracle VirtulaBox 4.3, phpvirtualbox 4.3                   **\n";
	print "***************************************************************************\n\n";
	print "**    Actions (logfile $t/vbox.log):\n";
	print "***************************************************************************\n\n\n";
	print "*  \n";
	sleep(3);
	print " 3 \n"; sleep(2);
	print " 2 \n"; sleep(2);
	print " 1 \n"; sleep(2);
	print "\n"x10;

####################
## step 1: create BE
####################
	&log1("step 1: Create pre-setup BootEnvironment\n");
	
    # Create BE pre setup
    $t=time();
    $r=`beadm create pre_vbox_setup_$t`;
    &log2("beadm create pre_vbox_setup_$t");
    &log2($r);
	$r=`beadm list`;
	
####################
# step 2: VirtualBox
####################
	&log1("step 2: VirtualBox\n");

###################################	
# step 2.1: VirtualBox Installation
###################################
    &log1("step 2.1: VirtualBox Installation\n");

	# Download VirtualBox if not existing as already completed download-file in /root
	if (!(-f '/root/VirtualBox-4.3.0-89960-SunOS.complete.tar.gz')) {
		# Download VirtualBox
		&log2('wget http://download.virtualbox.org/virtualbox/4.3.0/VirtualBox-4.3.0-89960-SunOS.tar.gz');
		$r=`wget http://download.virtualbox.org/virtualbox/4.3.0/VirtualBox-4.3.0-89960-SunOS.tar.gz`;
		&log2($r); 
		# Rename VirtualBox, download complete
		&log2('mv VirtualBox-4.3.0-89960-SunOS.tar.gz VirtualBox-4.3.0-89960-SunOS.complete.tar.gz');  
		$r=`mv VirtualBox-4.3.0-89960-SunOS.tar.gz VirtualBox-4.3.0-89960-SunOS.complete.tar.gz`;
		&log2($r); 
	}
	
	# Unpack VirtualBox
    &log2('tar xvzf VirtualBox-4.3.0-89960-SunOS.complete.tar.gz');    
	$r=`tar xvzf VirtualBox-4.3.0-89960-SunOS.complete.tar.gz`;
    &log2($r); 
    
	# Set parameter for installation of the older stream-based network driver
    &log2('touch /etc/vboxinst_vboxflt');   
    $r=`touch /etc/vboxinst_vboxflt`;
    &log2($r); 
	
    # Install VirtualBox (non interactive mode)
    &log2('pkgadd -d VirtualBox-4.3.0-SunOS-amd64-r89960.pkg -n -a autoresponse SUNWvbox');
    $r=`pkgadd -d VirtualBox-4.3.0-SunOS-amd64-r89960.pkg -n -a autoresponse SUNWvbox`;
    &log2($r);
    
####################################
# step 2.2: VirtualBox Configuration
####################################
    &log1("step 2.2: VirtualBox Configuration\n");

    # Add user "vbox"
    &log2('useradd -s /bin/bash -G vboxuser -d /export/home/vbox -m vbox');
    $r=`useradd -s /bin/bash -G vboxuser -d /export/home/vbox -m vbox`;
    &log2($r);
	
    # Set VirtualBox authlibrary to null
	&log2('sudo -u vbox /opt/VirtualBox/VBoxManage setproperty websrvauthlibrary null');
	$r=`sudo -u vbox /opt/VirtualBox/VBoxManage setproperty websrvauthlibrary null`;
	&log2($r);
	
	# Set user "vbox" as webservice-user in VirtualBox configuration
    &log2('svccfg -s svc:/application/virtualbox/webservice:default setprop config/user=vbox');
    $r=`svccfg -s svc:/application/virtualbox/webservice:default setprop config/user=vbox`;
    &log2($r);
	
	# Refresh VirtualBox webservice settings
    &log2('svcadm refresh svc:/application/virtualbox/webservice:default');
    $r=`svcadm refresh svc:/application/virtualbox/webservice:default`;
    &log2($r);	
	
#####################################	
# step 2.3: VirtualBox Extension Pack
#####################################
    &log1("step 2.3: VirtualBox Extension Pack\n");
	
	# Download VirtualBox Extension Pack if not existing as already completed download-file in /root
	if (!(-f '/root/Oracle_VM_VirtualBox_Extension_Pack-4.3.0-89960.complete.vbox-extpack')) {
		# Download VirtualBox Extension Pack
		&log2('wget http://download.virtualbox.org/virtualbox/4.3.0/Oracle_VM_VirtualBox_Extension_Pack-4.3.0-89960.vbox-extpack');
		$r=`wget http://download.virtualbox.org/virtualbox/4.3.0/Oracle_VM_VirtualBox_Extension_Pack-4.3.0-89960.vbox-extpack`;
		&log2($r); 
		# Rename VirtualBox, download complete
		$r=`mv Oracle_VM_VirtualBox_Extension_Pack-4.3.0-89960.vbox-extpack Oracle_VM_VirtualBox_Extension_Pack-4.3.0-89960.complete.vbox-extpack`;
		&log2('mv Oracle_VM_VirtualBox_Extension_Pack-4.3.0-89960.vbox-extpack Oracle_VM_VirtualBox_Extension_Pack-4.3.0-89960.complete.vbox-extpack');    
		&log2($r); 
	}

    # Install VirtualBox Extension Pack
    &log2('/opt/VirtualBox/VBoxManage extpack install /root/Oracle_VM_VirtualBox_Extension_Pack-4.3.0-89960.complete.vbox-extpack'); 
    $r=`/opt/VirtualBox/VBoxManage extpack install /root/Oracle_VM_VirtualBox_Extension_Pack-4.3.0-89960.complete.vbox-extpack`;
	&log2($r);
	
########################
## step 3: phpVirtualBox
########################
    &log1("step 3: phpVirtualBox\n");

######################################	
# step 3.1: phpVirtualBox Installation
######################################	
    &log1("step 3.1: phpVirtualBox Installation\n");

	# Download phpVirtualBox if not existing as already completed download-file in /root
	if (!(-f '/opt/local/share/phpvirtualbox-4.3-0.complete.zip')) {
		# Download VirtualBox Extension Pack
		&log2('wget -P /opt/local/share/ http://sourceforge.net/projects/phpvirtualbox/files/phpvirtualbox-4.3-0.zip');
		$r=`wget -P /opt/local/share/ http://sourceforge.net/projects/phpvirtualbox/files/phpvirtualbox-4.3-0.zip`;
		&log2($r); 
		# Rename VirtualBox, download complete
		&log2('mv /opt/local/share/phpvirtualbox-4.3-0.zip /opt/local/share/phpvirtualbox-4.3-0.complete.zip');   
		$r=`mv /opt/local/share/phpvirtualbox-4.3-0.zip /opt/local/share/phpvirtualbox-4.3-0.complete.zip`;
		&log2($r); 
	}

	if (!(-d '/opt/local/share/phpvirtualbox')) {
		# Create directory phpvirtualbox if not existing
		&log2('mkdir /opt/local/share/phpvirtualbox/');
		$r=`mkdir /opt/local/share/phpvirtualbox/`;
		&log2($r);
	} else {
		&log2('NOTE: dir /opt/local/share/phpvirtualbox/ already exists');
	}

	# Unzip phpVirtualBox
	&log2('unzip /opt/local/share/phpvirtualbox-4.3-0.complete.zip -d /opt/local/share/phpvirtualbox/');
	$r=`unzip /opt/local/share/phpvirtualbox-4.3-0.complete.zip -d /opt/local/share/phpvirtualbox/`;
	&log2($r);

	# Sometimes phpvirtualbox.zip contains folder phpvirtualbox already, this nested structure is the result
	if (-d '/opt/local/share/phpvirtualbox/phpvirtualbox') {
	# Move all files to parent folder phpvirtualbox
		&log2('mv /opt/local/share/phpvirtualbox/phpvirtualbox/* /opt/local/share/phpvirtualbox/');
		$r=`mv /opt/local/share/phpvirtualbox/phpvirtualbox/* /opt/local/share/phpvirtualbox/`;
		&log2($r);
		# Remove empty subfolder phpvirtualbox
		&log2('rmdir /opt/local/share/phpvirtualbox/phpvirtualbox/');	
		$r=`rmdir /opt/local/share/phpvirtualbox/phpvirtualbox/`;
		&log2($r);			
	}

#######################################	
# step 3.2: phpVirtualBox Configuration
#######################################		
    &log1("step 3.2: phpVirtualBox Configuration\n");
	
	if (!(-d '/opt/local/etc/phpvirtualbox')) {
		&log2('mkdir /opt/local/etc/phpvirtualbox/');
		$r=`mkdir /opt/local/etc/phpvirtualbox/`;
		&log2($r);
		} else {
		&log2('NOTE: dir /opt/local/etc/phpvirtualbox/ already exists');
	}
	
	if (!(-f "/opt/local/etc/phpvirtualbox/config.php")) {
		&log2('cp /opt/local/share/phpvirtualbox/config.php-example /opt/local/etc/phpvirtualbox/config.php');
		$r=`cp /opt/local/share/phpvirtualbox/config.php-example /opt/local/etc/phpvirtualbox/config.php`;
		&log2($r);
	} else {
		&log2('NOTE: file /opt/local/etc/phpvirtualbox/config.php already exists');
	}
	
	if (!(-l "/opt/local/share/phpvirtualbox/config.php")) {
		&log2('ln -s /opt/local/etc/phpvirtualbox/config.php /opt/local/share/phpvirtualbox/config.php');
		$r=`ln -s /opt/local/etc/phpvirtualbox/config.php /opt/local/share/phpvirtualbox/config.php`;
		&log2($r);
	} else {
		&log2('NOTE: link /opt/local/share/phpvirtualbox/config.php already exists');
	}

#######################################	
# step 3.3: Update Apache Configuration
#######################################
    &log1("step 3.3: Update Apache Configuration\n");

	# Check existing Include for phpvirtualbox in httpd.conf
	&log2('cat /opt/local/etc/httpd/httpd.conf');
	$r=`cat /opt/local/etc/httpd/httpd.conf`;

	
	# Add Include for phpvirtualbox to httpd.conf if not existing
	if (!($r=~/\nInclude \/opt\/local\/etc\/httpd\/httpd_phpvirtualbox.conf/s))  {
		# Backup httpd.conf
		if (!(-f "/opt/local/etc/httpd/httpd.conf.pre.phpvirtualbox")) {
			&log2('cp /opt/local/etc/httpd/httpd.conf /opt/local/etc/httpd/httpd.conf.pre.phpvirtualbox');
			$r=`cp /opt/local/etc/httpd/httpd.conf /opt/local/etc/httpd/httpd.conf.pre.phpvirtualbox`;
			&log2($r);
		} else {
		&log2('NOTE: "File /opt/local/etc/httpd/httpd.conf.pre.phpvirtualbox already exists');
		}
		# Add Include to httpd.conf
		&log2('Add "Include /opt/local/etc/httpd/httpd_phpvirtualbox.conf" to httpd.conf');	
		open (M, ">>/opt/local/etc/httpd/httpd.conf");
			print M "\n# add this to make phpvirtualbox accessible through http://www.domain.com/phpvirtualbox/\n";
			print M "Include /opt/local/etc/httpd/httpd_phpvirtualbox.conf\n";
		close (M);
	} else {
		&log2('NOTE: "Include /opt/local/etc/httpd/httpd_phpvirtualbox.conf" in httpd.conf already exists');
	}

	# Create file httpd_phpvirtualbox.conf if not existing
	if (!(-f "/opt/local/etc/httpd/httpd_phpvirtualbox.conf")) {
		&log2('Create file "/opt/local/etc/httpd/httpd_phpvirtualbox.conf"');	
	$r=<<Eof;	
# phpvirtualbox configuration
<IfModule mod_alias.c>
	Alias /phpvirtualbox /opt/local/share/phpvirtualbox
</IfModule>

<Directory "/opt/local/share/phpvirtualbox">
	DirectoryIndex index.html
	Options All
	AllowOverride All
	Require all granted
</Directory>
Eof
		# Write file httpd_phpvirtualbox.conf
		open (M, ">/opt/local/etc/httpd/httpd_phpvirtualbox.conf");
			print M "$r";
		close (M);
	} else {
		&log2('NOTE: file /opt/local/etc/httpd/httpd_phpvirtualbox.conf already exists');
	}

##############################	
# step 4: Bringing up services
##############################		
    &log1("step 4: Bringing up services\n");

	&log2("\nRestart Apache:\n");
    $r=`svcadm disable apache`;
    &log2('svcadm disable apache');
	&log2($r);
    sleep (2);
    $r=`svcadm enable apache`;
    &log2('svcadm enable apache');
	&log2($r);
    sleep (2);
    print `svcs apache`;
    sleep(3);

	&log2("\nRestart vboxwebsrv:\n");
	`svcadm disable svc:/application/virtualbox/webservice:default`;
    &log2('svcadm disable svc:/application/virtualbox/webservice:default');
	&log2($r);
    sleep (2);
    `svcadm enable svc:/application/virtualbox/webservice:default`;
    &log2('svcadm enable svc:/application/virtualbox/webservice:default');
	&log2($r);
    sleep (2);
    print `svcs svc:/application/virtualbox/webservice:default`;
    sleep(3);

############
# Endmessage
############
	$t=`echo \$HOME`;
	chomp($t);        # remove newline
	print "\n"x10;
	print "****************************************************************************\n";
	print "**   Setup napp-it phpvbox ZFS Server finished!                           **\n";
	print "****************************************************************************\n";
	print "**   Actions:                                                             **\n";
	print "**   ========                                                             **\n";
	print "**   (1) Start your webbrowser and enter http://<ServerIP>/phpvirtualbox  **\n";
	print "**                                                                        **\n";
	print "**   (2) Enter user 'admin' and password 'admin' in Login-Box             **\n";
	print "**                                                                        **\n";
	print "****************************************************************************\n";
	print "**   Manual VirtualBox : https://www.virtualbox.org/manual/               **\n";	
	print "**   Wiki phpvirtualbox: http://sourceforge.net/p/phpvirtualbox/wiki/Home **\n";	
	print "****************************************************************************\n";
    print "**   For detailed setup information see: $t/vbox.log\n";
	print "****************************************************************************\n";  
    exit;

############### new main action
sub log1 {
###############
    my $t=$_[0];
    $t="\n\n----------------\n$t\n----------------\n\n";
    &log2($t);
  }

############### log and print
sub log2 {
###############
  my $r=`echo \$HOME`;
  chomp $r;
      my $t=$_[0];
      $t=~s/\s+$//gs;
      $t.="\n";
      print $t;
      open (M, ">>$r/vbox.log");
          print M "$t\n";
      close (M);
  }