Server IP : 103.119.228.120 / Your IP : 13.58.200.16 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/slurp_exim_mainlog 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::slurp_exim_mainlog; use strict; use warnings; use parent qw( Cpanel::HelpfulScript ); use Cpanel::EximStats::ImportInProgress (); use Cpanel::Autodie::Unlink (); use Cpanel::Daemonizer::Tiny (); use Cpanel::Exception (); use Cpanel::EximStats::Retention (); use Cpanel::FileUtils::Dir (); use Cpanel::FileUtils::TouchFile (); use Cpanel::PIDFile (); use Cpanel::Time::ISO (); use Try::Tiny; =encoding utf-8 =head1 NAME scripts::slurp_exim_mainlog =head1 SYNOPSIS slurp_exim_mainlog ( --reimport | --force | --help ) This command will do an import of the unarchived (non-'.gz') /var/log/exim_mainlog* files that are newer than the exim retention setting (90 by default) days. The slurp normally will only run once, but if you pass the --reimport flag it will attempt to import the log files after a 7 day waiting period. If you pass the --force flag, the import will start with no regard to the last time it ran. =head1 DESCRIPTION This script does an import of the exim_mainlog files in /var/log. The import can only happen once every 7 days =cut our $EXIM_LOG_DIR = '/var/log'; our $PID_FILE = '/var/run/slurp_exim_mainlog.pid'; our $OUTPUT_LOG_DIR = '/var/cpanel/logs'; our $OUTPUT_LOG_FILE = 'eximstats_sqlite_import.log'; our $MAX_OUTPUT_LOG_AGE = 30 * 24 * 60**2; # 30 days our $TIME_BETWEEN_IMPORTS = 7 * 24 * 60**2; # 7 days sub _OPTIONS { return qw( force reimport ); } __PACKAGE__->new(@ARGV)->script() unless caller(); ## CAVEATS re: case 53744 ## 1. the eximstats schema handles dedupes, so we process all recent files ## 2. TaskQueue is overkill for this one-time slurp sub script { my ($self) = @_; my $time = _time(); ## skip the slurp of exim_mainlog* if the touch file exists and it hasn't been TIME_BETWEEN_IMPORTS yet if ( !$self->getopt('force') ) { if ( $self->getopt('reimport') ) { my $last_import_time = ( stat $Cpanel::EximStats::ImportInProgress::IMPORTED_FILE )[9] || 0; my $seconds_since_last_import = ( $time - $last_import_time ); if ( -e $Cpanel::EximStats::ImportInProgress::IMPORTED_FILE && $TIME_BETWEEN_IMPORTS > $seconds_since_last_import ) { print "[slurp_exim_mainlog] Skipping re-import because the logs were last imported at " . scalar localtime($last_import_time) . ", and the system only allows imports every $TIME_BETWEEN_IMPORTS seconds without the --force flag.\n"; return; } } else { if ( -e $Cpanel::EximStats::ImportInProgress::IMPORTED_FILE ) { print "[slurp_exim_mainlog] Skipping import because the logs were already imported.\n"; return; } } } my $IMPORT_LOG_AGE_LIMIT = 60**2 * 24 * ( int( Cpanel::EximStats::Retention::get_valid_exim_retention_days() ) || 60 ); Cpanel::PIDFile->do( $PID_FILE, sub { my %imports; for my $log ( grep { m/^exim_mainlog/ } @{ Cpanel::FileUtils::Dir::get_directory_nodes($EXIM_LOG_DIR) } ) { # Skip archived logs for this import next if substr( $log, -3 ) eq '.gz'; my $age = ( stat("$EXIM_LOG_DIR/$log") )[9]; ## eximstats shows info for 90 days by default, but it's configurable next if ( $time - $age > $IMPORT_LOG_AGE_LIMIT ); $imports{"$EXIM_LOG_DIR/$log"} = $age; } my @imports = keys %imports ? map { $_->[0] } sort { $b->[1] <=> $a->[1] } map { [ $_, $imports{$_} ] } keys %imports : (); Cpanel::FileUtils::TouchFile::touchfile($Cpanel::EximStats::ImportInProgress::IMPORTED_FILE); $self->call_import_exim_data( \@imports ); } ); return; } # In a function for tests sub call_import_exim_data { my ( $self, $imports_ar ) = @_; if ( !scalar @$imports_ar ) { print "[slurp_exim_mainlog] there were no exim_mainlog files new enough to import.\n"; return; } $self->remove_old_output_logs(); my $log_file = "$OUTPUT_LOG_DIR/$OUTPUT_LOG_FILE." . Cpanel::Time::ISO::unix2iso(); print "[slurp_exim_mainlog] starting import of the exim_mainlog files. Output will be logged to: $log_file\n"; Cpanel::Daemonizer::Tiny::run_as_daemon( sub { close(STDIN); open( STDIN, "<", "/dev/null" ); open( my $log_fh, '>>', $log_file ); open( STDOUT, ">&=", $log_fh ); open( STDERR, ">&=", $log_fh ); exec( '/usr/local/cpanel/scripts/import_exim_data', @$imports_ar ); } ); return; } sub remove_old_output_logs { my ($self) = @_; my @logs_to_remove; for my $log ( grep { m/^\Q$OUTPUT_LOG_FILE\E\.[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z$/ } @{ Cpanel::FileUtils::Dir::get_directory_nodes($OUTPUT_LOG_DIR) } ) { my $log_path = "$OUTPUT_LOG_DIR/$log"; next if !-e $log_path || _time() - ( stat(_) )[9] < $MAX_OUTPUT_LOG_AGE; push @logs_to_remove, $log_path; } try { Cpanel::Autodie::Unlink::unlink_if_exists_batch(@logs_to_remove) if scalar @logs_to_remove; } catch { warn "[slurp_exim_mainlog] there was a problem removing old output logs: " . Cpanel::Exception::get_string_no_id($_); }; return; } # For tests sub _time { return time(); }