prepare("INSERT INTO IDriveLocalTable (FILEPATH, MOD_DT, FILESIZE, LEVELCOUNT) values (?,?,?,?)") ; $dbh_update = $dbh->prepare("UPDATE IDriveLocalTable SET MOD_DT = ?, FILESIZE = ? , PRESENTDATE = ? , LEVELCOUNT = ? WHERE FILEPATH = ?"); } catch(PDOException $e){ $errStr = "Error: Prepare statement failed for insert/update. Reason: ".$e->getMessage(); traceLog($errStr); writeOperationErrorToErrorFile($errStr); unset($dbh); exit; } } } //$localtime = date("D M d H:i:s Y"); $localtime = trim(shell_exec('date +"%a %b %d %T %Y"')); $pos = 0; $i = 0; do{ $item = $BackupArray[$i]; $itemSize = trim($BackupArraySize[$i],"\n"); $itemLMod = trim($BackupArrayLMod[$i],"\n"); $type = filetype($item); if($type == 'link' || $type == 'socket' || $type == 'fifo' || $type == 'block' || $type == 'char') { $i++; continue; /* This is removed to fix the issue Snigdha_2.04.06_03_16 by discussing with deepak $printItem = getPrintItem($item); $content = "[$localtime] [EXCLUDED] [$printItem]. Reason: Not a regular file.".LINEFEED; if(! ($logOutputHandle = fopen($BackupExcludesetFile, "a"))) traceLog("Could not open file $logOutputFilePath, Reason : ".customErrorMsg()); fwrite($logOutputHandle,$content); fclose($logOutputHandle); $i++; continue;*/ } if(($hidden == 'Disabled') && preg_match('/\/\./',$item)){ $i++; continue; } $printItem = getPrintItem($item); if(!is_readable($item)){ if(!file_exists($item)) fwrite($ERRORFAILEDFILE, "[".$localtime."] [FAILED] [$printItem] Reason: No such file or directory".LINEFEED); else fwrite($ERRORFAILEDFILE, "[".$localtime."] [FAILED] [$printItem] Reason: Permission denied".LINEFEED); $failedFilesCount++; $totalFiles++; $i++; continue; } loadExcludeArray(); $ret = excludeCheck($item, $printItem); if($ret == 1){ $i++; continue; } elseif($ret == 2){ generateBackupsetCleanup(""); return; } if(is_dir($item)){ if(!file_exists(PIDFILE)) break; if($relative == 0){ $Backupfilecount = 0; $noRelIndex++; $BackupFile = $BackupsetFile_norelative."$noRelIndex"; $filecount = 0; $pos = strrpos($item, "/"); $source[$noRelIndex] = substr($item,0,$pos); if($source[$noRelIndex] == "") $source[$noRelIndex] = "/"; $current_source = $source[$noRelIndex]; if(!($filehandle = fopen($BackupFile,"w"))){ $errStr = "Unable to open $BackupFile to write, Reason: $!"; generateBackupsetCleanup($errStr); return; } } if(!$isLocalBackup){ $retVal = getSearchResultfromDB($item, 0); if(!$retVal){ $errStr = "Unable to open ExtendedBackupList file to write."; generateBackupsetCleanup($errStr); return; } elseif($retVal == 2){ $i++; continue; } } if(PHP_INT_MAX <= 2147483647){ if(!enumerateFromLS($item)){ $errStr = "List Enumerate failed for item : $item \n"; $i++; continue; //generateBackupsetCleanup($errStr); //return; } } else{ if(!enumerate($item)){ $errStr = "Enumerate failed for item : $item \n"; generateBackupsetCleanup($errStr); return; } } if($relative == 0 && $filecount>0) fwrite($FD_WRITE, "$BackupFile ".RELATIVE." $current_source\n"); } else{ # added new code to to fix Snigdha_2.04.06_09_7 $temp = ""; $temp = trim($item, "\n"); if($isLocalBackup === 1) { if(strpos($temp, $backupLocation) !== false) { $localtime = trim(shell_exec('date +"%a %b %d %T %Y"')); $content = "[$localtime] [EXCLUDED] [$item]. Reason: Item belongs to same express device.".LINEFEED; if(!($logOutputHandle = fopen($BackupExcludesetFile, 'a'))){ traceLog("Could not open file $logOutputFilePath, Reason : " . customErrorMsg()); } fwrite($logOutputHandle, $content); fclose($logOutputHandle); $failedFilesCount++; $totalFiles++; $i++; continue; } } fwrite($BACK_FILE, $printItem.LINEFEED); $customFileData = customFileSizeFromLS($item); $totalSize += $customFileData; $enumerateFileSize += $customFileData; $current_source = getSource(); if($relative == 0){ $filesonlycount++; $filecount = $filesonlycount; } else $filecount++; $totalFiles++; if($filecount == FILE_MAX_COUNT || $enumerateFileSize >= BACKUP_SET_MAX_SIZE){ $filesonlycount = 0; if(!createBackupSetFiles1k("FILESONLY")){ $errStr = "\nCouldnot open new Backupsetfile for files only to write."; generateBackupsetCleanup($errStr); return; } } } $i++; if(!$isLocalBackup and ($backupArrayCount == $i)){ $BackupArray = array(); loadExtendedList(); $i = 0; $backupArrayCount = count($BackupArray); } }while($i <= $backupArrayCount-1); # create totalsize.txt file_put_contents(TOTAL_SIZE_PATH, $totalSize); @chmod(TOTAL_SIZE_PATH, PERMISSIONVAL); if(!$isLocalBackup) readRemainingResultsFromDB(); if($relative == 1 && $filecount == 0) @unlink($BackupFile); elseif($filesonlycount == 0) @unlink($fileOnlySetName); $mdtCheck = false; if($relative == 1 && $filecount > 0){ //if(file_exists($dedupDetailFile) && file_exists($BackupFile)) //$mdtCheck = createAndVerifyCheckSum($BackupFile); $current_source = getSource(); fwrite($FD_WRITE, "$BackupFile ".RELATIVE." $current_source $mdtCheck\n"); } elseif($filesonlycount > 0){ if(file_exists($dedupDetailFile) && file_exists($fileOnlySetName)) $mdtCheck = createAndVerifyCheckSum($fileOnlySetName); $current_source = "/"; fwrite($FD_WRITE, "$fileOnlySetName ".NORELATIVE." $current_source $mdtCheck\n"); } if(is_resource($EXTN)) fclose($EXTN); generateBackupsetCleanup(""); } #**************************************************************************************************** # Subroutine Name : generateBackupsetCleanup # Objective : To complete the error cleanup and exit out of generateBackupset Function # Added By : Pooja Havaldar #*****************************************************************************************************/ function generateBackupsetCleanup($errStr = '') { GLOBAL $FD_WRITE, $bacSync, $totalFiles, $failedFilesCount, $ERRORFAILEDFILE, $BACK_FILE, $dbh; fwrite($FD_WRITE, "BAC_SYNC $bacSync\n"); fwrite($FD_WRITE, "TOTALFILES $totalFiles\n"); fwrite($FD_WRITE, "FAILEDCOUNT $failedFilesCount"); fclose($FD_WRITE); fclose($ERRORFAILEDFILE); if(is_resource($BACK_FILE)) fclose($BACK_FILE); if("" != $errStr) writeOperationErrorToErrorFile($errStr); # newly added if dbh is defined then only close. if($dbh) unset($dbh); } #********************************************************************************************************** # Subroutine Name : enumerate # Objective : This function recursively enumerates a directly and enters data in the created # backupset files. # Added By : Pooja Havaldar #**********************************************************************************************************/ function enumerate($item) { GLOBAL $failedFilesCount, $jobDir; GLOBAL $totalFiles, $filecount; GLOBAL $isLocalBackup; GLOBAL $backupLocation; GLOBAL $relative; GLOBAL $totalSize, $enumerateFileSize; GLOBAL $current_source; GLOBAL $hidden; GLOBAL $ERRORFAILEDFILE, $filehandle, $BACK_FILE, $logOutputFilePath,$BackupExcludesetFile; GLOBAL $checkCPUUsage; /*if(!file_exists(PIDFILE)) break;*/ if(++$checkCPUUsage%100 === 0) usleep(1000); // 1000 == 1 millisecond $backupLocation1 = $backupLocation; if(file_exists($dedupDetailFile)) $backupLocation1 = ''; //$localtime = date("D M d H:i:s Y"); $localtime = trim(shell_exec('date +"%a %b %d %T %Y"')); $retVal = 1; $errStr = ""; if (substr($item, -1, 1) != "/") $item .= "/"; # get path after 1st level $printItem = getPrintItem($item); if($DIR = opendir($item)) { while (($file = readdir($DIR)) !== false) { if(!file_exists(PIDFILE)) break; if ($file == "." or $file == "..") continue; $temp = ""; $temp = trim($item.$file,"\n"); $type = filetype($temp); if($type == 'link' || $type == 'socket' || $type == 'fifo' || $type == 'block' || $type == 'char') { continue; } if(($hidden === 'Disabled') && preg_match("/\/\./", $temp)) continue; if($isLocalBackup === 1){ if(strpos($temp,$backupLocation)!==false){ $content = "[$localtime] [EXCLUDED] [{$printItem}{$file}]. Reason: Item belongs to same express device.".LINEFEED; if(! ($logOutputHandle = fopen($BackupExcludesetFile, "a"))){ traceLog("Could not open file $logOutputFilePath, Reason : ".customErrorMsg()); } fwrite($logOutputHandle,$content); fclose($logOutputHandle); continue; } } if(!is_readable($temp)){ if(!file_exists($temp)) fwrite($ERRORFAILEDFILE, "[".$localtime."] [FAILED] [$printItem$file] Reason : No such file or directory".LINEFEED); else fwrite($ERRORFAILEDFILE, "[".$localtime."] [FAILED] [$printItem$file] Reason : Permission denied".LINEFEED); $failedFilesCount++; $totalFiles++; continue; } $ret = excludeCheck($temp, $printItem.$file); if($ret == 1) continue; elseif($ret == 2){ $retVal = 0; break; } if(is_dir($temp)){ if(!enumerate($temp)){ $errStr = "Enumerate failed for item : $temp \n"; $retVal = 0; break; } } else{ /* To Test Retry if($filecount%2 != 0) $file = $file."_ODD"; */ $totalFiles++; if(!$isLocalBackup){ if(checkForSync($backupLocation1.$printItem.$file, $temp, 0)) #This subroutine checks for sync and remaining entries are written to PartialSyncFile continue; } $customFileSizeData = sprintf("%u",filesize($temp)); if($relative == 0){ $item_orig = $item; $totalSize += $customFileSizeData; $enumerateFileSize += $customFileSizeData; if($current_source != "/"){ $current_source_quote = preg_quote($current_source, '/'); $item_orig = preg_replace("/$current_source_quote/","",$item_orig,1); } $temp = $item_orig.$file; fwrite($filehandle, "$temp".LINEFEED); } else{ $current_source = getSource(); fwrite($BACK_FILE, $printItem.$file.LINEFEED); $totalSize += $customFileSizeData; $enumerateFileSize += $customFileSizeData; } $filecount++; if($filecount == FILE_MAX_COUNT || $enumerateFileSize >= BACKUP_SET_MAX_SIZE){ if(!file_exists(PIDFILE)) break; if(!createBackupSetFiles1k("")){ $errStr = "\nCouldnot open new Backupsetfile to write."; $retVal = 0; break; } } } } closedir($DIR); } else{ $reason = customErrorMsg(); $errStr = "Unable to open directory $item, Reason:$reason\n"; if(strpos($reason,'Permission denied')>=0) fwrite($ERRORFAILEDFILE, "[".$localtime."] [FAILED] [$printItem] Reason : Permission denied.".LINEFEED); else fwrite($ERRORFAILEDFILE, "[".$localtime."] [FAILED] [$printItem] Reason : No such file or directory.".LINEFEED); $failedFilesCount++; $totalFiles++; } if("" != $errStr){ traceLog($errStr); writeOperationErrorToErrorFile($errStr); } return $retVal; } #**************************************************************************************************** # Subroutine Name : createBackupSetFiles1k. # Objective : Construct the backup set file/files based on relative or no-relative. # Added By : Pooja Havaldar #*****************************************************************************************************/ function createBackupSetFiles1k($filesOnly_flag) { GLOBAL $Backupfilecount, $filecount, $enumerateFileSize; GLOBAL $relative, $fileOnlySetName, $current_source, $BackupsetFile_filesOnly ; GLOBAL $filesOnlyFile_count, $BackupFile, $noRelIndex, $BackupsetFile_norelative, $BackupsetFile_relative; GLOBAL $FD_WRITE, $BACK_FILE, $filehandle, $dedupDetailFile; $filecount = 0; $enumerateFileSize = 0; $Backupfilecount++; $mdtCheck = false; //if(file_exists($dedupDetailFile)) //$mdtCheck = createAndVerifyCheckSum($BackupFile); if($relative == 0){ if($filesOnly_flag == "FILESONLY"){ $filesOnlyFile_count++; fwrite($FD_WRITE, "$fileOnlySetName ".NORELATIVE." $current_source $mdtCheck\n"); $fileOnlySetName = $BackupsetFile_filesOnly."_".$filesOnlyFile_count; fclose($BACK_FILE); if(!($BACK_FILE = fopen($fileOnlySetName,"w"))){ traceLog("Unable to open $fileOnlySetName to write, Reason: ".customErrorMsg()); return 0; } } else{ fwrite($FD_WRITE, "$BackupFile ".RELATIVE." $current_source $mdtCheck\n"); $BackupFile = $BackupsetFile_norelative."$noRelIndex"."_$Backupfilecount"; fclose($filehandle); if(!($filehandle = fopen($BackupFile,"w"))){ traceLog("Unable to open file $BackupFile to write, Reason: ".customErrorMsg()); return 0; } } } else{ fwrite($FD_WRITE, "$BackupFile ".RELATIVE." $current_source $mdtCheck\n"); $BackupFile = $BackupsetFile_relative."_$Backupfilecount"; fclose($BACK_FILE); if(!($BACK_FILE = fopen($BackupFile,"w"))){ traceLog("Unable to open file $BackupFile to write, Reason: ".customErrorMsg()); return 0; } } return 1; } #************************************************************************************************************************** # Subroutine Name : getBackupOperationType. # Objective : This subroutine reads the .relative.txt to get the type of Backup Operation - mirror/relative # and also open the intermediate files required for backup based on mirror/relative # Added By : Pooja Havaldar #**************************************************************************************************************************/ function getBackupOperationType() { GLOBAL $isLocalBackup; GLOBAL $rel_Data; GLOBAL $relative; GLOBAL $current_source; GLOBAL $BackupFile; GLOBAL $BackupsetFile_relative; GLOBAL $BackupsetFile_filesOnly; GLOBAL $BACK_FILE; GLOBAL $userDir; # get the backup operation type mirror/relative if(($isLocalBackup == 1) or !file_exists("$userDir/".RELATIVE_FILEPATH)){ $rel_Data = RELATIVE; $relative = 1; $current_source = "/"; } else{ $rel_Data = file_get_contents("$userDir/".RELATIVE_FILEPATH); $rel_Data = trim($rel_Data); if($rel_Data === RELATIVE){ $relative = 1; $current_source = "/"; } else $relative = 0; } if(!is_dir(TEMP_FILES)){ if(! mkdir(TEMP_FILES)){ traceLog("Unable to create directory ".TEMP_FILES.", Reason:".customErrorMsg()); unlink(PIDFILE); unlink(STARTPIDFILE); exit; } @chmod(TEMP_FILES, PERMISSIONVAL); } if(!is_dir(TEMP_DB_FILES) && $isLocalBackup == 1){ if(! mkdir(TEMP_DB_FILES)){ traceLog("Unable to create directory ".TEMP_DB_FILES.", Reason:".customErrorMsg()); unlink(PIDFILE); unlink(STARTPIDFILE); exit; } @chmod(TEMP_FILES, 0777); } #opening the backup set files based on mirror/relative if($relative == 1){ if(!($BACK_FILE = fopen($BackupsetFile_relative,"w"))){ traceLog("Unable to open file $BackupsetFile_relative to write, Reason: ".customErrorMsg()); unlink(PIDFILE); unlink(STARTPIDFILE); exit; } $BackupFile = $BackupsetFile_relative; } else { if(!($BACK_FILE = fopen($BackupsetFile_filesOnly,"w"))){ traceLog("Unable to open file $BackupsetFile_filesOnly to write, Reason:".customErrorMsg()); unlink(PIDFILE); unlink(STARTPIDFILE); exit; } $BackupFile = $BackupsetFile_filesOnly; } } #****************************************************************************************************************** # Subroutine Name : removeBackupTempFiles. # Objective : This subroutine romoves all temporary files and folders. Also cleanup condition based files # and folder e.g restore list etc. # Added By : Pooja Havaldar #******************************************************************************************************************/ function removeBackupTempFiles() { GLOBAL $successFiles; GLOBAL $backupLocation; GLOBAL $backupUtfFile; GLOBAL $userDir; $dedupDetailFile = $userDir.PATHSEPARATOR.DEDUP_DETAIL_FILE; $deviceID = ""; $restoreList = ""; if(file_exists($dedupDetailFile)){ $deviceJSON = file_get_contents($dedupDetailFile); $deviceArray = json_decode($deviceJSON, true); $deviceID = trim($deviceArray['deviceID']); } #If backup success, then .RestoreList and Search list gets cleaned up if(0 < $successFiles){ $rListPath = "$userDir/.RestoreList"; $remoteSearchPath = "$userDir/Restore/.+searchList/*"; $backupLocation = str_replace("\'","'\\''",$backupLocation); if($deviceID) $restoreList = $rListPath."/".$deviceID; else $restoreList = $rListPath.$backupLocation; if($restoreList!="/" && $remoteSearchPath!="/"){ $val = array($restoreList,$remoteSearchPath,PROGRESS_PATH."_*"); removeItems($val); } } if(file_exists(TOTAL_SIZE_PATH)) @unlink(TOTAL_SIZE_PATH); if(file_exists(STATUSFILE)) @unlink(STATUSFILE); if(file_exists($backupUtfFile)) @unlink($backupUtfFile); if(file_exists(OUTPUTFILE)) @unlink(OUTPUTFILE); if(file_exists(ERRORFILE)) @unlink(ERRORFILE); if(file_exists(CANCEL_PATH)) @unlink(CANCEL_PATH); if(file_exists(INFOFILE)) @unlink(INFOFILE); if(file_exists(RETRY_ABORT_CAUSE)) @unlink(RETRY_ABORT_CAUSE); if(file_exists(RETRY_INFOFILE)) @unlink(RETRY_INFOFILE); if(file_exists(EXEC_ERRORFILE)) @unlink(EXEC_ERRORFILE); if(file_exists(CHECKSUMOUTPUTFILE)) @unlink(CHECKSUMOUTPUTFILE); if(file_exists(CHECKSUMERRORFILE)) @unlink(CHECKSUMERRORFILE); if(file_exists(MDTCHECKOUTPUTFILE)) @unlink(MDTCHECKOUTPUTFILE); if(file_exists(ENGINE_LOCKE_FILE)) @unlink(ENGINE_LOCKE_FILE); if(file_exists(MDTCHECKERRORFILE)) @unlink(MDTCHECKERRORFILE); if(file_exists(OPERATION_SUMMERY_ERROR_FILE)) @unlink(OPERATION_SUMMERY_ERROR_FILE); $arrayToRemove = array(TEMP_FILES, ERROR_DIR, UTFFILE."*", ERRORFILE."*", PROGRESS_PATH."*", STATUSFILE."*", OUTPUTFILE."*"); removeItems($arrayToRemove); } #**************************************************************************************************** # Subroutine Name : createAndVerifyCheckSum. # Objective : This function will create & verify the check sum for Dedup account # Added By : Senthil Pandian # Modified by : #*****************************************************************************************************/ function createAndVerifyCheckSum($currentBackupSetFile) { GLOBAL $idevsutilBinaryPath,$jobDir,$bacSync,$filecount; $checksumOutputFile = $jobDir.CHECKSUMOUTPUTFILE; $checksumErrorFile = $jobDir.CHECKSUMERRORFILE; $mdtCheckOutputFile = $jobDir.MDTCHECKOUTPUTFILE; $mdtCheckErrorFile = $jobDir.MDTCHECKERRORFILE; $createCheckSumUtfFile = getOperationFile(array("opType" => CREATECHECKSUM, "backupsetFile" => $currentBackupSetFile)); # EVS command to execute for Create Check Sum $idevsutilCommandLine = $idevsutilBinaryPath.WHITESPACE.IDEVSUTIL_ARG.ASSIGNMENTOP."\"$createCheckSumUtfFile\""; if(!file_exists(PIDFILE)){ return false; //Need to handle error } $pid = exec("$idevsutilCommandLine"); @unlink($createCheckSumUtfFile); if(file_exists($checksumErrorFile) && filesize($checksumErrorFile)>0){ $errStr = file_get_contents($checksumErrorFile); traceLog($errStr); @unlink($checksumErrorFile); @unlink($checksumOutputFile); //Need to handle error return false; } if(file_exists($checksumOutputFile) && filesize($checksumOutputFile)>0){ $mdtCheckUtfFile = getOperationFile(array( "opType" => MDTCHECK, "backupsetFile" => $checksumOutputFile)); # EVS command to execute for Create Check Sum $idevsutilCommandLine = $idevsutilBinaryPath.WHITESPACE.IDEVSUTIL_ARG.ASSIGNMENTOP."\"$mdtCheckUtfFile\""; $pid = exec("$idevsutilCommandLine"); @unlink($mdtCheckUtfFile); if(file_exists($mdtCheckErrorFile) && filesize($mdtCheckErrorFile)>0){ $errStr = file_get_contents($mdtCheckErrorFile); traceLog($errStr); @unlink($mdtCheckErrorFile); @unlink($mdtCheckOutputFile); return false; } if(file_exists($mdtCheckOutputFile)){ traceLog("file_exists:$mdtCheckOutputFile"); if(!$handle = fopen($mdtCheckOutputFile,'r')){ @unlink($mdtCheckErrorFile); @unlink($mdtCheckOutputFile); traceLog("Could not open $mdtCheckOutputFile".customErrorMsg()); return false; } $buffer = fread($handle, LIMIT); $byteRead = strlen($buffer); if($byteRead == 0){ if(!file_exists(PIDFILE)){ return false; } } $resultList = rtrim($buffer); traceLog("resultList:$resultList"); $resultListXML = "$resultList"; $xml = simplexml_load_string($resultListXML); if(!$xml){ $resultListXML = checkAndConstructXML($resultList); $resultListXML = "$resultListXML"; $xml = simplexml_load_string($resultListXML); } $backupSet = ''; foreach ($xml->item as $value) { $fieldFileName = $value['fname']; $checkSum = trim($value['checksum']); $fileSeekID = trim($value['fileSeekID']); $folderSeekID = trim($value['folderSeekID']); $fullPathSeekID = trim($value['fullPathSeekID']); $mdt = trim($value['mdt']); $fileSize = trim($value['fileSize']); $status = trim($value['status']); traceLog("fieldFileName:$fieldFileName"); traceLog("status:$status"); if($status=="SUCCESS"){ //File in Sync $size = customFileSize($fieldFileName); $modtime = filemtime($fieldFileName); $levelCount = substr_count($fieldFileName,"/"); update(1, $modtime, $size, time(), $levelCount-1, $fieldFileName); $bacSync++; $filecount--; } else { //Needs to be backed up $mdt = str_pad($mdt,20,0,STR_PAD_LEFT); $fileSize = str_pad($fileSize,20,0,STR_PAD_LEFT); $backupSet .= $fieldFileName.":".$checkSum."$".$mdt."$".$fileSize."$".$fileSeekID."$".$folderSeekID."$".$fullPathSeekID."\n"; } } traceLog("currentBackupSetFile:$currentBackupSetFile"); traceLog("backupSet:$backupSet"); if($backupSet) { file_put_contents($currentBackupSetFile,$backupSet); return true; } return false; } } else { traceLog("$checksumOutputFile file not found");//Need to handle error return false; } } #********************************************************************************************************** # Subroutine Name : enumerateFromLS # Objective : This function recursively enumerates a directly and enters data in the created # backupset files. # Added By : Vijay Vinoth # Modified By : Sabin Cheruvattil #**********************************************************************************************************/ function enumerateFromLS($item) { GLOBAL $failedFilesCount, $jobDir, $totalFiles, $filecount, $isLocalBackup, $backupLocation, $relative; GLOBAL $totalSize, $enumerateFileSize, $current_source, $hidden, $machine, $appPath, $checkCPUUsage; GLOBAL $ERRORFAILEDFILE, $filehandle, $BACK_FILE, $logOutputFilePath,$BackupExcludesetFile, $dedupDetailFile; $commandOutput = ''; $lastLine = ''; $resultList = ''; $toFind = array("/","'"," "); $toReplace = array("_","_","_"); $cmdOPFile = TEMP_FILES . PATHSEPARATOR . LS_TMP_OUTPUT . addslashes(str_replace($toFind, $toReplace, $item)); $enumErrFile = TEMP_FILES . PATHSEPARATOR . LS_TMP_ERROR . addslashes(str_replace($toFind, $toReplace, $item)); if(++$checkCPUUsage % 100 === 0) { usleep(1000); // 1000 == 1 millisecond } $backupLocation1 = $backupLocation; if(file_exists($dedupDetailFile)) { $backupLocation1 = ''; } $localtime = trim(shell_exec('date +"%a %b %d %T %Y"')); $retVal = 1; $errStr = ''; if(substr($item, -1, 1) != "/") { $item .= "/"; } # get path after 1st level $printItem = getPrintItem($item); $itemNew = str_replace("'", "'\''", $item); # add individual pid holder file for logging pid if($machine == NETGEAR) { $cmd = "$appPath/ls -aln '$itemNew' 2> '$enumErrFile' 1> '$cmdOPFile' & echo $!"; } else if($machine == QNAP || $machine == SYNOLOGY || $machine == ASUSTOR) { $cmd = "ls -aln '$itemNew' 2> '$enumErrFile' 1> '$cmdOPFile' & echo $!"; } else if($machine == TWOTIER) { $cmd = "/bin/ls -aln '$itemNew' 2> '$enumErrFile' 1> '$cmdOPFile' & echo $!"; } $lsPIDFile = $jobDir . "LSPID"; $lsPID = exec($cmd); file_put_contents($lsPIDFile, $lsPID); # wait check for ls pid to complete. while(checkPIDRunning($lsPID)) usleep(1000); # Remove individual ls pid file as ls execution got completed # if job is terminated, kill ls process from job termination script if(file_exists($lsPIDFile)) { # removing the pid file as the ls processing got completed @unlink($lsPIDFile); } $handle = fopen($cmdOPFile, 'r'); if(!$handle) { unlink($cmdOPFile); unlink($enumErrFile); $errStr = "Unable to open ls output for item: $$item\n"; $retVal = 0; return $retVal; } $sizeFile = filesize($enumErrFile); if(file_exists($enumErrFile) && ($sizeFile > 0)) { $reason = join('', file($enumErrFile)); $errStr = "Unable to list directory $item.\n"; if(strpos($reason, 'Permission denied') >= 0) { fwrite($ERRORFAILEDFILE, '[' . $localtime . "] [FAILED] [$printItem] Reason : Permission denied." . LINEFEED); } else { fwrite($ERRORFAILEDFILE, '[' . $localtime . "] [FAILED] [$printItem] Reason : No such file or directory." . LINEFEED); } $failedFilesCount++; $totalFiles++; traceLog($errStr); //writeOperationErrorToErrorFile($errStr); @unlink($cmdOPFile); @unlink($enumErrFile); fclose($handle); $retVal = 0; return $retVal; } while(1) { $buffer = fread($handle, 4096*25); if(empty($buffer)) { if(!empty($lastLine)) array_push($commandOutput, $lastLine); else $commandOutput = ''; $lastLine = ''; } else{ $resultList = $lastLine.$buffer; $commandOutput = explode("\n", $resultList); $lastLine = array_pop($commandOutput); } unset($buffer); if(empty($commandOutput) or !count($commandOutput)) break; $i = 0; foreach($commandOutput as $outputList) { if(!file_exists(PIDFILE)) break; if(++$i % 100 === 0) usleep(1000); if(empty($outputList)) continue; $parseDetails = preg_split('/\s+/', $outputList, 8); if(($parseDetails[0] == 'total')) { continue; } $fileSize = $parseDetails[4]; $fileType = $parseDetails[0]; $split1 = preg_split('/\s/', $parseDetails[7], 2); $fileName = trim($split1[1],"\n"); if(empty($fileName)) { traceLog("Skipped Item in enumerate : " . $outputList); continue; } if($fileName == '.' || $fileName == '..') { continue; } $temp = $item.$fileName; if(($fileType[0] != 'd') && ($fileType[0] != '-')) { continue; } if(($hidden === 'Disabled') && preg_match("/\/\./", $temp)) { continue; } if($isLocalBackup === 1) { if(strpos($temp, $backupLocation) !== false) { $content = "[$localtime] [EXCLUDED] [{$printItem}{$fileName}]. Reason: Item belongs to same express device.".LINEFEED; if(!($logOutputHandle = fopen($BackupExcludesetFile, 'a'))){ traceLog("Could not open file $logOutputFilePath, Reason : " . customErrorMsg()); } fwrite($logOutputHandle, $content); fclose($logOutputHandle); continue; } } if(!is_readable($temp)) { if(!file_exists($temp)) { fwrite($ERRORFAILEDFILE, '[' . $localtime . "] [FAILED] [$printItem$fileName] Reason : No such file or directory" . LINEFEED); } else { fwrite($ERRORFAILEDFILE, '[' . $localtime . "] [FAILED] [$printItem$fileName] Reason : Permission denied" . LINEFEED); } $failedFilesCount++; $totalFiles++; continue; } $ret = excludeCheck($temp, $printItem . $fileName); if($ret == 1) { continue; } elseif($ret == 2) { $retVal = 0; break; } if($fileType[0] == "d") { # @TODO: update to extended backup directory list if(!enumerateFromLS($temp)) { $errStr = "Enumerate failed for item : $temp \n"; } } else if($fileType[0] == '-') { $totalFiles++; if(!$isLocalBackup) { if(checkForSync($backupLocation1. $printItem . $fileName, $temp, 0)) { #This subroutine checks for sync and remaining entries are written to PartialSyncFile continue; } } if($relative == 0) { $item_orig = $item; $totalSize += $fileSize; $enumerateFileSize += $fileSize; if($current_source != "/") { $current_source_quote = preg_quote($current_source, '/'); $item_orig = preg_replace("/$current_source_quote/", '', $item_orig, 1); } $temp = $item_orig . $fileName; fwrite($filehandle, $temp . LINEFEED); } else { $current_source = getSource(); fwrite($BACK_FILE, $printItem . $fileName . LINEFEED); $totalSize += $fileSize; $enumerateFileSize += $fileSize; } $filecount++; if($filecount == FILE_MAX_COUNT || $enumerateFileSize >= BACKUP_SET_MAX_SIZE) { if(!file_exists(PIDFILE)) { break; } if(!createBackupSetFiles1k('')) { $errStr = "\nCouldnot open new Backupsetfile to write."; $retVal = 0; break; } } } } } fclose($handle); @unlink($cmdOPFile); @unlink($enumErrFile); return $retVal; } #********************************************************************************************************** # Subroutine Name : checkPIDRunning # Objective : checks whether the process is running or not # Modified By : Sabin Cheruvattil #**********************************************************************************************************/ function checkPIDRunning($pid) { return file_exists("/proc/$pid"); } ?>