File: //scripts.20110531.215904.25158/sysup
#!/usr/bin/perl
# cpanel - sysup 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 strict;
use Cpanel::SafeFile ();
use Cpanel::OSSys ();
use Cpanel::NSCD ();
use Cpanel::RpmUtils ();
use Cpanel::Sys::OS ();
use Cpanel::Config::LoadCpConf ();
use Cpanel::SysPkgs ();
use Cpanel::Logger ();
use Cpanel::HttpRequest ();
use Cpanel::SafeRun::Simple ();
use Cpanel::SafeRun::Errors ();
my $logger = Cpanel::Logger->new();
require '/scripts/pkgmap.pl';
require '/scripts/installport.pl';
my ( $system, $release, $machine ) = ( Cpanel::OSSys::uname() )[ 0, 2, 4 ];
my %CPCONF = Cpanel::Config::LoadCpConf::loadcpconf();
my $httpClient = Cpanel::HttpRequest->new();
$| = 1;
rhelcheck();
my %UPCONF;
if ( -e '/etc/cpupdate.conf' ) {
if ( open my $cpupdate_fh, '<', '/etc/cpupdate.conf' ) {
while (<$cpupdate_fh>) {
chomp;
my ( $name, $value ) = split( /=/, $_ );
next if ( !defined $name || $name eq '' );
if ( !defined $value ) { $value eq ''; }
$UPCONF{$name} = $value;
}
close $cpupdate_fh;
}
else {
die "Unable to read /etc/cpupdate.conf: $!";
}
}
if ( exists $UPCONF{'SYSUP'} && $UPCONF{'SYSUP'} eq 'never' ) {
print "System updates excluded per Update Preferences!\n";
exit;
}
if ( -e '/etc/debian_version' ) {
$ENV{'DEBIAN_FRONTEND'} = 'noninteractive';
$ENV{'DEBCONF_FRONTEND'} = 'noninteractive';
checkrpmlist();
exit;
}
my $isgentoo;
if ( -e '/etc/gentoo-release' ) {
$isgentoo = 1;
checkrpmlist();
exit;
}
my ( $version, $ises );
## TODO: pending non-explosion of chunk removed for case 27814. $tdir is assigned, but no longer
## used.
my $tdir;
if ( $system !~ m/freebsd/i ) {
if ( -e '/etc/redhat-release' ) {
( $version, $ises ) = Cpanel::Sys::OS::getversionfromfile('/etc/redhat-release');
if ( $ises == 1 ) {
system('/scripts/checkup2date');
}
}
if ( -e '/etc/trustix-release' ) {
system('/usr/sbin/groupadd nobody 2>/dev/null');
Cpanel::NSCD::clear_cache('group');
( $version, $ises ) = Cpanel::Sys::OS::getversionfromfile('/etc/trustix-release');
if ($ises) {
system('/scripts/checkswup');
}
if ( !-e '/usr/lib/libssl.so.2' ) {
symlink( 'libssl.so', '/usr/lib/libssl.so.2' );
}
if ( !-e '/usr/lib/crypto.so.2' ) {
symlink( 'libcrypto.so', '/usr/lib/libcrypto.so.2' );
}
if ( $version eq '2.0' ) {
$tdir = '/trustix2.0/';
}
elsif ( ( $version eq '2' || $version eq '2.1' )
&& $ises ) {
$tdir = '/trustix2/';
}
elsif ( $version eq '2.2' || '2.3' ) {
$tdir = '/trustix2/';
}
else {
die "Trustix $version is not supported\n";
}
}
elsif ( -e '/etc/caos-release' ) {
( $version, $ises ) = Cpanel::Sys::OS::getversionfromfile('/etc/caos-release');
open( YUM, '>', '/var/cpanel/useyum' );
close(YUM);
if ( $version eq '2.0' ) {
$tdir = '/caos2.0/';
}
else {
die "cAos $version is not supported\n";
}
}
elsif ( -e '/etc/SuSE-release' ) {
( $version, $ises ) = Cpanel::Sys::OS::getversionfromfile('/etc/SuSE-release');
if ( $version eq '8.2' ) {
$tdir = '/suse8.2/';
}
elsif ( $version eq '9.0' ) {
$tdir = '/suse9.0/';
}
else {
die "SuSE $version is not supported\n";
}
}
elsif ( -e '/etc/fedora-release' ) {
$tdir = $machine =~ m/64/ ? '/fedora2-64/' : '/fedora1/';
}
elsif ( -e '/etc/mandrake-release' ) {
system('rpm -e postfix 2>/dev/null');
system('rpm -e --nodeps libmysql10-3.23.47-5mdk 2>/dev/null');
system('rpm -e --nodeps MySQL-3.23.47-5mdk 2>/dev/null');
system('rpm -e --nodeps MySQL-client-3.23.47-5mdk 2>/dev/null');
system('/usr/sbin/groupadd nobody 2>/dev/null');
Cpanel::NSCD::clear_cache('group');
( $version, $ises ) = Cpanel::Sys::OS::getversionfromfile('/etc/redhat-release');
if ( $version < 8 ) {
$tdir = '/generic/';
}
elsif ( $version eq '8.1' ) {
$tdir = '/mdk8.1/';
}
elsif ( $version eq '8.2' ) {
$tdir = '/mdk8.2/';
}
elsif ( $version =~ /^9/ ) {
$tdir = '/mdk9.0/';
}
else {
die "Mandrake $version is not supported\n";
}
}
else {
if ( ( $ises && int($version) >= 3 ) || $version eq '9' ) {
if ( $machine =~ /64/ ) {
$tdir = '/9-64/';
}
else {
$tdir = '/9/';
}
if ( -e '/usr/lib/libcrypto.so.0.9.6' ) {
symlink( 'libcrypto.so.0.9.6', '/usr/lib/libcrypto.so.0' );
}
if ( -e '/usr/lib/libssl.so.0.9.6' ) {
symlink( 'libssl.so.0.9.6', '/usr/lib/libssl.so.0' );
}
if ( -e '/lib/libcrypto.so.0.9.6b' ) {
symlink( 'libcrypto.so.0.9.6b', '/lib/libcrypto.so.0' );
}
if ( -e '/lib/libssl.so.0.9.6b' ) {
symlink( 'libssl.so.0.9.6b', '/lib/libssl.so.0' );
}
}
elsif ( $version eq '7.0' ) {
$tdir = '/7.0/';
if ( -e '/usr/lib/libcrypto.so.0.9.6' ) {
symlink( 'libcrypto.so.0.9.6', '/usr/lib/libcrypto.so.1' );
symlink( 'libcrypto.so.0.9.6', '/usr/lib/libcrypto.so.0' );
}
if ( -e '/usr/lib/libssl.so.0.9.6' ) {
symlink( 'libssl.so.0.9.6', '/usr/lib/libssl.so.1' );
symlink( 'libssl.so.0.9.6', '/usr/lib/libssl.so.0' );
}
}
elsif ( $version eq '6.2' ) {
$tdir = '/6.2/';
}
elsif ( $version eq '7.1' ) {
$tdir = '/7.1/';
}
elsif ( $version eq '7.2' ) {
$tdir = '/7.2/';
}
elsif ( ( $ises && int($version) < 3 ) || $version eq '7.3' ) {
$tdir = '/7.3/';
}
elsif ( $version eq '8.0' ) {
$tdir = '/8.0/';
}
else {
$tdir = '/generic/';
}
}
}
# FreeBSD
else {
# Check for broken gdbm
if ( !-e '/usr/include/gdbm.h' && !-e '/usr/local/include/gdbm.h' ) {
system '/scripts/ensurepkg', '--force', 'gdbm';
}
# Add autoconf autoheader links
if ( ( !-e '/usr/local/bin/autoconf' && !-e '/usr/bin/autoconf' ) || ( !-e '/usr/local/bin/autoheader' && !-e '/usr/bin/autoheader' ) ) {
my @auto_stuff = qw( autoconf autoheader );
my @bins;
if ( opendir my $local_bin_dh, '/usr/local/bin' ) {
@bins = readdir $local_bin_dh;
closedir $local_bin_dh;
}
else {
warn "Unable to read /usr/local/bin: $!";
}
foreach my $binary (@auto_stuff) {
my $created_link;
LINKLOOP:
foreach my $local_bin ( sort @bins ) {
next if $local_bin !~ m/^$binary\d+$/;
if ( symlink $local_bin, '/usr/local/bin/' . $binary ) {
$created_link = 1;
last LINKLOOP;
}
}
if ( !$created_link ) {
warn "Unable to locate suitable binary for $binary\n";
}
}
}
#readd bind9
my @SYSPKGS = qw(
bash
exim
gettext
gettext-devel
i18ntools
imap-uw
jpeg
libxml2
lsof
ncftp
openssh
png
portupgrade
proftpd
python
quota
rdate
sysstat
urwfonts
wget
xpm
);
#do not install which under freebsd as it will install the wrong port
$release =~ /(\d+\.\d+)/;
$release = $1;
if ( $release =~ /^5/ ) { push @SYSPKGS, 'compat4x'; }
elsif ( $release =~ /^6/ ) { push @SYSPKGS, 'compat4x', 'compat5x'; }
elsif ( $release =~ /^7/ ) { push @SYSPKGS, 'compat4x', 'compat5x', 'compat6x'; }
elsif ( $release =~ /^8/ ) { push @SYSPKGS, 'compat4x', 'compat5x', 'compat6x', 'compat7x'; }
foreach my $syspkg (@SYSPKGS) {
next if ( $syspkg =~ /pure-ftpd/i
|| $syspkg =~ /proftpd/i
|| $syspkg =~ /chkservd/i
|| $syspkg =~ /^mysql/i );
if ( $syspkg eq 'portupgrade' ) {
#keep portupgrade current
system( '/scripts/installpkg', '--keepnew', $syspkg );
}
else {
system( '/scripts/ensurepkg', $syspkg );
}
}
mkdir( '/root/.cpbsdpkgs', 0700 );
if ( !-d '/root/.cpbsdpkgs' ) {
die 'could not create /root/.cpbsdpkgs';
}
my %PKG;
print 'Creating package version list....(sysup)..';
my @PKGVERSIONS = split( /\n/, Cpanel::SafeRun::Simple::saferun('/usr/sbin/pkg_version') );
print "Done\n";
open( PKGVERSION, '>', '/root/.cpbsdpkgs/pkg_version' );
foreach my $pkgvers (@PKGVERSIONS) {
print PKGVERSION $pkgvers . "\n";
}
close(PKGVERSION);
foreach (@PKGVERSIONS) {
if (/^(\S+)[\s\t]*(\S+)/) {
my $pkgname = $1;
my $pkgver = $2;
$pkgname =~ s/-${machine}$//g;
next
if ( !defined $pkgname
|| $pkgname eq ''
|| $PKG{$pkgname} eq '='
|| $PKG{$pkgname} eq '>'
|| $pkgname =~ /pure-ftpd/i
|| $pkgname =~ /proftpd/i
|| $pkgname =~ /chkservd/i
|| $pkgname =~ /courier/
|| $pkgname =~ /^mysql/i
|| $pkgname =~ /^p5/
|| $pkgname eq 'lynx'
|| $pkgname eq 'linux_base'
|| $pkgname eq 'expect'
|| $pkgname eq 'apache'
|| $pkgname eq 'httpd'
|| $pkgname eq 'mod_php'
|| $pkgname eq 'mod_php3'
|| $pkgname eq 'mod_php4' );
$PKG{$pkgname} = $pkgver;
}
}
undef @PKGVERSIONS;
foreach my $pkg ( sort keys %PKG ) {
next if ( $pkg =~ /pure-ftpd/i
|| $pkg =~ /proftpd/i
|| $pkg =~ /courier/
|| $pkg =~ /chkservd/i
|| $pkg =~ /courier/i
|| $pkg =~ /^mysql/i );
if ( $PKG{$pkg} eq '<' ) {
if ( $UPCONF{'BSDPORTS'} eq 'yes' || grep { $_ eq $pkg } @SYSPKGS ) {
print "$pkg is out of date\n";
installport($pkg);
waitpid( -1, 1 );
}
}
elsif ( $PKG{$pkg} eq '=' ) {
print "$pkg is up to date\n";
}
elsif ( $PKG{$pkg} eq '>' ) {
print "$pkg is newer then current (you are living dangerously)\n";
}
else {
print "$pkg has an unknown version\n";
}
}
# Handle any perl update that happened above
system '/scripts/after_perl_upgrade', '--test';
if ( -f '/usr/sbin/ndc' ) {
rename( '/usr/sbin/ndc', '/usr/sbin/ndc.old' );
symlink( 'rndc', '/usr/sbin/ndc' );
}
my $hf = 0;
open( RCC, '/etc/rc.conf' );
while (<RCC>) {
if (/named_flags/) { $hf = 1; }
}
close(RCC);
if ( !$hf ) {
my $sl = Cpanel::SafeFile::safeopen( \*RCC, '>>', '/etc/rc.conf' );
if ( !$sl ) {
$logger->warn("Could not write to /etc/rc.conf");
exit;
}
print RCC qq{named_flags="-u bind -c /etc/namedb/named.conf"\n};
Cpanel::SafeFile::safeclose( \*RCC, $sl );
}
system '/scripts/fixrndc';
exit; #end freebsd
}
## case 27814: removed chunk of code which checked 'httpupdate.cpanel.net/pub/sysup/$tdir/.updates'
## to ensure updated versions of certain packages.
if ( -e '/usr/lib/libmysqlclient.so.10' ) {
system('(cd /usr/lib;ln -s libmysqlclient.so.10 libmysqlclient.so.9) >/dev/null 2>&1');
}
if ( -e '/usr/lib/libpq.so.3' && !-e '/usr/lib/libpq.so.2' ) {
system('(cd /usr/lib;ln -s libpq.so.3 libpq.so.2) >/dev/null 2>&1');
}
#system('rpm -e logcheck >/dev/null 2>&1');
checkrpmlist();
if ( -e '/usr/lib/libmysqlclient.so.9' && !-e '/usr/lib/libmysqlclient.so.6' ) {
system('(cd /usr/lib;ln -s libmysqlclient.so.9 libmysqlclient.so.6) >/dev/null 2>&1');
}
system('(cd /usr/sbin;ln -s rndc ndc) >/dev/null 2>&1');
sub checkrpmlist {
my @RPMLIST;
if ($isgentoo) {
@RPMLIST = qw(
bind
bind-tools
bind-libs
expect
freetype
gd
gd
gentoolkit
gnupg
libxml
libxml-devel
which
lsof
sysstat
libxml2
libxml2-devel
gettext
gettext-devel
gamin
gamin-devel
lynx
mirrorselect
openssh
openssl
portage
quota
rcs
sharutils
stunnel
tcp_wrappers-devel
traceroute
ucd-snmp
urw-fonts
wget
xfree
);
}
else {
@RPMLIST = qw(
bind
bind-devel
bind-libs
bind-utils
bzip2
crontabs
expect
freetype
freetype-devel
gcc
gcc-c++
gd
gd-devel
gd-progs
gd-utils
gettext
gettext-devel
glibc-devel
gnupg
libgcc
libgd1
libgd1-devel
libmysqlclient10-dev
libxml
libxml-devel
libstdc++
libstdc++-devel
which
lsof
sysstat
libxml2
libxml2-devel
gamin
gamin-devel
lynx
openssh
openssh-clients
openssh-server
openssl
openssl-devel
openssl-misc
perl-CPAN
sharutils
tcp_wrappers-devel
ucd-snmp
ucd-snmp-devel
ucd-snmp-utils
wget
urw-fonts
XFree86-devel
XFree86-libs
libXpm-devel
libX11-devel
vixie-cron
);
}
if ( $machine =~ /64/ ) {
push( @RPMLIST, 'libstdc++-devel.x86_64', 'glibc-devel.x86_64' );
}
if ( !has_working_syslog() ) {
push @RPMLIST, 'sysklogd';
}
# Just removed mysql from above
#@RPMLIST = grep(!/^mysql/i,@RPMLIST);
my $syspkgobj = Cpanel::SysPkgs->new();
if ( !$syspkgobj ) { die print "Could not create SysPkgs object\n"; }
$syspkgobj->install( 'pkglist' => \@RPMLIST );
}
sub rhelcheck {
my ( $rversion, $rises );
if ( -e '/etc/redhat-release' ) {
( $rversion, $rises ) = Cpanel::Sys::OS::getversionfromfile('/etc/redhat-release');
}
if ( -e '/etc/trustix-release' ) {
my ( $tversion, $tises ) = Cpanel::Sys::OS::getversionfromfile('/etc/trustix-release');
open( SWUP, '>', '/var/cpanel/useswup' );
close(SWUP);
return;
}
if ( -e '/etc/SuSE-release' ) {
my ( $tversion, $tises ) = Cpanel::Sys::OS::getversionfromfile('/etc/SuSE-release');
# Rug is only used for SLES
if ( $tises == 1 ) {
open( RUG, '>', '/var/cpanel/userug' );
close(RUG);
}
return;
}
if ( -e '/etc/gentoo-release' ) {
open( EMERGE, '>', '/var/cpanel/useemerge' );
close(EMERGE);
return;
}
if ( $rises == 1 ) {
if ( !-e '/var/cpanel/useup2date'
&& !-e '/var/cpanel/useapt'
&& !-e '/var/cpanel/useyum'
&& !-e '/var/cpanel/useswup' ) {
if ( -e '/usr/bin/apt-get' ) {
open( APT, '>', '/var/cpanel/useapt' );
close(APT);
}
else {
open( UP2DATE, '>', '/var/cpanel/useup2date' );
close(UP2DATE);
}
}
}
elsif ( $rises == 2 || $rises == 3 ) {
open( YUM, '>', '/var/cpanel/useyum' );
close(YUM);
}
}
sub gettruename {
my ($name) = @_;
$name =~ s/-\d+[^-]+$//g;
return ($name);
}
sub has_working_syslog {
my $output = Cpanel::SafeRun::Simple::saferun('/scripts/syslog_check');
if ( $output =~ m/syslog_check: passed/m ) {
return 1;
}
return 0;
}
sub find_shared_object {
my ($target) = @_;
foreach my $path ( '/usr/lib', '/lib', '/usr/local/lib', '/opt/lib' ) {
if ( -e $path . '/' . $target ) {
return $path . '/' . $target;
}
}
}