components/php-5_3/Solaris/configure-sun-webserver
changeset 846 fe258446a1ae
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/php-5_3/Solaris/configure-sun-webserver	Thu May 31 14:36:45 2012 -0700
@@ -0,0 +1,948 @@
+#!/bin/bash
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+# Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
+#
+
+# Helper functions
+function usage {
+    echo ""
+    echo "Usage: This script will update a given Web Server 7 instance's configuration"
+    echo "       files to be able to execute PHP scripts."
+    echo ""
+    echo "This script recognizes following arguments:"
+    echo " --installroot  : Top level Sun Web Server 7 installation location. "
+    echo ""
+    echo " --instancename : Name of Web Server instance (https-php) which should"
+    echo "                  be configured to execute PHP scripts. "
+    echo ""
+    echo " --sapi         : How should PHP runtime be loaded within Web Server 7"
+    echo "                  fastcgi (Default) or NSAPI (Optional). "
+    echo ""
+    exit 1
+}
+
+function parse_arguments
+{
+    until [ $# -eq 0 ]
+    do 
+        cur_arg=$1
+        case $cur_arg in 
+            --installroot=*)
+                install_root="`echo $cur_arg | cut -d= -f2-`"
+                ;;
+            --instancename=*)
+                instance_name="`echo $cur_arg | cut -d= -f2-`"
+                ;;
+            --sapi=*)
+                sapi="`echo $cur_arg | cut -d= -f2-`"
+                ;;
+            *)
+                usage
+                ;;
+        esac
+        shift;
+    done
+}
+
+function try_interactive
+{
+    # Get user response on Web Server 7 installation location and instance name.
+    echo -n "Enter your Web Server installation location : "
+    read input
+    if [ -n "$input" ]; then
+        install_root="$input"
+    fi
+
+    echo -n "Enter your Web Server instance name to configure with PHP runtime: "
+    read input
+    if [ -n "$input" ]; then
+        instance_name="$input"
+    fi
+
+	while [ 0 ]; do
+		echo -n "How you would like Sun Web Server 7 to load PHP engine (fastcgi|nsapi) [fastcgi]: "
+		read input
+		if [ -z "$input" ]; then
+			sapi="fastcgi"
+		else
+			sapi=$input
+		fi
+		if [ -n "$sapi" ] && [ $sapi = "fastcgi" -o $sapi = "nsapi" ]; then
+			break
+		fi
+	done
+    return 1;
+}
+
+function validate_arguments
+{
+    if [ ! -d "$install_root" ] || [ ! -x "$install_root/lib/webservd" ]; then
+        echo ""
+        echo "Warning: Unable to find valid Web Server installation under $install_root"
+        echo "Please try again by providing a valid Web Server 7 installation location."
+        usage
+    fi
+
+    if [ ! -d "$install_root" ] || [ ! -x "$install_root/lib/webservd" ]; then
+        echo ""
+        echo "Warning: Unable to find valid Web Server installation under $install_root"
+        echo "Please try again by providing a valid Web Server 7 installation location."
+        usage
+    fi
+
+    if [ -n "$sapi" ] && [ $sapi != "fastcgi" -a $sapi != "nsapi" ]; then
+        echo ""
+        echo "Error: Invalid SAPI option is provided.Valid SAPI argument is either 'fastcgi' or 'nsapi'"
+        echo "Please try again by providing a valid SAPI as argument."
+        usage
+    fi
+
+    return 1;
+}
+
+function generate_tempfile
+{
+    template="tmp.XXXXXXXXXX";
+    if [ -x "/bin/mktemp" ]; then
+        temp_file="`/bin/mktemp`"
+    elif [ -x "/usr/bin/mktemp" ]; then
+        temp_file="`/usr/bin/mktemp`"
+    fi
+    if [ ! -f $temp_file ]; then
+        temp_file="/tmp/ws7_php_configure.$$"
+        touch $temp_file 
+        chmod 600 $temp_file
+    fi
+
+    return 1;
+}
+
+function generate_configure
+{
+	if [ "$OSNAME" = "SunOS" ]; then
+		tail +${perl_start_line} $PROGRAM_NAME > $temp_file
+	elif [ "$OSNAME" = "Linux" ]; then
+        start_line=${perl_start_line}
+        total_line=`wc -l $PROGRAM_NAME | awk '{print $1}' 2>/dev/null`
+        few_lines=$(($total_line - $start_line))
+		tail -${few_lines} $PROGRAM_NAME > $temp_file
+	fi
+    chmod 500 $temp_file
+}
+
+function invoke_configure
+{
+    # Setup environment 
+    if [ -f "$install_root/lib/wsenv" ]; then
+        source  $install_root/lib/wsenv
+        if [ ! -d "${WS_INSTANCEROOT}/${instance_name}" ]; then
+            echo "Warning: Unable to find instance:'$instance_name' under $WS_INSTANCEROOT"
+            echo "         Please try again by providing a valid instance name."
+            exit 1;
+        fi
+    fi
+
+	# Special case, if it is NSAPI
+	if [ "$sapi" = "nsapi" ]; then
+        mkdir -p "$install_root/plugins/webstack-php"
+        ln -sf "<<INSTALL_DIR>>/nsapi/libphp5.so" "$install_root/plugins/webstack-php/libphp5.so"
+	fi
+
+    # Invoke script to configure PHP runtime.
+	if [ "$sapi" = "nsapi" ]; then
+		PHPROOT="<<INSTALL_DIR>>"
+		PHPCONFROOT="<<NSAPI_CONF_DIR>>"
+		PHPCONFROOT_SCANDIR="<<ZTS_MODULES_CONF_DIR>>"
+	else
+		PHPROOT="<<INSTALL_DIR>>"
+		PHPCONFROOT="<<CONF_DIR>>"
+		PHPCONFROOT_SCANDIR="<<MODULES_CONF_DIR>>"
+	fi
+
+    ${WS_PERL}/perl -I ${WS_PERL} -I ${WS_PERL}/lib -I ${WS_PERL}/lib/site_perl $temp_file  \
+	-installroot=${WS_INSTALLROOT} -instanceroot=${WS_INSTANCEROOT} -instancename=$instance_name \
+	-sapi=$sapi -phproot="${PHPROOT}" \
+	-phpconfroot="${PHPCONFROOT}" -phpmodulesconfroot="${PHPCONFROOT_SCANDIR}"
+
+	status=$?
+	if [ $status -eq 0 ]; then
+		if [ -f $temp_file ]; then
+			rm -f $temp_file
+		fi
+    elif [ $status -ne 0 ]; then
+        echo "Unable to successfully setup PHP within Web Server 7"
+        exit 1
+    fi
+}
+
+#-------------------------------------------------------------------------------
+#####
+# Main
+#####
+PATH=/bin:/usr/bin:/usr/gnu/bin:/usr/sfw/bin
+export PATH
+
+# Global variables.
+OSNAME="`uname -s`"
+PHPROOT="<<INSTALL_DIR>>"
+PHPCONFROOT="<<CONF_DIR>>"
+PHPCONFROOT_SCANDIR="<<MODULES_CONF_DIR>>"
+PROGRAM_NAME="$0"
+install_root=""
+instance_name=""
+sapi="fastcgi"
+temp_file=""
+
+# This below line need to point to the start of embedded perl script.
+perl_start_line=245
+
+echo "This script will update a given Web Server 7 instance's configuration"
+echo "files to be able to execute PHP scripts."
+echo ""
+
+# Verify if the program is called with necessary arguments. 
+if [ -n "$1" ]; then
+    parse_arguments $@;
+else
+    # Invoked with no arguments. Try interactive.
+    try_interactive
+fi
+
+validate_arguments
+
+generate_tempfile
+
+generate_configure
+
+invoke_configure
+
+exit 0
+
+#---------------------EOF-------------------------------------------------------
+
+# Helper Script to configure PHP runtime environment within Web Server 7
+
+use XML::Simple;
+use File::Basename;
+use English;
+use strict;
+
+our $INSTANCE_ROOT = undef;
+our $INSTALL_ROOT = undef;
+our $INSTANCE_NAME = undef;
+our $PHP_ROOT = "";
+our $PHP_CONF_ROOT = "";
+our $PHP_MODULES_CONF_ROOT = "";
+our $SAPI = undef;
+our $MIME_TYPES_FILES = [];
+our $OBJ_CONF_FILES = [];
+our $SERVER_64BIT_MODE = undef;
+
+my $phpSoName;
+if (isWindows()) {
+   $phpSoName = "php5nsapi.dll";
+} else {
+   $phpSoName = "libphp5.so";
+}
+
+my $fastCGISoName;
+if (isWindows()) {
+    $fastCGISoName = "fastcgi.dll";
+} else {
+    $fastCGISoName = "libfastcgi.so";
+}
+
+main();
+
+sub main {
+    getCommandOptions();
+    processServerXml();
+    checkFilesWritable();
+    processMagnusConf();
+    processObjConf();
+    processMimeTypes();
+    printResult();
+}
+
+# -----------------------------------------------------------------------------
+# getCommandOptions
+# Process the command line options
+# -----------------------------------------------------------------------------
+
+sub getCommandOptions {
+    for (my $counter=0; $#ARGV >= $counter; $counter++) {
+        my $argument    = $ARGV[$counter];
+        
+        if ($argument =~ /^-installroot=/i) {
+            $INSTALL_ROOT = substr($argument, length("-installroot="));
+        }        
+        if ($argument =~ /^-instanceroot=/i) {
+            $INSTANCE_ROOT = substr($argument, length("-instanceroot="));
+        }
+        if ($argument =~ /^-phproot=/i) {
+            $PHP_ROOT = substr($argument, length("-phproot="));
+        }
+        if ($argument =~ /^-phpconfroot=/i) {
+            $PHP_CONF_ROOT = substr($argument, length("-phpconfroot="));
+        }
+        if ($argument =~ /^-phpmodulesconfroot=/i) {
+            $PHP_MODULES_CONF_ROOT = substr($argument, length("-phpmodulesconfroot="));
+        }
+        if ($argument =~ /^-instancename=/i) {
+            $INSTANCE_NAME = substr($argument, length("-instancename="));
+        }
+        if ($argument =~ /^-sapi=/i) {
+            $SAPI = substr($argument, length("-sapi="));
+        }
+    }
+    if ((!defined $PHP_CONF_ROOT) || ($PHP_CONF_ROOT eq "")) {
+        $PHP_CONF_ROOT = $PHP_ROOT;
+    }
+    
+    if ((not defined $INSTANCE_NAME) or ($INSTANCE_NAME !~ m/\S+/)) {
+        printUsage();
+    }
+    
+    exit 1 unless defined isValidFile("$INSTANCE_ROOT/$INSTANCE_NAME/config");
+}
+
+# -----------------------------------------------------------------------------
+# migrateObjConf
+# Migrate obj.conf file to php 1.1
+# -----------------------------------------------------------------------------
+
+sub migrateObjConf {
+    my $objConfFile = shift;
+    my $pContents = shift;
+    my $tmpObjConfStatus = 1;
+
+    return undef unless ($objConfFile);
+    if ((not -f $objConfFile or ref($pContents) != "ARRAY")) {
+        return undef;
+    }
+
+    my $tmpObjConfFile = "$objConfFile"."tmp";
+    my $update_reqd = undef;
+    local *TMPOBJ;
+
+    my $newLibPath = "$PHP_ROOT/lib";
+    my $newLibPath64 = "$PHP_ROOT/lib/64";
+
+    for (my $i = 0; $i < $#{@{$pContents}}; $i++) {
+        my $pLine = \$pContents->[$i];
+        next if ($$pLine =~ /^\#/); #ignore comments;
+        next if (isWindows());
+        if ($$pLine =~ m@(.*\s+app-path=['"])(\S+)\s*(['"].*)@) {
+            my ($tmp, $tmp1, $tmp2, $tmp3);
+            $tmp1 = $1; $tmp2 = $2; $tmp3 = $3;
+
+            $tmp2 =~ s@$PHP_ROOT/bin/php@$PHP_ROOT/bin/php-cgi@;
+            $tmp = $tmp1.$tmp2.$tmp3."\n";
+            $pContents->[$i] = $tmp;
+            $update_reqd = 1;
+        }
+        elsif ($$pLine =~ m@(.*\s+app-env=['"])(\S+)(=)(\S+)(['"].*)@) {
+            my ($tmp, $tmp1, $tmp2, $tmp3, $tmp4, $tmp5);
+            $tmp1 = $1; $tmp2 = $2; $tmp3 = $3; $tmp4 = $4; $tmp5 = $5;
+
+            if (($tmp2 =~ m@LD_LIBRARY_PATH@) or ($tmp2 =~ m@LD_LIBRARY_PATH_64@)) {
+                if ($tmp4 =~ m@$PHP_ROOT/64@) {
+                    $tmp4 =~ s@$PHP_ROOT/64@$newLibPath64@g;
+                }
+                elsif ($tmp4 =~ m@$PHP_ROOT/64([:].*)@) {
+                    $tmp4 =~ s@$PHP_ROOT/64(:.*)@$newLibPath64$1@g;
+                } 
+                elsif ($tmp4 =~ m@$PHP_ROOT([:].*)@) {
+                    $tmp4 =~ s@$PHP_ROOT(:.*)@$newLibPath$1@g;
+                }
+                elsif ($tmp4 =~ m@$PHP_ROOT@) {
+                    $tmp4 =~ s@$PHP_ROOT@$newLibPath@g;
+                }
+            }
+            elsif ($tmp2 =~ m@PHP_FCGI_MAX_REQUEST@) {
+              $tmp2 =~ s@PHP_FCGI_MAX_REQUEST@PHP_FCGI_MAX_REQUESTS@g;
+              $tmp4 =~ s@200@2000@;
+            }
+            $tmp = $tmp1.$tmp2.$tmp3.$tmp4.$tmp5."\n";
+            $pContents->[$i] = $tmp;
+            $update_reqd = 1;
+        }
+    }
+
+    if ($update_reqd) {
+        open(TMPOBJ,">$tmpObjConfFile") or $tmpObjConfStatus = undef;
+        if (defined $tmpObjConfStatus) {                
+            for (my $i = 0; $i < $#{@{$pContents}}; $i++) {
+                my $line = $pContents->[$i];
+                print TMPOBJ $line;
+            }
+            print "UPDATED: $objConfFile \n";
+            close(TMPOBJ);
+            unlink("$objConfFile");
+            rename("$tmpObjConfFile", "$objConfFile");
+            chmod(0600, "$objConfFile");
+            return 2;
+        }
+    }
+
+    return 1;
+}
+
+# -----------------------------------------------------------------------------
+# processServerXml
+# Parse the server.xml and get all the mime files and object files
+# -----------------------------------------------------------------------------
+
+sub processServerXml {
+    my $file = undef;
+    my $serverXml = "$INSTANCE_ROOT/$INSTANCE_NAME/config/server.xml";
+    
+    my $config = eval{XMLin("$serverXml", forcearray=>1, keyattr=>[])};
+    if ($@) {
+        print("\nERROR: Problem parsing the $serverXml. Not a valid xml file. \n\n");
+        exit 1;
+    }
+    
+    #get the server level mime file
+    $file = $config->{"mime-file"}->[0];
+    if (defined $file) {
+        $file = getValidAbsoluteFilePath($file);
+        if (defined $file) {
+            push (@$MIME_TYPES_FILES, $file); 
+        }
+    }        
+
+    # get the server platform mode
+    my $mode = $config->{"platform"}->[0];
+    if (defined $mode) {
+        if ($mode == "64") {
+            $SERVER_64BIT_MODE = "64";
+        }
+    }
+        
+    for (my $vsCounter = 0; ${config}->{"virtual-server"}->[$vsCounter]; $vsCounter++) {
+        my $virutalServerElement = ${config}->{"virtual-server"}->[$vsCounter];
+        #get the virtual server level mime files
+        for (my $mimeTypescounter = 0; ${virutalServerElement}->{"mime-file"}->[$mimeTypescounter]; $mimeTypescounter++) {
+            $file = ${virutalServerElement}->{"mime-file"}->[$mimeTypescounter];
+            $file = getValidAbsoluteFilePath($file);
+            if (defined $file) {
+                push (@$MIME_TYPES_FILES, $file);
+            }
+        }
+        #get the virtual server level object files       
+        for (my $objectFilecounter = 0; ${virutalServerElement}->{"object-file"}->[$objectFilecounter]; $objectFilecounter++) {
+            $file = ${virutalServerElement}->{"object-file"}->[$objectFilecounter];
+            $file = getValidAbsoluteFilePath($file);
+            if (defined $file) {
+                push (@$OBJ_CONF_FILES, $file);
+            }
+        }        
+    }
+    
+    #Default is mime.types
+    if (@$MIME_TYPES_FILES < 1) {
+        push (@$MIME_TYPES_FILES, "$INSTANCE_ROOT/$INSTANCE_NAME/config/mime.types");
+    }
+    
+    #Default is obj.conf
+    if (@$OBJ_CONF_FILES < 1) {
+        push (@$OBJ_CONF_FILES, "$INSTANCE_ROOT/$INSTANCE_NAME/config/obj.conf");
+    }    
+}
+
+# -----------------------------------------------------------------------------
+# processMagnusConf
+# Append the MAGNUS_CONF_APPEND_STRING value at the end of magnus.conf file.
+# -----------------------------------------------------------------------------
+
+sub processMagnusConf {
+    my $magnusConfFile = "$INSTANCE_ROOT/$INSTANCE_NAME/config/magnus.conf";
+    my $magnusConfStatus = 1;
+
+    if (defined isValidFile($magnusConfFile)) 
+    {
+        # Get the current File Stat.
+        my @statInfo = stat $magnusConfFile;
+
+        # Verify if the changes already exist.
+        if (open(MAGNUS_R,"<$magnusConfFile")) {
+            my @contents = <MAGNUS_R>;
+            foreach (@contents) {
+                next if (/^\#/); #ignore comments;
+                if ((isNSAPI()) and (/shlib(.*)$phpSoName(.*)/g)) {
+                    close(MAGNUS_R);
+                    return 1;
+                } elsif ((not isNSAPI()) and (/shlib(.*)$fastCGISoName(.*)/g)) {
+                    close(MAGNUS_R);
+                    return 1;
+                }
+            }
+            close(MAGNUS_R);
+        }
+        open(MAGNUS,">>$magnusConfFile") or $magnusConfStatus = 0;
+
+        if ($magnusConfStatus == 1) {
+            addToMagnusConf(\*MAGNUS);
+            print "\n\nUPDATED: $magnusConfFile \n";
+        } else {
+            print "\nERROR: Unable to write $magnusConfFile. \n\n";
+            close(MAGNUS);
+            exit 1;
+        }
+        close(MAGNUS);
+        chown $statInfo[4], $statInfo[5], $magnusConfFile;
+    }
+}
+
+# -----------------------------------------------------------------------------
+# processObjConf
+# Append the OBJ_CONF_APPEND_STRING value after the <object name="default" 
+# directive in all object files.
+# -----------------------------------------------------------------------------
+
+sub processObjConf {
+    while(scalar(@$OBJ_CONF_FILES) > 0) {
+        my $objConfFile = pop(@$OBJ_CONF_FILES);
+        my $objConfStatus = 1;
+        my $tmpObjConfStatus = 1;
+
+        if (defined isValidFile($objConfFile)) 
+        {
+            # Get the current File Stat.
+            my @statInfo = stat $objConfFile;
+
+            # Verify if the changes already exist.
+            open(OBJ,"<$objConfFile") or $objConfStatus = undef;
+            if (defined $objConfStatus) {
+                my @lines = <OBJ>;
+                my $escape_path = $PHP_ROOT;
+                $escape_path =~ s/\/(\w)/\\\/$1/g;
+                $escape_path =~ s/\\(\w)/\/$1/g;
+                my $contents = join("",@lines);
+                my $already_configured = undef;
+                if ((isNSAPI()) and ($contents =~ m/
+                        \s*Service\s+type="magnus-internal\/php"\s+fn="php5_execute"
+                        /mx)) {
+                    close(OBJ);
+                    $already_configured = 1;
+                }
+                if ((not isNSAPI()) and (($contents =~ m/
+                        \s*Service\s+type=[\"]magnus-internal\/php[\"]
+                        [\r\n]+
+                        \s*fn=[\"]responder-fastcgi[\"]
+                        [\r\n]+
+                        \s*app-path=[\"](.*)[\"]
+                        [\r\n]+
+                        /mx) and ($1 =~ m@$escape_path@))) {
+                    close(OBJ);
+                    $already_configured = 1;
+                    # migrate existing obj.conf configurations.
+                    &migrateObjConf($objConfFile, \@lines);
+                }
+
+                next if ($already_configured);
+
+                # Create a new obj.conf
+                my $tmpObjConfFile = "$objConfFile"."tmp";
+                open(TMPOBJ,">$tmpObjConfFile") or $tmpObjConfStatus = undef;
+                if (defined $tmpObjConfStatus) {                
+                    if (@lines) {                
+                        foreach my $line (@lines) {
+                            if (($line =~ /^<Object/i) && 
+                                (($line =~ /name=default>/i) || 
+                                ($line =~ /name=default\s/i) || 
+                                ($line =~ /name="default"/i))) {
+                                print TMPOBJ $line;
+                                addToObjConf(\*TMPOBJ);
+                                print "UPDATED: $objConfFile \n";
+                            } elsif ($line =~ /PathCheck\s+fn\s*=\s*(\S+)\s+(\S+)\s*=\s*(\S+)$/) {
+                                my $funcName = $1;
+                                my $valueName = $2;
+                                my $values = $3;
+                                if (($funcName =~ /find-index/) and ($valueName =~ /index-names/)) {
+                                    $values =~ s/[\"](\S+)[\"]/$1/;
+                                    $values = "$1".",index.php";
+                                    my $newLine = <<__UP_TO_THIS_POINT_;
+PathCheck fn=$funcName $valueName=\"$values\"
+__UP_TO_THIS_POINT_
+                                    print TMPOBJ $newLine;
+                                }
+                                else {
+                                    print TMPOBJ $line;
+                                }
+                            } else {
+                                print TMPOBJ $line;
+                            }
+                        }
+                    }
+                } else {
+                    print "\nERROR: Unable to write $objConfFile \n\n";
+                    close(TMPOBJ);
+                    close(OBJ);
+                    unlink("$tmpObjConfFile");
+                    exit 1;
+                }
+                close(TMPOBJ);
+                close(OBJ);
+                unlink("$objConfFile");
+                rename("$tmpObjConfFile", "$objConfFile");
+                chmod(0600, "$objConfFile");
+                chown $statInfo[4], $statInfo[5], $objConfFile;
+            }
+        }
+    }
+}
+
+# -----------------------------------------------------------------------------
+# processMimeTypes
+# Append the MIME_TYPES_APPEND_STRING value at the end of 
+# all the mime types file.
+# -----------------------------------------------------------------------------
+
+sub processMimeTypes {
+    while(scalar(@$MIME_TYPES_FILES) > 0) {
+        my $mimeTypesFile = pop(@$MIME_TYPES_FILES);
+        my $mimeTypesStatus = 1;
+
+        if (defined isValidFile($mimeTypesFile)) {
+
+            # Get the current File Stat.
+            my @statInfo = stat $mimeTypesFile;
+
+            # Verify if the changes already exist.
+            if (open(MIME_R,"<$mimeTypesFile")) {
+                my @contents = <MIME_R>;
+                for (my $i = $#contents; $i > 0; $i--) {
+                    if ($contents[$i] =~ /magnus-internal\/php/g) {
+                        close(MIME_R);
+                        return 1;
+                    }
+                }
+                close(MIME_R);
+            }
+            open(MIME,">>$mimeTypesFile") or $mimeTypesStatus = undef;
+            if (defined $mimeTypesStatus) {
+                addToMimeTypes(\*MIME);
+                print "UPDATED: $mimeTypesFile \n";
+            } else {
+                print "\nERROR: Unable to write $mimeTypesFile. \n\n";
+                close(MIME);
+                exit 1;
+            }
+            close(MIME);
+            chown $statInfo[4], $statInfo[5], $mimeTypesFile;
+        }        
+    }        
+}
+
+# -----------------------------------------------------------------------------
+# addMagnusConfEntry
+# Add the required magnus conf entry
+# -----------------------------------------------------------------------------
+sub addToMagnusConf {
+
+    my $entry;
+    my $FILENAME = shift;
+    my $phpNsapi = $phpSoName; 
+
+    if (isNSAPI()) {
+
+        $entry = <<__UP_TO_THIS_POINT_;
+
+Init fn="load-modules" shlib="$phpNsapi" shlib_flags="global|now"
+    funcs="php5_init,php5_close,php5_execute,php5_auth_trans"
+Init fn="php5_init"
+	php_ini="$PHP_CONF_ROOT"
+	php_ini_scandir="$PHP_MODULES_CONF_ROOT"
+	errorString="PHP failed to initialize."
+
+__UP_TO_THIS_POINT_
+
+    } else {    # fastcgi
+
+        $entry = <<__UP_TO_THIS_POINT_;
+
+Init fn="load-modules" shlib="$fastCGISoName"
+
+__UP_TO_THIS_POINT_
+
+    }
+
+    print $FILENAME $entry;    
+}
+
+# -----------------------------------------------------------------------------
+# addMimeTypesEntry
+# Add the required mime types entry
+# -----------------------------------------------------------------------------
+sub addToMimeTypes {
+    my $FILENAME = shift;
+    my $entry = <<__UP_TO_THIS_POINT_;
+
+type=magnus-internal/php                         exts=php,php3,php4,php5
+__UP_TO_THIS_POINT_
+    print $FILENAME $entry;    
+}
+
+# -----------------------------------------------------------------------------
+# addObjConfEntry
+# Add the required obj conf entry
+# -----------------------------------------------------------------------------
+sub addToObjConf {
+    # setup 
+    my $FILENAME = shift;
+    # On windows, replace \ with / in paths
+    my $l_php_root = $PHP_ROOT;
+    if (isWindows()) {
+        $l_php_root =~ s/\\/\//g;
+    }
+
+    my $newLibPath = "$l_php_root/lib";
+    my $newLibPath64 = "$l_php_root/lib/64";
+    my $childs = &detectDefaultChildren();
+
+    my $unixFastCGIEntry = <<__UNIX_FASTCGI_ENTRY_
+<If -f \$path>
+Service type="magnus-internal/php"
+    fn="responder-fastcgi"
+    app-path="$l_php_root/bin/php-cgi"
+    bind-path="localhost:3101"
+    app-env="PHPRC=$PHP_CONF_ROOT"
+    app-env="PHP_INI_SCANDIR=$PHP_MODULES_CONF_ROOT"
+    app-env="PHP_FCGI_CHILDREN=$childs"
+    app-env="PHP_FCGI_MAX_REQUESTS=2000"
+    app-env="FCGI_WEB_SERVER_ADDRS=127.0.0.1"
+    bucket="php-bucket"
+</If>
+<Else>
+Service type="magnus-internal/php" fn="set-variable" error="404"
+</Else>
+
+__UNIX_FASTCGI_ENTRY_
+;
+
+    my $windowsFastCGIEntry = <<__WINDOWS_FASTCGI_ENTRY_
+
+Service type="magnus-internal/php"
+    fn="responder-fastcgi"
+    app-path="$l_php_root/php-cgi.exe"
+    bind-path="$INSTANCE_NAME--php_cgi"
+    app-env="PHPRC=$l_php_root"
+    app-env="PHP_FCGI_CHILDREN=$childs"
+    app-env="PHP_FCGI_MAX_REQUESTS=2000"
+    bucket="php-bucket"
+
+__WINDOWS_FASTCGI_ENTRY_
+;
+
+    my $nsapiEntry = <<__NSAPI_ENTRY_
+
+Service type="magnus-internal/php" fn="php5_execute"
+
+__NSAPI_ENTRY_
+;
+
+    my $entry;
+
+    if (isNSAPI()) {
+        $entry = $nsapiEntry;
+    } else {
+        if (isWindows()) {
+            $entry = $windowsFastCGIEntry;
+        } else {
+            $entry = $unixFastCGIEntry;
+        }
+    }
+
+    print $FILENAME $entry;
+}
+
+# -----------------------------------------------------------------------------
+# isNSAPI
+# Check if SAPI is nsapi
+# -----------------------------------------------------------------------------
+
+sub isNSAPI() {
+    if ($SAPI =~ m/nsapi/i) {
+        return 1;
+    }
+    return 0;
+}
+
+# -----------------------------------------------------------------------------
+# isWindows
+# Check platform
+# -----------------------------------------------------------------------------
+
+sub isWindows() {
+    if ($OSNAME =~ m/WIN/i) {
+        return 1;
+    }
+    return 0;
+}
+
+# -----------------------------------------------------------------------------
+# checkFilesWritable
+# Check all the necessary files writable before adding the entries
+# -----------------------------------------------------------------------------
+
+sub checkFilesWritable {
+    exit 1 unless defined isValidFile("$INSTANCE_ROOT/$INSTANCE_NAME/config/magnus.conf");
+    my @TMP_OBJ_CONF_FILES = @$OBJ_CONF_FILES;
+    my @TMP_MIME_TYPES_FILES = @$MIME_TYPES_FILES;
+
+    while(scalar(@TMP_OBJ_CONF_FILES) > 0) {
+        my $objConfFile = pop(@TMP_OBJ_CONF_FILES);
+        exit 1 unless defined isValidFile("$objConfFile");
+    }
+    while(scalar(@TMP_MIME_TYPES_FILES) > 0) {
+        my $mimeTypesFile = pop(@TMP_MIME_TYPES_FILES);
+        exit 1 unless defined isValidFile("$mimeTypesFile");
+    }
+}
+
+# -----------------------------------------------------------------------------
+# getValidAbsoluteFilePath
+# To get the valid absolute file path
+# -----------------------------------------------------------------------------
+
+sub getValidAbsoluteFilePath {
+    my ($file) = @_;
+    
+    if (defined $file) {
+        my ($fileName,$filePath,$fileNameSuffix) = fileparse("$file");
+        if ($fileName eq $file) {
+            $file = "$INSTANCE_ROOT/$INSTANCE_NAME/config/$fileName";
+        }
+        
+        $file = undef unless defined isValidFile($file);
+    }
+    
+    return $file;
+}  
+
+# -----------------------------------------------------------------------------
+# getValidAbsoluteFilePath
+# Valid file check
+# -----------------------------------------------------------------------------
+
+sub isValidFile {
+    my ($file) = @_;
+    my $status = undef;
+    
+    if (-e "$file") {
+        if (-w "$file") {
+            $status = 1; 
+        } else {
+            print "\nERROR: $file is not writable. \n\n";
+            exit 1;
+        }
+    } else {
+        print "\nERROR: $file not found, $! \n\n";
+        exit 1;
+    }
+    
+    return $status;
+}
+
+# -----------------------------------------------------------------------------
+# detectDefaultChildren
+# detect current architecture and come up with default values.
+# set default value to a higher value on Niagara based servers.
+# -----------------------------------------------------------------------------
+sub detectDefaultChildren {
+    my $default = 2;
+    if ($OSNAME =~ /SOLARIS/i) {
+        if (-x "/bin/uname") {
+            my $type = qx(/bin/uname -m);
+            chomp($type);
+            $default *= 3 if ($type =~ /sun4u/i);
+            $default *= 6 if ($type =~ /sun4v/);
+        }
+    }
+    return $default;
+}
+
+# -----------------------------------------------------------------------------
+# printUsage
+# print the usage command
+# -----------------------------------------------------------------------------
+
+sub printUsage {
+    print "This script will configure a web server instance to run PHP scripts\n" .
+          "either as FastCGI or NSAPI \n".
+          "usage : \n" .
+          "     setupPHP -instancename=<instance name> [-sapi=fastcgi|nsapi]\n" .
+          "Examples:\n" .
+          "\n".
+          "This below example configures Web Server to run PHP in FastCGI mode (Default)\n".
+          "     setupPHP -instancename=https-php\n" .
+          "\n".
+          "This below example configures Web Server to run PHP in NSAPI mode\n".
+          "     setupPHP -instancename=https-php -sapi=nsapi\n";
+    exit 1;
+}
+
+# -----------------------------------------------------------------------------
+# printResult
+# print the post setup steps
+# -----------------------------------------------------------------------------
+
+sub printResult {
+    #remove "https-" from the instance name and use it as the config name
+    my $configName = undef;
+    $configName = $INSTANCE_NAME;
+    $configName = substr($INSTANCE_NAME, 6) if ($INSTANCE_NAME =~ /^https/);
+    my $result = <<__UP_TO_THIS_POINT_;
+    
+Setup was sucessful.
+--------------------
+
+The following steps are necessary to make the changes to all the nodes.
+
+(1) Start the admin server
+
+    $INSTALL_ROOT/admin-server/bin/startserv
+
+(2) Connect to the admin server using wadm command
+
+    $INSTALL_ROOT/bin/wadm [--user=admin-user] [--password-file=admin-pswd-file] [--host=admin-host] [--port=admin-port]
+
+(3) Pull the modified config from the node to config store 
+    using the following command in wadm console:
+
+    pull-config --config=$configName nodehost
+    
+    For Example: If the host name for the node is xyz.com then enter the command like,
+    
+    pull-config --config=$configName xyz.com
+
+(4) Deploy the new changes to all nodes using 
+    the following command in wadm console:
+
+    deploy-config $configName 
+
+
+__UP_TO_THIS_POINT_
+    print $result;
+}