Server IP : 103.119.228.120 / Your IP : 3.133.152.189 Web Server : Apache System : Linux v8.techscape8.com 3.10.0-1160.119.1.el7.tuxcare.els2.x86_64 #1 SMP Mon Jul 15 12:09:18 UTC 2024 x86_64 User : nobody ( 99) PHP Version : 5.6.40 Disable Function : shell_exec,symlink,system,exec,proc_get_status,proc_nice,proc_terminate,define_syslog_variables,syslog,openlog,closelog,escapeshellcmd,passthru,ocinum cols,ini_alter,leak,listen,chgrp,apache_note,apache_setenv,debugger_on,debugger_off,ftp_exec,dl,dll,myshellexec,proc_open,socket_bind,proc_close,escapeshellarg,parse_ini_filepopen,fpassthru,exec,passthru,escapeshellarg,escapeshellcmd,proc_close,proc_open,ini_alter,popen,show_source,proc_nice,proc_terminate,proc_get_status,proc_close,pfsockopen,leak,apache_child_terminate,posix_kill,posix_mkfifo,posix_setpgid,posix_setsid,posix_setuid,dl,symlink,shell_exec,system,dl,passthru,escapeshellarg,escapeshellcmd,myshellexec,c99_buff_prepare,c99_sess_put,fpassthru,getdisfunc,fx29exec,fx29exec2,is_windows,disp_freespace,fx29sh_getupdate,fx29_buff_prepare,fx29_sess_put,fx29shexit,fx29fsearch,fx29ftpbrutecheck,fx29sh_tools,fx29sh_about,milw0rm,imagez,sh_name,myshellexec,checkproxyhost,dosyayicek,c99_buff_prepare,c99_sess_put,c99getsource,c99sh_getupdate,c99fsearch,c99shexit,view_perms,posix_getpwuid,posix_getgrgid,posix_kill,parse_perms,parsesort,view_perms_color,set_encoder_input,ls_setcheckboxall,ls_reverse_all,rsg_read,rsg_glob,selfURL,dispsecinfo,unix2DosTime,addFile,system,get_users,view_size,DirFiles,DirFilesWide,DirPrintHTMLHeaders,GetFilesTotal,GetTitles,GetTimeTotal,GetMatchesCount,GetFileMatchesCount,GetResultFiles,fs_copy_dir,fs_copy_obj,fs_move_dir,fs_move_obj,fs_rmdir,SearchText,getmicrotime MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /scripts/ |
Upload File : |
#!/usr/local/cpanel/3rdparty/bin/perl # cpanel - scripts/check_mysql Copyright 2022 cPanel, L.L.C. # All rights reserved. # copyright@cpanel.net http://cpanel.net # This code is subject to the cPanel license. Unauthorized copying is prohibited package scripts::check_mysql; use strict; use warnings; use Cpanel::Services::Enabled (); use Cpanel::ConfigFiles (); use Cpanel::Daemonizer::Tiny (); use Cpanel::FileUtils::Open (); use Cpanel::FindBin (); use Cpanel::DB::Reserved (); use Cpanel::MysqlUtils::MyCnf::Basic (); use Cpanel::MysqlUtils::Dir (); use Cpanel::Alarm (); use Cpanel::Unix::PID::Tiny (); use Cpanel::Imports; exit script(@ARGV) unless caller; sub report_errors { my ($errors) = @_; require Cpanel::Notify; Cpanel::Notify::notification_class( 'class' => 'Check::MySQL', 'application' => 'Check::MySQL', 'constructor_args' => [ 'origin' => 'check_mysql', 'report' => $errors, ] ); return; } sub run_mysqlcheck { my ( $mysqlcheck, $db ) = @_; my @output = `LANG=C $mysqlcheck -u root -m --silent --databases $db 2>&1`; return @output; } sub daemon_process { my ($uxpd) = @_; $uxpd->pid_file('/var/run/check_mysql.pid'); # update our pid file to new sporked PID # These are the databases we analyze my @databases = grep { !m/^pg_/ && !m/^postgres$/ && !m/^test$/ } Cpanel::DB::Reserved::get_reserved_database_names(); my $timeout_seconds = 64800; # 64800 seconds == 18 hours my $mysqlcheck = Cpanel::FindBin::findbin("mysqlcheck"); my $mysqldir = Cpanel::MysqlUtils::Dir::getmysqldir() || '/var/lib/mysql'; my %errors; my %processed; my $ret = eval { # must go out of scope to stop and clean up, ick on a stick my $timeout = Cpanel::Alarm->new( $timeout_seconds, sub { die "time out\n" } ); for my $db (@databases) { if ( $db ne 'mysql' && !-d "$mysqldir/$db" ) { # if mysql is missing then @output contains an error $processed{$db} = 1; next; } logger->info("starting mysqlcheck on $db (PID $$)"); my @output = run_mysqlcheck( $mysqlcheck, $db ); if ( grep { /error: 2002: Can't connect/ } @output ) { logger->warn("mysqlcheck can't connect to MySQL"); return 0; } logger->info("mysqlcheck of $db is finished (PID $$)"); my $oops = purge_warnings( \@output ); if ($oops) { logger->warn("mysqlcheck found errors on $db: $oops"); $errors{$db} = $oops; } else { logger->info("mysqlcheck found no errors on $db"); } $processed{$db} = 2; } return 1; }; return if defined $ret && $ret == 0; for my $db (@databases) { next if exists $processed{$db}; next if $db ne 'mysql' && !-d "$mysqldir/$db"; # in case the timeout happened right before $processed{$db} = 1; we just won a race! my $timeout_hours = $timeout_seconds / 60 / 60; $errors{$db} = "not checked because mysqlcheck has been running for $timeout_hours hours (large data? $mysqldir partition full?)"; } if ( keys %errors ) { report_errors( \%errors ); } return; } sub script { local $ENV{'HOME'} = '/root'; die "/usr/local/cpanel/scripts/check_mysql is currently disabled.\n" if -e '/etc/check_mysql_disable'; die "MySQL is disabled.\n" unless Cpanel::Services::Enabled::is_enabled('mysql'); # This script is not written in a way so as to support remote mysql servers die "Remote MySQL database servers are not supported.\n" if Cpanel::MysqlUtils::MyCnf::Basic::is_remote_mysql(); # this can be an expensive and thus time consuming thing so only allow one run at a time and give it a large timeout (via $timeout_seconds) my $uxpd = Cpanel::Unix::PID::Tiny->new(); die "/usr/local/cpanel/scripts/check_mysql is currently running.\n" if !$uxpd->pid_file('/var/run/check_mysql.pid'); my $pid = Cpanel::Daemonizer::Tiny::run_as_daemon( sub { Cpanel::FileUtils::Open::sysopen_with_real_perms( \*STDERR, $Cpanel::ConfigFiles::CPANEL_ROOT . '/logs/error_log', 'O_WRONLY|O_APPEND|O_CREAT', 0600 ); open( STDOUT, '>&', \*STDERR ) || warn "Failed to redirect STDOUT to STDERR"; daemon_process($uxpd); } ); print locale->maketext( "“[_1]” will complete in the background (process ID [_2]).", 'check_mysql', $pid ) . "\n"; return 0; } sub purge_warnings { my ($output_ar) = @_; my $full_output = ''; # Loop through each line get rid of warnings my $previous_line = ''; foreach my $line (@$output_ar) { chomp $line; # Skip the warnings and a non-Error-error: http://bugs.mysql.com/bug.php?id=30487 if ( $line =~ /^([iI]nfo|[nN]ote|[wW]arning)/ || $line =~ m/Error\s*:\s*You can't use locks with log tables\./ ) { $previous_line = ''; next; } # We only allow a line if it is not followed by a warning $full_output .= $previous_line . "\n" if $previous_line; $previous_line = $line; } $full_output .= $previous_line . "\n" if $previous_line; return $full_output; }