MOON
Server: Apache/2.2.31 (Unix) mod_ssl/2.2.31 OpenSSL/0.9.8e-fips-rhel5 mod_bwlimited/1.4
System: Linux csr818.wilogic.com 2.6.18-419.el5xen #1 SMP Fri Feb 24 22:50:37 UTC 2017 x86_64
User: digitals (531)
PHP: 5.4.45
Disabled: NONE
Upload Files
File: //proc/self/root/proc/self/root/scripts.20110531.215904.25158/installruby
#!/usr/bin/perl
# cpanel - installruby                            Copyright(c) 2010 cPanel, Inc.
#                                                           All rights Reserved.
# copyright@cpanel.net                                         http://cpanel.net
# This code is subject to the cpanel license. Unauthorized copying is prohibited

BEGIN { unshift @INC, '/usr/local/cpanel'; }

use Cpanel::FileUtils        ();
use Cpanel::FindBin          ();
use Cpanel::Logger           ();
use Cpanel::OSSys            ();
use Cpanel::SafeRun          ();
use Cpanel::SysPkgs          ();
use Cpanel::Tar              ();
use Cpanel::Update           ();
use Cpanel::Version::Compare ();

# Allow disabling of ruby
Cpanel::Update::init_UP_update('ruby');

my %install = (
    'ruby'     => '1.8.7-p334',
    'rubygems' => '1.3.7',
);

my $force      = @ARGV && grep( /^--force$/,      @ARGV ) ? 1 : 0;
my $just_rails = @ARGV && grep( /^--just-rails$/, @ARGV ) ? 1 : 0;
my $src_dir    = '/usr/local/cpanel/src/3rdparty/ruby';
my $system     = Cpanel::OSSys::get_system();
my $prefix   = $system eq 'freebsd'     ? '/usr/local'          : '/usr';
my $gem_bin  = -x $prefix . '/bin/gem'  ? $prefix . '/bin/gem'  : '/usr/bin/gem';
my $ruby_bin = -x $prefix . '/bin/ruby' ? $prefix . '/bin/ruby' : '/usr/bin/ruby';
my $ruby_version_file = '/var/cpanel/version/ruby';

my %archive_types = (
    '.tar.gz'  => '-z',
    '.tar.bz2' => '-j',
    '.tgz'     => '-z',
);

my $exit_code = system '/scripts/checkccompiler';
if ($exit_code) {
    print "C compiler appears to be broken.  Ruby cannot be installed until this is resolved!\n";
    exit 1;
}

my $logger = Cpanel::Logger->new();

system '/scripts/installsqlite3', '--source';

