예제 #1
0
 function backup_repository($args)
 {
     if (!empty($args)) {
         extract($args);
     }
     $tasks = $this->tasks;
     $task = $tasks['Backup Now'];
     @ini_set('memory_limit', '256M');
     @set_time_limit(1200);
     if (!empty($task)) {
         extract($task['task_args']);
     }
     $results = $task['task_results'];
     if (is_array($results) && count($results)) {
         $backup_file = $results[count($results) - 1]['server']['file_path'];
     }
     if ($backup_file && file_exists($backup_file)) {
         //FTP, Amazon S3 or Dropbox
         if (isset($account_info['iwp_ftp']) && !empty($account_info)) {
             $this->update_status($task_name, 'ftp');
             $account_info['iwp_ftp']['backup_file'] = $backup_file;
             iwp_mmb_print_flush('FTP upload: Start');
             $return = $this->ftp_backup($account_info['iwp_ftp']);
             $this->update_status($task_name, 'ftp', true);
             iwp_mmb_print_flush('FTP upload: End');
         }
         if (isset($account_info['iwp_amazon_s3']) && !empty($account_info['iwp_amazon_s3'])) {
             $this->update_status($task_name, 's3');
             $account_info['iwp_amazon_s3']['backup_file'] = $backup_file;
             iwp_mmb_print_flush('Amazon S3 upload: Start');
             $return = $this->amazons3_backup($account_info['iwp_amazon_s3']);
             $this->update_status($task_name, 's3', true);
             iwp_mmb_print_flush('Amazon S3 upload: End');
         }
         if (isset($account_info['iwp_dropbox']) && !empty($account_info['iwp_dropbox'])) {
             $this->update_status($task_name, 'dropbox');
             $account_info['iwp_dropbox']['backup_file'] = $backup_file;
             iwp_mmb_print_flush('Dropbox upload: Start');
             $return = $this->dropbox_backup($account_info['iwp_dropbox']);
             $this->update_status($task_name, 'dropbox', true);
             iwp_mmb_print_flush('Dropbox upload: End');
         }
         if ($return == true && $del_host_file) {
             @unlink($backup_file);
             unset($tasks['Backup Now']['task_results'][count($results) - 1]['server']);
             $this->wpdb_reconnect();
             $this->update_tasks($tasks);
             //update_option('iwp_client_backup_tasks', $tasks);
         }
     } else {
         $return = array('error' => 'Backup file not found on your server. Please try again.', 'error_code' => 'backup_file_not_found_on_server');
     }
     return $return;
 }
