File: //proc/self/root/proc/self/root/scripts.20110531.215904.25158/restartsrv_mysql
#!/usr/bin/perl
# cpanel - restartsrv_mysql 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'; }
use RestartSrv;
use Cpanel::MysqlUtils ();
use Cpanel::OSSys ();
use Cpanel::SafeRun::Errors ();
use strict;
eval {
local $SIG{'__DIE__'};
require Cpanel::Rlimit;
Cpanel::Rlimit::set_rlimit_to_infinity();
};
setuppath();
my $lock_file = '/var/run/restartsrv_mysql.lock';
my ( $system, $nodename, $release, $version, $machine ) = Cpanel::OSSys::uname();
my ( $restart, $check, $status ) = parseargv();
my ( $processowner, $service ) = servicefixup( 'mysql', 'mysql' );
my $disabled = -e '/etc/mysqldisable' ? 1 : 0;
my $mysql_sock = `mysql_config --socket`;
chomp($mysql_sock);
my @SOCKETPTS = ( $mysql_sock, '/tmp/mysql.sock', '/var/tmp/mysql.sock', '/var/db/mysql/mysql.sock', '/var/lib/mysql/mysql.sock', '/usr/local/tmp/mysql.sock', '/usr/local/lib/mysql.sock' );
if ( $restart && !$disabled ) {
lock_file($lock_file);
my $manualstart = needsmanualstart( $system, $service );
my $iscript;
if ( !$manualstart ) {
$iscript = getinitfile( $service, $system );
}
if ($iscript) {
nooutputsystem( $iscript, 'stop' );
doomedprocess($service);
doomedprocess('safe_mysqld');
doomedprocess('mysqld_safe');
doomedprocess('mysqld');
if ( $restart != -1 ) {
unless ( fork() ) {
Cpanel::OSSys::setsid();
Cpanel::CleanupStub::daemonclosefds();
system "$iscript start &";
exit;
}
}
}
else {
doomedprocess($service);
doomedprocess('safe_mysqld');
doomedprocess('mysqld_safe');
doomedprocess('mysqld');
if ( $restart != -1 ) {
unless ( fork() ) {
Cpanel::OSSys::setsid();
Cpanel::CleanupStub::daemonclosefds();
system 'mysqld_safe --user=mysql &';
exit;
}
}
}
if ( $restart != -1 ) {
# Wait for socket creation, then create all symlinks
my $count = 0;
while ( $count < 90 && !get_socket() ) {
sleep 1;
$count++;
}
if ( $count < 90 ) { # Successfully located socket
symlink_mysql_socket();
# In transistion from Horde 3.1 to 3.1.x, Horde files will be missing if during upcp
# MySQL was not running
if ( !-e '/usr/local/cpanel/base/horde/config/conf.php.in'
&& !-e '/var/cpanel/dnsonly' ) {
system '/usr/local/cpanel/bin/update-horde';
}
}
else {
print "Failed to locate MySQL socket. Please check the mysql configuration.\n";
}
}
unlink $lock_file if -e $lock_file;
}
elsif ($status) {
#--status (show ps)
if ($disabled) {
print "mysql is disabled\n";
}
else {
print check_service( 'service' => 'mysqld_safe', 'user' => 'root' );
print check_service( 'service' => 'mysqld', 'user' => 'mysql' );
}
}
elsif ($check) {
exit if $disabled;
$ENV{'HOME'} = ( getpwnam('root') )[7];
symlink_mysql_socket();
checkmysqlpass();
use Socket;
my $hasmysql = 0;
my $mysqlok = 0;
eval {
require DBD::mysql;
$hasmysql = 1;
};
my $dbpassword = Cpanel::MysqlUtils::getmydbpass('root'); #read from /root/.my.cnf
if ( $hasmysql && $dbpassword ) {
eval {
local $SIG{__WARN__} = sub {
my $err = join( ' ', @_ );
if ( $err =~ /not support authentication protocol/i ) {
if ( my $pid = fork() ) {
waitpid( $pid, 0 );
}
else {
open( STDOUT, '>', '/dev/null' );
open( STDERR, '>', '/dev/null' );
open( STDIN, '<', '/dev/null' );
exec( "/scripts/perlinstaller", "--force", "Bundle::DBD::mysql" );
exit;
}
}
};
local $SIG{"ALRM"} = sub {
die "mysql connection timed out\n";
};
alarm(30);
my $dbh = DBI->connect( 'DBI:mysql:mysql:localhost', 'root', $dbpassword );
alarm(0);
unless ($dbh) {
die("Can't Connect");
}
$dbh->disconnect();
$mysqlok = 1;
};
}
if ( !$mysqlok ) {
my $mysqladmin = find_mysqladmin();
eval {
local $SIG{'ALRM'} = sub {
die "mysql connection timed out;";
};
alarm(30);
my $mysqlstatus = Cpanel::SafeRun::Errors::saferunallerrors( $mysqladmin, 'status' );
alarm(0);
if ( $mysqlstatus =~ m/uptime/i ) {
$mysqlok = 1;
}
};
}
if ( !$mysqlok ) {
print "mysql has failed\n";
}
}
sub get_socket {
my $realsocket;
foreach my $socket (@SOCKETPTS) {
if ( -e $socket && !-l $socket && -S $socket ) {
$realsocket = $socket;
last;
}
}
return $realsocket;
}
sub symlink_mysql_socket {
my $realsocket = get_socket();
if ( !$realsocket ) {
foreach my $socket (@SOCKETPTS) {
unlink $socket;
}
}
else {
foreach my $socket (@SOCKETPTS) {
next if $socket eq $realsocket;
my @DIR = split /\//, $socket;
pop @DIR;
my $dir = join '/', @DIR;
next if !-d $dir;
my $link = calclink( $realsocket, $socket );
if ( !-e $socket ) {
unlink $socket;
symlink $link, $socket;
}
elsif ( -l $socket ) {
my $link_target = readlink($socket);
if ( $link_target ne $link ) {
unlink $socket;
symlink $link, $socket;
}
}
}
}
return $realsocket;
}
sub calclink {
my ( $src, $dest ) = @_;
my @DDEST = split( /\//, $dest );
my @DD;
for ( my $i = 1; $i < $#DDEST; $i++ ) {
push( @DD, '..' );
}
return ( join( '/', @DD ) . $src );
}
sub checkmysqlpass {
return if $ENV{'MYSQLCCHK'} eq '1';
if ( -x '/scripts/mysqlconnectioncheck' ) {
nooutputsystem('/scripts/mysqlconnectioncheck');
}
}