if ( !$just_rails ) {
    my $needs_gem = -x $gem_bin && !$force ? 0 : 1;
    if ( !$needs_gem ) {

        # Gem 0.8.5+ can self update, cPanel started with 1.1
        my $gem_version = `$gem_bin -v`;
        if ( !$gem_version ) {
            $needs_gem = 1;
        }
        else {
            chomp $gem_version;
            if ( $gem_version =~ m/^0/ ) {
                $needs_gem = 1;
            }
        }
    }

    my $needs_ruby = ( !-e $ruby_version_file || $force ) ? 1 : 0;

    my $ruby_version = `$ruby_bin -v`;
    chomp $ruby_version;

    # check version in file
    if ( !$needs_ruby ) {
        if ( !$ruby_version ) {
            $needs_ruby = 1;
        }
        else {
            if ( open my $vers_fh, '<', $ruby_version_file ) {
                my $vers = readline $vers_fh;
                close $vers_fh;
                chomp $vers;
                if ( !$vers ) {
                    $needs_ruby = 1;
                }
                elsif ( $vers ne $install{'ruby'} ) {
                    my ( $new_version_number,       $new_patch_level )       = split( /-/, $install{'ruby'} );
                    my ( $installed_version_number, $installed_patch_level ) = split( /-/, $vers );

                    if ( $new_version_number > $installed_version_number ) {
                        $needs_ruby = 1;
                    }
                    elsif ( $new_version_number eq $installed_version_number ) {
                        my ($new_patch)       = $new_patch_level       =~ m/(\d+)/;
                        my ($installed_patch) = $installed_patch_level =~ m/(\d+)/;

                        if ($new_patch) {    # if we distribute a patched version
                            if ( !$installed_patch ) {    # they don't have a patched version
                                $needs_ruby = 1;
                            }
                            elsif ( $new_patch > $installed_patch ) {    # our patch is greater than theirs
                                $needs_ruby = 1;
                            }
                        }
                    }
                }
            }
            else {
                $logger->warn("Failed to check version file: $!");
                $needs_ruby = 1;
            }
        }

    }

    if ( $system eq 'freebsd' ) {
        my @install = ('ruby18');
        if ($needs_gem) {
            push @install, 'ruby-gems';
        }

        my $syspkgs = Cpanel::SysPkgs->new();
        if ( !$syspkgs ) { die print "Could not create SysPkgs object\n"; }
        $syspkgs->ensure( 'pkglist' => \@install );
    }
    else {
        my $tarcfg = Cpanel::Tar::load_tarcfg();

        my @install;
        if ($needs_ruby) {
            @install = ('ruby');
        }
        if ($needs_gem) {
            push @install, 'rubygems';
        }

      INSTALL:
        foreach my $app (@install) {

            my $basedir = '/home/cp' . $app . 'build';
            system 'rm', '-rf', $basedir;
            system 'mkdir', $basedir;
            chdir $basedir or $logger->die("Unable to chdir $basedir: $!");

            print "Installing $app version: $install{$app}\n";

            my $app_source_base = $app . '-' . $install{$app};

            my $app_source;
            my $decompression_flag;
            foreach my $archive_extension ( keys %archive_types ) {
                if ( -e $src_dir . '/' . $app_source_base . $archive_extension ) {
                    $app_source         = $app_source_base . $archive_extension;
                    $decompression_flag = $archive_types{$archive_extension};
                    last;
                }
            }

            if ( !$app_source ) {
                $logger->warn("Unable to locate source for $app");
                next INSTALL;
            }

            system $tarcfg->{'bin'}, '-x', '-p', $tarcfg->{'no_same_owner'}, $decompression_flag, '-C', $basedir, '-f', $src_dir . '/' . $app_source;

            if ( !-d $basedir . '/' . $app_source_base ) {
                $logger->warn("Failed to decompress source for $app");
                next INSTALL;
            }

            print "Using Dir: $basedir/$app_source_base\n";

            if ( !chdir( $basedir . '/' . $app_source_base ) ) {
                $logger->warn("Unable to chdir to $basedir/$app_source_base failed.");
                next INSTALL;
            }

            if ( $app ne 'ruby' ) {
                print "Setting up $app ...\n";
                system $ruby_bin, 'setup.rb';
            }
            else {
                if ($ruby_version) {
                    print "\nUpdating $ruby_version with $install{$app}\n\n";
                }

                # Rubygems installation says you should do this manually????
                if ( $app eq 'rubygems' && -e $gem_bin ) {
                    unlink $gem_bin;
                }

                unlink $ruby_version_file;
                my @CONF = ( './configure', '--prefix=' . $prefix, '--enable-shared' );
                system @CONF;
                system 'make';
                system 'make', 'install';

                if ( open my $vers_fh, '>', $ruby_version_file ) {
                    print {$vers_fh} $install{$app};
                    close $vers_fh;
                }
                else {
                    $logger->warn("Unable to update version file $ruby_version_file: $!");
                    next INSTALL;
                }
            }
        }

        print "Removing source directory $basedir\n";
        system 'rm', '-rf', $basedir;
    }
}

$gem_bin = -x '/usr/local/bin/gem' ? '/usr/local/bin/gem' : '/usr/bin/gem';
if ( !-x $gem_bin ) {
    $logger->warn("gem installation failed. Unable to locate gem binary.");
}
else {
    print "gem system update ...\n";
    system $prefix . '/bin/gem', 'update', '--system';
    print "gem system update complete.\n";
}

my $rails_bin = Cpanel::FindBin::findbin('rails');

if ( -x $rails_bin ) {
    my $rails_version = Cpanel::SafeRun::saferun( 'rails', '--version' );
    chomp($rails_version);
    ($rails_version) = ( split( ' ', $rails_version, 2 ) )[1];

    if ( Cpanel::Version::Compare::compare( $rails_version, '>=', '3.0.0' ) ) {
        my $warning_msg = "\n" . 'Rails 3 has been detected on your system. Rails 3 is not supported at this time.';
        if ( -t STDIN ) {
            print $warning_msg . ' Would you like to remove it and install a supported version of rails? ';

            my $choice;
            while ( !defined $choice ) {
                $choice = <STDIN>;
                chomp($choice);

                if ( $choice =~ /^y(?:es)?$/i ) {
                    $choice = 1;
                }
                elsif ( $choice =~ /^n(?:o)?$/ ) {
                    $choice = 0;
                }
                else {
                    $choice = undef;
                }
            }

            if ($choice) {
                uninstallrails3();
            }
            else {
                exit 1;
            }
        }
        else {
            print $warning_msg . ' Uninstalling rails 3.' . "\n";
            uninstallrails3();
        }
    }
}