예제 #2
0
 function google_drive_backup($historyID = 0, $args = '', $uploadid = null, $offset = 0)
 {
     require_once $GLOBALS['iwp_mmb_plugin_dir'] . '/lib/Google/Client.php';
     require_once $GLOBALS['iwp_mmb_plugin_dir'] . '/lib/Google/Http/MediaFileUpload.php';
     require_once $GLOBALS['iwp_mmb_plugin_dir'] . '/lib/Google/Service/Drive.php';
     $this->hisID = $historyID;
     $requestParams = $this->getRequiredData($historyID, "requestParams");
     $upload_loop_break_time = $requestParams['account_info']['upload_loop_break_time'];
     //darkcode changed
     $upload_file_block_size = $requestParams['account_info']['upload_file_block_size'];
     $upload_file_block_size = 1 * 1024 * 1024;
     $del_host_file = $requestParams['args']['del_host_file'];
     $iwp_folder_id = '';
     $sub_folder_id = '';
     $sub_folder_name = $this->site_name;
     $task_result = $this->getRequiredData($historyID, "taskResults");
     $fileSizeUploaded = 0;
     $resumeURI = false;
     $current_file_num = 0;
     if ($args == '') {
         //on the next call $args would be ''
         //set $args, $uploadid, $offset  from the DB
         $responseParams = $this->getRequiredData($historyID, "responseParams");
         if (!$responseParams) {
             return $this->statusLog($this->hisID, array('stage' => 'google_drive_upload', 'status' => 'error', 'statusMsg' => 'google Upload failed: Error while fetching table data.', 'statusCode' => 'google_upload_failed_error_fetching_data'));
         }
         $args = $responseParams['gDriveArgs'];
         $prevChunkResults = $responseParams['response_data'];
         if (is_array($prevChunkResults)) {
             $resumeURI = $prevChunkResults['resumeURI'];
             $fileSizeUploaded = $prevChunkResults['fileSizeUploaded'];
         }
         $current_file_num = $responseParams['current_file_num'];
     }
     $create_sub_folder = $args['gdrive_site_folder'];
     $tempArgs = $args;
     $client = new IWP_google_Client();
     $client->setClientId($args['clientID']);
     $client->setClientSecret($args['clientSecretKey']);
     $client->setRedirectUri($args['redirectURL']);
     $client->setScopes(array('https://www.googleapis.com/auth/drive', 'https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/userinfo.profile'));
     $accessToken = $args['token'];
     $refreshToken = $accessToken['refresh_token'];
     $backup_file = $args['backup_file'];
     if (!is_array($backup_file)) {
         $temp_backup_file = $backup_file;
         $backup_file = array();
         $backup_file[] = $temp_backup_file;
     }
     if (is_array($backup_file)) {
         $backup_files_count = count($backup_file);
         $backup_file = $backup_file[$current_file_num];
     }
     try {
         $client->refreshToken($refreshToken);
     } catch (Exception $e) {
         echo 'google Error ', $e->getMessage(), "\n";
         return array("error" => $e->getMessage(), "error_code" => "google_error_backup_refresh_token");
     }
     //$client = new IWP_google_Client();
     //$accessToken = $client->authenticate($accessToken_early['refresh_token']);
     //$client->setAccessToken($accessToken);
     $service = new IWP_google_Service_Drive($client);
     //create iwp folder folder if it is not present
     try {
         $parameters = array();
         $parameters['q'] = "title = 'infinitewp' and trashed = false and 'root' in parents and 'me' in owners and mimeType= 'application/vnd.google-apps.folder'";
         $files = $service->files->listFiles($parameters);
         $list_result = array();
         $list_result = array_merge($list_result, $files->getItems());
         $list_result = (array) $list_result;
         if (empty($list_result)) {
             $file = new IWP_google_Service_Drive_DriveFile();
             $file->setTitle('infinitewp');
             $file->setMimeType('application/vnd.google-apps.folder');
             $createdFolder = $service->files->insert($file, array('mimeType' => 'application/vnd.google-apps.folder'));
             if ($createdFolder) {
                 $createdFolder = (array) $createdFolder;
                 $iwp_folder_id = $createdFolder['id'];
             }
         } else {
             foreach ($list_result as $k => $v) {
                 $iwp_folder_id = $v->id;
             }
         }
     } catch (Exception $e) {
         print "An error occurred: " . $e->getMessage();
         return array('error' => $e->getMessage(), 'error_code' => 'google_error_occured_list_results');
     }
     //create sub folder by site name
     if ($create_sub_folder) {
         $parameters = array();
         $parameters['q'] = "title = '{$sub_folder_name}' and trashed = false and '{$iwp_folder_id}' in parents and 'me' in owners and mimeType = 'application/vnd.google-apps.folder'";
         //$parameters['corpus'] = "DEFAULT";
         $files = $service->files->listFiles($parameters);
         $list_result = array();
         $list_result = array_merge($list_result, $files->getItems());
         $list_result = (array) $list_result;
         if (empty($list_result)) {
             $file = new IWP_google_Service_Drive_DriveFile();
             $file->setTitle($sub_folder_name);
             $file->setMimeType('application/vnd.google-apps.folder');
             //setting parent as infinitewpFolder
             $parent = new IWP_google_Service_Drive_ParentReference();
             $parent->setId($iwp_folder_id);
             $file->setParents(array($parent));
             $createdFolder = $service->files->insert($file, array('mimeType' => 'application/vnd.google-apps.folder'));
             if ($createdFolder) {
                 $createdFolder = (array) $createdFolder;
                 $sub_folder_id = $createdFolder['id'];
             }
         } else {
             foreach ($list_result as $k => $v) {
                 $sub_folder_id = $v->id;
             }
         }
     }
     //Insert a file
     $file = new IWP_google_Service_Drive_DriveFile();
     $file->setTitle(basename($backup_file));
     $file->setMimeType('binary/octet-stream');
     // Set the Parent Folder on Google Drive
     $parent = new IWP_google_Service_Drive_ParentReference();
     if (empty($sub_folder_id)) {
         $parent->setId($iwp_folder_id);
     } else {
         $parent->setId($sub_folder_id);
     }
     $file->setParents(array($parent));
     $gDriveID = '';
     try {
         if (false) {
             //single upload
             $data = file_get_contents($backup_file);
             $createdFile = (array) $service->files->insert($file, array('data' => $data));
             $gDriveID = $createdFile['id'];
         }
         //multipart upload
         if (true) {
             // Call the API with the media upload, defer so it doesn't immediately return.
             $client->setDefer(true);
             $request = $service->files->insert($file);
             // Create a media file upload to represent our upload process.
             $media = new IWP_google_Http_MediaFileUpload($client, $request, 'application/zip', null, true, $upload_file_block_size);
             $media->setFileSize(filesize($backup_file));
             $status = false;
             $handle = fopen($backup_file, "rb");
             fseek($handle, $fileSizeUploaded);
             $resArray = array('status' => 'completed', 'backupParentHID' => $historyID);
             while (!$status && !feof($handle)) {
                 iwp_mmb_auto_print('gdrive_chucked_upload');
                 $chunk = fread($handle, $upload_file_block_size);
                 $statusArray = $media->nextChunk($chunk, $resumeURI, $fileSizeUploaded);
                 $status = $statusArray['status'];
                 $resumeURI = $statusArray['resumeURI'];
                 //$fileSizeUploaded = ftell($handle);
                 $fileSizeUploaded = $statusArray['progress'];
                 $googleTimeTaken = microtime(1) - $GLOBALS['IWP_MMB_PROFILING']['ACTION_START'];
                 if ($googleTimeTaken > 10 && $status != true) {
                     $chunkResult['resumeURI'] = $resumeURI;
                     $chunkResult['fileSizeUploaded'] = $fileSizeUploaded;
                     echo "<br> file uploaded size in this call: " . $fileSizeUploaded . "<br>";
                     $result_arr = array();
                     $result_arr['response_data'] = $chunkResult;
                     $result_arr['status'] = 'partiallyCompleted';
                     $result_arr['nextFunc'] = 'google_drive_backup';
                     $result_arr['gDriveArgs'] = $tempArgs;
                     $result_arr['current_file_num'] = $current_file_num;
                     /* $task_result['task_results'][$historyID]['gDriveOrgFileName'][] = basename($backup_file);
                     			$task_result['task_results'][$historyID]['gDrive'][] = $gDriveID;
                     			//$task_result['gDrive'] = basename($backup_file);
                     			$task_result['gDrive'][] = $gDriveID; */
                     $this->statusLog($this->hisID, array('stage' => 'amazonMultiCall', 'status' => 'partiallyCOmpleted', 'statusMsg' => 'nextCall', 'nextFunc' => 'amazons3_backup', 'task_result' => $task_result, 'responseParams' => $result_arr));
                     $resArray['status'] = "partiallyCompleted";
                     return $resArray;
                 }
             }
             $result = false;
             if ($status != false) {
                 $result = $status;
             }
             fclose($handle);
             $client->setDefer(false);
             $completeBackupResult = (array) $status;
             //$gDriveID = $createdFile['id'];
             $gDriveID = $completeBackupResult['id'];
         }
     } catch (Exception $e) {
         echo "An error occurred: " . $e->getMessage();
         return array("error" => "gDrive Error" . $e->getMessage(), "error_code" => "google_error_multipart_upload");
     }
     $current_file_num += 1;
     $result_arr = array();
     $result_arr['response_data'] = isset($createdFile) && !empty($createdFile['id']) ? $createdFile['id'] : array();
     $result_arr['status'] = "completed";
     $result_arr['nextFunc'] = 'google_drive_completed';
     $result_arr['gDriveArgs'] = $tempArgs;
     $result_arr['current_file_num'] = $current_file_num;
     $resArray = array('status' => 'completed', 'backupParentHID' => $historyID);
     //$task_result = $this->getRequiredData($historyID, "taskResults");
     $task_result['task_results'][$historyID]['gDriveOrgFileName'][] = basename($backup_file);
     $task_result['task_results'][$historyID]['gDrive'][] = $gDriveID;
     //$task_result['gDrive'] = basename($backup_file);
     $task_result['gDrive'][] = $gDriveID;
     if ($current_file_num == $backup_files_count) {
         $result_arr['nextFunc'] = 'google_drive_completed';
         iwp_mmb_print_flush('Google Drive upload: End');
         unset($task_result['task_results'][$historyID]['server']);
     } else {
         $result_arr['status'] = "partiallyCompleted";
         $result_arr['nextFunc'] = 'google_drive_backup';
         $result_arr['response_data'] = false;
         $resArray['status'] = 'partiallyCompleted';
     }
     if ($del_host_file) {
         @unlink($backup_file);
     }
     $this->statusLog($this->hisID, array('stage' => 'gDriveMultiCall', 'status' => 'completed', 'statusMsg' => 'nextCall', 'nextFunc' => 'google_drive_completed', 'task_result' => $task_result, 'responseParams' => $result_arr));
     return $resArray;
 }
