File: //scripts.20110531.215904.25158/bandminup
#!/usr/bin/perl
# cpanel - bandminup 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', '/scripts'; }
my $pkg = 'bandmin';
use strict;
use warnings;
use Cpanel::Hostname ();
use Cpanel::Sys::OS ();
use Cpanel::RpmStor ();
use Cpanel::HttpRequest ();
use Cpanel::SafeRun::Errors ();
use Cpanel::RpmUtils ();
use Cpanel::SysPkgs ();
use Cpanel::Update ();
use cPpkgversions ();
use IPC::Open3 ();
Cpanel::Update::safe_update_environment($pkg);
Cpanel::Update::init_UP_update($pkg);
my $now = time;
my $hostname = Cpanel::Hostname::gethostname();
my $distro = Cpanel::Sys::OS::getos();
my ( $version, $ises ) = Cpanel::Sys::OS::getreleaseversion($distro);
my $httpClient = Cpanel::HttpRequest->new( 'hideOutput' => 0 );
print "$pkg Setup Script Version 1.0\n";
my $latest = 0;
my $src = 0;
my $force = 0;
if ( grep( /force/, @ARGV ) ) { $force = 1; }
if ( grep( /source/, @ARGV ) ) { $src = 1; }
if ( grep( /latest/, @ARGV ) ) { $latest = 1; }
my $basedir = $pkg;
my $xdir = '';
if ( $distro eq 'freebsd' ) {
print "Bandmin is currently not supported on FreeBSD\n";
exit; # ? or do we want exit(1); ?
}
my %VINFO = cPpkgversions::getpkgversioninfo($pkg);
my $buildnum = $VINFO{$pkg}{'release'};
my $pkgver = $VINFO{$pkg}{'version'};
my $bsv = $VINFO{$pkg}{'flags'};
my $arch = 'noarch';
if ( $ises == 1 ) {
$version = 'AS-' . $version;
}
my $cver = Cpanel::SafeRun::Errors::saferunnoerror( 'rpm', '-q', $pkg );
chomp $cver;
print "This is the $pkg $pkgver installer release number ${buildnum} for platform ${distro} ${version}\n";
if ( $cver eq "${pkg}-${pkgver}-${buildnum}_${bsv}" && !$force ) {
print "$pkg is up to date. Use ${pkg}up --force to force a reinstall\n";
exit;
}
if ( -x "/scripts/pre${pkg}install" ) {
system("/scripts/pre${pkg}install");
}
mkdir( "/home/${pkg}-install", 0700 );
chdir("/home/${pkg}-install");
my $url = "http://diff.cpanel.net/${basedir}install/${pkgver}-${buildnum}${xdir}/${distro}/${version}/${pkg}-${pkgver}-${buildnum}_${bsv}.${arch}.rpm";
my @SLA = split( /\//, $url );
my $file = $SLA[$#SLA];
die "File is not valid" if !$file;
if ( !$src ) {
if ( !-e $file || ( stat(_) )[7] <= 0 ) {
$httpClient->download( $url, $file );
}
if ( ( stat($file) )[7] <= 0 || !Cpanel::RpmUtils::checkrpm($file) ) {
print "Failed to download $url .. using source instead\n";
$latest = 1;
$src = 1;
}
}
else {
$file = buildrpm( $pkg, "http://diff.cpanel.net/${basedir}install/${pkgver}-${buildnum}${xdir}/src/${pkg}-${pkgver}-${buildnum}_${bsv}.src.rpm" );
if ( $file eq '' ) {
die 'Rpm failed to build!';
}
}
if ( ( stat($file) )[7] <= 0 ) {
$file = buildrpm( $pkg, "http://diff.cpanel.net/${basedir}install/${pkgver}-${buildnum}${xdir}/src/${pkg}-${pkgver}-${buildnum}_${bsv}.src.rpm" );
}
if ( ( stat($file) )[7] <= 0 ) {
die "Failed to download or build rpm from $url ($file)";
}
if ( !Cpanel::RpmUtils::checkrpm($file) ) {
die "$file is not a valid rpm file";
}
$ENV{'RPMINSTALL'} = 1;
Cpanel::RpmUtils::rpmpreinstall($file);
system 'rpm', '-Uvh', '--nodeps', '--force', $file;
$ENV{'RPMINSTALL'} = 0;
chdir '/';
system 'rm', '-rf', "/home/${pkg}-install";
if ( -x "/scripts/post${pkg}install" ) {
system("/scripts/post${pkg}install");
}
print "Install Complete\n";
sub buildrpm {
my $pkg = shift;
my $url = shift;
my $syspkgobj = Cpanel::SysPkgs->new();
if ( !$syspkgobj ) { die print "Could not create SysPkgs object\n"; }
my @pkgs = ( 'rpm', 'rpm-build', 'db-devel', 'gdbm-devel', 'db1-devel', 'db4-devel', 'compat-db', 'ndbm-devel', 'pam-devel', 'openssl-devel', 'gcc', 'glibc-devel' );
$syspkgobj->install( 'pkglist' => \@pkgs );
my $rpm = 'rpm';
if ( -e '/usr/bin/rpmbuild' ) { $rpm = '/usr/bin/rpmbuild'; }
$httpClient->download( $url, $pkg . '.src.rpm' );
if ( !Cpanel::RpmUtils::checkrpm($file) ) {
die "failed to download $url";
}
open( RNULL, '<', '/dev/null' );
print 'Building RPM...';
open( RPM, '>', 'rpmbuildlog' );
my $pid = IPC::Open3::open3( '<&RNULL', '>&RPM', '>&RPM', $rpm, '--rebuild', $pkg . '.src.rpm' );
while ( waitpid( $pid, 1 ) <= 0 ) {
print '.';
sleep(1);
}
close(RPM);
close(RNULL);
print "Done\n";
open( RPM, '<', 'rpmbuildlog' );
while (<RPM>) {
if (/^Wrote: (\S+)/) {
$file = $1;
if ( $file =~ /.(noarch|64|86)\.rpm/ ) {
Cpanel::RpmStor::rpmstor($file);
return ($file);
}
}
}
close(RPM);
open( RPM, '<', 'rpmbuildlog' );
seek( RPM, -2048, 2 );
while (<RPM>) {
print "\t" . $_;
}
close(RPM);
die 'Failed to build rpm';
}