my @rails        = ( 'rails',                                     '-v=2.3.11' );
my @install      = ( 'mongrel',                                   'sqlite3' );
my @sqlite3_args = ( '--with-sqlite3-include=/usr/local/include', '--with-sqlite3-lib=/usr/local/lib' );

my $hasperlexpect = 0;
eval {
    require IO::Tty;
    require Expect;
    $hasperlexpect = 1;
};

print "\nInstalling rails...\n\n";
Cpanel::SafeRun::saferunnoerrordynamic($gem_bin, 'install', @rails, );

if ($hasperlexpect) {
    if ( my $pid = fork() ) {
        waitpid( $pid, 0 );
    }
    else {
        local $SIG{'ALRM'} = sub { die "Timeout\n"; };
        alarm( 20 * 60 );

        my $exp               = Expect->spawn( $gem_bin, 'install', @install, '--', @sqlite3_args ) or die "Cannot spawn gem installer: $!";
        my $expect_pid        = $exp->pid();
        my $mongrel_number    = 0;
        my $fastthread_number = 0;
        while ( waitpid( $expect_pid, 1 ) != -1 ) {
            $exp->expect(
                300,
                [ 'Select which gem', sub { return exp_continue } ],
                [
                    qr/^\s*\d\.\smongrel\s.*/,
                    sub {
                        if ( $exp->match =~ /\(ruby\)/ ) {
                            if ( !$mongrel_number ) {
                                ($mongrel_number) = $exp->match =~ /\s*(\d+)/;
                            }
                        }
                        else {
                            return exp_continue;
                        }
                      }
                ],
                [
                    qr/^\s*\d\.\sfastthread\s.*/,
                    sub {
                        if ( $exp->match =~ /\(ruby\)/ ) {
                            if ( !$fastthread_number ) {
                                ($fastthread_number) = $exp->match =~ /\s*(\d+)/;
                            }
                        }
                        else {
                            return exp_continue;
                        }
                      }
                ],
                [
                    '>',
                    sub {
                        my $number = 0;
                        if ($mongrel_number) {
                            $number         = $mongrel_number;
                            $mongrel_number = 0;
                        }
                        elsif ($fastthread_number) {
                            $number            = $fastthread_number;
                            $fastthread_number = 0;
                        }
                        $exp->send( $number . "\r" );
                      }
                ],
                [ 'timeout', sub { $exp->send("\r"); } ],
            );
        }
        $exp->soft_close();
    }
}
else {
    foreach my $app (@install) {
        system $gem_bin, 'install', $app, '--include-dependencies';
    }
}

if (!-e '/etc/init.d/ror' && !-e '/usr/local/etc/rc.d/ror.sh') {
    system('/usr/local/cpanel/bin/ror_setup');
}

print "Ruby - & - Rails Installed\n";

system '/scripts/magicloader';

exit;

sub uninstallrails3 {
    Cpanel::SafeRun::saferunnoerrordynamic( 'gem', 'uninstall', '-I', '-x', '-v', '3.0.0', 'rails' );
    Cpanel::SafeRun::saferunnoerrordynamic( 'gem', 'uninstall', '-I', '-x', '-v', '3.0.0', 'actionmailer' );
    Cpanel::SafeRun::saferunnoerrordynamic( 'gem', 'uninstall', '-I', '-x', '-v', '3.0.0', 'activemodel' );
    Cpanel::SafeRun::saferunnoerrordynamic( 'gem', 'uninstall', '-I', '-x', '-v', '3.0.0', 'actionpack' );
    Cpanel::SafeRun::saferunnoerrordynamic( 'gem', 'uninstall', '-I', '-x', '-v', '3.0.0', 'activerecord' );
    Cpanel::SafeRun::saferunnoerrordynamic( 'gem', 'uninstall', '-I', '-x', '-v', '3.0.0', 'activeresource' );
    Cpanel::SafeRun::saferunnoerrordynamic( 'gem', 'uninstall', '-I', '-x', '-v', '3.0.0', 'activesupport' );
    Cpanel::SafeRun::saferunnoerrordynamic( 'gem', 'uninstall', '-I', '-x', '-v', '3.0.0', 'railties' );
}