예제 #3
0
 function amazons3_backup($historyID, $args = '')
 {
     if (!$this->iwp_mmb_function_exists('curl_init')) {
         return array('error' => 'You cannot use Amazon S3 on your server. Please enable curl first.', 'partial' => 1, 'error_code' => 'cannot_use_s3_enable_curl_first');
     }
     if (!class_exists('S3Client')) {
         require_once $GLOBALS['iwp_mmb_plugin_dir'] . '/lib/amazon/autoload.php';
     }
     $s3StartTime = $this->iwpScriptStartTime;
     $this->backup_settings_vals = get_option('iwp_client_multi_backup_temp_values');
     $backup_settings_values = $this->backup_settings_vals;
     if (isset($backup_settings_values['s3_retrace_count']) && !empty($backup_settings_values['s3_retrace_count'])) {
         $s3_retrace_count = $backup_settings_values['s3_retrace_count'][$historyID];
     } else {
         $s3_retrace_count = 0;
     }
     //get the settings by other method
     $requestParams = $this->getRequiredData($historyID, "requestParams");
     $upload_loop_break_time = $requestParams['account_info']['upload_loop_break_time'];
     //darkcode changed
     $upload_file_block_size = $requestParams['account_info']['upload_file_block_size'];
     if ($upload_file_block_size < 5 * 1024 * 1024) {
         $upload_file_block_size = 5 * 1024 * 1024 + 1;
     }
     $del_host_file = $requestParams['args']['del_host_file'];
     $task_result = $this->getRequiredData($historyID, "taskResults");
     @set_time_limit(0);
     $this->hisID = $historyID;
     $uploadLoopCount = 0;
     $uploadId = 'start';
     $parts = array();
     $nextPart = 1;
     $retrace = 'notSet';
     $doComplete = false;
     if ($args == '') {
         //on the next call $args would be ''
         //set $args, $uploadid, $offset  from the DB
         $responseParams = $this->getRequiredData($historyID, "responseParams");
         if (!$responseParams) {
             return $this->statusLog($this->hisID, array('stage' => 's3Upload', 'status' => 'error', 'statusMsg' => 'S3 Upload failed: Error while fetching table data.', 'statusCode' => 's3_upload_failed_error_while_fetching_table_data'));
         }
         $args = $responseParams['s3Args'];
         $prevChunkResults = $responseParams['response_data'];
         $uploadId = $prevChunkResults['uploadId'];
         $nextPart = $prevChunkResults['nextPart'];
         $partsArray = $prevChunkResults['partsArray'];
         $parts = $prevChunkResults['parts'];
         $current_file_num = $responseParams['current_file_num'];
         $dont_retrace = $responseParams['dont_retrace'];
         $start_new_backup = $responseParams['start_new_backup'];
     }
     if (empty($current_file_num)) {
         $current_file_num = 0;
     }
     //traceback options and setting values
     if (!$uploadId && empty($dont_retrace)) {
         if ($s3_retrace_count <= 3) {
             $args = $requestParams['secure']['account_info']['iwp_amazon_s3'];
             if ($backup_settings_values['s3_upload_id']) {
                 $uploadId = $backup_settings_values['s3_upload_id'][$historyID];
             } else {
                 return $this->statusLog($this->hisID, array('stage' => 's3Upload Retrace', 'status' => 'error', 'statusMsg' => 'S3 Upload failed: Error while fetching table data during retrace', 'statusCode' => 's3_upload_failed_error_while_fetching_table_data_during_retrace'));
             }
             $backup_file = $backup_settings_values['backup_file'];
             $retrace = 'set';
             $s3_retrace_count++;
             $backup_settings_values['s3_retrace_count'][$historyID] = $s3_retrace_count;
             update_option('iwp_client_multi_backup_temp_values', $backup_settings_values);
         } else {
             return $this->statusLog($this->hisID, array('stage' => 's3Upload', 'status' => 'error', 'statusMsg' => 'S3 upload failed: Retrace limit reached.', 'statusCode' => 's3_upload_failed_retrace_limit_reached'));
         }
     }
     //tracback ends
     $tempArgs = $args;
     extract($args);
     if (!is_array($backup_file)) {
         $temp_backup_file = $backup_file;
         $backup_file = array();
         $backup_file[] = $temp_backup_file;
     }
     if (is_array($backup_file)) {
         $backup_files_count = count($backup_file);
         $temp_single_file = $backup_file[$current_file_num];
         unset($backup_file);
         $backup_file = $temp_single_file;
     } else {
         $backup_files_count = 1;
     }
     if ($as3_site_folder == true) {
         if (!empty($as3_directory)) {
             $as3_directory .= '/' . $this->site_name;
         } else {
             $as3_directory = $this->site_name;
         }
     }
     if ($s3_retrace_count <= 3) {
         try {
             $s3 = S3Client::factory(array('key' => trim($as3_access_key), 'secret' => trim(str_replace(' ', '+', $as3_secure_key)), 'region' => $as3_bucket_region, 'signature' => 'v4', 'ssl.certificate_authority' => false));
             $objects = $s3->getIterator('ListObjects', array('Bucket' => $as3_bucket));
             foreach ($objects as $object) {
                 echo $s3->getObjectUrl($as3_bucket, $object['Key']);
                 break;
             }
             //the mulitCall upload starts				darkCode starts
             if (!empty($as3_directory)) {
                 $as3_file = $as3_directory . '/' . basename($backup_file);
             } else {
                 $as3_file = basename($backup_file);
             }
             if (iwp_mmb_get_file_size($backup_file) <= 5 * 1024 * 1024) {
                 //new starts
                 echo "<br>small backup so single upload<br>";
                 $s3->putObject(array('Bucket' => $as3_bucket, 'SourceFile' => $backup_file, 'Key' => $as3_file, 'ACL' => 'public-read'));
                 $current_file_num += 1;
                 $resArray = array('status' => "completed", 'backupParentHID' => $historyID);
                 $result_arr = array();
                 $result_arr['status'] = 'completed';
                 $result_arr['nextFunc'] = 'amazons3_backup_over';
                 $result_arr['s3Args'] = $tempArgs;
                 $result_arr['current_file_num'] = $current_file_num;
                 $result_arr['dont_retrace'] = true;
                 $task_result['task_results'][$historyID]['amazons3'][$current_file_num - 1] = basename($backup_file);
                 $task_result['amazons3'][$current_file_num - 1] = basename($backup_file);
                 if ($current_file_num >= $backup_files_count) {
                     unset($task_result['task_results'][$historyID]['server']);
                     @unlink($backup_file);
                 } else {
                     //to continue zip split parts
                     $resArray['status'] = 'partiallyCompleted';
                     $chunkResult = array();
                     $chunkResult['partsArray'] = array();
                     $chunkResult['nextPart'] = 1;
                     $chunkResult['uploadId'] = 'start';
                     $result_arr['response_data'] = $chunkResult;
                     $result_arr['nextFunc'] = 'amazons3_backup';
                     $result_arr['status'] = 'partiallyCompleted';
                     $result_arr['start_new_backup'] = true;
                     @unlink($backup_file);
                 }
                 $this->statusLog($this->hisID, array('stage' => 's3MultiCall', 'status' => 'completed', 'statusMsg' => 'nextCall', 'nextFunc' => 'amazons3_backup', 'task_result' => $task_result, 'responseParams' => $result_arr));
                 return $resArray;
             } else {
                 if ($uploadId == 'start' && isset($parts)) {
                     echo "iwpmsg initiating multiCall upload";
                     //get the uploadID
                     $filename = $backup_file;
                     $result = $s3->createMultipartUpload(array('Bucket' => $as3_bucket, 'Key' => $as3_file, 'ACL' => 'public-read'));
                     $parts = array();
                     $uploadId = $result['UploadId'];
                     //storing the uploadID in DB
                     $backup_settings_values['s3_upload_id'][$historyID] = $uploadId;
                     $backup_settings_values['backup_file'] = $backup_file;
                     update_option('iwp_client_multi_backup_temp_values', $backup_settings_values);
                 }
                 $s3ChunkTimeTaken = 0;
                 $s3ChunkCount = 0;
                 $reloopCount = 0;
                 try {
                     $filename = $backup_file;
                     $file = fopen($filename, 'r');
                     $partNumber = 1;
                     echo $partNumber;
                     $reloopCount = 0;
                     while (!feof($file)) {
                         if ($reloopCount == 0) {
                             $s3ChunkStartTime = $s3StartTime;
                             $reloopCount++;
                         } else {
                             $s3ChunkStartTime = microtime(true);
                         }
                         if ($partNumber == $nextPart) {
                             $result = $s3->uploadPart(array('Bucket' => $as3_bucket, 'Key' => $as3_file, 'UploadId' => $uploadId, 'PartNumber' => $partNumber, 'Body' => fread($file, 5 * 1024 * 1024)));
                             $parts[] = array('PartNumber' => $partNumber++, 'ETag' => $result['ETag']);
                             echo "Uploading part {$partNumber} of {$filename}.\n";
                             $chunkResult['nextPart'] = $nextPart + 1;
                             $chunkResult['uploadId'] = $uploadId;
                             $chunkResult['parts'] = $parts;
                             $nextPart = $nextPart + 1;
                             $backup_settings_values['s3_retrace_count'][$historyID] = 0;
                             update_option('iwp_client_multi_backup_temp_values', $backup_settings_values);
                             $status = 'partiallyCompleted';
                             $result_arr = array();
                             $result_arr['response_data'] = $chunkResult;
                             $result_arr['status'] = $status;
                             $result_arr['nextFunc'] = 'amazons3_backup';
                             $result_arr['s3Args'] = $tempArgs;
                             $result_arr['current_file_num'] = $current_file_num;
                             $task_result['task_results'][$historyID]['amazons3'][$current_file_num] = basename($backup_file);
                             $task_result['amazons3'][$current_file_num] = basename($backup_file);
                             $this->statusLog($this->hisID, array('stage' => 's3MultiCall', 'status' => 'completed', 'statusMsg' => 'nextCall', 'nextFunc' => 'amazons3_backup', 'task_result' => $task_result, 'responseParams' => $result_arr));
                             $resArray = array('status' => $status, 'backupParentHID' => $historyID);
                             $s3ChunkEndTime = microtime(true);
                             $s3ChunkTimeTaken = $s3ChunkEndTime - $s3ChunkStartTime;
                             $s3EndTime = microtime(true);
                             $s3TimeTaken = $s3EndTime - $s3StartTime;
                             $s3TimeLeft = $upload_loop_break_time - $s3TimeTaken;
                             if (!empty($chunkResult['nextPart'])) {
                                 echo 'parts' . $chunkResult['nextPart'];
                             }
                             echo " s3TimeTaken " . $s3TimeTaken;
                             $s3UploadedSize = $uploadLoopCount * 5;
                             echo " s3 approx file size written " . $s3UploadedSize;
                             iwp_mmb_print_flush("s3loop");
                             echo " s3TimeLeft " . $s3TimeLeft;
                             echo " s3ChunkTimeTaken " . $s3ChunkTimeTaken;
                             if ($s3TimeLeft <= $s3ChunkTimeTaken) {
                                 $this->statusLog($this->hisID, array('stage' => 's3MultiCall', 'status' => 'partiallyCompleted', 'statusMsg' => 'nextCall', 'nextFunc' => 'amazons3_backup', 'task_result' => $task_result, 'responseParams' => $result_arr));
                                 fclose($file);
                                 break;
                             }
                         } else {
                             fread($file, 5 * 1024 * 1024);
                             $partNumber++;
                         }
                     }
                     fclose($file);
                 } catch (S3Exception $e) {
                     $this->statusLog($this->hisID, array('stage' => 's3MultiCall', 'status' => 'partiallyCompleted', 'statusMsg' => 'retracingValues', 'nextFunc' => 'amazons3_backup', 'task_result' => $task_result, 'responseParams' => $result_arr));
                 }
                 if ($nextPart == ceil(iwp_mmb_get_file_size($backup_file) / 1024 / 1024 / 5) + 1) {
                     $result = $s3->completeMultipartUpload(array('Bucket' => $as3_bucket, 'Key' => $as3_file, 'UploadId' => $uploadId, 'Parts' => $parts));
                     $url = $result['Location'];
                     $current_file_num += 1;
                     $result_arr = array();
                     $result_arr['response_data'] = $chunkResult;
                     $result_arr['status'] = 'completed';
                     $result_arr['nextFunc'] = 'amazons3_backup_over';
                     $result_arr['s3Args'] = $tempArgs;
                     $result_arr['dont_retrace'] = true;
                     $result_arr['current_file_num'] = $current_file_num;
                     $resArray = array('status' => 'completed', 'backupParentHID' => $historyID);
                     if ($current_file_num >= $backup_files_count) {
                         $task_result['task_results'][$historyID]['amazons3'][$current_file_num - 1] = basename($backup_file);
                         $task_result['amazons3'][$current_file_num - 1] = basename($backup_file);
                         unset($task_result['task_results'][$historyID]['server']);
                     } else {
                         //to continue zip split parts
                         $chunkResult = array();
                         $chunkResult['partsArray'] = array();
                         $chunkResult['nextPart'] = 1;
                         $chunkResult['uploadId'] = 'start';
                         $chunkResult['parts'] = '';
                         $result_arr['response_data'] = $chunkResult;
                         $result_arr['status'] = 'partiallyCompleted';
                         $result_arr['nextFunc'] = 'amazons3_backup';
                         $result_arr['start_new_backup'] = true;
                         $resArray['status'] = 'partiallyCompleted';
                     }
                     $this->statusLog($this->hisID, array('stage' => 's3MultiCall', 'status' => 'completed', 'statusMsg' => 'finalCall', 'nextFunc' => 'amazons3_backup', 'task_result' => $task_result, 'responseParams' => $result_arr));
                     $status = 'completed';
                     iwp_mmb_print_flush('Amazon S3 upload: End');
                     if ($status == 'completed') {
                         $partArrayLength = count($partsArray);
                         $verificationResult = $this->postUploadVerification($s3, $backup_file, $as3_file, $type = "amazons3", $as3_bucket, $as3_access_key, $as3_secure_key, $as3_bucket_region);
                         if (!$verificationResult) {
                             return $this->statusLog($historyID, array('stage' => 'uploadAmazons3', 'status' => 'error', 'statusMsg' => 'S3 verification failed: File may be corrupted.', 'statusCode' => 'docomplete_S3_verification_failed_file_may_be_corrupted'));
                         }
                         if ($del_host_file) {
                             @unlink($backup_file);
                         }
                         return $resArray;
                     }
                     echo "Uploaded {$filename} to {$backup_file}.\n";
                 } else {
                     return $resArray;
                 }
             }
         } catch (Exception $e) {
             $result = $s3->abortMultipartUpload(array('Bucket' => $as3_bucket, 'Key' => $as3_file, 'UploadId' => $uploadId));
             $err = $e->getMessage();
             if ($err) {
                 return array('error' => 'Failed to upload to AmazonS3 (' . $err . ').', 'error_code' => 'failed_to_upload_s3_err');
             } else {
                 return array('error' => 'Failed to upload to Amazon S3.', 'error_code' => 'failed_to_upload_s3');
             }
         }
     } else {
         return array('error' => 'Failed to upload to Amazon S3. Could not connect amazon server at the moment', 'partial' => 1, 'error_code' => 'failed_to_upload_to_s3_Could_not_connect_amazon_server_at_the_moment');
     }
 }
