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; }
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; }
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'); } }
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; } }
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; }
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; }
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; }