#!/bin/sh
eval 'if [ -x /usr/local/cpanel/3rdparty/bin/perl ]; then exec /usr/local/cpanel/3rdparty/bin/perl -x -- $0 ${1+"$@"}; else exec /usr/bin/perl -x $0 ${1+"$@"}; fi;'
  if 0;

#!/usr/bin/perl

use lib '/usr/local/cpanel';
use Cpanel::FileUtils ();
use Cpanel::SafeRun   ();
use POSIX             ();
use RcsRecord         ();
use SafeFile          ();

my $installed = 0;

my @prefixes = ( '/usr/local', '/usr/local/php4', '/usr/local/php5', '/usr/local/php6' );
if (@ARGV) {
    @prefixes = @ARGV;
}

foreach my $php_prefix (@prefixes) {
    $php_prefix =~ s/\/$//;
    my $php_ini = $php_prefix . '/lib/php.ini';
    if ( $php_prefix eq '/usr/local/cpanel/3rdparty' || $php_prefix eq '/var/cpanel/3rdparty' ) {
        $php_ini = '/usr/local/cpanel/3rdparty/etc/php.ini';
    }
    next unless ( -e $php_ini && -e $php_prefix . '/bin/php' && -e $php_prefix . '/bin/phpize' && -e $php_prefix . '/bin/php-config' );
    local %ENV = ();

    # determine version to use
    print "Determining PHP version for ${php_prefix}/bin/php\n";
    my @cmd;
    if ( -e '/usr/local/cpanel/scripts/php.ini' ) {
        @cmd = ( $php_prefix . '/bin/php', '-c', '/usr/local/cpanel/scripts/php.ini', '-v' );
    }
    else {
        @cmd = ( $php_prefix . '/bin/php', '-v' );
    }
    my $phpout = Cpanel::SafeRun::saferunallerrors(@cmd);
    my $php_version;
    my $php_short_version;
    if ( $phpout =~ m/^PHP\s+(\d+\.\d+\.\d+)\S*\s+\(([^\)]+)\)/m ) {
        $php_version       = $1;
        $php_short_version = $php_version;
        $php_short_version =~ s/(\d+\.\d+)\.\d+/$1/;
    }
    else {
        print "Could not determine PHP version from output:\n";
        print $phpout;
        next;
    }

    my $php_config = $php_prefix . '/bin/php-config';
    print "Determining PHP extension dir from ${php_config}\n";

    my $ext_dir = Cpanel::SafeRun::saferun( $php_config, '--extension-dir' );
    chomp $ext_dir;
    die "Could not determine extension dir" unless ($ext_dir);

    # create install directory
    if ( !-d $ext_dir ) {
        print "Creating extension directory at ${ext_dir}\n";
        mkdir $ext_dir || die "Could not mkdir ${ext_dir}:  $!";
        chmod 0755, $ext_dir || die "Could not chmod ${ext_dir}: $!";
    }

    my $systype = ( POSIX::uname() )[0];
    $systype = ( $systype =~ /FreeBSD/i ) ? 'fre' : 'lin';

    # install binaries
    print "Installing and activating SourceGuardian Loader binaries\n";
    foreach my $version ( $php_version, $php_short_version ) {
        my $target_file = 'ixed.' . $version . '.' . $systype;
        if ( -e $target_file ) {
            Cpanel::FileUtils::safecopy( $target_file, $ext_dir . '/' . $target_file ) || die "Could not move ${target_file} to ${ext_dir}: $!";
            chmod 0644, $ext_dir . '/' . $target_file || die "Could not chmod ${ext_dir}/${target_file}: $!";
            $installed = 1;
            activate_sourceguardian( $php_prefix, $version, $systype, $ext_dir, $php_ini );
            last;
        }
    }
}

if ($installed) {
    exit 0;
}
else {
    exit 1;
}

sub activate_sourceguardian {
    my $prefix      = shift;
    my $php_version = shift;
    my $systype     = shift;
    my $ext_dir     = shift;
    my $ini_file    = shift;

    my $extension_line = qq{extension="ixed.${php_version}.${systype}"\n};

    my $ini_lock = SafeFile::safeopen( \*INI, "+<", $ini_file );
    my @ini_data = <INI>;
    seek( INI, 0, 0 );
    foreach my $line (@ini_data) {
        if ( $line =~ /^\s*extension_dir\s*=/i ) {
            print INI qq{extension_dir = "${ext_dir}"\n};
        }
        elsif ( $line !~ m{^\s*extension(_ts)?\s*=\s*"?ixed\..*$} ) {
            print INI $line;
        }
    }

    print INI $extension_line;
    truncate( INI, tell(INI) );
    SafeFile::safeclose( \*INI, $ini_lock );

    RcsRecord::rcsrecord( $ini_file, 'SourceGuardian Loader activated' );
}