예제 #4
0
파일: init.php 프로젝트: Trideon/gigolo
 function iwp_mmb_auto_print($unique_task)
 {
     // this will help responding web server, will keep alive the script execution
     $print_every_x_secs = 5;
     $current_time = microtime(1);
     if (!$GLOBALS['IWP_MMB_PROFILING']['TASKS'][$unique_task]['START']) {
         $GLOBALS['IWP_MMB_PROFILING']['TASKS'][$unique_task]['START'] = $current_time;
     }
     if (!$GLOBALS['IWP_MMB_PROFILING']['LAST_PRINT'] || $current_time - $GLOBALS['IWP_MMB_PROFILING']['LAST_PRINT'] > $print_every_x_secs) {
         //$print_string = "TT:".($current_time - $GLOBALS['IWP_MMB_PROFILING']['ACTION_START'])."\n";
         $print_string = $unique_task . " TT:" . ($current_time - $GLOBALS['IWP_MMB_PROFILING']['TASKS'][$unique_task]['START']);
         iwp_mmb_print_flush($print_string);
         $GLOBALS['IWP_MMB_PROFILING']['LAST_PRINT'] = $current_time;
     }
 }
예제 #5
0
 function backup_db_php($file)
 {
     global $wpdb;
     if (empty($GLOBALS['fail_safe_db'])) {
         iwp_mmb_print_flush('DB DUMP PHP Normal: Start');
         $fp = fopen($file, 'w');
         $_count = 0;
         $insert_sql = '';
         $result = $wpdb->get_results('SHOW TABLES LIKE "' . $wpdb->base_prefix . '%"');
         if (!$result) {
             return array('error' => 'MySQL ' . $wpdb->print_error() . " ", 'error_code' => 'MySQL ' . str_replace(" ", "_", $wpdb->print_error()) . " ");
         }
         foreach ($result as $index => $value) {
             foreach ($value as $tableName) {
                 //echo $tableName . '<br />';
                 $tables[] = $tableName;
             }
         }
         foreach ($tables as $table) {
             iwp_mmb_auto_print('backup_db_php_normal');
             $insert_sql .= "DROP TABLE IF EXISTS {$table};";
             $table_descr_query = $wpdb->get_results("SHOW CREATE TABLE `{$table}`", ARRAY_N);
             $insert_sql .= "\n\n" . $table_descr_query[0][1] . ";\n\n";
             fwrite($fp, $insert_sql);
             $insert_sql = '';
             $table_query = $wpdb->get_results("SELECT * FROM `{$table}`", ARRAY_N);
             $num_fields = $wpdb->num_rows;
             foreach ($table_query as $final) {
                 $counts = count($final);
                 $insert_sql .= "INSERT INTO {$table} VALUES(";
                 for ($i = 0; $i < $counts; $i++) {
                     if ($final[$i] == NULL) {
                         $insert_sql .= "'', ";
                     } else {
                         $insert_sql .= "'" . esc_sql($final[$i]) . "', ";
                     }
                     //mb_convert_encoding(esc_sql($final[$i] ), "HTML-ENTITIES", "ISO-8859-1")
                 }
                 $insert_sql = substr($insert_sql, 0, -2);
                 $insert_sql .= ");\n";
                 fwrite($fp, $insert_sql);
                 $insert_sql = '';
                 $_count++;
                 if ($_count >= 400) {
                     echo ' ';
                     flush();
                     $_count = 0;
                 }
             }
             $insert_sql .= "\n\n\n";
             if ($wpdb->check_connection()) {
                 // Still connected to database.
                 $wpdb->flush();
                 // Free memory.
             }
             // Help keep HTTP alive.
             echo ' ';
             flush();
             //unset( $tables[$table_key] );
         }
         fclose($fp);
         unset($fp);
         iwp_mmb_print_flush('DB DUMP PHP Normal: End');
     } else {
         iwp_mmb_print_flush('DB DUMP PHP Fail-safe: Start');
         file_put_contents($file, '');
         //safe  to reset any old data
         //$tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
         $tables = $wpdb->get_results('SHOW TABLES LIKE "' . $wpdb->base_prefix . '%"', ARRAY_N);
         foreach ($tables as $table) {
             //drop existing table
             $dump_data = "DROP TABLE IF EXISTS {$table['0']};";
             file_put_contents($file, $dump_data, FILE_APPEND);
             //create table
             $create_table = $wpdb->get_row("SHOW CREATE TABLE {$table['0']}", ARRAY_N);
             $dump_data = "\n\n" . $create_table[1] . ";\n\n";
             file_put_contents($file, $dump_data, FILE_APPEND);
             $count = $wpdb->get_var("SELECT count(*) FROM {$table['0']}");
             if ($count > 100) {
                 $count = ceil($count / 100);
             } else {
                 if ($count > 0) {
                     $count = 1;
                 }
             }
             for ($i = 0; $i < $count; $i++) {
                 iwp_mmb_auto_print('backup_db_php_fail_safe');
                 $low_limit = $i * 100;
                 $qry = "SELECT * FROM {$table['0']} LIMIT {$low_limit}, 100";
                 $rows = $wpdb->get_results($qry, ARRAY_A);
                 if (is_array($rows)) {
                     foreach ($rows as $row) {
                         //insert single row
                         $dump_data = "INSERT INTO {$table['0']} VALUES(";
                         $num_values = count($row);
                         $j = 1;
                         foreach ($row as $value) {
                             $value = addslashes($value);
                             $value = preg_replace("/\n/Ui", "\\n", $value);
                             $num_values == $j ? $dump_data .= "'" . $value . "'" : ($dump_data .= "'" . $value . "', ");
                             $j++;
                             unset($value);
                         }
                         $dump_data .= ");\n";
                         file_put_contents($file, $dump_data, FILE_APPEND);
                     }
                 }
             }
             $dump_data = "\n\n\n";
             file_put_contents($file, $dump_data, FILE_APPEND);
             unset($rows);
             unset($dump_data);
         }
         iwp_mmb_print_flush('DB DUMP PHP Fail-safe: End');
     }
     if (iwp_mmb_get_file_size($file) == 0 || !is_file($file)) {
         @unlink($file);
         return array('error' => 'Database backup failed. Try to enable MySQL dump on your server.', 'error_code' => 'database_backup_failed_enable_MySQL_dump_server');
     }
     return $file;
 }
