$job) { $jobName = substr($k,(strlen($job["job_type"])+1)); $all_jobs[] = Scheduler::$user_dir.$job["job_type"]."/".$jobName; $archiveDir = Scheduler::$user_dir.Scheduler::$archive."/".$jobName; if($job["job_type"] == BACKUPDIR && file_exists($archiveDir)){ $all_jobs[] = $archiveDir; } } $log_files = self::ReadLogFiles(true, $all_jobs, $duration); return $log_files; } public static function ReadAllPid() { $jobs = Scheduler::ReadJobs(); $all_jobs = array(Scheduler::$backup_dir.Scheduler::$manual_dir,Scheduler::$localbackup_dir.Scheduler::$manual_dir,Scheduler::$restore_dir.Scheduler::$manual_dir,Scheduler::$localrestore_dir.Scheduler::$manual_dir,Scheduler::$archiveclean_dir.Scheduler::$manual_dir); foreach($jobs as $k=>$job) { $jobName = substr($k,(strlen($job["job_type"])+1)); $all_jobs[] = Scheduler::$user_dir.$job["job_type"]."/".$jobName; $archiveDir = Scheduler::$user_dir.Scheduler::$archive."/".$jobName; if($job["job_type"] == BACKUPDIR && file_exists($archiveDir)){ $all_jobs[] = $archiveDir; } } $watcher = array(); foreach($all_jobs as $job) { $pidtxt = $job."/".LOG_PID_FILE; if(file_exists($pidtxt)) { $log_file_full = file_get_contents($pidtxt); if($log_file_full != "") { $log_file_full_arr = explode("/", $log_file_full); $log_details = explode("_", $log_file_full_arr[count($log_file_full_arr) - 1]); $full_path = trim($job."/".self::$log_dir."/".$log_details[0]); $job_details = explode("/", $job); $log_details_arr = explode(" ", $log_details[0]); $datetime = $log_details_arr[0]." ".$log_details_arr[1]; $job_name = $job_details[count($job_details) - 1]; $job_type = $job_details[count($job_details) - 2]; $meridian = trim($log_details_arr[2]); $datetime .= " $meridian"; if(count($log_details) > 1) { @unlink($pidtxt); $status = trim($log_details[1]); }else { $status = "In Progress"; } if (file_exists($log_file_full)){ $watcher[$full_path] = array("datetime"=>$datetime, "timestamp"=>strtotime($datetime), "job_name"=>$job_name, "job_type"=>$job_type, "status"=>$status); } } } } return $watcher; } public static function WatchLogs() { $watcher = self::ReadAllPid(); return array("watcher"=>$watcher); } /********************************************************************************************************* * Function Name : getDateRange * Objective : This function will return time stamp for the passed duration * Added By : Sabin Cheruvattil | 2016-06-07 **********************************************************************************************************/ protected static function getDateRange($duration = '') { $date_range = array(); switch($duration) { case 'all': $date_range['start'] = ''; $date_range['end'] = ''; break; case '1month': $date_range['start'] = mktime(0, 0, 0, date('n') - 1); $date_range['end'] = mktime(23, 59, 59); break; case '2week': $date_range['start'] = mktime(0, 0, 0, date('n'), date('j') - 14); $date_range['end'] = mktime(23, 59, 59); break; case '1week': default: $date_range['start'] = mktime(0, 0, 0, date('n'), date('j') - 7); $date_range['end'] = mktime(23, 59, 59); break; } return $date_range; } /********************************************************************************************************* * Function Name : ReadLogFiles * Objective : This function will provide the set of log files * Modified By : Sabin Cheruvattil | 2016-06-07 **********************************************************************************************************/ public static function ReadLogFiles($array = true, $all_jobs, $duration = '') { if($array) { $log_array = array(); $date_range = Log::getDateRange($duration); foreach($all_jobs as $job) { $log_dir = $job."/".self::$log_dir; if(is_dir($log_dir)){ if($dh = opendir($log_dir)) { while(($file = readdir($dh)) !== false) { if(($file === ".") || ($file === "..") || (strpos($file, "_ERRORFILE") !== FALSE) || ($file === "PROGRESS_DETAILS") || ($file === "LOG_DETAILS") || (strpos($file, ".pid") !== FALSE)) { continue; } else { $log_details = explode("_", $file); $key = $log_dir . "/" . $log_details[0]; $log_details_arr = explode(" ", $log_details[0]); $type = ''; $datetime = ''; if(count($log_details_arr) > 3) { $datetime = str_replace('-', '/', $log_details_arr[0]) . " " . $log_details_arr[1] . ' ' . $log_details_arr[2]; $type = $log_details_arr[3]; } else { $datetime = str_replace('-', '/', $log_details_arr[0])." ".$log_details_arr[1]; $type = $log_details_arr[2]; } $timestamp = strtotime($datetime); if(($date_range['start'] != '' && $date_range['start'] > $timestamp) || ($date_range['end'] != '' && $date_range['end'] < $timestamp)) { continue; } $log_array[$key] = array(); $job_details = explode("/", $job); $log_array[$key]["job_name"] = $job_details[count($job_details) - 1]; $log_array[$key]["job_type"] = $job_details[count($job_details) - 2]; if($log_array[$key]["job_type"] == 'Delete') $log_array[$key]["job_type"] = ucfirst(strtolower($type)); $log_array[$key]["type"] = $type; $log_array[$key]["datetime"] = $datetime; $log_array[$key]["timestamp"] = $timestamp; if(count($log_details) > 1) { $log_array[$key]["status"] = $log_details[1]; } else { $log_array[$key]["status"] = "In Progress"; # added by anil for log related issues on 16/11/2018 $log_array[$key]["status"] = self::checkAndRenameFileWithStatus($job, $key); } } } closedir($dh); } } } return array("logs" => $log_array, "count" => count($log_array)); } } /**************************************************************************************************** * Function Name : checkAndRenameFileWithStatus * Objective : This is to update status for log which is in progress with out running process. * Added By : Anil Kumar ******************************************************************************************************/ public static function checkAndRenameFileWithStatus($jobDir, $key) { $pidFile = $jobDir."/".PID_FILE; $logpidFile = $jobDir."/".LOG_PID_FILE; $startPid = $jobDir."/".START_PID; $statusToUpdate = "In Progress"; if((!file_exists($pidFile)) && (file_exists($logpidFile)) && (!file_exists($startPid)) ) { $handle = fopen($logpidFile,'r+'); if(flock($handle, LOCK_EX|LOCK_NB)) { flock($handle,LOCK_UN); $buffer = fread($handle, LIMIT); fclose($handle); $statusToUpdate = "ABORTED"; # need to check and update status $considered = $success = $synced = $failed = $status = $logFile = ""; $isSummary = 0; $cmd = "tail -10 \"$key\""; $logData = `$cmd`; $res1 = explode("\n", $logData); foreach($res1 as $line){ if(trim($line)!=''){ if (!$isSummary && (strpos($line, 'Summary:') !== false)) { $isSummary = 1; } elseif($isSummary && (strpos($line, 'considered') !== false)){ $data = explode(":", $line); $considered = $data[1]; trim($considered); } elseif($isSummary && ((strpos($line, 'backed') !== false) || (strpos($line, 'restored'!== false)))){ $data = explode(":", $line); $success = $data[1]; trim($success); } elseif($isSummary && (strpos($line, 'already present') !== false)){ $data = explode(":", $line); $synced = $data[1]; trim($synced); } elseif($isSummary && (strpos($line, 'failed') !== false)){ $data = explode(":", $line); $failed = $data[1]; trim($failed); } } } if($isSummary){ if($failed > 0 || $considered == 0){ $statusToUpdate = "FAILURE"; } elseif($considered == ($success+$synced)){ $statusToUpdate = "SUCCESS"; } } # need to change the status. $newName = "$key"."_".$statusToUpdate; $resCmd = "mv \"$key\" \"$newName\""; $res = `$resCmd`; } } return $statusToUpdate; } } ?>