. Please logout & login again."); # Count of files which could not be backed up/synced due to unspecified errors $countOtherErrors = 0; #Checking whether current job is ManualTask or Scheduled if(strpos( $jobDir, $varManualTask ) === false && strpos( $jobDir, $varTrashManualTask ) === false) $taskType = SCHEDULED; #Checking whether current job is from Trash or not if (strpos( $jobDir, $varTrashManualTask ) !== false) $trash = 1; $rel_Data = ""; if($isLocalRestore != 1) { # hard coded for now. $rel_Data = NORELATIVE; } else { # offline only --relative. $rel_Data = RELATIVE; $relative = 1; $current_source = "/"; } $hostName = getRestoreLocation(); $sourceIdx = 0; #****************************************************************************************************************** # Subroutine Name : removeRestoreTempFiles. # Objective : This subroutine remove temporary files and folder. Also cleanup condition based files # and folder e.g local search etc. # Added By : Vijay Vinoth #******************************************************************************************************************/ function removeRestoreTempFiles() { GLOBAL $successFiles; GLOBAL $userDir; #if(file_exists(STATUSFILE)) # unlink(STATUSFILE); if(file_exists(OPERATION_SUMMERY_ERROR_FILE)) unlink(OPERATION_SUMMERY_ERROR_FILE); # cleanup local search data. if($successFiles > 0){ $localSearchPath = $userDir.PATHSEPARATOR.BACKUP.PATHSEPARATOR.".+searchList/*"; #exec("/bin/rm -rf $localSearchPath"); removeItems($localSearchPath); } # cleanup intermediate files and folder. $arrayToRemove = array(EXEC_ERRORFILE, ERROR_DIR, TEMP_FILES, "search", TOTAL_SIZE_PATH, STATUSFILE."*", PROGRESS_PATH."*"); removeItems($arrayToRemove); } #**************************************************************************************************** # Subroutine Name : generateRestoresetFiles. # Objective : Generating restore set file/files based on user's restore set file # content. Check for file/folder type based on that, if entry element of # restore set file is folder then execute search command to get the list of # files associated with that folder. Count number for files considered for # restore. Write the required data to info_file. # Added By : Vijay Vinoth. #*****************************************************************************************************/ function generateRestoresetFiles() { GLOBAL $isLocalRestore, $databaseLB, $RestoreFile, $totalFiles, $idevsutilBinaryPath, $filesonlycount, $relative, $filecount; GLOBAL $restoreDisplayPath, $outputErrorFile, $isErrorFileOpen, $errorFile, $openRestoreFileOrg, $RestoresetFile_filesOnly; GLOBAL $dbh_LB, $current_source, $totalSize, $RestoresetFile_relative, $filehandle, $RestoresetFile_filesOnly, $errStr, $processName; $processName = "generate"; $result = -1; $res = ""; $totalSize = 0; $outputErrorFile = fopen($errorFile, 'w'); $filesonlycount = 0; $idx = 0; if($relative == 1){ $filehandle = fopen($RestoresetFile_relative, "w"); if(!$filehandle){ traceLog("Unable to open file $RestoresetFile_relative to write, Reason: ".customErrorMsg()); $errStr = "Unable to generate list of files to restore."; generateRestoresetErrorFiles($errStr); } $RestoreFile = $RestoresetFile_relative; } else { $filehandle = fopen($RestoresetFile_filesOnly, "w"); if(!$filehandle){ traceLog("Unable to open file $RestoresetFile_filesOnly to write, Reason: ".customErrorMsg()); $errStr = "Unable to generate list of files to restore."; generateRestoresetErrorFiles($errStr); } $RestoreFile = $RestoresetFile_filesOnly; } @chmod($RestoreFile,PERMISSIONVAL); if(!$outputErrorFile) { $isErrorFileOpen = 0; traceLog("Unable to open $errorFile to write, Reason:".customErrorMsg()); } # Read restore set display file to get information about file or folder. $RestoreDispArray = file($restoreDisplayPath); if(!$RestoreDispArray) { $errStr = "\n Cannot open file $restoreDisplayPath, Reason: ".customErrorMsg().LINEFEED; generateRestoresetErrorFiles($errStr); return; } # open DB connection if($isLocalRestore == 1) { if(!file_exists($databaseLB)) { generateRestoresetErrorFiles($errStr); return; } if(!createLBDB()) { traceLog("Create LBDB failed."); generateRestoresetErrorFiles($errStr); return; } # create file for original file name set $openRestoreFileOrg = fopen($RestoreFile."_org", 'w'); if(!$openRestoreFileOrg) { $errStr = "Cannot open $RestoreFile"."_org to write.".LINEFEED; generateRestoresetErrorFiles($errStr); return; } } # check for version restore. if(preg_match('/_IBVER+\d$/',trim($RestoreDispArray[0]))) { $outputFile = fopen($RestoreFile, 'a+'); /** To test Retry if($filesonlycount%2 != 0) $RestoreDispArray[0] = $RestoreDispArray[0]."_ODD"; **/ fwrite($outputFile,trim($RestoreDispArray[0]).PHP_EOL); $filesonlycount++; $totalFiles++; generateRestoresetErrorFiles(); return; } $RestoreDispArrayCount = count($RestoreDispArray); for ($idx = 1; $idx <= $RestoreDispArrayCount; $idx +=4 ) { if(!file_exists(PIDFILE)) break; if(preg_match('/^$/',trim($RestoreDispArray[$idx - 1]))|| preg_match('/^$/',trim($RestoreDispArray[$idx]))) continue; $result = true; # check from restore display file that it is folder. if(trim($RestoreDispArray[$idx]) == FOLDER) { $result = createRestoreSetFromFolder(trim($RestoreDispArray[$idx - 1],"\n")); if($result == false) { //$errStr = "Check from restore display file that it is folder failed".LINEFEED; generateRestoresetErrorFiles($errStr); return; } } else { if($isLocalRestore == 0) $RestoreFile = $RestoresetFile_filesOnly; $result = createRestoreSetFromFile(trim($RestoreDispArray[$idx - 1],"\n")); if($result == false){ $errStr = "Intermediate restore file set creation failed".LINEFEED; generateRestoresetErrorFiles($errStr); return; } if($isLocalRestore == 1) { $totalSize += getFileSizeFromLocal(trim($RestoreDispArray[$idx - 1],"\n")); } else { $propertyUtf8 = getOperationFile(array("opType" => PROPERTIES, "itemPath" => trim($RestoreDispArray[$idx - 1],"\n"))); # EVS command to execute for properties $propertiesCmd = $idevsutilBinaryPath.WHITESPACE.IDEVSUTIL_ARG.ASSIGNMENTOP."\"$propertyUtf8\""; $out = exec("$propertiesCmd 2>".EXEC_ERRORFILE); $out = trim($out,"\n"); $tmpArr = preg_match("/\d+/", $out, $matches); if(!isset($matches[0])){ if(customFileSize(ERRORFILE) > 0) { $error = file_get_contents(ERRORFILE); checkDedupDeviceError($error); } } else $totalSize += trim($matches[0]); } } } # create totalsize.txt $totalFileSize = fopen(TOTAL_SIZE_PATH, 'w+'); if($totalFileSize) { fwrite($totalFileSize,$totalSize); fclose($totalFileSize); } else traceLog("Can not open ".TOTAL_SIZE_PATH.", Reason: ".customErrorMsg().LINEFEED); generateRestoresetErrorFiles(); } #**************************************************************************************************** # Subroutine Name : getFileSizeFromLocal. # Objective : This subroutine is for fetching the file size from the local backup device. # Added By : Anil Kumar. #*****************************************************************************************************/ function getFileSizeFromLocal($item) { GLOBAL $dbh_LB, $localBackupLocationFile, $dedupDetailFile, $deDup, $hostNameLB, $username; $serverRoot = ''; if($deDup == true) { if(file_exists($localBackupLocationFile)) { $dbpaths = $hostNameLB . '/' . $username . '/dbpaths.xml'; $serverRoot = getServerRoot($dbpaths,$localBackupLocationFile); } } $explodeItem = explode('/', $item); $filename = array_pop($explodeItem); $dirName = implode('/', $explodeItem); $dirName = $dirName."/"; if($deDup == true) $dirName = $serverRoot . $dirName; $queryToGetDirID = "SELECT DIRID from ibfolder where NAME=\"'".$dirName."'\""; $preQueryGetDirID = $dbh_LB->prepare($queryToGetDirID); $preQueryGetDirID->execute(); $dirIDValue = $preQueryGetDirID->fetch(); $preQueryGetDirID->closeCursor(); $dirID = $dirIDValue[0]; $queryToGetFileSize = "SELECT FILE_SIZE from ibfile where DIRID = ".$dirID." and NAME=\"'".$filename."'\""; $preQueryToGetFileSize = $dbh_LB->prepare($queryToGetFileSize); $preQueryToGetFileSize->execute(); $fileSizeValue = $preQueryToGetFileSize->fetch(); $preQueryToGetFileSize->closeCursor(); $fileSize = $fileSizeValue[0]; return $fileSize; } #**************************************************************************************************** # Subroutine Name : generateRestoresetErrorFiles. # Objective : This subroutine is for error handling of generateRestoreset function # Added By : Vijay Vinoth. #*****************************************************************************************************/ function generateRestoresetErrorFiles($errStr = '') { GLOBAL $isLocalRestore, $databaseLB; GLOBAL $RestoreFile, $totalFiles; GLOBAL $idevsutilBinaryPath; GLOBAL $filesonlycount, $relative, $filecount; GLOBAL $filehandle, $outputErrorFile, $fileOnlySetName, $filehandleNoRel; GLOBAL $current_source, $isErrorFileOpen, $errorFile; GLOBAL $openRestoreFileOrg, $dbh_LB, $failedFilesCount, $outputFile, $logOutputHandle; if($relative == 1 and $filecount == 0) @unlink($RestoreFile); else if($filesonlycount == 0) @unlink($fileOnlySetName); @chmod(INFOFILE,PERMISSIONVAL); $fd_write= fopen(INFOFILE, 'a'); if($relative == 1 and $filecount > 0) fwrite($fd_write, "$RestoreFile ".RELATIVE." $current_source \n"); else if($filesonlycount >0) { $current_source = "/"; fwrite($fd_write, "$fileOnlySetName ".NORELATIVE." $current_source\n"); } fwrite($fd_write, "TOTALFILES $totalFiles\n"); fwrite($fd_write, "FAILEDCOUNT $failedFilesCount"); fclose($fd_write); if($isErrorFileOpen) @fclose($outputErrorFile); if($outputFile) @fclose($outputFile); if($logOutputHandle) @fclose($logOutputHandle); if($openRestoreFileOrg) @fclose($openRestoreFileOrg); if($filehandle) @fclose($filehandle); if($filehandleNoRel) @fclose($filehandleNoRel); # close DB connection for offline restore if($dbh_LB) unset($dbh_LB); # write $errStr to status file. if($errStr != ""){ @unlink(PIDFILE); $exit_flag = "1-$errStr"; writeOperationErrorToErrorFile($errStr); } } #**************************************************************************************************** # Subroutine Name : createRestoreSetFromFile. # Objective : Take remote folder as argument and execute serach/DB query on that # Create set of 1k files. Count number of files considered for restore. # Added By : Vijay Vinoth. #*****************************************************************************************************/ function createRestoreSetFromFile($fileName) { GLOBAL $isLocalRestore, $RestoreFile, $current_source, $totalFiles; GLOBAL $relative, $filesonlycount,$filecount, $filehandle; #if offline fire sqlite sql query and construct restore set file content. if($isLocalRestore == 1) { if(LOCAL_FILE_FOLDER_SELECT_FAILURE == writeActualAndEncSet($fileName)) { //traceLog("Local file/folder search failed for [".$fileName."]"); appendEnumerationError($fileName); return true; } } else { $totalFiles++; //$fd_write = fopen($RestoreFile, 'a+'); fwrite($filehandle,$fileName.LINEFEED); $current_source = "/"; } if($relative == 0) { $filesonlycount++; $filecount = $filesonlycount; } else $filecount++; if($filecount == FILE_MAX_COUNT){ if(!createRestoreSetFiles1k("FILESONLY")) return false; } return true; } #**************************************************************************************************** # Subroutine Name : createRestoreSetFiles1k. # Objective : Construct the restore set file/files based on relative or no relative. # Added By : Pooja Havaldar # Modified By : Vijay Vinoth. #*****************************************************************************************************/ function createRestoreSetFiles1k($filesOnly_flag='') { GLOBAL $Restorefilecount, $relative, $filesonly, $RestoreFile; GLOBAL $filesOnlyFile_count, $filehandle, $fileOnlySetName; GLOBAL $current_source,$noRelIndex, $filehandleNoRel; GLOBAL $openRestoreFileOrg, $filecount, $filesonlycount,$RestoresetFile_filesOnly; GLOBAL $RestoresetFile_relative, $RestoresetFile_norelative; $Restorefilecount++; session_write_close(); if($relative == 0) { if($filesOnly_flag == "FILESONLY") { $filesonly = 1; $filesOnlyFile_count++; fclose($filehandle); file_put_contents(INFOFILE,"$fileOnlySetName ".NORELATIVE." $current_source\n",FILE_APPEND); $fileOnlySetName = $RestoresetFile_filesOnly."_".$filesOnlyFile_count; $filesonlycount = 0; $filehandle = fopen($fileOnlySetName,"w"); @chmod($fileOnlySetName,PERMISSIONVAL); if(!$filehandle) { traceLog("Unable to open file $fileOnlySetName, Reason: ".customErrorMsg()); return 0; } } else { fclose($filehandleNoRel); file_put_contents(INFOFILE,"$RestoreFile ".RELATIVE." $current_source\n",FILE_APPEND); @chmod(INFOFILE,PERMISSIONVAL); $RestoreFile = $RestoresetFile_norelative."$noRelIndex"."_$Restorefilecount"; $filehandleNoRel = fopen($RestoreFile,"w"); @chmod($RestoreFile,PERMISSIONVAL); if(!$filehandleNoRel) { traceLog("Unable to open file $RestoreFile, Reason: ".customErrorMsg()); return 0; } } } else { fclose($filehandle); file_put_contents(INFOFILE,"$RestoreFile ".RELATIVE." $current_source\n",FILE_APPEND); @chmod(INFOFILE,PERMISSIONVAL); $RestoreFile = $RestoresetFile_relative."_$Restorefilecount"; @chmod($RestoreFile,PERMISSIONVAL); $filehandle = fopen($RestoreFile,"w"); @chmod($RestoreFile,PERMISSIONVAL); if(!$filehandle) { traceLog("Unable to open file $RestoreFile, Reason: ".customErrorMsg()); return 0; } if($isLocalRestore == 1) { fclose($openRestoreFileOrg); $openRestoreFileOrg = fopen($RestoreFile."_org","a"); if(!$openRestoreFileOrg) { traceLog("Can't open $RestoreFile"."_org to write, Reason: ".customErrorMsg()); return 0; } } } $filecount = 0; return CREATE_THOUSANDS_FILES_SET_SUCCESS; } #**************************************************************************************************** # Subroutine Name : writeActualAndEncSet. # Objective : write actual file name to actual file set amd fire sql query, construct # enc path then write to enc set file. # Added By : Vijay Vinoth. #*****************************************************************************************************/ function writeActualAndEncSet($fileName) { GLOBAL $dbh_LB, $current_source, $totalFiles, $RestoreFile, $localBackupLocationFile; GLOBAL $filecount, $dedupDetailFile, $deDup, $hostNameLB, $username; $fileNameInput = $fileName; $ridx = strrpos($fileName, "/"); $folderPath = substr($fileName, 0, $ridx+1); $fileName = substr($fileName, $ridx+1); $preStatement = ""; $serverRoot = $serverRootSlash = ''; if(file_exists($localBackupLocationFile)) { $deDup = true; $dbpaths = $hostNameLB . '/' . $username . '/dbpaths.xml'; $serverRoot = getServerRoot($dbpaths,$localBackupLocationFile); if(file_exists($dedupDetailFile)) { $serverRootSlash = '/' . $serverRoot; } } $statement = "select FOLDER_ID, ENC_NAME from ibfile where NAME=? AND DIRID=(select DIRID from ibfolder where NAME=?)"; try { if($dbh_LB) { $preStatement = $dbh_LB->prepare($statement); $fileName = "'$fileName'"; $folderPath = "'$serverRoot$folderPath'"; $status = $preStatement->execute(array($fileName,$folderPath)); } } catch (PDOException $e) { $errStr = "Couldn't prepare statement."; //traceLog("Can't execute SELECT query, Reason: ".$e->getMessage()); } $row = $preStatement->fetch(); $preStatement->closeCursor(); if(empty($row)) { $errStr = "Couldn't prepare statement."; return LOCAL_FILE_FOLDER_SELECT_FAILURE; //traceLog($errStr); } $startIndex = strpos ($fileNameInput, '/',1); $next_source = substr($fileNameInput, 0, $startIndex); if($current_source != $next_source) { if($filecount > 0) { if(!createRestoreSetFiles1k("")) { return false; } } $current_source = $next_source; } $totalFiles++; $folderId = $row[0]; $encName = $row[1]; file_put_contents($RestoreFile."_org",$serverRootSlash.$fileNameInput.LINEFEED,FILE_APPEND); file_put_contents($RestoreFile,"/$folderId/$encName".LINEFEED,FILE_APPEND); @chmod($RestoreFile,PERMISSIONVAL); return LOCAL_SELECT_SUCCESS; } #**************************************************************************************************** # Subroutine Name : enumerateLocal. # Objective : Take localfolder as argument and execute sqlite query on that. Create set of 1k # files. Count number of files considered for restore. # Added By : Vijay Vinoth. #*****************************************************************************************************/ function enumerateLocal($dirName) { GLOBAL $dbh_LB, $RestoreFile, $filecount, $totalFiles, $totalSize; GLOBAL $dedupDetailFile, $hostNameLB, $username, $localBackupLocationFile; $serverRoot = $serverRootSlash = ''; /*if(!file_exists(PIDFILE)) break;*/ if(file_exists($localBackupLocationFile)) { $dbpaths = $hostNameLB.'/'.$username.'/dbpaths.xml'; $serverRoot = getServerRoot($dbpaths,$localBackupLocationFile); if(file_exists($dedupDetailFile)) { $serverRootSlash = '/'; } } $statementNew = "SELECT FOLDER_ID, ENC_NAME, ibfile.NAME, ibfolder.NAME, ibfile.FILE_SIZE from ibfile INNER JOIN ibfolder ON ibfolder.DIRID = ibfile.DIRID where ibfolder.NAME like ?"; try { $preStatementNew = $dbh_LB->prepare($statementNew); $dirName = "'$serverRoot$dirName/%"; $preStatementNew->execute(array($dirName)); } catch (PDOException $e) { //traceLog("Can't execute SELECT query, Reason: ".$e->getMessage()); return LOCAL_FILE_FOLDER_SELECT_FAILURE; } while($folderIdEncActNamerow = $preStatementNew->fetch()) { $folderName = substr($folderIdEncActNamerow[3], 1, -1); $fileName = substr($folderIdEncActNamerow[2], 1, -1); $totalSize += $folderIdEncActNamerow[4]; # write actual file name to restore_org file file_put_contents($RestoreFile."_org",$serverRootSlash.$folderName.$fileName.LINEFEED,FILE_APPEND); @chmod($RestoreFile."_org",PERMISSIONVAL); # write encrypted file name to restore file file_put_contents($RestoreFile,"/$folderIdEncActNamerow[0]/$folderIdEncActNamerow[1]".LINEFEED,FILE_APPEND); @chmod($RestoreFile,PERMISSIONVAL); $totalFiles++; $filecount++; if($filecount == FILE_MAX_COUNT){ if(!file_exists(PIDFILE)) break; if(!createRestoreSetFiles1k("")) return THOUSANDS_FILES_SET_ERROR; } } $preStatementNew->closeCursor(); return LOCAL_SELECT_SUCCESS; } #**************************************************************************************************** # Subroutine Name : createRestoreSetFromFolder. # Objective : Take remote folder as argument and execute serach/DB query on that # Create set of 1k files. Count number of files considered for restore. # Added By : Avinash Kumar. #*****************************************************************************************************/ function createRestoreSetFromFolder($dirName) { GLOBAL $RestoresetFile_norelative, $noRelIndex, $isLocalRestore, $filecount; GLOBAL $relative, $filehandleNoRel, $current_source; GLOBAL $RestoreFile, $errStr; if($relative == 0) { $Restorefilecount = 0; $noRelIndex++; $RestoreFile = $RestoresetFile_norelative."$noRelIndex"; $filecount = 0; $sourceIdx = strrpos($dirName, "/"); $source[$noRelIndex]= substr($dirName, 0, $sourceIdx); if($source[$noRelIndex] == "") $source[$noRelIndex] = "/"; $current_source = $source[$noRelIndex]; $filehandleNoRel = fopen($RestoreFile,"w"); @chmod($RestoreFile,PERMISSIONVAL); if(!$filehandleNoRel) { $errStr = "Cannot open file $RestoreFile, Reason: ".customErrorMsg(); traceLog($errStr); return false; } } $resEnumerate = 0; if($isLocalRestore == 1) { $startIndex = strpos($dirName, "/",1); if($startIndex == -1 || $startIndex == '') $next_source = $dirName; else $next_source = substr($dirName, 0, $startIndex); if($current_source != $next_source) { if($filecount > 0) { if(!createRestoreSetFiles1k("")) return false; } $current_source = $next_source; } $resEnumerate = enumerateLocal($dirName); } else $resEnumerate = enumerateRemote($dirName); if($resEnumerate === false){ return false; } else if((REMOTE_SEARCH_CMD_ERROR == $resEnumerate) || (REMOTE_SEARCH_FAIL == $resEnumerate) || (REMOTE_SEARCH_OUTPUT_PARSE_FAIL == $resEnumerate) || (LOCAL_FILE_FOLDER_SELECT_FAILURE == $resEnumerate)){ appendEnumerationError($dirName); } else if((REMOTE_SEARCH_THOUSANDS_FILES_SET_ERROR == $resEnumerate) || (REMOTE_SEARCH_RELOGIN == $resEnumerate)){ return false; } if($filecount == 0) @unlink($RestoreFile); if($relative == 0 and $filecount > 0){ $FD_WRITE = fopen(INFOFILE, 'a'); if(!$FD_WRITE) traceLog("Unable to open ".INFOFILE.", Reason: ".customErrorMsg()); else{ fwrite($FD_WRITE, "$RestoreFile ".RELATIVE." $current_source\n"); fclose($FD_WRITE); } @chmod(INFOFILE,PERMISSIONVAL); $filecount = 0; if(ftell($filehandleNoRel) != -1) fclose($filehandleNoRel); } if($errStr != "") traceLog($errStr); return true; } #**************************************************************************************************** # Subroutine Name : enumerateRemote. # Objective : Take remote folder as argument and execute search on that. Create set of 1k # files. Count number of files considered for restore. # Added By : Avinash Kumar. # Modified By : Sabin Cheruvattil #*****************************************************************************************************/ function enumerateRemote($remoteFolder, $retry = 0) { GLOBAL $idevsutilBinaryPath, $relative, $current_source, $filehandleNoRel, $RestoreFile, $totalFiles, $filecount, $totalSize; GLOBAL $dedupDetailFile, $dedupRestoreDeviceID, $errStr, $checkCPUUsage; if(++$checkCPUUsage%100 === 0) usleep(1000); // 1000 == 1 millisecond /*if(!file_exists(PIDFILE)) break;*/ $searchForRestore = 1; # remove / from begining for folder to avoid // while creating utf8 file. if($retry == 0) $remoteFolder = substr($remoteFolder, 1); # final EVS command to execute if(!is_dir(SEARCH)) { if(!mkdir(SEARCH, PERMISSIONVAL)) { $errStr = "Cannot create search directory, Reason: ".customErrorMsg(); traceLog("$errStr"); return false; } } # get utf8 file for EVS search command execute. $searchUtfFile = getOperationFile(array("opType" => SEARCH, "searchPatteren" => $remoteFolder, "searchForRestore" => $searchForRestore)); $searchUtfFile = "'".$searchUtfFile."'"; if(!chdir(SEARCH)) { $errStr = "Cannot change directory to search, Reason: ".customErrorMsg()."\n"; traceLog("$errStr"); return false; } $idevsutilCommandLine = $idevsutilBinaryPath.WHITESPACE.IDEVSUTIL_ARG.ASSIGNMENTOP.$searchUtfFile; # EVS command execute $res = `$idevsutilCommandLine`; $res = trim($res); if($res != '') { $errStr = "Search cmd error found [$res $searchUtfFile]\n"; traceLog("$errStr"); chdir(".."); return REMOTE_SEARCH_CMD_ERROR; } # update server address if cmd failed due to wrong evs server address if(checkErrorAndUpdateServerAddr()){ $retVal = enumerateRemote($remoteFolder,1); if($retVal != REMOTE_SEARCH_SUCCESS) return $retVal; } if(customFileSize(ERRORFILE) > 0) { $error = file_get_contents(ERRORFILE); checkDedupDeviceError($error); @unlink($searchUtfFile); chdir(".."); if(stristr($error,"failed to get the device information") || stristr($error,"encryption verification failed") || stristr($error,"bad response from proxy") || stristr($error,"Unable to proceed as device is deleted/removed")){ $errStr = "Operation could not be completed. Reason :".$error; traceLog("REMOTE_SEARCH_RELOGIN"); return REMOTE_SEARCH_RELOGIN; } traceLog("REMOTE_SEARCH_FAIL"); $errStr = "Remote folder enumeration has failed.\n"; return REMOTE_SEARCH_FAIL; } @unlink($searchUtfFile); $handle = fopen(OUTPUTFILE, "r"); if(!$handle){ chdir(".."); return REMOTE_SEARCH_OUTPUT_PARSE_FAIL; } if(!chdir("..")) { //$errStr = "Cannot change directory to job directory, Reason: ".customErrorMsg(); //traceLog("$errStr"); return false; } $itemsFound = '/files_found/'; if(file_exists($dedupDetailFile)) $itemsFound = '/items_found/'; $extendedAsciiChars = getExtendedASCIIChrOrd(); while(1){ $buffer = fread($handle, LIMIT); if(!file_exists(PIDFILE)) break; if(0 === strlen($buffer)){ if(customFileSize(ERRORFILE)){ $error = file_get_contents(ERRORFILE); checkDedupDeviceError($error); break; } sleep(WAIT_FOR); fseek($handle, 0, 1); //to clear eof flag continue; } //need to check appending partial record to packet or to first line of packet if("" != $lastLine) $buffer = $lastLine.$buffer; if(!preg_match('/\n$/', $buffer)){ $lastNewlinePos = strrpos($buffer, "\n"); $resultList = substr($buffer,0,$lastNewlinePos+1); $lastLine = substr($buffer,$lastNewlinePos+1); } else { $resultList = $buffer; $lastLine = ''; } if(preg_match($itemsFound, $resultList)) $flag = 1; $noOfLines = substr_count($resultList,"\n"); $resultListXML = $resultListXMLOri = "$resultList"; $xml = simplexml_load_string($resultListXML); $isutf8 = FALSE; if(!$xml) { $resultListXML = utf8_encode($resultListXML); $xml = simplexml_load_string($resultListXML); $isutf8 = TRUE; } if(!$xml) { $resultListXML = str_replace($extendedAsciiChars['chr'], $extendedAsciiChars['ord'], $resultListXMLOri); $xml = simplexml_load_string($resultListXML); $isutf8 = FALSE; } if(!$xml) { if($flag === 1) break; continue; } foreach ($xml->item as $value) { $fileName[5] = trim($value['fname'], "\n"); if($isutf8) { $fileName[5] = utf8_decode($fileName[5]); } $totalSize += $value['size']; $temp = $fileName[5]; $quoted_remoteFolder = $remoteFolder; $quoted_current_source = $current_source; $quoted_remoteFolder = $quoted_remoteFolder."/"; /** To Test Retry if($filecount%2 != 0) $temp = $temp."_ODD"; **/ if(strpos( $temp, $quoted_remoteFolder ) !== false) { if($relative == 0) { if($current_source != "/") { $temp = substr($temp, strlen($quoted_current_source)); if($temp) { //file_put_contents($RestoreFile,$temp.LINEFEED,FILE_APPEND); fwrite($filehandleNoRel,$temp.LINEFEED); $totalFiles++; $filecount++; } } else { //file_put_contents($RestoreFile,$temp.LINEFEED,FILE_APPEND); fwrite($filehandleNoRel,$temp.LINEFEED); $totalFiles++; $filecount++; } } else { $current_source = "/"; //file_put_contents($RestoreFile,$temp.LINEFEED,FILE_APPEND); fwrite($filehandleNoRel,$temp.LINEFEED); $totalFiles++; $filecount++; } } if($filecount == FILE_MAX_COUNT) { if(!file_exists(PIDFILE)) break; if(!createRestoreSetFiles1k("")) { traceLog($errStr); return REMOTE_SEARCH_THOUSANDS_FILES_SET_ERROR; } } } if($flag == 1) break; } @chmod($RestoreFile,PERMISSIONVAL); traceLog($errStr); return REMOTE_SEARCH_SUCCESS; }