예제 #6
0
 function backup_db_php($file)
 {
     global $wpdb;
     if (empty($GLOBALS['fail_safe_db'])) {
         iwp_mmb_print_flush('DB DUMP PHP Normal: Start');
         $fp = fopen($file, 'w');
         if (!mysql_ping($wpdb->dbh)) {
             mysql_connect(DB_HOST, DB_USER, DB_PASSWORD);
             mysql_select_db(DB_NAME);
         }
         $_count = 0;
         $insert_sql = '';
         //$result = mysql_query( 'SHOW TABLES' );
         $result = mysql_query('SHOW TABLES LIKE "' . $wpdb->base_prefix . '%"');
         if (!$result) {
             return array('error' => 'MySQL ' . mysql_error() . " ", 'error_code' => 'MySQL ' . str_replace(" ", "_", mysql_error()) . " ");
         }
         while ($row = mysql_fetch_row($result)) {
             $tables[] = $row[0];
             //array_push( $tables, $row[0] );
         }
         //$tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
         foreach ($tables as $table) {
             iwp_mmb_auto_print('backup_db_php_normal');
             $insert_sql .= "DROP TABLE IF EXISTS {$table};";
             //create table
             $table_descr_query = mysql_query("SHOW CREATE TABLE `{$table}`");
             $fetch_table_descr_row = mysql_fetch_array($table_descr_query);
             $insert_sql .= "\n\n" . $fetch_table_descr_row[1] . ";\n\n";
             fwrite($fp, $insert_sql);
             $insert_sql = '';
             $table_query = mysql_query("SELECT * FROM `{$table}`");
             $num_fields = mysql_num_fields($table_query);
             while ($fetch_row = mysql_fetch_array($table_query)) {
                 $insert_sql .= "INSERT INTO {$table} VALUES(";
                 for ($n = 1; $n <= $num_fields; $n++) {
                     $m = $n - 1;
                     if ($fetch_row[$m] === NULL) {
                         $insert_sql .= "NULL, ";
                     } else {
                         $insert_sql .= "'" . mysql_real_escape_string($fetch_row[$m]) . "', ";
                     }
                 }
                 $insert_sql = substr($insert_sql, 0, -2);
                 $insert_sql .= ");\n";
                 fwrite($fp, $insert_sql);
                 $insert_sql = '';
                 // Help keep HTTP alive.
                 $_count++;
                 if ($_count >= 400) {
                     echo ' ';
                     flush();
                     $_count = 0;
                 }
             }
             // End foreach $tables.
             $insert_sql .= "\n\n\n";
             // testing: mysql_close( $wpdb->dbh );
             // Verify database is still connected and working properly. Sometimes mysql runs out of memory and dies in the above foreach.
             // No point in reconnecting as we can NOT trust that our dump was succesful anymore (it most likely was not).
             if (@mysql_ping($wpdb->dbh)) {
                 // Still connected to database.
                 mysql_free_result($table_query);
                 // Free memory.
             }
             /*else { // Database not connected.
             		
             				return false;
             			}*/
             // Help keep HTTP alive.
             echo ' ';
             flush();
             //unset( $tables[$table_key] );
         }
         fclose($fp);
         unset($fp);
         iwp_mmb_print_flush('DB DUMP PHP Normal: End');
     } else {
         iwp_mmb_print_flush('DB DUMP PHP Fail-safe: Start');
         file_put_contents($file, '');
         //safe  to reset any old data
         //$tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
         $tables = $wpdb->get_results('SHOW TABLES LIKE "' . $wpdb->base_prefix . '%"', ARRAY_N);
         foreach ($tables as $table) {
             //drop existing table
             $dump_data = "DROP TABLE IF EXISTS {$table['0']};";
             file_put_contents($file, $dump_data, FILE_APPEND);
             //create table
             $create_table = $wpdb->get_row("SHOW CREATE TABLE {$table['0']}", ARRAY_N);
             $dump_data = "\n\n" . $create_table[1] . ";\n\n";
             file_put_contents($file, $dump_data, FILE_APPEND);
             $count = $wpdb->get_var("SELECT count(*) FROM {$table['0']}");
             if ($count > 100) {
                 $count = ceil($count / 100);
             } else {
                 if ($count > 0) {
                     $count = 1;
                 }
             }
             for ($i = 0; $i < $count; $i++) {
                 iwp_mmb_auto_print('backup_db_php_fail_safe');
                 $low_limit = $i * 100;
                 $qry = "SELECT * FROM {$table['0']} LIMIT {$low_limit}, 100";
                 $rows = $wpdb->get_results($qry, ARRAY_A);
                 if (is_array($rows)) {
                     foreach ($rows as $row) {
                         //insert single row
                         $dump_data = "INSERT INTO {$table['0']} VALUES(";
                         $num_values = count($row);
                         $j = 1;
                         foreach ($row as $value) {
                             $value = addslashes($value);
                             $value = preg_replace("/\n/Ui", "\\n", $value);
                             $num_values == $j ? $dump_data .= "'" . $value . "'" : ($dump_data .= "'" . $value . "', ");
                             $j++;
                             unset($value);
                         }
                         $dump_data .= ");\n";
                         file_put_contents($file, $dump_data, FILE_APPEND);
                     }
                 }
             }
             $dump_data = "\n\n\n";
             file_put_contents($file, $dump_data, FILE_APPEND);
             unset($rows);
             unset($dump_data);
         }
         iwp_mmb_print_flush('DB DUMP PHP Fail-safe: End');
     }
     if (iwp_mmb_get_file_size($file) == 0 || !is_file($file)) {
         @unlink($file);
         return array('error' => 'Database backup failed. Try to enable MySQL dump on your server.', 'error_code' => 'database_backup_failed_enable_MySQL_dump_server');
     }
     return $file;
 }
예제 #7
0
 function restore_db()
 {
     global $wpdb;
     $paths = $this->check_mysql_paths();
     $file_path = ABSPATH . 'iwp_db';
     @chmod($file_path, 0755);
     $file_name = glob($file_path . '/*.sql');
     $file_name = $file_name[0];
     if (!$file_name) {
         return array('error' => 'Cannot access database file.');
     }
     $brace = substr(PHP_OS, 0, 3) == 'WIN' ? '"' : '';
     $command = $brace . $paths['mysql'] . $brace . ' --host="' . DB_HOST . '" --user="******" --password="******" --default-character-set="utf8" ' . DB_NAME . ' < ' . $brace . $file_name . $brace;
     iwp_mmb_print_flush('DB Restore CMD: Start');
     ob_start();
     $result = $this->iwp_mmb_exec($command);
     ob_get_clean();
     iwp_mmb_print_flush('DB Restore CMD: End');
     if (!$result) {
         //try php
         $this->restore_db_php($file_name);
     }
     @unlink($file_name);
     @unlink(dirname($file_name));
     //remove its folder
     return true;
 }