BackWPup – WordPress Backup Plugin - Version 3.1.4

Version Description

= After an upgrade from version 2 =

Please check all settings after the update:

  • Dropbox authentication must be done again
  • SugarSync authentication must be done again
  • S3 Settings
  • Google Storage is now in S3
  • Check all your passwords
Download this release

Release Info

Developer danielhuesken
Plugin Icon 128x128 BackWPup – WordPress Backup Plugin
Version 3.1.4
Comparing to
See all releases

Code changes from version 3.1.3 to 3.1.4

Files changed (41) hide show
  1. backwpup.php +2 -2
  2. inc/class-create-archive.php +673 -664
  3. inc/class-destination-dropbox.php +792 -791
  4. inc/class-destination-s3-v1.php +596 -596
  5. inc/class-destination-s3.php +680 -680
  6. inc/class-job.php +38 -8
  7. inc/class-jobtype-dbdump.php +1 -1
  8. inc/class-jobtype-wpexp.php +719 -719
  9. inc/class-jobtype-wpplugin.php +1 -1
  10. inc/class-page-about.php +715 -715
  11. inc/class-page-editjob.php +8 -7
  12. inc/class-page-jobs.php +716 -716
  13. inc/class-page-settings.php +457 -457
  14. inc/class-wp-cli.php +1 -4
  15. languages/backwpup-de_DE.po +6109 -6109
  16. languages/backwpup-ja.mo +0 -0
  17. languages/backwpup-ja.po +15 -15
  18. license.txt +0 -674
  19. readme.md +0 -59
  20. readme.txt +9 -4
  21. screenshot-1.png +0 -0
  22. screenshot-2.png +0 -0
  23. screenshot-3.png +0 -0
  24. screenshot-4.png +0 -0
  25. screenshot-5.png +0 -0
  26. uninstall.php +42 -42
  27. vendor/Aws/Common/Aws.php +105 -105
  28. vendor/Aws/Common/Client/AbstractClient.php +272 -272
  29. vendor/Aws/Common/Client/ClientBuilder.php +467 -467
  30. vendor/Aws/Common/Command/AwsQueryVisitor.php +117 -117
  31. vendor/Aws/Common/Credentials/Credentials.php +337 -337
  32. vendor/Aws/Common/Credentials/NullCredentials.php +68 -68
  33. vendor/Aws/Common/Enum/Region.php +63 -63
  34. vendor/Aws/Common/Facade/Facade.php +67 -67
  35. vendor/Aws/Common/Hash/HashUtils.php +76 -76
  36. vendor/Aws/Common/Model/MultipartUpload/AbstractUploadBuilder.php +148 -148
  37. vendor/Aws/Common/Resources/aws-config.php +272 -272
  38. vendor/Aws/Common/Resources/public-endpoints.php +67 -67
  39. vendor/Aws/Common/RulesEndpointProvider.php +67 -67
  40. vendor/Aws/Common/Signature/AbstractSignature.php +44 -44
  41. vendor/Aws/Common/Signature/SignatureInterface.php +30 -52
backwpup.php CHANGED
@@ -5,7 +5,7 @@
5
  * Description: WordPress Backup Plugin
6
  * Author: Inpsyde GmbH
7
  * Author URI: http://inpsyde.com
8
- * Version: 3.1.3
9
  * Text Domain: backwpup
10
  * Domain Path: /languages/
11
  * Network: true
@@ -98,7 +98,7 @@ if ( ! class_exists( 'BackWPup' ) ) {
98
  //deactivation hook
99
  register_deactivation_hook( __FILE__, array( 'BackWPup_Install', 'deactivate' ) );
100
  //Admin bar
101
- if ( is_admin_bar_showing() && current_user_can( 'backwpup' ) && get_site_option( 'backwpup_cfg_showadminbar' ) ) {
102
  add_action( 'init', array( 'BackWPup_Adminbar', 'get_instance' ) );
103
  }
104
  //only in backend
5
  * Description: WordPress Backup Plugin
6
  * Author: Inpsyde GmbH
7
  * Author URI: http://inpsyde.com
8
+ * Version: 3.1.4
9
  * Text Domain: backwpup
10
  * Domain Path: /languages/
11
  * Network: true
98
  //deactivation hook
99
  register_deactivation_hook( __FILE__, array( 'BackWPup_Install', 'deactivate' ) );
100
  //Admin bar
101
+ if ( is_admin_bar_showing() ) {
102
  add_action( 'init', array( 'BackWPup_Adminbar', 'get_instance' ) );
103
  }
104
  //only in backend
inc/class-create-archive.php CHANGED
@@ -1,664 +1,673 @@
1
- <?php
2
- /**
3
- * Class for creating File Archives
4
- */
5
- class BackWPup_Create_Archive {
6
-
7
- /**
8
- * Achieve file with full path
9
- *
10
- * @var string
11
- */
12
- private $file = '';
13
-
14
- /**
15
- * Compression method
16
- *
17
- * @var string Method off compression Methods are ZipArchive, PclZip, Tar, TarGz, TarBz2, gz, bz2
18
- */
19
- private $method = '';
20
-
21
- /**
22
- * Open handel for files.
23
- */
24
- private $filehandel = '';
25
-
26
- /**
27
- * class handel for ZipArchive.
28
- *
29
- * @var ZipArchive
30
- */
31
- private $ziparchive = NULL;
32
-
33
- /**
34
- * class handel for PclZip.
35
- *
36
- * @var PclZip
37
- */
38
- private $pclzip = NULL;
39
-
40
- /**
41
- * class handel for PclZip.
42
- *
43
- * @var array()
44
- */
45
- private $pclzip_file_list = array();
46
-
47
- /**
48
- * Saved encoding will restored on __destruct
49
- *
50
- * @var string
51
- */
52
- private $previous_encoding = '';
53
-
54
- /**
55
- * File cont off added files to handel somethings that depends on it
56
- *
57
- * @var int number of files added
58
- */
59
- private $file_count = 0;
60
-
61
- /**
62
- * Set archive Parameter
63
- *
64
- * @param $file string File with full path of the archive
65
- * @throws BackWPup_Create_Archive_Exception
66
- */
67
- public function __construct( $file ) {
68
-
69
- //check param
70
- if ( empty( $file ) ) {
71
- throw new BackWPup_Create_Archive_Exception( __( 'The file name of an archive cannot be empty.', 'backwpup' ) );
72
- }
73
-
74
- //set file
75
- $this->file = trim( $file );
76
-
77
- //check folder can used
78
- if ( ! is_dir( dirname( $this->file ) ) ||! is_writable( dirname( $this->file ) ) ) {
79
- throw new BackWPup_Create_Archive_Exception( sprintf( _x( 'Folder %s for archive not found','%s = Folder name', 'backwpup' ), dirname( $this->file ) ) );
80
- }
81
-
82
- //set and check method and get open handle
83
- if ( strtolower( substr( $this->file, -7 ) ) == '.tar.gz' ) {
84
- if ( ! function_exists( 'gzencode' ) ) {
85
- throw new BackWPup_Create_Archive_Exception( __( 'Functions for gz compression not available', 'backwpup' ) );
86
- }
87
- $this->method = 'TarGz';
88
- $this->filehandel = fopen( $this->file, 'ab' );
89
- }
90
- elseif ( strtolower( substr( $this->file, -8 ) ) == '.tar.bz2' ) {
91
- if ( ! function_exists( 'bzcompress' ) ) {
92
- throw new BackWPup_Create_Archive_Exception( __( 'Functions for bz2 compression not available', 'backwpup' ) );
93
- }
94
- $this->method = 'TarBz2';
95
- $this->filehandel = fopen( $this->file, 'ab' );
96
- }
97
- elseif ( strtolower( substr( $this->file, -4 ) ) == '.tar' ) {
98
- $this->method = 'Tar';
99
- $this->filehandel = fopen( $this->file, 'ab');
100
- }
101
- elseif ( strtolower( substr( $this->file, -4 ) ) == '.zip' ) {
102
- $this->method = get_site_option( 'backwpup_cfg_jobziparchivemethod');
103
- //check and set method
104
- if ( empty( $this->method ) || ( $this->method != 'ZipArchive' && $this->method != 'PclZip' ) ) {
105
- $this->method = 'ZipArchive';
106
- }
107
- if ( ! class_exists( 'ZipArchive' ) ) {
108
- $this->method = 'PclZip';
109
- }
110
- //open classes
111
- if ( $this->get_method() == 'ZipArchive' ) {
112
- $this->ziparchive = new ZipArchive();
113
- $ziparchive_open = $this->ziparchive->open( $this->file, ZipArchive::CREATE );
114
- if ( $ziparchive_open !== TRUE ) {
115
- $this->ziparchive_status();
116
- throw new BackWPup_Create_Archive_Exception( sprintf( _x( 'Cannot create zip archive: %d','ZipArchive open() result', 'backwpup' ), $ziparchive_open ) );
117
- }
118
- }
119
- if ( $this->get_method() == 'PclZip' && ! function_exists( 'gzencode' ) ) {
120
- throw new BackWPup_Create_Archive_Exception( __( 'Functions for gz compression not available', 'backwpup' ) );
121
- }
122
- if( $this->get_method() == 'PclZip' ) {
123
- $this->method = 'PclZip';
124
- if ( ini_get( 'mbstring.func_overload' ) && function_exists( 'mb_internal_encoding' ) ) {
125
- $this->previous_encoding = mb_internal_encoding();
126
- mb_internal_encoding( 'ISO-8859-1' );
127
- }
128
- if ( ! defined('PCLZIP_TEMPORARY_DIR') ) {
129
- define( 'PCLZIP_TEMPORARY_DIR', BackWPup::get_plugin_data( 'TEMP' ) );
130
- }
131
- require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';
132
- $this->pclzip = new PclZip( $this->file );
133
- }
134
- }
135
- elseif ( strtolower( substr( $this->file, -3 ) ) == '.gz' ) {
136
- if ( ! function_exists( 'gzencode' ) )
137
- throw new BackWPup_Create_Archive_Exception( __( 'Functions for gz compression not available', 'backwpup' ) );
138
- $this->method = 'gz';
139
- $this->filehandel = fopen( 'compress.zlib://' . $this->file, 'wb');
140
- }
141
- elseif ( strtolower( substr( $this->file, -4 ) ) == '.bz2' ) {
142
- if ( ! function_exists( 'bzcompress' ) ) {
143
- throw new BackWPup_Create_Archive_Exception( __( 'Functions for bz2 compression not available', 'backwpup' ) );
144
- }
145
- $this->method = 'bz2';
146
- $this->filehandel = fopen( 'compress.bzip2://' . $this->file, 'w');
147
- }
148
- else {
149
- throw new BackWPup_Create_Archive_Exception( sprintf( _x( 'Method to archive file %s not detected','%s = file name', 'backwpup' ), basename( $this->file ) ) );
150
- }
151
-
152
- //check file handle
153
- if ( ! empty( $this->filehandel ) && ! is_resource( $this->filehandel ) ) {
154
- throw new BackWPup_Create_Archive_Exception( __( 'Cannot open archive file', 'backwpup' ) );
155
- }
156
-
157
- }
158
-
159
-
160
- /**
161
- * Closes open archive on shutdown.
162
- */
163
- public function __destruct() {
164
-
165
- //set encoding back
166
- if ( ! empty( $this->previous_encoding ) ) {
167
- mb_internal_encoding( $this->previous_encoding );
168
- }
169
-
170
- //close PclZip Class
171
- if ( is_object( $this->pclzip ) ) {
172
- if ( count( $this->pclzip_file_list ) > 0 ) {
173
- if ( 0 == $this->pclzip->add( $this->pclzip_file_list ) ) {
174
- trigger_error( sprintf( __( 'PclZip archive add error: %s', 'backwpup' ), $this->pclzip->errorInfo( TRUE ) ), E_USER_ERROR );
175
- }
176
- }
177
- unset( $this->pclzip );
178
- }
179
-
180
- //close ZipArchive Class
181
- if ( is_object( $this->ziparchive ) ) {
182
- $this->ziparchive_status();
183
- if ( ! $this->ziparchive->close() ) {
184
- sleep( 1 );
185
- if ( ! $this->ziparchive->close() ) {
186
- sleep( 1 );
187
- if ( ! $this->ziparchive->close() ) {
188
- $this->ziparchive_status();
189
- trigger_error( __( 'ZIP archive cannot be closed correctly.', 'backwpup' ), E_USER_ERROR );
190
- }
191
- }
192
- }
193
- $this->ziparchive = NULL;
194
- }
195
-
196
- //close file if open
197
- if ( is_resource( $this->filehandel ) ) {
198
- fclose( $this->filehandel );
199
- }
200
- }
201
-
202
- /*
203
- * Closing the archive
204
- */
205
- public function close() {
206
-
207
- //write tar file end
208
- if ( in_array( $this->get_method(), array( 'Tar', 'TarGz', 'TarBz2' ) ) ) {
209
- $footer = pack( "a1024", "" );
210
- if ( $this->method == 'TarGz' ) {
211
- $footer = gzencode( $footer );
212
- }
213
- if ( $this->method == 'TarBz2' ) {
214
- $footer = bzcompress( $footer );
215
- }
216
- fwrite( $this->filehandel, $footer );
217
- }
218
- }
219
-
220
- /**
221
- * Get method that the archive uses
222
- *
223
- * @return string of compression method
224
- */
225
- public function get_method() {
226
-
227
- return $this->method;
228
- }
229
-
230
-
231
- /**
232
- * Adds a file to Archive
233
- *
234
- * @param $file_name string
235
- * @param $name_in_archive string
236
- * @return bool Add worked or not
237
- */
238
- public function add_file( $file_name, $name_in_archive = '' ) {
239
-
240
- $file_name = trim( $file_name );
241
-
242
- //check param
243
- if ( empty( $file_name ) ) {
244
- trigger_error( __( 'File name cannot be empty', 'backwpup' ), E_USER_WARNING );
245
- return FALSE;
246
- }
247
-
248
- if ( version_compare( PHP_VERSION, '5.3', '>=' ) ) {
249
- clearstatcache( TRUE, $file_name );
250
- }
251
-
252
- if ( ! is_readable( $file_name ) ) {
253
- trigger_error( sprintf( _x( 'File %s does not exist or is not readable', 'File to add to archive', 'backwpup' ), $file_name ), E_USER_WARNING );
254
- return TRUE;
255
- }
256
-
257
- if ( empty( $name_in_archive ) )
258
- $name_in_archive = $file_name;
259
-
260
- //remove reserved chars
261
- $name_in_archive = str_replace( array("?", "[", "]", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}", chr(0)) , '', $name_in_archive );
262
-
263
- switch ( $this->get_method() ) {
264
- case 'gz':
265
- if ( $this->file_count > 0 ) {
266
- trigger_error( __( 'This archive method can only add one file', 'backwpup' ), E_USER_WARNING );
267
- return FALSE;
268
- }
269
- //add file to archive
270
- if ( ! ( $fd = fopen( $file_name, 'rb' ) ) ) {
271
- trigger_error( sprintf( __( 'Cannot open source file %s to archive', 'backwpup' ), $file_name ), E_USER_WARNING );
272
- return FALSE;
273
- }
274
- while ( ! feof( $fd ) ) {
275
- fwrite( $this->filehandel, fread( $fd, 8192 ) );
276
- }
277
- fclose( $fd );
278
- $this->file_count++;
279
- break;
280
- case 'bz':
281
- if ( $this->file_count > 0 ) {
282
- trigger_error( __( 'This archive method can only add one file', 'backwpup' ), E_USER_WARNING );
283
- return FALSE;
284
- }
285
- //add file to archive
286
- if ( ! ( $fd = fopen( $file_name, 'rb' ) ) ) {
287
- trigger_error( sprintf( __( 'Cannot open source file %s to archive', 'backwpup' ), $file_name ), E_USER_WARNING );
288
- return FALSE;
289
- }
290
- while ( ! feof( $fd ) ) {
291
- fwrite( $this->filehandel, bzcompress( fread( $fd, 8192 ) ) );
292
- }
293
- fclose( $fd );
294
- $this->file_count++;
295
- break;
296
- case 'Tar':
297
- case 'TarGz':
298
- case 'TarBz2':
299
- return $this->tar_file( $file_name, $name_in_archive );
300
- break;
301
- case 'ZipArchive':
302
- //close and reopen, all added files are open on fs
303
- if ( $this->file_count > 20 ) { //35 works with PHP 5.2.4 on win
304
- $this->ziparchive_status();
305
- if ( ! $this->ziparchive->close() ) {
306
- sleep( 1 );
307
- if ( ! $this->ziparchive->close() ) {
308
- sleep( 1 );
309
- if ( ! $this->ziparchive->close() ) {
310
- $this->ziparchive_status();
311
- trigger_error(__( 'ZipArchive can not closed correctly', 'backwpup' ), E_USER_ERROR );
312
- }
313
- }
314
- }
315
- $this->ziparchive = NULL;
316
- if ( ! $this->check_archive_filesize() ) {
317
- return FALSE;
318
- }
319
- $this->ziparchive = new ZipArchive();
320
- $ziparchive_open = $this->ziparchive->open( $this->file, ZipArchive::CREATE );
321
- if ( $ziparchive_open !== TRUE ) {
322
- $this->ziparchive_status();
323
- return FALSE;
324
- }
325
- $this->file_count = 0;
326
- }
327
- $file_size = abs( (int) filesize( $file_name ) );
328
- if ( $file_size < ( 1024 * 1024 * 2 ) ) {
329
- if ( ! $this->ziparchive->addFromString( $name_in_archive, file_get_contents( $file_name ) ) ) {
330
- trigger_error( sprintf( __( 'Cannot add "%s" to zip archive!', 'backwpup' ), $name_in_archive ), E_USER_ERROR );
331
- return FALSE;
332
- } else {
333
- $file_factor = round( $file_size / ( 1024 * 1024 ), 4 ) * 2;
334
- $this->file_count = $this->file_count + $file_factor;
335
- }
336
- } else {
337
- if ( ! $this->ziparchive->addFile( $file_name, $name_in_archive ) ) {
338
- trigger_error( sprintf( __( 'Cannot add "%s" to zip archive!', 'backwpup' ), $name_in_archive ), E_USER_ERROR );
339
- return FALSE;
340
- } else {
341
- $this->file_count++;
342
- }
343
- }
344
- break;
345
- case 'PclZip':
346
- $this->pclzip_file_list[] = array( PCLZIP_ATT_FILE_NAME => $file_name, PCLZIP_ATT_FILE_NEW_FULL_NAME => $name_in_archive );
347
- if ( count( $this->pclzip_file_list ) >= 100 ) {
348
- if ( 0 == $this->pclzip->add( $this->pclzip_file_list ) ) {
349
- trigger_error( sprintf( __( 'PclZip archive add error: %s', 'backwpup' ), $this->pclzip->errorInfo( TRUE ) ), E_USER_ERROR );
350
- return FALSE;
351
- }
352
- $this->pclzip_file_list = array();
353
- }
354
- break;
355
- }
356
-
357
- return TRUE;
358
- }
359
-
360
- /**
361
- * Add a empty Folder to archive
362
- *
363
- * @param $folder_name string Name of folder to add to archive
364
- * @param string $name_in_archive
365
- * @throws BackWPup_Create_Archive_Exception
366
- * @return bool
367
- */
368
- public function add_empty_folder( $folder_name, $name_in_archive = '' ) {
369
-
370
- $folder_name = trim( $folder_name );
371
-
372
- //check param
373
- if ( empty( $folder_name ) ) {
374
- trigger_error( __( 'Folder name cannot be empty', 'backwpup' ), E_USER_WARNING );
375
- return FALSE;
376
- }
377
-
378
- if ( ! is_dir( $folder_name ) || ! is_readable( $folder_name ) ) {
379
- trigger_error( sprintf( _x( 'Folder %s does not exist or is not readable', 'Folder path to add to archive', 'backwpup' ), $folder_name ), E_USER_WARNING );
380
- return TRUE;
381
- }
382
-
383
- if ( empty( $name_in_archive ) ) {
384
- return FALSE;
385
- }
386
-
387
- //remove reserved chars
388
- $name_in_archive = str_replace( array("?", "[", "]", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}", chr(0)) , '', $name_in_archive );
389
-
390
- switch ( $this->get_method() ) {
391
- case 'gz':
392
- trigger_error( __( 'This archive method can only add one file', 'backwpup' ), E_USER_ERROR );
393
- return FALSE;
394
- break;
395
- case 'bz':
396
- trigger_error( __( 'This archive method can only add one file', 'backwpup' ), E_USER_ERROR );
397
- return FALSE;
398
- break;
399
- case 'Tar':
400
- case 'TarGz':
401
- case 'TarBz2':
402
- if ( ! $this->tar_empty_folder( $folder_name, $name_in_archive ) );
403
- return FALSE;
404
- break;
405
- case 'ZipArchive':
406
- if ( ! $this->ziparchive->addEmptyDir( $name_in_archive ) ) {
407
- trigger_error( sprintf( __( 'Cannot add "%s" to zip archive!', 'backwpup' ), $name_in_archive ), E_USER_WARNING );
408
- return FALSE;
409
- }
410
- break;
411
- case 'PclZip':
412
- return TRUE;
413
- break;
414
- }
415
-
416
- return TRUE;
417
- }
418
-
419
- /**
420
- * Output status of ZipArchive
421
- *
422
- * @return bool
423
- */
424
- private function ziparchive_status() {
425
-
426
- if ( $this->ziparchive->status == 0 )
427
- return TRUE;
428
-
429
- trigger_error( sprintf( _x( 'ZipArchive returns status: %s','Text of ZipArchive status Message', 'backwpup' ), $this->ziparchive->getStatusString() ), E_USER_ERROR );
430
- return FALSE;
431
- }
432
-
433
- /**
434
- * Tar a file to archive
435
- */
436
- private function tar_file( $file_name, $name_in_archive ) {
437
-
438
- if ( ! $this->check_archive_filesize( $file_name ) ) {
439
- return FALSE;
440
- }
441
-
442
- $chunk_size = 1024 * 1024 * 4;
443
-
444
- //split filename larger than 100 chars
445
- if ( strlen( $name_in_archive ) <= 100 ) {
446
- $filename = $name_in_archive;
447
- $filename_prefix = "";
448
- }
449
- else {
450
- $filename_offset = strlen( $name_in_archive ) - 100;
451
- $split_pos = strpos( $name_in_archive, '/', $filename_offset );
452
- if ( $split_pos === FALSE ) {
453
- $split_pos = strrpos( $name_in_archive, '/' );
454
- }
455
- $filename = substr( $name_in_archive, $split_pos + 1 );
456
- $filename_prefix = substr( $name_in_archive, 0, $split_pos );
457
- if ( strlen( $filename ) > 100 ) {
458
- $filename = substr( $filename, -100 );
459
- trigger_error( sprintf( __( 'File name "%1$s" is too long to be saved correctly in %2$s archive!', 'backwpup' ), $name_in_archive, $this->get_method() ), E_USER_WARNING );
460
- }
461
- if ( strlen( $filename_prefix ) > 155 ) {
462
- trigger_error( sprintf( __( 'File path "%1$s" is too long to be saved correctly in %2$s archive!', 'backwpup' ), $name_in_archive, $this->get_method() ), E_USER_WARNING );
463
- }
464
- }
465
- //get file stat
466
- $file_stat = stat( $file_name );
467
- if ( ! $file_stat ) {
468
- return TRUE;
469
- }
470
- $file_stat[ 'size' ] = abs( (int) $file_stat[ 'size' ] );
471
- //open file
472
- if ( $file_stat[ 'size' ] > 0 ) {
473
- if ( ! ( $fd = fopen( $file_name, 'rb' ) ) ) {
474
- trigger_error( sprintf( __( 'Cannot open source file %s for archiving', 'backwpup' ), $file_name ), E_USER_WARNING );
475
- return TRUE;
476
- }
477
- }
478
- //Set file user/group name if linux
479
- $fileowner = __( "Unknown", "backwpup" );
480
- $filegroup = __( "Unknown", "backwpup" );
481
- if ( function_exists( 'posix_getpwuid' ) ) {
482
- $info = posix_getpwuid( $file_stat[ 'uid' ] );
483
- $fileowner = $info[ 'name' ];
484
- $info = posix_getgrgid( $file_stat[ 'gid' ] );
485
- $filegroup = $info[ 'name' ];
486
- }
487
- // Generate the TAR header for this file
488
- $chunk = pack( "a100a8a8a8a12a12a8a1a100a6a2a32a32a8a8a155a12",
489
- $filename, //name of file 100
490
- sprintf( "%07o", $file_stat[ 'mode' ] ), //file mode 8
491
- sprintf( "%07o", $file_stat[ 'uid' ] ), //owner user ID 8
492
- sprintf( "%07o", $file_stat[ 'gid' ] ), //owner group ID 8
493
- sprintf( "%011o", $file_stat[ 'size' ] ), //length of file in bytes 12
494
- sprintf( "%011o", $file_stat[ 'mtime' ] ), //modify time of file 12
495
- " ", //checksum for header 8
496
- 0, //type of file 0 or null = File, 5=Dir
497
- "", //name of linked file 100
498
- "ustar", //USTAR indicator 6
499
- "00", //USTAR version 2
500
- $fileowner, //owner user name 32
501
- $filegroup, //owner group name 32
502
- "", //device major number 8
503
- "", //device minor number 8
504
- $filename_prefix, //prefix for file name 155
505
- "" ); //fill block 12
506
-
507
- // Computes the unsigned Checksum of a file's header
508
- $checksum = 0;
509
- for ( $i = 0; $i < 512; $i ++ ) {
510
- $checksum += ord( substr( $chunk, $i, 1 ) );
511
- }
512
-
513
- $checksum = pack( "a8", sprintf( "%07o", $checksum ) );
514
- $chunk = substr_replace( $chunk, $checksum, 148, 8 );
515
-
516
- if ( isset( $fd ) && is_resource( $fd ) ) {
517
- // read/write files in 512 bite Blocks
518
- while ( ( $content = fread( $fd, 512 ) ) != '' ) {
519
- $chunk .= pack( "a512", $content );
520
- if ( strlen( $chunk ) >= $chunk_size ) {
521
- if ( $this->method == 'TarGz' ) {
522
- $chunk = gzencode( $chunk );
523
- }
524
- if ( $this->method == 'TarBz2' ) {
525
- $chunk = bzcompress( $chunk );
526
- }
527
- fwrite( $this->filehandel, $chunk );
528
- $chunk = '';
529
- }
530
- }
531
- fclose( $fd );
532
- }
533
-
534
- if ( ! empty( $chunk ) ) {
535
- if ( $this->method == 'TarGz' ) {
536
- $chunk = gzencode( $chunk );
537
- }
538
- if ( $this->method == 'TarBz2' ) {
539
- $chunk = bzcompress( $chunk );
540
- }
541
- fwrite( $this->filehandel, $chunk );
542
- }
543
-
544
- return TRUE;
545
- }
546
-
547
-
548
- /**
549
- * Tar a empty Folder to archive
550
- */
551
- private function tar_empty_folder( $folder_name, $name_in_archive ) {
552
-
553
- $name_in_archive = trailingslashit( $name_in_archive );
554
-
555
- //split filename larger than 100 chars
556
- if ( strlen( $name_in_archive ) <= 100 ) {
557
- $tar_filename = $name_in_archive;
558
- $tar_filename_prefix = "";
559
- }
560
- else {
561
- $filename_offset = strlen( $name_in_archive ) - 100;
562
- $split_pos = strpos( $name_in_archive, '/', $filename_offset );
563
- if ( $split_pos === FALSE ) {
564
- $split_pos = strrpos( untrailingslashit( $name_in_archive ), '/' );
565
- }
566
- $tar_filename = substr( $name_in_archive, $split_pos + 1 );
567
- $tar_filename_prefix = substr( $name_in_archive, 0, $split_pos );
568
- if ( strlen( $tar_filename ) > 100 ) {
569
- $tar_filename = substr( $tar_filename, - 100 );
570
- trigger_error( sprintf( __( 'Folder name "%1$s" is too long to be saved correctly in %2$s archive!', 'backwpup' ), $name_in_archive, $this->get_method() ), E_USER_WARNING );
571
- }
572
- if ( strlen( $tar_filename_prefix ) > 155 ) {
573
- trigger_error( sprintf( __( 'Folder path "%1$s" is too long to be saved correctly in %2$s archive!', 'backwpup' ), $name_in_archive, $this->get_method() ), E_USER_WARNING );
574
- }
575
- }
576
- //get file stat
577
- $file_stat = @stat( $folder_name );
578
- //Set file user/group name if linux
579
- $fileowner = __( "Unknown", "backwpup" );
580
- $filegroup = __( "Unknown", "backwpup" );
581
- if ( function_exists( 'posix_getpwuid' ) ) {
582
- $info = posix_getpwuid( $file_stat[ 'uid' ] );
583
- $fileowner = $info[ 'name' ];
584
- $info = posix_getgrgid( $file_stat[ 'gid' ] );
585
- $filegroup = $info[ 'name' ];
586
- }
587
- // Generate the TAR header for this file
588
- $header = pack( "a100a8a8a8a12a12a8a1a100a6a2a32a32a8a8a155a12",
589
- $tar_filename, //name of file 100
590
- sprintf( "%07o", $file_stat[ 'mode' ] ), //file mode 8
591
- sprintf( "%07o", $file_stat[ 'uid' ] ), //owner user ID 8
592
- sprintf( "%07o", $file_stat[ 'gid' ] ), //owner group ID 8
593
- sprintf( "%011o", 0 ), //length of file in bytes 12
594
- sprintf( "%011o", $file_stat[ 'mtime' ] ), //modify time of file 12
595
- " ", //checksum for header 8
596
- 5, //type of file 0 or null = File, 5=Dir
597
- "", //name of linked file 100
598
- "ustar", //USTAR indicator 6
599
- "00", //USTAR version 2
600
- $fileowner, //owner user name 32
601
- $filegroup, //owner group name 32
602
- "", //device major number 8
603
- "", //device minor number 8
604
- $tar_filename_prefix, //prefix for file name 155
605
- "" ); //fill block 12
606
-
607
- // Computes the unsigned Checksum of a file's header
608
- $checksum = 0;
609
- for ( $i = 0; $i < 512; $i ++ ) {
610
- $checksum += ord( substr( $header, $i, 1 ) );
611
- }
612
-
613
- $checksum = pack( "a8", sprintf( "%07o", $checksum ) );
614
- $header = substr_replace( $header, $checksum, 148, 8 );
615
- //write header
616
- if ( $this->method == 'TarGz' ) {
617
- $header = gzencode( $header );
618
- }
619
- if ( $this->method == 'TarBz2' ) {
620
- $header = bzcompress( $header );
621
- }
622
- fwrite( $this->filehandel, $header );
623
-
624
- return TRUE;
625
- }
626
-
627
- /**
628
- * @param string $file_to_add
629
- *
630
- * @return bool
631
- */
632
- private function check_archive_filesize( $file_to_add = '' ) {
633
-
634
- $two_gb_in_bytes = 2147483647;
635
-
636
- if ( ! empty( $file_to_add ) ) {
637
- $file_to_add_size = abs( (int) filesize( $file_to_add ) );
638
- } else {
639
- $file_to_add_size = 0;
640
- }
641
-
642
- if ( is_resource( $this->filehandel ) ) {
643
- $stats = fstat( $this->filehandel );
644
- $archive_size = $stats[ 'size' ];
645
- } else {
646
- $archive_size = filesize( $this->file );
647
- }
648
-
649
- $archive_size = $archive_size + $file_to_add_size;
650
- if ( $archive_size > $two_gb_in_bytes ) {
651
- trigger_error( sprintf( __( 'If %s will be added to your backup archive, the archive will be too large for many file systems (over 2GB). You might want to consider splitting the backup job in multiple jobs with less files each.', 'backwpup' ), $file_to_add ), E_USER_ERROR );
652
-
653
- return FALSE;
654
- }
655
-
656
- return TRUE;
657
- }
658
-
659
- }
660
-
661
- /**
662
- * Exception Handler
663
- */
664
- class BackWPup_Create_Archive_Exception extends Exception { }
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Class for creating File Archives
4
+ */
5
+ class BackWPup_Create_Archive {
6
+
7
+ /**
8
+ * Achieve file with full path
9
+ *
10
+ * @var string
11
+ */
12
+ private $file = '';
13
+
14
+ /**
15
+ * Compression method
16
+ *
17
+ * @var string Method off compression Methods are ZipArchive, PclZip, Tar, TarGz, TarBz2, gz, bz2
18
+ */
19
+ private $method = '';
20
+
21
+ /**
22
+ * Open handel for files.
23
+ */
24
+ private $filehandel = '';
25
+
26
+ /**
27
+ * class handel for ZipArchive.
28
+ *
29
+ * @var ZipArchive
30
+ */
31
+ private $ziparchive = NULL;
32
+
33
+ /**
34
+ * class handel for PclZip.
35
+ *
36
+ * @var PclZip
37
+ */
38
+ private $pclzip = NULL;
39
+
40
+ /**
41
+ * class handel for PclZip.
42
+ *
43
+ * @var array()
44
+ */
45
+ private $pclzip_file_list = array();
46
+
47
+ /**
48
+ * Saved encoding will restored on __destruct
49
+ *
50
+ * @var string
51
+ */
52
+ private $previous_encoding = '';
53
+
54
+ /**
55
+ * File cont off added files to handel somethings that depends on it
56
+ *
57
+ * @var int number of files added
58
+ */
59
+ private $file_count = 0;
60
+
61
+ /**
62
+ * Set archive Parameter
63
+ *
64
+ * @param $file string File with full path of the archive
65
+ * @throws BackWPup_Create_Archive_Exception
66
+ */
67
+ public function __construct( $file ) {
68
+
69
+ //check param
70
+ if ( empty( $file ) ) {
71
+ throw new BackWPup_Create_Archive_Exception( __( 'The file name of an archive cannot be empty.', 'backwpup' ) );
72
+ }
73
+
74
+ //set file
75
+ $this->file = trim( $file );
76
+
77
+ //check folder can used
78
+ if ( ! is_dir( dirname( $this->file ) ) ||! is_writable( dirname( $this->file ) ) ) {
79
+ throw new BackWPup_Create_Archive_Exception( sprintf( _x( 'Folder %s for archive not found','%s = Folder name', 'backwpup' ), dirname( $this->file ) ) );
80
+ }
81
+
82
+ //set and check method and get open handle
83
+ if ( strtolower( substr( $this->file, -7 ) ) == '.tar.gz' ) {
84
+ if ( ! function_exists( 'gzencode' ) ) {
85
+ throw new BackWPup_Create_Archive_Exception( __( 'Functions for gz compression not available', 'backwpup' ) );
86
+ }
87
+ $this->method = 'TarGz';
88
+ $this->filehandel = fopen( $this->file, 'ab' );
89
+ }
90
+ elseif ( strtolower( substr( $this->file, -8 ) ) == '.tar.bz2' ) {
91
+ if ( ! function_exists( 'bzcompress' ) ) {
92
+ throw new BackWPup_Create_Archive_Exception( __( 'Functions for bz2 compression not available', 'backwpup' ) );
93
+ }
94
+ $this->method = 'TarBz2';
95
+ $this->filehandel = fopen( $this->file, 'ab' );
96
+ }
97
+ elseif ( strtolower( substr( $this->file, -4 ) ) == '.tar' ) {
98
+ $this->method = 'Tar';
99
+ $this->filehandel = fopen( $this->file, 'ab');
100
+ }
101
+ elseif ( strtolower( substr( $this->file, -4 ) ) == '.zip' ) {
102
+ $this->method = get_site_option( 'backwpup_cfg_jobziparchivemethod');
103
+ //check and set method
104
+ if ( empty( $this->method ) || ( $this->method != 'ZipArchive' && $this->method != 'PclZip' ) ) {
105
+ $this->method = 'ZipArchive';
106
+ }
107
+ if ( ! class_exists( 'ZipArchive' ) ) {
108
+ $this->method = 'PclZip';
109
+ }
110
+ //open classes
111
+ if ( $this->get_method() == 'ZipArchive' ) {
112
+ $this->ziparchive = new ZipArchive();
113
+ $ziparchive_open = $this->ziparchive->open( $this->file, ZipArchive::CREATE );
114
+ if ( $ziparchive_open !== TRUE ) {
115
+ $this->ziparchive_status();
116
+ throw new BackWPup_Create_Archive_Exception( sprintf( _x( 'Cannot create zip archive: %d','ZipArchive open() result', 'backwpup' ), $ziparchive_open ) );
117
+ }
118
+ }
119
+ if ( $this->get_method() == 'PclZip' && ! function_exists( 'gzencode' ) ) {
120
+ throw new BackWPup_Create_Archive_Exception( __( 'Functions for gz compression not available', 'backwpup' ) );
121
+ }
122
+ if( $this->get_method() == 'PclZip' ) {
123
+ $this->method = 'PclZip';
124
+ if ( ini_get( 'mbstring.func_overload' ) && function_exists( 'mb_internal_encoding' ) ) {
125
+ $this->previous_encoding = mb_internal_encoding();
126
+ mb_internal_encoding( 'ISO-8859-1' );
127
+ }
128
+ if ( ! defined('PCLZIP_TEMPORARY_DIR') ) {
129
+ define( 'PCLZIP_TEMPORARY_DIR', BackWPup::get_plugin_data( 'TEMP' ) );
130
+ }
131
+ require_once ABSPATH . 'wp-admin/includes/class-pclzip.php';
132
+ $this->pclzip = new PclZip( $this->file );
133
+ }
134
+ }
135
+ elseif ( strtolower( substr( $this->file, -3 ) ) == '.gz' ) {
136
+ if ( ! function_exists( 'gzencode' ) )
137
+ throw new BackWPup_Create_Archive_Exception( __( 'Functions for gz compression not available', 'backwpup' ) );
138
+ $this->method = 'gz';
139
+ $this->filehandel = fopen( 'compress.zlib://' . $this->file, 'wb');
140
+ }
141
+ elseif ( strtolower( substr( $this->file, -4 ) ) == '.bz2' ) {
142
+ if ( ! function_exists( 'bzcompress' ) ) {
143
+ throw new BackWPup_Create_Archive_Exception( __( 'Functions for bz2 compression not available', 'backwpup' ) );
144
+ }
145
+ $this->method = 'bz2';
146
+ $this->filehandel = fopen( 'compress.bzip2://' . $this->file, 'w');
147
+ }
148
+ else {
149
+ throw new BackWPup_Create_Archive_Exception( sprintf( _x( 'Method to archive file %s not detected','%s = file name', 'backwpup' ), basename( $this->file ) ) );
150
+ }
151
+
152
+ //check file handle
153
+ if ( ! empty( $this->filehandel ) && ! is_resource( $this->filehandel ) ) {
154
+ throw new BackWPup_Create_Archive_Exception( __( 'Cannot open archive file', 'backwpup' ) );
155
+ }
156
+
157
+ }
158
+
159
+
160
+ /**
161
+ * Closes open archive on shutdown.
162
+ */
163
+ public function __destruct() {
164
+
165
+ //set encoding back
166
+ if ( ! empty( $this->previous_encoding ) ) {
167
+ mb_internal_encoding( $this->previous_encoding );
168
+ }
169
+
170
+ //close PclZip Class
171
+ if ( is_object( $this->pclzip ) ) {
172
+ if ( count( $this->pclzip_file_list ) > 0 ) {
173
+ if ( 0 == $this->pclzip->add( $this->pclzip_file_list ) ) {
174
+ trigger_error( sprintf( __( 'PclZip archive add error: %s', 'backwpup' ), $this->pclzip->errorInfo( TRUE ) ), E_USER_ERROR );
175
+ }
176
+ }
177
+ unset( $this->pclzip );
178
+ }
179
+
180
+ //close ZipArchive Class
181
+ if ( is_object( $this->ziparchive ) ) {
182
+ if ( ! $this->ziparchive->close() ) {
183
+ sleep( 1 );
184
+ if ( ! $this->ziparchive->close() ) {
185
+ sleep( 1 );
186
+ if ( ! $this->ziparchive->close() ) {
187
+ trigger_error( __( 'ZIP archive cannot be closed correctly.', 'backwpup' ), E_USER_ERROR );
188
+ }
189
+ }
190
+ }
191
+ $this->ziparchive = NULL;
192
+ }
193
+
194
+ //close file if open
195
+ if ( is_resource( $this->filehandel ) ) {
196
+ fclose( $this->filehandel );
197
+ }
198
+ }
199
+
200
+ /*
201
+ * Closing the archive
202
+ */
203
+ public function close() {
204
+
205
+ //write tar file end
206
+ if ( in_array( $this->get_method(), array( 'Tar', 'TarGz', 'TarBz2' ) ) ) {
207
+ $footer = pack( "a1024", "" );
208
+ if ( $this->method == 'TarGz' ) {
209
+ $footer = gzencode( $footer );
210
+ }
211
+ if ( $this->method == 'TarBz2' ) {
212
+ $footer = bzcompress( $footer );
213
+ }
214
+ fwrite( $this->filehandel, $footer );
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Get method that the archive uses
220
+ *
221
+ * @return string of compression method
222
+ */
223
+ public function get_method() {
224
+
225
+ return $this->method;
226
+ }
227
+
228
+
229
+ /**
230
+ * Adds a file to Archive
231
+ *
232
+ * @param $file_name string
233
+ * @param $name_in_archive string
234
+ * @return bool Add worked or not
235
+ */
236
+ public function add_file( $file_name, $name_in_archive = '' ) {
237
+
238
+ $file_name = trim( $file_name );
239
+
240
+ //check param
241
+ if ( empty( $file_name ) ) {
242
+ trigger_error( __( 'File name cannot be empty', 'backwpup' ), E_USER_WARNING );
243
+ return FALSE;
244
+ }
245
+
246
+ if ( version_compare( PHP_VERSION, '5.3', '>=' ) ) {
247
+ clearstatcache( TRUE, $file_name );
248
+ }
249
+
250
+ if ( ! is_readable( $file_name ) ) {
251
+ trigger_error( sprintf( _x( 'File %s does not exist or is not readable', 'File to add to archive', 'backwpup' ), $file_name ), E_USER_WARNING );
252
+ return TRUE;
253
+ }
254
+
255
+ if ( empty( $name_in_archive ) )
256
+ $name_in_archive = $file_name;
257
+
258
+ //remove reserved chars
259
+ $name_in_archive = str_replace( array("?", "[", "]", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}", chr(0)) , '', $name_in_archive );
260
+
261
+ switch ( $this->get_method() ) {
262
+ case 'gz':
263
+ if ( $this->file_count > 0 ) {
264
+ trigger_error( __( 'This archive method can only add one file', 'backwpup' ), E_USER_WARNING );
265
+ return FALSE;
266
+ }
267
+ //add file to archive
268
+ if ( ! ( $fd = fopen( $file_name, 'rb' ) ) ) {
269
+ trigger_error( sprintf( __( 'Cannot open source file %s to archive', 'backwpup' ), $file_name ), E_USER_WARNING );
270
+ return FALSE;
271
+ }
272
+ while ( ! feof( $fd ) ) {
273
+ fwrite( $this->filehandel, fread( $fd, 8192 ) );
274
+ }
275
+ fclose( $fd );
276
+ $this->file_count++;
277
+ break;
278
+ case 'bz':
279
+ if ( $this->file_count > 0 ) {
280
+ trigger_error( __( 'This archive method can only add one file', 'backwpup' ), E_USER_WARNING );
281
+ return FALSE;
282
+ }
283
+ //add file to archive
284
+ if ( ! ( $fd = fopen( $file_name, 'rb' ) ) ) {
285
+ trigger_error( sprintf( __( 'Cannot open source file %s to archive', 'backwpup' ), $file_name ), E_USER_WARNING );
286
+ return FALSE;
287
+ }
288
+ while ( ! feof( $fd ) ) {
289
+ fwrite( $this->filehandel, bzcompress( fread( $fd, 8192 ) ) );
290
+ }
291
+ fclose( $fd );
292
+ $this->file_count++;
293
+ break;
294
+ case 'Tar':
295
+ case 'TarGz':
296
+ case 'TarBz2':
297
+ return $this->tar_file( $file_name, $name_in_archive );
298
+ break;
299
+ case 'ZipArchive':
300
+ $file_size = abs( (int) filesize( $file_name ) );
301
+ //check if entry already in archive and delete it if it not in full size
302
+ if ( $zip_file_stat = $this->ziparchive->statName( $name_in_archive ) ) {
303
+ if ( $zip_file_stat[ 'size' ] != $file_size ) {
304
+ $this->ziparchive->deleteName( $name_in_archive );
305
+ //reopen on deletion
306
+ $this->file_count = 21;
307
+ } else {
308
+ //file already complete in archive
309
+ return TRUE;
310
+ }
311
+ }
312
+ //close and reopen, all added files are open on fs
313
+ if ( $this->file_count > 20 ) { //35 works with PHP 5.2.4 on win
314
+ if ( ! $this->ziparchive->close() ) {
315
+ sleep( 1 );
316
+ if ( ! $this->ziparchive->close() ) {
317
+ sleep( 1 );
318
+ if ( ! $this->ziparchive->close() ) {
319
+ trigger_error(__( 'ZipArchive can not closed correctly', 'backwpup' ), E_USER_ERROR );
320
+ }
321
+ }
322
+ }
323
+ $this->ziparchive = NULL;
324
+ if ( ! $this->check_archive_filesize() ) {
325
+ return FALSE;
326
+ }
327
+ $this->ziparchive = new ZipArchive();
328
+ $ziparchive_open = $this->ziparchive->open( $this->file, ZipArchive::CREATE );
329
+ if ( $ziparchive_open !== TRUE ) {
330
+ $this->ziparchive_status();
331
+ return FALSE;
332
+ }
333
+ $this->file_count = 0;
334
+ }
335
+ if ( $file_size < ( 1024 * 1024 * 2 ) ) {
336
+ if ( ! $this->ziparchive->addFromString( $name_in_archive, file_get_contents( $file_name ) ) ) {
337
+ $this->ziparchive_status();
338
+ trigger_error( sprintf( __( 'Cannot add "%s" to zip archive!', 'backwpup' ), $name_in_archive ), E_USER_ERROR );
339
+ return FALSE;
340
+ } else {
341
+ $file_factor = round( $file_size / ( 1024 * 1024 ), 4 ) * 2;
342
+ $this->file_count = $this->file_count + $file_factor;
343
+ }
344
+ } else {
345
+ if ( ! $this->ziparchive->addFile( $file_name, $name_in_archive ) ) {
346
+ $this->ziparchive_status();
347
+ trigger_error( sprintf( __( 'Cannot add "%s" to zip archive!', 'backwpup' ), $name_in_archive ), E_USER_ERROR );
348
+ return FALSE;
349
+ } else {
350
+ $this->file_count++;
351
+ }
352
+ }
353
+ break;
354
+ case 'PclZip':
355
+ $this->pclzip_file_list[] = array( PCLZIP_ATT_FILE_NAME => $file_name, PCLZIP_ATT_FILE_NEW_FULL_NAME => $name_in_archive );
356
+ if ( count( $this->pclzip_file_list ) >= 100 ) {
357
+ if ( 0 == $this->pclzip->add( $this->pclzip_file_list ) ) {
358
+ trigger_error( sprintf( __( 'PclZip archive add error: %s', 'backwpup' ), $this->pclzip->errorInfo( TRUE ) ), E_USER_ERROR );
359
+ return FALSE;
360
+ }
361
+ $this->pclzip_file_list = array();
362
+ }
363
+ break;
364
+ }
365
+
366
+ return TRUE;
367
+ }
368
+
369
+ /**
370
+ * Add a empty Folder to archive
371
+ *
372
+ * @param $folder_name string Name of folder to add to archive
373
+ * @param string $name_in_archive
374
+ * @throws BackWPup_Create_Archive_Exception
375
+ * @return bool
376
+ */
377
+ public function add_empty_folder( $folder_name, $name_in_archive = '' ) {
378
+
379
+ $folder_name = trim( $folder_name );
380
+
381
+ //check param
382
+ if ( empty( $folder_name ) ) {
383
+ trigger_error( __( 'Folder name cannot be empty', 'backwpup' ), E_USER_WARNING );
384
+ return FALSE;
385
+ }
386
+
387
+ if ( ! is_dir( $folder_name ) || ! is_readable( $folder_name ) ) {
388
+ trigger_error( sprintf( _x( 'Folder %s does not exist or is not readable', 'Folder path to add to archive', 'backwpup' ), $folder_name ), E_USER_WARNING );
389
+ return TRUE;
390
+ }
391
+
392
+ if ( empty( $name_in_archive ) ) {
393
+ return FALSE;
394
+ }
395
+
396
+ //remove reserved chars
397
+ $name_in_archive = str_replace( array("?", "[", "]", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}", chr(0)) , '', $name_in_archive );
398
+
399
+ switch ( $this->get_method() ) {
400
+ case 'gz':
401
+ trigger_error( __( 'This archive method can only add one file', 'backwpup' ), E_USER_ERROR );
402
+ return FALSE;
403
+ break;
404
+ case 'bz':
405
+ trigger_error( __( 'This archive method can only add one file', 'backwpup' ), E_USER_ERROR );
406
+ return FALSE;
407
+ break;
408
+ case 'Tar':
409
+ case 'TarGz':
410
+ case 'TarBz2':
411
+ if ( ! $this->tar_empty_folder( $folder_name, $name_in_archive ) );
412
+ return FALSE;
413
+ break;
414
+ case 'ZipArchive':
415
+ if ( ! $this->ziparchive->addEmptyDir( $name_in_archive ) ) {
416
+ trigger_error( sprintf( __( 'Cannot add "%s" to zip archive!', 'backwpup' ), $name_in_archive ), E_USER_WARNING );
417
+ return FALSE;
418
+ }
419
+ break;
420
+ case 'PclZip':
421
+ return TRUE;
422
+ break;
423
+ }
424
+
425
+ return TRUE;
426
+ }
427
+
428
+ /**
429
+ * Output status of ZipArchive
430
+ *
431
+ * @return bool
432
+ */
433
+ private function ziparchive_status() {
434
+
435
+ if ( $this->ziparchive->status == 0 )
436
+ return TRUE;
437
+
438
+ trigger_error( sprintf( _x( 'ZipArchive returns status: %s','Text of ZipArchive status Message', 'backwpup' ), $this->ziparchive->getStatusString() ), E_USER_ERROR );
439
+ return FALSE;
440
+ }
441
+
442
+ /**
443
+ * Tar a file to archive
444
+ */
445
+ private function tar_file( $file_name, $name_in_archive ) {
446
+
447
+ if ( ! $this->check_archive_filesize( $file_name ) ) {
448
+ return FALSE;
449
+ }
450
+
451
+ $chunk_size = 1024 * 1024 * 4;
452
+
453
+ //split filename larger than 100 chars
454
+ if ( strlen( $name_in_archive ) <= 100 ) {
455
+ $filename = $name_in_archive;
456
+ $filename_prefix = "";
457
+ }
458
+ else {
459
+ $filename_offset = strlen( $name_in_archive ) - 100;
460
+ $split_pos = strpos( $name_in_archive, '/', $filename_offset );
461
+ if ( $split_pos === FALSE ) {
462
+ $split_pos = strrpos( $name_in_archive, '/' );
463
+ }
464
+ $filename = substr( $name_in_archive, $split_pos + 1 );
465
+ $filename_prefix = substr( $name_in_archive, 0, $split_pos );
466
+ if ( strlen( $filename ) > 100 ) {
467
+ $filename = substr( $filename, -100 );
468
+ trigger_error( sprintf( __( 'File name "%1$s" is too long to be saved correctly in %2$s archive!', 'backwpup' ), $name_in_archive, $this->get_method() ), E_USER_WARNING );
469
+ }
470
+ if ( strlen( $filename_prefix ) > 155 ) {
471
+ trigger_error( sprintf( __( 'File path "%1$s" is too long to be saved correctly in %2$s archive!', 'backwpup' ), $name_in_archive, $this->get_method() ), E_USER_WARNING );
472
+ }
473
+ }
474
+ //get file stat
475
+ $file_stat = stat( $file_name );
476
+ if ( ! $file_stat ) {
477
+ return TRUE;
478
+ }
479
+ $file_stat[ 'size' ] = abs( (int) $file_stat[ 'size' ] );
480
+ //open file
481
+ if ( $file_stat[ 'size' ] > 0 ) {
482
+ if ( ! ( $fd = fopen( $file_name, 'rb' ) ) ) {
483
+ trigger_error( sprintf( __( 'Cannot open source file %s for archiving', 'backwpup' ), $file_name ), E_USER_WARNING );
484
+ return TRUE;
485
+ }
486
+ }
487
+ //Set file user/group name if linux
488
+ $fileowner = __( "Unknown", "backwpup" );
489
+ $filegroup = __( "Unknown", "backwpup" );
490
+ if ( function_exists( 'posix_getpwuid' ) ) {
491
+ $info = posix_getpwuid( $file_stat[ 'uid' ] );
492
+ $fileowner = $info[ 'name' ];
493
+ $info = posix_getgrgid( $file_stat[ 'gid' ] );
494
+ $filegroup = $info[ 'name' ];
495
+ }
496
+ // Generate the TAR header for this file
497
+ $chunk = pack( "a100a8a8a8a12a12a8a1a100a6a2a32a32a8a8a155a12",
498
+ $filename, //name of file 100
499
+ sprintf( "%07o", $file_stat[ 'mode' ] ), //file mode 8
500
+ sprintf( "%07o", $file_stat[ 'uid' ] ), //owner user ID 8
501
+ sprintf( "%07o", $file_stat[ 'gid' ] ), //owner group ID 8
502
+ sprintf( "%011o", $file_stat[ 'size' ] ), //length of file in bytes 12
503
+ sprintf( "%011o", $file_stat[ 'mtime' ] ), //modify time of file 12
504
+ " ", //checksum for header 8
505
+ 0, //type of file 0 or null = File, 5=Dir
506
+ "", //name of linked file 100
507
+ "ustar", //USTAR indicator 6
508
+ "00", //USTAR version 2
509
+ $fileowner, //owner user name 32
510
+ $filegroup, //owner group name 32
511
+ "", //device major number 8
512
+ "", //device minor number 8
513
+ $filename_prefix, //prefix for file name 155
514
+ "" ); //fill block 12
515
+
516
+ // Computes the unsigned Checksum of a file's header
517
+ $checksum = 0;
518
+ for ( $i = 0; $i < 512; $i ++ ) {
519
+ $checksum += ord( substr( $chunk, $i, 1 ) );
520
+ }
521
+
522
+ $checksum = pack( "a8", sprintf( "%07o", $checksum ) );
523
+ $chunk = substr_replace( $chunk, $checksum, 148, 8 );
524
+
525
+ if ( isset( $fd ) && is_resource( $fd ) ) {
526
+ // read/write files in 512 bite Blocks
527
+ while ( ( $content = fread( $fd, 512 ) ) != '' ) {
528
+ $chunk .= pack( "a512", $content );
529
+ if ( strlen( $chunk ) >= $chunk_size ) {
530
+ if ( $this->method == 'TarGz' ) {
531
+ $chunk = gzencode( $chunk );
532
+ }
533
+ if ( $this->method == 'TarBz2' ) {
534
+ $chunk = bzcompress( $chunk );
535
+ }
536
+ fwrite( $this->filehandel, $chunk );
537
+ $chunk = '';
538
+ }
539
+ }
540
+ fclose( $fd );
541
+ }
542
+
543
+ if ( ! empty( $chunk ) ) {
544
+ if ( $this->method == 'TarGz' ) {
545
+ $chunk = gzencode( $chunk );
546
+ }
547
+ if ( $this->method == 'TarBz2' ) {
548
+ $chunk = bzcompress( $chunk );
549
+ }
550
+ fwrite( $this->filehandel, $chunk );
551
+ }
552
+
553
+ return TRUE;
554
+ }
555
+
556
+
557
+ /**
558
+ * Tar a empty Folder to archive
559
+ */
560
+ private function tar_empty_folder( $folder_name, $name_in_archive ) {
561
+
562
+ $name_in_archive = trailingslashit( $name_in_archive );
563
+
564
+ //split filename larger than 100 chars
565
+ if ( strlen( $name_in_archive ) <= 100 ) {
566
+ $tar_filename = $name_in_archive;
567
+ $tar_filename_prefix = "";
568
+ }
569
+ else {
570
+ $filename_offset = strlen( $name_in_archive ) - 100;
571
+ $split_pos = strpos( $name_in_archive, '/', $filename_offset );
572
+ if ( $split_pos === FALSE ) {
573
+ $split_pos = strrpos( untrailingslashit( $name_in_archive ), '/' );
574
+ }
575
+ $tar_filename = substr( $name_in_archive, $split_pos + 1 );
576
+ $tar_filename_prefix = substr( $name_in_archive, 0, $split_pos );
577
+ if ( strlen( $tar_filename ) > 100 ) {
578
+ $tar_filename = substr( $tar_filename, - 100 );
579
+ trigger_error( sprintf( __( 'Folder name "%1$s" is too long to be saved correctly in %2$s archive!', 'backwpup' ), $name_in_archive, $this->get_method() ), E_USER_WARNING );
580
+ }
581
+ if ( strlen( $tar_filename_prefix ) > 155 ) {
582
+ trigger_error( sprintf( __( 'Folder path "%1$s" is too long to be saved correctly in %2$s archive!', 'backwpup' ), $name_in_archive, $this->get_method() ), E_USER_WARNING );
583
+ }
584
+ }
585
+ //get file stat
586
+ $file_stat = @stat( $folder_name );
587
+ //Set file user/group name if linux
588
+ $fileowner = __( "Unknown", "backwpup" );
589
+ $filegroup = __( "Unknown", "backwpup" );
590
+ if ( function_exists( 'posix_getpwuid' ) ) {
591
+ $info = posix_getpwuid( $file_stat[ 'uid' ] );
592
+ $fileowner = $info[ 'name' ];
593
+ $info = posix_getgrgid( $file_stat[ 'gid' ] );
594
+ $filegroup = $info[ 'name' ];
595
+ }
596
+ // Generate the TAR header for this file
597
+ $header = pack( "a100a8a8a8a12a12a8a1a100a6a2a32a32a8a8a155a12",
598
+ $tar_filename, //name of file 100
599
+ sprintf( "%07o", $file_stat[ 'mode' ] ), //file mode 8
600
+ sprintf( "%07o", $file_stat[ 'uid' ] ), //owner user ID 8
601
+ sprintf( "%07o", $file_stat[ 'gid' ] ), //owner group ID 8
602
+ sprintf( "%011o", 0 ), //length of file in bytes 12
603
+ sprintf( "%011o", $file_stat[ 'mtime' ] ), //modify time of file 12
604
+ " ", //checksum for header 8
605
+ 5, //type of file 0 or null = File, 5=Dir
606
+ "", //name of linked file 100
607
+ "ustar", //USTAR indicator 6
608
+ "00", //USTAR version 2
609
+ $fileowner, //owner user name 32
610
+ $filegroup, //owner group name 32
611
+ "", //device major number 8
612
+ "", //device minor number 8
613
+ $tar_filename_prefix, //prefix for file name 155
614
+ "" ); //fill block 12
615
+
616
+ // Computes the unsigned Checksum of a file's header
617
+ $checksum = 0;
618
+ for ( $i = 0; $i < 512; $i ++ ) {
619
+ $checksum += ord( substr( $header, $i, 1 ) );
620
+ }
621
+
622
+ $checksum = pack( "a8", sprintf( "%07o", $checksum ) );
623
+ $header = substr_replace( $header, $checksum, 148, 8 );
624
+ //write header
625
+ if ( $this->method == 'TarGz' ) {
626
+ $header = gzencode( $header );
627
+ }
628
+ if ( $this->method == 'TarBz2' ) {
629
+ $header = bzcompress( $header );
630
+ }
631
+ fwrite( $this->filehandel, $header );
632
+
633
+ return TRUE;
634
+ }
635
+
636
+ /**
637
+ * @param string $file_to_add
638
+ *
639
+ * @return bool
640
+ */
641
+ private function check_archive_filesize( $file_to_add = '' ) {
642
+
643
+ $two_gb_in_bytes = 2147483647;
644
+
645
+ if ( ! empty( $file_to_add ) ) {
646
+ $file_to_add_size = abs( (int) filesize( $file_to_add ) );
647
+ } else {
648
+ $file_to_add_size = 0;
649
+ }
650
+
651
+ if ( is_resource( $this->filehandel ) ) {
652
+ $stats = fstat( $this->filehandel );
653
+ $archive_size = $stats[ 'size' ];
654
+ } else {
655
+ $archive_size = filesize( $this->file );
656
+ }
657
+
658
+ $archive_size = $archive_size + $file_to_add_size;
659
+ if ( $archive_size > $two_gb_in_bytes ) {
660
+ trigger_error( sprintf( __( 'If %s will be added to your backup archive, the archive will be too large for many file systems (over 2GB). You might want to consider splitting the backup job in multiple jobs with less files each.', 'backwpup' ), $file_to_add ), E_USER_ERROR );
661
+
662
+ return FALSE;
663
+ }
664
+
665
+ return TRUE;
666
+ }
667
+
668
+ }
669
+
670
+ /**
671
+ * Exception Handler
672
+ */
673
+ class BackWPup_Create_Archive_Exception extends Exception { }
inc/class-destination-dropbox.php CHANGED
@@ -1,791 +1,792 @@
1
- <?php
2
- /**
3
- * Documentation: https://www.dropbox.com/developers/reference/api
4
- */
5
- class BackWPup_Destination_Dropbox extends BackWPup_Destinations {
6
-
7
- /**
8
- * @var $backwpup_job_object BackWPup_Job
9
- */
10
- public static $backwpup_job_object = NULL;
11
-
12
- /**
13
- * @return array
14
- */
15
- public function option_defaults() {
16
-
17
- return array( 'dropboxtoken' => array(), 'dropboxroot' => 'sandbox', 'dropboxmaxbackups' => 15, 'dropboxsyncnodelete' => TRUE, 'dropboxdir' => trailingslashit( sanitize_file_name( get_bloginfo( 'name' ) ) ) );
18
- }
19
-
20
-
21
- /**
22
- * @param $jobid
23
- */
24
- public function edit_tab( $jobid ) {
25
-
26
- if ( ! empty( $_GET[ 'deleteauth' ] ) && $_GET[ 'deleteauth' ] == 1 ) {
27
- //disable token on dropbox
28
- try {
29
- $dropbox = new BackWPup_Destination_Dropbox_API( BackWPup_Option::get( $jobid, 'dropboxroot' ) );
30
- if ( BackWPup_Option::get( $jobid, 'dropboxsecret' ) )
31
- $dropbox->setOAuthTokens( array( 'access_token' => BackWPup_Option::get( $jobid, 'dropboxtoken' ), 'oauth_token_secret' => BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 'dropboxsecret' ) ) ) );
32
- else
33
- $dropbox->setOAuthTokens( BackWPup_Option::get( $jobid, 'dropboxtoken' ) );
34
- $dropbox->disable_access_token();
35
- } catch ( Exception $e ) {
36
- echo '<div id="message" class="error"><p>' . sprintf( __( 'Dropbox API: %s', 'backwpup' ), $e->getMessage() ) . '</p></div>';
37
- }
38
- BackWPup_Option::update( $jobid, 'dropboxtoken', array() );
39
- BackWPup_Option::update( $jobid, 'dropboxroot', 'sandbox' );
40
- BackWPup_Option::delete( $jobid, 'dropboxsecret' );
41
- }
42
-
43
- $dropbox = new BackWPup_Destination_Dropbox_API( 'dropbox' );
44
- $dropbox_auth_url = $dropbox->oAuthAuthorize();
45
- $dropbox = new BackWPup_Destination_Dropbox_API( 'sandbox' );
46
- $sandbox_auth_url = $dropbox->oAuthAuthorize();
47
-
48
- $dropboxtoken = BackWPup_Option::get( $jobid, 'dropboxtoken' );
49
- ?>
50
-
51
- <h3 class="title"><?php _e( 'Login', 'backwpup' ); ?></h3>
52
- <p></p>
53
- <table class="form-table">
54
- <tr>
55
- <th scope="row"><?php _e( 'Authentication', 'backwpup' ); ?></th>
56
- <td><?php if ( empty( $dropboxtoken[ 'access_token' ] ) ) { ?>
57
- <span style="color:red;"><?php _e( 'Not authenticated!', 'backwpup' ); ?></span><br />&nbsp;<br />
58
- <a class="button secondary" href="http://db.tt/8irM1vQ0"><?php _e( 'Create Account', 'backwpup' ); ?></a>
59
- <?php } else { ?>
60
- <span style="color:green;"><?php _e( 'Authenticated!', 'backwpup' ); ?></span><br />&nbsp;<br />
61
- <a class="button secondary" href="<?php echo network_admin_url( 'admin.php' ) . '?page=backwpupeditjob&deleteauth=1&jobid=' . $jobid .'&tab=dest-dropbox&_wpnonce=' . wp_create_nonce( 'edit-job' ); ?>" title="<?php _e( 'Delete Dropbox Authentication', 'backwpup' ); ?>"><?php _e( 'Delete Dropbox Authentication', 'backwpup' ); ?></a>
62
- <?php } ?>
63
- </td>
64
- </tr>
65
-
66
- <?php if ( empty( $dropboxtoken[ 'access_token' ] ) ) { ?>
67
- <tr>
68
- <th scope="row"><label for="id_sandbox_code"><?php _e( 'App Access to Dropbox', 'backwpup' ); ?></label></th>
69
- <td>
70
- <input id="id_sandbox_code" name="sandbox_code" type="text" value="" class="regular-text code help-tip" title="<?php esc_attr_e( 'A dedicated folder named BackWPup will be created inside of the Apps folder in your Dropbox. BackWPup will get read and write access to that folder only. You can specify a subfolder as your backup destination for this job in the destination field below.', 'backwpup' ); ?>" />&nbsp;
71
- <a class="button secondary" href="<?php echo $sandbox_auth_url;?>" target="_blank"><?php _e( 'Get Dropbox App auth code', 'backwpup' ); ?></a>
72
- <p><em><?php _e( 'Allows restricted access to Apps/BackWPup folder only.', 'backwpup' ); ?></em></p>
73
- </td>
74
- </tr>
75
- <tr>
76
- <th></th>
77
- <td><?php _e( '— OR —', 'backwpup' ); ?></td>
78
- </tr>
79
- <tr>
80
- <th scope="row"><label for="id_dropbbox_code"><?php _e( 'Full Access to Dropbox', 'backwpup' ); ?></label></th>
81
- <td>
82
- <input id="id_dropbbox_code" name="dropbbox_code" type="text" value="" class="regular-text code help-tip" title="<?php _e( 'BackWPup will have full read and write access to your entire Dropbox. You can specify your backup destination wherever you want, just be aware that ANY files or folders inside of your Dropbox can be overridden or deleted by BackWPup.', 'backwpup' ); ?>" />&nbsp;
83
- <a class="button secondary" href="<?php echo $dropbox_auth_url;?>" target="_blank"><?php _e( 'Get full Dropbox auth code ', 'backwpup' ); ?></a>
84
- <p><em><?php _e( 'Allows full access to your entire Dropbox.', 'backwpup' ); ?></em></p>
85
- </td>
86
- </tr>
87
- <?php } ?>
88
- </table>
89
-
90
-
91
- <h3 class="title"><?php _e( 'Backup settings', 'backwpup' ); ?></h3>
92
- <p></p>
93
- <table class="form-table">
94
- <tr>
95
- <th scope="row"><label for="iddropboxdir"><?php _e( 'Destination Folder', 'backwpup' ); ?></label></th>
96
- <td>
97
- <input id="iddropboxdir" name="dropboxdir" type="text" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 'dropboxdir' ) ); ?>" class="regular-text help-tip" title="<?php esc_attr_e( 'Specify a subfolder where your backup archives will be stored. If you use the App option from above, this folder will be created inside of Apps/BackWPup. Otherwise it will be created at the root of your Dropbox. Already exisiting folders with the same name will not be overriden.', 'backwpup' ); ?>" />
98
- <p><em><?php _e( 'Folder inside your Dropbox where your backup archives will be stored.', 'theme_hamburg_textdomain' );?></em></p>
99
- </td>
100
- </tr>
101
- <tr>
102
- <th scope="row"><?php _e( 'File Deletion', 'backwpup' ); ?></th>
103
- <td>
104
- <?php
105
- if ( BackWPup_Option::get( $jobid, 'backuptype' ) == 'archive' ) {
106
- ?>
107
- <label for="iddropboxmaxbackups"><input id="iddropboxmaxbackups" name="dropboxmaxbackups" title="<?php esc_attr_e( 'Older files will be deleted first. 0 = no files will be deleted.', 'backwpup' ); ?>" type="text" size="3" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 'dropboxmaxbackups' ) );?>" class="small-text help-tip" />&nbsp;
108
- <em><?php _e( 'Number of files to keep in folder.', 'backwpup' ); ?></em></label>
109
- <?php } else { ?>
110
- <label for="iddropboxsyncnodelete" ><input class="checkbox" value="1"
111
- type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 'dropboxsyncnodelete' ), TRUE ); ?>
112
- name="dropboxsyncnodelete" id="iddropboxsyncnodelete" /> <?php _e( 'Do not delete files while syncing to destination!', 'backwpup' ); ?></label>
113
- <?php } ?>
114
- </td>
115
- </tr>
116
- </table>
117
-
118
- <?php
119
- }
120
-
121
- /**
122
- * @param $jobid
123
- * @return string|void
124
- */
125
- public function edit_form_post_save( $jobid ) {
126
-
127
- // get auth
128
- if ( ! empty( $_POST[ 'sandbox_code' ] ) ) {
129
- try {
130
- $dropbox = new BackWPup_Destination_Dropbox_API( 'sandbox' );
131
- $dropboxtoken = $dropbox->oAuthToken( $_POST[ 'sandbox_code' ] );
132
- BackWPup_Option::update( $jobid, 'dropboxtoken', $dropboxtoken );
133
- BackWPup_Option::update( $jobid, 'dropboxroot', 'sandbox' );
134
- } catch ( Exception $e ) {
135
- BackWPup_Admin::message( 'DROPBOX: ' . $e->getMessage(), TRUE );
136
- }
137
- }
138
-
139
- if ( ! empty( $_POST[ 'dropbbox_code' ] ) ) {
140
- try {
141
- $dropbox = new BackWPup_Destination_Dropbox_API( 'dropbox' );
142
- $dropboxtoken = $dropbox->oAuthToken( $_POST[ 'dropbbox_code' ] );
143
- BackWPup_Option::update( $jobid, 'dropboxtoken', $dropboxtoken );
144
- BackWPup_Option::update( $jobid, 'dropboxroot', 'dropbox' );
145
- } catch ( Exception $e ) {
146
- BackWPup_Admin::message( 'DROPBOX: ' . $e->getMessage(), TRUE );
147
- }
148
- }
149
-
150
- BackWPup_Option::update( $jobid, 'dropboxsyncnodelete', ( isset( $_POST[ 'dropboxsyncnodelete' ] ) && $_POST[ 'dropboxsyncnodelete' ] == 1 ) ? TRUE : FALSE );
151
- BackWPup_Option::update( $jobid, 'dropboxmaxbackups', isset( $_POST[ 'dropboxmaxbackups' ] ) ? (int)$_POST[ 'dropboxmaxbackups' ] : 0 );
152
-
153
- $_POST[ 'dropboxdir' ] = trailingslashit( str_replace( '//', '/', str_replace( '\\', '/', trim( stripslashes( $_POST[ 'dropboxdir' ] ) ) ) ) );
154
- if ( substr( $_POST[ 'dropboxdir' ], 0, 1 ) == '/' )
155
- $_POST[ 'dropboxdir' ] = substr( $_POST[ 'dropboxdir' ], 1 );
156
- if ( $_POST[ 'dropboxdir' ] == '/' )
157
- $_POST[ 'dropboxdir' ] = '';
158
- BackWPup_Option::update( $jobid, 'dropboxdir', $_POST[ 'dropboxdir' ] );
159
-
160
- }
161
-
162
- /**
163
- * @param $jobdest
164
- * @param $backupfile
165
- */
166
- public function file_delete( $jobdest, $backupfile ) {
167
-
168
- $files = get_site_transient( 'backwpup_' . strtolower( $jobdest ) );
169
- list( $jobid, $dest ) = explode( '_', $jobdest );
170
-
171
- if ( BackWPup_Option::get( $jobid, 'dropboxtoken' ) && BackWPup_Option::get( $jobid, 'dropboxsecret' ) ) {
172
- try {
173
- $dropbox = new BackWPup_Destination_Dropbox_API( BackWPup_Option::get( $jobid, 'dropboxroot' ) );
174
- $dropbox->setOAuthTokens( BackWPup_Option::get( $jobid, 'dropboxtoken' ) );
175
- $dropbox->fileopsDelete( $backupfile );
176
- //update file list
177
- foreach ( $files as $key => $file ) {
178
- if ( is_array( $file ) && $file[ 'file' ] == $backupfile )
179
- unset( $files[ $key ] );
180
- }
181
- unset( $dropbox );
182
- }
183
- catch ( Exception $e ) {
184
- BackWPup_Admin::message( 'DROPBOX: ' . $e->getMessage(), TRUE );
185
- }
186
- }
187
- set_site_transient( 'backwpup_' . strtolower( $jobdest ), $files, 60 * 60 * 24 * 7 );
188
- }
189
-
190
- /**
191
- * @param $jobid
192
- * @param $get_file
193
- */
194
- public function file_download( $jobid, $get_file ) {
195
-
196
- try {
197
- $dropbox = new BackWPup_Destination_Dropbox_API( BackWPup_Option::get( $jobid, 'dropboxroot' ) );
198
- $dropbox->setOAuthTokens( BackWPup_Option::get( $jobid, 'dropboxtoken' ) );
199
- $media = $dropbox->media( $get_file );
200
- if ( ! empty( $media[ 'url' ] ) )
201
- header( "Location: " . $media[ 'url' ] );
202
- die();
203
- }
204
- catch ( Exception $e ) {
205
- die( $e->getMessage() );
206
- }
207
- }
208
-
209
- /**
210
- * @param $jobdest
211
- * @return mixed
212
- */
213
- public function file_get_list( $jobdest ) {
214
- return get_site_transient( 'BackWPup_' . $jobdest );
215
- }
216
-
217
- /**
218
- * @param $job_object
219
- * @return bool
220
- */
221
- public function job_run_archive( &$job_object ) {
222
-
223
- $job_object->substeps_todo = 2 + $job_object->backup_filesize;
224
- if ( $job_object->steps_data[ $job_object->step_working ]['SAVE_STEP_TRY'] != $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] )
225
- $job_object->log( sprintf( __( '%d. Try to send backup file to Dropbox&#160;&hellip;', 'backwpup' ), $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] ), E_USER_NOTICE );
226
-
227
- try {
228
- $dropbox = new BackWPup_Destination_Dropbox_API( $job_object->job[ 'dropboxroot' ] );
229
- // cahnge oauth1 to oauth2 token
230
- if ( ! empty( $job_object->job[ 'dropboxsecret' ] ) && empty( $job_object->job[ 'dropboxtoken' ][ 'access_token' ] ) ) {
231
- $dropbox->setOAuthTokens( array( 'access_token' => $job_object->job[ 'dropboxtoken' ], 'oauth_token_secret' => BackWPup_Encryption::decrypt( $job_object->job[ 'dropboxsecret' ] ) ) );
232
- $job_object->job[ 'dropboxtoken' ] = $dropbox->token_from_oauth1();
233
- BackWPup_Option::update( $job_object->job[ 'jobid' ], 'dropboxtoken', $job_object->job[ 'dropboxtoken' ] );
234
- BackWPup_Option::delete( $job_object->job[ 'jobid' ], 'dropboxsecret' );
235
- }
236
- // set the tokens
237
- $dropbox->setOAuthTokens( $job_object->job[ 'dropboxtoken' ] );
238
-
239
- //get account info
240
- if ( $job_object->steps_data[ $job_object->step_working ]['SAVE_STEP_TRY'] != $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] ) {
241
- $info = $dropbox->accountInfo();
242
- if ( ! empty( $info[ 'uid' ] ) ) {
243
- $job_object->log( sprintf( __( 'Authenticated with Dropbox of user %s', 'backwpup' ), $info[ 'display_name' ] . ' (' . $info[ 'email' ] . ')' ), E_USER_NOTICE );
244
- //Quota
245
- $dropboxfreespase = $info[ 'quota_info' ][ 'quota' ] - $info[ 'quota_info' ][ 'shared' ] - $info[ 'quota_info' ][ 'normal' ];
246
- $job_object->log( sprintf( __( '%s available on your Dropbox', 'backwpup' ), size_format( $dropboxfreespase, 2 ) ), E_USER_NOTICE );
247
- } else {
248
- $job_object->log( __( 'Not Authenticated with Dropbox!', 'backwpup' ), E_USER_ERROR );
249
- return FALSE;
250
- }
251
- $job_object->log( __( 'Uploading to Dropbox&#160;&hellip;', 'backwpup' ), E_USER_NOTICE );
252
- }
253
-
254
- // put the file
255
- self::$backwpup_job_object = &$job_object;
256
-
257
- if ( $job_object->substeps_done < $job_object->backup_filesize ) { //only if upload not complete
258
- $response = $dropbox->upload( $job_object->backup_folder . $job_object->backup_file, $job_object->job[ 'dropboxdir' ] . $job_object->backup_file );
259
- if ( $response[ 'bytes' ] == $job_object->backup_filesize ) {
260
- if ( ! empty( $job_object->job[ 'jobid' ] ) )
261
- BackWPup_Option::update( $job_object->job[ 'jobid' ], 'lastbackupdownloadurl', network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=downloaddropbox&file=' . ltrim( $response[ 'path' ], '/' ) . '&jobid=' . $job_object->job[ 'jobid' ] );
262
- $job_object->substeps_done = 1 + $job_object->backup_filesize;
263
- $job_object->log( sprintf( __( 'Backup transferred to %s', 'backwpup' ), 'https://api-content.dropbox.com/1/files/' . $job_object->job[ 'dropboxroot' ] . $response[ 'path' ] ), E_USER_NOTICE );
264
- }
265
- else {
266
- if ( $response[ 'bytes' ] != $job_object->backup_filesize )
267
- $job_object->log( __( 'Uploaded file size and local file size don\'t match.', 'backwpup' ), E_USER_ERROR );
268
- else
269
- $job_object->log(
270
- sprintf(
271
- __( 'Error transfering backup to %s.', 'backwpup' ) . ' ' . $response[ 'error' ],
272
- __( 'Dropbox', 'backwpup' )
273
- ), E_USER_ERROR );
274
-
275
- return FALSE;
276
- }
277
- }
278
-
279
-
280
- $backupfilelist = array();
281
- $filecounter = 0;
282
- $files = array();
283
- $metadata = $dropbox->metadata( $job_object->job[ 'dropboxdir' ] );
284
- if ( is_array( $metadata ) ) {
285
- foreach ( $metadata[ 'contents' ] as $data ) {
286
- if ( $data[ 'is_dir' ] != TRUE ) {
287
- $file = basename( $data[ 'path' ] );
288
- if ( $job_object->is_backup_archive( $file ) )
289
- $backupfilelist[ strtotime( $data[ 'modified' ] ) ] = $file;
290
- $files[ $filecounter ][ 'folder' ] = "https://api-content.dropbox.com/1/files/" . $job_object->job[ 'dropboxroot' ] . dirname( $data[ 'path' ] ) . "/";
291
- $files[ $filecounter ][ 'file' ] = $data[ 'path' ];
292
- $files[ $filecounter ][ 'filename' ] = basename( $data[ 'path' ] );
293
- $files[ $filecounter ][ 'downloadurl' ] = network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=downloaddropbox&file=' . $data[ 'path' ] . '&jobid=' . $job_object->job[ 'jobid' ];
294
- $files[ $filecounter ][ 'filesize' ] = $data[ 'bytes' ];
295
- $files[ $filecounter ][ 'time' ] = strtotime( $data[ 'modified' ] ) + ( get_option( 'gmt_offset' ) * 3600 );
296
- $filecounter ++;
297
- }
298
- }
299
- }
300
- if ( $job_object->job[ 'dropboxmaxbackups' ] > 0 && is_object( $dropbox ) ) { //Delete old backups
301
- if ( count( $backupfilelist ) > $job_object->job[ 'dropboxmaxbackups' ] ) {
302
- ksort( $backupfilelist );
303
- $numdeltefiles = 0;
304
- while ( $file = array_shift( $backupfilelist ) ) {
305
- if ( count( $backupfilelist ) < $job_object->job[ 'dropboxmaxbackups' ] )
306
- break;
307
- $response = $dropbox->fileopsDelete( $job_object->job[ 'dropboxdir' ] . $file ); //delete files on Cloud
308
- if ( $response[ 'is_deleted' ] == 'true' ) {
309
- foreach ( $files as $key => $filedata ) {
310
- if ( $filedata[ 'file' ] == '/' .$job_object->job[ 'dropboxdir' ] . $file )
311
- unset( $files[ $key ] );
312
- }
313
- $numdeltefiles ++;
314
- }
315
- else
316
- $job_object->log( sprintf( __( 'Error while deleting file from Dropbox: %s', 'backwpup' ), $file ), E_USER_ERROR );
317
- }
318
- if ( $numdeltefiles > 0 )
319
- $job_object->log( sprintf( _n( 'One file deleted from Dropbox', '%d files deleted on Dropbox', $numdeltefiles, 'backwpup' ), $numdeltefiles ), E_USER_NOTICE );
320
- }
321
- }
322
- set_site_transient( 'backwpup_' . $job_object->job[ 'jobid' ] . '_dropbox', $files, 60 * 60 * 24 * 7 );
323
- }
324
- catch ( Exception $e ) {
325
- $job_object->log( E_USER_ERROR, sprintf( __( 'Dropbox API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
326
-
327
- return FALSE;
328
- }
329
- $job_object->substeps_done ++;
330
-
331
- return TRUE;
332
- }
333
-
334
- /**
335
- * @param $job_object
336
- * @return bool
337
- */
338
- public function can_run( $job_object ) {
339
-
340
- if ( empty( $job_object->job[ 'dropboxtoken' ] ) )
341
- return FALSE;
342
-
343
- return TRUE;
344
- }
345
-
346
- }
347
-
348
-
349
- /**
350
- *
351
- */
352
- final class BackWPup_Destination_Dropbox_API {
353
-
354
- /**
355
- *
356
- */
357
- const API_URL = 'https://api.dropbox.com/';
358
-
359
- /**
360
- *
361
- */
362
- const API_CONTENT_URL = 'https://api-content.dropbox.com/';
363
-
364
- /**
365
- *
366
- */
367
- const API_WWW_URL = 'https://www.dropbox.com/';
368
-
369
- /**
370
- *
371
- */
372
- const API_VERSION_URL = '1/';
373
-
374
- /**
375
- * dropbox vars
376
- *
377
- * @var string
378
- */
379
- private $root = 'sandbox';
380
-
381
- /**
382
- * oAuth vars
383
- *
384
- * @var string
385
- */
386
- private $oauth_app_key = '';
387
-
388
- /**
389
- * @var string
390
- */
391
- private $oauth_app_secret = '';
392
- /**
393
- * @var string
394
- */
395
- private $oauth_token = '';
396
-
397
-
398
-
399
- /**
400
- * @param string $boxtype
401
- * @throws BackWPup_Destination_Dropbox_API_Exception
402
- */
403
- public function __construct( $boxtype = 'dropbox' ) {
404
-
405
- if ( $boxtype == 'dropbox' ) {
406
- $this->oauth_app_key = get_site_option( 'backwpup_cfg_dropboxappkey', base64_decode( "dHZkcjk1MnRhZnM1NmZ2" ) );
407
- $this->oauth_app_secret = BackWPup_Encryption::decrypt( get_site_option( 'backwpup_cfg_dropboxappsecret', base64_decode( "OWV2bDR5MHJvZ2RlYmx1" ) ) );
408
- $this->root = 'dropbox';
409
- }
410
- else {
411
- $this->oauth_app_key = get_site_option( 'backwpup_cfg_dropboxsandboxappkey', base64_decode( "cHVrZmp1a3JoZHR5OTFk" ) );
412
- $this->oauth_app_secret = BackWPup_Encryption::decrypt( get_site_option( 'backwpup_cfg_dropboxsandboxappsecret', base64_decode( "eGNoYzhxdTk5eHE0eWdq" ) ) );
413
- $this->root = 'sandbox';
414
- }
415
-
416
- if ( empty( $this->oauth_app_key ) || empty( $this->oauth_app_secret ) )
417
- throw new BackWPup_Destination_Dropbox_API_Exception( "No App key or App Secret specified." );
418
- }
419
-
420
- /**
421
- * @param $token
422
- * @throws BackWPup_Destination_Dropbox_API_Exception
423
- */
424
- public function setOAuthTokens( $token ) {
425
-
426
- if ( empty( $token[ 'access_token' ] ) )
427
- throw new BackWPup_Destination_Dropbox_API_Exception( "No oAuth token specified." );
428
-
429
- $this->oauth_token = $token;
430
- }
431
-
432
- public function token_from_oauth1( ) {
433
-
434
- $url = self::API_URL . self::API_VERSION_URL . 'oauth2/token_from_oauth1';
435
-
436
- return $this->request( $url, array(), 'POST' );
437
- }
438
-
439
- /**
440
- * @return array|mixed|string
441
- */
442
- public function accountInfo() {
443
-
444
- $url = self::API_URL . self::API_VERSION_URL . 'account/info';
445
-
446
- return $this->request( $url );
447
- }
448
-
449
- public function disable_access_token() {
450
-
451
- $url = self::API_URL . self::API_VERSION_URL . 'disable_access_token';
452
-
453
- return $this->request( $url, array(), 'POST' );
454
- }
455
-
456
- /**
457
- * @param $file
458
- * @param string $path
459
- * @param bool $overwrite
460
- * @return array|mixed|string
461
- * @throws BackWPup_Destination_Dropbox_API_Exception
462
- */
463
- public function upload( $file, $path = '', $overwrite = TRUE ) {
464
-
465
- $file = str_replace( "\\", "/", $file );
466
-
467
- if ( ! is_readable( $file ) )
468
- throw new BackWPup_Destination_Dropbox_API_Exception( "Error: File \"$file\" is not readable or doesn't exist." );
469
-
470
- if ( filesize( $file ) < 5242880 ) { //chunk transfer on bigger uploads
471
- $url = self::API_CONTENT_URL . self::API_VERSION_URL . 'files_put/' . $this->root . '/' . $this->encode_path( $path );
472
- $output = $this->request( $url, array( 'overwrite' => ( $overwrite ) ? 'true' : 'false' ), 'PUT', file_get_contents( $file ) );
473
- }
474
- else {
475
- $output = $this->chunked_upload( $file, $path, $overwrite );
476
- }
477
-
478
- return $output;
479
- }
480
-
481
- /**
482
- * @param $file
483
- * @param string $path
484
- * @param bool $overwrite
485
- * @return array|mixed|string
486
- * @throws BackWPup_Destination_Dropbox_API_Exception
487
- */
488
- public function chunked_upload( $file, $path = '', $overwrite = TRUE ) {
489
-
490
- $backwpup_job_object = BackWPup_Destination_Dropbox::$backwpup_job_object;
491
-
492
- $file = str_replace( "\\", "/", $file );
493
-
494
- if ( ! is_readable( $file ) )
495
- throw new BackWPup_Destination_Dropbox_API_Exception( "Error: File \"$file\" is not readable or doesn't exist." );
496
-
497
- $chunk_size = 4194304; //4194304 = 4MB
498
-
499
- $file_handel = fopen( $file, 'rb' );
500
- if ( ! is_resource( $file_handel ) )
501
- throw new BackWPup_Destination_Dropbox_API_Exception( "Can not open source file for transfer." );
502
-
503
- if ( ! isset( $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'uploadid' ] ) )
504
- $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'uploadid' ] = NULL;
505
- if ( ! isset( $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] ) )
506
- $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] = 0;
507
-
508
- //seek to current position
509
- if ( $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] > 0 )
510
- fseek( $file_handel, $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] );
511
-
512
- while ( $data = fread( $file_handel, $chunk_size ) ) {
513
- $chunk_upload_start = microtime( TRUE );
514
- $url = self::API_CONTENT_URL . self::API_VERSION_URL . 'chunked_upload';
515
- $output = $this->request( $url, array( 'upload_id' => $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'uploadid' ], 'offset' => $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] ), 'PUT', $data );
516
- $chunk_upload_time = microtime( TRUE ) - $chunk_upload_start;
517
- //args for next chunk
518
- $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] = $output[ 'offset' ];
519
- $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'uploadid' ] = $output[ 'upload_id' ];
520
- if ( $backwpup_job_object->job[ 'backuptype' ] == 'archive' ) {
521
- $backwpup_job_object->substeps_done = $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ];
522
- if ( strlen( $data ) == $chunk_size ) {
523
- $time_remaining = $backwpup_job_object->do_restart_time();
524
- //calc next chunk
525
- if ( $time_remaining < $chunk_upload_time ) {
526
- $chunk_size = floor ( $chunk_size / $chunk_upload_time * ( $time_remaining - 3 ) );
527
- if ( $chunk_size < 0 )
528
- $chunk_size = 1024;
529
- if ( $chunk_size > 4194304 )
530
- $chunk_size = 4194304;
531
- }
532
- }
533
- }
534
- $backwpup_job_object->update_working_data();
535
- //correct position
536
- fseek( $file_handel, $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] );
537
- }
538
-
539
- fclose( $file_handel );
540
-
541
- $url = self::API_CONTENT_URL . self::API_VERSION_URL . 'commit_chunked_upload/' . $this->root . '/' . $this->encode_path( $path );
542
-
543
- return $this->request( $url, array( 'overwrite' => ( $overwrite ) ? 'true' : 'false', 'upload_id' => $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'uploadid' ] ), 'POST' );
544
- }
545
-
546
- /**
547
- * @param $path
548
- * @param bool $echo
549
- * @return string
550
- */
551
- public function download( $path, $echo = FALSE ) {
552
-
553
- $url = self::API_CONTENT_URL . self::API_VERSION_URL . 'files/' . $this->root . '/' . $path;
554
- if ( ! $echo )
555
- return $this->request( $url );
556
- else {
557
- $this->request( $url, NULL, 'GET', '', TRUE );
558
- return '';
559
- }
560
- }
561
-
562
- /**
563
- * @param string $path
564
- * @param bool $listContents
565
- * @param int $fileLimit
566
- * @param string $hash
567
- * @return array|mixed|string
568
- */
569
- public function metadata( $path = '', $listContents = TRUE, $fileLimit = 10000, $hash = '' ) {
570
-
571
- $url = self::API_URL . self::API_VERSION_URL . 'metadata/' . $this->root . '/' . $this->encode_path( $path );
572
-
573
- return $this->request( $url, array(
574
- 'list' => ( $listContents ) ? 'true' : 'false',
575
- 'hash' => ( $hash ) ? $hash : '',
576
- 'file_limit' => $fileLimit
577
- ) );
578
- }
579
-
580
- /**
581
- * @param string $path
582
- * @return array|mixed|string
583
- */
584
- public function media( $path = '' ) {
585
-
586
- $url = self::API_URL . self::API_VERSION_URL . 'media/' . $this->root . '/' . $path;
587
-
588
- return $this->request( $url );
589
- }
590
-
591
- /**
592
- * @param $path
593
- * @return array|mixed|string
594
- */
595
- public function fileopsDelete( $path ) {
596
-
597
- $url = self::API_URL . self::API_VERSION_URL . 'fileops/delete';
598
-
599
- return $this->request( $url, array(
600
- 'path' => '/' . $path,
601
- 'root' => $this->root
602
- ) );
603
- }
604
-
605
- public function oAuthAuthorize( ) {
606
-
607
- return self::API_WWW_URL . self::API_VERSION_URL . 'oauth2/authorize?response_type=code&client_id=' . $this->oauth_app_key;
608
- }
609
-
610
-
611
- public function oAuthToken( $code ) {
612
-
613
- $url = self::API_URL . self::API_VERSION_URL . 'oauth2/token';
614
-
615
- return $this->request( $url, array(
616
- 'code' => trim( $code ),
617
- 'grant_type' => 'authorization_code',
618
- 'client_id' => $this->oauth_app_key,
619
- 'client_secret' => $this->oauth_app_secret
620
- ), 'POST' );
621
-
622
- }
623
-
624
-
625
- /**
626
- * @param $url
627
- * @param array $args
628
- * @param string $method
629
- * @param string $data
630
- * @param bool $echo
631
- *
632
- * @throws BackWPup_Destination_Dropbox_API_Exception
633
- * @internal param null $file
634
- * @return array|mixed|string
635
- */
636
- private function request( $url, $args = array(), $method = 'GET', $data = '', $echo = FALSE ) {
637
-
638
- /* Header*/
639
- // oAuth 2
640
- if ( ! empty( $this->oauth_token[ 'access_token' ] ) && ! empty( $this->oauth_token[ 'token_type' ] ) && strtolower( $this->oauth_token[ 'token_type' ] ) == 'bearer' )
641
- $headers[ ] = 'Authorization: Bearer ' . $this->oauth_token[ 'access_token' ] ;
642
- // oAuth 1
643
- elseif ( ! empty( $this->oauth_token[ 'access_token' ] ) && ! empty( $this->oauth_token[ 'oauth_token_secret' ] ) )
644
- $headers[ ] = 'Authorization: OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", oauth_consumer_key="' . $this->oauth_app_key . '", oauth_token="' . $this->oauth_token[ 'access_token' ] . '", oauth_signature="' . $this->oauth_app_secret . '&' . $this->oauth_token[ 'oauth_token_secret' ] . '"';
645
-
646
- $headers[ ] = 'Expect:';
647
-
648
- /* Build cURL Request */
649
- $ch = curl_init();
650
- if ( $method == 'POST' ) {
651
- curl_setopt( $ch, CURLOPT_POST, TRUE );
652
- curl_setopt( $ch, CURLOPT_POSTFIELDS, $args );
653
- curl_setopt( $ch, CURLOPT_URL, $url );
654
- }
655
- elseif ( $method == 'PUT' ) {
656
- curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'PUT' );
657
- curl_setopt( $ch, CURLOPT_POSTFIELDS, $data );
658
- $headers[ ] = 'Content-Type: application/octet-stream';
659
- $args = ( is_array( $args ) ) ? '?' . http_build_query( $args, '', '&' ) : $args;
660
- curl_setopt( $ch, CURLOPT_URL, $url . $args );
661
- }
662
- else {
663
- curl_setopt( $ch, CURLOPT_BINARYTRANSFER, TRUE );
664
- $args = ( is_array( $args ) ) ? '?' . http_build_query( $args, '', '&' ) : $args;
665
- curl_setopt( $ch, CURLOPT_URL, $url . $args );
666
- }
667
- curl_setopt( $ch, CURLOPT_USERAGENT, BackWPup::get_plugin_data( 'User-Agent' ) );
668
- curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
669
- if ( BackWPup::get_plugin_data( 'cacert' ) ) {
670
- curl_setopt( $ch, CURLOPT_SSLVERSION, 1 );
671
- curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, TRUE );
672
- $curl_version = curl_version();
673
- if ( strstr( $curl_version[ 'ssl_version' ], 'NSS/' ) === FALSE ) {
674
- curl_setopt( $ch, CURLOPT_SSL_CIPHER_LIST,
675
- 'ECDHE-RSA-AES256-GCM-SHA384:'.
676
- 'ECDHE-RSA-AES128-GCM-SHA256:'.
677
- 'ECDHE-RSA-AES256-SHA384:'.
678
- 'ECDHE-RSA-AES128-SHA256:'.
679
- 'ECDHE-RSA-AES256-SHA:'.
680
- 'ECDHE-RSA-AES128-SHA:'.
681
- 'ECDHE-RSA-RC4-SHA:'.
682
- 'DHE-RSA-AES256-GCM-SHA384:'.
683
- 'DHE-RSA-AES128-GCM-SHA256:'.
684
- 'DHE-RSA-AES256-SHA256:'.
685
- 'DHE-RSA-AES128-SHA256:'.
686
- 'DHE-RSA-AES256-SHA:'.
687
- 'DHE-RSA-AES128-SHA:'.
688
- 'AES256-GCM-SHA384:'.
689
- 'AES128-GCM-SHA256:'.
690
- 'AES256-SHA256:'.
691
- 'AES128-SHA256:'.
692
- 'AES256-SHA:'.
693
- 'AES128-SHA'
694
- );
695
- }
696
- if ( defined( 'CURLOPT_PROTOCOLS' ) )
697
- curl_setopt( $ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS );
698
- if ( defined( 'CURLOPT_REDIR_PROTOCOLS' ) )
699
- curl_setopt( $ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS );
700
- curl_setopt( $ch, CURLOPT_CAINFO, BackWPup::get_plugin_data( 'cacert' ) );
701
- curl_setopt( $ch, CURLOPT_CAPATH, dirname( BackWPup::get_plugin_data( 'cacert' ) ) );
702
- } else {
703
- curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
704
- }
705
- curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
706
- $output = '';
707
- if ( $echo ) {
708
- echo curl_exec( $ch );
709
- }
710
- else {
711
- curl_setopt( $ch, CURLOPT_HEADER, TRUE );
712
- if ( 0 == curl_errno( $ch ) ) {
713
- $responce = explode( "\r\n\r\n", curl_exec( $ch ), 2 );
714
- if ( ! empty( $responce[ 1 ] ) )
715
- $output = json_decode( $responce[ 1 ], TRUE );
716
- }
717
- }
718
- $status = curl_getinfo( $ch );
719
- if ( isset( $datafilefd ) && is_resource( $datafilefd ) )
720
- fclose( $datafilefd );
721
-
722
- if ( $status[ 'http_code' ] == 503 ) {
723
- $wait = 0;
724
- if ( preg_match( "/retry-after:(.*?)\r/i", $responce[ 0 ], $matches ) )
725
- $wait = trim( $matches[ 1 ] );
726
- //only wait if we get a retry-after header.
727
- if ( ! empty( $wait ) ) {
728
- trigger_error( sprintf( '(503) Your app is making too many requests and is being rate limited. Error 503 can be triggered on a per-app or per-user basis. Wait for %d seconds.', $wait ), E_USER_WARNING );
729
- sleep( $wait );
730
- } else {
731
- throw new BackWPup_Destination_Dropbox_API_Exception( '(503) This indicates a transient server error.' );
732
- }
733
- //redo request
734
- return $this->request( $url, $args, $method, $data, $echo );
735
- }
736
- elseif ( $status[ 'http_code' ] == 400 && $method == 'PUT' ) { //correct offset on chunk uploads
737
- trigger_error( '(' . $status[ 'http_code' ] . ') False offset will corrected', E_USER_NOTICE );
738
- return $output;
739
- }
740
- elseif ( $status[ 'http_code' ] == 404 && ! empty( $output[ 'error' ] )) {
741
- trigger_error( '(' . $status[ 'http_code' ] . ') ' . $output[ 'error' ], E_USER_WARNING );
742
-
743
- return FALSE;
744
- }
745
- elseif ( isset( $output[ 'error' ] ) || $status[ 'http_code' ] >= 300 || $status[ 'http_code' ] < 200 || curl_errno( $ch ) > 0 ) {
746
- if ( isset( $output[ 'error' ] ) && is_string( $output[ 'error' ] ) ) $message = '(' . $status[ 'http_code' ] . ') ' . $output[ 'error' ];
747
- elseif ( isset( $output[ 'error' ][ 'hash' ] ) && $output[ 'error' ][ 'hash' ] != '' ) $message = (string)'(' . $status[ 'http_code' ] . ') ' . $output[ 'error' ][ 'hash' ];
748
- elseif ( 0 != curl_errno( $ch ) ) $message = '(' . curl_errno( $ch ) . ') ' . curl_error( $ch );
749
- elseif ( $status[ 'http_code' ] == 304 ) $message = '(304) Folder contents have not changed (relies on hash parameter).';
750
- elseif ( $status[ 'http_code' ] == 400 ) $message = '(400) Bad input parameter: ' . strip_tags( $responce[ 1 ] );
751
- elseif ( $status[ 'http_code' ] == 401 ) $message = '(401) Bad or expired token. This can happen if the user or Dropbox revoked or expired an access token. To fix, you should re-authenticate the user.';
752
- elseif ( $status[ 'http_code' ] == 403 ) $message = '(403) Bad OAuth request (wrong consumer key, bad nonce, expired timestamp...). Unfortunately, re-authenticating the user won\'t help here.';
753
- elseif ( $status[ 'http_code' ] == 404 ) $message = '(404) File or folder not found at the specified path.';
754
- elseif ( $status[ 'http_code' ] == 405 ) $message = '(405) Request method not expected (generally should be GET or POST).';
755
- elseif ( $status[ 'http_code' ] == 406 ) $message = '(406) There are too many file entries to return.';
756
- elseif ( $status[ 'http_code' ] == 411 ) $message = '(411) Missing Content-Length header (this endpoint doesn\'t support HTTP chunked transfer encoding).';
757
- elseif ( $status[ 'http_code' ] == 415 ) $message = '(415) The image is invalid and cannot be converted to a thumbnail.';
758
- elseif ( $status[ 'http_code' ] == 429 ) $message = '(429) Your app is making too many requests and is being rate limited. 429s can trigger on a per-app or per-user basis.';
759
- elseif ( $status[ 'http_code' ] == 507 ) $message = '(507) User is over Dropbox storage quota.';
760
- else $message = '(' . $status[ 'http_code' ] . ') Invalid response.';
761
- throw new BackWPup_Destination_Dropbox_API_Exception( $message );
762
- }
763
- else {
764
- curl_close( $ch );
765
- if ( ! is_array( $output ) )
766
- return $responce[ 1 ];
767
- else
768
- return $output;
769
- }
770
- }
771
-
772
- /**
773
- * @param $path
774
- *
775
- * @return mixed
776
- */
777
- private function encode_path( $path ) {
778
-
779
- $path = preg_replace( '#/+#', '/', trim( $path, '/' ) );
780
- $path = str_replace( '%2F', '/', rawurlencode( $path ) );
781
-
782
- return $path;
783
- }
784
- }
785
-
786
- /**
787
- *
788
- */
789
- class BackWPup_Destination_Dropbox_API_Exception extends Exception {
790
-
791
- }
 
1
+ <?php
2
+ /**
3
+ * Documentation: https://www.dropbox.com/developers/reference/api
4
+ */
5
+ class BackWPup_Destination_Dropbox extends BackWPup_Destinations {
6
+
7
+ /**
8
+ * @var $backwpup_job_object BackWPup_Job
9
+ */
10
+ public static $backwpup_job_object = NULL;
11
+
12
+ /**
13
+ * @return array
14
+ */
15
+ public function option_defaults() {
16
+
17
+ return array( 'dropboxtoken' => array(), 'dropboxroot' => 'sandbox', 'dropboxmaxbackups' => 15, 'dropboxsyncnodelete' => TRUE, 'dropboxdir' => trailingslashit( sanitize_file_name( get_bloginfo( 'name' ) ) ) );
18
+ }
19
+
20
+
21
+ /**
22
+ * @param $jobid
23
+ */
24
+ public function edit_tab( $jobid ) {
25
+
26
+ if ( ! empty( $_GET[ 'deleteauth' ] ) && $_GET[ 'deleteauth' ] == 1 ) {
27
+ //disable token on dropbox
28
+ try {
29
+ $dropbox = new BackWPup_Destination_Dropbox_API( BackWPup_Option::get( $jobid, 'dropboxroot' ) );
30
+ if ( BackWPup_Option::get( $jobid, 'dropboxsecret' ) )
31
+ $dropbox->setOAuthTokens( array( 'access_token' => BackWPup_Option::get( $jobid, 'dropboxtoken' ), 'oauth_token_secret' => BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 'dropboxsecret' ) ) ) );
32
+ else
33
+ $dropbox->setOAuthTokens( BackWPup_Option::get( $jobid, 'dropboxtoken' ) );
34
+ $dropbox->disable_access_token();
35
+ } catch ( Exception $e ) {
36
+ echo '<div id="message" class="error"><p>' . sprintf( __( 'Dropbox API: %s', 'backwpup' ), $e->getMessage() ) . '</p></div>';
37
+ }
38
+ BackWPup_Option::update( $jobid, 'dropboxtoken', array() );
39
+ BackWPup_Option::update( $jobid, 'dropboxroot', 'sandbox' );
40
+ BackWPup_Option::delete( $jobid, 'dropboxsecret' );
41
+ }
42
+
43
+ $dropbox = new BackWPup_Destination_Dropbox_API( 'dropbox' );
44
+ $dropbox_auth_url = $dropbox->oAuthAuthorize();
45
+ $dropbox = new BackWPup_Destination_Dropbox_API( 'sandbox' );
46
+ $sandbox_auth_url = $dropbox->oAuthAuthorize();
47
+
48
+ $dropboxtoken = BackWPup_Option::get( $jobid, 'dropboxtoken' );
49
+ ?>
50
+
51
+ <h3 class="title"><?php _e( 'Login', 'backwpup' ); ?></h3>
52
+ <p></p>
53
+ <table class="form-table">
54
+ <tr>
55
+ <th scope="row"><?php _e( 'Authentication', 'backwpup' ); ?></th>
56
+ <td><?php if ( empty( $dropboxtoken[ 'access_token' ] ) ) { ?>
57
+ <span style="color:red;"><?php _e( 'Not authenticated!', 'backwpup' ); ?></span><br />&nbsp;<br />
58
+ <a class="button secondary" href="http://db.tt/8irM1vQ0"><?php _e( 'Create Account', 'backwpup' ); ?></a>
59
+ <?php } else { ?>
60
+ <span style="color:green;"><?php _e( 'Authenticated!', 'backwpup' ); ?></span><br />&nbsp;<br />
61
+ <a class="button secondary" href="<?php echo network_admin_url( 'admin.php' ) . '?page=backwpupeditjob&deleteauth=1&jobid=' . $jobid .'&tab=dest-dropbox&_wpnonce=' . wp_create_nonce( 'edit-job' ); ?>" title="<?php _e( 'Delete Dropbox Authentication', 'backwpup' ); ?>"><?php _e( 'Delete Dropbox Authentication', 'backwpup' ); ?></a>
62
+ <?php } ?>
63
+ </td>
64
+ </tr>
65
+
66
+ <?php if ( empty( $dropboxtoken[ 'access_token' ] ) ) { ?>
67
+ <tr>
68
+ <th scope="row"><label for="id_sandbox_code"><?php _e( 'App Access to Dropbox', 'backwpup' ); ?></label></th>
69
+ <td>
70
+ <input id="id_sandbox_code" name="sandbox_code" type="text" value="" class="regular-text code help-tip" title="<?php esc_attr_e( 'A dedicated folder named BackWPup will be created inside of the Apps folder in your Dropbox. BackWPup will get read and write access to that folder only. You can specify a subfolder as your backup destination for this job in the destination field below.', 'backwpup' ); ?>" />&nbsp;
71
+ <a class="button secondary" href="<?php echo $sandbox_auth_url;?>" target="_blank"><?php _e( 'Get Dropbox App auth code', 'backwpup' ); ?></a>
72
+ <p><em><?php _e( 'Allows restricted access to Apps/BackWPup folder only.', 'backwpup' ); ?></em></p>
73
+ </td>
74
+ </tr>
75
+ <tr>
76
+ <th></th>
77
+ <td><?php _e( '— OR —', 'backwpup' ); ?></td>
78
+ </tr>
79
+ <tr>
80
+ <th scope="row"><label for="id_dropbbox_code"><?php _e( 'Full Access to Dropbox', 'backwpup' ); ?></label></th>
81
+ <td>
82
+ <input id="id_dropbbox_code" name="dropbbox_code" type="text" value="" class="regular-text code help-tip" title="<?php _e( 'BackWPup will have full read and write access to your entire Dropbox. You can specify your backup destination wherever you want, just be aware that ANY files or folders inside of your Dropbox can be overridden or deleted by BackWPup.', 'backwpup' ); ?>" />&nbsp;
83
+ <a class="button secondary" href="<?php echo $dropbox_auth_url;?>" target="_blank"><?php _e( 'Get full Dropbox auth code ', 'backwpup' ); ?></a>
84
+ <p><em><?php _e( 'Allows full access to your entire Dropbox.', 'backwpup' ); ?></em></p>
85
+ </td>
86
+ </tr>
87
+ <?php } ?>
88
+ </table>
89
+
90
+
91
+ <h3 class="title"><?php _e( 'Backup settings', 'backwpup' ); ?></h3>
92
+ <p></p>
93
+ <table class="form-table">
94
+ <tr>
95
+ <th scope="row"><label for="iddropboxdir"><?php _e( 'Destination Folder', 'backwpup' ); ?></label></th>
96
+ <td>
97
+ <input id="iddropboxdir" name="dropboxdir" type="text" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 'dropboxdir' ) ); ?>" class="regular-text help-tip" title="<?php esc_attr_e( 'Specify a subfolder where your backup archives will be stored. If you use the App option from above, this folder will be created inside of Apps/BackWPup. Otherwise it will be created at the root of your Dropbox. Already exisiting folders with the same name will not be overriden.', 'backwpup' ); ?>" />
98
+ <p><em><?php _e( 'Folder inside your Dropbox where your backup archives will be stored.', 'theme_hamburg_textdomain' );?></em></p>
99
+ </td>
100
+ </tr>
101
+ <tr>
102
+ <th scope="row"><?php _e( 'File Deletion', 'backwpup' ); ?></th>
103
+ <td>
104
+ <?php
105
+ if ( BackWPup_Option::get( $jobid, 'backuptype' ) == 'archive' ) {
106
+ ?>
107
+ <label for="iddropboxmaxbackups"><input id="iddropboxmaxbackups" name="dropboxmaxbackups" title="<?php esc_attr_e( 'Older files will be deleted first. 0 = no files will be deleted.', 'backwpup' ); ?>" type="text" size="3" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 'dropboxmaxbackups' ) );?>" class="small-text help-tip" />&nbsp;
108
+ <em><?php _e( 'Number of files to keep in folder.', 'backwpup' ); ?></em></label>
109
+ <?php } else { ?>
110
+ <label for="iddropboxsyncnodelete" ><input class="checkbox" value="1"
111
+ type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 'dropboxsyncnodelete' ), TRUE ); ?>
112
+ name="dropboxsyncnodelete" id="iddropboxsyncnodelete" /> <?php _e( 'Do not delete files while syncing to destination!', 'backwpup' ); ?></label>
113
+ <?php } ?>
114
+ </td>
115
+ </tr>
116
+ </table>
117
+
118
+ <?php
119
+ }
120
+
121
+ /**
122
+ * @param $jobid
123
+ * @return string|void
124
+ */
125
+ public function edit_form_post_save( $jobid ) {
126
+
127
+ // get auth
128
+ if ( ! empty( $_POST[ 'sandbox_code' ] ) ) {
129
+ try {
130
+ $dropbox = new BackWPup_Destination_Dropbox_API( 'sandbox' );
131
+ $dropboxtoken = $dropbox->oAuthToken( $_POST[ 'sandbox_code' ] );
132
+ BackWPup_Option::update( $jobid, 'dropboxtoken', $dropboxtoken );
133
+ BackWPup_Option::update( $jobid, 'dropboxroot', 'sandbox' );
134
+ } catch ( Exception $e ) {
135
+ BackWPup_Admin::message( 'DROPBOX: ' . $e->getMessage(), TRUE );
136
+ }
137
+ }
138
+
139
+ if ( ! empty( $_POST[ 'dropbbox_code' ] ) ) {
140
+ try {
141
+ $dropbox = new BackWPup_Destination_Dropbox_API( 'dropbox' );
142
+ $dropboxtoken = $dropbox->oAuthToken( $_POST[ 'dropbbox_code' ] );
143
+ BackWPup_Option::update( $jobid, 'dropboxtoken', $dropboxtoken );
144
+ BackWPup_Option::update( $jobid, 'dropboxroot', 'dropbox' );
145
+ } catch ( Exception $e ) {
146
+ BackWPup_Admin::message( 'DROPBOX: ' . $e->getMessage(), TRUE );
147
+ }
148
+ }
149
+
150
+ BackWPup_Option::update( $jobid, 'dropboxsyncnodelete', ( isset( $_POST[ 'dropboxsyncnodelete' ] ) && $_POST[ 'dropboxsyncnodelete' ] == 1 ) ? TRUE : FALSE );
151
+ BackWPup_Option::update( $jobid, 'dropboxmaxbackups', isset( $_POST[ 'dropboxmaxbackups' ] ) ? (int)$_POST[ 'dropboxmaxbackups' ] : 0 );
152
+
153
+ $_POST[ 'dropboxdir' ] = trailingslashit( str_replace( '//', '/', str_replace( '\\', '/', trim( stripslashes( $_POST[ 'dropboxdir' ] ) ) ) ) );
154
+ if ( substr( $_POST[ 'dropboxdir' ], 0, 1 ) == '/' )
155
+ $_POST[ 'dropboxdir' ] = substr( $_POST[ 'dropboxdir' ], 1 );
156
+ if ( $_POST[ 'dropboxdir' ] == '/' )
157
+ $_POST[ 'dropboxdir' ] = '';
158
+ BackWPup_Option::update( $jobid, 'dropboxdir', $_POST[ 'dropboxdir' ] );
159
+
160
+ }
161
+
162
+ /**
163
+ * @param $jobdest
164
+ * @param $backupfile
165
+ */
166
+ public function file_delete( $jobdest, $backupfile ) {
167
+
168
+ $files = get_site_transient( 'backwpup_' . strtolower( $jobdest ) );
169
+ list( $jobid, $dest ) = explode( '_', $jobdest );
170
+
171
+ if ( BackWPup_Option::get( $jobid, 'dropboxtoken' ) && BackWPup_Option::get( $jobid, 'dropboxsecret' ) ) {
172
+ try {
173
+ $dropbox = new BackWPup_Destination_Dropbox_API( BackWPup_Option::get( $jobid, 'dropboxroot' ) );
174
+ $dropbox->setOAuthTokens( BackWPup_Option::get( $jobid, 'dropboxtoken' ) );
175
+ $dropbox->fileopsDelete( $backupfile );
176
+ //update file list
177
+ foreach ( $files as $key => $file ) {
178
+ if ( is_array( $file ) && $file[ 'file' ] == $backupfile )
179
+ unset( $files[ $key ] );
180
+ }
181
+ unset( $dropbox );
182
+ }
183
+ catch ( Exception $e ) {
184
+ BackWPup_Admin::message( 'DROPBOX: ' . $e->getMessage(), TRUE );
185
+ }
186
+ }
187
+ set_site_transient( 'backwpup_' . strtolower( $jobdest ), $files, 60 * 60 * 24 * 7 );
188
+ }
189
+
190
+ /**
191
+ * @param $jobid
192
+ * @param $get_file
193
+ */
194
+ public function file_download( $jobid, $get_file ) {
195
+
196
+ try {
197
+ $dropbox = new BackWPup_Destination_Dropbox_API( BackWPup_Option::get( $jobid, 'dropboxroot' ) );
198
+ $dropbox->setOAuthTokens( BackWPup_Option::get( $jobid, 'dropboxtoken' ) );
199
+ $media = $dropbox->media( $get_file );
200
+ if ( ! empty( $media[ 'url' ] ) )
201
+ header( "Location: " . $media[ 'url' ] );
202
+ die();
203
+ }
204
+ catch ( Exception $e ) {
205
+ die( $e->getMessage() );
206
+ }
207
+ }
208
+
209
+ /**
210
+ * @param $jobdest
211
+ * @return mixed
212
+ */
213
+ public function file_get_list( $jobdest ) {
214
+ return get_site_transient( 'BackWPup_' . $jobdest );
215
+ }
216
+
217
+ /**
218
+ * @param $job_object
219
+ * @return bool
220
+ */
221
+ public function job_run_archive( &$job_object ) {
222
+
223
+ $job_object->substeps_todo = 2 + $job_object->backup_filesize;
224
+ if ( $job_object->steps_data[ $job_object->step_working ]['SAVE_STEP_TRY'] != $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] )
225
+ $job_object->log( sprintf( __( '%d. Try to send backup file to Dropbox&#160;&hellip;', 'backwpup' ), $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] ), E_USER_NOTICE );
226
+
227
+ try {
228
+ $dropbox = new BackWPup_Destination_Dropbox_API( $job_object->job[ 'dropboxroot' ] );
229
+ // cahnge oauth1 to oauth2 token
230
+ if ( ! empty( $job_object->job[ 'dropboxsecret' ] ) && empty( $job_object->job[ 'dropboxtoken' ][ 'access_token' ] ) ) {
231
+ $dropbox->setOAuthTokens( array( 'access_token' => $job_object->job[ 'dropboxtoken' ], 'oauth_token_secret' => BackWPup_Encryption::decrypt( $job_object->job[ 'dropboxsecret' ] ) ) );
232
+ $job_object->job[ 'dropboxtoken' ] = $dropbox->token_from_oauth1();
233
+ BackWPup_Option::update( $job_object->job[ 'jobid' ], 'dropboxtoken', $job_object->job[ 'dropboxtoken' ] );
234
+ BackWPup_Option::delete( $job_object->job[ 'jobid' ], 'dropboxsecret' );
235
+ }
236
+ // set the tokens
237
+ $dropbox->setOAuthTokens( $job_object->job[ 'dropboxtoken' ] );
238
+
239
+ //get account info
240
+ if ( $job_object->steps_data[ $job_object->step_working ]['SAVE_STEP_TRY'] != $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] ) {
241
+ $info = $dropbox->accountInfo();
242
+ if ( ! empty( $info[ 'uid' ] ) ) {
243
+ $job_object->log( sprintf( __( 'Authenticated with Dropbox of user %s', 'backwpup' ), $info[ 'display_name' ] . ' (' . $info[ 'email' ] . ')' ), E_USER_NOTICE );
244
+ //Quota
245
+ $dropboxfreespase = $info[ 'quota_info' ][ 'quota' ] - $info[ 'quota_info' ][ 'shared' ] - $info[ 'quota_info' ][ 'normal' ];
246
+ $job_object->log( sprintf( __( '%s available on your Dropbox', 'backwpup' ), size_format( $dropboxfreespase, 2 ) ), E_USER_NOTICE );
247
+ } else {
248
+ $job_object->log( __( 'Not Authenticated with Dropbox!', 'backwpup' ), E_USER_ERROR );
249
+ return FALSE;
250
+ }
251
+ $job_object->log( __( 'Uploading to Dropbox&#160;&hellip;', 'backwpup' ), E_USER_NOTICE );
252
+ }
253
+
254
+ // put the file
255
+ self::$backwpup_job_object = &$job_object;
256
+
257
+ if ( $job_object->substeps_done < $job_object->backup_filesize ) { //only if upload not complete
258
+ $response = $dropbox->upload( $job_object->backup_folder . $job_object->backup_file, $job_object->job[ 'dropboxdir' ] . $job_object->backup_file );
259
+ if ( $response[ 'bytes' ] == $job_object->backup_filesize ) {
260
+ if ( ! empty( $job_object->job[ 'jobid' ] ) )
261
+ BackWPup_Option::update( $job_object->job[ 'jobid' ], 'lastbackupdownloadurl', network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=downloaddropbox&file=' . ltrim( $response[ 'path' ], '/' ) . '&jobid=' . $job_object->job[ 'jobid' ] );
262
+ $job_object->substeps_done = 1 + $job_object->backup_filesize;
263
+ $job_object->log( sprintf( __( 'Backup transferred to %s', 'backwpup' ), 'https://api-content.dropbox.com/1/files/' . $job_object->job[ 'dropboxroot' ] . $response[ 'path' ] ), E_USER_NOTICE );
264
+ }
265
+ else {
266
+ if ( $response[ 'bytes' ] != $job_object->backup_filesize )
267
+ $job_object->log( __( 'Uploaded file size and local file size don\'t match.', 'backwpup' ), E_USER_ERROR );
268
+ else
269
+ $job_object->log(
270
+ sprintf(
271
+ __( 'Error transfering backup to %s.', 'backwpup' ) . ' ' . $response[ 'error' ],
272
+ __( 'Dropbox', 'backwpup' )
273
+ ), E_USER_ERROR );
274
+
275
+ return FALSE;
276
+ }
277
+ }
278
+
279
+
280
+ $backupfilelist = array();
281
+ $filecounter = 0;
282
+ $files = array();
283
+ $metadata = $dropbox->metadata( $job_object->job[ 'dropboxdir' ] );
284
+ if ( is_array( $metadata ) ) {
285
+ foreach ( $metadata[ 'contents' ] as $data ) {
286
+ if ( $data[ 'is_dir' ] != TRUE ) {
287
+ $file = basename( $data[ 'path' ] );
288
+ if ( $job_object->is_backup_archive( $file ) ) {
289
+ $backupfilelist[ strtotime( $data[ 'modified' ] ) ] = $file;
290
+ }
291
+ $files[ $filecounter ][ 'folder' ] = "https://api-content.dropbox.com/1/files/" . $job_object->job[ 'dropboxroot' ] . dirname( $data[ 'path' ] ) . "/";
292
+ $files[ $filecounter ][ 'file' ] = $data[ 'path' ];
293
+ $files[ $filecounter ][ 'filename' ] = basename( $data[ 'path' ] );
294
+ $files[ $filecounter ][ 'downloadurl' ] = network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=downloaddropbox&file=' . $data[ 'path' ] . '&jobid=' . $job_object->job[ 'jobid' ];
295
+ $files[ $filecounter ][ 'filesize' ] = $data[ 'bytes' ];
296
+ $files[ $filecounter ][ 'time' ] = strtotime( $data[ 'modified' ] ) + ( get_option( 'gmt_offset' ) * 3600 );
297
+ $filecounter ++;
298
+ }
299
+ }
300
+ }
301
+ if ( $job_object->job[ 'dropboxmaxbackups' ] > 0 && is_object( $dropbox ) ) { //Delete old backups
302
+ if ( count( $backupfilelist ) > $job_object->job[ 'dropboxmaxbackups' ] ) {
303
+ ksort( $backupfilelist );
304
+ $numdeltefiles = 0;
305
+ while ( $file = array_shift( $backupfilelist ) ) {
306
+ if ( count( $backupfilelist ) < $job_object->job[ 'dropboxmaxbackups' ] )
307
+ break;
308
+ $response = $dropbox->fileopsDelete( $job_object->job[ 'dropboxdir' ] . $file ); //delete files on Cloud
309
+ if ( $response[ 'is_deleted' ] == 'true' ) {
310
+ foreach ( $files as $key => $filedata ) {
311
+ if ( $filedata[ 'file' ] == '/' .$job_object->job[ 'dropboxdir' ] . $file )
312
+ unset( $files[ $key ] );
313
+ }
314
+ $numdeltefiles ++;
315
+ }
316
+ else
317
+ $job_object->log( sprintf( __( 'Error while deleting file from Dropbox: %s', 'backwpup' ), $file ), E_USER_ERROR );
318
+ }
319
+ if ( $numdeltefiles > 0 )
320
+ $job_object->log( sprintf( _n( 'One file deleted from Dropbox', '%d files deleted on Dropbox', $numdeltefiles, 'backwpup' ), $numdeltefiles ), E_USER_NOTICE );
321
+ }
322
+ }
323
+ set_site_transient( 'backwpup_' . $job_object->job[ 'jobid' ] . '_dropbox', $files, 60 * 60 * 24 * 7 );
324
+ }
325
+ catch ( Exception $e ) {
326
+ $job_object->log( E_USER_ERROR, sprintf( __( 'Dropbox API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
327
+
328
+ return FALSE;
329
+ }
330
+ $job_object->substeps_done ++;
331
+
332
+ return TRUE;
333
+ }
334
+
335
+ /**
336
+ * @param $job_object
337
+ * @return bool
338
+ */
339
+ public function can_run( $job_object ) {
340
+
341
+ if ( empty( $job_object->job[ 'dropboxtoken' ] ) )
342
+ return FALSE;
343
+
344
+ return TRUE;
345
+ }
346
+
347
+ }
348
+
349
+
350
+ /**
351
+ *
352
+ */
353
+ final class BackWPup_Destination_Dropbox_API {
354
+
355
+ /**
356
+ *
357
+ */
358
+ const API_URL = 'https://api.dropbox.com/';
359
+
360
+ /**
361
+ *
362
+ */
363
+ const API_CONTENT_URL = 'https://api-content.dropbox.com/';
364
+
365
+ /**
366
+ *
367
+ */
368
+ const API_WWW_URL = 'https://www.dropbox.com/';
369
+
370
+ /**
371
+ *
372
+ */
373
+ const API_VERSION_URL = '1/';
374
+
375
+ /**
376
+ * dropbox vars
377
+ *
378
+ * @var string
379
+ */
380
+ private $root = 'sandbox';
381
+
382
+ /**
383
+ * oAuth vars
384
+ *
385
+ * @var string
386
+ */
387
+ private $oauth_app_key = '';
388
+
389
+ /**
390
+ * @var string
391
+ */
392
+ private $oauth_app_secret = '';
393
+ /**
394
+ * @var string
395
+ */
396
+ private $oauth_token = '';
397
+
398
+
399
+
400
+ /**
401
+ * @param string $boxtype
402
+ * @throws BackWPup_Destination_Dropbox_API_Exception
403
+ */
404
+ public function __construct( $boxtype = 'dropbox' ) {
405
+
406
+ if ( $boxtype == 'dropbox' ) {
407
+ $this->oauth_app_key = get_site_option( 'backwpup_cfg_dropboxappkey', base64_decode( "dHZkcjk1MnRhZnM1NmZ2" ) );
408
+ $this->oauth_app_secret = BackWPup_Encryption::decrypt( get_site_option( 'backwpup_cfg_dropboxappsecret', base64_decode( "OWV2bDR5MHJvZ2RlYmx1" ) ) );
409
+ $this->root = 'dropbox';
410
+ }
411
+ else {
412
+ $this->oauth_app_key = get_site_option( 'backwpup_cfg_dropboxsandboxappkey', base64_decode( "cHVrZmp1a3JoZHR5OTFk" ) );
413
+ $this->oauth_app_secret = BackWPup_Encryption::decrypt( get_site_option( 'backwpup_cfg_dropboxsandboxappsecret', base64_decode( "eGNoYzhxdTk5eHE0eWdq" ) ) );
414
+ $this->root = 'sandbox';
415
+ }
416
+
417
+ if ( empty( $this->oauth_app_key ) || empty( $this->oauth_app_secret ) )
418
+ throw new BackWPup_Destination_Dropbox_API_Exception( "No App key or App Secret specified." );
419
+ }
420
+
421
+ /**
422
+ * @param $token
423
+ * @throws BackWPup_Destination_Dropbox_API_Exception
424
+ */
425
+ public function setOAuthTokens( $token ) {
426
+
427
+ if ( empty( $token[ 'access_token' ] ) )
428
+ throw new BackWPup_Destination_Dropbox_API_Exception( "No oAuth token specified." );
429
+
430
+ $this->oauth_token = $token;
431
+ }
432
+
433
+ public function token_from_oauth1( ) {
434
+
435
+ $url = self::API_URL . self::API_VERSION_URL . 'oauth2/token_from_oauth1';
436
+
437
+ return $this->request( $url, array(), 'POST' );
438
+ }
439
+
440
+ /**
441
+ * @return array|mixed|string
442
+ */
443
+ public function accountInfo() {
444
+
445
+ $url = self::API_URL . self::API_VERSION_URL . 'account/info';
446
+
447
+ return $this->request( $url );
448
+ }
449
+
450
+ public function disable_access_token() {
451
+
452
+ $url = self::API_URL . self::API_VERSION_URL . 'disable_access_token';
453
+
454
+ return $this->request( $url, array(), 'POST' );
455
+ }
456
+
457
+ /**
458
+ * @param $file
459
+ * @param string $path
460
+ * @param bool $overwrite
461
+ * @return array|mixed|string
462
+ * @throws BackWPup_Destination_Dropbox_API_Exception
463
+ */
464
+ public function upload( $file, $path = '', $overwrite = TRUE ) {
465
+
466
+ $file = str_replace( "\\", "/", $file );
467
+
468
+ if ( ! is_readable( $file ) )
469
+ throw new BackWPup_Destination_Dropbox_API_Exception( "Error: File \"$file\" is not readable or doesn't exist." );
470
+
471
+ if ( filesize( $file ) < 5242880 ) { //chunk transfer on bigger uploads
472
+ $url = self::API_CONTENT_URL . self::API_VERSION_URL . 'files_put/' . $this->root . '/' . $this->encode_path( $path );
473
+ $output = $this->request( $url, array( 'overwrite' => ( $overwrite ) ? 'true' : 'false' ), 'PUT', file_get_contents( $file ) );
474
+ }
475
+ else {
476
+ $output = $this->chunked_upload( $file, $path, $overwrite );
477
+ }
478
+
479
+ return $output;
480
+ }
481
+
482
+ /**
483
+ * @param $file
484
+ * @param string $path
485
+ * @param bool $overwrite
486
+ * @return array|mixed|string
487
+ * @throws BackWPup_Destination_Dropbox_API_Exception
488
+ */
489
+ public function chunked_upload( $file, $path = '', $overwrite = TRUE ) {
490
+
491
+ $backwpup_job_object = BackWPup_Destination_Dropbox::$backwpup_job_object;
492
+
493
+ $file = str_replace( "\\", "/", $file );
494
+
495
+ if ( ! is_readable( $file ) )
496
+ throw new BackWPup_Destination_Dropbox_API_Exception( "Error: File \"$file\" is not readable or doesn't exist." );
497
+
498
+ $chunk_size = 4194304; //4194304 = 4MB
499
+
500
+ $file_handel = fopen( $file, 'rb' );
501
+ if ( ! is_resource( $file_handel ) )
502
+ throw new BackWPup_Destination_Dropbox_API_Exception( "Can not open source file for transfer." );
503
+
504
+ if ( ! isset( $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'uploadid' ] ) )
505
+ $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'uploadid' ] = NULL;
506
+ if ( ! isset( $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] ) )
507
+ $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] = 0;
508
+
509
+ //seek to current position
510
+ if ( $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] > 0 )
511
+ fseek( $file_handel, $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] );
512
+
513
+ while ( $data = fread( $file_handel, $chunk_size ) ) {
514
+ $chunk_upload_start = microtime( TRUE );
515
+ $url = self::API_CONTENT_URL . self::API_VERSION_URL . 'chunked_upload';
516
+ $output = $this->request( $url, array( 'upload_id' => $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'uploadid' ], 'offset' => $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] ), 'PUT', $data );
517
+ $chunk_upload_time = microtime( TRUE ) - $chunk_upload_start;
518
+ //args for next chunk
519
+ $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] = $output[ 'offset' ];
520
+ $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'uploadid' ] = $output[ 'upload_id' ];
521
+ if ( $backwpup_job_object->job[ 'backuptype' ] == 'archive' ) {
522
+ $backwpup_job_object->substeps_done = $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ];
523
+ if ( strlen( $data ) == $chunk_size ) {
524
+ $time_remaining = $backwpup_job_object->do_restart_time();
525
+ //calc next chunk
526
+ if ( $time_remaining < $chunk_upload_time ) {
527
+ $chunk_size = floor ( $chunk_size / $chunk_upload_time * ( $time_remaining - 3 ) );
528
+ if ( $chunk_size < 0 )
529
+ $chunk_size = 1024;
530
+ if ( $chunk_size > 4194304 )
531
+ $chunk_size = 4194304;
532
+ }
533
+ }
534
+ }
535
+ $backwpup_job_object->update_working_data();
536
+ //correct position
537
+ fseek( $file_handel, $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'offset' ] );
538
+ }
539
+
540
+ fclose( $file_handel );
541
+
542
+ $url = self::API_CONTENT_URL . self::API_VERSION_URL . 'commit_chunked_upload/' . $this->root . '/' . $this->encode_path( $path );
543
+
544
+ return $this->request( $url, array( 'overwrite' => ( $overwrite ) ? 'true' : 'false', 'upload_id' => $backwpup_job_object->steps_data[ $backwpup_job_object->step_working ][ 'uploadid' ] ), 'POST' );
545
+ }
546
+
547
+ /**
548
+ * @param $path
549
+ * @param bool $echo
550
+ * @return string
551
+ */
552
+ public function download( $path, $echo = FALSE ) {
553
+
554
+ $url = self::API_CONTENT_URL . self::API_VERSION_URL . 'files/' . $this->root . '/' . $path;
555
+ if ( ! $echo )
556
+ return $this->request( $url );
557
+ else {
558
+ $this->request( $url, NULL, 'GET', '', TRUE );
559
+ return '';
560
+ }
561
+ }
562
+
563
+ /**
564
+ * @param string $path
565
+ * @param bool $listContents
566
+ * @param int $fileLimit
567
+ * @param string $hash
568
+ * @return array|mixed|string
569
+ */
570
+ public function metadata( $path = '', $listContents = TRUE, $fileLimit = 10000, $hash = '' ) {
571
+
572
+ $url = self::API_URL . self::API_VERSION_URL . 'metadata/' . $this->root . '/' . $this->encode_path( $path );
573
+
574
+ return $this->request( $url, array(
575
+ 'list' => ( $listContents ) ? 'true' : 'false',
576
+ 'hash' => ( $hash ) ? $hash : '',
577
+ 'file_limit' => $fileLimit
578
+ ) );
579
+ }
580
+
581
+ /**
582
+ * @param string $path
583
+ * @return array|mixed|string
584
+ */
585
+ public function media( $path = '' ) {
586
+
587
+ $url = self::API_URL . self::API_VERSION_URL . 'media/' . $this->root . '/' . $path;
588
+
589
+ return $this->request( $url );
590
+ }
591
+
592
+ /**
593
+ * @param $path
594
+ * @return array|mixed|string
595
+ */
596
+ public function fileopsDelete( $path ) {
597
+
598
+ $url = self::API_URL . self::API_VERSION_URL . 'fileops/delete';
599
+
600
+ return $this->request( $url, array(
601
+ 'path' => '/' . $path,
602
+ 'root' => $this->root
603
+ ) );
604
+ }
605
+
606
+ public function oAuthAuthorize( ) {
607
+
608
+ return self::API_WWW_URL . self::API_VERSION_URL . 'oauth2/authorize?response_type=code&client_id=' . $this->oauth_app_key;
609
+ }
610
+
611
+
612
+ public function oAuthToken( $code ) {
613
+
614
+ $url = self::API_URL . self::API_VERSION_URL . 'oauth2/token';
615
+
616
+ return $this->request( $url, array(
617
+ 'code' => trim( $code ),
618
+ 'grant_type' => 'authorization_code',
619
+ 'client_id' => $this->oauth_app_key,
620
+ 'client_secret' => $this->oauth_app_secret
621
+ ), 'POST' );
622
+
623
+ }
624
+
625
+
626
+ /**
627
+ * @param $url
628
+ * @param array $args
629
+ * @param string $method
630
+ * @param string $data
631
+ * @param bool $echo
632
+ *
633
+ * @throws BackWPup_Destination_Dropbox_API_Exception
634
+ * @internal param null $file
635
+ * @return array|mixed|string
636
+ */
637
+ private function request( $url, $args = array(), $method = 'GET', $data = '', $echo = FALSE ) {
638
+
639
+ /* Header*/
640
+ // oAuth 2
641
+ if ( ! empty( $this->oauth_token[ 'access_token' ] ) && ! empty( $this->oauth_token[ 'token_type' ] ) && strtolower( $this->oauth_token[ 'token_type' ] ) == 'bearer' )
642
+ $headers[ ] = 'Authorization: Bearer ' . $this->oauth_token[ 'access_token' ] ;
643
+ // oAuth 1
644
+ elseif ( ! empty( $this->oauth_token[ 'access_token' ] ) && ! empty( $this->oauth_token[ 'oauth_token_secret' ] ) )
645
+ $headers[ ] = 'Authorization: OAuth oauth_version="1.0", oauth_signature_method="PLAINTEXT", oauth_consumer_key="' . $this->oauth_app_key . '", oauth_token="' . $this->oauth_token[ 'access_token' ] . '", oauth_signature="' . $this->oauth_app_secret . '&' . $this->oauth_token[ 'oauth_token_secret' ] . '"';
646
+
647
+ $headers[ ] = 'Expect:';
648
+
649
+ /* Build cURL Request */
650
+ $ch = curl_init();
651
+ if ( $method == 'POST' ) {
652
+ curl_setopt( $ch, CURLOPT_POST, TRUE );
653
+ curl_setopt( $ch, CURLOPT_POSTFIELDS, $args );
654
+ curl_setopt( $ch, CURLOPT_URL, $url );
655
+ }
656
+ elseif ( $method == 'PUT' ) {
657
+ curl_setopt( $ch, CURLOPT_CUSTOMREQUEST, 'PUT' );
658
+ curl_setopt( $ch, CURLOPT_POSTFIELDS, $data );
659
+ $headers[ ] = 'Content-Type: application/octet-stream';
660
+ $args = ( is_array( $args ) ) ? '?' . http_build_query( $args, '', '&' ) : $args;
661
+ curl_setopt( $ch, CURLOPT_URL, $url . $args );
662
+ }
663
+ else {
664
+ curl_setopt( $ch, CURLOPT_BINARYTRANSFER, TRUE );
665
+ $args = ( is_array( $args ) ) ? '?' . http_build_query( $args, '', '&' ) : $args;
666
+ curl_setopt( $ch, CURLOPT_URL, $url . $args );
667
+ }
668
+ curl_setopt( $ch, CURLOPT_USERAGENT, BackWPup::get_plugin_data( 'User-Agent' ) );
669
+ curl_setopt( $ch, CURLOPT_RETURNTRANSFER, TRUE );
670
+ if ( BackWPup::get_plugin_data( 'cacert' ) ) {
671
+ curl_setopt( $ch, CURLOPT_SSLVERSION, 1 );
672
+ curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, TRUE );
673
+ $curl_version = curl_version();
674
+ if ( strstr( $curl_version[ 'ssl_version' ], 'NSS/' ) === FALSE ) {
675
+ curl_setopt( $ch, CURLOPT_SSL_CIPHER_LIST,
676
+ 'ECDHE-RSA-AES256-GCM-SHA384:'.
677
+ 'ECDHE-RSA-AES128-GCM-SHA256:'.
678
+ 'ECDHE-RSA-AES256-SHA384:'.
679
+ 'ECDHE-RSA-AES128-SHA256:'.
680
+ 'ECDHE-RSA-AES256-SHA:'.
681
+ 'ECDHE-RSA-AES128-SHA:'.
682
+ 'ECDHE-RSA-RC4-SHA:'.
683
+ 'DHE-RSA-AES256-GCM-SHA384:'.
684
+ 'DHE-RSA-AES128-GCM-SHA256:'.
685
+ 'DHE-RSA-AES256-SHA256:'.
686
+ 'DHE-RSA-AES128-SHA256:'.
687
+ 'DHE-RSA-AES256-SHA:'.
688
+ 'DHE-RSA-AES128-SHA:'.
689
+ 'AES256-GCM-SHA384:'.
690
+ 'AES128-GCM-SHA256:'.
691
+ 'AES256-SHA256:'.
692
+ 'AES128-SHA256:'.
693
+ 'AES256-SHA:'.
694
+ 'AES128-SHA'
695
+ );
696
+ }
697
+ if ( defined( 'CURLOPT_PROTOCOLS' ) )
698
+ curl_setopt( $ch, CURLOPT_PROTOCOLS, CURLPROTO_HTTPS );
699
+ if ( defined( 'CURLOPT_REDIR_PROTOCOLS' ) )
700
+ curl_setopt( $ch, CURLOPT_REDIR_PROTOCOLS, CURLPROTO_HTTPS );
701
+ curl_setopt( $ch, CURLOPT_CAINFO, BackWPup::get_plugin_data( 'cacert' ) );
702
+ curl_setopt( $ch, CURLOPT_CAPATH, dirname( BackWPup::get_plugin_data( 'cacert' ) ) );
703
+ } else {
704
+ curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );
705
+ }
706
+ curl_setopt( $ch, CURLOPT_HTTPHEADER, $headers );
707
+ $output = '';
708
+ if ( $echo ) {
709
+ echo curl_exec( $ch );
710
+ }
711
+ else {
712
+ curl_setopt( $ch, CURLOPT_HEADER, TRUE );
713
+ if ( 0 == curl_errno( $ch ) ) {
714
+ $responce = explode( "\r\n\r\n", curl_exec( $ch ), 2 );
715
+ if ( ! empty( $responce[ 1 ] ) )
716
+ $output = json_decode( $responce[ 1 ], TRUE );
717
+ }
718
+ }
719
+ $status = curl_getinfo( $ch );
720
+ if ( isset( $datafilefd ) && is_resource( $datafilefd ) )
721
+ fclose( $datafilefd );
722
+
723
+ if ( $status[ 'http_code' ] == 503 ) {
724
+ $wait = 0;
725
+ if ( preg_match( "/retry-after:(.*?)\r/i", $responce[ 0 ], $matches ) )
726
+ $wait = trim( $matches[ 1 ] );
727
+ //only wait if we get a retry-after header.
728
+ if ( ! empty( $wait ) ) {
729
+ trigger_error( sprintf( '(503) Your app is making too many requests and is being rate limited. Error 503 can be triggered on a per-app or per-user basis. Wait for %d seconds.', $wait ), E_USER_WARNING );
730
+ sleep( $wait );
731
+ } else {
732
+ throw new BackWPup_Destination_Dropbox_API_Exception( '(503) This indicates a transient server error.' );
733
+ }
734
+ //redo request
735
+ return $this->request( $url, $args, $method, $data, $echo );
736
+ }
737
+ elseif ( $status[ 'http_code' ] == 400 && $method == 'PUT' ) { //correct offset on chunk uploads
738
+ trigger_error( '(' . $status[ 'http_code' ] . ') False offset will corrected', E_USER_NOTICE );
739
+ return $output;
740
+ }
741
+ elseif ( $status[ 'http_code' ] == 404 && ! empty( $output[ 'error' ] )) {
742
+ trigger_error( '(' . $status[ 'http_code' ] . ') ' . $output[ 'error' ], E_USER_WARNING );
743
+
744
+ return FALSE;
745
+ }
746
+ elseif ( isset( $output[ 'error' ] ) || $status[ 'http_code' ] >= 300 || $status[ 'http_code' ] < 200 || curl_errno( $ch ) > 0 ) {
747
+ if ( isset( $output[ 'error' ] ) && is_string( $output[ 'error' ] ) ) $message = '(' . $status[ 'http_code' ] . ') ' . $output[ 'error' ];
748
+ elseif ( isset( $output[ 'error' ][ 'hash' ] ) && $output[ 'error' ][ 'hash' ] != '' ) $message = (string)'(' . $status[ 'http_code' ] . ') ' . $output[ 'error' ][ 'hash' ];
749
+ elseif ( 0 != curl_errno( $ch ) ) $message = '(' . curl_errno( $ch ) . ') ' . curl_error( $ch );
750
+ elseif ( $status[ 'http_code' ] == 304 ) $message = '(304) Folder contents have not changed (relies on hash parameter).';
751
+ elseif ( $status[ 'http_code' ] == 400 ) $message = '(400) Bad input parameter: ' . strip_tags( $responce[ 1 ] );
752
+ elseif ( $status[ 'http_code' ] == 401 ) $message = '(401) Bad or expired token. This can happen if the user or Dropbox revoked or expired an access token. To fix, you should re-authenticate the user.';
753
+ elseif ( $status[ 'http_code' ] == 403 ) $message = '(403) Bad OAuth request (wrong consumer key, bad nonce, expired timestamp...). Unfortunately, re-authenticating the user won\'t help here.';
754
+ elseif ( $status[ 'http_code' ] == 404 ) $message = '(404) File or folder not found at the specified path.';
755
+ elseif ( $status[ 'http_code' ] == 405 ) $message = '(405) Request method not expected (generally should be GET or POST).';
756
+ elseif ( $status[ 'http_code' ] == 406 ) $message = '(406) There are too many file entries to return.';
757
+ elseif ( $status[ 'http_code' ] == 411 ) $message = '(411) Missing Content-Length header (this endpoint doesn\'t support HTTP chunked transfer encoding).';
758
+ elseif ( $status[ 'http_code' ] == 415 ) $message = '(415) The image is invalid and cannot be converted to a thumbnail.';
759
+ elseif ( $status[ 'http_code' ] == 429 ) $message = '(429) Your app is making too many requests and is being rate limited. 429s can trigger on a per-app or per-user basis.';
760
+ elseif ( $status[ 'http_code' ] == 507 ) $message = '(507) User is over Dropbox storage quota.';
761
+ else $message = '(' . $status[ 'http_code' ] . ') Invalid response.';
762
+ throw new BackWPup_Destination_Dropbox_API_Exception( $message );
763
+ }
764
+ else {
765
+ curl_close( $ch );
766
+ if ( ! is_array( $output ) )
767
+ return $responce[ 1 ];
768
+ else
769
+ return $output;
770
+ }
771
+ }
772
+
773
+ /**
774
+ * @param $path
775
+ *
776
+ * @return mixed
777
+ */
778
+ private function encode_path( $path ) {
779
+
780
+ $path = preg_replace( '#/+#', '/', trim( $path, '/' ) );
781
+ $path = str_replace( '%2F', '/', rawurlencode( $path ) );
782
+
783
+ return $path;
784
+ }
785
+ }
786
+
787
+ /**
788
+ *
789
+ */
790
+ class BackWPup_Destination_Dropbox_API_Exception extends Exception {
791
+
792
+ }
inc/class-destination-s3-v1.php CHANGED
@@ -1,596 +1,596 @@
1
- <?php
2
- // Amazon S3 SDK v1.6.2
3
- // http://aws.amazon.com/de/sdkforphp/
4
- // https://github.com/amazonwebservices/aws-sdk-for-php
5
- if ( ! defined( 'E_USER_DEPRECATED') )
6
- define( 'E_USER_DEPRECATED', 16384 );
7
-
8
- /**
9
- * Documentation: http://docs.amazonwebservices.com/aws-sdk-php-2/latest/class-Aws.S3.S3Client.html
10
- */
11
- class BackWPup_Destination_S3_V1 extends BackWPup_Destinations {
12
-
13
- /**
14
- * @param $s3region
15
- * @param string $s3base_url
16
- * @return string
17
- */
18
- protected function get_s3_base_url( $s3region, $s3base_url = '' ) {
19
-
20
- if ( ! empty( $s3base_url ) )
21
- return $s3base_url;
22
-
23
- switch ( $s3region ) {
24
- case 'us-east-1':
25
- return 'https://s3.amazonaws.com';
26
- case 'us-west-1':
27
- return 'https://s3-us-west-1.amazonaws.com';
28
- case 'us-west-2':
29
- return 'https://s3-us-west-2.amazonaws.com';
30
- case 'eu-west-1':
31
- return 'https://s3-eu-west-1.amazonaws.com';
32
- case 'eu-central-1':
33
- return 'https://s3-eu-central-1.amazonaws.com';
34
- case 'ap-northeast-1':
35
- return 'https://s3-ap-northeast-1.amazonaws.com';
36
- case 'ap-southeast-1':
37
- return 'https://s3-ap-southeast-1.amazonaws.com';
38
- case 'ap-southeast-2':
39
- return 'https://s3-ap-southeast-2.amazonaws.com';
40
- case 'sa-east-1':
41
- return 'https://s3-sa-east-1.amazonaws.com';
42
- case 'cn-north-1':
43
- return 'https://cn-north-1.amazonaws.com';
44
- case 'google-storage':
45
- return 'https://storage.googleapis.com';
46
- case 'dreamhost':
47
- return 'https://objects.dreamhost.com';
48
- case 'greenqloud':
49
- return 'http://s.greenqloud.com';
50
- default:
51
- return '';
52
- }
53
-
54
- }
55
-
56
- /**
57
- * @return array
58
- */
59
- public function option_defaults() {
60
-
61
- return array( 's3accesskey' => '', 's3secretkey' => '', 's3bucket' => '', 's3region' => 'us-east-1', 's3base_url' => '', 's3ssencrypt' => '', 's3storageclass' => '', 's3dir' => trailingslashit( sanitize_file_name( get_bloginfo( 'name' ) ) ), 's3maxbackups' => 15, 's3syncnodelete' => TRUE );
62
- }
63
-
64
-
65
- /**
66
- * @param $jobid
67
- */
68
- public function edit_tab( $jobid ) {
69
-
70
- ?>
71
- <h3 class="title"><?php _e( 'S3 Service', 'backwpup' ) ?></h3>
72
- <p></p>
73
- <table class="form-table">
74
- <tr>
75
- <th scope="row"><label for="s3region"><?php _e( 'Select a S3 service', 'backwpup' ) ?></label></th>
76
- <td>
77
- <select name="s3region" id="s3region" title="<?php _e( 'Amazon S3 Region', 'backwpup' ); ?>">
78
- <option value="us-east-1" <?php selected( 'us-east-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: US Standard', 'backwpup' ); ?></option>
79
- <option value="us-west-1" <?php selected( 'us-west-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: US West (Northern California)', 'backwpup' ); ?></option>
80
- <option value="us-west-2" <?php selected( 'us-west-2', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: US West (Oregon)', 'backwpup' ); ?></option>
81
- <option value="eu-west-1" <?php selected( 'eu-west-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: EU (Ireland)', 'backwpup' ); ?></option>
82
- <option value="eu-central-1" <?php selected( 'eu-central-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: EU (Germany)', 'backwpup' ); ?></option>
83
- <option value="ap-northeast-1" <?php selected( 'ap-northeast-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: Asia Pacific (Tokyo)', 'backwpup' ); ?></option>
84
- <option value="ap-southeast-1" <?php selected( 'ap-southeast-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: Asia Pacific (Singapore)', 'backwpup' ); ?></option>
85
- <option value="ap-southeast-2" <?php selected( 'ap-southeast-2', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: Asia Pacific (Sydney)', 'backwpup' ); ?></option>
86
- <option value="sa-east-1" <?php selected( 'sa-east-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: South America (Sao Paulo)', 'backwpup' ); ?></option>
87
- <option value="cn-north-1" <?php selected( 'cn-north-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: China (Beijing)', 'backwpup' ); ?></option>
88
- <option value="google-storage" <?php selected( 'google-storage', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Google Storage (Interoperable Access)', 'backwpup' ); ?></option>
89
- <option value="dreamhost" <?php selected( 'dreamhost', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Dream Host Cloud Storage', 'backwpup' ); ?></option>
90
- <option value="greenqloud" <?php selected( 'greenqloud', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'GreenQloud Storage Qloud', 'backwpup' ); ?></option>
91
- </select>
92
- </td>
93
- </tr>
94
- <tr>
95
- <th scope="row"><label for="s3base_url"><?php _e( 'Or a S3 Server URL', 'backwpup' ) ?></label></th>
96
- <td>
97
- <input id="s3base_url" name="s3base_url" type="text" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3base_url' ) );?>" class="regular-text" autocomplete="off" />
98
- </td>
99
- </tr>
100
- </table>
101
-
102
- <h3 class="title"><?php _e( 'S3 Access Keys', 'backwpup' ); ?></h3>
103
- <p></p>
104
- <table class="form-table">
105
- <tr>
106
- <th scope="row"><label for="s3accesskey"><?php _e( 'Access Key', 'backwpup' ); ?></label></th>
107
- <td>
108
- <input id="s3accesskey" name="s3accesskey" type="text"
109
- value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3accesskey' ) );?>" class="regular-text" autocomplete="off" />
110
- </td>
111
- </tr>
112
- <tr>
113
- <th scope="row"><label for="s3secretkey"><?php _e( 'Secret Key', 'backwpup' ); ?></label></th>
114
- <td>
115
- <input id="s3secretkey" name="s3secretkey" type="password"
116
- value="<?php echo esc_attr( BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 's3secretkey' ) ) ); ?>" class="regular-text" autocomplete="off" />
117
- </td>
118
- </tr>
119
- </table>
120
-
121
- <h3 class="title"><?php _e( 'S3 Bucket', 'backwpup' ); ?></h3>
122
- <p></p>
123
- <table class="form-table">
124
- <tr>
125
- <th scope="row"><label for="s3bucketselected"><?php _e( 'Bucket selection', 'backwpup' ); ?></label></th>
126
- <td>
127
- <input id="s3bucketselected" name="s3bucketselected" type="hidden" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3bucket' ) ); ?>" />
128
- <?php if ( BackWPup_Option::get( $jobid, 's3accesskey' ) && BackWPup_Option::get( $jobid, 's3secretkey' ) ) $this->edit_ajax( array(
129
- 's3accesskey' => BackWPup_Option::get( $jobid, 's3accesskey' ),
130
- 's3secretkey' => BackWPup_Encryption::decrypt(BackWPup_Option::get( $jobid, 's3secretkey' ) ),
131
- 's3bucketselected' => BackWPup_Option::get( $jobid, 's3bucket' ),
132
- 's3base_url' => BackWPup_Option::get( $jobid, 's3base_url' ),
133
- 's3region' => BackWPup_Option::get( $jobid, 's3region' )
134
- ) ); ?>
135
- </td>
136
- </tr>
137
- <tr>
138
- <th scope="row"><label for="s3newbucket"><?php _e( 'Create a new bucket', 'backwpup' ); ?></label></th>
139
- <td>
140
- <input id="s3newbucket" name="s3newbucket" type="text" value="" class="small-text" autocomplete="off" />
141
- </td>
142
- </tr>
143
- </table>
144
-
145
- <h3 class="title"><?php _e( 'S3 Backup settings', 'backwpup' ); ?></h3>
146
- <p></p>
147
- <table class="form-table">
148
- <tr>
149
- <th scope="row"><label for="ids3dir"><?php _e( 'Folder in bucket', 'backwpup' ); ?></label></th>
150
- <td>
151
- <input id="ids3dir" name="s3dir" type="text" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3dir' ) ); ?>" class="regular-text" />
152
- </td>
153
- </tr>
154
- <tr>
155
- <th scope="row"><?php _e( 'File deletion', 'backwpup' ); ?></th>
156
- <td>
157
- <?php
158
- if ( BackWPup_Option::get( $jobid, 'backuptype' ) == 'archive' ) {
159
- ?>
160
- <label for="ids3maxbackups"><input id="ids3maxbackups" name="s3maxbackups" type="text" size="3" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3maxbackups' ) ); ?>" class="small-text help-tip" title="<?php esc_attr_e( 'Oldest files will be deleted first. 0 = no deletion', 'backwpup' ); ?>" />&nbsp;
161
- <?php _e( 'Number of files to keep in folder.', 'backwpup' ); ?></label>
162
- <?php } else { ?>
163
- <label for="ids3syncnodelete"><input class="checkbox" value="1"
164
- type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 's3syncnodelete' ), TRUE ); ?>
165
- name="s3syncnodelete" id="ids3syncnodelete" /> <?php _e( 'Do not delete files while syncing to destination!', 'backwpup' ); ?></label>
166
- <?php } ?>
167
- </td>
168
- </tr>
169
- </table>
170
-
171
- <h3 class="title"><?php _e( 'Amazon specific settings', 'backwpup' ); ?></h3>
172
- <p></p>
173
- <table class="form-table">
174
- <tr>
175
- <th scope="row"><label for="ids3storageclass"><?php _e( 'Amazon: Storage Class', 'backwpup' ); ?></label></th>
176
- <td>
177
- <select name="s3storageclass" id="ids3storageclass" title="<?php _e( 'Amazon: Storage Class', 'backwpup' ); ?>">
178
- <option value="" <?php selected( 'us-east-1', BackWPup_Option::get( $jobid, 's3storageclass' ), TRUE ) ?>><?php _e( 'none', 'backwpup' ); ?></option>
179
- <option value="REDUCED_REDUNDANCY" <?php selected( 'REDUCED_REDUNDANCY', BackWPup_Option::get( $jobid, 's3storageclass' ), TRUE ) ?>><?php _e( 'Reduced Redundancy', 'backwpup' ); ?></option>
180
- </select>
181
- </td>
182
- </tr>
183
- <tr>
184
- <th scope="row"><label for="ids3ssencrypt"><?php _e( 'Server side encryption', 'backwpup' ); ?></label></th>
185
- <td>
186
- <input class="checkbox" value="AES256"
187
- type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 's3ssencrypt' ), 'AES256' ); ?>
188
- name="s3ssencrypt" id="ids3ssencrypt" /> <?php _e( 'Save files encrypted (AES256) on server.', 'backwpup' ); ?>
189
- </td>
190
- </tr>
191
- </table>
192
-
193
- <?php
194
- }
195
-
196
-
197
- /**
198
- * @param $jobid
199
- * @return string
200
- */
201
- public function edit_form_post_save( $jobid ) {
202
-
203
- BackWPup_Option::update( $jobid, 's3accesskey', isset( $_POST[ 's3accesskey' ] ) ? $_POST[ 's3accesskey' ] : '' );
204
- BackWPup_Option::update( $jobid, 's3secretkey', isset( $_POST[ 's3secretkey' ] ) ? BackWPup_Encryption::encrypt( $_POST[ 's3secretkey' ] ) : '' );
205
- BackWPup_Option::update( $jobid, 's3base_url', isset( $_POST[ 's3base_url' ] ) ? esc_url_raw( $_POST[ 's3base_url' ] ) : '' );
206
- BackWPup_Option::update( $jobid, 's3region', isset( $_POST[ 's3region' ] ) ? $_POST[ 's3region' ] : '' );
207
- BackWPup_Option::update( $jobid, 's3storageclass', isset( $_POST[ 's3storageclass' ] ) ? $_POST[ 's3storageclass' ] : '' );
208
- BackWPup_Option::update( $jobid, 's3ssencrypt', ( isset( $_POST[ 's3ssencrypt' ] ) && $_POST[ 's3ssencrypt' ] == 'AES256' ) ? 'AES256' : '' );
209
- BackWPup_Option::update( $jobid, 's3bucket', isset( $_POST[ 's3bucket' ] ) ? $_POST[ 's3bucket' ] : '' );
210
-
211
- $_POST[ 's3dir' ] = trailingslashit( str_replace( '//', '/', str_replace( '\\', '/', trim( stripslashes( $_POST[ 's3dir' ] ) ) ) ) );
212
- if ( substr( $_POST[ 's3dir' ], 0, 1 ) == '/' )
213
- $_POST[ 's3dir' ] = substr( $_POST[ 's3dir' ], 1 );
214
- if ( $_POST[ 's3dir' ] == '/' )
215
- $_POST[ 's3dir' ] = '';
216
- BackWPup_Option::update( $jobid, 's3dir', $_POST[ 's3dir' ] );
217
-
218
- BackWPup_Option::update( $jobid, 's3maxbackups', isset( $_POST[ 's3maxbackups' ] ) ? (int)$_POST[ 's3maxbackups' ] : 0 );
219
- BackWPup_Option::update( $jobid, 's3syncnodelete', ( isset( $_POST[ 's3syncnodelete' ] ) && $_POST[ 's3syncnodelete' ] == 1 ) ? TRUE : FALSE );
220
- BackWPup_Option::update( $jobid, 's3multipart', ( isset( $_POST[ 's3multipart' ] ) && $_POST[ 's3multipart' ] == 1 ) ? TRUE : FALSE );
221
-
222
- //create new bucket
223
- if ( !empty( $_POST[ 's3newbucket' ] ) ) {
224
- try {
225
- $s3 = new AmazonS3( array( 'key' => $_POST[ 's3accesskey' ],
226
- 'secret' => BackWPup_Encryption::decrypt( $_POST[ 's3secretkey' ] ),
227
- 'certificate_authority' => TRUE ) );
228
- $base_url = $this->get_s3_base_url( $_POST[ 's3region' ], $_POST[ 's3base_url' ] );
229
- if ( stristr( $base_url, 'amazonaws.com' ) ) {
230
- $s3->set_region( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
231
- } else {
232
- $s3->set_hostname( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
233
- $s3->allow_hostname_override( FALSE );
234
- if ( substr( $base_url, -1 ) == '/')
235
- $s3->enable_path_style( TRUE );
236
- }
237
- if ( stristr( $base_url, 'http://' ) )
238
- $s3->disable_ssl();
239
-
240
- // set bucket creation region
241
- if ( $_POST[ 's3region' ] == 'google-storage' || $_POST[ 's3region' ] == 'hosteurope' )
242
- $region = 'EU';
243
- else
244
- $region = str_replace( array( 'http://', 'https://' ), '', $base_url );
245
-
246
- $bucket = $s3->create_bucket( $_POST[ 's3newbucket' ], $region, 'private' );
247
-
248
- if ( $bucket->status == 200 )
249
- BackWPup_Admin::message( sprintf( __( 'Bucket %1$s created.','backwpup'), $_POST[ 's3newbucket' ] ) );
250
- else
251
- BackWPup_Admin::message( sprintf( __( 'Bucket %s could not be created.','backwpup'), $_POST[ 's3newbucket' ] ), TRUE );
252
-
253
- }
254
- catch ( Exception $e ) {
255
- BackWPup_Admin::message( $e->getMessage(), TRUE );
256
- }
257
- BackWPup_Option::update( $jobid, 's3bucket', $_POST[ 's3newbucket' ] );
258
- }
259
- }
260
-
261
- /**
262
- * @param $jobdest
263
- * @param $backupfile
264
- */
265
- public function file_delete( $jobdest, $backupfile ) {
266
-
267
- $files = get_site_transient( 'backwpup_'. strtolower( $jobdest ), array() );
268
- list( $jobid, $dest ) = explode( '_', $jobdest );
269
-
270
- if ( BackWPup_Option::get( $jobid, 's3accesskey' ) && BackWPup_Option::get( $jobid, 's3secretkey' ) && BackWPup_Option::get( $jobid, 's3bucket' ) ) {
271
- try {
272
- $s3 = new AmazonS3( array( 'key' => BackWPup_Option::get( $jobid, 's3accesskey' ),
273
- 'secret' => BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 's3secretkey' ) ),
274
- 'certificate_authority' => TRUE ) );
275
- $base_url = $this->get_s3_base_url( BackWPup_Option::get( $jobid, 's3region' ), BackWPup_Option::get( $jobid, 's3base_url' ) );
276
- if ( stristr( $base_url, 'amazonaws.com' ) ) {
277
- $s3->set_region( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
278
- } else {
279
- $s3->set_hostname( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
280
- $s3->allow_hostname_override( FALSE );
281
- if ( substr( $base_url, -1 ) == '/')
282
- $s3->enable_path_style( TRUE );
283
- }
284
- if ( stristr( $base_url, 'http://' ) )
285
- $s3->disable_ssl();
286
-
287
- $s3->delete_object( BackWPup_Option::get( $jobid, 's3bucket' ), $backupfile );
288
- //update file list
289
- foreach ( $files as $key => $file ) {
290
- if ( is_array( $file ) && $file[ 'file' ] == $backupfile )
291
- unset( $files[ $key ] );
292
- }
293
- unset( $s3 );
294
- }
295
- catch ( Exception $e ) {
296
- BackWPup_Admin::message( sprintf( __('S3 Service API: %s','backwpup'), $e->getMessage() ), TRUE );
297
- }
298
- }
299
-
300
- set_site_transient( 'backwpup_'. strtolower( $jobdest ), $files, 60 * 60 * 24 * 7 );
301
- }
302
-
303
- /**
304
- * @param $jobid
305
- * @param $get_file
306
- */
307
- public function file_download( $jobid, $get_file ) {
308
-
309
- try {
310
- $s3 = new AmazonS3( array( 'key' => BackWPup_Option::get( $jobid, 's3accesskey' ),
311
- 'secret' => BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 's3secretkey' ) ),
312
- 'certificate_authority' => TRUE ) );
313
- $base_url = $this->get_s3_base_url( BackWPup_Option::get( $jobid, 's3region' ), BackWPup_Option::get( $jobid, 's3base_url' ) );
314
- if ( stristr( $base_url, 'amazonaws.com' ) ) {
315
- $s3->set_region( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
316
- } else {
317
- $s3->set_hostname( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
318
- $s3->allow_hostname_override( FALSE );
319
- if ( substr( $base_url, -1 ) == '/')
320
- $s3->enable_path_style( TRUE );
321
- }
322
- if ( stristr( $base_url, 'http://' ) )
323
- $s3->disable_ssl();
324
-
325
- $s3file = $s3->get_object( BackWPup_Option::get( $jobid, 's3bucket' ), $get_file );
326
- }
327
- catch ( Exception $e ) {
328
- die( $e->getMessage() );
329
- }
330
-
331
- if ( $s3file->status==200 ) {
332
- header( "Pragma: public" );
333
- header( "Expires: 0" );
334
- header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
335
- header( "Content-Type: application/octet-stream" );
336
- header( "Content-Disposition: attachment; filename=" . basename( $get_file ) . ";" );
337
- header( "Content-Transfer-Encoding: binary" );
338
- header( "Content-Length: " . $s3file->header->_info->size_download );
339
- @set_time_limit( 300 );
340
- echo $s3file->body;
341
- die();
342
- }
343
- }
344
-
345
- /**
346
- * @param $jobdest
347
- * @return mixed
348
- */
349
- public function file_get_list( $jobdest ) {
350
-
351
- return get_site_transient( 'backwpup_' . strtolower( $jobdest ) );
352
- }
353
-
354
- /**
355
- * @param $job_object
356
- * @return bool
357
- */
358
- public function job_run_archive( &$job_object ) {
359
-
360
- $job_object->substeps_todo = 2 + $job_object->backup_filesize;
361
- $job_object->log( sprintf( __( '%d. Trying to send backup file to S3 Service&#160;&hellip;', 'backwpup' ), $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] ), E_USER_NOTICE );
362
-
363
- try {
364
-
365
- $s3 = new AmazonS3( array( 'key' => $job_object->job[ 's3accesskey' ],
366
- 'secret' => BackWPup_Encryption::decrypt( $job_object->job[ 's3secretkey' ] ),
367
- 'certificate_authority' => TRUE ) );
368
- $base_url = $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] );
369
- if ( stristr( $base_url, 'amazonaws.com' ) ) {
370
- $s3->set_region( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
371
- } else {
372
- $s3->set_hostname( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
373
- $s3->allow_hostname_override( FALSE );
374
- if ( substr( $base_url, -1 ) == '/')
375
- $s3->enable_path_style( TRUE );
376
- }
377
- if ( stristr( $base_url, 'http://' ) )
378
- $s3->disable_ssl();
379
-
380
-
381
- if ( $s3->if_bucket_exists( $job_object->job[ 's3bucket' ] ) ) {
382
- $job_object->log( sprintf( __( 'Connected to S3 Bucket "%1$s" in %2$s', 'backwpup' ), $job_object->job[ 's3bucket' ], $base_url ), E_USER_NOTICE );
383
- }
384
- else {
385
- $job_object->log( sprintf( __( 'S3 Bucket "%s" does not exist!', 'backwpup' ), $job_object->job[ 's3bucket' ] ), E_USER_ERROR );
386
-
387
- return TRUE;
388
- }
389
-
390
- //transfer file to S3
391
- $job_object->log( __( 'Starting upload to S3 Service&#160;&hellip;', 'backwpup' ), E_USER_NOTICE );
392
-
393
- //Transfer Backup to S3
394
- if ( $job_object->job[ 's3storageclass' ] == 'REDUCED_REDUNDANCY' ) //set reduced redundancy or not
395
- $storage=AmazonS3::STORAGE_REDUCED;
396
- else
397
- $storage=AmazonS3::STORAGE_STANDARD;
398
-
399
- if ( empty( $job_object->job[ 's3ssencrypt' ] ) )
400
- $job_object->job[ 's3ssencrypt' ] = NULL;
401
-
402
- //set progress bar
403
- $s3->register_streaming_read_callback( array( $job_object, 'curl_read_callback' ) );
404
-
405
- $result = $s3->create_object( $job_object->job[ 's3bucket' ], $job_object->job[ 's3dir' ] . $job_object->backup_file, array( 'fileUpload' => $job_object->backup_folder . $job_object->backup_file, 'acl' => AmazonS3::ACL_PRIVATE, 'storage' => $storage, 'encryption' => $job_object->job[ 's3ssencrypt' ] ) );
406
-
407
- if ( $result->status >= 200 and $result->status < 300 ) {
408
- $job_object->substeps_done = 1 + $job_object->backup_filesize;
409
- $job_object->log( sprintf( __( 'Backup transferred to %s.', 'backwpup' ), $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ). '/' .$job_object->job[ 's3bucket' ] . '/' . $job_object->job[ 's3dir' ] . $job_object->backup_file ), E_USER_NOTICE );
410
- if ( ! empty( $job_object->job[ 'jobid' ] ) )
411
- BackWPup_Option::update( $job_object->job[ 'jobid' ], 'lastbackupdownloadurl', network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=downloads3&file=' . $job_object->job[ 's3dir' ] . $job_object->backup_file . '&jobid=' . $job_object->job[ 'jobid' ] );
412
- }
413
- else {
414
- $job_object->log( sprintf( __( 'Cannot transfer backup to S3! (%1$d) %2$s', 'backwpup' ), $result->status, $result->body ), E_USER_ERROR );
415
- }
416
- }
417
- catch ( Exception $e ) {
418
- $job_object->log( E_USER_ERROR, sprintf( __( 'S3 Service API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
419
-
420
- return FALSE;
421
- }
422
-
423
- try {
424
- $backupfilelist = array();
425
- $filecounter = 0;
426
- $files = array();
427
- $objects = $s3->list_objects( $job_object->job[ 's3bucket' ], array( 'prefix' => $job_object->job[ 's3dir' ] ) );
428
- if ( is_object( $objects ) ) {
429
- foreach ( $objects->body->Contents as $object ) {
430
- $file = basename( (string) $object->Key );
431
- $changetime = strtotime( (string) $object->LastModified ) + ( get_option( 'gmt_offset' ) * 3600 );
432
- if ( $job_object->is_backup_archive( $file ) )
433
- $backupfilelist[ $changetime ] = $file;
434
- $files[ $filecounter ][ 'folder' ] = $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ). '/' .$job_object->job[ 's3bucket' ] . '/' . dirname( (string) $object->Key );
435
- $files[ $filecounter ][ 'file' ] = (string) $object->Key;
436
- $files[ $filecounter ][ 'filename' ] = basename( $object->Key );
437
- $files[ $filecounter ][ 'downloadurl' ] = network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=downloads3&file=' . (string) $object->Key . '&jobid=' . $job_object->job[ 'jobid' ];
438
- $files[ $filecounter ][ 'filesize' ] = (int) $object->Size;
439
- $files[ $filecounter ][ 'time' ] = $changetime;
440
- $filecounter ++;
441
- }
442
- }
443
- if ( $job_object->job[ 's3maxbackups' ] > 0 && is_object( $s3 ) ) { //Delete old backups
444
- if ( count( $backupfilelist ) > $job_object->job[ 's3maxbackups' ] ) {
445
- ksort( $backupfilelist );
446
- $numdeltefiles = 0;
447
- while ( $file = array_shift( $backupfilelist ) ) {
448
- if ( count( $backupfilelist ) < $job_object->job[ 's3maxbackups' ] )
449
- break;
450
- //delete files on S3
451
- $delete_s3 = $s3->delete_object( $job_object->job[ 's3bucket' ], $job_object->job[ 's3dir' ] . $file );
452
- if ($delete_s3 ) {
453
- foreach ( $files as $key => $filedata ) {
454
- if ( $filedata[ 'file' ] == $job_object->job[ 's3dir' ] . $file )
455
- unset( $files[ $key ] );
456
- }
457
- $numdeltefiles ++;
458
- } else {
459
- $job_object->log( sprintf( __( 'Cannot delete backup from %s.', 'backwpup' ), $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ). '/' .$job_object->job[ 's3bucket' ] . '/' . $job_object->job[ 's3dir' ] . $file ), E_USER_ERROR );
460
- }
461
- }
462
- if ( $numdeltefiles > 0 )
463
- $job_object->log( sprintf( _n( 'One file deleted on S3 Bucket.', '%d files deleted on S3 Bucket', $numdeltefiles, 'backwpup' ), $numdeltefiles ), E_USER_NOTICE );
464
- }
465
- }
466
- set_site_transient( 'backwpup_' . $job_object->job[ 'jobid' ] . '_s3', $files, 60 * 60 * 24 * 7 );
467
- }
468
- catch ( Exception $e ) {
469
- $job_object->log( E_USER_ERROR, sprintf( __( 'S3 Service API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
470
-
471
- return FALSE;
472
- }
473
- $job_object->substeps_done = 2 + $job_object->backup_filesize;
474
-
475
- return TRUE;
476
- }
477
-
478
-
479
- /**
480
- * @param $job_object
481
- * @return bool
482
- */
483
- public function can_run( $job_object ) {
484
-
485
- if ( empty( $job_object->job[ 's3accesskey' ] ) )
486
- return FALSE;
487
-
488
- if ( empty( $job_object->job[ 's3secretkey' ] ) )
489
- return FALSE;
490
-
491
- if ( empty( $job_object->job[ 's3bucket' ] ) )
492
- return FALSE;
493
-
494
- return TRUE;
495
- }
496
-
497
- /**
498
- *
499
- */
500
- public function edit_inline_js() {
501
- //<script type="text/javascript">
502
- ?>
503
- function awsgetbucket() {
504
- var data = {
505
- action: 'backwpup_dest_s3',
506
- s3accesskey: $('input[name="s3accesskey"]').val(),
507
- s3secretkey: $('input[name="s3secretkey"]').val(),
508
- s3bucketselected: $('input[name="s3bucketselected"]').val(),
509
- s3base_url: $('input[name="s3base_url"]').val(),
510
- s3region: $('#s3region').val(),
511
- _ajax_nonce: $('#backwpupajaxnonce').val()
512
- };
513
- $.post(ajaxurl, data, function(response) {
514
- $('#s3bucketerror').remove();
515
- $('#s3bucket').remove();
516
- $('#s3bucketselected').after(response);
517
- });
518
- }
519
- $('input[name="s3accesskey"]').change(function() {awsgetbucket();});
520
- $('input[name="s3secretkey"]').change(function() {awsgetbucket();});
521
- $('input[name="s3base_url"]').change(function() {awsgetbucket();});
522
- $('#s3region').change(function() {awsgetbucket();});
523
- <?php
524
- }
525
-
526
- /**
527
- * @param string $args
528
- */
529
- public function edit_ajax( $args = '' ) {
530
-
531
- $error = '';
532
-
533
- if ( is_array( $args ) ) {
534
- $ajax = FALSE;
535
- }
536
- else {
537
- if ( ! current_user_can( 'backwpup_jobs_edit' ) )
538
- wp_die( -1 );
539
- check_ajax_referer( 'backwpup_ajax_nonce' );
540
- $args[ 's3accesskey' ] = $_POST[ 's3accesskey' ];
541
- $args[ 's3secretkey' ] = $_POST[ 's3secretkey' ];
542
- $args[ 's3bucketselected' ] = $_POST[ 's3bucketselected' ];
543
- $args[ 's3base_url' ] = $_POST[ 's3base_url' ];
544
- $args[ 's3region' ] = $_POST[ 's3region' ];
545
- $ajax = TRUE;
546
- }
547
- echo '<span id="s3bucketerror" style="color:red;">';
548
-
549
- if ( ! empty( $args[ 's3accesskey' ] ) && ! empty( $args[ 's3secretkey' ] ) ) {
550
- try {
551
- $s3 = new AmazonS3( array( 'key' => $args[ 's3accesskey' ],
552
- 'secret' => BackWPup_Encryption::decrypt( $args[ 's3secretkey' ] ),
553
- 'certificate_authority' => TRUE ) );
554
- $base_url = $this->get_s3_base_url( $args[ 's3region' ], $args[ 's3base_url' ] );
555
- if ( stristr( $base_url, 'amazonaws.com' ) ) {
556
- $s3->set_region( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
557
- } else {
558
- $s3->set_hostname( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
559
- $s3->allow_hostname_override( FALSE );
560
- if ( substr( $base_url, -1 ) == '/')
561
- $s3->enable_path_style( TRUE );
562
- }
563
- if ( stristr( $base_url, 'http://' ) )
564
- $s3->disable_ssl();
565
-
566
- $buckets = $s3->list_buckets();
567
- }
568
- catch ( Exception $e ) {
569
- $error = $e->getMessage();
570
- }
571
- }
572
-
573
- if ( empty( $args[ 's3accesskey' ] ) )
574
- _e( 'Missing access key!', 'backwpup' );
575
- elseif ( empty( $args[ 's3secretkey' ] ) )
576
- _e( 'Missing secret access key!', 'backwpup' );
577
- elseif ( ! empty( $error ) && $error == 'Access Denied' )
578
- echo '<input type="text" name="s3bucket" id="s3bucket" value="' . esc_attr( $args[ 's3bucketselected' ] ) . '" >';
579
- elseif ( ! empty( $error ) )
580
- echo esc_html( $error );
581
- elseif ( ! isset( $buckets ) || count( $buckets->body->Buckets->Bucket ) < 1 )
582
- _e( 'No bucket found!', 'backwpup' );
583
- echo '</span>';
584
-
585
- if ( ! empty( $buckets->body->Buckets->Bucket ) ) {
586
- echo '<select name="s3bucket" id="s3bucket">';
587
- foreach ( $buckets->body->Buckets->Bucket as $bucket ) {
588
- echo "<option " . selected( $args[ 's3bucketselected' ], esc_attr( $bucket->Name ), FALSE ) . ">" . esc_attr( $bucket->Name ) . "</option>";
589
- }
590
- echo '</select>';
591
- }
592
-
593
- if ( $ajax )
594
- die();
595
- }
596
- }
1
+ <?php
2
+ // Amazon S3 SDK v1.6.2
3
+ // http://aws.amazon.com/de/sdkforphp/
4
+ // https://github.com/amazonwebservices/aws-sdk-for-php
5
+ if ( ! defined( 'E_USER_DEPRECATED') )
6
+ define( 'E_USER_DEPRECATED', 16384 );
7
+
8
+ /**
9
+ * Documentation: http://docs.amazonwebservices.com/aws-sdk-php-2/latest/class-Aws.S3.S3Client.html
10
+ */
11
+ class BackWPup_Destination_S3_V1 extends BackWPup_Destinations {
12
+
13
+ /**
14
+ * @param $s3region
15
+ * @param string $s3base_url
16
+ * @return string
17
+ */
18
+ protected function get_s3_base_url( $s3region, $s3base_url = '' ) {
19
+
20
+ if ( ! empty( $s3base_url ) )
21
+ return $s3base_url;
22
+
23
+ switch ( $s3region ) {
24
+ case 'us-east-1':
25
+ return 'https://s3.amazonaws.com';
26
+ case 'us-west-1':
27
+ return 'https://s3-us-west-1.amazonaws.com';
28
+ case 'us-west-2':
29
+ return 'https://s3-us-west-2.amazonaws.com';
30
+ case 'eu-west-1':
31
+ return 'https://s3-eu-west-1.amazonaws.com';
32
+ case 'eu-central-1':
33
+ return 'https://s3-eu-central-1.amazonaws.com';
34
+ case 'ap-northeast-1':
35
+ return 'https://s3-ap-northeast-1.amazonaws.com';
36
+ case 'ap-southeast-1':
37
+ return 'https://s3-ap-southeast-1.amazonaws.com';
38
+ case 'ap-southeast-2':
39
+ return 'https://s3-ap-southeast-2.amazonaws.com';
40
+ case 'sa-east-1':
41
+ return 'https://s3-sa-east-1.amazonaws.com';
42
+ case 'cn-north-1':
43
+ return 'https://cn-north-1.amazonaws.com';
44
+ case 'google-storage':
45
+ return 'https://storage.googleapis.com';
46
+ case 'dreamhost':
47
+ return 'https://objects.dreamhost.com';
48
+ case 'greenqloud':
49
+ return 'http://s.greenqloud.com';
50
+ default:
51
+ return '';
52
+ }
53
+
54
+ }
55
+
56
+ /**
57
+ * @return array
58
+ */
59
+ public function option_defaults() {
60
+
61
+ return array( 's3accesskey' => '', 's3secretkey' => '', 's3bucket' => '', 's3region' => 'us-east-1', 's3base_url' => '', 's3ssencrypt' => '', 's3storageclass' => '', 's3dir' => trailingslashit( sanitize_file_name( get_bloginfo( 'name' ) ) ), 's3maxbackups' => 15, 's3syncnodelete' => TRUE );
62
+ }
63
+
64
+
65
+ /**
66
+ * @param $jobid
67
+ */
68
+ public function edit_tab( $jobid ) {
69
+
70
+ ?>
71
+ <h3 class="title"><?php _e( 'S3 Service', 'backwpup' ) ?></h3>
72
+ <p></p>
73
+ <table class="form-table">
74
+ <tr>
75
+ <th scope="row"><label for="s3region"><?php _e( 'Select a S3 service', 'backwpup' ) ?></label></th>
76
+ <td>
77
+ <select name="s3region" id="s3region" title="<?php _e( 'Amazon S3 Region', 'backwpup' ); ?>">
78
+ <option value="us-east-1" <?php selected( 'us-east-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: US Standard', 'backwpup' ); ?></option>
79
+ <option value="us-west-1" <?php selected( 'us-west-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: US West (Northern California)', 'backwpup' ); ?></option>
80
+ <option value="us-west-2" <?php selected( 'us-west-2', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: US West (Oregon)', 'backwpup' ); ?></option>
81
+ <option value="eu-west-1" <?php selected( 'eu-west-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: EU (Ireland)', 'backwpup' ); ?></option>
82
+ <option value="eu-central-1" <?php selected( 'eu-central-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: EU (Germany)', 'backwpup' ); ?></option>
83
+ <option value="ap-northeast-1" <?php selected( 'ap-northeast-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: Asia Pacific (Tokyo)', 'backwpup' ); ?></option>
84
+ <option value="ap-southeast-1" <?php selected( 'ap-southeast-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: Asia Pacific (Singapore)', 'backwpup' ); ?></option>
85
+ <option value="ap-southeast-2" <?php selected( 'ap-southeast-2', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: Asia Pacific (Sydney)', 'backwpup' ); ?></option>
86
+ <option value="sa-east-1" <?php selected( 'sa-east-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: South America (Sao Paulo)', 'backwpup' ); ?></option>
87
+ <option value="cn-north-1" <?php selected( 'cn-north-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: China (Beijing)', 'backwpup' ); ?></option>
88
+ <option value="google-storage" <?php selected( 'google-storage', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Google Storage (Interoperable Access)', 'backwpup' ); ?></option>
89
+ <option value="dreamhost" <?php selected( 'dreamhost', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Dream Host Cloud Storage', 'backwpup' ); ?></option>
90
+ <option value="greenqloud" <?php selected( 'greenqloud', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'GreenQloud Storage Qloud', 'backwpup' ); ?></option>
91
+ </select>
92
+ </td>
93
+ </tr>
94
+ <tr>
95
+ <th scope="row"><label for="s3base_url"><?php _e( 'Or a S3 Server URL', 'backwpup' ) ?></label></th>
96
+ <td>
97
+ <input id="s3base_url" name="s3base_url" type="text" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3base_url' ) );?>" class="regular-text" autocomplete="off" />
98
+ </td>
99
+ </tr>
100
+ </table>
101
+
102
+ <h3 class="title"><?php _e( 'S3 Access Keys', 'backwpup' ); ?></h3>
103
+ <p></p>
104
+ <table class="form-table">
105
+ <tr>
106
+ <th scope="row"><label for="s3accesskey"><?php _e( 'Access Key', 'backwpup' ); ?></label></th>
107
+ <td>
108
+ <input id="s3accesskey" name="s3accesskey" type="text"
109
+ value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3accesskey' ) );?>" class="regular-text" autocomplete="off" />
110
+ </td>
111
+ </tr>
112
+ <tr>
113
+ <th scope="row"><label for="s3secretkey"><?php _e( 'Secret Key', 'backwpup' ); ?></label></th>
114
+ <td>
115
+ <input id="s3secretkey" name="s3secretkey" type="password"
116
+ value="<?php echo esc_attr( BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 's3secretkey' ) ) ); ?>" class="regular-text" autocomplete="off" />
117
+ </td>
118
+ </tr>
119
+ </table>
120
+
121
+ <h3 class="title"><?php _e( 'S3 Bucket', 'backwpup' ); ?></h3>
122
+ <p></p>
123
+ <table class="form-table">
124
+ <tr>
125
+ <th scope="row"><label for="s3bucketselected"><?php _e( 'Bucket selection', 'backwpup' ); ?></label></th>
126
+ <td>
127
+ <input id="s3bucketselected" name="s3bucketselected" type="hidden" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3bucket' ) ); ?>" />
128
+ <?php if ( BackWPup_Option::get( $jobid, 's3accesskey' ) && BackWPup_Option::get( $jobid, 's3secretkey' ) ) $this->edit_ajax( array(
129
+ 's3accesskey' => BackWPup_Option::get( $jobid, 's3accesskey' ),
130
+ 's3secretkey' => BackWPup_Encryption::decrypt(BackWPup_Option::get( $jobid, 's3secretkey' ) ),
131
+ 's3bucketselected' => BackWPup_Option::get( $jobid, 's3bucket' ),
132
+ 's3base_url' => BackWPup_Option::get( $jobid, 's3base_url' ),
133
+ 's3region' => BackWPup_Option::get( $jobid, 's3region' )
134
+ ) ); ?>
135
+ </td>
136
+ </tr>
137
+ <tr>
138
+ <th scope="row"><label for="s3newbucket"><?php _e( 'Create a new bucket', 'backwpup' ); ?></label></th>
139
+ <td>
140
+ <input id="s3newbucket" name="s3newbucket" type="text" value="" class="small-text" autocomplete="off" />
141
+ </td>
142
+ </tr>
143
+ </table>
144
+
145
+ <h3 class="title"><?php _e( 'S3 Backup settings', 'backwpup' ); ?></h3>
146
+ <p></p>
147
+ <table class="form-table">
148
+ <tr>
149
+ <th scope="row"><label for="ids3dir"><?php _e( 'Folder in bucket', 'backwpup' ); ?></label></th>
150
+ <td>
151
+ <input id="ids3dir" name="s3dir" type="text" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3dir' ) ); ?>" class="regular-text" />
152
+ </td>
153
+ </tr>
154
+ <tr>
155
+ <th scope="row"><?php _e( 'File deletion', 'backwpup' ); ?></th>
156
+ <td>
157
+ <?php
158
+ if ( BackWPup_Option::get( $jobid, 'backuptype' ) == 'archive' ) {
159
+ ?>
160
+ <label for="ids3maxbackups"><input id="ids3maxbackups" name="s3maxbackups" type="text" size="3" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3maxbackups' ) ); ?>" class="small-text help-tip" title="<?php esc_attr_e( 'Oldest files will be deleted first. 0 = no deletion', 'backwpup' ); ?>" />&nbsp;
161
+ <?php _e( 'Number of files to keep in folder.', 'backwpup' ); ?></label>
162
+ <?php } else { ?>
163
+ <label for="ids3syncnodelete"><input class="checkbox" value="1"
164
+ type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 's3syncnodelete' ), TRUE ); ?>
165
+ name="s3syncnodelete" id="ids3syncnodelete" /> <?php _e( 'Do not delete files while syncing to destination!', 'backwpup' ); ?></label>
166
+ <?php } ?>
167
+ </td>
168
+ </tr>
169
+ </table>
170
+
171
+ <h3 class="title"><?php _e( 'Amazon specific settings', 'backwpup' ); ?></h3>
172
+ <p></p>
173
+ <table class="form-table">
174
+ <tr>
175
+ <th scope="row"><label for="ids3storageclass"><?php _e( 'Amazon: Storage Class', 'backwpup' ); ?></label></th>
176
+ <td>
177
+ <select name="s3storageclass" id="ids3storageclass" title="<?php _e( 'Amazon: Storage Class', 'backwpup' ); ?>">
178
+ <option value="" <?php selected( 'us-east-1', BackWPup_Option::get( $jobid, 's3storageclass' ), TRUE ) ?>><?php _e( 'none', 'backwpup' ); ?></option>
179
+ <option value="REDUCED_REDUNDANCY" <?php selected( 'REDUCED_REDUNDANCY', BackWPup_Option::get( $jobid, 's3storageclass' ), TRUE ) ?>><?php _e( 'Reduced Redundancy', 'backwpup' ); ?></option>
180
+ </select>
181
+ </td>
182
+ </tr>
183
+ <tr>
184
+ <th scope="row"><label for="ids3ssencrypt"><?php _e( 'Server side encryption', 'backwpup' ); ?></label></th>
185
+ <td>
186
+ <input class="checkbox" value="AES256"
187
+ type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 's3ssencrypt' ), 'AES256' ); ?>
188
+ name="s3ssencrypt" id="ids3ssencrypt" /> <?php _e( 'Save files encrypted (AES256) on server.', 'backwpup' ); ?>
189
+ </td>
190
+ </tr>
191
+ </table>
192
+
193
+ <?php
194
+ }
195
+
196
+
197
+ /**
198
+ * @param $jobid
199
+ * @return string
200
+ */
201
+ public function edit_form_post_save( $jobid ) {
202
+
203
+ BackWPup_Option::update( $jobid, 's3accesskey', isset( $_POST[ 's3accesskey' ] ) ? $_POST[ 's3accesskey' ] : '' );
204
+ BackWPup_Option::update( $jobid, 's3secretkey', isset( $_POST[ 's3secretkey' ] ) ? BackWPup_Encryption::encrypt( $_POST[ 's3secretkey' ] ) : '' );
205
+ BackWPup_Option::update( $jobid, 's3base_url', isset( $_POST[ 's3base_url' ] ) ? esc_url_raw( $_POST[ 's3base_url' ] ) : '' );
206
+ BackWPup_Option::update( $jobid, 's3region', isset( $_POST[ 's3region' ] ) ? $_POST[ 's3region' ] : '' );
207
+ BackWPup_Option::update( $jobid, 's3storageclass', isset( $_POST[ 's3storageclass' ] ) ? $_POST[ 's3storageclass' ] : '' );
208
+ BackWPup_Option::update( $jobid, 's3ssencrypt', ( isset( $_POST[ 's3ssencrypt' ] ) && $_POST[ 's3ssencrypt' ] == 'AES256' ) ? 'AES256' : '' );
209
+ BackWPup_Option::update( $jobid, 's3bucket', isset( $_POST[ 's3bucket' ] ) ? $_POST[ 's3bucket' ] : '' );
210
+
211
+ $_POST[ 's3dir' ] = trailingslashit( str_replace( '//', '/', str_replace( '\\', '/', trim( stripslashes( $_POST[ 's3dir' ] ) ) ) ) );
212
+ if ( substr( $_POST[ 's3dir' ], 0, 1 ) == '/' )
213
+ $_POST[ 's3dir' ] = substr( $_POST[ 's3dir' ], 1 );
214
+ if ( $_POST[ 's3dir' ] == '/' )
215
+ $_POST[ 's3dir' ] = '';
216
+ BackWPup_Option::update( $jobid, 's3dir', $_POST[ 's3dir' ] );
217
+
218
+ BackWPup_Option::update( $jobid, 's3maxbackups', isset( $_POST[ 's3maxbackups' ] ) ? (int)$_POST[ 's3maxbackups' ] : 0 );
219
+ BackWPup_Option::update( $jobid, 's3syncnodelete', ( isset( $_POST[ 's3syncnodelete' ] ) && $_POST[ 's3syncnodelete' ] == 1 ) ? TRUE : FALSE );
220
+ BackWPup_Option::update( $jobid, 's3multipart', ( isset( $_POST[ 's3multipart' ] ) && $_POST[ 's3multipart' ] == 1 ) ? TRUE : FALSE );
221
+
222
+ //create new bucket
223
+ if ( !empty( $_POST[ 's3newbucket' ] ) ) {
224
+ try {
225
+ $s3 = new AmazonS3( array( 'key' => $_POST[ 's3accesskey' ],
226
+ 'secret' => BackWPup_Encryption::decrypt( $_POST[ 's3secretkey' ] ),
227
+ 'certificate_authority' => TRUE ) );
228
+ $base_url = $this->get_s3_base_url( $_POST[ 's3region' ], $_POST[ 's3base_url' ] );
229
+ if ( stristr( $base_url, 'amazonaws.com' ) ) {
230
+ $s3->set_region( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
231
+ } else {
232
+ $s3->set_hostname( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
233
+ $s3->allow_hostname_override( FALSE );
234
+ if ( substr( $base_url, -1 ) == '/')
235
+ $s3->enable_path_style( TRUE );
236
+ }
237
+ if ( stristr( $base_url, 'http://' ) )
238
+ $s3->disable_ssl();
239
+
240
+ // set bucket creation region
241
+ if ( $_POST[ 's3region' ] == 'google-storage' || $_POST[ 's3region' ] == 'hosteurope' )
242
+ $region = 'EU';
243
+ else
244
+ $region = str_replace( array( 'http://', 'https://' ), '', $base_url );
245
+
246
+ $bucket = $s3->create_bucket( $_POST[ 's3newbucket' ], $region, 'private' );
247
+
248
+ if ( $bucket->status == 200 )
249
+ BackWPup_Admin::message( sprintf( __( 'Bucket %1$s created.','backwpup'), $_POST[ 's3newbucket' ] ) );
250
+ else
251
+ BackWPup_Admin::message( sprintf( __( 'Bucket %s could not be created.','backwpup'), $_POST[ 's3newbucket' ] ), TRUE );
252
+
253
+ }
254
+ catch ( Exception $e ) {
255
+ BackWPup_Admin::message( $e->getMessage(), TRUE );
256
+ }
257
+ BackWPup_Option::update( $jobid, 's3bucket', $_POST[ 's3newbucket' ] );
258
+ }
259
+ }
260
+
261
+ /**
262
+ * @param $jobdest
263
+ * @param $backupfile
264
+ */
265
+ public function file_delete( $jobdest, $backupfile ) {
266
+
267
+ $files = get_site_transient( 'backwpup_'. strtolower( $jobdest ), array() );
268
+ list( $jobid, $dest ) = explode( '_', $jobdest );
269
+
270
+ if ( BackWPup_Option::get( $jobid, 's3accesskey' ) && BackWPup_Option::get( $jobid, 's3secretkey' ) && BackWPup_Option::get( $jobid, 's3bucket' ) ) {
271
+ try {
272
+ $s3 = new AmazonS3( array( 'key' => BackWPup_Option::get( $jobid, 's3accesskey' ),
273
+ 'secret' => BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 's3secretkey' ) ),
274
+ 'certificate_authority' => TRUE ) );
275
+ $base_url = $this->get_s3_base_url( BackWPup_Option::get( $jobid, 's3region' ), BackWPup_Option::get( $jobid, 's3base_url' ) );
276
+ if ( stristr( $base_url, 'amazonaws.com' ) ) {
277
+ $s3->set_region( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
278
+ } else {
279
+ $s3->set_hostname( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
280
+ $s3->allow_hostname_override( FALSE );
281
+ if ( substr( $base_url, -1 ) == '/')
282
+ $s3->enable_path_style( TRUE );
283
+ }
284
+ if ( stristr( $base_url, 'http://' ) )
285
+ $s3->disable_ssl();
286
+
287
+ $s3->delete_object( BackWPup_Option::get( $jobid, 's3bucket' ), $backupfile );
288
+ //update file list
289
+ foreach ( $files as $key => $file ) {
290
+ if ( is_array( $file ) && $file[ 'file' ] == $backupfile )
291
+ unset( $files[ $key ] );
292
+ }
293
+ unset( $s3 );
294
+ }
295
+ catch ( Exception $e ) {
296
+ BackWPup_Admin::message( sprintf( __('S3 Service API: %s','backwpup'), $e->getMessage() ), TRUE );
297
+ }
298
+ }
299
+
300
+ set_site_transient( 'backwpup_'. strtolower( $jobdest ), $files, 60 * 60 * 24 * 7 );
301
+ }
302
+
303
+ /**
304
+ * @param $jobid
305
+ * @param $get_file
306
+ */
307
+ public function file_download( $jobid, $get_file ) {
308
+
309
+ try {
310
+ $s3 = new AmazonS3( array( 'key' => BackWPup_Option::get( $jobid, 's3accesskey' ),
311
+ 'secret' => BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 's3secretkey' ) ),
312
+ 'certificate_authority' => TRUE ) );
313
+ $base_url = $this->get_s3_base_url( BackWPup_Option::get( $jobid, 's3region' ), BackWPup_Option::get( $jobid, 's3base_url' ) );
314
+ if ( stristr( $base_url, 'amazonaws.com' ) ) {
315
+ $s3->set_region( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
316
+ } else {
317
+ $s3->set_hostname( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
318
+ $s3->allow_hostname_override( FALSE );
319
+ if ( substr( $base_url, -1 ) == '/')
320
+ $s3->enable_path_style( TRUE );
321
+ }
322
+ if ( stristr( $base_url, 'http://' ) )
323
+ $s3->disable_ssl();
324
+
325
+ $s3file = $s3->get_object( BackWPup_Option::get( $jobid, 's3bucket' ), $get_file );
326
+ }
327
+ catch ( Exception $e ) {
328
+ die( $e->getMessage() );
329
+ }
330
+
331
+ if ( $s3file->status==200 ) {
332
+ header( "Pragma: public" );
333
+ header( "Expires: 0" );
334
+ header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
335
+ header( "Content-Type: application/octet-stream" );
336
+ header( "Content-Disposition: attachment; filename=" . basename( $get_file ) . ";" );
337
+ header( "Content-Transfer-Encoding: binary" );
338
+ header( "Content-Length: " . $s3file->header->_info->size_download );
339
+ @set_time_limit( 300 );
340
+ echo $s3file->body;
341
+ die();
342
+ }
343
+ }
344
+
345
+ /**
346
+ * @param $jobdest
347
+ * @return mixed
348
+ */
349
+ public function file_get_list( $jobdest ) {
350
+
351
+ return get_site_transient( 'backwpup_' . strtolower( $jobdest ) );
352
+ }
353
+
354
+ /**
355
+ * @param $job_object
356
+ * @return bool
357
+ */
358
+ public function job_run_archive( &$job_object ) {
359
+
360
+ $job_object->substeps_todo = 2 + $job_object->backup_filesize;
361
+ $job_object->log( sprintf( __( '%d. Trying to send backup file to S3 Service&#160;&hellip;', 'backwpup' ), $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] ), E_USER_NOTICE );
362
+
363
+ try {
364
+
365
+ $s3 = new AmazonS3( array( 'key' => $job_object->job[ 's3accesskey' ],
366
+ 'secret' => BackWPup_Encryption::decrypt( $job_object->job[ 's3secretkey' ] ),
367
+ 'certificate_authority' => TRUE ) );
368
+ $base_url = $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] );
369
+ if ( stristr( $base_url, 'amazonaws.com' ) ) {
370
+ $s3->set_region( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
371
+ } else {
372
+ $s3->set_hostname( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
373
+ $s3->allow_hostname_override( FALSE );
374
+ if ( substr( $base_url, -1 ) == '/')
375
+ $s3->enable_path_style( TRUE );
376
+ }
377
+ if ( stristr( $base_url, 'http://' ) )
378
+ $s3->disable_ssl();
379
+
380
+
381
+ if ( $s3->if_bucket_exists( $job_object->job[ 's3bucket' ] ) ) {
382
+ $job_object->log( sprintf( __( 'Connected to S3 Bucket "%1$s" in %2$s', 'backwpup' ), $job_object->job[ 's3bucket' ], $base_url ), E_USER_NOTICE );
383
+ }
384
+ else {
385
+ $job_object->log( sprintf( __( 'S3 Bucket "%s" does not exist!', 'backwpup' ), $job_object->job[ 's3bucket' ] ), E_USER_ERROR );
386
+
387
+ return TRUE;
388
+ }
389
+
390
+ //transfer file to S3
391
+ $job_object->log( __( 'Starting upload to S3 Service&#160;&hellip;', 'backwpup' ), E_USER_NOTICE );
392
+
393
+ //Transfer Backup to S3
394
+ if ( $job_object->job[ 's3storageclass' ] == 'REDUCED_REDUNDANCY' ) //set reduced redundancy or not
395
+ $storage=AmazonS3::STORAGE_REDUCED;
396
+ else
397
+ $storage=AmazonS3::STORAGE_STANDARD;
398
+
399
+ if ( empty( $job_object->job[ 's3ssencrypt' ] ) )
400
+ $job_object->job[ 's3ssencrypt' ] = NULL;
401
+
402
+ //set progress bar
403
+ $s3->register_streaming_read_callback( array( $job_object, 'curl_read_callback' ) );
404
+
405
+ $result = $s3->create_object( $job_object->job[ 's3bucket' ], $job_object->job[ 's3dir' ] . $job_object->backup_file, array( 'fileUpload' => $job_object->backup_folder . $job_object->backup_file, 'acl' => AmazonS3::ACL_PRIVATE, 'storage' => $storage, 'encryption' => $job_object->job[ 's3ssencrypt' ] ) );
406
+
407
+ if ( $result->status >= 200 and $result->status < 300 ) {
408
+ $job_object->substeps_done = 1 + $job_object->backup_filesize;
409
+ $job_object->log( sprintf( __( 'Backup transferred to %s.', 'backwpup' ), $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ). '/' .$job_object->job[ 's3bucket' ] . '/' . $job_object->job[ 's3dir' ] . $job_object->backup_file ), E_USER_NOTICE );
410
+ if ( ! empty( $job_object->job[ 'jobid' ] ) )
411
+ BackWPup_Option::update( $job_object->job[ 'jobid' ], 'lastbackupdownloadurl', network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=downloads3&file=' . $job_object->job[ 's3dir' ] . $job_object->backup_file . '&jobid=' . $job_object->job[ 'jobid' ] );
412
+ }
413
+ else {
414
+ $job_object->log( sprintf( __( 'Cannot transfer backup to S3! (%1$d) %2$s', 'backwpup' ), $result->status, $result->body ), E_USER_ERROR );
415
+ }
416
+ }
417
+ catch ( Exception $e ) {
418
+ $job_object->log( E_USER_ERROR, sprintf( __( 'S3 Service API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
419
+
420
+ return FALSE;
421
+ }
422
+
423
+ try {
424
+ $backupfilelist = array();
425
+ $filecounter = 0;
426
+ $files = array();
427
+ $objects = $s3->list_objects( $job_object->job[ 's3bucket' ], array( 'prefix' => $job_object->job[ 's3dir' ] ) );
428
+ if ( is_object( $objects ) ) {
429
+ foreach ( $objects->body->Contents as $object ) {
430
+ $file = basename( (string) $object->Key );
431
+ $changetime = strtotime( (string) $object->LastModified ) + ( get_option( 'gmt_offset' ) * 3600 );
432
+ if ( $job_object->is_backup_archive( $file ) )
433
+ $backupfilelist[ $changetime ] = $file;
434
+ $files[ $filecounter ][ 'folder' ] = $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ). '/' .$job_object->job[ 's3bucket' ] . '/' . dirname( (string) $object->Key );
435
+ $files[ $filecounter ][ 'file' ] = (string) $object->Key;
436
+ $files[ $filecounter ][ 'filename' ] = basename( $object->Key );
437
+ $files[ $filecounter ][ 'downloadurl' ] = network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=downloads3&file=' . (string) $object->Key . '&jobid=' . $job_object->job[ 'jobid' ];
438
+ $files[ $filecounter ][ 'filesize' ] = (int) $object->Size;
439
+ $files[ $filecounter ][ 'time' ] = $changetime;
440
+ $filecounter ++;
441
+ }
442
+ }
443
+ if ( $job_object->job[ 's3maxbackups' ] > 0 && is_object( $s3 ) ) { //Delete old backups
444
+ if ( count( $backupfilelist ) > $job_object->job[ 's3maxbackups' ] ) {
445
+ ksort( $backupfilelist );
446
+ $numdeltefiles = 0;
447
+ while ( $file = array_shift( $backupfilelist ) ) {
448
+ if ( count( $backupfilelist ) < $job_object->job[ 's3maxbackups' ] )
449
+ break;
450
+ //delete files on S3
451
+ $delete_s3 = $s3->delete_object( $job_object->job[ 's3bucket' ], $job_object->job[ 's3dir' ] . $file );
452
+ if ($delete_s3 ) {
453
+ foreach ( $files as $key => $filedata ) {
454
+ if ( $filedata[ 'file' ] == $job_object->job[ 's3dir' ] . $file )
455
+ unset( $files[ $key ] );
456
+ }
457
+ $numdeltefiles ++;
458
+ } else {
459
+ $job_object->log( sprintf( __( 'Cannot delete backup from %s.', 'backwpup' ), $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ). '/' .$job_object->job[ 's3bucket' ] . '/' . $job_object->job[ 's3dir' ] . $file ), E_USER_ERROR );
460
+ }
461
+ }
462
+ if ( $numdeltefiles > 0 )
463
+ $job_object->log( sprintf( _n( 'One file deleted on S3 Bucket.', '%d files deleted on S3 Bucket', $numdeltefiles, 'backwpup' ), $numdeltefiles ), E_USER_NOTICE );
464
+ }
465
+ }
466
+ set_site_transient( 'backwpup_' . $job_object->job[ 'jobid' ] . '_s3', $files, 60 * 60 * 24 * 7 );
467
+ }
468
+ catch ( Exception $e ) {
469
+ $job_object->log( E_USER_ERROR, sprintf( __( 'S3 Service API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
470
+
471
+ return FALSE;
472
+ }
473
+ $job_object->substeps_done = 2 + $job_object->backup_filesize;
474
+
475
+ return TRUE;
476
+ }
477
+
478
+
479
+ /**
480
+ * @param $job_object
481
+ * @return bool
482
+ */
483
+ public function can_run( $job_object ) {
484
+
485
+ if ( empty( $job_object->job[ 's3accesskey' ] ) )
486
+ return FALSE;
487
+
488
+ if ( empty( $job_object->job[ 's3secretkey' ] ) )
489
+ return FALSE;
490
+
491
+ if ( empty( $job_object->job[ 's3bucket' ] ) )
492
+ return FALSE;
493
+
494
+ return TRUE;
495
+ }
496
+
497
+ /**
498
+ *
499
+ */
500
+ public function edit_inline_js() {
501
+ //<script type="text/javascript">
502
+ ?>
503
+ function awsgetbucket() {
504
+ var data = {
505
+ action: 'backwpup_dest_s3',
506
+ s3accesskey: $('input[name="s3accesskey"]').val(),
507
+ s3secretkey: $('input[name="s3secretkey"]').val(),
508
+ s3bucketselected: $('input[name="s3bucketselected"]').val(),
509
+ s3base_url: $('input[name="s3base_url"]').val(),
510
+ s3region: $('#s3region').val(),
511
+ _ajax_nonce: $('#backwpupajaxnonce').val()
512
+ };
513
+ $.post(ajaxurl, data, function(response) {
514
+ $('#s3bucketerror').remove();
515
+ $('#s3bucket').remove();
516
+ $('#s3bucketselected').after(response);
517
+ });
518
+ }
519
+ $('input[name="s3accesskey"]').change(function() {awsgetbucket();});
520
+ $('input[name="s3secretkey"]').change(function() {awsgetbucket();});
521
+ $('input[name="s3base_url"]').change(function() {awsgetbucket();});
522
+ $('#s3region').change(function() {awsgetbucket();});
523
+ <?php
524
+ }
525
+
526
+ /**
527
+ * @param string $args
528
+ */
529
+ public function edit_ajax( $args = '' ) {
530
+
531
+ $error = '';
532
+
533
+ if ( is_array( $args ) ) {
534
+ $ajax = FALSE;
535
+ }
536
+ else {
537
+ if ( ! current_user_can( 'backwpup_jobs_edit' ) )
538
+ wp_die( -1 );
539
+ check_ajax_referer( 'backwpup_ajax_nonce' );
540
+ $args[ 's3accesskey' ] = $_POST[ 's3accesskey' ];
541
+ $args[ 's3secretkey' ] = $_POST[ 's3secretkey' ];
542
+ $args[ 's3bucketselected' ] = $_POST[ 's3bucketselected' ];
543
+ $args[ 's3base_url' ] = $_POST[ 's3base_url' ];
544
+ $args[ 's3region' ] = $_POST[ 's3region' ];
545
+ $ajax = TRUE;
546
+ }
547
+ echo '<span id="s3bucketerror" style="color:red;">';
548
+
549
+ if ( ! empty( $args[ 's3accesskey' ] ) && ! empty( $args[ 's3secretkey' ] ) ) {
550
+ try {
551
+ $s3 = new AmazonS3( array( 'key' => $args[ 's3accesskey' ],
552
+ 'secret' => BackWPup_Encryption::decrypt( $args[ 's3secretkey' ] ),
553
+ 'certificate_authority' => TRUE ) );
554
+ $base_url = $this->get_s3_base_url( $args[ 's3region' ], $args[ 's3base_url' ] );
555
+ if ( stristr( $base_url, 'amazonaws.com' ) ) {
556
+ $s3->set_region( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
557
+ } else {
558
+ $s3->set_hostname( str_replace( array( 'http://', 'https://' ), '', $base_url ) );
559
+ $s3->allow_hostname_override( FALSE );
560
+ if ( substr( $base_url, -1 ) == '/')
561
+ $s3->enable_path_style( TRUE );
562
+ }
563
+ if ( stristr( $base_url, 'http://' ) )
564
+ $s3->disable_ssl();
565
+
566
+ $buckets = $s3->list_buckets();
567
+ }
568
+ catch ( Exception $e ) {
569
+ $error = $e->getMessage();
570
+ }
571
+ }
572
+
573
+ if ( empty( $args[ 's3accesskey' ] ) )
574
+ _e( 'Missing access key!', 'backwpup' );
575
+ elseif ( empty( $args[ 's3secretkey' ] ) )
576
+ _e( 'Missing secret access key!', 'backwpup' );
577
+ elseif ( ! empty( $error ) && $error == 'Access Denied' )
578
+ echo '<input type="text" name="s3bucket" id="s3bucket" value="' . esc_attr( $args[ 's3bucketselected' ] ) . '" >';
579
+ elseif ( ! empty( $error ) )
580
+ echo esc_html( $error );
581
+ elseif ( ! isset( $buckets ) || count( $buckets->body->Buckets->Bucket ) < 1 )
582
+ _e( 'No bucket found!', 'backwpup' );
583
+ echo '</span>';
584
+
585
+ if ( ! empty( $buckets->body->Buckets->Bucket ) ) {
586
+ echo '<select name="s3bucket" id="s3bucket">';
587
+ foreach ( $buckets->body->Buckets->Bucket as $bucket ) {
588
+ echo "<option " . selected( $args[ 's3bucketselected' ], esc_attr( $bucket->Name ), FALSE ) . ">" . esc_attr( $bucket->Name ) . "</option>";
589
+ }
590
+ echo '</select>';
591
+ }
592
+
593
+ if ( $ajax )
594
+ die();
595
+ }
596
+ }
inc/class-destination-s3.php CHANGED
@@ -1,680 +1,680 @@
1
- <?php
2
- // Amazon S3 SDK v2.6.1
3
- // http://aws.amazon.com/de/sdkforphp2/
4
- // https://github.com/aws/aws-sdk-php
5
-
6
- /**
7
- * Documentation: http://docs.amazonwebservices.com/aws-sdk-php-2/latest/class-Aws.S3.S3Client.html
8
- */
9
- class BackWPup_Destination_S3 extends BackWPup_Destinations {
10
-
11
-
12
- /**
13
- * @param $s3region
14
- * @param string $s3base_url
15
- * @return string
16
- */
17
- protected function get_s3_base_url( $s3region, $s3base_url = '' ) {
18
-
19
- if ( ! empty( $s3base_url ) )
20
- return $s3base_url;
21
-
22
- switch ( $s3region ) {
23
- case 'us-east-1':
24
- return 'https://s3.amazonaws.com';
25
- case 'us-west-1':
26
- return 'https://s3-us-west-1.amazonaws.com';
27
- case 'us-west-2':
28
- return 'https://s3-us-west-2.amazonaws.com';
29
- case 'eu-west-1':
30
- return 'https://s3-eu-west-1.amazonaws.com';
31
- case 'eu-central-1':
32
- return 'https://s3-eu-central-1.amazonaws.com';
33
- case 'ap-northeast-1':
34
- return 'https://s3-ap-northeast-1.amazonaws.com';
35
- case 'ap-southeast-1':
36
- return 'https://s3-ap-southeast-1.amazonaws.com';
37
- case 'ap-southeast-2':
38
- return 'https://s3-ap-southeast-2.amazonaws.com';
39
- case 'sa-east-1':
40
- return 'https://s3-sa-east-1.amazonaws.com';
41
- case 'cn-north-1':
42
- return 'https:/cn-north-1.amazonaws.com';
43
- case 'google-storage':
44
- return 'https://storage.googleapis.com';
45
- case 'dreamhost':
46
- return 'https://objects.dreamhost.com';
47
- case 'greenqloud':
48
- return 'http://s.greenqloud.com';
49
- default:
50
- return '';
51
- }
52
-
53
- }
54
-
55
- /**
56
- * @return array
57
- */
58
- public function option_defaults() {
59
-
60
- return array( 's3accesskey' => '', 's3secretkey' => '', 's3bucket' => '', 's3region' => 'us-east-1', 's3base_url' => '', 's3ssencrypt' => '', 's3storageclass' => '', 's3dir' => trailingslashit( sanitize_file_name( get_bloginfo( 'name' ) ) ), 's3maxbackups' => 15, 's3syncnodelete' => TRUE, 's3multipart' => TRUE );
61
- }
62
-
63
-
64
- /**
65
- * @param $jobid
66
- */
67
- public function edit_tab( $jobid ) {
68
-
69
- ?>
70
- <h3 class="title"><?php _e( 'S3 Service', 'backwpup' ) ?></h3>
71
- <p></p>
72
- <table class="form-table">
73
- <tr>
74
- <th scope="row"><label for="s3region"><?php _e( 'Select a S3 service', 'backwpup' ) ?></label></th>
75
- <td>
76
- <select name="s3region" id="s3region" title="<?php _e( 'Amazon S3 Region', 'backwpup' ); ?>">
77
- <option value="us-east-1" <?php selected( 'us-east-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: US Standard', 'backwpup' ); ?></option>
78
- <option value="us-west-1" <?php selected( 'us-west-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: US West (Northern California)', 'backwpup' ); ?></option>
79
- <option value="us-west-2" <?php selected( 'us-west-2', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: US West (Oregon)', 'backwpup' ); ?></option>
80
- <option value="eu-west-1" <?php selected( 'eu-west-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: EU (Ireland)', 'backwpup' ); ?></option>
81
- <option value="eu-central-1" <?php selected( 'eu-central-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: EU (Germany)', 'backwpup' ); ?></option>
82
- <option value="ap-northeast-1" <?php selected( 'ap-northeast-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: Asia Pacific (Tokyo)', 'backwpup' ); ?></option>
83
- <option value="ap-southeast-1" <?php selected( 'ap-southeast-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: Asia Pacific (Singapore)', 'backwpup' ); ?></option>
84
- <option value="ap-southeast-2" <?php selected( 'ap-southeast-2', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: Asia Pacific (Sydney)', 'backwpup' ); ?></option>
85
- <option value="sa-east-1" <?php selected( 'sa-east-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: South America (Sao Paulo)', 'backwpup' ); ?></option>
86
- <option value="cn-north-1" <?php selected( 'cn-north-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: China (Beijing)', 'backwpup' ); ?></option>
87
- <option value="google-storage" <?php selected( 'google-storage', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Google Storage (Interoperable Access)', 'backwpup' ); ?></option>
88
- <option value="dreamhost" <?php selected( 'dreamhost', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Dream Host Cloud Storage', 'backwpup' ); ?></option>
89
- <option value="greenqloud" <?php selected( 'greenqloud', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'GreenQloud Storage Qloud', 'backwpup' ); ?></option>
90
- </select>
91
- </td>
92
- </tr>
93
- <tr>
94
- <th scope="row"><label for="s3base_url"><?php _e( 'Or a S3 Server URL', 'backwpup' ) ?></label></th>
95
- <td>
96
- <input id="s3base_url" name="s3base_url" type="text" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3base_url' ) );?>" class="regular-text" autocomplete="off" />
97
- </td>
98
- </tr>
99
- </table>
100
-
101
- <h3 class="title"><?php _e( 'S3 Access Keys', 'backwpup' ); ?></h3>
102
- <p></p>
103
- <table class="form-table">
104
- <tr>
105
- <th scope="row"><label for="s3accesskey"><?php _e( 'Access Key', 'backwpup' ); ?></label></th>
106
- <td>
107
- <input id="s3accesskey" name="s3accesskey" type="text"
108
- value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3accesskey' ) );?>" class="regular-text" autocomplete="off" />
109
- </td>
110
- </tr>
111
- <tr>
112
- <th scope="row"><label for="s3secretkey"><?php _e( 'Secret Key', 'backwpup' ); ?></label></th>
113
- <td>
114
- <input id="s3secretkey" name="s3secretkey" type="password"
115
- value="<?php echo esc_attr( BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 's3secretkey' ) ) ); ?>" class="regular-text" autocomplete="off" />
116
- </td>
117
- </tr>
118
- </table>
119
-
120
- <h3 class="title"><?php _e( 'S3 Bucket', 'backwpup' ); ?></h3>
121
- <p></p>
122
- <table class="form-table">
123
- <tr>
124
- <th scope="row"><label for="s3bucketselected"><?php _e( 'Bucket selection', 'backwpup' ); ?></label></th>
125
- <td>
126
- <input id="s3bucketselected" name="s3bucketselected" type="hidden" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3bucket' ) ); ?>" />
127
- <?php if ( BackWPup_Option::get( $jobid, 's3accesskey' ) && BackWPup_Option::get( $jobid, 's3secretkey' ) ) $this->edit_ajax( array(
128
- 's3accesskey' => BackWPup_Option::get( $jobid, 's3accesskey' ),
129
- 's3secretkey' => BackWPup_Encryption::decrypt(BackWPup_Option::get( $jobid, 's3secretkey' ) ),
130
- 's3bucketselected' => BackWPup_Option::get( $jobid, 's3bucket' ),
131
- 's3base_url' => BackWPup_Option::get( $jobid, 's3base_url' ),
132
- 's3region' => BackWPup_Option::get( $jobid, 's3region' )
133
- ) ); ?>
134
- </td>
135
- </tr>
136
- <tr>
137
- <th scope="row"><label for="s3newbucket"><?php _e( 'Create a new bucket', 'backwpup' ); ?></label></th>
138
- <td>
139
- <input id="s3newbucket" name="s3newbucket" type="text" value="" class="small-text" autocomplete="off" />
140
- </td>
141
- </tr>
142
- </table>
143
-
144
- <h3 class="title"><?php _e( 'S3 Backup settings', 'backwpup' ); ?></h3>
145
- <p></p>
146
- <table class="form-table">
147
- <tr>
148
- <th scope="row"><label for="ids3dir"><?php _e( 'Folder in bucket', 'backwpup' ); ?></label></th>
149
- <td>
150
- <input id="ids3dir" name="s3dir" type="text" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3dir' ) ); ?>" class="regular-text" />
151
- </td>
152
- </tr>
153
- <tr>
154
- <th scope="row"><?php _e( 'File deletion', 'backwpup' ); ?></th>
155
- <td>
156
- <?php
157
- if ( BackWPup_Option::get( $jobid, 'backuptype' ) == 'archive' ) {
158
- ?>
159
- <label for="ids3maxbackups"><input id="ids3maxbackups" name="s3maxbackups" type="text" size="3" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3maxbackups' ) ); ?>" class="small-text help-tip" title="<?php esc_attr_e( 'Oldest files will be deleted first. 0 = no deletion', 'backwpup' ); ?>" />&nbsp;
160
- <?php _e( 'Number of files to keep in folder.', 'backwpup' ); ?></label>
161
- <?php } else { ?>
162
- <label for="ids3syncnodelete"><input class="checkbox" value="1"
163
- type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 's3syncnodelete' ), TRUE ); ?>
164
- name="s3syncnodelete" id="ids3syncnodelete" /> <?php _e( 'Do not delete files while syncing to destination!', 'backwpup' ); ?></label>
165
- <?php } ?>
166
- </td>
167
- </tr>
168
- <?php if ( BackWPup_Option::get( $jobid, 'backuptype' ) == 'archive' ) { ?>
169
- <tr>
170
- <th scope="row"><?php _e( 'Multipart Upload', 'backwpup' ); ?></th>
171
- <td>
172
- <label for="ids3multipart"><input class="checkbox help-tip" value="1" title="<?php esc_attr_e( 'Multipart splits file into multiple chunks while uploading. This is necessary for displaying the upload process and to transfer bigger files. Works without a problem on Amazon. Other services might have issues.', 'backwpup'); ?>"
173
- type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 's3multipart' ), TRUE ); ?>
174
- name="s3multipart" id="ids3multipart" /> <?php _e( 'Use multipart upload for uploading a file', 'backwpup' ); ?></label>
175
- </td>
176
- </tr>
177
- <?php } ?>
178
- </table>
179
-
180
- <h3 class="title"><?php _e( 'Amazon specific settings', 'backwpup' ); ?></h3>
181
- <p></p>
182
- <table class="form-table">
183
- <tr>
184
- <th scope="row"><label for="ids3storageclass"><?php _e( 'Amazon: Storage Class', 'backwpup' ); ?></label></th>
185
- <td>
186
- <select name="s3storageclass" id="ids3storageclass" title="<?php _e( 'Amazon: Storage Class', 'backwpup' ); ?>">
187
- <option value="" <?php selected( 'us-east-1', BackWPup_Option::get( $jobid, 's3storageclass' ), TRUE ) ?>><?php _e( 'none', 'backwpup' ); ?></option>
188
- <option value="REDUCED_REDUNDANCY" <?php selected( 'REDUCED_REDUNDANCY', BackWPup_Option::get( $jobid, 's3storageclass' ), TRUE ) ?>><?php _e( 'Reduced Redundancy', 'backwpup' ); ?></option>
189
- </select>
190
- </td>
191
- </tr>
192
- <tr>
193
- <th scope="row"><label for="ids3ssencrypt"><?php _e( 'Server side encryption', 'backwpup' ); ?></label></th>
194
- <td>
195
- <input class="checkbox" value="AES256"
196
- type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 's3ssencrypt' ), 'AES256' ); ?>
197
- name="s3ssencrypt" id="ids3ssencrypt" /> <?php _e( 'Save files encrypted (AES256) on server.', 'backwpup' ); ?>
198
- </td>
199
- </tr>
200
- </table>
201
-
202
- <?php
203
- }
204
-
205
-
206
- /**
207
- * @param $jobid
208
- * @return string
209
- */
210
- public function edit_form_post_save( $jobid ) {
211
-
212
- BackWPup_Option::update( $jobid, 's3accesskey', isset( $_POST[ 's3accesskey' ] ) ? $_POST[ 's3accesskey' ] : '' );
213
- BackWPup_Option::update( $jobid, 's3secretkey', isset( $_POST[ 's3secretkey' ] ) ? BackWPup_Encryption::encrypt( $_POST[ 's3secretkey' ] ) : '' );
214
- BackWPup_Option::update( $jobid, 's3base_url', isset( $_POST[ 's3base_url' ] ) ? esc_url_raw( $_POST[ 's3base_url' ] ) : '' );
215
- BackWPup_Option::update( $jobid, 's3region', isset( $_POST[ 's3region' ] ) ? $_POST[ 's3region' ] : '' );
216
- BackWPup_Option::update( $jobid, 's3storageclass', isset( $_POST[ 's3storageclass' ] ) ? $_POST[ 's3storageclass' ] : '' );
217
- BackWPup_Option::update( $jobid, 's3ssencrypt', ( isset( $_POST[ 's3ssencrypt' ] ) && $_POST[ 's3ssencrypt' ] == 'AES256' ) ? 'AES256' : '' );
218
- BackWPup_Option::update( $jobid, 's3bucket', isset( $_POST[ 's3bucket' ] ) ? $_POST[ 's3bucket' ] : '' );
219
-
220
- $_POST[ 's3dir' ] = trailingslashit( str_replace( '//', '/', str_replace( '\\', '/', trim( stripslashes( $_POST[ 's3dir' ] ) ) ) ) );
221
- if ( substr( $_POST[ 's3dir' ], 0, 1 ) == '/' )
222
- $_POST[ 's3dir' ] = substr( $_POST[ 's3dir' ], 1 );
223
- if ( $_POST[ 's3dir' ] == '/' )
224
- $_POST[ 's3dir' ] = '';
225
- BackWPup_Option::update( $jobid, 's3dir', $_POST[ 's3dir' ] );
226
-
227
- BackWPup_Option::update( $jobid, 's3maxbackups', isset( $_POST[ 's3maxbackups' ] ) ? (int)$_POST[ 's3maxbackups' ] : 0 );
228
- BackWPup_Option::update( $jobid, 's3syncnodelete', ( isset( $_POST[ 's3syncnodelete' ] ) && $_POST[ 's3syncnodelete' ] == 1 ) ? TRUE : FALSE );
229
- BackWPup_Option::update( $jobid, 's3multipart', ( isset( $_POST[ 's3multipart' ] ) && $_POST[ 's3multipart' ] == 1 ) ? TRUE : FALSE );
230
-
231
- //create new bucket
232
- if ( !empty( $_POST[ 's3newbucket' ] ) ) {
233
- try {
234
- $s3 = Aws\S3\S3Client::factory( array( 'key' => $_POST[ 's3accesskey' ],
235
- 'secret' => $_POST[ 's3secretkey' ],
236
- 'region' => $_POST[ 's3region' ],
237
- 'base_url' => $this->get_s3_base_url( $_POST[ 's3region' ], $_POST[ 's3base_url' ]),
238
- 'scheme' => 'https',
239
- 'ssl.certificate_authority' => BackWPup::get_plugin_data( 'cacert' ) ) );
240
- // set bucket creation region
241
- if ( $_POST[ 's3region' ] == 'google-storage' || $_POST[ 's3region' ] == 'hosteurope' )
242
- $region = 'EU';
243
- else
244
- $region = $_POST[ 's3region' ];
245
-
246
- if ($s3->isValidBucketName( $_POST[ 's3newbucket' ] ) ) {
247
- $bucket = $s3->createBucket( array(
248
- 'Bucket' => $_POST[ 's3newbucket' ] ,
249
- 'LocationConstraint' => $region
250
- ) );
251
- $s3->waitUntil('bucket_exists', $_POST[ 's3newbucket' ]);
252
- if ( $bucket->get( 'Location' ) )
253
- BackWPup_Admin::message( sprintf( __( 'Bucket %1$s created in %2$s.','backwpup'), $_POST[ 's3newbucket' ], $bucket->get( 'Location' ) ) );
254
- else
255
- BackWPup_Admin::message( sprintf( __( 'Bucket %s could not be created.','backwpup'), $_POST[ 's3newbucket' ] ), TRUE );
256
- } else {
257
- BackWPup_Admin::message( sprintf( __( ' %s is not a valid bucket name.','backwpup'), $_POST[ 's3newbucket' ] ), TRUE );
258
- }
259
- }
260
- catch ( Aws\S3\Exception\S3Exception $e ) {
261
- BackWPup_Admin::message( $e->getMessage(), TRUE );
262
- }
263
- BackWPup_Option::update( $jobid, 's3bucket', $_POST[ 's3newbucket' ] );
264
- }
265
- }
266
-
267
- /**
268
- * @param $jobdest
269
- * @param $backupfile
270
- */
271
- public function file_delete( $jobdest, $backupfile ) {
272
-
273
- $files = get_site_transient( 'backwpup_'. strtolower( $jobdest ), array() );
274
- list( $jobid, $dest ) = explode( '_', $jobdest );
275
-
276
- if ( BackWPup_Option::get( $jobid, 's3accesskey' ) && BackWPup_Option::get( $jobid, 's3secretkey' ) && BackWPup_Option::get( $jobid, 's3bucket' ) ) {
277
- try {
278
- $s3 = Aws\S3\S3Client::factory( array( 'key' => BackWPup_Option::get( $jobid, 's3accesskey' ),
279
- 'secret' => BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 's3secretkey' ) ),
280
- 'region' => BackWPup_Option::get( $jobid, 's3region' ),
281
- 'base_url' => $this->get_s3_base_url( BackWPup_Option::get( $jobid, 's3region' ), BackWPup_Option::get( $jobid, 's3base_url' ) ),
282
- 'scheme' => 'https',
283
- 'ssl.certificate_authority' => BackWPup::get_plugin_data( 'cacert' ) ) );
284
-
285
- $s3->deleteObject( array(
286
- 'Bucket' => BackWPup_Option::get( $jobid, 's3bucket' ),
287
- 'Key' => $backupfile
288
- ) );
289
- //update file list
290
- foreach ( $files as $key => $file ) {
291
- if ( is_array( $file ) && $file[ 'file' ] == $backupfile )
292
- unset( $files[ $key ] );
293
- }
294
- unset( $s3 );
295
- }
296
- catch ( Exception $e ) {
297
- BackWPup_Admin::message( sprintf( __('S3 Service API: %s','backwpup'), $e->getMessage() ), TRUE );
298
- }
299
- }
300
-
301
- set_site_transient( 'backwpup_'. strtolower( $jobdest ), $files, 60 * 60 * 24 * 7 );
302
- }
303
-
304
- /**
305
- * @param $jobid
306
- * @param $get_file
307
- */
308
- public function file_download( $jobid, $get_file ) {
309
-
310
- try {
311
- $s3 = Aws\S3\S3Client::factory( array( 'key' => BackWPup_Option::get( $jobid, 's3accesskey' ),
312
- 'secret' => BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 's3secretkey' ) ),
313
- 'region' => BackWPup_Option::get( $jobid, 's3region' ),
314
- 'base_url' => $this->get_s3_base_url( BackWPup_Option::get( $jobid, 's3region' ), BackWPup_Option::get( $jobid, 's3base_url' ) ),
315
- 'scheme' => 'https',
316
- 'ssl.certificate_authority' => BackWPup::get_plugin_data( 'cacert' ) ) );
317
-
318
- $s3file = $s3->getObject( array(
319
- 'Bucket' => BackWPup_Option::get( $jobid, 's3bucket' ),
320
- 'Key' => $get_file ) );
321
- }
322
- catch ( Exception $e ) {
323
- die( $e->getMessage() );
324
- }
325
-
326
- if ( $s3file[ 'ContentLength' ] > 0 && ! empty( $s3file[ 'ContentType' ] ) ) {
327
- header( "Pragma: public" );
328
- header( "Expires: 0" );
329
- header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );;
330
- header( "Content-Type: application/octet-stream" );
331
- header( "Content-Disposition: attachment; filename=" . basename( $get_file ) . ";" );
332
- header( "Content-Transfer-Encoding: binary" );
333
- header( "Content-Length: " . $s3file[ 'ContentLength' ] );
334
- @set_time_limit( 300 );
335
- $body = $s3file->get( 'Body' );
336
- $body->rewind();
337
- while ( $filedata = $body->read( 1024 ) ) {
338
- echo $filedata;
339
- }
340
- die();
341
- }
342
- }
343
-
344
- /**
345
- * @param $jobdest
346
- * @return mixed
347
- */
348
- public function file_get_list( $jobdest ) {
349
-
350
- return get_site_transient( 'backwpup_' . strtolower( $jobdest ) );
351
- }
352
-
353
- /**
354
- * @param $job_object
355
- * @return bool
356
- */
357
- public function job_run_archive( &$job_object ) {
358
-
359
- $job_object->substeps_todo = 2 + $job_object->backup_filesize;
360
- if ( $job_object->steps_data[ $job_object->step_working ]['SAVE_STEP_TRY'] != $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] )
361
- $job_object->log( sprintf( __( '%d. Trying to send backup file to S3 Service&#160;&hellip;', 'backwpup' ), $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] ), E_USER_NOTICE );
362
-
363
- try {
364
- $s3 = Aws\S3\S3Client::factory( array( 'key' => $job_object->job[ 's3accesskey' ],
365
- 'secret' => BackWPup_Encryption::decrypt( $job_object->job[ 's3secretkey' ] ),
366
- 'region' => $job_object->job[ 's3region' ],
367
- 'base_url' => $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ),
368
- 'scheme' => 'https',
369
- 'ssl.certificate_authority' => BackWPup::get_plugin_data( 'cacert' ) ) );
370
-
371
- if ( $job_object->steps_data[ $job_object->step_working ]['SAVE_STEP_TRY'] != $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] && $job_object->substeps_done < $job_object->backup_filesize ) {
372
- if ( $s3->doesBucketExist( $job_object->job[ 's3bucket' ] ) ) {
373
- $bucketregion = $s3->getBucketLocation( array( 'Bucket' => $job_object->job[ 's3bucket' ] ) );
374
- $job_object->log( sprintf( __( 'Connected to S3 Bucket "%1$s" in %2$s', 'backwpup' ), $job_object->job[ 's3bucket' ], $bucketregion->get( 'Location' ) ), E_USER_NOTICE );
375
- }
376
- else {
377
- $job_object->log( sprintf( __( 'S3 Bucket "%s" does not exist!', 'backwpup' ), $job_object->job[ 's3bucket' ] ), E_USER_ERROR );
378
-
379
- return TRUE;
380
- }
381
-
382
- if ( $job_object->job[ 's3multipart' ] && empty( $job_object->steps_data[ $job_object->step_working ][ 'UploadId' ] ) ) {
383
- //Check for aboded Multipart Uploads
384
- $job_object->log( __( 'Checking for not aborted multipart Uploads&#160;&hellip;', 'backwpup' ) );
385
- $multipart_uploads = $s3->listMultipartUploads( array( 'Bucket' => $job_object->job[ 's3bucket' ], 'Prefix' => $job_object->job[ 's3dir' ] ) );
386
- $uploads = $multipart_uploads->get( 'Uploads' );
387
- if ( ! empty( $uploads ) ) {
388
- foreach( $uploads as $upload ) {
389
- $s3->abortMultipartUpload( array( 'Bucket' => $job_object->job[ 's3bucket' ], 'Key' => $upload[ 'Key' ], 'UploadId' => $upload[ 'UploadId' ] ) );
390
- $job_object->log( sprintf( __( 'Upload for %s aborted.', 'backwpup' ), $upload[ 'Key' ] ) );
391
- }
392
- }
393
- }
394
-
395
- //transfer file to S3
396
- $job_object->log( __( 'Starting upload to S3 Service&#160;&hellip;', 'backwpup' ) );
397
- }
398
-
399
-
400
- if ( ! $job_object->job[ 's3multipart' ] ) {
401
- //Prepare Upload
402
- $create_args = array();
403
- $create_args[ 'Bucket' ] = $job_object->job[ 's3bucket' ];
404
- $create_args[ 'ACL' ] = 'private';
405
- if ( ! empty( $job_object->job[ 's3ssencrypt' ] ) )
406
- $create_args[ 'ServerSideEncryption' ] = $job_object->job[ 's3ssencrypt' ]; //AES256
407
- if ( ! empty( $job_object->job[ 's3storageclass' ] ) ) //REDUCED_REDUNDANCY
408
- $create_args[ 'StorageClass' ] = $job_object->job[ 's3storageclass' ];
409
- $create_args[ 'Metadata' ] = array( 'BackupTime' => date_i18n( 'Y-m-d H:i:s', $job_object->start_time ) );
410
-
411
- $create_args[ 'Body' ] = fopen( $job_object->backup_folder . $job_object->backup_file, 'r' );
412
- $create_args[ 'Key' ] = $job_object->job[ 's3dir' ] . $job_object->backup_file;
413
- $create_args[ 'ContentType' ] = $job_object->get_mime_type( $job_object->backup_folder . $job_object->backup_file );
414
-
415
- try {
416
- $s3->putObject( $create_args );
417
- } catch ( Aws\Common\Exception\MultipartUploadException $e ) {
418
- $job_object->log( E_USER_ERROR, sprintf( __( 'S3 Service API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
419
-
420
- return FALSE;
421
- }
422
- } else {
423
- //Prepare Upload
424
- $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ] = fopen( $job_object->backup_folder . $job_object->backup_file, 'rb' );
425
- fseek( $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ], $job_object->substeps_done );
426
-
427
- try {
428
-
429
- if ( empty ( $job_object->steps_data[ $job_object->step_working ][ 'UploadId' ] ) ) {
430
- $args = array( 'ACL' => 'private',
431
- 'Bucket' => $job_object->job[ 's3bucket' ],
432
- 'ContentType' => $job_object->get_mime_type( $job_object->backup_folder . $job_object->backup_file ),
433
- 'Key' => $job_object->job[ 's3dir' ] . $job_object->backup_file );
434
- if ( !empty( $job_object->job[ 's3ssencrypt' ] ) )
435
- $args[ 'ServerSideEncryption' ] = $job_object->job[ 's3ssencrypt' ];
436
- if ( !empty( $job_object->job[ 's3storageclass' ] ) )
437
- $args[ 'StorageClass' ] = empty( $job_object->job[ 's3storageclass' ] ) ? 'STANDARD' : 'REDUCED_REDUNDANCY';
438
-
439
- $upload = $s3->createMultipartUpload( $args );
440
-
441
- $job_object->steps_data[ $job_object->step_working ][ 'UploadId' ] = $upload->get( 'UploadId' );
442
- $job_object->steps_data[ $job_object->step_working ][ 'Parts' ] = array();
443
- $job_object->steps_data[ $job_object->step_working ][ 'Part' ] = 1;
444
- }
445
-
446
- while ( ! feof( $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ] ) ) {
447
- $chunk_upload_start = microtime( TRUE );
448
- $part_data = fread( $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ], 1048576 * 5 ); //5MB Minimum part size
449
- $part = $s3->uploadPart( array( 'Bucket' => $job_object->job[ 's3bucket' ],
450
- 'UploadId' => $job_object->steps_data[ $job_object->step_working ][ 'UploadId' ],
451
- 'Key' => $job_object->job[ 's3dir' ] . $job_object->backup_file,
452
- 'PartNumber' => $job_object->steps_data[ $job_object->step_working ][ 'Part' ],
453
- 'Body' => $part_data ) );
454
- $chunk_upload_time = microtime( TRUE ) - $chunk_upload_start;
455
- $job_object->substeps_done = $job_object->substeps_done + strlen( $part_data );
456
- $job_object->steps_data[ $job_object->step_working ][ 'Parts' ][] = array( 'ETag' => $part->get( 'ETag' ),
457
- 'PartNumber' => $job_object->steps_data[ $job_object->step_working ][ 'Part' ] );
458
- $job_object->steps_data[ $job_object->step_working ][ 'Part' ]++;
459
- $time_remaining = $job_object->do_restart_time();
460
- if ( $time_remaining < $chunk_upload_time )
461
- $job_object->do_restart_time( TRUE );
462
- $job_object->update_working_data();
463
- }
464
-
465
- $s3->completeMultipartUpload( array( 'Bucket' => $job_object->job[ 's3bucket' ],
466
- 'UploadId' => $job_object->steps_data[ $job_object->step_working ][ 'UploadId' ],
467
- 'Key' => $job_object->job[ 's3dir' ] . $job_object->backup_file,
468
- 'Parts' => $job_object->steps_data[ $job_object->step_working ][ 'Parts' ] ) );
469
-
470
- } catch ( Exception $e ) {
471
- $job_object->log( E_USER_ERROR, sprintf( __( 'S3 Service API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
472
- if ( ! empty( $job_object->steps_data[ $job_object->step_working ][ 'uploadId' ] ) )
473
- $s3->abortMultipartUpload( array( 'Bucket' => $job_object->job[ 's3bucket' ],
474
- 'UploadId' => $job_object->steps_data[ $job_object->step_working ][ 'uploadId' ],
475
- 'Key' => $job_object->job[ 's3dir' ] . $job_object->backup_file ) );
476
- unset( $job_object->steps_data[ $job_object->step_working ][ 'UploadId' ] );
477
- unset( $job_object->steps_data[ $job_object->step_working ][ 'Parts' ] );
478
- unset( $job_object->steps_data[ $job_object->step_working ][ 'Part' ] );
479
- $job_object->substeps_done = 0;
480
- if ( is_resource( $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ] ) )
481
- fclose( $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ] );
482
- return FALSE;
483
- }
484
- fclose( $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ] );
485
- }
486
-
487
- $result = $s3->headObject( array( 'Bucket' => $job_object->job[ 's3bucket' ],
488
- 'Key' => $job_object->job[ 's3dir' ] . $job_object->backup_file) );
489
-
490
- if ( $result->get( 'ContentLength' ) == filesize( $job_object->backup_folder . $job_object->backup_file ) ) {
491
- $job_object->substeps_done = 1 + $job_object->backup_filesize;
492
- $job_object->log( sprintf( __( 'Backup transferred to %s.', 'backwpup' ), $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ). '/' .$job_object->job[ 's3bucket' ] . '/' . $job_object->job[ 's3dir' ] . $job_object->backup_file ), E_USER_NOTICE );
493
- if ( ! empty( $job_object->job[ 'jobid' ] ) )
494
- BackWPup_Option::update( $job_object->job[ 'jobid' ], 'lastbackupdownloadurl', network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=downloads3&file=' . $job_object->job[ 's3dir' ] . $job_object->backup_file . '&jobid=' . $job_object->job[ 'jobid' ] );
495
- }
496
- else {
497
- $job_object->log( sprintf( __( 'Cannot transfer backup to S3! (%1$d) %2$s', 'backwpup' ), $result->get( "status" ), $result->get( "Message" ) ), E_USER_ERROR );
498
- }
499
- }
500
- catch ( Exception $e ) {
501
- $job_object->log( E_USER_ERROR, sprintf( __( 'S3 Service API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
502
-
503
- return FALSE;
504
- }
505
-
506
- try {
507
- $backupfilelist = array();
508
- $filecounter = 0;
509
- $files = array();
510
- $args = array(
511
- 'Bucket' => $job_object->job[ 's3bucket' ],
512
- 'Prefix' => (string) $job_object->job[ 's3dir' ]
513
- );
514
- $objects = $s3->getIterator('ListObjects', $args );
515
- if ( is_object( $objects ) ) {
516
- foreach ( $objects as $object ) {
517
- $file = basename( $object[ 'Key' ] );
518
- $changetime = strtotime( $object[ 'LastModified' ] ) + ( get_option( 'gmt_offset' ) * 3600 );
519
- if ( $job_object->is_backup_archive( $file ) )
520
- $backupfilelist[ $changetime ] = $file;
521
- $files[ $filecounter ][ 'folder' ] = $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ). '/' .$job_object->job[ 's3bucket' ] . '/' . dirname( $object[ 'Key' ] );
522
- $files[ $filecounter ][ 'file' ] = $object[ 'Key' ];
523
- $files[ $filecounter ][ 'filename' ] = basename( $object[ 'Key' ] );
524
- if ( ! empty( $object[ 'StorageClass' ] ) )
525
- $files[ $filecounter ][ 'info' ] = sprintf( __('Storage Class: %s', 'backwpup' ), $object[ 'StorageClass' ] );
526
- $files[ $filecounter ][ 'downloadurl' ] = network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=downloads3&file=' . $object[ 'Key' ] . '&jobid=' . $job_object->job[ 'jobid' ];
527
- $files[ $filecounter ][ 'filesize' ] = $object[ 'Size' ];
528
- $files[ $filecounter ][ 'time' ] = $changetime;
529
- $filecounter ++;
530
- }
531
- }
532
- if ( $job_object->job[ 's3maxbackups' ] > 0 && is_object( $s3 ) ) { //Delete old backups
533
- if ( count( $backupfilelist ) > $job_object->job[ 's3maxbackups' ] ) {
534
- ksort( $backupfilelist );
535
- $numdeltefiles = 0;
536
- while ( $file = array_shift( $backupfilelist ) ) {
537
- if ( count( $backupfilelist ) < $job_object->job[ 's3maxbackups' ] )
538
- break;
539
- //delete files on S3
540
- $args = array(
541
- 'Bucket' => $job_object->job[ 's3bucket' ],
542
- 'Key' => $job_object->job[ 's3dir' ] . $file
543
- );
544
- if ( $s3->deleteObject( $args ) ) {
545
- foreach ( $files as $key => $filedata ) {
546
- if ( $filedata[ 'file' ] == $job_object->job[ 's3dir' ] . $file )
547
- unset( $files[ $key ] );
548
- }
549
- $numdeltefiles ++;
550
- } else {
551
- $job_object->log( sprintf( __( 'Cannot delete backup from %s.', 'backwpup' ), $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ). '/' .$job_object->job[ 's3bucket' ] . '/' . $job_object->job[ 's3dir' ] . $file ), E_USER_ERROR );
552
- }
553
- }
554
- if ( $numdeltefiles > 0 )
555
- $job_object->log( sprintf( _n( 'One file deleted on S3 Bucket.', '%d files deleted on S3 Bucket', $numdeltefiles, 'backwpup' ), $numdeltefiles ), E_USER_NOTICE );
556
- }
557
- }
558
- set_site_transient( 'backwpup_' . $job_object->job[ 'jobid' ] . '_s3', $files, 60 * 60 * 24 * 7 );
559
- }
560
- catch ( Exception $e ) {
561
- $job_object->log( E_USER_ERROR, sprintf( __( 'S3 Service API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
562
-
563
- return FALSE;
564
- }
565
- $job_object->substeps_done = 2 + $job_object->backup_filesize;
566
-
567
- return TRUE;
568
- }
569
-
570
-
571
- /**
572
- * @param $job_object
573
- * @return bool
574
- */
575
- public function can_run( $job_object ) {
576
-
577
- if ( empty( $job_object->job[ 's3accesskey' ] ) )
578
- return FALSE;
579
-
580
- if ( empty( $job_object->job[ 's3secretkey' ] ) )
581
- return FALSE;
582
-
583
- if ( empty( $job_object->job[ 's3bucket' ] ) )
584
- return FALSE;
585
-
586
- return TRUE;
587
- }
588
-
589
- /**
590
- *
591
- */
592
- public function edit_inline_js() {
593
- //<script type="text/javascript">
594
- ?>
595
- function awsgetbucket() {
596
- var data = {
597
- action: 'backwpup_dest_s3',
598
- s3accesskey: $('input[name="s3accesskey"]').val(),
599
- s3secretkey: $('input[name="s3secretkey"]').val(),
600
- s3bucketselected: $('input[name="s3bucketselected"]').val(),
601
- s3base_url: $('input[name="s3base_url"]').val(),
602
- s3region: $('#s3region').val(),
603
- _ajax_nonce: $('#backwpupajaxnonce').val()
604
- };
605
- $.post(ajaxurl, data, function(response) {
606
- $('#s3bucketerror').remove();
607
- $('#s3bucket').remove();
608
- $('#s3bucketselected').after(response);
609
- });
610
- }
611
- $('input[name="s3accesskey"]').change(function() {awsgetbucket();});
612
- $('input[name="s3secretkey"]').change(function() {awsgetbucket();});
613
- $('input[name="s3base_url"]').change(function() {awsgetbucket();});
614
- $('#s3region').change(function() {awsgetbucket();});
615
- <?php
616
- }
617
-
618
- /**
619
- * @param string $args
620
- */
621
- public function edit_ajax( $args = '' ) {
622
-
623
- $error = '';
624
-
625
- if ( is_array( $args ) ) {
626
- $ajax = FALSE;
627
- }
628
- else {
629
- if ( ! current_user_can( 'backwpup_jobs_edit' ) )
630
- wp_die( -1 );
631
- check_ajax_referer( 'backwpup_ajax_nonce' );
632
- $args[ 's3accesskey' ] = $_POST[ 's3accesskey' ];
633
- $args[ 's3secretkey' ] = $_POST[ 's3secretkey' ];
634
- $args[ 's3bucketselected' ] = $_POST[ 's3bucketselected' ];
635
- $args[ 's3base_url' ] = $_POST[ 's3base_url' ];
636
- $args[ 's3region' ] = $_POST[ 's3region' ];
637
- $ajax = TRUE;
638
- }
639
- echo '<span id="s3bucketerror" style="color:red;">';
640
-
641
- if ( ! empty( $args[ 's3accesskey' ] ) && ! empty( $args[ 's3secretkey' ] ) ) {
642
- try {
643
- $s3 = Aws\S3\S3Client::factory( array( 'key' => $args[ 's3accesskey' ],
644
- 'secret' => BackWPup_Encryption::decrypt( $args[ 's3secretkey' ] ),
645
- 'region' => $args[ 's3region' ],
646
- 'base_url' => $this->get_s3_base_url( $args[ 's3region' ], $args[ 's3base_url' ]),
647
- 'scheme' => 'https',
648
- 'ssl.certificate_authority' => BackWPup::get_plugin_data( 'cacert' ) ) );
649
-
650
- $buckets = $s3->listBuckets();
651
- }
652
- catch ( Exception $e ) {
653
- $error = $e->getMessage();
654
- }
655
- }
656
-
657
- if ( empty( $args[ 's3accesskey' ] ) )
658
- _e( 'Missing access key!', 'backwpup' );
659
- elseif ( empty( $args[ 's3secretkey' ] ) )
660
- _e( 'Missing secret access key!', 'backwpup' );
661
- elseif ( ! empty( $error ) && $error == 'Access Denied' )
662
- echo '<input type="text" name="s3bucket" id="s3bucket" value="' . esc_attr( $args[ 's3bucketselected' ] ) . '" >';
663
- elseif ( ! empty( $error ) )
664
- echo esc_html( $error );
665
- elseif ( ! isset( $buckets ) || count( $buckets['Buckets'] ) < 1 )
666
- _e( 'No bucket found!', 'backwpup' );
667
- echo '</span>';
668
-
669
- if ( !empty( $buckets['Buckets'] ) ) {
670
- echo '<select name="s3bucket" id="s3bucket">';
671
- foreach ( $buckets['Buckets'] as $bucket ) {
672
- echo "<option " . selected( $args[ 's3bucketselected' ], esc_attr( $bucket['Name'] ), FALSE ) . ">" . esc_attr( $bucket['Name'] ) . "</option>";
673
- }
674
- echo '</select>';
675
- }
676
-
677
- if ( $ajax )
678
- die();
679
- }
680
- }
1
+ <?php
2
+ // Amazon S3 SDK v2.6.1
3
+ // http://aws.amazon.com/de/sdkforphp2/
4
+ // https://github.com/aws/aws-sdk-php
5
+
6
+ /**
7
+ * Documentation: http://docs.amazonwebservices.com/aws-sdk-php-2/latest/class-Aws.S3.S3Client.html
8
+ */
9
+ class BackWPup_Destination_S3 extends BackWPup_Destinations {
10
+
11
+
12
+ /**
13
+ * @param $s3region
14
+ * @param string $s3base_url
15
+ * @return string
16
+ */
17
+ protected function get_s3_base_url( $s3region, $s3base_url = '' ) {
18
+
19
+ if ( ! empty( $s3base_url ) )
20
+ return $s3base_url;
21
+
22
+ switch ( $s3region ) {
23
+ case 'us-east-1':
24
+ return 'https://s3.amazonaws.com';
25
+ case 'us-west-1':
26
+ return 'https://s3-us-west-1.amazonaws.com';
27
+ case 'us-west-2':
28
+ return 'https://s3-us-west-2.amazonaws.com';
29
+ case 'eu-west-1':
30
+ return 'https://s3-eu-west-1.amazonaws.com';
31
+ case 'eu-central-1':
32
+ return 'https://s3-eu-central-1.amazonaws.com';
33
+ case 'ap-northeast-1':
34
+ return 'https://s3-ap-northeast-1.amazonaws.com';
35
+ case 'ap-southeast-1':
36
+ return 'https://s3-ap-southeast-1.amazonaws.com';
37
+ case 'ap-southeast-2':
38
+ return 'https://s3-ap-southeast-2.amazonaws.com';
39
+ case 'sa-east-1':
40
+ return 'https://s3-sa-east-1.amazonaws.com';
41
+ case 'cn-north-1':
42
+ return 'https:/cn-north-1.amazonaws.com';
43
+ case 'google-storage':
44
+ return 'https://storage.googleapis.com';
45
+ case 'dreamhost':
46
+ return 'https://objects.dreamhost.com';
47
+ case 'greenqloud':
48
+ return 'http://s.greenqloud.com';
49
+ default:
50
+ return '';
51
+ }
52
+
53
+ }
54
+
55
+ /**
56
+ * @return array
57
+ */
58
+ public function option_defaults() {
59
+
60
+ return array( 's3accesskey' => '', 's3secretkey' => '', 's3bucket' => '', 's3region' => 'us-east-1', 's3base_url' => '', 's3ssencrypt' => '', 's3storageclass' => '', 's3dir' => trailingslashit( sanitize_file_name( get_bloginfo( 'name' ) ) ), 's3maxbackups' => 15, 's3syncnodelete' => TRUE, 's3multipart' => TRUE );
61
+ }
62
+
63
+
64
+ /**
65
+ * @param $jobid
66
+ */
67
+ public function edit_tab( $jobid ) {
68
+
69
+ ?>
70
+ <h3 class="title"><?php _e( 'S3 Service', 'backwpup' ) ?></h3>
71
+ <p></p>
72
+ <table class="form-table">
73
+ <tr>
74
+ <th scope="row"><label for="s3region"><?php _e( 'Select a S3 service', 'backwpup' ) ?></label></th>
75
+ <td>
76
+ <select name="s3region" id="s3region" title="<?php _e( 'Amazon S3 Region', 'backwpup' ); ?>">
77
+ <option value="us-east-1" <?php selected( 'us-east-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: US Standard', 'backwpup' ); ?></option>
78
+ <option value="us-west-1" <?php selected( 'us-west-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: US West (Northern California)', 'backwpup' ); ?></option>
79
+ <option value="us-west-2" <?php selected( 'us-west-2', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: US West (Oregon)', 'backwpup' ); ?></option>
80
+ <option value="eu-west-1" <?php selected( 'eu-west-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: EU (Ireland)', 'backwpup' ); ?></option>
81
+ <option value="eu-central-1" <?php selected( 'eu-central-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: EU (Germany)', 'backwpup' ); ?></option>
82
+ <option value="ap-northeast-1" <?php selected( 'ap-northeast-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: Asia Pacific (Tokyo)', 'backwpup' ); ?></option>
83
+ <option value="ap-southeast-1" <?php selected( 'ap-southeast-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: Asia Pacific (Singapore)', 'backwpup' ); ?></option>
84
+ <option value="ap-southeast-2" <?php selected( 'ap-southeast-2', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: Asia Pacific (Sydney)', 'backwpup' ); ?></option>
85
+ <option value="sa-east-1" <?php selected( 'sa-east-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: South America (Sao Paulo)', 'backwpup' ); ?></option>
86
+ <option value="cn-north-1" <?php selected( 'cn-north-1', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Amazon S3: China (Beijing)', 'backwpup' ); ?></option>
87
+ <option value="google-storage" <?php selected( 'google-storage', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Google Storage (Interoperable Access)', 'backwpup' ); ?></option>
88
+ <option value="dreamhost" <?php selected( 'dreamhost', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'Dream Host Cloud Storage', 'backwpup' ); ?></option>
89
+ <option value="greenqloud" <?php selected( 'greenqloud', BackWPup_Option::get( $jobid, 's3region' ), TRUE ) ?>><?php _e( 'GreenQloud Storage Qloud', 'backwpup' ); ?></option>
90
+ </select>
91
+ </td>
92
+ </tr>
93
+ <tr>
94
+ <th scope="row"><label for="s3base_url"><?php _e( 'Or a S3 Server URL', 'backwpup' ) ?></label></th>
95
+ <td>
96
+ <input id="s3base_url" name="s3base_url" type="text" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3base_url' ) );?>" class="regular-text" autocomplete="off" />
97
+ </td>
98
+ </tr>
99
+ </table>
100
+
101
+ <h3 class="title"><?php _e( 'S3 Access Keys', 'backwpup' ); ?></h3>
102
+ <p></p>
103
+ <table class="form-table">
104
+ <tr>
105
+ <th scope="row"><label for="s3accesskey"><?php _e( 'Access Key', 'backwpup' ); ?></label></th>
106
+ <td>
107
+ <input id="s3accesskey" name="s3accesskey" type="text"
108
+ value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3accesskey' ) );?>" class="regular-text" autocomplete="off" />
109
+ </td>
110
+ </tr>
111
+ <tr>
112
+ <th scope="row"><label for="s3secretkey"><?php _e( 'Secret Key', 'backwpup' ); ?></label></th>
113
+ <td>
114
+ <input id="s3secretkey" name="s3secretkey" type="password"
115
+ value="<?php echo esc_attr( BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 's3secretkey' ) ) ); ?>" class="regular-text" autocomplete="off" />
116
+ </td>
117
+ </tr>
118
+ </table>
119
+
120
+ <h3 class="title"><?php _e( 'S3 Bucket', 'backwpup' ); ?></h3>
121
+ <p></p>
122
+ <table class="form-table">
123
+ <tr>
124
+ <th scope="row"><label for="s3bucketselected"><?php _e( 'Bucket selection', 'backwpup' ); ?></label></th>
125
+ <td>
126
+ <input id="s3bucketselected" name="s3bucketselected" type="hidden" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3bucket' ) ); ?>" />
127
+ <?php if ( BackWPup_Option::get( $jobid, 's3accesskey' ) && BackWPup_Option::get( $jobid, 's3secretkey' ) ) $this->edit_ajax( array(
128
+ 's3accesskey' => BackWPup_Option::get( $jobid, 's3accesskey' ),
129
+ 's3secretkey' => BackWPup_Encryption::decrypt(BackWPup_Option::get( $jobid, 's3secretkey' ) ),
130
+ 's3bucketselected' => BackWPup_Option::get( $jobid, 's3bucket' ),
131
+ 's3base_url' => BackWPup_Option::get( $jobid, 's3base_url' ),
132
+ 's3region' => BackWPup_Option::get( $jobid, 's3region' )
133
+ ) ); ?>
134
+ </td>
135
+ </tr>
136
+ <tr>
137
+ <th scope="row"><label for="s3newbucket"><?php _e( 'Create a new bucket', 'backwpup' ); ?></label></th>
138
+ <td>
139
+ <input id="s3newbucket" name="s3newbucket" type="text" value="" class="small-text" autocomplete="off" />
140
+ </td>
141
+ </tr>
142
+ </table>
143
+
144
+ <h3 class="title"><?php _e( 'S3 Backup settings', 'backwpup' ); ?></h3>
145
+ <p></p>
146
+ <table class="form-table">
147
+ <tr>
148
+ <th scope="row"><label for="ids3dir"><?php _e( 'Folder in bucket', 'backwpup' ); ?></label></th>
149
+ <td>
150
+ <input id="ids3dir" name="s3dir" type="text" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3dir' ) ); ?>" class="regular-text" />
151
+ </td>
152
+ </tr>
153
+ <tr>
154
+ <th scope="row"><?php _e( 'File deletion', 'backwpup' ); ?></th>
155
+ <td>
156
+ <?php
157
+ if ( BackWPup_Option::get( $jobid, 'backuptype' ) == 'archive' ) {
158
+ ?>
159
+ <label for="ids3maxbackups"><input id="ids3maxbackups" name="s3maxbackups" type="text" size="3" value="<?php echo esc_attr( BackWPup_Option::get( $jobid, 's3maxbackups' ) ); ?>" class="small-text help-tip" title="<?php esc_attr_e( 'Oldest files will be deleted first. 0 = no deletion', 'backwpup' ); ?>" />&nbsp;
160
+ <?php _e( 'Number of files to keep in folder.', 'backwpup' ); ?></label>
161
+ <?php } else { ?>
162
+ <label for="ids3syncnodelete"><input class="checkbox" value="1"
163
+ type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 's3syncnodelete' ), TRUE ); ?>
164
+ name="s3syncnodelete" id="ids3syncnodelete" /> <?php _e( 'Do not delete files while syncing to destination!', 'backwpup' ); ?></label>
165
+ <?php } ?>
166
+ </td>
167
+ </tr>
168
+ <?php if ( BackWPup_Option::get( $jobid, 'backuptype' ) == 'archive' ) { ?>
169
+ <tr>
170
+ <th scope="row"><?php _e( 'Multipart Upload', 'backwpup' ); ?></th>
171
+ <td>
172
+ <label for="ids3multipart"><input class="checkbox help-tip" value="1" title="<?php esc_attr_e( 'Multipart splits file into multiple chunks while uploading. This is necessary for displaying the upload process and to transfer bigger files. Works without a problem on Amazon. Other services might have issues.', 'backwpup'); ?>"
173
+ type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 's3multipart' ), TRUE ); ?>
174
+ name="s3multipart" id="ids3multipart" /> <?php _e( 'Use multipart upload for uploading a file', 'backwpup' ); ?></label>
175
+ </td>
176
+ </tr>
177
+ <?php } ?>
178
+ </table>
179
+
180
+ <h3 class="title"><?php _e( 'Amazon specific settings', 'backwpup' ); ?></h3>
181
+ <p></p>
182
+ <table class="form-table">
183
+ <tr>
184
+ <th scope="row"><label for="ids3storageclass"><?php _e( 'Amazon: Storage Class', 'backwpup' ); ?></label></th>
185
+ <td>
186
+ <select name="s3storageclass" id="ids3storageclass" title="<?php _e( 'Amazon: Storage Class', 'backwpup' ); ?>">
187
+ <option value="" <?php selected( 'us-east-1', BackWPup_Option::get( $jobid, 's3storageclass' ), TRUE ) ?>><?php _e( 'none', 'backwpup' ); ?></option>
188
+ <option value="REDUCED_REDUNDANCY" <?php selected( 'REDUCED_REDUNDANCY', BackWPup_Option::get( $jobid, 's3storageclass' ), TRUE ) ?>><?php _e( 'Reduced Redundancy', 'backwpup' ); ?></option>
189
+ </select>
190
+ </td>
191
+ </tr>
192
+ <tr>
193
+ <th scope="row"><label for="ids3ssencrypt"><?php _e( 'Server side encryption', 'backwpup' ); ?></label></th>
194
+ <td>
195
+ <input class="checkbox" value="AES256"
196
+ type="checkbox" <?php checked( BackWPup_Option::get( $jobid, 's3ssencrypt' ), 'AES256' ); ?>
197
+ name="s3ssencrypt" id="ids3ssencrypt" /> <?php _e( 'Save files encrypted (AES256) on server.', 'backwpup' ); ?>
198
+ </td>
199
+ </tr>
200
+ </table>
201
+
202
+ <?php
203
+ }
204
+
205
+
206
+ /**
207
+ * @param $jobid
208
+ * @return string
209
+ */
210
+ public function edit_form_post_save( $jobid ) {
211
+
212
+ BackWPup_Option::update( $jobid, 's3accesskey', isset( $_POST[ 's3accesskey' ] ) ? $_POST[ 's3accesskey' ] : '' );
213
+ BackWPup_Option::update( $jobid, 's3secretkey', isset( $_POST[ 's3secretkey' ] ) ? BackWPup_Encryption::encrypt( $_POST[ 's3secretkey' ] ) : '' );
214
+ BackWPup_Option::update( $jobid, 's3base_url', isset( $_POST[ 's3base_url' ] ) ? esc_url_raw( $_POST[ 's3base_url' ] ) : '' );
215
+ BackWPup_Option::update( $jobid, 's3region', isset( $_POST[ 's3region' ] ) ? $_POST[ 's3region' ] : '' );
216
+ BackWPup_Option::update( $jobid, 's3storageclass', isset( $_POST[ 's3storageclass' ] ) ? $_POST[ 's3storageclass' ] : '' );
217
+ BackWPup_Option::update( $jobid, 's3ssencrypt', ( isset( $_POST[ 's3ssencrypt' ] ) && $_POST[ 's3ssencrypt' ] == 'AES256' ) ? 'AES256' : '' );
218
+ BackWPup_Option::update( $jobid, 's3bucket', isset( $_POST[ 's3bucket' ] ) ? $_POST[ 's3bucket' ] : '' );
219
+
220
+ $_POST[ 's3dir' ] = trailingslashit( str_replace( '//', '/', str_replace( '\\', '/', trim( stripslashes( $_POST[ 's3dir' ] ) ) ) ) );
221
+ if ( substr( $_POST[ 's3dir' ], 0, 1 ) == '/' )
222
+ $_POST[ 's3dir' ] = substr( $_POST[ 's3dir' ], 1 );
223
+ if ( $_POST[ 's3dir' ] == '/' )
224
+ $_POST[ 's3dir' ] = '';
225
+ BackWPup_Option::update( $jobid, 's3dir', $_POST[ 's3dir' ] );
226
+
227
+ BackWPup_Option::update( $jobid, 's3maxbackups', isset( $_POST[ 's3maxbackups' ] ) ? (int)$_POST[ 's3maxbackups' ] : 0 );
228
+ BackWPup_Option::update( $jobid, 's3syncnodelete', ( isset( $_POST[ 's3syncnodelete' ] ) && $_POST[ 's3syncnodelete' ] == 1 ) ? TRUE : FALSE );
229
+ BackWPup_Option::update( $jobid, 's3multipart', ( isset( $_POST[ 's3multipart' ] ) && $_POST[ 's3multipart' ] == 1 ) ? TRUE : FALSE );
230
+
231
+ //create new bucket
232
+ if ( !empty( $_POST[ 's3newbucket' ] ) ) {
233
+ try {
234
+ $s3 = Aws\S3\S3Client::factory( array( 'key' => $_POST[ 's3accesskey' ],
235
+ 'secret' => $_POST[ 's3secretkey' ],
236
+ 'region' => $_POST[ 's3region' ],
237
+ 'base_url' => $this->get_s3_base_url( $_POST[ 's3region' ], $_POST[ 's3base_url' ]),
238
+ 'scheme' => 'https',
239
+ 'ssl.certificate_authority' => BackWPup::get_plugin_data( 'cacert' ) ) );
240
+ // set bucket creation region
241
+ if ( $_POST[ 's3region' ] == 'google-storage' || $_POST[ 's3region' ] == 'hosteurope' )
242
+ $region = 'EU';
243
+ else
244
+ $region = $_POST[ 's3region' ];
245
+
246
+ if ($s3->isValidBucketName( $_POST[ 's3newbucket' ] ) ) {
247
+ $bucket = $s3->createBucket( array(
248
+ 'Bucket' => $_POST[ 's3newbucket' ] ,
249
+ 'LocationConstraint' => $region
250
+ ) );
251
+ $s3->waitUntil('bucket_exists', $_POST[ 's3newbucket' ]);
252
+ if ( $bucket->get( 'Location' ) )
253
+ BackWPup_Admin::message( sprintf( __( 'Bucket %1$s created in %2$s.','backwpup'), $_POST[ 's3newbucket' ], $bucket->get( 'Location' ) ) );
254
+ else
255
+ BackWPup_Admin::message( sprintf( __( 'Bucket %s could not be created.','backwpup'), $_POST[ 's3newbucket' ] ), TRUE );
256
+ } else {
257
+ BackWPup_Admin::message( sprintf( __( ' %s is not a valid bucket name.','backwpup'), $_POST[ 's3newbucket' ] ), TRUE );
258
+ }
259
+ }
260
+ catch ( Aws\S3\Exception\S3Exception $e ) {
261
+ BackWPup_Admin::message( $e->getMessage(), TRUE );
262
+ }
263
+ BackWPup_Option::update( $jobid, 's3bucket', $_POST[ 's3newbucket' ] );
264
+ }
265
+ }
266
+
267
+ /**
268
+ * @param $jobdest
269
+ * @param $backupfile
270
+ */
271
+ public function file_delete( $jobdest, $backupfile ) {
272
+
273
+ $files = get_site_transient( 'backwpup_'. strtolower( $jobdest ), array() );
274
+ list( $jobid, $dest ) = explode( '_', $jobdest );
275
+
276
+ if ( BackWPup_Option::get( $jobid, 's3accesskey' ) && BackWPup_Option::get( $jobid, 's3secretkey' ) && BackWPup_Option::get( $jobid, 's3bucket' ) ) {
277
+ try {
278
+ $s3 = Aws\S3\S3Client::factory( array( 'key' => BackWPup_Option::get( $jobid, 's3accesskey' ),
279
+ 'secret' => BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 's3secretkey' ) ),
280
+ 'region' => BackWPup_Option::get( $jobid, 's3region' ),
281
+ 'base_url' => $this->get_s3_base_url( BackWPup_Option::get( $jobid, 's3region' ), BackWPup_Option::get( $jobid, 's3base_url' ) ),
282
+ 'scheme' => 'https',
283
+ 'ssl.certificate_authority' => BackWPup::get_plugin_data( 'cacert' ) ) );
284
+
285
+ $s3->deleteObject( array(
286
+ 'Bucket' => BackWPup_Option::get( $jobid, 's3bucket' ),
287
+ 'Key' => $backupfile
288
+ ) );
289
+ //update file list
290
+ foreach ( $files as $key => $file ) {
291
+ if ( is_array( $file ) && $file[ 'file' ] == $backupfile )
292
+ unset( $files[ $key ] );
293
+ }
294
+ unset( $s3 );
295
+ }
296
+ catch ( Exception $e ) {
297
+ BackWPup_Admin::message( sprintf( __('S3 Service API: %s','backwpup'), $e->getMessage() ), TRUE );
298
+ }
299
+ }
300
+
301
+ set_site_transient( 'backwpup_'. strtolower( $jobdest ), $files, 60 * 60 * 24 * 7 );
302
+ }
303
+
304
+ /**
305
+ * @param $jobid
306
+ * @param $get_file
307
+ */
308
+ public function file_download( $jobid, $get_file ) {
309
+
310
+ try {
311
+ $s3 = Aws\S3\S3Client::factory( array( 'key' => BackWPup_Option::get( $jobid, 's3accesskey' ),
312
+ 'secret' => BackWPup_Encryption::decrypt( BackWPup_Option::get( $jobid, 's3secretkey' ) ),
313
+ 'region' => BackWPup_Option::get( $jobid, 's3region' ),
314
+ 'base_url' => $this->get_s3_base_url( BackWPup_Option::get( $jobid, 's3region' ), BackWPup_Option::get( $jobid, 's3base_url' ) ),
315
+ 'scheme' => 'https',
316
+ 'ssl.certificate_authority' => BackWPup::get_plugin_data( 'cacert' ) ) );
317
+
318
+ $s3file = $s3->getObject( array(
319
+ 'Bucket' => BackWPup_Option::get( $jobid, 's3bucket' ),
320
+ 'Key' => $get_file ) );
321
+ }
322
+ catch ( Exception $e ) {
323
+ die( $e->getMessage() );
324
+ }
325
+
326
+ if ( $s3file[ 'ContentLength' ] > 0 && ! empty( $s3file[ 'ContentType' ] ) ) {
327
+ header( "Pragma: public" );
328
+ header( "Expires: 0" );
329
+ header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );;
330
+ header( "Content-Type: application/octet-stream" );
331
+ header( "Content-Disposition: attachment; filename=" . basename( $get_file ) . ";" );
332
+ header( "Content-Transfer-Encoding: binary" );
333
+ header( "Content-Length: " . $s3file[ 'ContentLength' ] );
334
+ @set_time_limit( 300 );
335
+ $body = $s3file->get( 'Body' );
336
+ $body->rewind();
337
+ while ( $filedata = $body->read( 1024 ) ) {
338
+ echo $filedata;
339
+ }
340
+ die();
341
+ }
342
+ }
343
+
344
+ /**
345
+ * @param $jobdest
346
+ * @return mixed
347
+ */
348
+ public function file_get_list( $jobdest ) {
349
+
350
+ return get_site_transient( 'backwpup_' . strtolower( $jobdest ) );
351
+ }
352
+
353
+ /**
354
+ * @param $job_object
355
+ * @return bool
356
+ */
357
+ public function job_run_archive( &$job_object ) {
358
+
359
+ $job_object->substeps_todo = 2 + $job_object->backup_filesize;
360
+ if ( $job_object->steps_data[ $job_object->step_working ]['SAVE_STEP_TRY'] != $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] )
361
+ $job_object->log( sprintf( __( '%d. Trying to send backup file to S3 Service&#160;&hellip;', 'backwpup' ), $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] ), E_USER_NOTICE );
362
+
363
+ try {
364
+ $s3 = Aws\S3\S3Client::factory( array( 'key' => $job_object->job[ 's3accesskey' ],
365
+ 'secret' => BackWPup_Encryption::decrypt( $job_object->job[ 's3secretkey' ] ),
366
+ 'region' => $job_object->job[ 's3region' ],
367
+ 'base_url' => $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ),
368
+ 'scheme' => 'https',
369
+ 'ssl.certificate_authority' => BackWPup::get_plugin_data( 'cacert' ) ) );
370
+
371
+ if ( $job_object->steps_data[ $job_object->step_working ]['SAVE_STEP_TRY'] != $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] && $job_object->substeps_done < $job_object->backup_filesize ) {
372
+ if ( $s3->doesBucketExist( $job_object->job[ 's3bucket' ] ) ) {
373
+ $bucketregion = $s3->getBucketLocation( array( 'Bucket' => $job_object->job[ 's3bucket' ] ) );
374
+ $job_object->log( sprintf( __( 'Connected to S3 Bucket "%1$s" in %2$s', 'backwpup' ), $job_object->job[ 's3bucket' ], $bucketregion->get( 'Location' ) ), E_USER_NOTICE );
375
+ }
376
+ else {
377
+ $job_object->log( sprintf( __( 'S3 Bucket "%s" does not exist!', 'backwpup' ), $job_object->job[ 's3bucket' ] ), E_USER_ERROR );
378
+
379
+ return TRUE;
380
+ }
381
+
382
+ if ( $job_object->job[ 's3multipart' ] && empty( $job_object->steps_data[ $job_object->step_working ][ 'UploadId' ] ) ) {
383
+ //Check for aboded Multipart Uploads
384
+ $job_object->log( __( 'Checking for not aborted multipart Uploads&#160;&hellip;', 'backwpup' ) );
385
+ $multipart_uploads = $s3->listMultipartUploads( array( 'Bucket' => $job_object->job[ 's3bucket' ], 'Prefix' => (string) $job_object->job[ 's3dir' ] ) );
386
+ $uploads = $multipart_uploads->get( 'Uploads' );
387
+ if ( ! empty( $uploads ) ) {
388
+ foreach( $uploads as $upload ) {
389
+ $s3->abortMultipartUpload( array( 'Bucket' => $job_object->job[ 's3bucket' ], 'Key' => $upload[ 'Key' ], 'UploadId' => $upload[ 'UploadId' ] ) );
390
+ $job_object->log( sprintf( __( 'Upload for %s aborted.', 'backwpup' ), $upload[ 'Key' ] ) );
391
+ }
392
+ }
393
+ }
394
+
395
+ //transfer file to S3
396
+ $job_object->log( __( 'Starting upload to S3 Service&#160;&hellip;', 'backwpup' ) );
397
+ }
398
+
399
+
400
+ if ( ! $job_object->job[ 's3multipart' ] ) {
401
+ //Prepare Upload
402
+ $create_args = array();
403
+ $create_args[ 'Bucket' ] = $job_object->job[ 's3bucket' ];
404
+ $create_args[ 'ACL' ] = 'private';
405
+ if ( ! empty( $job_object->job[ 's3ssencrypt' ] ) )
406
+ $create_args[ 'ServerSideEncryption' ] = $job_object->job[ 's3ssencrypt' ]; //AES256
407
+ if ( ! empty( $job_object->job[ 's3storageclass' ] ) ) //REDUCED_REDUNDANCY
408
+ $create_args[ 'StorageClass' ] = $job_object->job[ 's3storageclass' ];
409
+ $create_args[ 'Metadata' ] = array( 'BackupTime' => date_i18n( 'Y-m-d H:i:s', $job_object->start_time ) );
410
+
411
+ $create_args[ 'Body' ] = fopen( $job_object->backup_folder . $job_object->backup_file, 'r' );
412
+ $create_args[ 'Key' ] = $job_object->job[ 's3dir' ] . $job_object->backup_file;
413
+ $create_args[ 'ContentType' ] = $job_object->get_mime_type( $job_object->backup_folder . $job_object->backup_file );
414
+
415
+ try {
416
+ $s3->putObject( $create_args );
417
+ } catch ( Aws\Common\Exception\MultipartUploadException $e ) {
418
+ $job_object->log( E_USER_ERROR, sprintf( __( 'S3 Service API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
419
+
420
+ return FALSE;
421
+ }
422
+ } else {
423
+ //Prepare Upload
424
+ $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ] = fopen( $job_object->backup_folder . $job_object->backup_file, 'rb' );
425
+ fseek( $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ], $job_object->substeps_done );
426
+
427
+ try {
428
+
429
+ if ( empty ( $job_object->steps_data[ $job_object->step_working ][ 'UploadId' ] ) ) {
430
+ $args = array( 'ACL' => 'private',
431
+ 'Bucket' => $job_object->job[ 's3bucket' ],
432
+ 'ContentType' => $job_object->get_mime_type( $job_object->backup_folder . $job_object->backup_file ),
433
+ 'Key' => $job_object->job[ 's3dir' ] . $job_object->backup_file );
434
+ if ( !empty( $job_object->job[ 's3ssencrypt' ] ) )
435
+ $args[ 'ServerSideEncryption' ] = $job_object->job[ 's3ssencrypt' ];
436
+ if ( !empty( $job_object->job[ 's3storageclass' ] ) )
437
+ $args[ 'StorageClass' ] = empty( $job_object->job[ 's3storageclass' ] ) ? 'STANDARD' : 'REDUCED_REDUNDANCY';
438
+
439
+ $upload = $s3->createMultipartUpload( $args );
440
+
441
+ $job_object->steps_data[ $job_object->step_working ][ 'UploadId' ] = $upload->get( 'UploadId' );
442
+ $job_object->steps_data[ $job_object->step_working ][ 'Parts' ] = array();
443
+ $job_object->steps_data[ $job_object->step_working ][ 'Part' ] = 1;
444
+ }
445
+
446
+ while ( ! feof( $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ] ) ) {
447
+ $chunk_upload_start = microtime( TRUE );
448
+ $part_data = fread( $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ], 1048576 * 5 ); //5MB Minimum part size
449
+ $part = $s3->uploadPart( array( 'Bucket' => $job_object->job[ 's3bucket' ],
450
+ 'UploadId' => $job_object->steps_data[ $job_object->step_working ][ 'UploadId' ],
451
+ 'Key' => $job_object->job[ 's3dir' ] . $job_object->backup_file,
452
+ 'PartNumber' => $job_object->steps_data[ $job_object->step_working ][ 'Part' ],
453
+ 'Body' => $part_data ) );
454
+ $chunk_upload_time = microtime( TRUE ) - $chunk_upload_start;
455
+ $job_object->substeps_done = $job_object->substeps_done + strlen( $part_data );
456
+ $job_object->steps_data[ $job_object->step_working ][ 'Parts' ][] = array( 'ETag' => $part->get( 'ETag' ),
457
+ 'PartNumber' => $job_object->steps_data[ $job_object->step_working ][ 'Part' ] );
458
+ $job_object->steps_data[ $job_object->step_working ][ 'Part' ]++;
459
+ $time_remaining = $job_object->do_restart_time();
460
+ if ( $time_remaining < $chunk_upload_time )
461
+ $job_object->do_restart_time( TRUE );
462
+ $job_object->update_working_data();
463
+ }
464
+
465
+ $s3->completeMultipartUpload( array( 'Bucket' => $job_object->job[ 's3bucket' ],
466
+ 'UploadId' => $job_object->steps_data[ $job_object->step_working ][ 'UploadId' ],
467
+ 'Key' => $job_object->job[ 's3dir' ] . $job_object->backup_file,
468
+ 'Parts' => $job_object->steps_data[ $job_object->step_working ][ 'Parts' ] ) );
469
+
470
+ } catch ( Exception $e ) {
471
+ $job_object->log( E_USER_ERROR, sprintf( __( 'S3 Service API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
472
+ if ( ! empty( $job_object->steps_data[ $job_object->step_working ][ 'uploadId' ] ) )
473
+ $s3->abortMultipartUpload( array( 'Bucket' => $job_object->job[ 's3bucket' ],
474
+ 'UploadId' => $job_object->steps_data[ $job_object->step_working ][ 'uploadId' ],
475
+ 'Key' => $job_object->job[ 's3dir' ] . $job_object->backup_file ) );
476
+ unset( $job_object->steps_data[ $job_object->step_working ][ 'UploadId' ] );
477
+ unset( $job_object->steps_data[ $job_object->step_working ][ 'Parts' ] );
478
+ unset( $job_object->steps_data[ $job_object->step_working ][ 'Part' ] );
479
+ $job_object->substeps_done = 0;
480
+ if ( is_resource( $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ] ) )
481
+ fclose( $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ] );
482
+ return FALSE;
483
+ }
484
+ fclose( $job_object->steps_data[ $job_object->step_working ][ 'file_handel' ] );
485
+ }
486
+
487
+ $result = $s3->headObject( array( 'Bucket' => $job_object->job[ 's3bucket' ],
488
+ 'Key' => $job_object->job[ 's3dir' ] . $job_object->backup_file) );
489
+
490
+ if ( $result->get( 'ContentLength' ) == filesize( $job_object->backup_folder . $job_object->backup_file ) ) {
491
+ $job_object->substeps_done = 1 + $job_object->backup_filesize;
492
+ $job_object->log( sprintf( __( 'Backup transferred to %s.', 'backwpup' ), $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ). '/' .$job_object->job[ 's3bucket' ] . '/' . $job_object->job[ 's3dir' ] . $job_object->backup_file ), E_USER_NOTICE );
493
+ if ( ! empty( $job_object->job[ 'jobid' ] ) )
494
+ BackWPup_Option::update( $job_object->job[ 'jobid' ], 'lastbackupdownloadurl', network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=downloads3&file=' . $job_object->job[ 's3dir' ] . $job_object->backup_file . '&jobid=' . $job_object->job[ 'jobid' ] );
495
+ }
496
+ else {
497
+ $job_object->log( sprintf( __( 'Cannot transfer backup to S3! (%1$d) %2$s', 'backwpup' ), $result->get( "status" ), $result->get( "Message" ) ), E_USER_ERROR );
498
+ }
499
+ }
500
+ catch ( Exception $e ) {
501
+ $job_object->log( E_USER_ERROR, sprintf( __( 'S3 Service API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
502
+
503
+ return FALSE;
504
+ }
505
+
506
+ try {
507
+ $backupfilelist = array();
508
+ $filecounter = 0;
509
+ $files = array();
510
+ $args = array(
511
+ 'Bucket' => $job_object->job[ 's3bucket' ],
512
+ 'Prefix' => (string) $job_object->job[ 's3dir' ]
513
+ );
514
+ $objects = $s3->getIterator('ListObjects', $args );
515
+ if ( is_object( $objects ) ) {
516
+ foreach ( $objects as $object ) {
517
+ $file = basename( $object[ 'Key' ] );
518
+ $changetime = strtotime( $object[ 'LastModified' ] ) + ( get_option( 'gmt_offset' ) * 3600 );
519
+ if ( $job_object->is_backup_archive( $file ) )
520
+ $backupfilelist[ $changetime ] = $file;
521
+ $files[ $filecounter ][ 'folder' ] = $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ). '/' .$job_object->job[ 's3bucket' ] . '/' . dirname( $object[ 'Key' ] );
522
+ $files[ $filecounter ][ 'file' ] = $object[ 'Key' ];
523
+ $files[ $filecounter ][ 'filename' ] = basename( $object[ 'Key' ] );
524
+ if ( ! empty( $object[ 'StorageClass' ] ) )
525
+ $files[ $filecounter ][ 'info' ] = sprintf( __('Storage Class: %s', 'backwpup' ), $object[ 'StorageClass' ] );
526
+ $files[ $filecounter ][ 'downloadurl' ] = network_admin_url( 'admin.php' ) . '?page=backwpupbackups&action=downloads3&file=' . $object[ 'Key' ] . '&jobid=' . $job_object->job[ 'jobid' ];
527
+ $files[ $filecounter ][ 'filesize' ] = $object[ 'Size' ];
528
+ $files[ $filecounter ][ 'time' ] = $changetime;
529
+ $filecounter ++;
530
+ }
531
+ }
532
+ if ( $job_object->job[ 's3maxbackups' ] > 0 && is_object( $s3 ) ) { //Delete old backups
533
+ if ( count( $backupfilelist ) > $job_object->job[ 's3maxbackups' ] ) {
534
+ ksort( $backupfilelist );
535
+ $numdeltefiles = 0;
536
+ while ( $file = array_shift( $backupfilelist ) ) {
537
+ if ( count( $backupfilelist ) < $job_object->job[ 's3maxbackups' ] )
538
+ break;
539
+ //delete files on S3
540
+ $args = array(
541
+ 'Bucket' => $job_object->job[ 's3bucket' ],
542
+ 'Key' => $job_object->job[ 's3dir' ] . $file
543
+ );
544
+ if ( $s3->deleteObject( $args ) ) {
545
+ foreach ( $files as $key => $filedata ) {
546
+ if ( $filedata[ 'file' ] == $job_object->job[ 's3dir' ] . $file )
547
+ unset( $files[ $key ] );
548
+ }
549
+ $numdeltefiles ++;
550
+ } else {
551
+ $job_object->log( sprintf( __( 'Cannot delete backup from %s.', 'backwpup' ), $this->get_s3_base_url( $job_object->job[ 's3region' ], $job_object->job[ 's3base_url' ] ). '/' .$job_object->job[ 's3bucket' ] . '/' . $job_object->job[ 's3dir' ] . $file ), E_USER_ERROR );
552
+ }
553
+ }
554
+ if ( $numdeltefiles > 0 )
555
+ $job_object->log( sprintf( _n( 'One file deleted on S3 Bucket.', '%d files deleted on S3 Bucket', $numdeltefiles, 'backwpup' ), $numdeltefiles ), E_USER_NOTICE );
556
+ }
557
+ }
558
+ set_site_transient( 'backwpup_' . $job_object->job[ 'jobid' ] . '_s3', $files, 60 * 60 * 24 * 7 );
559
+ }
560
+ catch ( Exception $e ) {
561
+ $job_object->log( E_USER_ERROR, sprintf( __( 'S3 Service API: %s', 'backwpup' ), htmlentities( $e->getMessage() ) ), $e->getFile(), $e->getLine() );
562
+
563
+ return FALSE;
564
+ }
565
+ $job_object->substeps_done = 2 + $job_object->backup_filesize;
566
+
567
+ return TRUE;
568
+ }
569
+
570
+
571
+ /**
572
+ * @param $job_object
573
+ * @return bool
574
+ */
575
+ public function can_run( $job_object ) {
576
+
577
+ if ( empty( $job_object->job[ 's3accesskey' ] ) )
578
+ return FALSE;
579
+
580
+ if ( empty( $job_object->job[ 's3secretkey' ] ) )
581
+ return FALSE;
582
+
583
+ if ( empty( $job_object->job[ 's3bucket' ] ) )
584
+ return FALSE;
585
+
586
+ return TRUE;
587
+ }
588
+
589
+ /**
590
+ *
591
+ */
592
+ public function edit_inline_js() {
593
+ //<script type="text/javascript">
594
+ ?>
595
+ function awsgetbucket() {
596
+ var data = {
597
+ action: 'backwpup_dest_s3',
598
+ s3accesskey: $('input[name="s3accesskey"]').val(),
599
+ s3secretkey: $('input[name="s3secretkey"]').val(),
600
+ s3bucketselected: $('input[name="s3bucketselected"]').val(),
601
+ s3base_url: $('input[name="s3base_url"]').val(),
602
+ s3region: $('#s3region').val(),
603
+ _ajax_nonce: $('#backwpupajaxnonce').val()
604
+ };
605
+ $.post(ajaxurl, data, function(response) {
606
+ $('#s3bucketerror').remove();
607
+ $('#s3bucket').remove();
608
+ $('#s3bucketselected').after(response);
609
+ });
610
+ }
611
+ $('input[name="s3accesskey"]').change(function() {awsgetbucket();});
612
+ $('input[name="s3secretkey"]').change(function() {awsgetbucket();});
613
+ $('input[name="s3base_url"]').change(function() {awsgetbucket();});
614
+ $('#s3region').change(function() {awsgetbucket();});
615
+ <?php
616
+ }
617
+
618
+ /**
619
+ * @param string $args
620
+ */
621
+ public function edit_ajax( $args = '' ) {
622
+
623
+ $error = '';
624
+
625
+ if ( is_array( $args ) ) {
626
+ $ajax = FALSE;
627
+ }
628
+ else {
629
+ if ( ! current_user_can( 'backwpup_jobs_edit' ) )
630
+ wp_die( -1 );
631
+ check_ajax_referer( 'backwpup_ajax_nonce' );
632
+ $args[ 's3accesskey' ] = $_POST[ 's3accesskey' ];
633
+ $args[ 's3secretkey' ] = $_POST[ 's3secretkey' ];
634
+ $args[ 's3bucketselected' ] = $_POST[ 's3bucketselected' ];
635
+ $args[ 's3base_url' ] = $_POST[ 's3base_url' ];
636
+ $args[ 's3region' ] = $_POST[ 's3region' ];
637
+ $ajax = TRUE;
638
+ }
639
+ echo '<span id="s3bucketerror" style="color:red;">';
640
+
641
+ if ( ! empty( $args[ 's3accesskey' ] ) && ! empty( $args[ 's3secretkey' ] ) ) {
642
+ try {
643
+ $s3 = Aws\S3\S3Client::factory( array( 'key' => $args[ 's3accesskey' ],
644
+ 'secret' => BackWPup_Encryption::decrypt( $args[ 's3secretkey' ] ),
645
+ 'region' => $args[ 's3region' ],
646
+ 'base_url' => $this->get_s3_base_url( $args[ 's3region' ], $args[ 's3base_url' ]),
647
+ 'scheme' => 'https',
648
+ 'ssl.certificate_authority' => BackWPup::get_plugin_data( 'cacert' ) ) );
649
+
650
+ $buckets = $s3->listBuckets();
651
+ }
652
+ catch ( Exception $e ) {
653
+ $error = $e->getMessage();
654
+ }
655
+ }
656
+
657
+ if ( empty( $args[ 's3accesskey' ] ) )
658
+ _e( 'Missing access key!', 'backwpup' );
659
+ elseif ( empty( $args[ 's3secretkey' ] ) )
660
+ _e( 'Missing secret access key!', 'backwpup' );
661
+ elseif ( ! empty( $error ) && $error == 'Access Denied' )
662
+ echo '<input type="text" name="s3bucket" id="s3bucket" value="' . esc_attr( $args[ 's3bucketselected' ] ) . '" >';
663
+ elseif ( ! empty( $error ) )
664
+ echo esc_html( $error );
665
+ elseif ( ! isset( $buckets ) || count( $buckets['Buckets'] ) < 1 )
666
+ _e( 'No bucket found!', 'backwpup' );
667
+ echo '</span>';
668
+
669
+ if ( !empty( $buckets['Buckets'] ) ) {
670
+ echo '<select name="s3bucket" id="s3bucket">';
671
+ foreach ( $buckets['Buckets'] as $bucket ) {
672
+ echo "<option " . selected( $args[ 's3bucketselected' ], esc_attr( $bucket['Name'] ), FALSE ) . ">" . esc_attr( $bucket['Name'] ) . "</option>";
673
+ }
674
+ echo '</select>';
675
+ }
676
+
677
+ if ( $ajax )
678
+ die();
679
+ }
680
+ }
inc/class-job.php CHANGED
@@ -391,7 +391,7 @@ final class BackWPup_Job {
391
  public static function get_jobrun_url( $starttype, $jobid = 0 ) {
392
 
393
 
394
- $wp_admin_user = get_users( array( 'role' => 'administrator', 'number' => 1 ) ); //get a user for cookie auth
395
  $url = site_url( 'wp-cron.php' );
396
  $header = array();
397
  $authurl = '';
@@ -1116,8 +1116,15 @@ final class BackWPup_Job {
1116
  $in_file = str_replace( str_replace( '\\', '/', ABSPATH ), '', str_replace( '\\', '/', $args[ 2 ] ) );
1117
 
1118
  //print message to cli
1119
- if ( php_sapi_name() == 'cli' && defined( 'STDOUT' ) )
1120
- fwrite( STDOUT, '[' . date_i18n( 'd-M-Y H:i:s' ) . '] ' . strip_tags( $messagetype ) . str_replace( '&hellip;', '...', strip_tags( $args[ 1 ] ) ) . PHP_EOL ) ;
 
 
 
 
 
 
 
1121
  //log line
1122
  $timestamp = '<span datetime="' . date_i18n( 'c' ) . '" title="[Type: ' . $args[ 0 ] . '|Line: ' . $args[ 3 ] . '|File: ' . $in_file . '|Mem: ' . size_format( @memory_get_usage( TRUE ), 2 ) . '|Mem Max: ' . size_format( @memory_get_peak_usage( TRUE ), 2 ) . '|Mem Limit: ' . ini_get( 'memory_limit' ) . '|PID: ' . self::get_pid() . ' | UniqID: ' . $this->uniqid . '|Query\'s: ' . get_num_queries() . ']">[' . date_i18n( 'd-M-Y H:i:s' ) . ']</span> ';
1123
  //set last Message
@@ -1960,10 +1967,11 @@ final class BackWPup_Job {
1960
  if ( ! empty( $suffix ) && substr( $suffix, 0, 1 ) != '.' )
1961
  $suffix = '.' . $suffix;
1962
 
1963
- $name = str_replace( $datevars, $datevalues, sanitize_file_name( $name ) );
1964
- $name .= $suffix; //prevent _ in extension name that sanitize_file_name add.
1965
- if ( $delete_temp_file && is_writeable( BackWPup::get_plugin_data( 'TEMP' ) . $name ) && !is_dir( BackWPup::get_plugin_data( 'TEMP' ) . $name ) && !is_link( BackWPup::get_plugin_data( 'TEMP' ) . $name ) )
1966
  unlink( BackWPup::get_plugin_data( 'TEMP' ) . $name );
 
1967
 
1968
  return $name;
1969
  }
@@ -1974,7 +1982,7 @@ final class BackWPup_Job {
1974
  */
1975
  public function is_backup_archive( $filename ) {
1976
 
1977
- $filename = basename( $filename );
1978
 
1979
  if ( ! substr( $filename, -3 ) == '.gz' || ! substr( $filename, -4 ) == '.bz2' || ! substr( $filename, -4 ) == '.tar' || ! substr( $filename, -4 ) == '.zip' )
1980
  return FALSE;
@@ -1984,7 +1992,7 @@ final class BackWPup_Job {
1984
  $datevars = array( '%d', '%j', '%m', '%n', '%Y', '%y', '%a', '%A', '%B', '%g', '%G', '%h', '%H', '%i', '%s' );
1985
  $dateregex = array( '(0[1-9]|[12][0-9]|3[01])', '([1-9]|[12][0-9]|3[01])', '(0[1-9]|1[012])', '([1-9]|1[012])', '((19|20|21)[0-9]{2})', '([0-9]{2})', '(am|pm)', '(AM|PM)', '([0-9]{3})', '([1-9]|1[012])', '([0-9]|1[0-9]|2[0-3])', '(0[1-9]|1[012])', '(0[0-9]|1[0-9]|2[0-3])', '([0-5][0-9])', '([0-5][0-9])' );
1986
 
1987
- $regex = "/^" . str_replace( $datevars, $dateregex, str_replace( "\/", "/", sanitize_file_name( $this->job[ 'archivename' ] ) ) ) . "$/";
1988
 
1989
  preg_match( $regex, $filename, $matches );
1990
  if ( ! empty( $matches[ 0 ] ) && $matches[ 0 ] == $filename )
@@ -1993,6 +2001,28 @@ final class BackWPup_Job {
1993
  return FALSE;
1994
  }
1995
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1996
  /**
1997
  * Get the Process id of working script
1998
  *
391
  public static function get_jobrun_url( $starttype, $jobid = 0 ) {
392
 
393
 
394
+ $wp_admin_user = get_users( array( 'role' => 'backwpup_admin', 'number' => 1 ) ); //get a user for cookie auth
395
  $url = site_url( 'wp-cron.php' );
396
  $header = array();
397
  $authurl = '';
1116
  $in_file = str_replace( str_replace( '\\', '/', ABSPATH ), '', str_replace( '\\', '/', $args[ 2 ] ) );
1117
 
1118
  //print message to cli
1119
+ if ( defined( 'WP_CLI' ) && WP_CLI ) {
1120
+ if ( $error_or_warning ) {
1121
+ WP_CLI::warning( '[' . date_i18n( 'd-M-Y H:i:s' ) . '] ' . strip_tags( $messagetype ) . str_replace( array( '&hellip;', '&#160;' ), array( '...', ' ' ), strip_tags( $args[ 1 ] ) ) );
1122
+ } else {
1123
+ WP_CLI::log( '[' . date_i18n( 'd-M-Y H:i:s' ) . '] ' . strip_tags( $messagetype ) . str_replace( array( '&hellip;', '&#160;' ), array( '...', ' ' ), strip_tags( $args[ 1 ] ) ) );
1124
+ }
1125
+ } elseif ( php_sapi_name() == 'cli' && defined( 'STDOUT' ) ) {
1126
+ fwrite( STDOUT, '[' . date_i18n( 'd-M-Y H:i:s' ) . '] ' . strip_tags( $messagetype ) . str_replace( array( '&hellip;', '&#160;' ), array( '...', ' ' ), strip_tags( $args[ 1 ] ) ) . PHP_EOL ) ;
1127
+ }
1128
  //log line
1129
  $timestamp = '<span datetime="' . date_i18n( 'c' ) . '" title="[Type: ' . $args[ 0 ] . '|Line: ' . $args[ 3 ] . '|File: ' . $in_file . '|Mem: ' . size_format( @memory_get_usage( TRUE ), 2 ) . '|Mem Max: ' . size_format( @memory_get_peak_usage( TRUE ), 2 ) . '|Mem Limit: ' . ini_get( 'memory_limit' ) . '|PID: ' . self::get_pid() . ' | UniqID: ' . $this->uniqid . '|Query\'s: ' . get_num_queries() . ']">[' . date_i18n( 'd-M-Y H:i:s' ) . ']</span> ';
1130
  //set last Message
1967
  if ( ! empty( $suffix ) && substr( $suffix, 0, 1 ) != '.' )
1968
  $suffix = '.' . $suffix;
1969
 
1970
+ $name = str_replace( $datevars, $datevalues, self::sanitize_file_name( $name ) );
1971
+ $name .= $suffix;
1972
+ if ( $delete_temp_file && is_writeable( BackWPup::get_plugin_data( 'TEMP' ) . $name ) && !is_dir( BackWPup::get_plugin_data( 'TEMP' ) . $name ) && !is_link( BackWPup::get_plugin_data( 'TEMP' ) . $name ) ) {
1973
  unlink( BackWPup::get_plugin_data( 'TEMP' ) . $name );
1974
+ }
1975
 
1976
  return $name;
1977
  }
1982
  */
1983
  public function is_backup_archive( $filename ) {
1984
 
1985
+ $filename = basename( $filename );
1986
 
1987
  if ( ! substr( $filename, -3 ) == '.gz' || ! substr( $filename, -4 ) == '.bz2' || ! substr( $filename, -4 ) == '.tar' || ! substr( $filename, -4 ) == '.zip' )
1988
  return FALSE;
1992
  $datevars = array( '%d', '%j', '%m', '%n', '%Y', '%y', '%a', '%A', '%B', '%g', '%G', '%h', '%H', '%i', '%s' );
1993
  $dateregex = array( '(0[1-9]|[12][0-9]|3[01])', '([1-9]|[12][0-9]|3[01])', '(0[1-9]|1[012])', '([1-9]|1[012])', '((19|20|21)[0-9]{2})', '([0-9]{2})', '(am|pm)', '(AM|PM)', '([0-9]{3})', '([1-9]|1[012])', '([0-9]|1[0-9]|2[0-3])', '(0[1-9]|1[012])', '(0[0-9]|1[0-9]|2[0-3])', '([0-5][0-9])', '([0-5][0-9])' );
1994
 
1995
+ $regex = "/^" . str_replace( $datevars, $dateregex, self::sanitize_file_name( $this->job[ 'archivename' ] ) ) . "$/";
1996
 
1997
  preg_match( $regex, $filename, $matches );
1998
  if ( ! empty( $matches[ 0 ] ) && $matches[ 0 ] == $filename )
2001
  return FALSE;
2002
  }
2003
 
2004
+ /**
2005
+ * Sanitizes a filename, replacing whitespace with underscores.
2006
+ *
2007
+ * @param $filename
2008
+ *
2009
+ * @return mixed
2010
+ */
2011
+ public static function sanitize_file_name( $filename ) {
2012
+
2013
+ $filename = trim( $filename );
2014
+
2015
+ $special_chars = array( "?", "[", "]", "/", "\\", "=", "<", ">", ":", ";", ",", "'", "\"", "&", "$", "#", "*", "(", ")", "|", "~", "`", "!", "{", "}", chr(0) );
2016
+
2017
+ $filename = str_replace( $special_chars, '', $filename );
2018
+
2019
+ $filename = str_replace( array( ' ', '%20', '+' ), '_', $filename );
2020
+ $filename = str_replace( array( "\n", "\t", "\r" ), '-', $filename );
2021
+ $filename = trim( $filename, '.-_' );
2022
+
2023
+ return $filename;
2024
+ }
2025
+
2026
  /**
2027
  * Get the Process id of working script
2028
  *
inc/class-jobtype-dbdump.php CHANGED
@@ -123,7 +123,7 @@ class BackWPup_JobType_DBDump extends BackWPup_JobTypes {
123
 
124
  if ( $_POST[ 'dbdumpfilecompression' ] == '' || $_POST[ 'dbdumpfilecompression' ] == '.gz' )
125
  BackWPup_Option::update( $id, 'dbdumpfilecompression', $_POST[ 'dbdumpfilecompression' ] );
126
- BackWPup_Option::update( $id, 'dbdumpfile', sanitize_file_name( $_POST[ 'dbdumpfile' ]) );
127
  //selected tables
128
  $dbdumpexclude = array();
129
  $checked_db_tables = array();
123
 
124
  if ( $_POST[ 'dbdumpfilecompression' ] == '' || $_POST[ 'dbdumpfilecompression' ] == '.gz' )
125
  BackWPup_Option::update( $id, 'dbdumpfilecompression', $_POST[ 'dbdumpfilecompression' ] );
126
+ BackWPup_Option::update( $id, 'dbdumpfile', BackWPup_Job::sanitize_file_name( $_POST[ 'dbdumpfile' ] ) );
127
  //selected tables
128
  $dbdumpexclude = array();
129
  $checked_db_tables = array();
inc/class-jobtype-wpexp.php CHANGED
@@ -1,719 +1,719 @@
1
- <?php
2
- /**
3
- *
4
- */
5
- class BackWPup_JobType_WPEXP extends BackWPup_JobTypes {
6
-
7
- /**
8
- *
9
- */
10
- public function __construct() {
11
-
12
- $this->info[ 'ID' ] = 'WPEXP';
13
- $this->info[ 'name' ] = __( 'XML export', 'backwpup' );
14
- $this->info[ 'description' ] = __( 'WordPress XML export', 'backwpup' );
15
- $this->info[ 'URI' ] = translate( BackWPup::get_plugin_data( 'PluginURI' ), 'backwpup' );
16
- $this->info[ 'author' ] = BackWPup::get_plugin_data( 'Author' );
17
- $this->info[ 'authorURI' ] = translate( BackWPup::get_plugin_data( 'AuthorURI' ), 'backwpup' );
18
- $this->info[ 'version' ] = BackWPup::get_plugin_data( 'Version' );
19
-
20
- }
21
-
22
- /**
23
- * @return bool
24
- */
25
- public function creates_file() {
26
-
27
- return TRUE;
28
- }
29
-
30
- /**
31
- * @return array
32
- */
33
- public function option_defaults() {
34
- return array( 'wpexportcontent' => 'all', 'wpexportfilecompression' => '', 'wpexportfile' => sanitize_file_name( get_bloginfo( 'name' ) ) . '.wordpress.%Y-%m-%d' );
35
- }
36
-
37
-
38
- /**
39
- * @param $jobid
40
- * @internal param $main
41
- */
42
- public function edit_tab( $jobid ) {
43
- ?>
44
- <table class="form-table">
45
- <tr>
46
- <th scope="row"><?php _e( 'Items to export', 'backwpup' ) ?></th>
47
- <td>
48
- <fieldset>
49
- <label for="idwpexportcontent-all"><input type="radio" name="wpexportcontent" id="idwpexportcontent-all" value="all" <?php checked( BackWPup_Option::get( $jobid, 'wpexportcontent' ), 'all' ); ?> /> <?php _e( 'All content', 'backwpup' ); ?></label><br />
50
- <label for="idwpexportcontent-post"><input type="radio" name="wpexportcontent" id="idwpexportcontent-post" value="post" <?php checked( BackWPup_Option::get( $jobid, 'wpexportcontent' ), 'post' ); ?> /> <?php _e( 'Posts', 'backwpup' ); ?></label><br />
51
- <label for="idwpexportcontent-page"><input type="radio" name="wpexportcontent" id="idwpexportcontent-page" value="page" <?php checked( BackWPup_Option::get( $jobid, 'wpexportcontent' ), 'page' ); ?> /> <?php _e( 'Pages', 'backwpup' ); ?></label><br />
52
- <?php
53
- foreach ( get_post_types( array( '_builtin' => FALSE, 'can_export' => TRUE ), 'objects' ) as $post_type ) {
54
- ?>
55
- <label for="idwpexportcontent-<?php echo esc_attr( $post_type->name ); ?>"><input type="radio" name="wpexportcontent" id="idwpexportcontent-<?php echo esc_attr( $post_type->name ); ?>" value="<?php echo esc_attr( $post_type->name ); ?>" <?php checked( BackWPup_Option::get( $jobid, 'wpexportcontent' ), esc_attr( $post_type->name ) ); ?> /> <?php echo esc_html( $post_type->label ); ?></label><br />
56
- <?php } ?>
57
- </fieldset>
58
- </td>
59
- </tr>
60
- <tr>
61
- <th scope="row"><label for="idwpexportfile"><?php _e( 'XML Export file name', 'backwpup' ) ?></label></th>
62
- <td>
63
- <input name="wpexportfile" type="text" id="idwpexportfile"
64
- value="<?php echo BackWPup_Option::get( $jobid, 'wpexportfile' );?>"
65
- class="medium-text code"/>.xml
66
- </td>
67
- </tr>
68
- <tr>
69
- <th scope="row"><?php _e( 'File compression', 'backwpup' ) ?></th>
70
- <td>
71
- <fieldset>
72
- <?php
73
- echo '<label for="idwpexportfilecompression"><input class="radio" type="radio"' . checked( '', BackWPup_Option::get( $jobid, 'wpexportfilecompression' ), FALSE ) . ' name="wpexportfilecompression" id="idwpexportfilecompression" value="" /> ' . __( 'none', 'backwpup' ). '</label><br />';
74
- if ( function_exists( 'gzopen' ) )
75
- echo '<label for="idwpexportfilecompression-gz"><input class="radio" type="radio"' . checked( '.gz', BackWPup_Option::get( $jobid, 'wpexportfilecompression' ), FALSE ) . ' name="wpexportfilecompression" id="idwpexportfilecompression-gz" value=".gz" /> ' . __( 'GZip', 'backwpup' ). '</label><br />';
76
- else
77
- echo '<label for="idwpexportfilecompression-gz"><input class="radio" type="radio"' . checked( '.gz', BackWPup_Option::get( $jobid, 'wpexportfilecompression' ), FALSE ) . ' name="wpexportfilecompression" id="idwpexportfilecompression-gz" value=".gz" disabled="disabled" /> ' . __( 'GZip', 'backwpup' ). '</label><br />';
78
- if ( function_exists( 'bzopen' ) )
79
- echo '<label for="idwpexportfilecompression-bz2"><input class="radio" type="radio"' . checked( '.bz2', BackWPup_Option::get( $jobid, 'wpexportfilecompression' ), FALSE ) . ' name="wpexportfilecompression" id="idwpexportfilecompression-bz2" value=".bz2" /> ' . __( 'BZip2', 'backwpup' ). '</label><br />';
80
- else
81
- echo '<label for="idwpexportfilecompression-bz2"><input class="radio" type="radio"' . checked( '.bz2', BackWPup_Option::get( $jobid, 'wpexportfilecompression' ), FALSE ) . ' name="wpexportfilecompression" id="idwpexportfilecompression-bz2" value=".bz2" disabled="disabled" /> ' . __( 'BZip2', 'backwpup' ). '</label><br />';
82
- ?>
83
- </fieldset>
84
- </td>
85
- </tr>
86
- </table>
87
- <?php
88
- }
89
-
90
- /**
91
- * @param $id
92
- */
93
- public function edit_form_post_save( $id ) {
94
-
95
- BackWPup_Option::update( $id, 'wpexportcontent', $_POST[ 'wpexportcontent' ] );
96
- BackWPup_Option::update( $id, 'wpexportfile', sanitize_file_name( $_POST[ 'wpexportfile' ] ) );
97
- if ( $_POST[ 'wpexportfilecompression' ] == '' || $_POST[ 'wpexportfilecompression' ] == '.gz' || $_POST[ 'wpexportfilecompression' ] == '.bz2' )
98
- BackWPup_Option::update( $id, 'wpexportfilecompression', $_POST[ 'wpexportfilecompression' ] );
99
- }
100
-
101
- /**
102
- * @param $job_object
103
- * @return bool
104
- */
105
- public function job_run( &$job_object ) {
106
- global $wpdb, $post, $wp_query;
107
-
108
- $wxr_version = '1.2';
109
-
110
- if ( $job_object->steps_data[ $job_object->step_working ]['SAVE_STEP_TRY'] != $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] ) {
111
- $job_object->log( sprintf( __( '%d. Trying to create a WordPress export to XML file&#160;&hellip;', 'backwpup' ), $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] ) );
112
- $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] = BackWPup::get_plugin_data( 'TEMP' ) . $job_object->generate_filename( $job_object->job[ 'wpexportfile' ], 'xml', TRUE );
113
- $job_object->steps_data[ $job_object->step_working ]['substep'] = 'header';
114
- $job_object->steps_data[ $job_object->step_working ]['post_ids'] = array();
115
- $job_object->substeps_todo = 10;
116
- $job_object->substeps_done = 0;
117
- }
118
-
119
- add_filter( 'wxr_export_skip_postmeta', array( $this, 'wxr_filter_postmeta' ), 10, 2 );
120
-
121
- if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'header' ) {
122
-
123
- if ( 'all' != $job_object->job[ 'wpexportcontent' ] && post_type_exists( $job_object->job[ 'wpexportcontent' ] ) ) {
124
- $ptype = get_post_type_object( $job_object->job[ 'wpexportcontent' ] );
125
- if ( ! $ptype->can_export ) {
126
- $job_object->log( sprintf( __( 'WP Export: Post type “%s” does not allow export.', 'backwpup' ), $job_object->job[ 'wpexportcontent' ] ), E_USER_ERROR );
127
- return FALSE;
128
- }
129
- $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $job_object->job[ 'wpexportcontent' ] );
130
- } else {
131
- $post_types = get_post_types( array( 'can_export' => true ) );
132
- $esses = array_fill( 0, count($post_types), '%s' );
133
- $where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types );
134
- $job_object->job[ 'wpexportcontent' ] = 'all';
135
- }
136
- $where .= " AND {$wpdb->posts}.post_status != 'auto-draft'";
137
-
138
- // grab a snapshot of post IDs, just in case it changes during the export
139
- $job_object->steps_data[ $job_object->step_working ]['post_ids'] = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE $where" );
140
- $job_object->substeps_todo = $job_object->substeps_todo + count( $job_object->steps_data[ $job_object->step_working ]['post_ids'] );
141
-
142
- $header = '<?xml version="1.0" encoding="' . get_bloginfo('charset') . "\" ?>\n";
143
- $header .= "<!-- This is a WordPress eXtended RSS file generated by the WordPress plugin BackWPup as an export of your site. -->\n";
144
- $header .= "<!-- It contains information about your site's posts, pages, comments, categories, and other content. -->\n";
145
- $header .= "<!-- You may use this file to transfer that content from one site to another. -->\n";
146
- $header .= "<!-- This file is not intended to serve as a complete backup of your site. -->\n\n";
147
- $header .= "<!-- To import this information into a WordPress site follow these steps: -->\n";
148
- $header .= "<!-- 1. Log in to that site as an administrator. -->\n";
149
- $header .= "<!-- 2. Go to Tools: Import in the WordPress admin panel. -->\n";
150
- $header .= "<!-- 3. Install the \"WordPress\" importer from the list. -->\n";
151
- $header .= "<!-- 4. Activate & Run Importer. -->\n";
152
- $header .= "<!-- 5. Upload this file using the form provided on that page. -->\n";
153
- $header .= "<!-- 6. You will first be asked to map the authors in this export file to users -->\n";
154
- $header .= "<!-- on the site. For each author, you may choose to map to an -->\n";
155
- $header .= "<!-- existing user on the site or to create a new user. -->\n";
156
- $header .= "<!-- 7. WordPress will then import each of the posts, pages, comments, categories, etc. -->\n";
157
- $header .= "<!-- contained in this file into your site. -->\n\n";
158
- $header .= "<!-- generator=\"WordPress/" . get_bloginfo_rss('version') . "\" created=\"". date('Y-m-d H:i') . "\" -->\n";
159
- $header .= "<rss version=\"2.0\" xmlns:excerpt=\"http://wordpress.org/export/$wxr_version/excerpt/\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\" xmlns:wfw=\"http://wellformedweb.org/CommentAPI/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:wp=\"http://wordpress.org/export/$wxr_version/\">\n";
160
- $header .= "<channel>\n";
161
- $header .= "\t<title>" . get_bloginfo_rss( 'name' ) ."</title>\n";
162
- $header .= "\t<link>" . get_bloginfo_rss( 'url' ) ."</link>\n";
163
- $header .= "\t<description>" . get_bloginfo_rss( 'description' ) ."</description>\n";
164
- $header .= "\t<pubDate>" . date( 'D, d M Y H:i:s +0000' ) ."</pubDate>\n";
165
- $header .= "\t<language>" . get_bloginfo_rss( 'language' ) ."</language>\n";
166
- $header .= "\t<wp:wxr_version>" . $wxr_version ."</wp:wxr_version>\n";
167
- $header .= "\t<wp:base_site_url>" . $this->wxr_site_url() ."</wp:base_site_url>\n";
168
- $header .= "\t<wp:base_blog_url>" . get_bloginfo_rss( 'url' ) ."</wp:base_blog_url>\n";
169
- $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $header, FILE_APPEND );
170
- if ( $written === FALSE ) {
171
- $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
172
-
173
- return FALSE;
174
- }
175
- unset( $header );
176
- $job_object->steps_data[ $job_object->step_working ]['substep'] = 'authors';
177
- $job_object->substeps_done ++;
178
- $job_object->update_working_data();
179
- $job_object->do_restart_time();
180
- }
181
-
182
- if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'authors' ) {
183
- $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $this->wxr_authors_list(), FILE_APPEND );
184
- if ( $written === FALSE ) {
185
- $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
186
-
187
- return FALSE;
188
- }
189
- $job_object->steps_data[ $job_object->step_working ]['substep'] = 'cats';
190
- $job_object->substeps_done ++;
191
- $job_object->update_working_data();
192
- $job_object->do_restart_time();
193
- }
194
-
195
-
196
- if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'cats' ) {
197
- if ( 'all' == $job_object->job[ 'wpexportcontent' ] ) {
198
- $cats = array();
199
- $categories = (array) get_categories( array( 'get' => 'all' ) );
200
- // put categories in order with no child going before its parent
201
- while ( $cat = array_shift( $categories ) ) {
202
- if ( $cat->parent == 0 || isset( $cats[$cat->parent] ) )
203
- $cats[$cat->term_id] = $cat;
204
- else
205
- $categories[] = $cat;
206
- }
207
- $cats_xml = '';
208
- foreach ( $cats as $c ) {
209
- $parent_slug = $c->parent ? $cats[$c->parent]->slug : '';
210
- $cats_xml .= "\t<wp:category><wp:term_id>" . $c->term_id ."</wp:term_id><wp:category_nicename>" . $c->slug . "</wp:category_nicename><wp:category_parent>" . $parent_slug . "</wp:category_parent>" . $this->wxr_cat_name( $c ) . $this->wxr_category_description( $c ) ."</wp:category>\n";
211
- }
212
- $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $cats_xml, FILE_APPEND );
213
- if ( $written === FALSE ) {
214
- $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
215
-
216
- return FALSE;
217
- }
218
- unset( $cats_xml );
219
- }
220
- $job_object->steps_data[ $job_object->step_working ]['substep'] = 'tags';
221
- $job_object->substeps_done ++;
222
- $job_object->update_working_data();
223
- $job_object->do_restart_time();
224
- }
225
-
226
- if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'tags' ) {
227
- if ( 'all' == $job_object->job[ 'wpexportcontent' ] ) {
228
- $tags = (array) get_tags( array( 'get' => 'all' ) );
229
- $tags_xml = '';
230
- foreach ( $tags as $t ) {
231
- $tags_xml .= "\t<wp:tag><wp:term_id>" . $t->term_id ."</wp:term_id><wp:tag_slug>" . $t->slug ."</wp:tag_slug>" . $this->wxr_tag_name( $t ) . $this->wxr_tag_description( $t ) ."</wp:tag>\n";
232
- }
233
- $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $tags_xml, FILE_APPEND );
234
- if ( $written === FALSE ) {
235
- $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
236
-
237
- return FALSE;
238
- }
239
- unset( $tags_xml );
240
- }
241
- $job_object->steps_data[ $job_object->step_working ]['substep'] = 'terms';
242
- $job_object->substeps_done ++;
243
- $job_object->update_working_data();
244
- $job_object->do_restart_time();
245
- }
246
-
247
- if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'terms' ) {
248
- if ( 'all' == $job_object->job[ 'wpexportcontent' ] ) {
249
-
250
- $terms = array();
251
- $custom_taxonomies = get_taxonomies( array( '_builtin' => false ) );
252
- $custom_terms = (array) get_terms( $custom_taxonomies, array( 'get' => 'all' ) );
253
-
254
- // put terms in order with no child going before its parent
255
- while ( $t = array_shift( $custom_terms ) ) {
256
- if ( $t->parent == 0 || isset( $terms[$t->parent] ) )
257
- $terms[$t->term_id] = $t;
258
- else
259
- $custom_terms[] = $t;
260
- }
261
- $terms_xml = '';
262
- foreach ( $terms as $t ) {
263
- $parent_slug = $t->parent ? $terms[$t->parent]->slug : '';
264
- $terms_xml .= "\t<wp:term><wp:term_id>" . $t->term_id ."</wp:term_id><wp:term_taxonomy>" . $t->taxonomy . "</wp:term_taxonomy><wp:term_slug>" . $t->slug ."</wp:term_slug><wp:term_parent>" . $parent_slug ."</wp:term_parent>" . $this->wxr_term_name( $t ) . $this->wxr_term_description( $t ) ."</wp:term>\n";
265
- }
266
- $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $terms_xml, FILE_APPEND );
267
- if ( $written === FALSE ) {
268
- $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
269
-
270
- return FALSE;
271
- }
272
- unset( $terms_xml );
273
- }
274
- $job_object->steps_data[ $job_object->step_working ]['substep'] = 'menus';
275
- $job_object->substeps_done ++;
276
- $job_object->update_working_data();
277
- $job_object->do_restart_time();
278
- }
279
-
280
- if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'menus' ) {
281
- $menu_xml = '';
282
- if ( 'all' == $job_object->job[ 'wpexportcontent' ] ) {
283
- $menu_xml .= $this->wxr_nav_menu_terms();
284
- }
285
- $menu_xml .= "\t<generator>http://wordpress.org/?v=" . get_bloginfo_rss( 'version' ) . "</generator>\n";
286
- $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $menu_xml, FILE_APPEND );
287
- if ( $written === FALSE ) {
288
- $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
289
-
290
- return FALSE;
291
- }
292
- unset( $menu_xml );
293
-
294
- $job_object->steps_data[ $job_object->step_working ]['substep'] = 'posts';
295
- $job_object->substeps_done ++;
296
- $job_object->update_working_data();
297
- $job_object->do_restart_time();
298
- }
299
-
300
-
301
- if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'posts' ) {
302
-
303
- if ( ! empty( $job_object->steps_data[ $job_object->step_working ]['post_ids'] ) ) {
304
- $wp_query->in_the_loop = true; // Fake being in the loop.
305
-
306
- // fetch 20 posts at a time rather than loading the entire table into memory
307
- while ( $next_posts = array_splice( $job_object->steps_data[ $job_object->step_working ]['post_ids'], 0, 20 ) ) {
308
- $where = 'WHERE ID IN (' . join( ',', $next_posts ) . ')';
309
- $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" );
310
- $wxr_post = '';
311
- // Begin Loop
312
- foreach ( $posts as $post ) {
313
- /* @var WP_Post $post */
314
-
315
- $is_sticky = is_sticky( $post->ID ) ? 1 : 0;
316
-
317
- $wxr_post .= "\t<item>\n";
318
- $wxr_post .= "\t\t<title>" . apply_filters( 'the_title_rss', $post->post_title ) ."</title>\n";
319
- $wxr_post .= "\t\t<link>" . esc_url( apply_filters( 'the_permalink_rss', get_permalink( $post ) ) ) ."</link>\n";
320
- $wxr_post .= "\t\t<pubDate>" . mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true, $post ), false ) ."</pubDate>\n";
321
- $wxr_post .= "\t\t<dc:creator>" . $this->wxr_cdata( get_the_author_meta( 'login', $post->post_author ) ) ."</dc:creator>\n";
322
- $wxr_post .= "\t\t<guid isPermaLink=\"false\">" . esc_url( get_the_guid( $post->ID ) ) ."</guid>\n";
323
- $wxr_post .= "\t\t<description></description>\n";
324
- $wxr_post .= "\t\t<content:encoded>" . $this->wxr_cdata( apply_filters( 'the_content_export', $post->post_content ) ) . "</content:encoded>\n";
325
- $wxr_post .= "\t\t<excerpt:encoded>" . $this->wxr_cdata( apply_filters( 'the_excerpt_export', $post->post_excerpt ) ) . "</excerpt:encoded>\n";
326
- $wxr_post .= "\t\t<wp:post_id>" . $post->ID . "</wp:post_id>\n";
327
- $wxr_post .= "\t\t<wp:post_date>" . $post->post_date . "</wp:post_date>\n";
328
- $wxr_post .= "\t\t<wp:post_date_gmt>" . $post->post_date_gmt . "</wp:post_date_gmt>\n";
329
- $wxr_post .= "\t\t<wp:comment_status>" . $post->comment_status . "</wp:comment_status>\n";
330
- $wxr_post .= "\t\t<wp:ping_status>" . $post->ping_status . "</wp:ping_status>\n";
331
- $wxr_post .= "\t\t<wp:post_name>" . $post->post_name . "</wp:post_name>\n";
332
- $wxr_post .= "\t\t<wp:status>" . $post->post_status . "</wp:status>\n";
333
- $wxr_post .= "\t\t<wp:post_parent>" . $post->post_parent . "</wp:post_parent>\n";
334
- $wxr_post .= "\t\t<wp:menu_order>" . $post->menu_order . "</wp:menu_order>\n";
335
- $wxr_post .= "\t\t<wp:post_type>" . $post->post_type . "</wp:post_type>\n";
336
- $wxr_post .= "\t\t<wp:post_password>" . $post->post_password . "</wp:post_password>\n";
337
- $wxr_post .= "\t\t<wp:is_sticky>" . $is_sticky . "</wp:is_sticky>\n";
338
- if ( $post->post_type == 'attachment' ) {
339
- $wxr_post .= "\t\t<wp:attachment_url>" . wp_get_attachment_url( $post->ID ) . "</wp:attachment_url>\n";
340
- }
341
- $wxr_post .= $this->wxr_post_taxonomy();
342
-
343
- $postmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) );
344
- foreach ( $postmeta as $meta ) {
345
- if ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) ) {
346
- continue;
347
- }
348
- $wxr_post .= "\t\t<wp:postmeta>\n\t\t\t<wp:meta_key>" . $meta->meta_key ."</wp:meta_key>\n\t\t\t<wp:meta_value>" .$this->wxr_cdata( $meta->meta_value ) ."</wp:meta_value>\n\t\t</wp:postmeta>\n";
349
- }
350
-
351
- $comments = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID ) );
352
- foreach ( $comments as $c ) {
353
- $wxr_post .= "\t\t<wp:comment>\n";
354
- $wxr_post .= "\t\t\t<wp:comment_id>" . $c->comment_ID . "</wp:comment_id>\n";
355
- $wxr_post .= "\t\t\t<wp:comment_author>" . $this->wxr_cdata( $c->comment_author ) . "</wp:comment_author>\n";
356
- $wxr_post .= "\t\t\t<wp:comment_author_email>" . $c->comment_author_email . "</wp:comment_author_email>\n";
357
- $wxr_post .= "\t\t\t<wp:comment_author_url>" . esc_url_raw( $c->comment_author_url ) . "</wp:comment_author_url>\n";
358
- $wxr_post .= "\t\t\t<wp:comment_author_IP>" . $c->comment_author_IP . "</wp:comment_author_IP>\n";
359
- $wxr_post .= "\t\t\t<wp:comment_date>" . $c->comment_date . "</wp:comment_date>\n";
360
- $wxr_post .= "\t\t\t<wp:comment_date_gmt>" . $c->comment_date_gmt . "</wp:comment_date_gmt>\n";
361
- $wxr_post .= "\t\t\t<wp:comment_content>" . $this->wxr_cdata( $c->comment_content ) . "</wp:comment_content>\n";
362
- $wxr_post .= "\t\t\t<wp:comment_approved>" . $c->comment_approved . "</wp:comment_approved>\n";
363
- $wxr_post .= "\t\t\t<wp:comment_type>" . $c->comment_type . "</wp:comment_type>\n";
364
- $wxr_post .= "\t\t\t<wp:comment_parent>" . $c->comment_parent . "</wp:comment_parent>\n";
365
- $wxr_post .= "\t\t\t<wp:comment_user_id>" . $c->user_id . "</wp:comment_user_id>\n";
366
- $c_meta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d", $c->comment_ID ) );
367
- foreach ( $c_meta as $meta ) {
368
- $wxr_post .= "\t\t\t<wp:commentmeta>\n\t\t\t\t<wp:meta_key>" . $meta->meta_key ."</wp:meta_key>\n\t\t\t\t<wp:meta_value>" .$this->wxr_cdata( $meta->meta_value ) ."</wp:meta_value>\n\t\t\t</wp:commentmeta>\n";
369
- }
370
- $wxr_post .= "\t\t</wp:comment>\n";
371
- }
372
- $wxr_post .= "\t</item>\n";
373
- $job_object->substeps_done ++;
374
- }
375
- $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $wxr_post, FILE_APPEND );
376
- if ( $written === FALSE ) {
377
- $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
378
-
379
- return FALSE;
380
- }
381
- $job_object->do_restart_time();
382
- }
383
- }
384
- $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], "</channel>\n</rss>", FILE_APPEND );
385
- if ( $written === FALSE ) {
386
- $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
387
-
388
- return FALSE;
389
- }
390
- $job_object->steps_data[ $job_object->step_working ]['substep'] = 'check';
391
- $job_object->substeps_done ++;
392
- $job_object->update_working_data();
393
- $job_object->do_restart_time();
394
- }
395
-
396
- remove_filter( 'wxr_export_skip_postmeta', array( $this, 'wxr_filter_postmeta' ), 10, 2 );
397
-
398
- if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'check' ) {
399
-
400
- if ( extension_loaded( 'simplexml' ) && class_exists( 'DOMDocument' ) ) {
401
- $job_object->log( __( 'Check WP Export file&#160;&hellip;', 'backwpup' ) );
402
- $job_object->need_free_memory( filesize( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] ) * 2 );
403
- $valid = TRUE;
404
-
405
- $internal_errors = libxml_use_internal_errors( TRUE );
406
- $dom = new DOMDocument;
407
- $old_value = NULL;
408
- if ( function_exists( 'libxml_disable_entity_loader' ) )
409
- $old_value = libxml_disable_entity_loader( TRUE );
410
- $success = $dom->loadXML( file_get_contents( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] ) );
411
- if ( ! is_null( $old_value ) )
412
- libxml_disable_entity_loader( $old_value );
413
-
414
- if ( ! $success || isset( $dom->doctype ) ) {
415
- $errors = libxml_get_errors();
416
- $valid = FALSE;
417
-
418
- foreach ( $errors as $error ) {
419
- switch ( $error->level ) {
420
- case LIBXML_ERR_WARNING:
421
- $job_object->log( E_USER_WARNING, sprintf( __( 'XML WARNING (%s): %s', 'backwpup' ), $error->code, trim( $error->message ) ), $job_object->steps_data[ $job_object->step_working ]['wpexportfile'], $error->line );
422
- break;
423
- case LIBXML_ERR_ERROR:
424
- $job_object->log( E_USER_WARNING, sprintf( __( 'XML RECOVERABLE (%s): %s', 'backwpup' ), $error->code, trim( $error->message ) ), $job_object->steps_data[ $job_object->step_working ]['wpexportfile'], $error->line );
425
- break;
426
- case LIBXML_ERR_FATAL:
427
- $job_object->log( E_USER_WARNING, sprintf( __( 'XML ERROR (%s): %s', 'backwpup' ),$error->code, trim( $error->message ) ), $job_object->steps_data[ $job_object->step_working ]['wpexportfile'], $error->line );
428
- break;
429
- }
430
- }
431
- } else {
432
- $xml = simplexml_import_dom( $dom );
433
- unset( $dom );
434
-
435
- // halt if loading produces an error
436
- if ( ! $xml ) {
437
- $job_object->log( __( 'There was an error when reading this WXR file', 'backwpup' ), E_USER_ERROR );
438
- $valid = FALSE;
439
- } else {
440
-
441
- $wxr_version = $xml->xpath('/rss/channel/wp:wxr_version');
442
- if ( ! $wxr_version ) {
443
- $job_object->log( __( 'This does not appear to be a WXR file, missing/invalid WXR version number', 'backwpup' ), E_USER_ERROR );
444
- $valid = FALSE;
445
- }
446
-
447
- $wxr_version = (string) trim( $wxr_version[0] );
448
- // confirm that we are dealing with the correct file format
449
- if ( ! preg_match( '/^\d+\.\d+$/', $wxr_version ) ) {
450
- $job_object->log( __( 'This does not appear to be a WXR file, missing/invalid WXR version number', 'backwpup' ), E_USER_ERROR );
451
- $valid = FALSE;
452
- }
453
- }
454
- }
455
-
456
- libxml_use_internal_errors( $internal_errors );
457
-
458
- if ( $valid )
459
- $job_object->log( __( 'WP Export file is a valid WXR file.', 'backwpup' ) );
460
- } else {
461
- $job_object->log( __( 'WP Export file can not checked, because no XML extension loaded with the file can checked.', 'backwpup' ) );
462
- }
463
-
464
- $job_object->steps_data[ $job_object->step_working ]['substep'] = 'compress';
465
- $job_object->substeps_done ++;
466
- $job_object->update_working_data();
467
- $job_object->do_restart_time();
468
- }
469
-
470
- //Compress file
471
- if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'compress' ) {
472
- if ( ! empty( $job_object->job[ 'wpexportfilecompression' ] ) ) {
473
- $job_object->log( __( 'Compressing file&#160;&hellip;', 'backwpup' ) );
474
- try {
475
- $compress = new BackWPup_Create_Archive( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] . $job_object->job[ 'wpexportfilecompression' ] );
476
- if ( $compress->add_file( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] ) ) {
477
- unset( $compress );
478
- unlink( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] );
479
- $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] .= $job_object->job[ 'wpexportfilecompression' ];
480
- $job_object->log( __( 'Compressing done.', 'backwpup' ) );
481
- }
482
- } catch ( Exception $e ) {
483
- $job_object->log( $e->getMessage(), E_USER_ERROR, $e->getFile(), $e->getLine() );
484
- unset( $compress );
485
- return FALSE;
486
- }
487
- }
488
- $job_object->steps_data[ $job_object->step_working ]['substep'] = 'addfile';
489
- $job_object->substeps_done ++;
490
- $job_object->update_working_data();
491
- $job_object->do_restart_time();
492
- }
493
-
494
- if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'addfile' ) {
495
- //add XML file to backup files
496
- if ( is_readable( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] ) ) {
497
- $job_object->additional_files_to_backup[ ] = $job_object->steps_data[ $job_object->step_working ]['wpexportfile'];
498
- $job_object->count_files ++;
499
- $filesize = filesize( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ] );
500
- $job_object->count_filesize = $job_object->count_filesize + $filesize;
501
- $job_object->log( sprintf( __( 'Added XML export "%1$s" with %2$s to backup file list.', 'backwpup' ), basename( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] ), size_format( $filesize, 2 ) ) );
502
- }
503
- $job_object->substeps_done ++;
504
- $job_object->update_working_data();
505
- }
506
-
507
- return TRUE;
508
- }
509
-
510
- /**
511
- * Wrap given string in XML CDATA tag.
512
- *
513
- * @since WordPress 2.1.0
514
- *
515
- * @param string $str String to wrap in XML CDATA tag.
516
- * @return string
517
- */
518
- private function wxr_cdata( $str ) {
519
- if ( seems_utf8( $str ) == false )
520
- $str = utf8_encode( $str );
521
-
522
- // not allowed UTF-8 chars in XML
523
- $str = preg_replace( '/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', '', $str );
524
-
525
- // $str = ent2ncr(esc_html($str));
526
- $str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>';
527
-
528
- return $str;
529
- }
530
-
531
- /**
532
- * Return the URL of the site
533
- *
534
- * @since WordPress 2.5.0
535
- *
536
- * @return string Site URL.
537
- */
538
- private function wxr_site_url() {
539
- // ms: the base url
540
- if ( is_multisite() )
541
- return network_home_url();
542
- // wp: the blog url
543
- else
544
- return get_bloginfo_rss( 'url' );
545
- }
546
-
547
- /**
548
- * Output a cat_name XML tag from a given category object
549
- *
550
- * @since WordPress 2.1.0
551
- *
552
- * @param object $category Category Object
553
- * @return string
554
- */
555
- private function wxr_cat_name( $category ) {
556
- if ( empty( $category->name ) )
557
- return '';
558
-
559
- return '<wp:cat_name>' . $this->wxr_cdata( $category->name ) . '</wp:cat_name>';
560
- }
561
-
562
- /**
563
- * Output a category_description XML tag from a given category object
564
- *
565
- * @since WordPress 2.1.0
566
- *
567
- * @param object $category Category Object
568
- * @return string
569
- */
570
- private function wxr_category_description( $category ) {
571
- if ( empty( $category->description ) )
572
- return '';
573
-
574
- return '<wp:category_description>' . $this->wxr_cdata( $category->description ) . '</wp:category_description>';
575
- }
576
-
577
- /**
578
- * Output a tag_name XML tag from a given tag object
579
- *
580
- * @since WordPress 2.3.0
581
- *
582
- * @param object $tag Tag Object
583
- * @return string
584
- */
585
- private function wxr_tag_name( $tag ) {
586
- if ( empty( $tag->name ) )
587
- return '';
588
-
589
- return '<wp:tag_name>' . $this->wxr_cdata( $tag->name ) . '</wp:tag_name>';
590
- }
591
-
592
- /**
593
- * Output a tag_description XML tag from a given tag object
594
- *
595
- * @since WordPress 2.3.0
596
- *
597
- * @param object $tag Tag Object
598
- * @return string
599
- */
600
- private function wxr_tag_description( $tag ) {
601
- if ( empty( $tag->description ) )
602
- return '';
603
-
604
- return '<wp:tag_description>' . $this->wxr_cdata( $tag->description ) . '</wp:tag_description>';
605
- }
606
-
607
- /**
608
- * Output a term_name XML tag from a given term object
609
- *
610
- * @since WordPress 2.9.0
611
- *
612
- * @param object $term Term Object
613
- * @return string
614
- */
615
- private function wxr_term_name( $term ) {
616
- if ( empty( $term->name ) )
617
- return '';
618
-
619
- return '<wp:term_name>' . $this->wxr_cdata( $term->name ) . '</wp:term_name>';
620
- }
621
-
622
- /**
623
- * Output a term_description XML tag from a given term object
624
- *
625
- * @since WordPress 2.9.0
626
- *
627
- * @param object $term Term Object
628
- * @return string
629
- */
630
- private function wxr_term_description( $term ) {
631
- if ( empty( $term->description ) )
632
- return '';
633
-
634
- return '<wp:term_description>' . $this->wxr_cdata( $term->description ) . '</wp:term_description>';
635
- }
636
-
637
- /**
638
- * Output list of authors with posts
639
- *
640
- * @since WordPress 3.1.0
641
- */
642
- private function wxr_authors_list() {
643
- global $wpdb;
644
-
645
- $authors = array();
646
- $results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft'" );
647
- foreach ( (array) $results as $result )
648
- $authors[] = get_userdata( $result->post_author );
649
-
650
- $authors = array_filter( $authors );
651
-
652
- $wxr_authors = '';
653
-
654
- foreach ( $authors as $author ) {
655
- $wxr_authors .= "\t<wp:author>";
656
- $wxr_authors .= '<wp:author_id>' . $author->ID . '</wp:author_id>';
657
- $wxr_authors .= '<wp:author_login>' . $author->user_login . '</wp:author_login>';
658
- $wxr_authors .= '<wp:author_email>' . $author->user_email . '</wp:author_email>';
659
- $wxr_authors .= '<wp:author_display_name>' . $this->wxr_cdata( $author->display_name ) . '</wp:author_display_name>';
660
- $wxr_authors .= '<wp:author_first_name>' . $this->wxr_cdata( $author->user_firstname ) . '</wp:author_first_name>';
661
- $wxr_authors .= '<wp:author_last_name>' . $this->wxr_cdata( $author->user_lastname ) . '</wp:author_last_name>';
662
- $wxr_authors .= "</wp:author>\n";
663
- }
664
-
665
- return $wxr_authors;
666
- }
667
-
668
- /**
669
- * Ouput all navigation menu terms
670
- *
671
- * @since WordPress 3.1.0
672
- */
673
- private function wxr_nav_menu_terms() {
674
- $nav_menus = wp_get_nav_menus();
675
- if ( empty( $nav_menus ) || ! is_array( $nav_menus ) )
676
- return '';
677
-
678
- $wxr_nav_meuns = '';
679
-
680
- foreach ( $nav_menus as $menu ) {
681
- $wxr_nav_meuns .= "\t<wp:term><wp:term_id>{$menu->term_id}</wp:term_id><wp:term_taxonomy>nav_menu</wp:term_taxonomy><wp:term_slug>{$menu->slug}</wp:term_slug>";
682
- $wxr_nav_meuns .= $this->wxr_term_name( $menu );
683
- $wxr_nav_meuns .= "</wp:term>\n";
684
- }
685
-
686
- return $wxr_nav_meuns;
687
- }
688
-
689
- /**
690
- * Output list of taxonomy terms, in XML tag format, associated with a post
691
- *
692
- * @since WordPress 2.3.0
693
- */
694
- private function wxr_post_taxonomy() {
695
- $post = get_post();
696
-
697
- $taxonomies = get_object_taxonomies( $post->post_type );
698
- if ( empty( $taxonomies ) )
699
- return '';
700
- $terms = wp_get_object_terms( $post->ID, $taxonomies );
701
-
702
- $wxr_post_tags = '';
703
-
704
- foreach ( (array) $terms as $term ) {
705
- $wxr_post_tags .= "\t\t<category domain=\"{$term->taxonomy}\" nicename=\"{$term->slug}\">" . $this->wxr_cdata( $term->name ) . "</category>\n";
706
- }
707
-
708
- return $wxr_post_tags;
709
- }
710
-
711
- public function wxr_filter_postmeta( $return_me, $meta_key ) {
712
- if ( '_edit_lock' == $meta_key )
713
- $return_me = true;
714
- return $return_me;
715
- }
716
-
717
-
718
-
719
- }
1
+ <?php
2
+ /**
3
+ *
4
+ */
5
+ class BackWPup_JobType_WPEXP extends BackWPup_JobTypes {
6
+
7
+ /**
8
+ *
9
+ */
10
+ public function __construct() {
11
+
12
+ $this->info[ 'ID' ] = 'WPEXP';
13
+ $this->info[ 'name' ] = __( 'XML export', 'backwpup' );
14
+ $this->info[ 'description' ] = __( 'WordPress XML export', 'backwpup' );
15
+ $this->info[ 'URI' ] = translate( BackWPup::get_plugin_data( 'PluginURI' ), 'backwpup' );
16
+ $this->info[ 'author' ] = BackWPup::get_plugin_data( 'Author' );
17
+ $this->info[ 'authorURI' ] = translate( BackWPup::get_plugin_data( 'AuthorURI' ), 'backwpup' );
18
+ $this->info[ 'version' ] = BackWPup::get_plugin_data( 'Version' );
19
+
20
+ }
21
+
22
+ /**
23
+ * @return bool
24
+ */
25
+ public function creates_file() {
26
+
27
+ return TRUE;
28
+ }
29
+
30
+ /**
31
+ * @return array
32
+ */
33
+ public function option_defaults() {
34
+ return array( 'wpexportcontent' => 'all', 'wpexportfilecompression' => '', 'wpexportfile' => sanitize_file_name( get_bloginfo( 'name' ) ) . '.wordpress.%Y-%m-%d' );
35
+ }
36
+
37
+
38
+ /**
39
+ * @param $jobid
40
+ * @internal param $main
41
+ */
42
+ public function edit_tab( $jobid ) {
43
+ ?>
44
+ <table class="form-table">
45
+ <tr>
46
+ <th scope="row"><?php _e( 'Items to export', 'backwpup' ) ?></th>
47
+ <td>
48
+ <fieldset>
49
+ <label for="idwpexportcontent-all"><input type="radio" name="wpexportcontent" id="idwpexportcontent-all" value="all" <?php checked( BackWPup_Option::get( $jobid, 'wpexportcontent' ), 'all' ); ?> /> <?php _e( 'All content', 'backwpup' ); ?></label><br />
50
+ <label for="idwpexportcontent-post"><input type="radio" name="wpexportcontent" id="idwpexportcontent-post" value="post" <?php checked( BackWPup_Option::get( $jobid, 'wpexportcontent' ), 'post' ); ?> /> <?php _e( 'Posts', 'backwpup' ); ?></label><br />
51
+ <label for="idwpexportcontent-page"><input type="radio" name="wpexportcontent" id="idwpexportcontent-page" value="page" <?php checked( BackWPup_Option::get( $jobid, 'wpexportcontent' ), 'page' ); ?> /> <?php _e( 'Pages', 'backwpup' ); ?></label><br />
52
+ <?php
53
+ foreach ( get_post_types( array( '_builtin' => FALSE, 'can_export' => TRUE ), 'objects' ) as $post_type ) {
54
+ ?>
55
+ <label for="idwpexportcontent-<?php echo esc_attr( $post_type->name ); ?>"><input type="radio" name="wpexportcontent" id="idwpexportcontent-<?php echo esc_attr( $post_type->name ); ?>" value="<?php echo esc_attr( $post_type->name ); ?>" <?php checked( BackWPup_Option::get( $jobid, 'wpexportcontent' ), esc_attr( $post_type->name ) ); ?> /> <?php echo esc_html( $post_type->label ); ?></label><br />
56
+ <?php } ?>
57
+ </fieldset>
58
+ </td>
59
+ </tr>
60
+ <tr>
61
+ <th scope="row"><label for="idwpexportfile"><?php _e( 'XML Export file name', 'backwpup' ) ?></label></th>
62
+ <td>
63
+ <input name="wpexportfile" type="text" id="idwpexportfile"
64
+ value="<?php echo BackWPup_Option::get( $jobid, 'wpexportfile' );?>"
65
+ class="medium-text code"/>.xml
66
+ </td>
67
+ </tr>
68
+ <tr>
69
+ <th scope="row"><?php _e( 'File compression', 'backwpup' ) ?></th>
70
+ <td>
71
+ <fieldset>
72
+ <?php
73
+ echo '<label for="idwpexportfilecompression"><input class="radio" type="radio"' . checked( '', BackWPup_Option::get( $jobid, 'wpexportfilecompression' ), FALSE ) . ' name="wpexportfilecompression" id="idwpexportfilecompression" value="" /> ' . __( 'none', 'backwpup' ). '</label><br />';
74
+ if ( function_exists( 'gzopen' ) )
75
+ echo '<label for="idwpexportfilecompression-gz"><input class="radio" type="radio"' . checked( '.gz', BackWPup_Option::get( $jobid, 'wpexportfilecompression' ), FALSE ) . ' name="wpexportfilecompression" id="idwpexportfilecompression-gz" value=".gz" /> ' . __( 'GZip', 'backwpup' ). '</label><br />';
76
+ else
77
+ echo '<label for="idwpexportfilecompression-gz"><input class="radio" type="radio"' . checked( '.gz', BackWPup_Option::get( $jobid, 'wpexportfilecompression' ), FALSE ) . ' name="wpexportfilecompression" id="idwpexportfilecompression-gz" value=".gz" disabled="disabled" /> ' . __( 'GZip', 'backwpup' ). '</label><br />';
78
+ if ( function_exists( 'bzopen' ) )
79
+ echo '<label for="idwpexportfilecompression-bz2"><input class="radio" type="radio"' . checked( '.bz2', BackWPup_Option::get( $jobid, 'wpexportfilecompression' ), FALSE ) . ' name="wpexportfilecompression" id="idwpexportfilecompression-bz2" value=".bz2" /> ' . __( 'BZip2', 'backwpup' ). '</label><br />';
80
+ else
81
+ echo '<label for="idwpexportfilecompression-bz2"><input class="radio" type="radio"' . checked( '.bz2', BackWPup_Option::get( $jobid, 'wpexportfilecompression' ), FALSE ) . ' name="wpexportfilecompression" id="idwpexportfilecompression-bz2" value=".bz2" disabled="disabled" /> ' . __( 'BZip2', 'backwpup' ). '</label><br />';
82
+ ?>
83
+ </fieldset>
84
+ </td>
85
+ </tr>
86
+ </table>
87
+ <?php
88
+ }
89
+
90
+ /**
91
+ * @param $id
92
+ */
93
+ public function edit_form_post_save( $id ) {
94
+
95
+ BackWPup_Option::update( $id, 'wpexportcontent', $_POST[ 'wpexportcontent' ] );
96
+ BackWPup_Option::update( $id, 'wpexportfile', BackWPup_Job::sanitize_file_name( $_POST[ 'wpexportfile' ] ) );
97
+ if ( $_POST[ 'wpexportfilecompression' ] == '' || $_POST[ 'wpexportfilecompression' ] == '.gz' || $_POST[ 'wpexportfilecompression' ] == '.bz2' )
98
+ BackWPup_Option::update( $id, 'wpexportfilecompression', $_POST[ 'wpexportfilecompression' ] );
99
+ }
100
+
101
+ /**
102
+ * @param $job_object
103
+ * @return bool
104
+ */
105
+ public function job_run( &$job_object ) {
106
+ global $wpdb, $post, $wp_query;
107
+
108
+ $wxr_version = '1.2';
109
+
110
+ if ( $job_object->steps_data[ $job_object->step_working ]['SAVE_STEP_TRY'] != $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] ) {
111
+ $job_object->log( sprintf( __( '%d. Trying to create a WordPress export to XML file&#160;&hellip;', 'backwpup' ), $job_object->steps_data[ $job_object->step_working ][ 'STEP_TRY' ] ) );
112
+ $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] = BackWPup::get_plugin_data( 'TEMP' ) . $job_object->generate_filename( $job_object->job[ 'wpexportfile' ], 'xml', TRUE );
113
+ $job_object->steps_data[ $job_object->step_working ]['substep'] = 'header';
114
+ $job_object->steps_data[ $job_object->step_working ]['post_ids'] = array();
115
+ $job_object->substeps_todo = 10;
116
+ $job_object->substeps_done = 0;
117
+ }
118
+
119
+ add_filter( 'wxr_export_skip_postmeta', array( $this, 'wxr_filter_postmeta' ), 10, 2 );
120
+
121
+ if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'header' ) {
122
+
123
+ if ( 'all' != $job_object->job[ 'wpexportcontent' ] && post_type_exists( $job_object->job[ 'wpexportcontent' ] ) ) {
124
+ $ptype = get_post_type_object( $job_object->job[ 'wpexportcontent' ] );
125
+ if ( ! $ptype->can_export ) {
126
+ $job_object->log( sprintf( __( 'WP Export: Post type “%s” does not allow export.', 'backwpup' ), $job_object->job[ 'wpexportcontent' ] ), E_USER_ERROR );
127
+ return FALSE;
128
+ }
129
+ $where = $wpdb->prepare( "{$wpdb->posts}.post_type = %s", $job_object->job[ 'wpexportcontent' ] );
130
+ } else {
131
+ $post_types = get_post_types( array( 'can_export' => true ) );
132
+ $esses = array_fill( 0, count($post_types), '%s' );
133
+ $where = $wpdb->prepare( "{$wpdb->posts}.post_type IN (" . implode( ',', $esses ) . ')', $post_types );
134
+ $job_object->job[ 'wpexportcontent' ] = 'all';
135
+ }
136
+ $where .= " AND {$wpdb->posts}.post_status != 'auto-draft'";
137
+
138
+ // grab a snapshot of post IDs, just in case it changes during the export
139
+ $job_object->steps_data[ $job_object->step_working ]['post_ids'] = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE $where" );
140
+ $job_object->substeps_todo = $job_object->substeps_todo + count( $job_object->steps_data[ $job_object->step_working ]['post_ids'] );
141
+
142
+ $header = '<?xml version="1.0" encoding="' . get_bloginfo('charset') . "\" ?>\n";
143
+ $header .= "<!-- This is a WordPress eXtended RSS file generated by the WordPress plugin BackWPup as an export of your site. -->\n";
144
+ $header .= "<!-- It contains information about your site's posts, pages, comments, categories, and other content. -->\n";
145
+ $header .= "<!-- You may use this file to transfer that content from one site to another. -->\n";
146
+ $header .= "<!-- This file is not intended to serve as a complete backup of your site. -->\n\n";
147
+ $header .= "<!-- To import this information into a WordPress site follow these steps: -->\n";
148
+ $header .= "<!-- 1. Log in to that site as an administrator. -->\n";
149
+ $header .= "<!-- 2. Go to Tools: Import in the WordPress admin panel. -->\n";
150
+ $header .= "<!-- 3. Install the \"WordPress\" importer from the list. -->\n";
151
+ $header .= "<!-- 4. Activate & Run Importer. -->\n";
152
+ $header .= "<!-- 5. Upload this file using the form provided on that page. -->\n";
153
+ $header .= "<!-- 6. You will first be asked to map the authors in this export file to users -->\n";
154
+ $header .= "<!-- on the site. For each author, you may choose to map to an -->\n";
155
+ $header .= "<!-- existing user on the site or to create a new user. -->\n";
156
+ $header .= "<!-- 7. WordPress will then import each of the posts, pages, comments, categories, etc. -->\n";
157
+ $header .= "<!-- contained in this file into your site. -->\n\n";
158
+ $header .= "<!-- generator=\"WordPress/" . get_bloginfo_rss('version') . "\" created=\"". date('Y-m-d H:i') . "\" -->\n";
159
+ $header .= "<rss version=\"2.0\" xmlns:excerpt=\"http://wordpress.org/export/$wxr_version/excerpt/\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\" xmlns:wfw=\"http://wellformedweb.org/CommentAPI/\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:wp=\"http://wordpress.org/export/$wxr_version/\">\n";
160
+ $header .= "<channel>\n";
161
+ $header .= "\t<title>" . get_bloginfo_rss( 'name' ) ."</title>\n";
162
+ $header .= "\t<link>" . get_bloginfo_rss( 'url' ) ."</link>\n";
163
+ $header .= "\t<description>" . get_bloginfo_rss( 'description' ) ."</description>\n";
164
+ $header .= "\t<pubDate>" . date( 'D, d M Y H:i:s +0000' ) ."</pubDate>\n";
165
+ $header .= "\t<language>" . get_bloginfo_rss( 'language' ) ."</language>\n";
166
+ $header .= "\t<wp:wxr_version>" . $wxr_version ."</wp:wxr_version>\n";
167
+ $header .= "\t<wp:base_site_url>" . $this->wxr_site_url() ."</wp:base_site_url>\n";
168
+ $header .= "\t<wp:base_blog_url>" . get_bloginfo_rss( 'url' ) ."</wp:base_blog_url>\n";
169
+ $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $header, FILE_APPEND );
170
+ if ( $written === FALSE ) {
171
+ $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
172
+
173
+ return FALSE;
174
+ }
175
+ unset( $header );
176
+ $job_object->steps_data[ $job_object->step_working ]['substep'] = 'authors';
177
+ $job_object->substeps_done ++;
178
+ $job_object->update_working_data();
179
+ $job_object->do_restart_time();
180
+ }
181
+
182
+ if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'authors' ) {
183
+ $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $this->wxr_authors_list(), FILE_APPEND );
184
+ if ( $written === FALSE ) {
185
+ $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
186
+
187
+ return FALSE;
188
+ }
189
+ $job_object->steps_data[ $job_object->step_working ]['substep'] = 'cats';
190
+ $job_object->substeps_done ++;
191
+ $job_object->update_working_data();
192
+ $job_object->do_restart_time();
193
+ }
194
+
195
+
196
+ if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'cats' ) {
197
+ if ( 'all' == $job_object->job[ 'wpexportcontent' ] ) {
198
+ $cats = array();
199
+ $categories = (array) get_categories( array( 'get' => 'all' ) );
200
+ // put categories in order with no child going before its parent
201
+ while ( $cat = array_shift( $categories ) ) {
202
+ if ( $cat->parent == 0 || isset( $cats[$cat->parent] ) )
203
+ $cats[$cat->term_id] = $cat;
204
+ else
205
+ $categories[] = $cat;
206
+ }
207
+ $cats_xml = '';
208
+ foreach ( $cats as $c ) {
209
+ $parent_slug = $c->parent ? $cats[$c->parent]->slug : '';
210
+ $cats_xml .= "\t<wp:category><wp:term_id>" . $c->term_id ."</wp:term_id><wp:category_nicename>" . $c->slug . "</wp:category_nicename><wp:category_parent>" . $parent_slug . "</wp:category_parent>" . $this->wxr_cat_name( $c ) . $this->wxr_category_description( $c ) ."</wp:category>\n";
211
+ }
212
+ $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $cats_xml, FILE_APPEND );
213
+ if ( $written === FALSE ) {
214
+ $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
215
+
216
+ return FALSE;
217
+ }
218
+ unset( $cats_xml );
219
+ }
220
+ $job_object->steps_data[ $job_object->step_working ]['substep'] = 'tags';
221
+ $job_object->substeps_done ++;
222
+ $job_object->update_working_data();
223
+ $job_object->do_restart_time();
224
+ }
225
+
226
+ if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'tags' ) {
227
+ if ( 'all' == $job_object->job[ 'wpexportcontent' ] ) {
228
+ $tags = (array) get_tags( array( 'get' => 'all' ) );
229
+ $tags_xml = '';
230
+ foreach ( $tags as $t ) {
231
+ $tags_xml .= "\t<wp:tag><wp:term_id>" . $t->term_id ."</wp:term_id><wp:tag_slug>" . $t->slug ."</wp:tag_slug>" . $this->wxr_tag_name( $t ) . $this->wxr_tag_description( $t ) ."</wp:tag>\n";
232
+ }
233
+ $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $tags_xml, FILE_APPEND );
234
+ if ( $written === FALSE ) {
235
+ $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
236
+
237
+ return FALSE;
238
+ }
239
+ unset( $tags_xml );
240
+ }
241
+ $job_object->steps_data[ $job_object->step_working ]['substep'] = 'terms';
242
+ $job_object->substeps_done ++;
243
+ $job_object->update_working_data();
244
+ $job_object->do_restart_time();
245
+ }
246
+
247
+ if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'terms' ) {
248
+ if ( 'all' == $job_object->job[ 'wpexportcontent' ] ) {
249
+
250
+ $terms = array();
251
+ $custom_taxonomies = get_taxonomies( array( '_builtin' => false ) );
252
+ $custom_terms = (array) get_terms( $custom_taxonomies, array( 'get' => 'all' ) );
253
+
254
+ // put terms in order with no child going before its parent
255
+ while ( $t = array_shift( $custom_terms ) ) {
256
+ if ( $t->parent == 0 || isset( $terms[$t->parent] ) )
257
+ $terms[$t->term_id] = $t;
258
+ else
259
+ $custom_terms[] = $t;
260
+ }
261
+ $terms_xml = '';
262
+ foreach ( $terms as $t ) {
263
+ $parent_slug = $t->parent ? $terms[$t->parent]->slug : '';
264
+ $terms_xml .= "\t<wp:term><wp:term_id>" . $t->term_id ."</wp:term_id><wp:term_taxonomy>" . $t->taxonomy . "</wp:term_taxonomy><wp:term_slug>" . $t->slug ."</wp:term_slug><wp:term_parent>" . $parent_slug ."</wp:term_parent>" . $this->wxr_term_name( $t ) . $this->wxr_term_description( $t ) ."</wp:term>\n";
265
+ }
266
+ $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $terms_xml, FILE_APPEND );
267
+ if ( $written === FALSE ) {
268
+ $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
269
+
270
+ return FALSE;
271
+ }
272
+ unset( $terms_xml );
273
+ }
274
+ $job_object->steps_data[ $job_object->step_working ]['substep'] = 'menus';
275
+ $job_object->substeps_done ++;
276
+ $job_object->update_working_data();
277
+ $job_object->do_restart_time();
278
+ }
279
+
280
+ if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'menus' ) {
281
+ $menu_xml = '';
282
+ if ( 'all' == $job_object->job[ 'wpexportcontent' ] ) {
283
+ $menu_xml .= $this->wxr_nav_menu_terms();
284
+ }
285
+ $menu_xml .= "\t<generator>http://wordpress.org/?v=" . get_bloginfo_rss( 'version' ) . "</generator>\n";
286
+ $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $menu_xml, FILE_APPEND );
287
+ if ( $written === FALSE ) {
288
+ $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
289
+
290
+ return FALSE;
291
+ }
292
+ unset( $menu_xml );
293
+
294
+ $job_object->steps_data[ $job_object->step_working ]['substep'] = 'posts';
295
+ $job_object->substeps_done ++;
296
+ $job_object->update_working_data();
297
+ $job_object->do_restart_time();
298
+ }
299
+
300
+
301
+ if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'posts' ) {
302
+
303
+ if ( ! empty( $job_object->steps_data[ $job_object->step_working ]['post_ids'] ) ) {
304
+ $wp_query->in_the_loop = true; // Fake being in the loop.
305
+
306
+ // fetch 20 posts at a time rather than loading the entire table into memory
307
+ while ( $next_posts = array_splice( $job_object->steps_data[ $job_object->step_working ]['post_ids'], 0, 20 ) ) {
308
+ $where = 'WHERE ID IN (' . join( ',', $next_posts ) . ')';
309
+ $posts = $wpdb->get_results( "SELECT * FROM {$wpdb->posts} $where" );
310
+ $wxr_post = '';
311
+ // Begin Loop
312
+ foreach ( $posts as $post ) {
313
+ /* @var WP_Post $post */
314
+
315
+ $is_sticky = is_sticky( $post->ID ) ? 1 : 0;
316
+
317
+ $wxr_post .= "\t<item>\n";
318
+ $wxr_post .= "\t\t<title>" . apply_filters( 'the_title_rss', $post->post_title ) ."</title>\n";
319
+ $wxr_post .= "\t\t<link>" . esc_url( apply_filters( 'the_permalink_rss', get_permalink( $post ) ) ) ."</link>\n";
320
+ $wxr_post .= "\t\t<pubDate>" . mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true, $post ), false ) ."</pubDate>\n";
321
+ $wxr_post .= "\t\t<dc:creator>" . $this->wxr_cdata( get_the_author_meta( 'login', $post->post_author ) ) ."</dc:creator>\n";
322
+ $wxr_post .= "\t\t<guid isPermaLink=\"false\">" . esc_url( get_the_guid( $post->ID ) ) ."</guid>\n";
323
+ $wxr_post .= "\t\t<description></description>\n";
324
+ $wxr_post .= "\t\t<content:encoded>" . $this->wxr_cdata( apply_filters( 'the_content_export', $post->post_content ) ) . "</content:encoded>\n";
325
+ $wxr_post .= "\t\t<excerpt:encoded>" . $this->wxr_cdata( apply_filters( 'the_excerpt_export', $post->post_excerpt ) ) . "</excerpt:encoded>\n";
326
+ $wxr_post .= "\t\t<wp:post_id>" . $post->ID . "</wp:post_id>\n";
327
+ $wxr_post .= "\t\t<wp:post_date>" . $post->post_date . "</wp:post_date>\n";
328
+ $wxr_post .= "\t\t<wp:post_date_gmt>" . $post->post_date_gmt . "</wp:post_date_gmt>\n";
329
+ $wxr_post .= "\t\t<wp:comment_status>" . $post->comment_status . "</wp:comment_status>\n";
330
+ $wxr_post .= "\t\t<wp:ping_status>" . $post->ping_status . "</wp:ping_status>\n";
331
+ $wxr_post .= "\t\t<wp:post_name>" . $post->post_name . "</wp:post_name>\n";
332
+ $wxr_post .= "\t\t<wp:status>" . $post->post_status . "</wp:status>\n";
333
+ $wxr_post .= "\t\t<wp:post_parent>" . $post->post_parent . "</wp:post_parent>\n";
334
+ $wxr_post .= "\t\t<wp:menu_order>" . $post->menu_order . "</wp:menu_order>\n";
335
+ $wxr_post .= "\t\t<wp:post_type>" . $post->post_type . "</wp:post_type>\n";
336
+ $wxr_post .= "\t\t<wp:post_password>" . $post->post_password . "</wp:post_password>\n";
337
+ $wxr_post .= "\t\t<wp:is_sticky>" . $is_sticky . "</wp:is_sticky>\n";
338
+ if ( $post->post_type == 'attachment' ) {
339
+ $wxr_post .= "\t\t<wp:attachment_url>" . wp_get_attachment_url( $post->ID ) . "</wp:attachment_url>\n";
340
+ }
341
+ $wxr_post .= $this->wxr_post_taxonomy();
342
+
343
+ $postmeta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->postmeta WHERE post_id = %d", $post->ID ) );
344
+ foreach ( $postmeta as $meta ) {
345
+ if ( apply_filters( 'wxr_export_skip_postmeta', false, $meta->meta_key, $meta ) ) {
346
+ continue;
347
+ }
348
+ $wxr_post .= "\t\t<wp:postmeta>\n\t\t\t<wp:meta_key>" . $meta->meta_key ."</wp:meta_key>\n\t\t\t<wp:meta_value>" .$this->wxr_cdata( $meta->meta_value ) ."</wp:meta_value>\n\t\t</wp:postmeta>\n";
349
+ }
350
+
351
+ $comments = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved <> 'spam'", $post->ID ) );
352
+ foreach ( $comments as $c ) {
353
+ $wxr_post .= "\t\t<wp:comment>\n";
354
+ $wxr_post .= "\t\t\t<wp:comment_id>" . $c->comment_ID . "</wp:comment_id>\n";
355
+ $wxr_post .= "\t\t\t<wp:comment_author>" . $this->wxr_cdata( $c->comment_author ) . "</wp:comment_author>\n";
356
+ $wxr_post .= "\t\t\t<wp:comment_author_email>" . $c->comment_author_email . "</wp:comment_author_email>\n";
357
+ $wxr_post .= "\t\t\t<wp:comment_author_url>" . esc_url_raw( $c->comment_author_url ) . "</wp:comment_author_url>\n";
358
+ $wxr_post .= "\t\t\t<wp:comment_author_IP>" . $c->comment_author_IP . "</wp:comment_author_IP>\n";
359
+ $wxr_post .= "\t\t\t<wp:comment_date>" . $c->comment_date . "</wp:comment_date>\n";
360
+ $wxr_post .= "\t\t\t<wp:comment_date_gmt>" . $c->comment_date_gmt . "</wp:comment_date_gmt>\n";
361
+ $wxr_post .= "\t\t\t<wp:comment_content>" . $this->wxr_cdata( $c->comment_content ) . "</wp:comment_content>\n";
362
+ $wxr_post .= "\t\t\t<wp:comment_approved>" . $c->comment_approved . "</wp:comment_approved>\n";
363
+ $wxr_post .= "\t\t\t<wp:comment_type>" . $c->comment_type . "</wp:comment_type>\n";
364
+ $wxr_post .= "\t\t\t<wp:comment_parent>" . $c->comment_parent . "</wp:comment_parent>\n";
365
+ $wxr_post .= "\t\t\t<wp:comment_user_id>" . $c->user_id . "</wp:comment_user_id>\n";
366
+ $c_meta = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM $wpdb->commentmeta WHERE comment_id = %d", $c->comment_ID ) );
367
+ foreach ( $c_meta as $meta ) {
368
+ $wxr_post .= "\t\t\t<wp:commentmeta>\n\t\t\t\t<wp:meta_key>" . $meta->meta_key ."</wp:meta_key>\n\t\t\t\t<wp:meta_value>" .$this->wxr_cdata( $meta->meta_value ) ."</wp:meta_value>\n\t\t\t</wp:commentmeta>\n";
369
+ }
370
+ $wxr_post .= "\t\t</wp:comment>\n";
371
+ }
372
+ $wxr_post .= "\t</item>\n";
373
+ $job_object->substeps_done ++;
374
+ }
375
+ $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], $wxr_post, FILE_APPEND );
376
+ if ( $written === FALSE ) {
377
+ $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
378
+
379
+ return FALSE;
380
+ }
381
+ $job_object->do_restart_time();
382
+ }
383
+ }
384
+ $written = file_put_contents( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ], "</channel>\n</rss>", FILE_APPEND );
385
+ if ( $written === FALSE ) {
386
+ $job_object->log( __( 'WP Export file could not written.', 'backwpup' ), E_USER_ERROR );
387
+
388
+ return FALSE;
389
+ }
390
+ $job_object->steps_data[ $job_object->step_working ]['substep'] = 'check';
391
+ $job_object->substeps_done ++;
392
+ $job_object->update_working_data();
393
+ $job_object->do_restart_time();
394
+ }
395
+
396
+ remove_filter( 'wxr_export_skip_postmeta', array( $this, 'wxr_filter_postmeta' ), 10, 2 );
397
+
398
+ if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'check' ) {
399
+
400
+ if ( extension_loaded( 'simplexml' ) && class_exists( 'DOMDocument' ) ) {
401
+ $job_object->log( __( 'Check WP Export file&#160;&hellip;', 'backwpup' ) );
402
+ $job_object->need_free_memory( filesize( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] ) * 2 );
403
+ $valid = TRUE;
404
+
405
+ $internal_errors = libxml_use_internal_errors( TRUE );
406
+ $dom = new DOMDocument;
407
+ $old_value = NULL;
408
+ if ( function_exists( 'libxml_disable_entity_loader' ) )
409
+ $old_value = libxml_disable_entity_loader( TRUE );
410
+ $success = $dom->loadXML( file_get_contents( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] ) );
411
+ if ( ! is_null( $old_value ) )
412
+ libxml_disable_entity_loader( $old_value );
413
+
414
+ if ( ! $success || isset( $dom->doctype ) ) {
415
+ $errors = libxml_get_errors();
416
+ $valid = FALSE;
417
+
418
+ foreach ( $errors as $error ) {
419
+ switch ( $error->level ) {
420
+ case LIBXML_ERR_WARNING:
421
+ $job_object->log( E_USER_WARNING, sprintf( __( 'XML WARNING (%s): %s', 'backwpup' ), $error->code, trim( $error->message ) ), $job_object->steps_data[ $job_object->step_working ]['wpexportfile'], $error->line );
422
+ break;
423
+ case LIBXML_ERR_ERROR:
424
+ $job_object->log( E_USER_WARNING, sprintf( __( 'XML RECOVERABLE (%s): %s', 'backwpup' ), $error->code, trim( $error->message ) ), $job_object->steps_data[ $job_object->step_working ]['wpexportfile'], $error->line );
425
+ break;
426
+ case LIBXML_ERR_FATAL:
427
+ $job_object->log( E_USER_WARNING, sprintf( __( 'XML ERROR (%s): %s', 'backwpup' ),$error->code, trim( $error->message ) ), $job_object->steps_data[ $job_object->step_working ]['wpexportfile'], $error->line );
428
+ break;
429
+ }
430
+ }
431
+ } else {
432
+ $xml = simplexml_import_dom( $dom );
433
+ unset( $dom );
434
+
435
+ // halt if loading produces an error
436
+ if ( ! $xml ) {
437
+ $job_object->log( __( 'There was an error when reading this WXR file', 'backwpup' ), E_USER_ERROR );
438
+ $valid = FALSE;
439
+ } else {
440
+
441
+ $wxr_version = $xml->xpath('/rss/channel/wp:wxr_version');
442
+ if ( ! $wxr_version ) {
443
+ $job_object->log( __( 'This does not appear to be a WXR file, missing/invalid WXR version number', 'backwpup' ), E_USER_ERROR );
444
+ $valid = FALSE;
445
+ }
446
+
447
+ $wxr_version = (string) trim( $wxr_version[0] );
448
+ // confirm that we are dealing with the correct file format
449
+ if ( ! preg_match( '/^\d+\.\d+$/', $wxr_version ) ) {
450
+ $job_object->log( __( 'This does not appear to be a WXR file, missing/invalid WXR version number', 'backwpup' ), E_USER_ERROR );
451
+ $valid = FALSE;
452
+ }
453
+ }
454
+ }
455
+
456
+ libxml_use_internal_errors( $internal_errors );
457
+
458
+ if ( $valid )
459
+ $job_object->log( __( 'WP Export file is a valid WXR file.', 'backwpup' ) );
460
+ } else {
461
+ $job_object->log( __( 'WP Export file can not checked, because no XML extension loaded with the file can checked.', 'backwpup' ) );
462
+ }
463
+
464
+ $job_object->steps_data[ $job_object->step_working ]['substep'] = 'compress';
465
+ $job_object->substeps_done ++;
466
+ $job_object->update_working_data();
467
+ $job_object->do_restart_time();
468
+ }
469
+
470
+ //Compress file
471
+ if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'compress' ) {
472
+ if ( ! empty( $job_object->job[ 'wpexportfilecompression' ] ) ) {
473
+ $job_object->log( __( 'Compressing file&#160;&hellip;', 'backwpup' ) );
474
+ try {
475
+ $compress = new BackWPup_Create_Archive( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] . $job_object->job[ 'wpexportfilecompression' ] );
476
+ if ( $compress->add_file( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] ) ) {
477
+ unset( $compress );
478
+ unlink( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] );
479
+ $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] .= $job_object->job[ 'wpexportfilecompression' ];
480
+ $job_object->log( __( 'Compressing done.', 'backwpup' ) );
481
+ }
482
+ } catch ( Exception $e ) {
483
+ $job_object->log( $e->getMessage(), E_USER_ERROR, $e->getFile(), $e->getLine() );
484
+ unset( $compress );
485
+ return FALSE;
486
+ }
487
+ }
488
+ $job_object->steps_data[ $job_object->step_working ]['substep'] = 'addfile';
489
+ $job_object->substeps_done ++;
490
+ $job_object->update_working_data();
491
+ $job_object->do_restart_time();
492
+ }
493
+
494
+ if ( $job_object->steps_data[ $job_object->step_working ]['substep'] == 'addfile' ) {
495
+ //add XML file to backup files
496
+ if ( is_readable( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] ) ) {
497
+ $job_object->additional_files_to_backup[ ] = $job_object->steps_data[ $job_object->step_working ]['wpexportfile'];
498
+ $job_object->count_files ++;
499
+ $filesize = filesize( $job_object->steps_data[ $job_object->step_working ][ 'wpexportfile' ] );
500
+ $job_object->count_filesize = $job_object->count_filesize + $filesize;
501
+ $job_object->log( sprintf( __( 'Added XML export "%1$s" with %2$s to backup file list.', 'backwpup' ), basename( $job_object->steps_data[ $job_object->step_working ]['wpexportfile'] ), size_format( $filesize, 2 ) ) );
502
+ }
503
+ $job_object->substeps_done ++;
504
+ $job_object->update_working_data();
505
+ }
506
+
507
+ return TRUE;
508
+ }
509
+
510
+ /**
511
+ * Wrap given string in XML CDATA tag.
512
+ *
513
+ * @since WordPress 2.1.0
514
+ *
515
+ * @param string $str String to wrap in XML CDATA tag.
516
+ * @return string
517
+ */
518
+ private function wxr_cdata( $str ) {
519
+ if ( seems_utf8( $str ) == false )
520
+ $str = utf8_encode( $str );
521
+
522
+ // not allowed UTF-8 chars in XML
523
+ $str = preg_replace( '/[^\x{0009}\x{000a}\x{000d}\x{0020}-\x{D7FF}\x{E000}-\x{FFFD}]+/u', '', $str );
524
+
525
+ // $str = ent2ncr(esc_html($str));
526
+ $str = '<![CDATA[' . str_replace( ']]>', ']]]]><![CDATA[>', $str ) . ']]>';
527
+
528
+ return $str;
529
+ }
530
+
531
+ /**
532
+ * Return the URL of the site
533
+ *
534
+ * @since WordPress 2.5.0
535
+ *
536
+ * @return string Site URL.
537
+ */
538
+ private function wxr_site_url() {
539
+ // ms: the base url
540
+ if ( is_multisite() )
541
+ return network_home_url();
542
+ // wp: the blog url
543
+ else
544
+ return get_bloginfo_rss( 'url' );
545
+ }
546
+
547
+ /**
548
+ * Output a cat_name XML tag from a given category object
549
+ *
550
+ * @since WordPress 2.1.0
551
+ *
552
+ * @param object $category Category Object
553
+ * @return string
554
+ */
555
+ private function wxr_cat_name( $category ) {
556
+ if ( empty( $category->name ) )
557
+ return '';
558
+
559
+ return '<wp:cat_name>' . $this->wxr_cdata( $category->name ) . '</wp:cat_name>';
560
+ }
561
+
562
+ /**
563
+ * Output a category_description XML tag from a given category object
564
+ *
565
+ * @since WordPress 2.1.0
566
+ *
567
+ * @param object $category Category Object
568
+ * @return string
569
+ */
570
+ private function wxr_category_description( $category ) {
571
+ if ( empty( $category->description ) )
572
+ return '';
573
+
574
+ return '<wp:category_description>' . $this->wxr_cdata( $category->description ) . '</wp:category_description>';
575
+ }
576
+
577
+ /**
578
+ * Output a tag_name XML tag from a given tag object
579
+ *
580
+ * @since WordPress 2.3.0
581
+ *
582
+ * @param object $tag Tag Object
583
+ * @return string
584
+ */
585
+ private function wxr_tag_name( $tag ) {
586
+ if ( empty( $tag->name ) )
587
+ return '';
588
+
589
+ return '<wp:tag_name>' . $this->wxr_cdata( $tag->name ) . '</wp:tag_name>';
590
+ }
591
+
592
+ /**
593
+ * Output a tag_description XML tag from a given tag object
594
+ *
595
+ * @since WordPress 2.3.0
596
+ *
597
+ * @param object $tag Tag Object
598
+ * @return string
599
+ */
600
+ private function wxr_tag_description( $tag ) {
601
+ if ( empty( $tag->description ) )
602
+ return '';
603
+
604
+ return '<wp:tag_description>' . $this->wxr_cdata( $tag->description ) . '</wp:tag_description>';
605
+ }
606
+
607
+ /**
608
+ * Output a term_name XML tag from a given term object
609
+ *
610
+ * @since WordPress 2.9.0
611
+ *
612
+ * @param object $term Term Object
613
+ * @return string
614
+ */
615
+ private function wxr_term_name( $term ) {
616
+ if ( empty( $term->name ) )
617
+ return '';
618
+
619
+ return '<wp:term_name>' . $this->wxr_cdata( $term->name ) . '</wp:term_name>';
620
+ }
621
+
622
+ /**
623
+ * Output a term_description XML tag from a given term object
624
+ *
625
+ * @since WordPress 2.9.0
626
+ *
627
+ * @param object $term Term Object
628
+ * @return string
629
+ */
630
+ private function wxr_term_description( $term ) {
631
+ if ( empty( $term->description ) )
632
+ return '';
633
+
634
+ return '<wp:term_description>' . $this->wxr_cdata( $term->description ) . '</wp:term_description>';
635
+ }
636
+
637
+ /**
638
+ * Output list of authors with posts
639
+ *
640
+ * @since WordPress 3.1.0
641
+ */
642
+ private function wxr_authors_list() {
643
+ global $wpdb;
644
+
645
+ $authors = array();
646
+ $results = $wpdb->get_results( "SELECT DISTINCT post_author FROM $wpdb->posts WHERE post_status != 'auto-draft'" );
647
+ foreach ( (array) $results as $result )
648
+ $authors[] = get_userdata( $result->post_author );
649
+
650
+ $authors = array_filter( $authors );
651
+
652
+ $wxr_authors = '';
653
+
654
+ foreach ( $authors as $author ) {
655
+ $wxr_authors .= "\t<wp:author>";
656
+ $wxr_authors .= '<wp:author_id>' . $author->ID . '</wp:author_id>';
657
+ $wxr_authors .= '<wp:author_login>' . $author->user_login . '</wp:author_login>';
658
+ $wxr_authors .= '<wp:author_email>' . $author->user_email . '</wp:author_email>';
659
+ $wxr_authors .= '<wp:author_display_name>' . $this->wxr_cdata( $author->display_name ) . '</wp:author_display_name>';
660
+ $wxr_authors .= '<wp:author_first_name>' . $this->wxr_cdata( $author->user_firstname ) . '</wp:author_first_name>';
661
+ $wxr_authors .= '<wp:author_last_name>' . $this->wxr_cdata( $author->user_lastname ) . '</wp:author_last_name>';
662
+ $wxr_authors .= "</wp:author>\n";
663
+ }
664
+
665
+ return $wxr_authors;
666
+ }
667
+
668
+ /**
669
+ * Ouput all navigation menu terms
670
+ *
671
+ * @since WordPress 3.1.0
672
+ */
673
+ private function wxr_nav_menu_terms() {
674
+ $nav_menus = wp_get_nav_menus();
675
+ if ( empty( $nav_menus ) || ! is_array( $nav_menus ) )
676
+ return '';
677
+
678
+ $wxr_nav_meuns = '';
679
+
680
+ foreach ( $nav_menus as $menu ) {
681
+ $wxr_nav_meuns .= "\t<wp:term><wp:term_id>{$menu->term_id}</wp:term_id><wp:term_taxonomy>nav_menu</wp:term_taxonomy><wp:term_slug>{$menu->slug}</wp:term_slug>";
682
+ $wxr_nav_meuns .= $this->wxr_term_name( $menu );
683
+ $wxr_nav_meuns .= "</wp:term>\n";
684
+ }
685
+
686
+ return $wxr_nav_meuns;
687
+ }
688
+
689
+ /**
690
+ * Output list of taxonomy terms, in XML tag format, associated with a post
691
+ *
692
+ * @since WordPress 2.3.0
693
+ */
694
+ private function wxr_post_taxonomy() {
695
+ $post = get_post();
696
+
697
+ $taxonomies = get_object_taxonomies( $post->post_type );
698
+ if ( empty( $taxonomies ) )
699
+ return '';
700
+ $terms = wp_get_object_terms( $post->ID, $taxonomies );
701
+
702
+ $wxr_post_tags = '';
703
+
704
+ foreach ( (array) $terms as $term ) {
705
+ $wxr_post_tags .= "\t\t<category domain=\"{$term->taxonomy}\" nicename=\"{$term->slug}\">" . $this->wxr_cdata( $term->name ) . "</category>\n";
706
+ }
707
+
708
+ return $wxr_post_tags;
709
+ }
710
+
711
+ public function wxr_filter_postmeta( $return_me, $meta_key ) {
712
+ if ( '_edit_lock' == $meta_key )
713
+ $return_me = true;
714
+ return $return_me;
715
+ }
716
+
717
+
718
+
719
+ }
inc/class-jobtype-wpplugin.php CHANGED
@@ -77,7 +77,7 @@ class BackWPup_JobType_WPPlugin extends BackWPup_JobTypes {
77
  */
78
  public function edit_form_post_save( $id ) {
79
 
80
- BackWPup_Option::update( $id, 'pluginlistfile', sanitize_file_name( $_POST[ 'pluginlistfile' ] ) );
81
  if ( $_POST[ 'pluginlistfilecompression' ] == '' || $_POST[ 'pluginlistfilecompression' ] == '.gz' || $_POST[ 'pluginlistfilecompression' ] == '.bz2' )
82
  BackWPup_Option::update( $id, 'pluginlistfilecompression', $_POST[ 'pluginlistfilecompression' ] );
83
  }
77
  */
78
  public function edit_form_post_save( $id ) {
79
 
80
+ BackWPup_Option::update( $id, 'pluginlistfile', BackWPup_Job::sanitize_file_name( $_POST[ 'pluginlistfile' ] ) );
81
  if ( $_POST[ 'pluginlistfilecompression' ] == '' || $_POST[ 'pluginlistfilecompression' ] == '.gz' || $_POST[ 'pluginlistfilecompression' ] == '.bz2' )
82
  BackWPup_Option::update( $id, 'pluginlistfilecompression', $_POST[ 'pluginlistfilecompression' ] );
83
  }
inc/class-page-about.php CHANGED
@@ -1,715 +1,715 @@
1
- <?php
2
- /**
3
- * Render plugin about Page.
4
- *
5
- */
6
- class BackWPup_Page_About {
7
-
8
- /**
9
- * Enqueue style.
10
- *
11
- * @return void
12
- */
13
- public static function admin_print_styles() {
14
-
15
- ?>
16
- <style type="text/css" media="screen">
17
- .inpsyde {
18
- width:79px;
19
- height:119px;
20
- background: url( '<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/inpsyde.png' ) no-repeat;
21
- position: absolute;
22
- top:0;
23
- right: 100px;
24
- z-index: 1;
25
- }
26
- .inpsyde a, .inpsyde a:link{
27
- float:left;
28
- font-size:14px;
29
- color:#fff;
30
- text-decoration:none;
31
- padding:65px 15px 15px 15px;
32
- text-align:center;
33
- }
34
- @media screen and (max-width: 782px) {
35
- .inpsyde {
36
- right:10px;
37
- }
38
- }
39
- @media screen and (max-width: 600px) {
40
- .inpsyde {
41
- display: none;
42
- }
43
- }
44
- #backwpup-page {
45
- background: #fff;
46
- margin-top: 22px;
47
- padding: 0 20px;
48
- }
49
- #backwpup-page .inpsyde + h2 {
50
- visibility: hidden;
51
- }
52
- .welcome {
53
- /* max-width: 960px; */
54
- }
55
- .welcome .welcome_inner {
56
- margin:0 auto;
57
- max-width: 960px;
58
- }
59
- .backwpup-welcome {
60
- /*
61
- margin: 0 auto;
62
- max-width: 960px;
63
- */
64
- }
65
- .welcome .welcome_inner h3{
66
- font-size:42px;
67
- }
68
- .welcome .welcome_inner .welcometxt {
69
- /* width: 100%; */
70
- margin-bottom: 40px;
71
- overflow: hidden;
72
- border-bottom: 1px #ccc dotted;
73
- text-align: center;
74
- padding-bottom: 25px;
75
- position: relative;
76
- }
77
- .welcome .welcome_inner .welcometxt p{
78
- line-height:20px;
79
- font-size:18px;
80
- }
81
- .welcome .welcome_inner .feature-box{
82
- clear: both;
83
- margin-bottom: 40px;
84
- overflow: hidden;
85
- }
86
- .welcome .welcome_inner .feature-box .feature-image{
87
- float: left;
88
- width:18%;
89
- height:auto;
90
- }
91
- .welcome .welcome_inner .feature-box .feature-image img{
92
- width:100%;
93
- height:auto;
94
- max-width:350px;
95
- }
96
- .welcome .welcome_inner .feature-box .feature-text{
97
- float: left;
98
- width:72%;
99
- padding: 0 0 20px 20px;
100
- }
101
- .welcome .welcome_inner .feature-box-right .feature-text {
102
- padding: 0 20px 20px 0;
103
- }
104
- .welcome .welcome_inner .feature-box .feature-text h3{
105
- color:rgb(0, 155, 204);
106
- font-weight:normal;
107
- font-size:24px;
108
- margin:0 0 10px 0;
109
- text-align:left;
110
- }
111
- .welcome .welcome_inner .feature-box .left {
112
- float:left;
113
- }
114
- .welcome .welcome_inner .feature-box .right {
115
- float:right;
116
- }
117
- .welcome .welcome_inner .featuretitle h3 {
118
- font-size:28px;
119
- font-weight:normal;
120
- text-align:left;
121
- margin-bottom:25px;
122
- }
123
- .welcome .button-primary-bwp {
124
- float:left;
125
- padding:15px;
126
- font-size:18px;
127
- text-decoration:none;
128
- background-color:#38b0eb;
129
- color:#fff;
130
- border:none;
131
- cursor:pointer;
132
- margin: 35px 0;
133
- }
134
- .welcome .button-primary-bwp:hover {
135
- background-color:#064565;
136
- cursor:pointer;
137
- }
138
- @media only screen and (max-width: 1100px), only screen and (max-device-width: 1100px) {
139
- .welcome .welcome_inner h3{
140
- font-size:32px;
141
- }
142
- .welcome .welcome_inner .featuretitle h3 {
143
- font-size:22px;
144
- font-weight:normal;
145
- text-align:left;
146
- margin-bottom:25px;
147
- }
148
- .welcome .welcome_inner .welcometxt p{
149
- line-height:20px;
150
- font-size:14px;
151
- }
152
- .welcome .welcome_inner .feature-box .feature-text h3{
153
- font-weight:normal;
154
- font-size:20px;
155
- margin:0 0 10px 0;
156
- text-align:left;
157
- }
158
- .welcome .welcome_inner .feature-box .feature-text{
159
- width:72%;
160
- font-size:14px;
161
- line-height:20px;
162
- }
163
- .welcome .button-primary-bwp {
164
- float:left;
165
- padding:10px;
166
- font-size:16px;
167
- text-decoration:none;
168
- background-color:#38b0eb;
169
- color:#fff;
170
- border:none;
171
- cursor:pointer;
172
- margin: 35px 0;
173
- }
174
- }
175
- @media only screen and (max-width: 780px), only screen and (max-device-width: 780px) {
176
- .welcome .welcome_inner h3{
177
- font-size:22px;
178
- }
179
- .welcome .welcome_inner .featuretitle h3 {
180
- font-size:22px;
181
- font-weight:normal;
182
- text-align:left;
183
- }
184
- .welcome .welcome_inner .welcometxt p{
185
- line-height:20px;
186
- font-size:14px;
187
- }
188
- .welcome .welcome_inner .feature-box .feature-text h3{
189
- font-weight:normal;
190
- font-size:16px;
191
- margin:0 0 10px 0;
192
- }
193
- .welcome .welcome_inner .feature-box .feature-text{
194
- width:72%;
195
- font-size:12px;
196
- line-height:16px;
197
- text-align:left;
198
- }
199
- .welcome .button-primary-bwp {
200
- float:left;
201
- padding:10px;
202
- font-size:16px;
203
- text-decoration:none;
204
- background-color:#38b0eb;
205
- color:#fff;
206
- border:none;
207
- cursor:pointer;
208
- margin: 35px 0;
209
- }
210
- }
211
-
212
- .backwpup_comp {
213
- margin: 20px auto;
214
- width: 100%;
215
- font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
216
- font-size: 16px;
217
- }
218
-
219
- .backwpup_comp table {
220
- border: none;
221
- }
222
-
223
- .backwpup_comp table tbody tr.even td {
224
- border: none;
225
- background: none;
226
- padding: 15px;
227
- margin: 0;
228
- }
229
-
230
- .backwpup_comp table tbody tr.odd td {
231
- border: none;
232
- background: none;
233
- padding: 15px;
234
- margin: 0;
235
- }
236
-
237
- .backwpup_comp h3 {
238
- font-family: "Arial", sans-serif;
239
- font-size: 42px;
240
- text-align: center;
241
- font-weight: normal;
242
- color: #333;
243
- line-height: 44px;
244
- margin: 20px 0;
245
- }
246
-
247
- .backwpup_comp table tbody tr.ub {
248
- font-family: 'MisoRegular', "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
249
- font-size: 26px;
250
- }
251
-
252
- .backwpup_comp table tbody tr.ubdown {
253
- font-family: 'MisoRegular', "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
254
- font-size: 26px;
255
- background: none !important;
256
- }
257
-
258
- .backwpup_comp table tbody tr.even {
259
- background-image: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/even.png);
260
- }
261
-
262
- .backwpup_comp table tbody tr.odd {
263
- background-image: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/odd.png);
264
- }
265
-
266
- .backwpup_comp table tbody tr.ub td.pro {
267
- height: 50px;
268
- text-align: center;
269
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hgtopgreen.png) no-repeat bottom center;
270
- color: #fff;
271
- border-left: 1px solid #112a32;
272
- }
273
-
274
- .backwpup_comp table tbody tr.ub td.free {
275
- height: 50px;
276
- text-align: center;
277
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hgtopgreen.png) no-repeat bottom center;
278
- color: #fff;
279
- }
280
-
281
- .backwpup_comp table tbody tr.ubdown td.pro {
282
- height: 50px;
283
- text-align: center;
284
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hgbtgreen.png) no-repeat top center;
285
- color: #fff;
286
- border-left: 1px solid #1c3e49;
287
- }
288
-
289
- .backwpup_comp table tbody tr.ubdown td.pro a {
290
- color: #fff;
291
- text-decoration: none;
292
- cursor: auto;
293
- font-weight: 300;
294
- line-height: 1.4em;
295
- font-size: 18px;
296
- }
297
-
298
- .backwpup_comp table tbody tr.ubdown td.free {
299
- height: 50px;
300
- text-align: center;
301
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hgbtred.png) no-repeat top center;
302
- color: #fff;
303
- }
304
-
305
- .backwpup_comp table tbody tr.ubdown td.free a {
306
- color: #fff;
307
- }
308
-
309
- .backwpup_comp table tbody tr.even td.tick {
310
- width: 100px;
311
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/tickeven.png) no-repeat center;
312
- border-bottom: 1px solid #799e14;
313
- border-top: 1px solid #a2d123;
314
- border-left: 1px solid #799e14;
315
- }
316
-
317
- .backwpup_comp table tbody tr.odd td.tick {
318
- width: 100px;
319
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/tickodd.png) no-repeat center;
320
- border-left: 1px solid #799e14;
321
- }
322
-
323
- .backwpup_comp table tbody tr.even td.error {
324
- width: 100px;
325
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/erroreven.png) no-repeat center;
326
- border-bottom: 1px solid #b13020;
327
- border-top: 1px solid #e84936;
328
- }
329
-
330
- .backwpup_comp table tbody tr.odd td.error {
331
- width: 100px;
332
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/errorodd.png) no-repeat center;
333
- }
334
-
335
- .backwpup_comp table tbody tr.even:hover {
336
- background-image: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hover.png);
337
- }
338
-
339
- .backwpup_comp table tbody tr.odd:hover {
340
- background-image: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hover.png);
341
- }
342
-
343
- .backwpup_comp table tbody tr.even:hover td.tick {
344
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/tickhover.png) center;
345
- }
346
-
347
- .backwpup_comp table tbody tr.odd:hover td.tick {
348
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/tickhover.png) center;
349
- }
350
-
351
- .backwpup_comp table tbody tr.even:hover td.error {
352
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/errorhover.png) center;
353
- }
354
-
355
- .backwpup_comp table tbody tr.odd:hover td.error {
356
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/errorhover.png) center;
357
- }
358
-
359
- .backwpup_comp table tbody tr.ubdown:hover td.pro:hover {
360
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hgbtgreenhover.png) no-repeat top center;
361
- }
362
-
363
- .backwpup_comp table tbody tr.ubdown:hover td.free:hover {
364
- background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hgbtredhover.png) no-repeat top center;
365
- }
366
- </style>
367
- <?php
368
- }
369
-
370
- /**
371
- * Enqueue script.
372
- *
373
- * @return void
374
- */
375
- public static function admin_print_scripts() {
376
-
377
- wp_enqueue_script( 'backwpupgeneral' );
378
-
379
- }
380
-
381
-
382
- /**
383
- * Print the markup.
384
- *
385
- * @return void
386
- */
387
- public static function page() {
388
-
389
- ?>
390
- <div class="wrap" id="backwpup-page">
391
- <div class="inpsyde">
392
- <a href="http://inpsyde.com/" title="Inpsyde GmbH">Inpsyde</a>
393
- </div>
394
- <h2><span id="backwpup-page-icon">&nbsp;</span><?php echo sprintf( __( '%s Welcome', 'backwpup' ), BackWPup::get_plugin_data( 'name') ); ?></h2>
395
- <?php BackWPup_Admin::display_messages(); ?>
396
- <div class="welcome">
397
- <div class="welcome_inner">
398
- <div class="top">
399
- <?php if ( get_site_transient( 'backwpup_upgrade_from_version_two') ) { ?>
400
- <div id="update-notice" class="backwpup-welcome updated">
401
- <h3><?php _e( 'Heads up! You have updated from version 2.x', 'backwpup' ); ?></h3>
402
- <p><?php echo str_replace( '\"','"', sprintf( __( 'Please <a href="%s">check your settings</a> after updating from version 2.x:', 'backwpup' ), network_admin_url( 'admin.php').'?page=backwpupjobs') ); ?></a></p>
403
- <ul><li><?php _e('Dropbox authentication must be re-entered','backwpup'); ?></li>
404
- <li><?php _e('SugarSync authentication must be re-entered','backwpup'); ?></li>
405
- <li><?php _e('S3 Settings','backwpup'); ?></li>
406
- <li><?php _e('Google Storage is now a part of S3 service settings','backwpup'); ?></li>
407
- <li><?php _e('All your passwords','backwpup'); ?></li>
408
- </ul>
409
- </div>
410
- <?php } ?>
411
- </div>
412
- <?php if ( class_exists( 'BackWPup_Pro', FALSE ) ) { ?>
413
- <div class="welcometxt">
414
- <div class="backwpup-welcome">
415
- <img class="backwpup-banner-img" src="<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/backwpupbanner-pro.png" />
416
- <h3><?php _e( 'Welcome to BackWPup Pro', 'backwpup' ); ?></h3>
417
- <p><?php _e( 'BackWPup’s job wizards make planning and scheduling your backup jobs a breeze.', 'backwpup' ); echo ' ';
418
- _e( 'Use your backup archives to save your entire WordPress installation including <code>/wp-content/</code>. Push them to an external storage service if you don’t want to save the backups on the same server. With a single backup archive you are able to restore an installation. Use a tool like phpMyAdmin or a plugin like <a href="http://wordpress.org/plugins/adminer/" target="_blank">Adminer</a> to restore your database backup files.', 'backwpup' ); ?></p>
419
- <p><?php echo str_replace( '\"','"', sprintf( __( 'Ready to <a href="%1$s">set up a backup job</a>? You can <a href="%2$s">use the wizards</a> or plan your backup in expert mode.', 'backwpup' ), network_admin_url( 'admin.php').'?page=backwpupeditjob' , network_admin_url( 'admin.php').'?page=backwpupwizard' ) ); ?></p>
420
- </div>
421
- </div>
422
- <?php } else {?>
423
- <div class="welcometxt">
424
- <div class="backwpup-welcome">
425
- <img class="backwpup-banner-img" src="<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/backwpupbanner-free.png" />
426
- <h3><?php _e( 'Welcome to BackWPup', 'backwpup' ); ?></h3>
427
- <p><?php
428
- _e( 'Use your backup archives to save your entire WordPress installation including <code>/wp-content/</code>. Push them to an external storage service if you don’t want to save the backups on the same server. With a single backup archive you are able to restore an installation. Use a tool like phpMyAdmin or a plugin like <a href="http://wordpress.org/plugins/adminer/" target="_blank">Adminer</a> to restore your database backup files.', 'backwpup' ); ?></p>
429
- <p><?php _e( 'Ready to set up a backup job? Use one of the wizards to plan what you want to save.', 'backwpup' ); ?></p>
430
- </div>
431
- </div>
432
- <?php } ?>
433
- <?php
434
- if ( class_exists( 'BackWPup_Pro', FALSE ) ) :
435
- $autoupdate = BackWPup_Pro_MarketPress_Autoupdate::get_instance( BackWPup::get_plugin_data( 'Slug' ) , BackWPup::get_plugin_data( 'MainFile' ) );
436
- if ( $autoupdate->license_check() == 'false' ) :
437
- $plugins = get_plugins();
438
- $localplugin = FALSE;
439
- foreach ( $plugins as $plugin ) {
440
- if ( BackWPup::get_plugin_data( 'Name' ) == $plugin[ 'Name' ] )
441
- $localplugin = TRUE;
442
- }
443
- ?>
444
- <div class="welcometxt">
445
- <div class="backwpup-welcome">
446
- <h3><?php _e( 'Please activate your license', 'backwpup' ); ?></h3>
447
- <p><a href="<?php echo $localplugin ? admin_url( 'plugins.php' ) : network_admin_url( 'plugins.php' ); ?>"><?php _e( 'Please go to your plugin page and active the license to have the autoupdates enabled.', 'backwpup' ); ?></a></p>
448
- </div>
449
- </div>
450
- <?php endif; ?>
451
- <?php endif; ?>
452
- <div class="features">
453
-
454
- <div class="feature-box <?php self::feature_class(); ?>">
455
- <div class="feature-image">
456
- <img title="<?php _e( 'Save your database', 'backwpup' ); ?>" src="<?php echo BackWPup::get_plugin_data( 'URL' ); ?>/assets/images/imagesave.png" />
457
- </div>
458
- <div class="feature-text">
459
- <h3><?php _e( 'Save your database regularly', 'backwpup' ); ?></h3>
460
- <p><?php echo str_replace( '\"','"', sprintf( __( 'With BackWPup you can schedule the database backup to run automatically. With a single backup file you can restore your database. You should <a href="%s">set up a backup job</a>, so you will never forget it. There is also an option to repair and optimize the database after each backup.', 'backwpup' ), network_admin_url( 'admin.php').'?page=backwpupeditjob' ) ); ?></p>
461
- </div>
462
- </div>
463
- <div class="feature-box <?php self::feature_class(); ?>">
464
- <div class="feature-text">
465
- <h3><?php _e('WordPress XML Export', 'backwpup' ); ?></h3>
466
- <p><?php _e('You can choose the built-in WordPress export format in addition or exclusive to save your data. This works in automated backups too of course. The advantage is: you can import these files into a blog with the regular WordPress importer.', 'backwpup'); ?></p>
467
- </div>
468
- <div class="feature-image">
469
- <img title="<?php _e( 'WordPress XML Export', 'backwpup' ); ?>" src="<?php echo BackWPup::get_plugin_data( 'URL' ); ?>/assets/images/imagexml.png" />
470
- </div>
471
- </div>
472
- <div class="feature-box <?php self::feature_class(); ?>">
473
- <div class="feature-image">
474
- <img title="<?php _e( 'Save all data from the webserver', 'backwpup' ); ?>" src="<?php echo BackWPup::get_plugin_data( 'URL' ); ?>/assets/images/imagedata.png" />
475
- </div>
476
- <div class="feature-text">
477
- <h3><?php _e('Save all files', 'backwpup'); ?></h3>
478
- <p><?php echo str_replace( '\"','"', sprintf( __('You can backup all your attachments, also all system files, plugins and themes in a single file. You can <a href="%s">create a job</a> to update a backup copy of your file system only when files are changed.', 'backwpup'), network_admin_url( 'admin.php' ) . '?page=backwpupeditjob' ) ); ?></p>
479
- </div>
480
- </div>
481
- <div class="feature-box <?php self::feature_class(); ?>">
482
- <div class="feature-text">
483
- <h3><?php _e( 'Security!', 'backwpup' ); ?></h3>
484
- <p><?php _e('By default everything is encrypted: connections to external services, local files and access to directories.', 'backwpup'); ?></p>
485
- </div>
486
- <div class="feature-image">
487
- <img title="<?php _e( 'Security!', 'backwpup' ); ?>" src="<?php echo BackWPup::get_plugin_data( 'URL' ); ?>/assets/images/imagesec.png" />
488
- </div>
489
- </div>
490
- <div class="feature-box <?php self::feature_class(); ?>">
491
- <div class="feature-image">
492
- <img title="<?php _e( 'Cloud Support', 'backwpup' ); ?>" src="<?php echo BackWPup::get_plugin_data( 'URL' ); ?>/assets/images/imagecloud.png" />
493
- </div>
494
- <div class="feature-text">
495
- <h3><?php _e( 'Cloud Support', 'backwpup' ); ?></h3>
496
- <p><?php _e( 'BackWPup supports multiple cloud services in parallel. This ensures backups are redundant.', 'backwpup' ); ?></p>
497
- </div>
498
- </div>
499
- </div>
500
- </div>
501
-
502
- <?php if ( ! class_exists( 'BackWPup_Pro', FALSE ) ) : ?>
503
- <div class="backwpup_comp">
504
- <h3><?php _e( 'Features / differences between Free and Pro', 'backwpup' ); ?></h3>
505
- <table width="100%" border="0" cellspacing="0" cellpadding="0">
506
- <tr class="even ub">
507
- <td><?php _e( 'Features', 'backwpup' ); ?></td>
508
- <td class="free"><?php _e( 'FREE', 'backwpup' ); ?></td>
509
- <td class="pro"><?php _e( 'PRO', 'backwpup' ); ?></td>
510
- </tr>
511
- <tr class="odd">
512
- <td><?php _e( 'Complete database backup', 'backwpup' ); ?></td>
513
- <td class="tick"></td>
514
- <td class="tick"></td>
515
- </tr>
516
- <tr class="even">
517
- <td><?php _e( 'Complete file backup', 'backwpup' ); ?></td>
518
- <td class="tick"></td>
519
- <td class="tick"></td>
520
- </tr>
521
- <tr class="odd">
522
- <td><?php _e( 'Database check', 'backwpup' ); ?></td>
523
- <td class="tick"></td>
524
- <td class="tick"></td>
525
- </tr>
526
- <tr class="even">
527
- <td><?php _e( 'Data compression', 'backwpup' ); ?></td>
528
- <td class="tick"></td>
529
- <td class="tick"></td>
530
- </tr>
531
- <tr class="odd">
532
- <td><?php _e( 'WordPress XML export', 'backwpup' ); ?></td>
533
- <td class="tick"></td>
534
- <td class="tick"></td>
535
- </tr>
536
- <tr class="even">
537
- <td><?php _e( 'List of installed plugins', 'backwpup' ); ?></td>
538
- <td class="tick"></td>
539
- <td class="tick"></td>
540
- </tr>
541
- <tr class="odd">
542
- <td><?php _e( 'Backup archives management', 'backwpup' ); ?></td>
543
- <td class="tick"></td>
544
- <td class="tick"></td>
545
- </tr>
546
- <tr class="even">
547
- <td><?php _e( 'Log file management', 'backwpup' ); ?></td>
548
- <td class="tick"></td>
549
- <td class="tick"></td>
550
- </tr>
551
- <tr class="odd">
552
- <td><?php _e( 'Start jobs per WP-Cron, URL, system, backend or WP-CLI', 'backwpup' ); ?></td>
553
- <td class="tick"></td>
554
- <td class="tick"></td>
555
- </tr>
556
- <tr class="even">
557
- <td><?php _e( 'Log report via email', 'backwpup' ); ?></td>
558
- <td class="tick"></td>
559
- <td class="tick"></td>
560
- </tr>
561
- <tr class="odd">
562
- <td><?php _e( 'Backup to Microsoft Azure', 'backwpup' ); ?></td>
563
- <td class="tick"></td>
564
- <td class="tick"></td>
565
- </tr>
566
- <tr class="even">
567
- <td><?php _e( 'Backup as email', 'backwpup' ); ?></td>
568
- <td class="tick"></td>
569
- <td class="tick"></td>
570
- </tr>
571
- <tr class="odd">
572
- <td><?php _e( 'Backup to S3 services <small>(Amazon, Google Storage, Hosteurope and more)</small>', 'backwpup' ); ?></td>
573
- <td class="tick"></td>
574
- <td class="tick"></td>
575
- </tr>
576
- <tr class="even">
577
- <td><?php _e( 'Backup to Dropbox', 'backwpup' ); ?></td>
578
- <td class="tick"></td>
579
- <td class="tick"></td>
580
- </tr>
581
- <tr class="odd">
582
- <td><?php _e( 'Backup to Rackspace Cloud Files', 'backwpup' ); ?></td>
583
- <td class="tick"></td>
584
- <td class="tick"></td>
585
- </tr>
586
- <tr class="even">
587
- <td><?php _e( 'Backup to FTP server', 'backwpup' ); ?></td>
588
- <td class="tick"></td>
589
- <td class="tick"></td>
590
- </tr>
591
- <tr class="odd">
592
- <td><?php _e( 'Backup to your web space', 'backwpup' ); ?></td>
593
- <td class="tick"></td>
594
- <td class="tick"></td>
595
- </tr>
596
- <tr class="even">
597
- <td><?php _e( 'Backup to SugarSync', 'backwpup' ); ?></td>
598
- <td class="tick"></td>
599
- <td class="tick"></td>
600
- </tr>
601
- <tr class="odd">
602
- <td><?php _e( 'Backup to Google Drive', 'backwpup' ); ?></td>
603
- <td class="error"></td>
604
- <td class="tick"></td>
605
- </tr>
606
- <tr class="even">
607
- <td><?php _e( 'Backup to Amazon Glacier', 'backwpup' ); ?></td>
608
- <td class="error"></td>
609
- <td class="tick"></td>
610
- </tr>
611
- <tr class="odd">
612
- <td><?php _e( 'Custom API keys for DropBox and SugarSync', 'backwpup' ); ?></td>
613
- <td class="error"></td>
614
- <td class="tick"></td>
615
- </tr>
616
- <tr class="even">
617
- <td><?php _e( 'XML database backup as PHPMyAdmin schema', 'backwpup' ); ?></td>
618
- <td class="error"></td>
619
- <td class="tick"></td>
620
- </tr>
621
- <tr class="odd">
622
- <td><?php _e( 'Database backup as mysqldump per command line', 'backwpup' ); ?></td>
623
- <td class="error"></td>
624
- <td class="tick"></td>
625
- </tr>
626
- <tr class="even">
627
- <td><?php _e( 'Database backup for additional MySQL databases', 'backwpup' ); ?></td>
628
- <td class="error"></td>
629
- <td class="tick"></td>
630
- </tr>
631
- <tr class="odd">
632
- <td><?php _e( 'Import and export job settings as XML', 'backwpup' ); ?></td>
633
- <td class="error"></td>
634
- <td class="tick"></td>
635
- </tr>
636
- <tr class="even">
637
- <td><?php _e( 'Wizard for system tests', 'backwpup' ); ?></td>
638
- <td class="error"></td>
639
- <td class="tick"></td>
640
- </tr>
641
- <tr class="odd">
642
- <td><?php _e( 'Wizard for scheduled backup jobs', 'backwpup' ); ?></td>
643
- <td class="error"></td>
644
- <td class="tick"></td>
645
- </tr>
646
- <tr class="even">
647
- <td><?php _e( 'Wizard to import settings and backup jobs', 'backwpup' ); ?></td>
648
- <td class="error"></td>
649
- <td class="tick"></td>
650
- </tr>
651
- <tr class="odd">
652
- <td><?php _e( 'Differential backup of changed directories to Dropbox', 'backwpup' ); ?></td>
653
- <td class="error"></td>
654
- <td class="tick"></td>
655
- </tr>
656
- <tr class="even">
657
- <td><?php _e( 'Differential backup of changed directories to Rackspace Cloud Files', 'backwpup' ); ?></td>
658
- <td class="error"></td>
659
- <td class="tick"></td>
660
- </tr>
661
- <tr class="odd">
662
- <td><?php _e( 'Differential backup of changed directories to S3', 'backwpup' ); ?></td>
663
- <td class="error"></td>
664
- <td class="tick"></td>
665
- </tr>
666
- <tr class="even">
667
- <td><?php _e( 'Differential backup of changed directories to MS Azure', 'backwpup' ); ?></td>
668
- <td class="error"></td>
669
- <td class="tick"></td>
670
- </tr>
671
- <tr class="odd">
672
- <td><?php _e( '<strong>Premium support</strong>', 'backwpup' ); ?></td>
673
- <td class="error"></td>
674
- <td class="tick"></td>
675
- </tr>
676
- <tr class="even">
677
- <td><?php _e( '<strong>Dynamically loaded documentation</strong>', 'backwpup' ); ?></td>
678
- <td class="error" style="border-bottom:none;"></td>
679
- <td class="tick" style="border-bottom:none;"></td>
680
- </tr>
681
- <tr class="odd">
682
- <td><?php _e( '<strong>Automatic update from MarketPress</strong>', 'backwpup' ); ?></td>
683
- <td class="error" style="border-bottom:none;"></td>
684
- <td class="tick" style="border-bottom:none;"></td>
685
- </tr>
686
- <tr class="even ubdown">
687
- <td></td>
688
- <td></td>
689
- <td class="pro buylink"><a href="<?php _e( 'http://marketpress.com/product/backwpup-pro/', 'backwpup' ); ?>"><?php _e( 'GET PRO', 'backwpup' ); ?></a></td>
690
- </tr>
691
- </table>
692
- </div>
693
- <?php
694
- endif;
695
- ?>
696
- </div>
697
- </div>
698
- <?php
699
- }
700
-
701
- /**
702
- * Alternate between 'left' and 'right' CSS class.
703
- *
704
- * @since 2013.02.19
705
- * @return void
706
- */
707
- protected static function feature_class() {
708
-
709
- static $class = 'feature-box-left';
710
-
711
- print $class;
712
-
713
- $class = 'feature-box-left' === $class ? 'feature-box-right' : 'feature-box-left';
714
- }
715
- }
1
+ <?php
2
+ /**
3
+ * Render plugin about Page.
4
+ *
5
+ */
6
+ class BackWPup_Page_About {
7
+
8
+ /**
9
+ * Enqueue style.
10
+ *
11
+ * @return void
12
+ */
13
+ public static function admin_print_styles() {
14
+
15
+ ?>
16
+ <style type="text/css" media="screen">
17
+ .inpsyde {
18
+ width:79px;
19
+ height:119px;
20
+ background: url( '<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/inpsyde.png' ) no-repeat;
21
+ position: absolute;
22
+ top:0;
23
+ right: 100px;
24
+ z-index: 1;
25
+ }
26
+ .inpsyde a, .inpsyde a:link{
27
+ float:left;
28
+ font-size:14px;
29
+ color:#fff;
30
+ text-decoration:none;
31
+ padding:65px 15px 15px 15px;
32
+ text-align:center;
33
+ }
34
+ @media screen and (max-width: 782px) {
35
+ .inpsyde {
36
+ right:10px;
37
+ }
38
+ }
39
+ @media screen and (max-width: 600px) {
40
+ .inpsyde {
41
+ display: none;
42
+ }
43
+ }
44
+ #backwpup-page {
45
+ background: #fff;
46
+ margin-top: 22px;
47
+ padding: 0 20px;
48
+ }
49
+ #backwpup-page .inpsyde + h2 {
50
+ visibility: hidden;
51
+ }
52
+ .welcome {
53
+ /* max-width: 960px; */
54
+ }
55
+ .welcome .welcome_inner {
56
+ margin:0 auto;
57
+ max-width: 960px;
58
+ }
59
+ .backwpup-welcome {
60
+ /*
61
+ margin: 0 auto;
62
+ max-width: 960px;
63
+ */
64
+ }
65
+ .welcome .welcome_inner h3{
66
+ font-size:42px;
67
+ }
68
+ .welcome .welcome_inner .welcometxt {
69
+ /* width: 100%; */
70
+ margin-bottom: 40px;
71
+ overflow: hidden;
72
+ border-bottom: 1px #ccc dotted;
73
+ text-align: center;
74
+ padding-bottom: 25px;
75
+ position: relative;
76
+ }
77
+ .welcome .welcome_inner .welcometxt p{
78
+ line-height:20px;
79
+ font-size:18px;
80
+ }
81
+ .welcome .welcome_inner .feature-box{
82
+ clear: both;
83
+ margin-bottom: 40px;
84
+ overflow: hidden;
85
+ }
86
+ .welcome .welcome_inner .feature-box .feature-image{
87
+ float: left;
88
+ width:18%;
89
+ height:auto;
90
+ }
91
+ .welcome .welcome_inner .feature-box .feature-image img{
92
+ width:100%;
93
+ height:auto;
94
+ max-width:350px;
95
+ }
96
+ .welcome .welcome_inner .feature-box .feature-text{
97
+ float: left;
98
+ width:72%;
99
+ padding: 0 0 20px 20px;
100
+ }
101
+ .welcome .welcome_inner .feature-box-right .feature-text {
102
+ padding: 0 20px 20px 0;
103
+ }
104
+ .welcome .welcome_inner .feature-box .feature-text h3{
105
+ color:rgb(0, 155, 204);
106
+ font-weight:normal;
107
+ font-size:24px;
108
+ margin:0 0 10px 0;
109
+ text-align:left;
110
+ }
111
+ .welcome .welcome_inner .feature-box .left {
112
+ float:left;
113
+ }
114
+ .welcome .welcome_inner .feature-box .right {
115
+ float:right;
116
+ }
117
+ .welcome .welcome_inner .featuretitle h3 {
118
+ font-size:28px;
119
+ font-weight:normal;
120
+ text-align:left;
121
+ margin-bottom:25px;
122
+ }
123
+ .welcome .button-primary-bwp {
124
+ float:left;
125
+ padding:15px;
126
+ font-size:18px;
127
+ text-decoration:none;
128
+ background-color:#38b0eb;
129
+ color:#fff;
130
+ border:none;
131
+ cursor:pointer;
132
+ margin: 35px 0;
133
+ }
134
+ .welcome .button-primary-bwp:hover {
135
+ background-color:#064565;
136
+ cursor:pointer;
137
+ }
138
+ @media only screen and (max-width: 1100px), only screen and (max-device-width: 1100px) {
139
+ .welcome .welcome_inner h3{
140
+ font-size:32px;
141
+ }
142
+ .welcome .welcome_inner .featuretitle h3 {
143
+ font-size:22px;
144
+ font-weight:normal;
145
+ text-align:left;
146
+ margin-bottom:25px;
147
+ }
148
+ .welcome .welcome_inner .welcometxt p{
149
+ line-height:20px;
150
+ font-size:14px;
151
+ }
152
+ .welcome .welcome_inner .feature-box .feature-text h3{
153
+ font-weight:normal;
154
+ font-size:20px;
155
+ margin:0 0 10px 0;
156
+ text-align:left;
157
+ }
158
+ .welcome .welcome_inner .feature-box .feature-text{
159
+ width:72%;
160
+ font-size:14px;
161
+ line-height:20px;
162
+ }
163
+ .welcome .button-primary-bwp {
164
+ float:left;
165
+ padding:10px;
166
+ font-size:16px;
167
+ text-decoration:none;
168
+ background-color:#38b0eb;
169
+ color:#fff;
170
+ border:none;
171
+ cursor:pointer;
172
+ margin: 35px 0;
173
+ }
174
+ }
175
+ @media only screen and (max-width: 780px), only screen and (max-device-width: 780px) {
176
+ .welcome .welcome_inner h3{
177
+ font-size:22px;
178
+ }
179
+ .welcome .welcome_inner .featuretitle h3 {
180
+ font-size:22px;
181
+ font-weight:normal;
182
+ text-align:left;
183
+ }
184
+ .welcome .welcome_inner .welcometxt p{
185
+ line-height:20px;
186
+ font-size:14px;
187
+ }
188
+ .welcome .welcome_inner .feature-box .feature-text h3{
189
+ font-weight:normal;
190
+ font-size:16px;
191
+ margin:0 0 10px 0;
192
+ }
193
+ .welcome .welcome_inner .feature-box .feature-text{
194
+ width:72%;
195
+ font-size:12px;
196
+ line-height:16px;
197
+ text-align:left;
198
+ }
199
+ .welcome .button-primary-bwp {
200
+ float:left;
201
+ padding:10px;
202
+ font-size:16px;
203
+ text-decoration:none;
204
+ background-color:#38b0eb;
205
+ color:#fff;
206
+ border:none;
207
+ cursor:pointer;
208
+ margin: 35px 0;
209
+ }
210
+ }
211
+
212
+ .backwpup_comp {
213
+ margin: 20px auto;
214
+ width: 100%;
215
+ font-family: "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
216
+ font-size: 16px;
217
+ }
218
+
219
+ .backwpup_comp table {
220
+ border: none;
221
+ }
222
+
223
+ .backwpup_comp table tbody tr.even td {
224
+ border: none;
225
+ background: none;
226
+ padding: 15px;
227
+ margin: 0;
228
+ }
229
+
230
+ .backwpup_comp table tbody tr.odd td {
231
+ border: none;
232
+ background: none;
233
+ padding: 15px;
234
+ margin: 0;
235
+ }
236
+
237
+ .backwpup_comp h3 {
238
+ font-family: "Arial", sans-serif;
239
+ font-size: 42px;
240
+ text-align: center;
241
+ font-weight: normal;
242
+ color: #333;
243
+ line-height: 44px;
244
+ margin: 20px 0;
245
+ }
246
+
247
+ .backwpup_comp table tbody tr.ub {
248
+ font-family: 'MisoRegular', "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
249
+ font-size: 26px;
250
+ }
251
+
252
+ .backwpup_comp table tbody tr.ubdown {
253
+ font-family: 'MisoRegular', "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, "Lucida Grande", sans-serif;
254
+ font-size: 26px;
255
+ background: none !important;
256
+ }
257
+
258
+ .backwpup_comp table tbody tr.even {
259
+ background-image: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/even.png);
260
+ }
261
+
262
+ .backwpup_comp table tbody tr.odd {
263
+ background-image: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/odd.png);
264
+ }
265
+
266
+ .backwpup_comp table tbody tr.ub td.pro {
267
+ height: 50px;
268
+ text-align: center;
269
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hgtopgreen.png) no-repeat bottom center;
270
+ color: #fff;
271
+ border-left: 1px solid #112a32;
272
+ }
273
+
274
+ .backwpup_comp table tbody tr.ub td.free {
275
+ height: 50px;
276
+ text-align: center;
277
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hgtopgreen.png) no-repeat bottom center;
278
+ color: #fff;
279
+ }
280
+
281
+ .backwpup_comp table tbody tr.ubdown td.pro {
282
+ height: 50px;
283
+ text-align: center;
284
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hgbtgreen.png) no-repeat top center;
285
+ color: #fff;
286
+ border-left: 1px solid #1c3e49;
287
+ }
288
+
289
+ .backwpup_comp table tbody tr.ubdown td.pro a {
290
+ color: #fff;
291
+ text-decoration: none;
292
+ cursor: auto;
293
+ font-weight: 300;
294
+ line-height: 1.4em;
295
+ font-size: 18px;
296
+ }
297
+
298
+ .backwpup_comp table tbody tr.ubdown td.free {
299
+ height: 50px;
300
+ text-align: center;
301
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hgbtred.png) no-repeat top center;
302
+ color: #fff;
303
+ }
304
+
305
+ .backwpup_comp table tbody tr.ubdown td.free a {
306
+ color: #fff;
307
+ }
308
+
309
+ .backwpup_comp table tbody tr.even td.tick {
310
+ width: 100px;
311
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/tickeven.png) no-repeat center;
312
+ border-bottom: 1px solid #799e14;
313
+ border-top: 1px solid #a2d123;
314
+ border-left: 1px solid #799e14;
315
+ }
316
+
317
+ .backwpup_comp table tbody tr.odd td.tick {
318
+ width: 100px;
319
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/tickodd.png) no-repeat center;
320
+ border-left: 1px solid #799e14;
321
+ }
322
+
323
+ .backwpup_comp table tbody tr.even td.error {
324
+ width: 100px;
325
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/erroreven.png) no-repeat center;
326
+ border-bottom: 1px solid #b13020;
327
+ border-top: 1px solid #e84936;
328
+ }
329
+
330
+ .backwpup_comp table tbody tr.odd td.error {
331
+ width: 100px;
332
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/errorodd.png) no-repeat center;
333
+ }
334
+
335
+ .backwpup_comp table tbody tr.even:hover {
336
+ background-image: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hover.png);
337
+ }
338
+
339
+ .backwpup_comp table tbody tr.odd:hover {
340
+ background-image: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hover.png);
341
+ }
342
+
343
+ .backwpup_comp table tbody tr.even:hover td.tick {
344
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/tickhover.png) center;
345
+ }
346
+
347
+ .backwpup_comp table tbody tr.odd:hover td.tick {
348
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/tickhover.png) center;
349
+ }
350
+
351
+ .backwpup_comp table tbody tr.even:hover td.error {
352
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/errorhover.png) center;
353
+ }
354
+
355
+ .backwpup_comp table tbody tr.odd:hover td.error {
356
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/errorhover.png) center;
357
+ }
358
+
359
+ .backwpup_comp table tbody tr.ubdown:hover td.pro:hover {
360
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hgbtgreenhover.png) no-repeat top center;
361
+ }
362
+
363
+ .backwpup_comp table tbody tr.ubdown:hover td.free:hover {
364
+ background: url(<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/hgbtredhover.png) no-repeat top center;
365
+ }
366
+ </style>
367
+ <?php
368
+ }
369
+
370
+ /**
371
+ * Enqueue script.
372
+ *
373
+ * @return void
374
+ */
375
+ public static function admin_print_scripts() {
376
+
377
+ wp_enqueue_script( 'backwpupgeneral' );
378
+
379
+ }
380
+
381
+
382
+ /**
383
+ * Print the markup.
384
+ *
385
+ * @return void
386
+ */
387
+ public static function page() {
388
+
389
+ ?>
390
+ <div class="wrap" id="backwpup-page">
391
+ <div class="inpsyde">
392
+ <a href="http://inpsyde.com/" title="Inpsyde GmbH">Inpsyde</a>
393
+ </div>
394
+ <h2><span id="backwpup-page-icon">&nbsp;</span><?php echo sprintf( __( '%s Welcome', 'backwpup' ), BackWPup::get_plugin_data( 'name') ); ?></h2>
395
+ <?php BackWPup_Admin::display_messages(); ?>
396
+ <div class="welcome">
397
+ <div class="welcome_inner">
398
+ <div class="top">
399
+ <?php if ( get_site_transient( 'backwpup_upgrade_from_version_two') ) { ?>
400
+ <div id="update-notice" class="backwpup-welcome updated">
401
+ <h3><?php _e( 'Heads up! You have updated from version 2.x', 'backwpup' ); ?></h3>
402
+ <p><?php echo str_replace( '\"','"', sprintf( __( 'Please <a href="%s">check your settings</a> after updating from version 2.x:', 'backwpup' ), network_admin_url( 'admin.php').'?page=backwpupjobs') ); ?></a></p>
403
+ <ul><li><?php _e('Dropbox authentication must be re-entered','backwpup'); ?></li>
404
+ <li><?php _e('SugarSync authentication must be re-entered','backwpup'); ?></li>
405
+ <li><?php _e('S3 Settings','backwpup'); ?></li>
406
+ <li><?php _e('Google Storage is now a part of S3 service settings','backwpup'); ?></li>
407
+ <li><?php _e('All your passwords','backwpup'); ?></li>
408
+ </ul>
409
+ </div>
410
+ <?php } ?>
411
+ </div>
412
+ <?php if ( class_exists( 'BackWPup_Pro', FALSE ) ) { ?>
413
+ <div class="welcometxt">
414
+ <div class="backwpup-welcome">
415
+ <img class="backwpup-banner-img" src="<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/backwpupbanner-pro.png" />
416
+ <h3><?php _e( 'Welcome to BackWPup Pro', 'backwpup' ); ?></h3>
417
+ <p><?php _e( 'BackWPup’s job wizards make planning and scheduling your backup jobs a breeze.', 'backwpup' ); echo ' ';
418
+ _e( 'Use your backup archives to save your entire WordPress installation including <code>/wp-content/</code>. Push them to an external storage service if you don’t want to save the backups on the same server. With a single backup archive you are able to restore an installation. Use a tool like phpMyAdmin or a plugin like <a href="http://wordpress.org/plugins/adminer/" target="_blank">Adminer</a> to restore your database backup files.', 'backwpup' ); ?></p>
419
+ <p><?php echo str_replace( '\"','"', sprintf( __( 'Ready to <a href="%1$s">set up a backup job</a>? You can <a href="%2$s">use the wizards</a> or plan your backup in expert mode.', 'backwpup' ), network_admin_url( 'admin.php').'?page=backwpupeditjob' , network_admin_url( 'admin.php').'?page=backwpupwizard' ) ); ?></p>
420
+ </div>
421
+ </div>
422
+ <?php } else {?>
423
+ <div class="welcometxt">
424
+ <div class="backwpup-welcome">
425
+ <img class="backwpup-banner-img" src="<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/backwpupbanner-free.png" />
426
+ <h3><?php _e( 'Welcome to BackWPup', 'backwpup' ); ?></h3>
427
+ <p><?php
428
+ _e( 'Use your backup archives to save your entire WordPress installation including <code>/wp-content/</code>. Push them to an external storage service if you don’t want to save the backups on the same server. With a single backup archive you are able to restore an installation. Use a tool like phpMyAdmin or a plugin like <a href="http://wordpress.org/plugins/adminer/" target="_blank">Adminer</a> to restore your database backup files.', 'backwpup' ); ?></p>
429
+ <p><?php _e( 'Ready to set up a backup job? Use one of the wizards to plan what you want to save.', 'backwpup' ); ?></p>
430
+ </div>
431
+ </div>
432
+ <?php } ?>
433
+ <?php
434
+ if ( class_exists( 'BackWPup_Pro', FALSE ) ) :
435
+ $autoupdate = BackWPup_Pro_MarketPress_Autoupdate::get_instance( BackWPup::get_plugin_data( 'Slug' ) , BackWPup::get_plugin_data( 'MainFile' ) );
436
+ if ( $autoupdate->license_check() == 'false' ) :
437
+ $plugins = get_plugins();
438
+ $localplugin = FALSE;
439
+ foreach ( $plugins as $plugin ) {
440
+ if ( BackWPup::get_plugin_data( 'Name' ) == $plugin[ 'Name' ] )
441
+ $localplugin = TRUE;
442
+ }
443
+ ?>
444
+ <div class="welcometxt">
445
+ <div class="backwpup-welcome">
446
+ <h3><?php _e( 'Please activate your license', 'backwpup' ); ?></h3>
447
+ <p><a href="<?php echo $localplugin ? admin_url( 'plugins.php' ) : network_admin_url( 'plugins.php' ); ?>"><?php _e( 'Please go to your plugin page and active the license to have the autoupdates enabled.', 'backwpup' ); ?></a></p>
448
+ </div>
449
+ </div>
450
+ <?php endif; ?>
451
+ <?php endif; ?>
452
+ <div class="features">
453
+
454
+ <div class="feature-box <?php self::feature_class(); ?>">
455
+ <div class="feature-image">
456
+ <img title="<?php _e( 'Save your database', 'backwpup' ); ?>" src="<?php echo BackWPup::get_plugin_data( 'URL' ); ?>/assets/images/imagesave.png" />
457
+ </div>
458
+ <div class="feature-text">
459
+ <h3><?php _e( 'Save your database regularly', 'backwpup' ); ?></h3>
460
+ <p><?php echo str_replace( '\"','"', sprintf( __( 'With BackWPup you can schedule the database backup to run automatically. With a single backup file you can restore your database. You should <a href="%s">set up a backup job</a>, so you will never forget it. There is also an option to repair and optimize the database after each backup.', 'backwpup' ), network_admin_url( 'admin.php').'?page=backwpupeditjob' ) ); ?></p>
461
+ </div>
462
+ </div>
463
+ <div class="feature-box <?php self::feature_class(); ?>">
464
+ <div class="feature-text">
465
+ <h3><?php _e('WordPress XML Export', 'backwpup' ); ?></h3>
466
+ <p><?php _e('You can choose the built-in WordPress export format in addition or exclusive to save your data. This works in automated backups too of course. The advantage is: you can import these files into a blog with the regular WordPress importer.', 'backwpup'); ?></p>
467
+ </div>
468
+ <div class="feature-image">
469
+ <img title="<?php _e( 'WordPress XML Export', 'backwpup' ); ?>" src="<?php echo BackWPup::get_plugin_data( 'URL' ); ?>/assets/images/imagexml.png" />
470
+ </div>
471
+ </div>
472
+ <div class="feature-box <?php self::feature_class(); ?>">
473
+ <div class="feature-image">
474
+ <img title="<?php _e( 'Save all data from the webserver', 'backwpup' ); ?>" src="<?php echo BackWPup::get_plugin_data( 'URL' ); ?>/assets/images/imagedata.png" />
475
+ </div>
476
+ <div class="feature-text">
477
+ <h3><?php _e('Save all files', 'backwpup'); ?></h3>
478
+ <p><?php echo str_replace( '\"','"', sprintf( __('You can backup all your attachments, also all system files, plugins and themes in a single file. You can <a href="%s">create a job</a> to update a backup copy of your file system only when files are changed.', 'backwpup'), network_admin_url( 'admin.php' ) . '?page=backwpupeditjob' ) ); ?></p>
479
+ </div>
480
+ </div>
481
+ <div class="feature-box <?php self::feature_class(); ?>">
482
+ <div class="feature-text">
483
+ <h3><?php _e( 'Security!', 'backwpup' ); ?></h3>
484
+ <p><?php _e('By default everything is encrypted: connections to external services, local files and access to directories.', 'backwpup'); ?></p>
485
+ </div>
486
+ <div class="feature-image">
487
+ <img title="<?php _e( 'Security!', 'backwpup' ); ?>" src="<?php echo BackWPup::get_plugin_data( 'URL' ); ?>/assets/images/imagesec.png" />
488
+ </div>
489
+ </div>
490
+ <div class="feature-box <?php self::feature_class(); ?>">
491
+ <div class="feature-image">
492
+ <img title="<?php _e( 'Cloud Support', 'backwpup' ); ?>" src="<?php echo BackWPup::get_plugin_data( 'URL' ); ?>/assets/images/imagecloud.png" />
493
+ </div>
494
+ <div class="feature-text">
495
+ <h3><?php _e( 'Cloud Support', 'backwpup' ); ?></h3>
496
+ <p><?php _e( 'BackWPup supports multiple cloud services in parallel. This ensures backups are redundant.', 'backwpup' ); ?></p>
497
+ </div>
498
+ </div>
499
+ </div>
500
+ </div>
501
+
502
+ <?php if ( ! class_exists( 'BackWPup_Pro', FALSE ) ) : ?>
503
+ <div class="backwpup_comp">
504
+ <h3><?php _e( 'Features / differences between Free and Pro', 'backwpup' ); ?></h3>
505
+ <table width="100%" border="0" cellspacing="0" cellpadding="0">
506
+ <tr class="even ub">
507
+ <td><?php _e( 'Features', 'backwpup' ); ?></td>
508
+ <td class="free"><?php _e( 'FREE', 'backwpup' ); ?></td>
509
+ <td class="pro"><?php _e( 'PRO', 'backwpup' ); ?></td>
510
+ </tr>
511
+ <tr class="odd">
512
+ <td><?php _e( 'Complete database backup', 'backwpup' ); ?></td>
513
+ <td class="tick"></td>
514
+ <td class="tick"></td>
515
+ </tr>
516
+ <tr class="even">
517
+ <td><?php _e( 'Complete file backup', 'backwpup' ); ?></td>
518
+ <td class="tick"></td>
519
+ <td class="tick"></td>
520
+ </tr>
521
+ <tr class="odd">
522
+ <td><?php _e( 'Database check', 'backwpup' ); ?></td>
523
+ <td class="tick"></td>
524
+ <td class="tick"></td>
525
+ </tr>
526
+ <tr class="even">
527
+ <td><?php _e( 'Data compression', 'backwpup' ); ?></td>
528
+ <td class="tick"></td>
529
+ <td class="tick"></td>
530
+ </tr>
531
+ <tr class="odd">
532
+ <td><?php _e( 'WordPress XML export', 'backwpup' ); ?></td>
533
+ <td class="tick"></td>
534
+ <td class="tick"></td>
535
+ </tr>
536
+ <tr class="even">
537
+ <td><?php _e( 'List of installed plugins', 'backwpup' ); ?></td>
538
+ <td class="tick"></td>
539
+ <td class="tick"></td>
540
+ </tr>
541
+ <tr class="odd">
542
+ <td><?php _e( 'Backup archives management', 'backwpup' ); ?></td>
543
+ <td class="tick"></td>
544
+ <td class="tick"></td>
545
+ </tr>
546
+ <tr class="even">
547
+ <td><?php _e( 'Log file management', 'backwpup' ); ?></td>
548
+ <td class="tick"></td>
549
+ <td class="tick"></td>
550
+ </tr>
551
+ <tr class="odd">
552
+ <td><?php _e( 'Start jobs per WP-Cron, URL, system, backend or WP-CLI', 'backwpup' ); ?></td>
553
+ <td class="tick"></td>
554
+ <td class="tick"></td>
555
+ </tr>
556
+ <tr class="even">
557
+ <td><?php _e( 'Log report via email', 'backwpup' ); ?></td>
558
+ <td class="tick"></td>
559
+ <td class="tick"></td>
560
+ </tr>
561
+ <tr class="odd">
562
+ <td><?php _e( 'Backup to Microsoft Azure', 'backwpup' ); ?></td>
563
+ <td class="tick"></td>
564
+ <td class="tick"></td>
565
+ </tr>
566
+ <tr class="even">
567
+ <td><?php _e( 'Backup as email', 'backwpup' ); ?></td>
568
+ <td class="tick"></td>
569
+ <td class="tick"></td>
570
+ </tr>
571
+ <tr class="odd">
572
+ <td><?php _e( 'Backup to S3 services <small>(Amazon, Google Storage, Hosteurope and more)</small>', 'backwpup' ); ?></td>
573
+ <td class="tick"></td>
574
+ <td class="tick"></td>
575
+ </tr>
576
+ <tr class="even">
577
+ <td><?php _e( 'Backup to Dropbox', 'backwpup' ); ?></td>
578
+ <td class="tick"></td>
579
+ <td class="tick"></td>
580
+ </tr>
581
+ <tr class="odd">
582
+ <td><?php _e( 'Backup to Rackspace Cloud Files', 'backwpup' ); ?></td>
583
+ <td class="tick"></td>
584
+ <td class="tick"></td>
585
+ </tr>
586
+ <tr class="even">
587
+ <td><?php _e( 'Backup to FTP server', 'backwpup' ); ?></td>
588
+ <td class="tick"></td>
589
+ <td class="tick"></td>
590
+ </tr>
591
+ <tr class="odd">
592
+ <td><?php _e( 'Backup to your web space', 'backwpup' ); ?></td>
593
+ <td class="tick"></td>
594
+ <td class="tick"></td>
595
+ </tr>
596
+ <tr class="even">
597
+ <td><?php _e( 'Backup to SugarSync', 'backwpup' ); ?></td>
598
+ <td class="tick"></td>
599
+ <td class="tick"></td>
600
+ </tr>
601
+ <tr class="odd">
602
+ <td><?php _e( 'Backup to Google Drive', 'backwpup' ); ?></td>
603
+ <td class="error"></td>
604
+ <td class="tick"></td>
605
+ </tr>
606
+ <tr class="even">
607
+ <td><?php _e( 'Backup to Amazon Glacier', 'backwpup' ); ?></td>
608
+ <td class="error"></td>
609
+ <td class="tick"></td>
610
+ </tr>
611
+ <tr class="odd">
612
+ <td><?php _e( 'Custom API keys for DropBox and SugarSync', 'backwpup' ); ?></td>
613
+ <td class="error"></td>
614
+ <td class="tick"></td>
615
+ </tr>
616
+ <tr class="even">
617
+ <td><?php _e( 'XML database backup as PHPMyAdmin schema', 'backwpup' ); ?></td>
618
+ <td class="error"></td>
619
+ <td class="tick"></td>
620
+ </tr>
621
+ <tr class="odd">
622
+ <td><?php _e( 'Database backup as mysqldump per command line', 'backwpup' ); ?></td>
623
+ <td class="error"></td>
624
+ <td class="tick"></td>
625
+ </tr>
626
+ <tr class="even">
627
+ <td><?php _e( 'Database backup for additional MySQL databases', 'backwpup' ); ?></td>
628
+ <td class="error"></td>
629
+ <td class="tick"></td>
630
+ </tr>
631
+ <tr class="odd">
632
+ <td><?php _e( 'Import and export job settings as XML', 'backwpup' ); ?></td>
633
+ <td class="error"></td>
634
+ <td class="tick"></td>
635
+ </tr>
636
+ <tr class="even">
637
+ <td><?php _e( 'Wizard for system tests', 'backwpup' ); ?></td>
638
+ <td class="error"></td>
639
+ <td class="tick"></td>
640
+ </tr>
641
+ <tr class="odd">
642
+ <td><?php _e( 'Wizard for scheduled backup jobs', 'backwpup' ); ?></td>
643
+ <td class="error"></td>
644
+ <td class="tick"></td>
645
+ </tr>
646
+ <tr class="even">
647
+ <td><?php _e( 'Wizard to import settings and backup jobs', 'backwpup' ); ?></td>
648
+ <td class="error"></td>
649
+ <td class="tick"></td>
650
+ </tr>
651
+ <tr class="odd">
652
+ <td><?php _e( 'Differential backup of changed directories to Dropbox', 'backwpup' ); ?></td>
653
+ <td class="error"></td>
654
+ <td class="tick"></td>
655
+ </tr>
656
+ <tr class="even">
657
+ <td><?php _e( 'Differential backup of changed directories to Rackspace Cloud Files', 'backwpup' ); ?></td>
658
+ <td class="error"></td>
659
+ <td class="tick"></td>
660
+ </tr>
661
+ <tr class="odd">
662
+ <td><?php _e( 'Differential backup of changed directories to S3', 'backwpup' ); ?></td>
663
+ <td class="error"></td>
664
+ <td class="tick"></td>
665
+ </tr>
666
+ <tr class="even">
667
+ <td><?php _e( 'Differential backup of changed directories to MS Azure', 'backwpup' ); ?></td>
668
+ <td class="error"></td>
669
+ <td class="tick"></td>
670
+ </tr>
671
+ <tr class="odd">
672
+ <td><?php _e( '<strong>Premium support</strong>', 'backwpup' ); ?></td>
673
+ <td class="error"></td>
674
+ <td class="tick"></td>
675
+ </tr>
676
+ <tr class="even">
677
+ <td><?php _e( '<strong>Dynamically loaded documentation</strong>', 'backwpup' ); ?></td>
678
+ <td class="error" style="border-bottom:none;"></td>
679
+ <td class="tick" style="border-bottom:none;"></td>
680
+ </tr>
681
+ <tr class="odd">
682
+ <td><?php _e( '<strong>Automatic update from MarketPress</strong>', 'backwpup' ); ?></td>
683
+ <td class="error" style="border-bottom:none;"></td>
684
+ <td class="tick" style="border-bottom:none;"></td>
685
+ </tr>
686
+ <tr class="even ubdown">
687
+ <td></td>
688
+ <td></td>
689
+ <td class="pro buylink"><a href="<?php _e( 'http://marketpress.com/product/backwpup-pro/', 'backwpup' ); ?>"><?php _e( 'GET PRO', 'backwpup' ); ?></a></td>
690
+ </tr>
691
+ </table>
692
+ </div>
693
+ <?php
694
+ endif;
695
+ ?>
696
+ </div>
697
+ </div>
698
+ <?php
699
+ }
700
+
701
+ /**
702
+ * Alternate between 'left' and 'right' CSS class.
703
+ *
704
+ * @since 2013.02.19
705
+ * @return void
706
+ */
707
+ protected static function feature_class() {
708
+
709
+ static $class = 'feature-box-left';
710
+
711
+ print $class;
712
+
713
+ $class = 'feature-box-left' === $class ? 'feature-box-right' : 'feature-box-left';
714
+ }
715
+ }
inc/class-page-editjob.php CHANGED
@@ -77,8 +77,9 @@ class BackWPup_Page_Editjob {
77
  }
78
  }
79
  }
80
- if ( ! $makes_file )
81
  $_POST[ 'destinations' ] = array();
 
82
  BackWPup_Option::update( $jobid, 'type', $_POST[ 'type' ] );
83
 
84
  if ( isset( $_POST[ 'destinations' ] ) && is_array( $_POST[ 'destinations' ] ) ) {
@@ -98,8 +99,9 @@ class BackWPup_Page_Editjob {
98
  BackWPup_Option::update( $jobid, 'destinations', $_POST[ 'destinations' ] );
99
 
100
  $name = esc_html( trim( $_POST[ 'name' ] ) );
101
- if ( empty( $name ) || $_POST[ 'name' ] == __( 'New Job', 'backwpup' ) )
102
  $name = sprintf( __( 'Job with ID %d', 'backwpup' ), $jobid );
 
103
  BackWPup_Option::update( $jobid, 'name', $name );
104
  BackWPup_Option::update( $jobid, 'mailaddresslog', sanitize_email( $_POST[ 'mailaddresslog' ] ) );
105
 
@@ -111,11 +113,11 @@ class BackWPup_Page_Editjob {
111
 
112
  BackWPup_Option::update( $jobid, 'mailerroronly', ( isset( $_POST[ 'mailerroronly' ] ) && $_POST[ 'mailerroronly' ] == 1 ) ? TRUE : FALSE );
113
  if ( class_exists( 'BackWPup_Pro', FALSE ) )
114
- BackWPup_Option::update( $jobid, 'backuptype', $_POST[ 'backuptype' ] );
115
  else
116
  BackWPup_Option::update( $jobid, 'backuptype', 'archive' );
117
- BackWPup_Option::update( $jobid, 'archiveformat', $_POST[ 'archiveformat' ] );
118
- BackWPup_Option::update( $jobid, 'archivename', sanitize_file_name( esc_html( $_POST[ 'archivename' ] ) ) );
119
  break;
120
  case 'cron':
121
  if ( $_POST[ 'activetype' ] == '' || $_POST[ 'activetype' ] == 'wpcron' || $_POST[ 'activetype' ] == 'link' )
@@ -515,8 +517,7 @@ class BackWPup_Page_Editjob {
515
  <?php
516
  $datevars = array( '%d', '%j', '%m', '%n', '%Y', '%y', '%a', '%A', '%B', '%g', '%G', '%h', '%H', '%i', '%s' );
517
  $datevalues = array( date_i18n( 'd' ), date_i18n( 'j' ), date_i18n( 'm' ), date_i18n( 'n' ), date_i18n( 'Y' ), date_i18n( 'y' ), date_i18n( 'a' ), date_i18n( 'A' ), date_i18n( 'B' ), date_i18n( 'g' ), date_i18n( 'G' ), date_i18n( 'h' ), date_i18n( 'H' ), date_i18n( 'i' ), date_i18n( 's' ) );
518
- $archivename = str_replace( $datevars, $datevalues, BackWPup_Option::get( $jobid, 'archivename' ) );
519
- $archivename = sanitize_file_name( $archivename );
520
  echo '<p>Preview: <code><span id="archivefilename">' . $archivename . '</span><span id="archiveformat">' . BackWPup_Option::get( $jobid, 'archiveformat' ) . '</span></code></p>';
521
  ?>
522
  </td>
77
  }
78
  }
79
  }
80
+ if ( ! $makes_file ) {
81
  $_POST[ 'destinations' ] = array();
82
+ }
83
  BackWPup_Option::update( $jobid, 'type', $_POST[ 'type' ] );
84
 
85
  if ( isset( $_POST[ 'destinations' ] ) && is_array( $_POST[ 'destinations' ] ) ) {
99
  BackWPup_Option::update( $jobid, 'destinations', $_POST[ 'destinations' ] );
100
 
101
  $name = esc_html( trim( $_POST[ 'name' ] ) );
102
+ if ( empty( $name ) || $_POST[ 'name' ] == __( 'New Job', 'backwpup' ) ) {
103
  $name = sprintf( __( 'Job with ID %d', 'backwpup' ), $jobid );
104
+ }
105
  BackWPup_Option::update( $jobid, 'name', $name );
106
  BackWPup_Option::update( $jobid, 'mailaddresslog', sanitize_email( $_POST[ 'mailaddresslog' ] ) );
107
 
113
 
114
  BackWPup_Option::update( $jobid, 'mailerroronly', ( isset( $_POST[ 'mailerroronly' ] ) && $_POST[ 'mailerroronly' ] == 1 ) ? TRUE : FALSE );
115
  if ( class_exists( 'BackWPup_Pro', FALSE ) )
116
+ BackWPup_Option::update( $jobid, 'backuptype', esc_html( $_POST[ 'backuptype' ] ) );
117
  else
118
  BackWPup_Option::update( $jobid, 'backuptype', 'archive' );
119
+ BackWPup_Option::update( $jobid, 'archiveformat', esc_html( $_POST[ 'archiveformat' ] ) );
120
+ BackWPup_Option::update( $jobid, 'archivename', BackWPup_Job::sanitize_file_name( $_POST[ 'archivename' ] ) );
121
  break;
122
  case 'cron':
123
  if ( $_POST[ 'activetype' ] == '' || $_POST[ 'activetype' ] == 'wpcron' || $_POST[ 'activetype' ] == 'link' )
517
  <?php
518
  $datevars = array( '%d', '%j', '%m', '%n', '%Y', '%y', '%a', '%A', '%B', '%g', '%G', '%h', '%H', '%i', '%s' );
519
  $datevalues = array( date_i18n( 'd' ), date_i18n( 'j' ), date_i18n( 'm' ), date_i18n( 'n' ), date_i18n( 'Y' ), date_i18n( 'y' ), date_i18n( 'a' ), date_i18n( 'A' ), date_i18n( 'B' ), date_i18n( 'g' ), date_i18n( 'G' ), date_i18n( 'h' ), date_i18n( 'H' ), date_i18n( 'i' ), date_i18n( 's' ) );
520
+ $archivename = str_replace( $datevars, $datevalues, BackWPup_Job::sanitize_file_name( BackWPup_Option::get( $jobid, 'archivename' ) ) );
 
521
  echo '<p>Preview: <code><span id="archivefilename">' . $archivename . '</span><span id="archiveformat">' . BackWPup_Option::get( $jobid, 'archiveformat' ) . '</span></code></p>';
522
  ?>
523
  </td>
inc/class-page-jobs.php CHANGED
@@ -1,716 +1,716 @@
1
- <?php
2
- /**
3
- * Class For BackWPup Jobs page
4
- */
5
- class BackWPup_Page_Jobs extends WP_List_Table {
6
-
7
- private static $listtable = NULL;
8
- public static $logfile = NULL;
9
- private $job_object = NULL;
10
- private $job_types = NULL;
11
- private $destinations = NULL;
12
-
13
-
14
- /**
15
- *
16
- */
17
- function __construct() {
18
- parent::__construct( array(
19
- 'plural' => 'jobs',
20
- 'singular' => 'job',
21
- 'ajax' => TRUE
22
- ) );
23
- }
24
-
25
-
26
- /**
27
- * @return bool|void
28
- */
29
- function ajax_user_can() {
30
-
31
- return current_user_can( 'backwpup' );
32
- }
33
-
34
- /**
35
- *
36
- */
37
- function prepare_items() {
38
-
39
- $this->items = BackWPup_Option::get_job_ids();
40
-
41
- $this->job_object = BackWPup_Job::get_working_data();
42
-
43
- $this->job_types = BackWPup::get_job_types();
44
- $this->destinations = BackWPup::get_registered_destinations();
45
- }
46
-
47
- /**
48
- *
49
- */
50
- function no_items() {
51
-
52
- _e( 'No Jobs.', 'backwpup' );
53
- }
54
-
55
- /**
56
- * @return array
57
- */
58
- function get_bulk_actions() {
59
-
60
- if ( ! $this->has_items() )
61
- return array ();
62
-
63
- $actions = array();
64
- $actions[ 'delete' ] = __( 'Delete', 'backwpup' );
65
-
66
- return apply_filters( 'backwpup_page_jobs_get_bulk_actions', $actions );
67
- }
68
-
69
- /**
70
- * @return array
71
- */
72
- function get_columns() {
73
-
74
- $jobs_columns = array();
75
- $jobs_columns[ 'cb' ] = '<input type="checkbox" />';
76
- $jobs_columns[ 'jobname' ] = __( 'Job Name', 'backwpup' );
77
- $jobs_columns[ 'type' ] = __( 'Type', 'backwpup' );
78
- $jobs_columns[ 'dest' ] = __( 'Destinations', 'backwpup' );
79
- $jobs_columns[ 'next' ] = __( 'Next Run', 'backwpup' );
80
- $jobs_columns[ 'last' ] = __( 'Last Run', 'backwpup' );
81
-
82
- return $jobs_columns;
83
- }
84
-
85
- /**
86
- * The cb Column
87
- *
88
- * @param $item
89
- * @return string
90
- */
91
- function column_cb( $item ) {
92
-
93
- return '<input type="checkbox" name="jobs[]" value="' . esc_attr( $item ) . '" />';
94
- }
95
-
96
- /**
97
- * The jobname Column
98
- *
99
- * @param $item
100
- * @return string
101
- */
102
- function column_jobname( $item ) {
103
-
104
- $job_normal_hide ='';
105
- if ( is_object( $this->job_object ) )
106
- $job_normal_hide = ' style="display:none;"';
107
-
108
- $r = '<strong title="' . sprintf( __( 'Job ID: %d', 'backwpup' ), $item ) . '">' . esc_html( BackWPup_Option::get( $item, 'name' ) ) . '</strong>';
109
- $actions = array();
110
- if ( current_user_can( 'backwpup_jobs_edit' ) ) {
111
- $actions[ 'edit' ] = "<a href=\"" . wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpupeditjob&jobid=' . $item, 'edit-job' ) . "\">" . __( 'Edit', 'backwpup' ) . "</a>";
112
- $actions[ 'copy' ] = "<a href=\"" . wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpupjobs&action=copy&jobid=' . $item, 'copy-job_' . $item ) . "\">" . __( 'Copy', 'backwpup' ) . "</a>";
113
- $actions[ 'delete' ] = "<a class=\"submitdelete\" href=\"" . wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpupjobs&action=delete&jobs[]=' . $item, 'bulk-jobs' ) . "\" onclick=\"return showNotice.warn();\">" . __( 'Delete', 'backwpup' ) . "</a>";
114
- }
115
- if ( current_user_can( 'backwpup_jobs_start' ) ) {
116
- $url = BackWPup_Job::get_jobrun_url( 'runnowlink', $item );
117
- $actions[ 'runnow' ] = "<a href=\"" . $url[ 'url' ] . "\">" . __( 'Run now', 'backwpup' ) . "</a>";
118
- }
119
- if ( current_user_can( 'backwpup_logs' ) && BackWPup_Option::get( $item, 'logfile' ) ) {
120
- $logfile = basename( BackWPup_Option::get( $item, 'logfile' ) );
121
- if ( is_object( $this->job_object ) && $this->job_object->job[ 'jobid' ] == $item )
122
- $logfile = basename( $this->job_object->logfile );
123
- $actions[ 'lastlog' ] = '<a href="' . admin_url( 'admin-ajax.php' ) . '?&action=backwpup_view_log&logfile=' . $logfile .'&_ajax_nonce=' . wp_create_nonce( 'view-logs' ) . '&amp;TB_iframe=true&amp;width=640&amp;height=440\" title="' . esc_attr( $logfile ) . '" class="thickbox">' . __( 'Last log', 'backwpup' ) . '</a>';
124
- }
125
- $actions = apply_filters( 'backwpup_page_jobs_actions', $actions, $item, FALSE );
126
- $r .= '<div class="job-normal"' . $job_normal_hide . '>' . $this->row_actions( $actions ) . '</div>';
127
- if ( is_object( $this->job_object ) ) {
128
- $actionsrun = array();
129
- $actionsrun = apply_filters( 'backwpup_page_jobs_actions', $actionsrun, $item, TRUE );
130
- $r .= '<div class="job-run">' . $this->row_actions( $actionsrun ) . '</div>';
131
- }
132
-
133
- return $r;
134
- }
135
-
136
- /**
137
- * The type Column
138
- *
139
- * @param $item
140
- * @return string
141
- */
142
- function column_type( $item ) {
143
-
144
- $r = '';
145
- if ( $types = BackWPup_Option::get( $item, 'type' ) ) {
146
- foreach ( $types as $type ) {
147
- if ( isset( $this->job_types[ $type ] ) ) {
148
- $r .= $this->job_types[ $type ]->info[ 'name' ] . '<br />';
149
- }
150
- else {
151
- $r .= $type . '<br />';
152
- }
153
- }
154
- }
155
-
156
- return $r;
157
- }
158
-
159
- /**
160
- * The destination Column
161
- *
162
- * @param $item
163
- * @return string
164
- */
165
- function column_dest( $item ) {
166
-
167
- $r = '';
168
- $backup_to = FALSE;
169
- foreach ( BackWPup_Option::get( $item, 'type' ) as $typeid ) {
170
- if ( isset( $this->job_types[ $typeid ] ) && $this->job_types[ $typeid ]->creates_file() ) {
171
- $backup_to = TRUE;
172
- break;
173
- }
174
- }
175
- if ( $backup_to ) {
176
- foreach ( BackWPup_Option::get( $item, 'destinations' ) as $destid ) {
177
- if ( isset( $this->destinations[ $destid ][ 'info' ][ 'name' ] ) ) {
178
- $r .= $this->destinations[ $destid ][ 'info' ][ 'name' ] . '<br />';
179
- } else {
180
- $r .= $destid . '<br />';
181
- }
182
- }
183
- }
184
- else {
185
- $r .= '<i>' . __( 'Not needed or set', 'backwpup' ) . '</i><br />';
186
- }
187
-
188
- return $r;
189
- }
190
-
191
- /**
192
- * The next Column
193
- *
194
- * @param $item
195
- * @return string
196
- */
197
- function column_next( $item ) {
198
-
199
- $r = '';
200
-
201
- $job_normal_hide ='';
202
- if ( is_object( $this->job_object ) )
203
- $job_normal_hide = ' style="display:none;"';
204
-
205
- if ( is_object( $this->job_object ) && $this->job_object->job[ 'jobid' ] == $item ) {
206
- $runtime = current_time( 'timestamp' ) - $this->job_object->start_time;
207
- $r .= '<div class="job-run">' . sprintf( __( 'Running for: %s seconds', 'backwpup' ), '<span id="runtime">' . $runtime . '</span>' ) .'</div>';
208
- }
209
- if ( is_object( $this->job_object ) && $this->job_object->job[ 'jobid' ] == $item )
210
- $r .='<div class="job-normal"' . $job_normal_hide . '>';
211
- if ( BackWPup_Option::get( $item, 'activetype' ) == 'wpcron' ) {
212
- if ( $nextrun = wp_next_scheduled( 'backwpup_cron', array( 'id' => $item ) ) + ( get_option( 'gmt_offset' ) * 3600 ) )
213
- $r .= '<span title="' . sprintf( __( 'Cron: %s','backwpup'),BackWPup_Option::get( $item, 'cron' ) ). '">' . sprintf( __( '%1$s at %2$s by WP-Cron', 'backwpup' ) , date_i18n( get_option( 'date_format' ), $nextrun, TRUE ) , date_i18n( get_option( 'time_format' ), $nextrun, TRUE ) ) . '</span>';
214
- else
215
- $r .= __( 'Not scheduled!', 'backwpup' );
216
- }
217
- else {
218
- $r .= __( 'Inactive', 'backwpup' );
219
- }
220
- if ( is_object( $this->job_object ) && $this->job_object->job[ 'jobid' ] == $item )
221
- $r .= '</div>';
222
-
223
- return $r;
224
- }
225
-
226
- /**
227
- * The last Column
228
- *
229
- * @param $item
230
- * @return string
231
- */
232
- function column_last( $item ) {
233
-
234
- $r = '';
235
-
236
- if ( BackWPup_Option::get( $item, 'lastrun' ) ) {
237
- $lastrun = BackWPup_Option::get( $item, 'lastrun' );
238
- $r .= sprintf( __( '%1$s at %2$s', 'backwpup' ), date_i18n( get_option( 'date_format' ), $lastrun, TRUE ), date_i18n( get_option( 'time_format' ), $lastrun, TRUE ) );
239
- if ( BackWPup_Option::get( $item, 'lastruntime' ) )
240
- $r .= '<br />' . sprintf( __( 'Runtime: %d seconds', 'backwpup' ), BackWPup_Option::get( $item, 'lastruntime' ) );
241
- }
242
- else {
243
- $r .= __( 'not yet', 'backwpup' );
244
- }
245
- $r .= "<br /><span class=\"last-action-links\">";
246
- if ( current_user_can( 'backwpup_backups_download' ) && BackWPup_Option::get( $item, 'lastbackupdownloadurl' ) )
247
- $r .= "<a href=\"" . wp_nonce_url( BackWPup_Option::get( $item, 'lastbackupdownloadurl' ), 'download-backup' ) . "\" title=\"" . esc_attr( __( 'Download last backup', 'backwpup' ) ) . "\">" . __( 'Download', 'backwpup' ) . "</a> | ";
248
- if ( current_user_can( 'backwpup_logs' ) && BackWPup_Option::get( $item, 'logfile' ) ) {
249
- $logfile = basename( BackWPup_Option::get( $item, 'logfile' ) );
250
- if ( is_object( $this->job_object ) && $this->job_object->job[ 'jobid' ] == $item )
251
- $logfile = basename( $this->job_object->logfile );
252
- $r .= '<a class="thickbox" href="' . admin_url( 'admin-ajax.php' ) . '?&action=backwpup_view_log&logfile=' . $logfile .'&_ajax_nonce=' . wp_create_nonce( 'view-logs' ) . '&amp;TB_iframe=true&amp;width=640&amp;height=440" title="' . esc_attr( $logfile ) . '">' . __( 'Log', 'backwpup' ) . '</a>';
253
-
254
- }
255
- $r .= "</span>";
256
-
257
- return $r;
258
- }
259
-
260
-
261
- /**
262
- *
263
- */
264
- public static function load() {
265
-
266
- //Create Table
267
- self::$listtable = new self;
268
-
269
- switch ( self::$listtable->current_action() ) {
270
- case 'delete': //Delete Job
271
- if ( ! current_user_can( 'backwpup_jobs_edit' ) )
272
- break;
273
- if ( is_array( $_GET[ 'jobs' ] ) ) {
274
- check_admin_referer( 'bulk-jobs' );
275
- foreach ( $_GET[ 'jobs' ] as $jobid ) {
276
- wp_clear_scheduled_hook( 'backwpup_cron', array( 'id' => $jobid ) );
277
- BackWPup_Option::delete_job( $jobid );
278
- }
279
- }
280
- break;
281
- case 'copy': //Copy Job
282
- if ( ! current_user_can( 'backwpup_jobs_edit' ) )
283
- break;
284
- $old_job_id = (int)$_GET[ 'jobid' ];
285
- check_admin_referer( 'copy-job_' . $_GET[ 'jobid' ] );
286
- //create new
287
- $newjobid = BackWPup_Option::get_job_ids();
288
- sort( $newjobid );
289
- $newjobid = end( $newjobid ) + 1;
290
- $old_options = BackWPup_Option::get_job( $old_job_id );
291
- foreach ( $old_options as $key => $option ) {
292
- if ( $key == "jobid" )
293
- $option = $newjobid;
294
- if ( $key == "name" )
295
- $option = __( 'Copy of', 'backwpup' ) . ' ' . $option;
296
- if ( $key == "activetype" )
297
- $option = '';
298
- if ( $key == "archivename" )
299
- $option = str_replace( $_GET[ 'jobid' ], $newjobid, $option );
300
- if ( $key == "logfile" || $key == "lastbackupdownloadurl" || $key == "lastruntime" ||
301
- $key == "lastrun" )
302
- continue;
303
- BackWPup_Option::update( $newjobid, $key, $option );
304
- }
305
- break;
306
- case 'start_cli': //Get cmd start file
307
- if ( ! current_user_can( 'backwpup_jobs_start' ) )
308
- break;
309
- check_admin_referer( 'start_cli' );
310
- if ( empty( $_GET[ 'jobid' ] ) )
311
- break;
312
- if ( FALSE === strpos( PHP_OS, "WIN" ) ) {
313
- header( "Pragma: public" );
314
- header( "Expires: 0" );
315
- header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
316
- header( "Content-Type: application/octet-stream" );
317
- header( "Content-Disposition: attachment; filename=BackWPup_cmd_start_job_" . $_GET[ 'jobid' ] . ".sh;" );
318
- if ( defined( 'PHP_BINDIR' ) )
319
- echo "#!/bin/sh" . PHP_EOL;
320
- echo "@\$1php -c \"" . php_ini_loaded_file() . "\" -r \"\$_SERVER[ 'SERVER_ADDR' ] = '". $_SERVER[ 'SERVER_ADDR' ] ."'; \$_SERVER[ 'REMOTE_ADDR' ] = '". $_SERVER[ 'REMOTE_ADDR' ] ."'; \$_SERVER[ 'HTTP_HOST' ] = '". $_SERVER[ 'HTTP_HOST' ] ."'; \$_SERVER[ 'HTTP_USER_AGENT' ] = '". BackWPup::get_plugin_data( 'name' ) ."'; define( 'DOING_CRON', TRUE ); require '" . ABSPATH . "wp-load.php'; if( class_exists( 'BackWPup_Job' ) ) BackWPup_Job::start_cli( " . $_GET[ 'jobid' ] . " );\"";
321
- die();
322
- }
323
- else {
324
- header( "Pragma: public" );
325
- header( "Expires: 0" );
326
- header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
327
- header( "Content-Type: application/octet-stream" );
328
- header( "Content-Disposition: attachment; filename=BackWPup_cmd_start_job_" . $_GET[ 'jobid' ] . ".cmd;" );
329
- echo "@%1php.exe -c \"" . php_ini_loaded_file() . "\" -r \"\$_SERVER[ 'SERVER_ADDR' ] = '". $_SERVER[ 'SERVER_ADDR' ] ."'; \$_SERVER[ 'REMOTE_ADDR' ] = '". $_SERVER[ 'REMOTE_ADDR' ] ."'; \$_SERVER[ 'HTTP_HOST' ] = '". $_SERVER[ 'HTTP_HOST' ] ."'; \$_SERVER[ 'HTTP_USER_AGENT' ] = '". BackWPup::get_plugin_data( 'name' ) ."'; define( 'DOING_CRON', TRUE ); require '" . ABSPATH . "wp-load.php'; if( class_exists( 'BackWPup_Job' ) ) BackWPup_Job::start_cli( " . $_GET[ 'jobid' ] . " );\"";
330
- die();
331
- }
332
- break;
333
- case 'runnow':
334
- if ( ! empty( $_GET[ 'jobid' ] ) ) {
335
- if ( ! current_user_can( 'backwpup_jobs_start' ) )
336
- wp_die( __( 'Sorry, you don\'t have permissions to do that.', 'backwpup') );
337
- check_admin_referer( 'backwpup_job_run-runnowlink' );
338
-
339
- //check temp folder
340
- BackWPup_Job::check_folder( BackWPup::get_plugin_data( 'TEMP' ), TRUE );
341
- //check log folder
342
- BackWPup_Job::check_folder( get_site_option( 'backwpup_cfg_logfolder' ) );
343
- //check server callback
344
- $raw_response = BackWPup_Job::get_jobrun_url( 'test' );
345
- $test_result = '';
346
- if ( is_wp_error( $raw_response ) )
347
- $test_result .= sprintf( __( 'The HTTP response test get an error "%s"','backwpup' ), $raw_response->get_error_message() );
348
- elseif ( 200 != wp_remote_retrieve_response_code( $raw_response ) && 204 != wp_remote_retrieve_response_code( $raw_response ) )
349
- $test_result .= sprintf( __( 'The HTTP response test get a false http status (%s)','backwpup' ), wp_remote_retrieve_response_code( $raw_response ) );
350
- if ( ! empty( $test_result ) )
351
- BackWPup_Admin::message( $test_result, TRUE );
352
-
353
- //only start job if messages empty
354
- $log_messages = BackWPup_Admin::get_messages();
355
- if ( empty ( $log_messages ) ) {
356
- $old_log_file = BackWPup_Option::get( $_GET[ 'jobid' ], 'logfile' );
357
- BackWPup_Job::get_jobrun_url( 'runnow', $_GET[ 'jobid' ] );
358
- usleep( 250000 ); //wait a quarter second
359
- $new_log_file = BackWPup_Option::get( $_GET[ 'jobid' ], 'logfile', NULL, FALSE );
360
- //sleep as long as job not started
361
- $i=0;
362
- while ( $old_log_file == $new_log_file ) {
363
- usleep( 250000 ); //wait a quarter second for next try
364
- $new_log_file = BackWPup_Option::get( $_GET[ 'jobid' ], 'logfile', NULL, FALSE );
365
- //wait maximal 10 sec.
366
- if ( $i >= 40 ) {
367
- BackWPup_Admin::message( sprintf( __( 'Job “%s” has started, but not responded for 10 seconds.', 'backwpup' ), esc_attr( BackWPup_Option::get( $_GET[ 'jobid' ], 'name' ) ) ), TRUE );
368
- break 2;
369
- }
370
- $i++;
371
- }
372
- BackWPup_Admin::message( sprintf( __( 'Job "%s" started.', 'backwpup' ), esc_attr( BackWPup_Option::get( $_GET[ 'jobid' ], 'name' ) ) ) );
373
- }
374
- }
375
- break;
376
- case 'abort': //Abort Job
377
- if ( ! current_user_can( 'backwpup_jobs_start' ) )
378
- break;
379
- check_admin_referer( 'abort-job' );
380
- if ( ! file_exists( BackWPup::get_plugin_data( 'running_file' ) ) )
381
- break;
382
- //abort
383
- BackWPup_Job::user_abort();
384
- BackWPup_Admin::message( __( 'Job will be terminated.', 'backwpup' ) ) ;
385
- break;
386
- default:
387
- do_action( 'backwpup_page_jobs_load', self::$listtable->current_action() );
388
- break;
389
- }
390
-
391
- self::$listtable->prepare_items();
392
- }
393
-
394
- /**
395
- *
396
- */
397
- public static function admin_print_styles() {
398
-
399
- ?>
400
- <style type="text/css" media="screen">
401
-
402
- .column-last, .column-next, .column-type, .column-dest {
403
- width: 15%;
404
- }
405
-
406
- #TB_ajaxContent {
407
- background-color: black;
408
- color: white;
409
- }
410
-
411
- #showworking {
412
- white-space:nowrap;
413
- display: block;
414
- width: 100%;
415
- font-family:monospace;
416
- font-size:12px;
417
- line-height:15px;
418
- }
419
- #runningjob {
420
- padding:10px;
421
- position:relative;
422
- margin: 15px 0 25px 0;
423
- padding-bottom:25px;
424
- }
425
- h2#runnigtitle {
426
- margin-bottom: 15px;
427
- padding: 0;
428
- }
429
- #warningsid, #errorid {
430
- margin-right: 10px;
431
- }
432
-
433
- .infobuttons {
434
- position: absolute;
435
- right: 10px;
436
- bottom: 0;
437
- }
438
-
439
- .progressbar {
440
- margin-top: 20px;
441
- height: auto;
442
- background: #f6f6f6 url('<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/progressbarhg.jpg');
443
- }
444
-
445
- #lastmsg, #onstep, #lasterrormsg {
446
- text-align: center;
447
- margin-bottom: 20px;
448
- }
449
- #backwpup-page #lastmsg,
450
- #backwpup-page #onstep,
451
- #backwpup-page #lasterrormsg {
452
- font-family: "Open Sans", sans-serif;
453
- }
454
- .bwpu-progress {
455
- background-color: #1d94cf;
456
- color: #fff;
457
- padding: 5px 0;
458
- text-align: center;
459
- }
460
- #progresssteps {
461
- background-color: #007fb6;
462
- }
463
-
464
- .row-actions .lastlog {
465
- display: none;
466
- }
467
-
468
- @media screen and (max-width: 782px) {
469
- .column-type, .column-dest {
470
- display: none;
471
- }
472
- .row-actions .lastlog {
473
- display: inline-block;
474
- }
475
- .last-action-links {
476
- display: none;
477
- }
478
- }
479
- </style>
480
- <?php
481
- }
482
-
483
- /**
484
- *
485
- */
486
- public static function admin_print_scripts() {
487
-
488
- wp_enqueue_script( 'backwpupgeneral' );
489
- }
490
-
491
- /**
492
- *
493
- */
494
- public static function page() {
495
-
496
- echo '<div class="wrap" id="backwpup-page">';
497
- echo '<h2><span id="backwpup-page-icon">&nbsp;</span>' . esc_html( sprintf( __( '%s Jobs', 'backwpup' ), BackWPup::get_plugin_data( 'name' ) ) ) . '&nbsp;<a href="' . wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpupeditjob', 'edit-job' ) . '" class="add-new-h2">' . esc_html__( 'Add new', 'backwpup' ) . '</a></h2>';
498
- BackWPup_Admin::display_messages();
499
- $job_object = BackWPup_Job::get_working_data();
500
- if ( current_user_can( 'backwpup_jobs_start' ) && is_object( $job_object ) ) {
501
-
502
- //read existing logfile
503
- $logfiledata = file_get_contents( $job_object->logfile );
504
- preg_match( '/<body[^>]*>/si', $logfiledata, $match );
505
- if ( ! empty( $match[ 0 ] ) )
506
- $startpos = strpos( $logfiledata, $match[ 0 ] ) + strlen( $match[ 0 ] );
507
- else
508
- $startpos = 0;
509
- $endpos = stripos( $logfiledata, '</body>' );
510
- if ( empty( $endpos ) )
511
- $endpos = strlen( $logfiledata );
512
- $length = strlen( $logfiledata ) - ( strlen( $logfiledata ) - $endpos ) - $startpos;
513
-
514
- ?>
515
- <div id="runningjob">
516
- <div id="runniginfos">
517
- <h2 id="runningtitle"><?php sprintf( __('Job currently running: %s','backwpup'), $job_object->job[ 'name' ] ); ?></h2>
518
- <span id="warningsid"><?php _e( 'Warnings:', 'backwpup' ); ?> <span id="warnings"><?php echo $job_object->warnings; ?></span></span>
519
- <span id="errorid"><?php _e( 'Errors:', 'backwpup' ); ?> <span id="errors"><?php echo $job_object->errors; ?></span></span>
520
- <div class="infobuttons"><a href="#TB_inline?height=440&width=630&inlineId=tb-showworking" id="showworkingbutton" class="thickbox button button-primary button-primary-bwp" title="<?php _e( 'Log of running job', 'backwpup'); ?>"><?php _e( 'Display working log', 'backwpup' ); ?></a>
521
- <a href="<?php echo wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpupjobs&action=abort', 'abort-job' ); ?>" id="abortbutton" class="backwpup-fancybox button button-bwp"><?php _e( 'Abort', 'backwpup' ); ?></a>
522
- <a href="#" id="showworkingclose" title="<?php _e( 'Close working screen', 'backwpup'); ?>" class="button button-bwp" style="display:none" ><?php _e( 'close', 'backwpup' ); ?></a></div>
523
- </div>
524
- <input type="hidden" name="logpos" id="logpos" value="<?php echo strlen( $logfiledata ); ?>">
525
- <div id="lasterrormsg"></div>
526
- <div class="progressbar"><div id="progressstep" class="bwpu-progress" style="width:<?php echo $job_object->step_percent; ?>%;"><?php echo $job_object->step_percent; ?>%</div></div>
527
- <div id="onstep"><?php echo $job_object->steps_data[ $job_object->step_working ][ 'NAME' ]; ?></div>
528
- <div class="progressbar"><div id="progresssteps" class="bwpu-progress" style="width:<?php echo $job_object->substep_percent; ?>%;"><?php echo $job_object->substep_percent; ?>%</div></div>
529
- <div id="lastmsg"><?php echo $job_object->lastmsg; ?></div>
530
- <div id="tb-showworking" style="display:none;">
531
- <div id="showworking"><?php echo substr( $logfiledata, $startpos, $length ); ?></div>
532
- </div>
533
- </div>
534
- <?php }
535
-
536
- //display jos Table
537
- ?>
538
- <form id="posts-filter" action="" method="get">
539
- <input type="hidden" name="page" value="backwpupjobs" />
540
- <?php
541
- echo wp_nonce_field( 'backwpup_ajax_nonce', 'backwpupajaxnonce', FALSE );
542
- self::$listtable->display();
543
- ?>
544
- <div id="ajax-response"></div>
545
- </form>
546
- </div>
547
- <?php
548
-
549
- if ( ! empty( $job_object->logfile ) ) { ?>
550
- <script type="text/javascript">
551
- //<![CDATA[
552
- jQuery(document).ready(function ($) {
553
- backwpup_show_working = function () {
554
- $.ajax({
555
- type: 'GET',
556
- url: ajaxurl,
557
- cache: false,
558
- data:{
559
- action: 'backwpup_working',
560
- logpos: $('#logpos').val(),
561
- logfile: '<?php echo basename( $job_object->logfile );?>',
562
- _ajax_nonce: '<?php echo wp_create_nonce( 'backwpupworking_ajax_nonce' );?>'
563
- },
564
- dataType: 'json',
565
- success:function (rundata) {
566
- if ( rundata == 0 ) {
567
- $("#abortbutton").remove();
568
- $("#backwpup-adminbar-running").remove();
569
- $(".job-run").hide();
570
- $("#message").hide();
571
- $(".job-normal").show();
572
- $('#showworkingclose').show();
573
- }
574
- if (0 < rundata.log_pos) {
575
- $('#logpos').val(rundata.log_pos);
576
- }
577
- if ('' != rundata.log_text) {
578
- $('#showworking').append(rundata.log_text);
579
- $('#TB_ajaxContent').scrollTop(rundata.log_pos * 15);
580
- }
581
- if (0 < rundata.error_count) {
582
- $('#errors').replaceWith('<span id="errors">' + rundata.error_count + '</span>');
583
- }
584
- if (0 < rundata.warning_count) {
585
- $('#warnings').replaceWith('<span id="warnings">' + rundata.warning_count + '</span>');
586
- }
587
- if (0 < rundata.step_percent) {
588
- $('#progressstep').replaceWith('<div id="progressstep" class="bwpu-progress">' + rundata.step_percent + '%</div>');
589
- $('#progressstep').css('width', parseFloat(rundata.step_percent) + '%');
590
- }
591
- if (0 < rundata.sub_step_percent) {
592
- $('#progresssteps').replaceWith('<div id="progresssteps" class="bwpu-progress">' + rundata.sub_step_percent + '%</div>');
593
- $('#progresssteps').css('width', parseFloat(rundata.sub_step_percent) + '%');
594
- }
595
- if (0 < rundata.running_time) {
596
- $('#runtime').replaceWith('<span id="runtime">' + rundata.running_time + '</span>');
597
- }
598
- if ( '' != rundata.onstep ) {
599
- $('#onstep').replaceWith('<div id="onstep">' + rundata.on_step + '</div>');
600
- }
601
- if ( '' != rundata.last_msg ) {
602
- $('#lastmsg').replaceWith('<div id="lastmsg">' + rundata.last_msg + '</div>');
603
- }
604
- if ( '' != rundata.last_error_msg ) {
605
- $('#lasterrormsg').replaceWith('<div id="lasterrormsg">' + rundata.last_error_msg + '</div>');
606
- }
607
- if ( rundata.job_done == 1 ) {
608
- $("#abortbutton").remove();
609
- $("#backwpup-adminbar-running").remove();
610
- $(".job-run").hide();
611
- $("#message").hide();
612
- $(".job-normal").show();
613
- $('#showworkingclose').show();
614
- } else {
615
- setTimeout('backwpup_show_working()', 750);
616
- }
617
- },
618
- error:function ( ) {
619
- setTimeout('backwpup_show_working()', 750);
620
- }
621
- });
622
- };
623
- backwpup_show_working();
624
- $('#showworkingclose').click( function() {
625
- $("#runningjob").hide( 'slow' );
626
- return false;
627
- });
628
- });
629
- //]]>
630
- </script>
631
- <?php }
632
- }
633
-
634
-
635
- /**
636
- *
637
- * Function to generate json data
638
- *
639
- */
640
- public static function ajax_working() {
641
-
642
- check_ajax_referer( 'backwpupworking_ajax_nonce' );
643
-
644
- $logfile = isset( $_GET[ 'logfile' ] ) ? get_site_option( 'backwpup_cfg_logfolder' ) . trim( $_GET[ 'logfile' ] ) : NULL;
645
- $logpos = isset( $_GET[ 'logpos' ] ) ? (int)$_GET[ 'logpos' ] : 0;
646
-
647
- //check if logfile renamed
648
- if ( file_exists( $logfile . '.gz' ) )
649
- $logfile .= '.gz';
650
-
651
- if ( ! is_readable( $logfile ) )
652
- die( '0' );
653
-
654
- $job_object = BackWPup_Job::get_working_data();
655
- $done = 0;
656
- if ( is_object( $job_object ) ) {
657
- $warnings = $job_object->warnings;
658
- $errors = $job_object->errors;
659
- $step_percent = $job_object->step_percent;
660
- $substep_percent = $job_object->substep_percent;
661
- $runtime = current_time( 'timestamp' ) - $job_object->start_time;
662
- $onstep = $job_object->steps_data[ $job_object->step_working ][ 'NAME' ];
663
- $lastmsg = $job_object->lastmsg;
664
- $lasterrormsg = $job_object->lasterrormsg;
665
- } else {
666
- $logheader = BackWPup_Job::read_logheader( $logfile );
667
- $warnings = $logheader[ 'warnings' ];
668
- $runtime = $logheader[ 'runtime' ];
669
- $errors = $logheader[ 'errors' ];
670
- $step_percent = 100;
671
- $substep_percent = 100;
672
- $onstep = '<div class="backwpup-message backwpup-info"><p>' . __( 'Job completed' , 'backwpup' ) . '</p></div>';
673
- if ( $errors > 0 )
674
- $lastmsg = '<div class="error"><p>' . __( 'ERROR:', 'backwpup' ) . ' ' . sprintf( __( 'Job has ended with errors in %s seconds. You must resolve the errors for correct execution.', 'backwpup' ), $logheader[ 'runtime' ] ) . '</p></div>';
675
- elseif ( $warnings > 0 )
676
- $lastmsg = '<div class="backwpup-message backwpup-warning"><p>' . __( 'WARNING:', 'backwpup' ) . ' ' . sprintf( __( 'Job has done with warnings in %s seconds. Please resolve them for correct execution.', 'backwpup' ), $logheader[ 'runtime' ] ) . '</p></div>';
677
- else
678
- $lastmsg = '<div class="updated"><p>' . sprintf( __( 'Job done in %s seconds.', 'backwpup' ), $logheader[ 'runtime' ] ) . '</p></div>';
679
- $lasterrormsg = '';
680
- $done = 1;
681
- }
682
-
683
- if ( '.gz' == substr( $logfile, -3 ) )
684
- $logfiledata = file_get_contents( 'compress.zlib://' . $logfile, FALSE, NULL, $logpos );
685
- else
686
- $logfiledata = file_get_contents( $logfile, FALSE, NULL, $logpos );
687
-
688
- preg_match( '/<body[^>]*>/si', $logfiledata, $match );
689
- if ( ! empty( $match[ 0 ] ) )
690
- $startpos = strpos( $logfiledata, $match[ 0 ] ) + strlen( $match[ 0 ] );
691
- else
692
- $startpos = 0;
693
-
694
- $endpos = stripos( $logfiledata, '</body>' );
695
- if ( FALSE === $endpos )
696
- $endpos = strlen( $logfiledata );
697
-
698
- $length = strlen( $logfiledata ) - ( strlen( $logfiledata ) - $endpos ) - $startpos;
699
-
700
- wp_send_json( array(
701
- 'log_pos' => strlen( $logfiledata ) + $logpos,
702
- 'log_text' => substr( $logfiledata, $startpos, $length ),
703
- 'warning_count' => $warnings,
704
- 'error_count' => $errors,
705
- 'running_time' => $runtime,
706
- 'step_percent' => $step_percent,
707
- 'on_step' => $onstep,
708
- 'last_msg' => $lastmsg,
709
- 'last_error_msg' => $lasterrormsg,
710
- 'sub_step_percent'=> $substep_percent,
711
- 'job_done' => $done
712
- ) );
713
- }
714
-
715
- }
716
-
1
+ <?php
2
+ /**
3
+ * Class For BackWPup Jobs page
4
+ */
5
+ class BackWPup_Page_Jobs extends WP_List_Table {
6
+
7
+ private static $listtable = NULL;
8
+ public static $logfile = NULL;
9
+ private $job_object = NULL;
10
+ private $job_types = NULL;
11
+ private $destinations = NULL;
12
+
13
+
14
+ /**
15
+ *
16
+ */
17
+ function __construct() {
18
+ parent::__construct( array(
19
+ 'plural' => 'jobs',
20
+ 'singular' => 'job',
21
+ 'ajax' => TRUE
22
+ ) );
23
+ }
24
+
25
+
26
+ /**
27
+ * @return bool|void
28
+ */
29
+ function ajax_user_can() {
30
+
31
+ return current_user_can( 'backwpup' );
32
+ }
33
+
34
+ /**
35
+ *
36
+ */
37
+ function prepare_items() {
38
+
39
+ $this->items = BackWPup_Option::get_job_ids();
40
+
41
+ $this->job_object = BackWPup_Job::get_working_data();
42
+
43
+ $this->job_types = BackWPup::get_job_types();
44
+ $this->destinations = BackWPup::get_registered_destinations();
45
+ }
46
+
47
+ /**
48
+ *
49
+ */
50
+ function no_items() {
51
+
52
+ _e( 'No Jobs.', 'backwpup' );
53
+ }
54
+
55
+ /**
56
+ * @return array
57
+ */
58
+ function get_bulk_actions() {
59
+
60
+ if ( ! $this->has_items() )
61
+ return array ();
62
+
63
+ $actions = array();
64
+ $actions[ 'delete' ] = __( 'Delete', 'backwpup' );
65
+
66
+ return apply_filters( 'backwpup_page_jobs_get_bulk_actions', $actions );
67
+ }
68
+
69
+ /**
70
+ * @return array
71
+ */
72
+ function get_columns() {
73
+
74
+ $jobs_columns = array();
75
+ $jobs_columns[ 'cb' ] = '<input type="checkbox" />';
76
+ $jobs_columns[ 'jobname' ] = __( 'Job Name', 'backwpup' );
77
+ $jobs_columns[ 'type' ] = __( 'Type', 'backwpup' );
78
+ $jobs_columns[ 'dest' ] = __( 'Destinations', 'backwpup' );
79
+ $jobs_columns[ 'next' ] = __( 'Next Run', 'backwpup' );
80
+ $jobs_columns[ 'last' ] = __( 'Last Run', 'backwpup' );
81
+
82
+ return $jobs_columns;
83
+ }
84
+
85
+ /**
86
+ * The cb Column
87
+ *
88
+ * @param $item
89
+ * @return string
90
+ */
91
+ function column_cb( $item ) {
92
+
93
+ return '<input type="checkbox" name="jobs[]" value="' . esc_attr( $item ) . '" />';
94
+ }
95
+
96
+ /**
97
+ * The jobname Column
98
+ *
99
+ * @param $item
100
+ * @return string
101
+ */
102
+ function column_jobname( $item ) {
103
+
104
+ $job_normal_hide ='';
105
+ if ( is_object( $this->job_object ) )
106
+ $job_normal_hide = ' style="display:none;"';
107
+
108
+ $r = '<strong title="' . sprintf( __( 'Job ID: %d', 'backwpup' ), $item ) . '">' . esc_html( BackWPup_Option::get( $item, 'name' ) ) . '</strong>';
109
+ $actions = array();
110
+ if ( current_user_can( 'backwpup_jobs_edit' ) ) {
111
+ $actions[ 'edit' ] = "<a href=\"" . wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpupeditjob&jobid=' . $item, 'edit-job' ) . "\">" . __( 'Edit', 'backwpup' ) . "</a>";
112
+ $actions[ 'copy' ] = "<a href=\"" . wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpupjobs&action=copy&jobid=' . $item, 'copy-job_' . $item ) . "\">" . __( 'Copy', 'backwpup' ) . "</a>";
113
+ $actions[ 'delete' ] = "<a class=\"submitdelete\" href=\"" . wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpupjobs&action=delete&jobs[]=' . $item, 'bulk-jobs' ) . "\" onclick=\"return showNotice.warn();\">" . __( 'Delete', 'backwpup' ) . "</a>";
114
+ }
115
+ if ( current_user_can( 'backwpup_jobs_start' ) ) {
116
+ $url = BackWPup_Job::get_jobrun_url( 'runnowlink', $item );
117
+ $actions[ 'runnow' ] = "<a href=\"" . $url[ 'url' ] . "\">" . __( 'Run now', 'backwpup' ) . "</a>";
118
+ }
119
+ if ( current_user_can( 'backwpup_logs' ) && BackWPup_Option::get( $item, 'logfile' ) ) {
120
+ $logfile = basename( BackWPup_Option::get( $item, 'logfile' ) );
121
+ if ( is_object( $this->job_object ) && $this->job_object->job[ 'jobid' ] == $item )
122
+ $logfile = basename( $this->job_object->logfile );
123
+ $actions[ 'lastlog' ] = '<a href="' . admin_url( 'admin-ajax.php' ) . '?&action=backwpup_view_log&logfile=' . $logfile .'&_ajax_nonce=' . wp_create_nonce( 'view-logs' ) . '&amp;TB_iframe=true&amp;width=640&amp;height=440\" title="' . esc_attr( $logfile ) . '" class="thickbox">' . __( 'Last log', 'backwpup' ) . '</a>';
124
+ }
125
+ $actions = apply_filters( 'backwpup_page_jobs_actions', $actions, $item, FALSE );
126
+ $r .= '<div class="job-normal"' . $job_normal_hide . '>' . $this->row_actions( $actions ) . '</div>';
127
+ if ( is_object( $this->job_object ) ) {
128
+ $actionsrun = array();
129
+ $actionsrun = apply_filters( 'backwpup_page_jobs_actions', $actionsrun, $item, TRUE );
130
+ $r .= '<div class="job-run">' . $this->row_actions( $actionsrun ) . '</div>';
131
+ }
132
+
133
+ return $r;
134
+ }
135
+
136
+ /**
137
+ * The type Column
138
+ *
139
+ * @param $item
140
+ * @return string
141
+ */
142
+ function column_type( $item ) {
143
+
144
+ $r = '';
145
+ if ( $types = BackWPup_Option::get( $item, 'type' ) ) {
146
+ foreach ( $types as $type ) {
147
+ if ( isset( $this->job_types[ $type ] ) ) {
148
+ $r .= $this->job_types[ $type ]->info[ 'name' ] . '<br />';
149
+ }
150
+ else {
151
+ $r .= $type . '<br />';
152
+ }
153
+ }
154
+ }
155
+
156
+ return $r;
157
+ }
158
+
159
+ /**
160
+ * The destination Column
161
+ *
162
+ * @param $item
163
+ * @return string
164
+ */
165
+ function column_dest( $item ) {
166
+
167
+ $r = '';
168
+ $backup_to = FALSE;
169
+ foreach ( BackWPup_Option::get( $item, 'type' ) as $typeid ) {
170
+ if ( isset( $this->job_types[ $typeid ] ) && $this->job_types[ $typeid ]->creates_file() ) {
171
+ $backup_to = TRUE;
172
+ break;
173
+ }
174
+ }
175
+ if ( $backup_to ) {
176
+ foreach ( BackWPup_Option::get( $item, 'destinations' ) as $destid ) {
177
+ if ( isset( $this->destinations[ $destid ][ 'info' ][ 'name' ] ) ) {
178
+ $r .= $this->destinations[ $destid ][ 'info' ][ 'name' ] . '<br />';
179
+ } else {
180
+ $r .= $destid . '<br />';
181
+ }
182
+ }
183
+ }
184
+ else {
185
+ $r .= '<i>' . __( 'Not needed or set', 'backwpup' ) . '</i><br />';
186
+ }
187
+
188
+ return $r;
189
+ }
190
+
191
+ /**
192
+ * The next Column
193
+ *
194
+ * @param $item
195
+ * @return string
196
+ */
197
+ function column_next( $item ) {
198
+
199
+ $r = '';
200
+
201
+ $job_normal_hide ='';
202
+ if ( is_object( $this->job_object ) )
203
+ $job_normal_hide = ' style="display:none;"';
204
+
205
+ if ( is_object( $this->job_object ) && $this->job_object->job[ 'jobid' ] == $item ) {
206
+ $runtime = current_time( 'timestamp' ) - $this->job_object->start_time;
207
+ $r .= '<div class="job-run">' . sprintf( __( 'Running for: %s seconds', 'backwpup' ), '<span id="runtime">' . $runtime . '</span>' ) .'</div>';
208
+ }
209
+ if ( is_object( $this->job_object ) && $this->job_object->job[ 'jobid' ] == $item )
210
+ $r .='<div class="job-normal"' . $job_normal_hide . '>';
211
+ if ( BackWPup_Option::get( $item, 'activetype' ) == 'wpcron' ) {
212
+ if ( $nextrun = wp_next_scheduled( 'backwpup_cron', array( 'id' => $item ) ) + ( get_option( 'gmt_offset' ) * 3600 ) )
213
+ $r .= '<span title="' . sprintf( __( 'Cron: %s','backwpup'),BackWPup_Option::get( $item, 'cron' ) ). '">' . sprintf( __( '%1$s at %2$s by WP-Cron', 'backwpup' ) , date_i18n( get_option( 'date_format' ), $nextrun, TRUE ) , date_i18n( get_option( 'time_format' ), $nextrun, TRUE ) ) . '</span>';
214
+ else
215
+ $r .= __( 'Not scheduled!', 'backwpup' );
216
+ }
217
+ else {
218
+ $r .= __( 'Inactive', 'backwpup' );
219
+ }
220
+ if ( is_object( $this->job_object ) && $this->job_object->job[ 'jobid' ] == $item )
221
+ $r .= '</div>';
222
+
223
+ return $r;
224
+ }
225
+
226
+ /**
227
+ * The last Column
228
+ *
229
+ * @param $item
230
+ * @return string
231
+ */
232
+ function column_last( $item ) {
233
+
234
+ $r = '';
235
+
236
+ if ( BackWPup_Option::get( $item, 'lastrun' ) ) {
237
+ $lastrun = BackWPup_Option::get( $item, 'lastrun' );
238
+ $r .= sprintf( __( '%1$s at %2$s', 'backwpup' ), date_i18n( get_option( 'date_format' ), $lastrun, TRUE ), date_i18n( get_option( 'time_format' ), $lastrun, TRUE ) );
239
+ if ( BackWPup_Option::get( $item, 'lastruntime' ) )
240
+ $r .= '<br />' . sprintf( __( 'Runtime: %d seconds', 'backwpup' ), BackWPup_Option::get( $item, 'lastruntime' ) );
241
+ }
242
+ else {
243
+ $r .= __( 'not yet', 'backwpup' );
244
+ }
245
+ $r .= "<br /><span class=\"last-action-links\">";
246
+ if ( current_user_can( 'backwpup_backups_download' ) && BackWPup_Option::get( $item, 'lastbackupdownloadurl' ) )
247
+ $r .= "<a href=\"" . wp_nonce_url( BackWPup_Option::get( $item, 'lastbackupdownloadurl' ), 'download-backup' ) . "\" title=\"" . esc_attr( __( 'Download last backup', 'backwpup' ) ) . "\">" . __( 'Download', 'backwpup' ) . "</a> | ";
248
+ if ( current_user_can( 'backwpup_logs' ) && BackWPup_Option::get( $item, 'logfile' ) ) {
249
+ $logfile = basename( BackWPup_Option::get( $item, 'logfile' ) );
250
+ if ( is_object( $this->job_object ) && $this->job_object->job[ 'jobid' ] == $item )
251
+ $logfile = basename( $this->job_object->logfile );
252
+ $r .= '<a class="thickbox" href="' . admin_url( 'admin-ajax.php' ) . '?&action=backwpup_view_log&logfile=' . $logfile .'&_ajax_nonce=' . wp_create_nonce( 'view-logs' ) . '&amp;TB_iframe=true&amp;width=640&amp;height=440" title="' . esc_attr( $logfile ) . '">' . __( 'Log', 'backwpup' ) . '</a>';
253
+
254
+ }
255
+ $r .= "</span>";
256
+
257
+ return $r;
258
+ }
259
+
260
+
261
+ /**
262
+ *
263
+ */
264
+ public static function load() {
265
+
266
+ //Create Table
267
+ self::$listtable = new self;
268
+
269
+ switch ( self::$listtable->current_action() ) {
270
+ case 'delete': //Delete Job
271
+ if ( ! current_user_can( 'backwpup_jobs_edit' ) )
272
+ break;
273
+ if ( is_array( $_GET[ 'jobs' ] ) ) {
274
+ check_admin_referer( 'bulk-jobs' );
275
+ foreach ( $_GET[ 'jobs' ] as $jobid ) {
276
+ wp_clear_scheduled_hook( 'backwpup_cron', array( 'id' => $jobid ) );
277
+ BackWPup_Option::delete_job( $jobid );
278
+ }
279
+ }
280
+ break;
281
+ case 'copy': //Copy Job
282
+ if ( ! current_user_can( 'backwpup_jobs_edit' ) )
283
+ break;
284
+ $old_job_id = (int)$_GET[ 'jobid' ];
285
+ check_admin_referer( 'copy-job_' . $_GET[ 'jobid' ] );
286
+ //create new
287
+ $newjobid = BackWPup_Option::get_job_ids();
288
+ sort( $newjobid );
289
+ $newjobid = end( $newjobid ) + 1;
290
+ $old_options = BackWPup_Option::get_job( $old_job_id );
291
+ foreach ( $old_options as $key => $option ) {
292
+ if ( $key == "jobid" )
293
+ $option = $newjobid;
294
+ if ( $key == "name" )
295
+ $option = __( 'Copy of', 'backwpup' ) . ' ' . $option;
296
+ if ( $key == "activetype" )
297
+ $option = '';
298
+ if ( $key == "archivename" )
299
+ $option = str_replace( $_GET[ 'jobid' ], $newjobid, $option );
300
+ if ( $key == "logfile" || $key == "lastbackupdownloadurl" || $key == "lastruntime" ||
301
+ $key == "lastrun" )
302
+ continue;
303
+ BackWPup_Option::update( $newjobid, $key, $option );
304
+ }
305
+ break;
306
+ case 'start_cli': //Get cmd start file
307
+ if ( ! current_user_can( 'backwpup_jobs_start' ) )
308
+ break;
309
+ check_admin_referer( 'start_cli' );
310
+ if ( empty( $_GET[ 'jobid' ] ) )
311
+ break;
312
+ if ( FALSE === strpos( PHP_OS, "WIN" ) ) {
313
+ header( "Pragma: public" );
314
+ header( "Expires: 0" );
315
+ header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
316
+ header( "Content-Type: application/octet-stream" );
317
+ header( "Content-Disposition: attachment; filename=BackWPup_cmd_start_job_" . $_GET[ 'jobid' ] . ".sh;" );
318
+ if ( defined( 'PHP_BINDIR' ) )
319
+ echo "#!/bin/sh" . PHP_EOL;
320
+ echo "@\$1php -c \"" . php_ini_loaded_file() . "\" -r \"\$_SERVER[ 'SERVER_ADDR' ] = '". $_SERVER[ 'SERVER_ADDR' ] ."'; \$_SERVER[ 'REMOTE_ADDR' ] = '". $_SERVER[ 'REMOTE_ADDR' ] ."'; \$_SERVER[ 'HTTP_HOST' ] = '". $_SERVER[ 'HTTP_HOST' ] ."'; \$_SERVER[ 'HTTP_USER_AGENT' ] = '". BackWPup::get_plugin_data( 'name' ) ."'; define( 'DOING_CRON', TRUE ); require '" . ABSPATH . "wp-load.php'; if( class_exists( 'BackWPup_Job' ) ) BackWPup_Job::start_cli( " . $_GET[ 'jobid' ] . " );\"";
321
+ die();
322
+ }
323
+ else {
324
+ header( "Pragma: public" );
325
+ header( "Expires: 0" );
326
+ header( "Cache-Control: must-revalidate, post-check=0, pre-check=0" );
327
+ header( "Content-Type: application/octet-stream" );
328
+ header( "Content-Disposition: attachment; filename=BackWPup_cmd_start_job_" . $_GET[ 'jobid' ] . ".cmd;" );
329
+ echo "@%1php.exe -c \"" . php_ini_loaded_file() . "\" -r \"\$_SERVER[ 'SERVER_ADDR' ] = '". $_SERVER[ 'SERVER_ADDR' ] ."'; \$_SERVER[ 'REMOTE_ADDR' ] = '". $_SERVER[ 'REMOTE_ADDR' ] ."'; \$_SERVER[ 'HTTP_HOST' ] = '". $_SERVER[ 'HTTP_HOST' ] ."'; \$_SERVER[ 'HTTP_USER_AGENT' ] = '". BackWPup::get_plugin_data( 'name' ) ."'; define( 'DOING_CRON', TRUE ); require '" . ABSPATH . "wp-load.php'; if( class_exists( 'BackWPup_Job' ) ) BackWPup_Job::start_cli( " . $_GET[ 'jobid' ] . " );\"";
330
+ die();
331
+ }
332
+ break;
333
+ case 'runnow':
334
+ if ( ! empty( $_GET[ 'jobid' ] ) ) {
335
+ if ( ! current_user_can( 'backwpup_jobs_start' ) )
336
+ wp_die( __( 'Sorry, you don\'t have permissions to do that.', 'backwpup') );
337
+ check_admin_referer( 'backwpup_job_run-runnowlink' );
338
+
339
+ //check temp folder
340
+ BackWPup_Job::check_folder( BackWPup::get_plugin_data( 'TEMP' ), TRUE );
341
+ //check log folder
342
+ BackWPup_Job::check_folder( get_site_option( 'backwpup_cfg_logfolder' ) );
343
+ //check server callback
344
+ $raw_response = BackWPup_Job::get_jobrun_url( 'test' );
345
+ $test_result = '';
346
+ if ( is_wp_error( $raw_response ) )
347
+ $test_result .= sprintf( __( 'The HTTP response test get an error "%s"','backwpup' ), $raw_response->get_error_message() );
348
+ elseif ( 200 != wp_remote_retrieve_response_code( $raw_response ) && 204 != wp_remote_retrieve_response_code( $raw_response ) )
349
+ $test_result .= sprintf( __( 'The HTTP response test get a false http status (%s)','backwpup' ), wp_remote_retrieve_response_code( $raw_response ) );
350
+ if ( ! empty( $test_result ) )
351
+ BackWPup_Admin::message( $test_result, TRUE );
352
+
353
+ //only start job if messages empty
354
+ $log_messages = BackWPup_Admin::get_messages();
355
+ if ( empty ( $log_messages ) ) {
356
+ $old_log_file = BackWPup_Option::get( $_GET[ 'jobid' ], 'logfile' );
357
+ BackWPup_Job::get_jobrun_url( 'runnow', $_GET[ 'jobid' ] );
358
+ usleep( 250000 ); //wait a quarter second
359
+ $new_log_file = BackWPup_Option::get( $_GET[ 'jobid' ], 'logfile', NULL, FALSE );
360
+ //sleep as long as job not started
361
+ $i=0;
362
+ while ( $old_log_file == $new_log_file ) {
363
+ usleep( 250000 ); //wait a quarter second for next try
364
+ $new_log_file = BackWPup_Option::get( $_GET[ 'jobid' ], 'logfile', NULL, FALSE );
365
+ //wait maximal 10 sec.
366
+ if ( $i >= 40 ) {
367
+ BackWPup_Admin::message( sprintf( __( 'Job “%s” has started, but not responded for 10 seconds.', 'backwpup' ), esc_attr( BackWPup_Option::get( $_GET[ 'jobid' ], 'name' ) ) ), TRUE );
368
+ break 2;
369
+ }
370
+ $i++;
371
+ }
372
+ BackWPup_Admin::message( sprintf( __( 'Job "%s" started.', 'backwpup' ), esc_attr( BackWPup_Option::get( $_GET[ 'jobid' ], 'name' ) ) ) );
373
+ }
374
+ }
375
+ break;
376
+ case 'abort': //Abort Job
377
+ if ( ! current_user_can( 'backwpup_jobs_start' ) )
378
+ break;
379
+ check_admin_referer( 'abort-job' );
380
+ if ( ! file_exists( BackWPup::get_plugin_data( 'running_file' ) ) )
381
+ break;
382
+ //abort
383
+ BackWPup_Job::user_abort();
384
+ BackWPup_Admin::message( __( 'Job will be terminated.', 'backwpup' ) ) ;
385
+ break;
386
+ default:
387
+ do_action( 'backwpup_page_jobs_load', self::$listtable->current_action() );
388
+ break;
389
+ }
390
+
391
+ self::$listtable->prepare_items();
392
+ }
393
+
394
+ /**
395
+ *
396
+ */
397
+ public static function admin_print_styles() {
398
+
399
+ ?>
400
+ <style type="text/css" media="screen">
401
+
402
+ .column-last, .column-next, .column-type, .column-dest {
403
+ width: 15%;
404
+ }
405
+
406
+ #TB_ajaxContent {
407
+ background-color: black;
408
+ color: white;
409
+ }
410
+
411
+ #showworking {
412
+ white-space:nowrap;
413
+ display: block;
414
+ width: 100%;
415
+ font-family:monospace;
416
+ font-size:12px;
417
+ line-height:15px;
418
+ }
419
+ #runningjob {
420
+ padding:10px;
421
+ position:relative;
422
+ margin: 15px 0 25px 0;
423
+ padding-bottom:25px;
424
+ }
425
+ h2#runnigtitle {
426
+ margin-bottom: 15px;
427
+ padding: 0;
428
+ }
429
+ #warningsid, #errorid {
430
+ margin-right: 10px;
431
+ }
432
+
433
+ .infobuttons {
434
+ position: absolute;
435
+ right: 10px;
436
+ bottom: 0;
437
+ }
438
+
439
+ .progressbar {
440
+ margin-top: 20px;
441
+ height: auto;
442
+ background: #f6f6f6 url('<?php echo BackWPup::get_plugin_data( 'URL' );?>/assets/images/progressbarhg.jpg');
443
+ }
444
+
445
+ #lastmsg, #onstep, #lasterrormsg {
446
+ text-align: center;
447
+ margin-bottom: 20px;
448
+ }
449
+ #backwpup-page #lastmsg,
450
+ #backwpup-page #onstep,
451
+ #backwpup-page #lasterrormsg {
452
+ font-family: "Open Sans", sans-serif;
453
+ }
454
+ .bwpu-progress {
455
+ background-color: #1d94cf;
456
+ color: #fff;
457
+ padding: 5px 0;
458
+ text-align: center;
459
+ }
460
+ #progresssteps {
461
+ background-color: #007fb6;
462
+ }
463
+
464
+ .row-actions .lastlog {
465
+ display: none;
466
+ }
467
+
468
+ @media screen and (max-width: 782px) {
469
+ .column-type, .column-dest {
470
+ display: none;
471
+ }
472
+ .row-actions .lastlog {
473
+ display: inline-block;
474
+ }
475
+ .last-action-links {
476
+ display: none;
477
+ }
478
+ }
479
+ </style>
480
+ <?php
481
+ }
482
+
483
+ /**
484
+ *
485
+ */
486
+ public static function admin_print_scripts() {
487
+
488
+ wp_enqueue_script( 'backwpupgeneral' );
489
+ }
490
+
491
+ /**
492
+ *
493
+ */
494
+ public static function page() {
495
+
496
+ echo '<div class="wrap" id="backwpup-page">';
497
+ echo '<h2><span id="backwpup-page-icon">&nbsp;</span>' . esc_html( sprintf( __( '%s Jobs', 'backwpup' ), BackWPup::get_plugin_data( 'name' ) ) ) . '&nbsp;<a href="' . wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpupeditjob', 'edit-job' ) . '" class="add-new-h2">' . esc_html__( 'Add new', 'backwpup' ) . '</a></h2>';
498
+ BackWPup_Admin::display_messages();
499
+ $job_object = BackWPup_Job::get_working_data();
500
+ if ( current_user_can( 'backwpup_jobs_start' ) && is_object( $job_object ) ) {
501
+
502
+ //read existing logfile
503
+ $logfiledata = file_get_contents( $job_object->logfile );
504
+ preg_match( '/<body[^>]*>/si', $logfiledata, $match );
505
+ if ( ! empty( $match[ 0 ] ) )
506
+ $startpos = strpos( $logfiledata, $match[ 0 ] ) + strlen( $match[ 0 ] );
507
+ else
508
+ $startpos = 0;
509
+ $endpos = stripos( $logfiledata, '</body>' );
510
+ if ( empty( $endpos ) )
511
+ $endpos = strlen( $logfiledata );
512
+ $length = strlen( $logfiledata ) - ( strlen( $logfiledata ) - $endpos ) - $startpos;
513
+
514
+ ?>
515
+ <div id="runningjob">
516
+ <div id="runniginfos">
517
+ <h2 id="runningtitle"><?php sprintf( __('Job currently running: %s','backwpup'), $job_object->job[ 'name' ] ); ?></h2>
518
+ <span id="warningsid"><?php _e( 'Warnings:', 'backwpup' ); ?> <span id="warnings"><?php echo $job_object->warnings; ?></span></span>
519
+ <span id="errorid"><?php _e( 'Errors:', 'backwpup' ); ?> <span id="errors"><?php echo $job_object->errors; ?></span></span>
520
+ <div class="infobuttons"><a href="#TB_inline?height=440&width=630&inlineId=tb-showworking" id="showworkingbutton" class="thickbox button button-primary button-primary-bwp" title="<?php _e( 'Log of running job', 'backwpup'); ?>"><?php _e( 'Display working log', 'backwpup' ); ?></a>
521
+ <a href="<?php echo wp_nonce_url( network_admin_url( 'admin.php' ) . '?page=backwpupjobs&action=abort', 'abort-job' ); ?>" id="abortbutton" class="backwpup-fancybox button button-bwp"><?php _e( 'Abort', 'backwpup' ); ?></a>
522
+ <a href="#" id="showworkingclose" title="<?php _e( 'Close working screen', 'backwpup'); ?>" class="button button-bwp" style="display:none" ><?php _e( 'close', 'backwpup' ); ?></a></div>
523
+ </div>
524
+ <input type="hidden" name="logpos" id="logpos" value="<?php echo strlen( $logfiledata ); ?>">
525
+ <div id="lasterrormsg"></div>
526
+ <div class="progressbar"><div id="progressstep" class="bwpu-progress" style="width:<?php echo $job_object->step_percent; ?>%;"><?php echo $job_object->step_percent; ?>%</div></div>
527
+ <div id="onstep"><?php echo $job_object->steps_data[ $job_object->step_working ][ 'NAME' ]; ?></div>
528
+ <div class="progressbar"><div id="progresssteps" class="bwpu-progress" style="width:<?php echo $job_object->substep_percent; ?>%;"><?php echo $job_object->substep_percent; ?>%</div></div>
529
+ <div id="lastmsg"><?php echo $job_object->lastmsg; ?></div>
530
+ <div id="tb-showworking" style="display:none;">
531
+ <div id="showworking"><?php echo substr( $logfiledata, $startpos, $length ); ?></div>
532
+ </div>
533
+ </div>
534
+ <?php }
535
+
536
+ //display jos Table
537
+ ?>
538
+ <form id="posts-filter" action="" method="get">
539
+ <input type="hidden" name="page" value="backwpupjobs" />
540
+ <?php
541
+ echo wp_nonce_field( 'backwpup_ajax_nonce', 'backwpupajaxnonce', FALSE );
542
+ self::$listtable->display();
543
+ ?>
544
+ <div id="ajax-response"></div>
545
+ </form>
546
+ </div>
547
+ <?php
548
+
549
+ if ( ! empty( $job_object->logfile ) ) { ?>
550
+ <script type="text/javascript">
551
+ //<![CDATA[
552
+ jQuery(document).ready(function ($) {
553
+ backwpup_show_working = function () {
554
+ $.ajax({
555
+ type: 'GET',
556
+ url: ajaxurl,
557
+ cache: false,
558
+ data:{
559
+ action: 'backwpup_working',
560
+ logpos: $('#logpos').val(),
561
+ logfile: '<?php echo basename( $job_object->logfile );?>',
562
+ _ajax_nonce: '<?php echo wp_create_nonce( 'backwpupworking_ajax_nonce' );?>'
563
+ },
564
+ dataType: 'json',
565
+ success:function (rundata) {
566
+ if ( rundata == 0 ) {
567
+ $("#abortbutton").remove();
568
+ $("#backwpup-adminbar-running").remove();
569
+ $(".job-run").hide();
570
+ $("#message").hide();
571
+ $(".job-normal").show();
572
+ $('#showworkingclose').show();
573
+ }
574
+ if (0 < rundata.log_pos) {
575
+ $('#logpos').val(rundata.log_pos);
576
+ }
577
+ if ('' != rundata.log_text) {
578
+ $('#showworking').append(rundata.log_text);
579
+ $('#TB_ajaxContent').scrollTop(rundata.log_pos * 15);
580
+ }
581
+ if (0 < rundata.error_count) {
582
+ $('#errors').replaceWith('<span id="errors">' + rundata.error_count + '</span>');
583
+ }
584
+ if (0 < rundata.warning_count) {
585
+ $('#warnings').replaceWith('<span id="warnings">' + rundata.warning_count + '</span>');
586
+ }
587
+ if (0 < rundata.step_percent) {
588
+ $('#progressstep').replaceWith('<div id="progressstep" class="bwpu-progress">' + rundata.step_percent + '%</div>');
589
+ $('#progressstep').css('width', parseFloat(rundata.step_percent) + '%');
590
+ }
591
+ if (0 < rundata.sub_step_percent) {
592
+ $('#progresssteps').replaceWith('<div id="progresssteps" class="bwpu-progress">' + rundata.sub_step_percent + '%</div>');
593
+ $('#progresssteps').css('width', parseFloat(rundata.sub_step_percent) + '%');
594
+ }
595
+ if (0 < rundata.running_time) {
596
+ $('#runtime').replaceWith('<span id="runtime">' + rundata.running_time + '</span>');
597
+ }
598
+ if ( '' != rundata.onstep ) {
599
+ $('#onstep').replaceWith('<div id="onstep">' + rundata.on_step + '</div>');
600
+ }
601
+ if ( '' != rundata.last_msg ) {
602
+ $('#lastmsg').replaceWith('<div id="lastmsg">' + rundata.last_msg + '</div>');
603
+ }
604
+ if ( '' != rundata.last_error_msg ) {
605
+ $('#lasterrormsg').replaceWith('<div id="lasterrormsg">' + rundata.last_error_msg + '</div>');
606
+ }
607
+ if ( rundata.job_done == 1 ) {
608
+ $("#abortbutton").remove();
609
+ $("#backwpup-adminbar-running").remove();
610
+ $(".job-run").hide();
611
+ $("#message").hide();
612
+ $(".job-normal").show();
613
+ $('#showworkingclose').show();
614
+ } else {
615
+ setTimeout('backwpup_show_working()', 750);
616
+ }
617
+ },
618
+ error:function ( ) {
619
+ setTimeout('backwpup_show_working()', 750);
620
+ }
621
+ });
622
+ };
623
+ backwpup_show_working();
624
+ $('#showworkingclose').click( function() {
625
+ $("#runningjob").hide( 'slow' );
626
+ return false;
627
+ });
628
+ });
629
+ //]]>
630
+ </script>
631
+ <?php }
632
+ }
633
+
634
+
635
+ /**
636
+ *
637
+ * Function to generate json data
638
+ *
639
+ */
640
+ public static function ajax_working() {
641
+
642
+ check_ajax_referer( 'backwpupworking_ajax_nonce' );
643
+
644
+ $logfile = isset( $_GET[ 'logfile' ] ) ? get_site_option( 'backwpup_cfg_logfolder' ) . trim( $_GET[ 'logfile' ] ) : NULL;
645
+ $logpos = isset( $_GET[ 'logpos' ] ) ? (int)$_GET[ 'logpos' ] : 0;
646
+
647
+ //check if logfile renamed
648
+ if ( file_exists( $logfile . '.gz' ) )
649
+ $logfile .= '.gz';
650
+
651
+ if ( ! is_readable( $logfile ) )
652
+ die( '0' );
653
+
654
+ $job_object = BackWPup_Job::get_working_data();
655
+ $done = 0;
656
+ if ( is_object( $job_object ) ) {
657
+ $warnings = $job_object->warnings;
658
+ $errors = $job_object->errors;
659
+ $step_percent = $job_object->step_percent;
660
+ $substep_percent = $job_object->substep_percent;
661
+ $runtime = current_time( 'timestamp' ) - $job_object->start_time;
662
+ $onstep = $job_object->steps_data[ $job_object->step_working ][ 'NAME' ];
663
+ $lastmsg = $job_object->lastmsg;
664
+ $lasterrormsg = $job_object->lasterrormsg;
665
+ } else {
666
+ $logheader = BackWPup_Job::read_logheader( $logfile );
667
+ $warnings = $logheader[ 'warnings' ];
668
+ $runtime = $logheader[ 'runtime' ];
669
+ $errors = $logheader[ 'errors' ];
670
+ $step_percent = 100;
671
+ $substep_percent = 100;
672
+ $onstep = '<div class="backwpup-message backwpup-info"><p>' . __( 'Job completed' , 'backwpup' ) . '</p></div>';
673
+ if ( $errors > 0 )
674
+ $lastmsg = '<div class="error"><p>' . __( 'ERROR:', 'backwpup' ) . ' ' . sprintf( __( 'Job has ended with errors in %s seconds. You must resolve the errors for correct execution.', 'backwpup' ), $logheader[ 'runtime' ] ) . '</p></div>';
675
+ elseif ( $warnings > 0 )
676
+ $lastmsg = '<div class="backwpup-message backwpup-warning"><p>' . __( 'WARNING:', 'backwpup' ) . ' ' . sprintf( __( 'Job has done with warnings in %s seconds. Please resolve them for correct execution.', 'backwpup' ), $logheader[ 'runtime' ] ) . '</p></div>';
677
+ else
678
+ $lastmsg = '<div class="updated"><p>' . sprintf( __( 'Job done in %s seconds.', 'backwpup' ), $logheader[ 'runtime' ] ) . '</p></div>';
679
+ $lasterrormsg = '';
680
+ $done = 1;
681
+ }
682
+
683
+ if ( '.gz' == substr( $logfile, -3 ) )
684
+ $logfiledata = file_get_contents( 'compress.zlib://' . $logfile, FALSE, NULL, $logpos );
685
+ else
686
+ $logfiledata = file_get_contents( $logfile, FALSE, NULL, $logpos );
687
+
688
+ preg_match( '/<body[^>]*>/si', $logfiledata, $match );
689
+ if ( ! empty( $match[ 0 ] ) )
690
+ $startpos = strpos( $logfiledata, $match[ 0 ] ) + strlen( $match[ 0 ] );
691
+ else
692
+ $startpos = 0;
693
+
694
+ $endpos = stripos( $logfiledata, '</body>' );
695
+ if ( FALSE === $endpos )
696
+ $endpos = strlen( $logfiledata );
697
+
698
+ $length = strlen( $logfiledata ) - ( strlen( $logfiledata ) - $endpos ) - $startpos;
699
+
700
+ wp_send_json( array(
701
+ 'log_pos' => strlen( $logfiledata ) + $logpos,
702
+ 'log_text' => substr( $logfiledata, $startpos, $length ),
703
+ 'warning_count' => $warnings,
704
+ 'error_count' => $errors,
705
+ 'running_time' => $runtime,
706
+ 'step_percent' => $step_percent,
707
+ 'on_step' => $onstep,
708
+ 'last_msg' => $lastmsg,
709
+ 'last_error_msg' => $lasterrormsg,
710
+ 'sub_step_percent'=> $substep_percent,
711
+ 'job_done' => $done
712
+ ) );
713
+ }
714
+
715
+ }
716
+
inc/class-page-settings.php CHANGED
@@ -1,457 +1,457 @@
1
- <?php
2
- /**
3
- * Class for BackWPup settings page
4
- */
5
- class BackWPup_Page_Settings {
6
-
7
- /**
8
- *
9
- * Output js
10
- *
11
- * @return void
12
- */
13
- public static function admin_print_scripts() {
14
-
15
- wp_enqueue_script( 'backwpupgeneral' );
16
-
17
- if ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) {
18
- wp_enqueue_script( 'backwpuppagesettings', BackWPup::get_plugin_data( 'URL' ) . '/assets/js/page_settings.js', array( 'jquery' ), time(), TRUE );
19
- } else {
20
- wp_enqueue_script( 'backwpuppagesettings', BackWPup::get_plugin_data( 'URL' ) . '/assets/js/page_settings.min.js', array( 'jquery' ), BackWPup::get_plugin_data( 'Version' ), TRUE );
21
- }
22
- }
23
-
24
-
25
- /**
26
- * Save settings form data
27
- */
28
- public static function save_post_form() {
29
-
30
- if ( ! current_user_can( 'backwpup_settings' ) )
31
- return;
32
-
33
- //set default options if button clicked
34
- if ( isset( $_POST[ 'default_settings' ] ) && $_POST[ 'default_settings' ] ) {
35
-
36
- delete_site_option( 'backwpup_cfg_showadminbar' );
37
- delete_site_option( 'backwpup_cfg_showfoldersize' );
38
- delete_site_option( 'backwpup_cfg_jobstepretry' );
39
- delete_site_option( 'backwpup_cfg_jobmaxexecutiontime' );
40
- delete_site_option( 'backwpup_cfg_jobziparchivemethod' );
41
- delete_site_option( 'backwpup_cfg_jobnotranslate' );
42
- delete_site_option( 'backwpup_cfg_jobwaittimems' );
43
- delete_site_option( 'backwpup_cfg_jobrunauthkey' );
44
- delete_site_option( 'backwpup_cfg_maxlogs' );
45
- delete_site_option( 'backwpup_cfg_gzlogs' );
46
- delete_site_option( 'backwpup_cfg_protectfolders' );
47
- delete_site_option( 'backwpup_cfg_httpauthuser' );
48
- delete_site_option( 'backwpup_cfg_httpauthpassword' );
49
- delete_site_option( 'backwpup_cfg_logfolder' );
50
- delete_site_option( 'backwpup_cfg_dropboxappkey' );
51
- delete_site_option( 'backwpup_cfg_dropboxappsecret' );
52
- delete_site_option( 'backwpup_cfg_dropboxsandboxappkey' );
53
- delete_site_option( 'backwpup_cfg_dropboxsandboxappsecret' );
54
- delete_site_option( 'backwpup_cfg_sugarsynckey' );
55
- delete_site_option( 'backwpup_cfg_sugarsyncsecret' );
56
- delete_site_option( 'backwpup_cfg_sugarsyncappid' );
57
-
58
- BackWPup_Option::default_site_options();
59
-
60
- BackWPup_Admin::message( __( 'Settings reset to default', 'backwpup' ) );
61
- return;
62
- }
63
-
64
- update_site_option( 'backwpup_cfg_showadminbar', isset( $_POST[ 'showadminbar' ] ) ? 1 : 0 );
65
- update_site_option( 'backwpup_cfg_showfoldersize', isset( $_POST[ 'showfoldersize' ] ) ? 1 : 0 );
66
- if ( 100 > $_POST[ 'jobstepretry' ] && 0 < $_POST[ 'jobstepretry' ] )
67
- $_POST[ 'jobstepretry' ] = abs( (int)$_POST[ 'jobstepretry' ] );
68
- if ( empty( $_POST[ 'jobstepretry' ] ) or ! is_int( $_POST[ 'jobstepretry' ] ) )
69
- $_POST[ 'jobstepretry' ] = 3;
70
- update_site_option( 'backwpup_cfg_jobstepretry', $_POST[ 'jobstepretry' ] );
71
- $max_exe_time = abs( (int)$_POST[ 'jobmaxexecutiontime' ] );
72
- if ( ! is_int( $max_exe_time ) || $max_exe_time < 0 ) {
73
- $max_exe_time = 0;
74
- } elseif ( $max_exe_time > 300 ) {
75
- $max_exe_time = 300;
76
- }
77
- update_site_option( 'backwpup_cfg_jobmaxexecutiontime', $max_exe_time );
78
- update_site_option( 'backwpup_cfg_jobziparchivemethod', ( $_POST[ 'jobziparchivemethod' ] == '' || $_POST[ 'jobziparchivemethod' ] == 'PclZip' || $_POST[ 'jobziparchivemethod' ] == 'ZipArchive' ) ? $_POST[ 'jobziparchivemethod' ] : '' );
79
- update_site_option( 'backwpup_cfg_jobnotranslate', isset( $_POST[ 'jobnotranslate' ] ) ? 1 : 0 );
80
- update_site_option( 'backwpup_cfg_jobwaittimems', $_POST[ 'jobwaittimems' ] );
81
- update_site_option( 'backwpup_cfg_maxlogs', abs( (int)$_POST[ 'maxlogs' ] ) );
82
- update_site_option( 'backwpup_cfg_gzlogs', isset( $_POST[ 'gzlogs' ] ) ? 1 : 0 );
83
- update_site_option( 'backwpup_cfg_protectfolders', isset( $_POST[ 'protectfolders' ] ) ? 1 : 0 );
84
- update_site_option( 'backwpup_cfg_httpauthuser', $_POST[ 'httpauthuser' ] );
85
- update_site_option( 'backwpup_cfg_httpauthpassword', BackWPup_Encryption::encrypt( $_POST[ 'httpauthpassword' ] ) );
86
- $_POST[ 'jobrunauthkey' ] = preg_replace( '/[^a-zA-Z0-9]/', '', trim( $_POST[ 'jobrunauthkey' ] ) );
87
- update_site_option( 'backwpup_cfg_jobrunauthkey', $_POST[ 'jobrunauthkey' ] );
88
- $_POST[ 'logfolder' ] = trailingslashit( str_replace( '\\', '/', trim( stripslashes( $_POST[ 'logfolder' ] ) ) ) );
89
- if ( $_POST[ 'logfolder' ][ 0 ] == '.' || ( $_POST[ 'logfolder' ][ 0 ] != '/' && ! preg_match( '#^[a-zA-Z]:/#', $_POST[ 'logfolder' ] ) ) )
90
- $_POST[ 'logfolder' ] = trailingslashit( str_replace( '\\', '/', ABSPATH ) ) . $_POST[ 'logfolder' ];
91
- //set def. folders
92
- if ( empty( $_POST[ 'logfolder' ] ) || $_POST[ 'logfolder' ] == '/' ) {
93
- delete_site_option( 'backwpup_cfg_logfolder' );
94
- BackWPup_Option::default_site_options();
95
- } else {
96
- update_site_option( 'backwpup_cfg_logfolder', $_POST[ 'logfolder' ] );
97
- }
98
-
99
- do_action( 'backwpup_page_settings_save' );
100
-
101
- BackWPup_Admin::message( __( 'Settings saved', 'backwpup' ) );
102
- }
103
-
104
- /**
105
- * Page Output
106
- */
107
- public static function page() {
108
- global $wpdb;
109
-
110
- ?>
111
- <div class="wrap" id="backwpup-page">
112
- <h2><span id="backwpup-page-icon">&nbsp;</span><?php echo sprintf( __( '%s Settings', 'backwpup' ), BackWPup::get_plugin_data( 'name' ) ); ?></h2>
113
- <?php
114
- $tabs = array( 'general' => __( 'General', 'backwpup' ), 'job' => __( 'Jobs', 'backwpup' ), 'log' => __( 'Logs', 'backwpup' ), 'net' => __( 'Network', 'backwpup' ), 'apikey' => __( 'API Keys', 'backwpup' ), 'information' => __( 'Information', 'backwpup' ) );
115
- $tabs = apply_filters( 'backwpup_page_settings_tab', $tabs );
116
- echo '<h2 class="nav-tab-wrapper">';
117
- foreach ( $tabs as $id => $name ) {
118
- echo '<a href="#backwpup-tab-' . $id . '" class="nav-tab">' . $name . '</a>';
119
- }
120
- echo '</h2>';
121
- BackWPup_Admin::display_messages();
122
- ?>
123
-
124
- <form id="settingsform" action="<?php echo admin_url( 'admin-post.php?action=backwpup' ); ?>" method="post">
125
- <?php wp_nonce_field( 'backwpupsettings_page' ); ?>
126
- <input type="hidden" name="page" value="backwpupsettings" />
127
- <input type="hidden" name="anchor" value="#backwpup-tab-general" />
128
-
129
- <div class="table ui-tabs-hide" id="backwpup-tab-general">
130
-
131
- <h3 class="title"><?php _e( 'Display Settings', 'backwpup' ); ?></h3>
132
- <p><?php _e( 'Do you want to see BackWPup in the WordPress admin bar?', 'backwpup' ); ?></p>
133
- <table class="form-table">
134
- <tr>
135
- <th scope="row"><?php _e( 'Admin bar', 'backwpup' ); ?></th>
136
- <td>
137
- <fieldset>
138
- <legend class="screen-reader-text"><span><?php _e( 'Admin Bar', 'backwpup' ); ?></span>
139
- </legend>
140
- <label for="showadminbar">
141
- <input name="showadminbar" type="checkbox" id="showadminbar"
142
- value="1" <?php checked( get_site_option( 'backwpup_cfg_showadminbar' ), TRUE ); ?> />
143
- <?php _e( 'Show BackWPup links in admin bar.', 'backwpup' ); ?></label>
144
- </fieldset>
145
- </td>
146
- </tr>
147
- <tr>
148
- <th scope="row"><?php _e( 'Folder sizes', 'backwpup' ); ?></th>
149
- <td>
150
- <fieldset>
151
- <legend class="screen-reader-text"><span><?php _e( 'Folder sizes', 'backwpup' ); ?></span>
152
- </legend>
153
- <label for="showfoldersize">
154
- <input name="showfoldersize" type="checkbox" id="showfoldersize"
155
- value="1" <?php checked( get_site_option( 'backwpup_cfg_showfoldersize' ), TRUE ); ?> />
156
- <?php _e( 'Display folder sizes in the files tab when editing a job. (Might increase loading time of files tab.)', 'backwpup' ); ?></label>
157
- </fieldset>
158
- </td>
159
- </tr>
160
- </table>
161
- <h3 class="title"><?php _e( 'Security', 'backwpup' ); ?></h3>
162
- <p><?php _e( 'Security option for BackWPup', 'backwpup' ); ?></p>
163
- <table class="form-table">
164
- <tr>
165
- <th scope="row"><?php _e( 'Protect folders', 'backwpup' ); ?></th>
166
- <td>
167
- <fieldset>
168
- <legend class="screen-reader-text"><span><?php _e( 'Protect folders', 'backwpup' ); ?></span>
169
- </legend>
170
- <label for="protectfolders">
171
- <input name="protectfolders" type="checkbox" id="protectfolders"
172
- value="1" <?php checked( get_site_option( 'backwpup_cfg_protectfolders' ), TRUE ); ?> />
173
- <?php _e( 'Protect BackWPup folders ( Temp, Log and Backups ) with <code>.htaccess</code> and <code>index.php</code>', 'backwpup' ); ?>
174
- </label>
175
- </fieldset>
176
- </td>
177
- </tr>
178
- </table>
179
-
180
- <?php do_action('backwpup_page_settings_tab_generel'); ?>
181
-
182
- </div>
183
-
184
- <div class="table ui-tabs-hide" id="backwpup-tab-log">
185
-
186
- <p><?php _e( 'Every time BackWPup runs a backup job, a log file is being generated. Choose where to store your log files and how many of them.', 'backwpup' ); ?></p>
187
- <table class="form-table">
188
- <tr>
189
- <th scope="row"><label for="logfolder"><?php _e( 'Log file folder', 'backwpup' ); ?></label></th>
190
- <td>
191
- <input name="logfolder" type="text" id="logfolder"
192
- value="<?php echo get_site_option( 'backwpup_cfg_logfolder' );?>"
193
- class="regular-text code"/>
194
- </td>
195
- </tr>
196
- <tr>
197
- <th scope="row"><label for="maxlogs"><?php _e( 'Maximum number of log files in folder', 'backwpup' ); ?></label>
198
- </th>
199
- <td>
200
- <input name="maxlogs" type="text" id="maxlogs" title="<?php esc_attr_e( 'Oldest files will be deleted first.', 'backwpup' ); ?>"
201
- value="<?php echo get_site_option( 'backwpup_cfg_maxlogs' );?>" class="small-text code help-tip"/>
202
- </td>
203
- </tr>
204
- <tr>
205
- <th scope="row"><?php _e( 'Compression', 'backwpup' ); ?></th>
206
- <td>
207
- <fieldset>
208
- <legend class="screen-reader-text"><span><?php _e( 'Compression', 'backwpup' ); ?></span>
209
- </legend>
210
- <label for="gzlogs">
211
- <input name="gzlogs" type="checkbox" id="gzlogs"
212
- value="1" <?php checked( get_site_option( 'backwpup_cfg_gzlogs' ), TRUE ); ?><?php if ( ! function_exists( 'gzopen' ) ) echo " disabled=\"disabled\""; ?> />
213
- <?php _e( 'Compress log files with GZip.', 'backwpup' ); ?></label>
214
- </fieldset>
215
- </td>
216
- </tr>
217
- </table>
218
-
219
- </div>
220
- <div class="table ui-tabs-hide" id="backwpup-tab-job">
221
-
222
- <p><?php _e( 'There are a couple of general options for backup jobs. Set them here.', 'backwpup' ); ?></p>
223
- <table class="form-table">
224
- <tr>
225
- <th scope="row">
226
- <label for="jobstepretry"><?php _e( "Maximum number of retries for job steps", 'backwpup' ); ?></label></th>
227
- <td>
228
- <input name="jobstepretry" type="text" id="jobstepretry"
229
- value="<?php echo get_site_option( 'backwpup_cfg_jobstepretry' );?>"
230
- class="small-text code" />
231
- </td>
232
- </tr>
233
- <tr>
234
- <th scope="row"><?php _e( 'Maximum script execution time', 'backwpup' ); ?></th>
235
- <td>
236
- <fieldset>
237
- <legend class="screen-reader-text"><span><?php _e( 'Maximum PHP Script execution time', 'backwpup' ); ?></span>
238
- </legend>
239
- <label for="jobmaxexecutiontime">
240
- <input name="jobmaxexecutiontime" type="text" id="jobmaxexecutiontime" size="3" title="<?php esc_attr_e( 'Job will restart before hitting maximum execution time. It will not work with CLI and not on every step during execution. If <code>ALTERNATE_WP_CRON</code> has been defined, WordPress Cron will be used.', 'backwpup' ); ?>"
241
- value="<?php echo get_site_option( 'backwpup_cfg_jobmaxexecutiontime' ); ?>" class="help-tip" />
242
- <?php _e( 'seconds. 0 = disabled.', 'backwpup' ); ?>
243
- </label>
244
- </fieldset>
245
- </td>
246
- </tr>
247
- <tr>
248
- <th scope="row"><?php _e( 'Method for creating ZIP-file archives', 'backwpup' ); ?></th>
249
- <td>
250
- <fieldset>
251
- <legend class="screen-reader-text"><span><?php _e( 'Method for creating ZIP-file archives', 'backwpup' ); ?></span>
252
- </legend>
253
- <label for="jobziparchivemethod">
254
- <select name="jobziparchivemethod" size="1" class="help-tip" title="<?php esc_attr_e( 'Auto = Uses PHP class ZipArchive if available; otherwise uses PclZip.<br />ZipArchive = Uses less memory, but many open files at a time.<br />PclZip = Uses more memory, but only 2 open files at a time.', 'backwpup' ); ?>">
255
- <option value="" <?php selected( get_site_option( 'backwpup_cfg_jobziparchivemethod' ), '' ); ?>><?php _e( 'Auto', 'backwpup' ); ?></option>
256
- <option value="ZipArchive" <?php selected( get_site_option( 'backwpup_cfg_jobziparchivemethod' ), 'ZipArchive' ); ?><?php disabled( function_exists( 'ZipArchive' ), TRUE ); ?>><?php _e( 'ZipArchive', 'backwpup' ); ?></option>
257
- <option value="PclZip" <?php selected( get_site_option( 'backwpup_cfg_jobziparchivemethod' ), 'PclZip' ); ?>><?php _e( 'PclZip', 'backwpup' ); ?></option>
258
- </select>
259
- </label>
260
- </fieldset>
261
- </td>
262
- </tr>
263
- <tr>
264
- <th scope="row">
265
- <label for="jobrunauthkey"><?php _e( 'Key to start jobs externally with an URL', 'backwpup' ); ?></label>
266
- </th>
267
- <td>
268
- <input name="jobrunauthkey" type="text" id="jobrunauthkey" title="<?php esc_attr_e( 'empty = deactivated. Will be used to protect job starts from unauthorized person.', 'backwpup' ); ?>"
269
- value="<?php echo get_site_option( 'backwpup_cfg_jobrunauthkey' );?>" class="text code help-tip"/>
270
- </td>
271
- </tr>
272
- <tr>
273
- <th scope="row"><?php _e( 'No translation', 'backwpup' ); ?></th>
274
- <td>
275
- <fieldset>
276
- <legend class="screen-reader-text"><span><?php _e( 'No Translation', 'backwpup' ); ?></span>
277
- </legend>
278
- <label for="jobnotranslate">
279
- <input name="jobnotranslate" type="checkbox" id="jobnotranslate"
280
- value="1" <?php checked( get_site_option( 'backwpup_cfg_jobnotranslate' ), TRUE ); ?> />
281
- <?php _e( 'No translation for the job, the log will be written in English', 'backwpup' ); ?>
282
- </label>
283
- </fieldset>
284
- </td>
285
- </tr>
286
- <tr>
287
- <th scope="row"><?php _e( 'Reduce server load', 'backwpup' ); ?></th>
288
- <td>
289
- <fieldset>
290
- <legend class="screen-reader-text"><span><?php _e( 'Reduce server load', 'backwpup' ); ?></span>
291
- </legend>
292
- <label for="jobwaittimems">
293
- <select name="jobwaittimems" size="1" class="help-tip" title="<?php esc_attr_e( 'This adds short pauses to the process. Can be used to reduce the CPU load.<br /> Disabled = off<br /> minimum = shortest sleep<br /> medium = middle between minimum and maximum<br /> maximum = longest sleep<br />', 'backwpup' ); ?>">
294
- <option value="0" <?php selected( get_site_option( 'backwpup_cfg_jobwaittimems' ), 0 ); ?>><?php _e( 'disabled', 'backwpup' ); ?></option>
295
- <option value="10000" <?php selected( get_site_option( 'backwpup_cfg_jobwaittimems' ), 10000 ); ?>><?php _e( 'minimum', 'backwpup' ); ?></option>
296
- <option value="30000" <?php selected( get_site_option( 'backwpup_cfg_jobwaittimems' ), 30000 ); ?>><?php _e( 'medium', 'backwpup' ); ?></option>
297
- <option value="90000" <?php selected( get_site_option( 'backwpup_cfg_jobwaittimems' ), 90000 ); ?>><?php _e( 'maximum', 'backwpup' ); ?></option>
298
- </select>
299
- </label>
300
- </fieldset>
301
- </td>
302
- </tr>
303
- </table>
304
-
305
- </div>
306
-
307
- <div class="table ui-tabs-hide" id="backwpup-tab-net">
308
-
309
- <h3 class="title"><?php _e( 'Authentication', 'backwpup' ); ?></h3>
310
- <p><?php _e( 'Is your blog protected with HTTP basic authentication (.htaccess)? If yes, please set the username and password for authentication here.', 'backwpup' ); ?></p>
311
- <table class="form-table">
312
- <tr>
313
- <th scope="row"><label for="httpauthuser"><?php _e( 'Username:', 'backwpup' ); ?></label></th>
314
- <td>
315
- <input name="httpauthuser" type="text" id="httpauthuser"
316
- value="<?php echo get_site_option( 'backwpup_cfg_httpauthuser' );?>"
317
- class="regular-text" autocomplete="off" />
318
- </td>
319
- </tr>
320
- <tr>
321
- <th scope="row"><label for="httpauthpassword"><?php _e( 'Password:', 'backwpup' ); ?></label></th>
322
- <td>
323
- <input name="httpauthpassword" type="password" id="httpauthpassword"
324
- value="<?php echo BackWPup_Encryption::decrypt( get_site_option( 'backwpup_cfg_httpauthpassword' ) );?>"
325
- class="regular-text" autocomplete="off" />
326
- </tr>
327
- </table>
328
-
329
- </div>
330
-
331
- <div class="table ui-tabs-hide" id="backwpup-tab-apikey">
332
-
333
- <?php do_action( 'backwpup_page_settings_tab_apikey' ); ?>
334
-
335
- </div>
336
-
337
- <div class="table ui-tabs-hide" id="backwpup-tab-information">
338
- <br />
339
- <?php
340
- echo '<table class="wp-list-table widefat fixed" cellspacing="0" style="width: 85%;margin-left:auto;;margin-right:auto;">';
341
- echo '<thead><tr><th width="35%">' . __( 'Setting', 'backwpup' ) . '</th><th>' . __( 'Value', 'backwpup' ) . '</th></tr></thead>';
342
- echo '<tfoot><tr><th>' . __( 'Setting', 'backwpup' ) . '</th><th>' . __( 'Value', 'backwpup' ) . '</th></tr></tfoot>';
343
- echo '<tr title="&gt;=3.2"><td>' . __( 'WordPress version', 'backwpup' ) . '</td><td>' . BackWPup::get_plugin_data( 'wp_version' ) . '</td></tr>';
344
- if ( ! class_exists( 'BackWPup_Pro', FALSE ) )
345
- echo '<tr title=""><td>' . __( 'BackWPup version', 'backwpup' ) . '</td><td>' . BackWPup::get_plugin_data( 'Version' ) . ' <a href="' . translate( BackWPup::get_plugin_data( 'pluginuri' ), 'backwpup' ) . '">' . __( 'Get pro.', 'backwpup' ) . '</a></td></tr>';
346
- else
347
- echo '<tr title=""><td>' . __( 'BackWPup Pro version', 'backwpup' ) . '</td><td>' . BackWPup::get_plugin_data( 'Version' ) . '</td></tr>';
348
- echo '<tr title="&gt;=5.3.3"><td>' . __( 'PHP version', 'backwpup' ) . '</td><td>' . PHP_VERSION . '</td></tr>';
349
- echo '<tr title="&gt;=5.0.7"><td>' . __( 'MySQL version', 'backwpup' ) . '</td><td>' . $wpdb->get_var( "SELECT VERSION() AS version" ) . '</td></tr>';
350
- if ( function_exists( 'curl_version' ) ) {
351
- $curlversion = curl_version();
352
- echo '<tr title=""><td>' . __( 'cURL version', 'backwpup' ) . '</td><td>' . $curlversion[ 'version' ] . '</td></tr>';
353
- echo '<tr title=""><td>' . __( 'cURL SSL version', 'backwpup' ) . '</td><td>' . $curlversion[ 'ssl_version' ] . '</td></tr>';
354
- }
355
- else {
356
- echo '<tr title=""><td>' . __( 'cURL version', 'backwpup' ) . '</td><td>' . __( 'unavailable', 'backwpup' ) . '</td></tr>';
357
- }
358
- echo '<tr title=""><td>' . __( 'WP-Cron url:', 'backwpup' ) . '</td><td>' . site_url( 'wp-cron.php' ) . '</td></tr>';
359
- //response test
360
- echo '<tr><td>' . __( 'Server self connect:', 'backwpup' ) . '</td><td>';
361
- $raw_response = BackWPup_Job::get_jobrun_url( 'test' );
362
- $test_result = '';
363
- if ( is_wp_error( $raw_response ) )
364
- $test_result .= sprintf( __( 'The HTTP response test get an error "%s"','backwpup' ), $raw_response->get_error_message() );
365
- elseif ( 200 != wp_remote_retrieve_response_code( $raw_response ) && 204 != wp_remote_retrieve_response_code( $raw_response ) )
366
- $test_result .= sprintf( __( 'The HTTP response test get a false http status (%s)','backwpup' ), wp_remote_retrieve_response_code( $raw_response ) );
367
- $headers = wp_remote_retrieve_headers( $raw_response );
368
- if ( isset( $headers['x-backwpup-ver'] ) && $headers['x-backwpup-ver'] != BackWPup::get_plugin_data( 'version' ) )
369
- $test_result .= sprintf( __( 'The BackWPup HTTP response header returns a false value: "%s"','backwpup' ), $headers['x-backwpup-ver'] );
370
-
371
- if ( empty( $test_result ) )
372
- _e( 'Response Test O.K.', 'backwpup' );
373
- else
374
- echo $test_result;
375
- echo '</td></tr>';
376
- //folder test
377
- echo '<tr><td>' . __( 'Temp folder:', 'backwpup' ) . '</td><td>';
378
- if ( ! is_dir( BackWPup::get_plugin_data( 'TEMP' ) ) )
379
- echo sprintf( __( 'Temp folder %s doesn\'t exist.','backwpup' ), BackWPup::get_plugin_data( 'TEMP' ) );
380
- elseif ( ! is_writable( BackWPup::get_plugin_data( 'TEMP' ) ) )
381
- echo sprintf( __( 'Temporary folder %s is not writable.','backwpup' ), BackWPup::get_plugin_data( 'TEMP' ) );
382
- else
383
- echo BackWPup::get_plugin_data( 'TEMP' );
384
- echo '</td></tr>';
385
-
386
- echo '<tr><td>' . __( 'Log folder:', 'backwpup' ) . '</td><td>';
387
- if ( ! is_dir( get_site_option( 'backwpup_cfg_logfolder' ) ) )
388
- echo sprintf( __( 'Logs folder %s not exist.','backwpup' ), get_site_option( 'backwpup_cfg_logfolder' ) );
389
- elseif ( ! is_writable( get_site_option( 'backwpup_cfg_logfolder' ) ) )
390
- echo sprintf( __( 'Log folder %s is not writable.','backwpup' ), get_site_option( 'backwpup_cfg_logfolder' ) );
391
- else
392
- echo get_site_option( 'backwpup_cfg_logfolder' );
393
- echo '</td></tr>';
394
- echo '<tr title=""><td>' . __( 'Server', 'backwpup' ) . '</td><td>' . $_SERVER[ 'SERVER_SOFTWARE' ] . '</td></tr>';
395
- echo '<tr title=""><td>' . __( 'Operating System', 'backwpup' ) . '</td><td>' . PHP_OS . '</td></tr>';
396
- echo '<tr title=""><td>' . __( 'PHP SAPI', 'backwpup' ) . '</td><td>' . PHP_SAPI . '</td></tr>';
397
- echo '<tr title=""><td>' . __( 'Current PHP user', 'backwpup' ) . '</td><td>' . get_current_user() . '</td></tr>';
398
- $text = (bool)ini_get( 'safe_mode' ) ? __( 'On', 'backwpup' ) : __( 'Off', 'backwpup' );
399
- echo '<tr title=""><td>' . __( 'Safe Mode', 'backwpup' ) . '</td><td>' . $text . '</td></tr>';
400
- echo '<tr title="&gt;=30"><td>' . __( 'Maximum execution time', 'backwpup' ) . '</td><td>' . ini_get( 'max_execution_time' ) . ' ' . __( 'seconds', 'backwpup' ) . '</td></tr>';
401
- if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON )
402
- echo '<tr title="ALTERNATE_WP_CRON"><td>' . __( 'Alternative WP Cron', 'backwpup' ) . '</td><td>' . __( 'On', 'backwpup' ) . '</td></tr>';
403
- else
404
- echo '<tr title="ALTERNATE_WP_CRON"><td>' . __( 'Alternative WP Cron', 'backwpup' ) . '</td><td>' . __( 'Off', 'backwpup' ) . '</td></tr>';
405
- if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON )
406
- echo '<tr title="DISABLE_WP_CRON"><td>' . __( 'Disabled WP Cron', 'backwpup' ) . '</td><td>' . __( 'On', 'backwpup' ) . '</td></tr>';
407
- else
408
- echo '<tr title="DISABLE_WP_CRON"><td>' . __( 'Disabled WP Cron', 'backwpup' ) . '</td><td>' . __( 'Off', 'backwpup' ) . '</td></tr>';
409
- if ( defined( 'FS_CHMOD_DIR' ) )
410
- echo '<tr title="FS_CHMOD_DIR"><td>' . __( 'CHMOD Dir', 'backwpup' ) . '</td><td>' . FS_CHMOD_DIR . '</td></tr>';
411
- else
412
- echo '<tr title="FS_CHMOD_DIR"><td>' . __( 'CHMOD Dir', 'backwpup' ) . '</td><td>0755</td></tr>';
413
- $now = localtime( time(), TRUE );
414
- echo '<tr title=""><td>' . __( 'Server Time', 'backwpup' ) . '</td><td>' . $now[ 'tm_hour' ] . ':' . $now[ 'tm_min' ] . '</td></tr>';
415
- echo '<tr title=""><td>' . __( 'Blog Time', 'backwpup' ) . '</td><td>' . date_i18n( 'H:i' ) . '</td></tr>';
416
- echo '<tr title=""><td>' . __( 'Blog Timezone', 'backwpup' ) . '</td><td>' . get_option( 'timezone_string' ) . '</td></tr>';
417
- echo '<tr title=""><td>' . __( 'Blog Time offset', 'backwpup' ) . '</td><td>' . sprintf( __( '%s hours', 'backwpup' ), get_option( 'gmt_offset' ) ) . '</td></tr>';
418
- echo '<tr title="WPLANG"><td>' . __( 'Blog language', 'backwpup' ) . '</td><td>' . get_bloginfo( 'language' ) . '</td></tr>';
419
- echo '<tr title="utf8"><td>' . __( 'MySQL Client encoding', 'backwpup' ) . '</td><td>';
420
- echo defined( 'DB_CHARSET' ) ? DB_CHARSET : '';
421
- echo '</td></tr>';
422
- echo '<tr title="URF-8"><td>' . __( 'Blog charset', 'backwpup' ) . '</td><td>' . get_bloginfo( 'charset' ) . '</td></tr>';
423
- echo '<tr title="&gt;=128M"><td>' . __( 'PHP Memory limit', 'backwpup' ) . '</td><td>' . ini_get( 'memory_limit' ) . '</td></tr>';
424
- echo '<tr title="WP_MEMORY_LIMIT"><td>' . __( 'WP memory limit', 'backwpup' ) . '</td><td>' . WP_MEMORY_LIMIT . '</td></tr>';
425
- echo '<tr title="WP_MAX_MEMORY_LIMIT"><td>' . __( 'WP maximum memory limit', 'backwpup' ) . '</td><td>' . WP_MAX_MEMORY_LIMIT . '</td></tr>';
426
- echo '<tr title=""><td>' . __( 'Memory in use', 'backwpup' ) . '</td><td>' . size_format( @memory_get_usage( TRUE ), 2 ) . '</td></tr>';
427
- //disabled PHP functions
428
- $disabled = ini_get( 'disable_functions' );
429
- if ( ! empty( $disabled ) ) {
430
- $disabledarry = explode( ',', $disabled );
431
- echo '<tr title=""><td>' . __( 'Disabled PHP Functions:', 'backwpup' ) . '</td><td>';
432
- echo implode( ', ', $disabledarry );
433
- echo '</td></tr>';
434
- }
435
- //Loaded PHP Extensions
436
- echo '<tr title=""><td>' . __( 'Loaded PHP Extensions:', 'backwpup' ) . '</td><td>';
437
- $extensions = get_loaded_extensions();
438
- sort( $extensions );
439
- echo implode( ', ', $extensions);
440
- echo '</td></tr>';
441
- echo '</table>'
442
- ?>
443
- </div>
444
-
445
- <?php do_action( 'backwpup_page_settings_tab_content' ); ?>
446
-
447
- <p class="submit">
448
- <input type="submit" name="submit" id="submit" class="button-primary" value="<?php _e( 'Save Changes', 'backwpup' ); ?>" />
449
- &nbsp;
450
- <input type="submit" name="default_settings" id="default_settings" class="button-secondary" value="<?php _e( 'Reset all settings to default', 'backwpup' ); ?>" />
451
- </p>
452
- </form>
453
- </div>
454
- <?php
455
- }
456
-
457
- }
1
+ <?php
2
+ /**
3
+ * Class for BackWPup settings page
4
+ */
5
+ class BackWPup_Page_Settings {
6
+
7
+ /**
8
+ *
9
+ * Output js
10
+ *
11
+ * @return void
12
+ */
13
+ public static function admin_print_scripts() {
14
+
15
+ wp_enqueue_script( 'backwpupgeneral' );
16
+
17
+ if ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) {
18
+ wp_enqueue_script( 'backwpuppagesettings', BackWPup::get_plugin_data( 'URL' ) . '/assets/js/page_settings.js', array( 'jquery' ), time(), TRUE );
19
+ } else {
20
+ wp_enqueue_script( 'backwpuppagesettings', BackWPup::get_plugin_data( 'URL' ) . '/assets/js/page_settings.min.js', array( 'jquery' ), BackWPup::get_plugin_data( 'Version' ), TRUE );
21
+ }
22
+ }
23
+
24
+
25
+ /**
26
+ * Save settings form data
27
+ */
28
+ public static function save_post_form() {
29
+
30
+ if ( ! current_user_can( 'backwpup_settings' ) )
31
+ return;
32
+
33
+ //set default options if button clicked
34
+ if ( isset( $_POST[ 'default_settings' ] ) && $_POST[ 'default_settings' ] ) {
35
+
36
+ delete_site_option( 'backwpup_cfg_showadminbar' );
37
+ delete_site_option( 'backwpup_cfg_showfoldersize' );
38
+ delete_site_option( 'backwpup_cfg_jobstepretry' );
39
+ delete_site_option( 'backwpup_cfg_jobmaxexecutiontime' );
40
+ delete_site_option( 'backwpup_cfg_jobziparchivemethod' );
41
+ delete_site_option( 'backwpup_cfg_jobnotranslate' );
42
+ delete_site_option( 'backwpup_cfg_jobwaittimems' );
43
+ delete_site_option( 'backwpup_cfg_jobrunauthkey' );
44
+ delete_site_option( 'backwpup_cfg_maxlogs' );
45
+ delete_site_option( 'backwpup_cfg_gzlogs' );
46
+ delete_site_option( 'backwpup_cfg_protectfolders' );
47
+ delete_site_option( 'backwpup_cfg_httpauthuser' );
48
+ delete_site_option( 'backwpup_cfg_httpauthpassword' );
49
+ delete_site_option( 'backwpup_cfg_logfolder' );
50
+ delete_site_option( 'backwpup_cfg_dropboxappkey' );
51
+ delete_site_option( 'backwpup_cfg_dropboxappsecret' );
52
+ delete_site_option( 'backwpup_cfg_dropboxsandboxappkey' );
53
+ delete_site_option( 'backwpup_cfg_dropboxsandboxappsecret' );
54
+ delete_site_option( 'backwpup_cfg_sugarsynckey' );
55
+ delete_site_option( 'backwpup_cfg_sugarsyncsecret' );
56
+ delete_site_option( 'backwpup_cfg_sugarsyncappid' );
57
+
58
+ BackWPup_Option::default_site_options();
59
+
60
+ BackWPup_Admin::message( __( 'Settings reset to default', 'backwpup' ) );
61
+ return;
62
+ }
63
+
64
+ update_site_option( 'backwpup_cfg_showadminbar', isset( $_POST[ 'showadminbar' ] ) ? 1 : 0 );
65
+ update_site_option( 'backwpup_cfg_showfoldersize', isset( $_POST[ 'showfoldersize' ] ) ? 1 : 0 );
66
+ if ( 100 > $_POST[ 'jobstepretry' ] && 0 < $_POST[ 'jobstepretry' ] )
67
+ $_POST[ 'jobstepretry' ] = abs( (int)$_POST[ 'jobstepretry' ] );
68
+ if ( empty( $_POST[ 'jobstepretry' ] ) or ! is_int( $_POST[ 'jobstepretry' ] ) )
69
+ $_POST[ 'jobstepretry' ] = 3;
70
+ update_site_option( 'backwpup_cfg_jobstepretry', $_POST[ 'jobstepretry' ] );
71
+ $max_exe_time = abs( (int)$_POST[ 'jobmaxexecutiontime' ] );
72
+ if ( ! is_int( $max_exe_time ) || $max_exe_time < 0 ) {
73
+ $max_exe_time = 0;
74
+ } elseif ( $max_exe_time > 300 ) {
75
+ $max_exe_time = 300;
76
+ }
77
+ update_site_option( 'backwpup_cfg_jobmaxexecutiontime', $max_exe_time );
78
+ update_site_option( 'backwpup_cfg_jobziparchivemethod', ( $_POST[ 'jobziparchivemethod' ] == '' || $_POST[ 'jobziparchivemethod' ] == 'PclZip' || $_POST[ 'jobziparchivemethod' ] == 'ZipArchive' ) ? $_POST[ 'jobziparchivemethod' ] : '' );
79
+ update_site_option( 'backwpup_cfg_jobnotranslate', isset( $_POST[ 'jobnotranslate' ] ) ? 1 : 0 );
80
+ update_site_option( 'backwpup_cfg_jobwaittimems', $_POST[ 'jobwaittimems' ] );
81
+ update_site_option( 'backwpup_cfg_maxlogs', abs( (int)$_POST[ 'maxlogs' ] ) );
82
+ update_site_option( 'backwpup_cfg_gzlogs', isset( $_POST[ 'gzlogs' ] ) ? 1 : 0 );
83
+ update_site_option( 'backwpup_cfg_protectfolders', isset( $_POST[ 'protectfolders' ] ) ? 1 : 0 );
84
+ update_site_option( 'backwpup_cfg_httpauthuser', $_POST[ 'httpauthuser' ] );
85
+ update_site_option( 'backwpup_cfg_httpauthpassword', BackWPup_Encryption::encrypt( $_POST[ 'httpauthpassword' ] ) );
86
+ $_POST[ 'jobrunauthkey' ] = preg_replace( '/[^a-zA-Z0-9]/', '', trim( $_POST[ 'jobrunauthkey' ] ) );
87
+ update_site_option( 'backwpup_cfg_jobrunauthkey', $_POST[ 'jobrunauthkey' ] );
88
+ $_POST[ 'logfolder' ] = trailingslashit( str_replace( '\\', '/', trim( stripslashes( $_POST[ 'logfolder' ] ) ) ) );
89
+ if ( $_POST[ 'logfolder' ][ 0 ] == '.' || ( $_POST[ 'logfolder' ][ 0 ] != '/' && ! preg_match( '#^[a-zA-Z]:/#', $_POST[ 'logfolder' ] ) ) )
90
+ $_POST[ 'logfolder' ] = trailingslashit( str_replace( '\\', '/', ABSPATH ) ) . $_POST[ 'logfolder' ];
91
+ //set def. folders
92
+ if ( empty( $_POST[ 'logfolder' ] ) || $_POST[ 'logfolder' ] == '/' ) {
93
+ delete_site_option( 'backwpup_cfg_logfolder' );
94
+ BackWPup_Option::default_site_options();
95
+ } else {
96
+ update_site_option( 'backwpup_cfg_logfolder', $_POST[ 'logfolder' ] );
97
+ }
98
+
99
+ do_action( 'backwpup_page_settings_save' );
100
+
101
+ BackWPup_Admin::message( __( 'Settings saved', 'backwpup' ) );
102
+ }
103
+
104
+ /**
105
+ * Page Output
106
+ */
107
+ public static function page() {
108
+ global $wpdb;
109
+
110
+ ?>
111
+ <div class="wrap" id="backwpup-page">
112
+ <h2><span id="backwpup-page-icon">&nbsp;</span><?php echo sprintf( __( '%s Settings', 'backwpup' ), BackWPup::get_plugin_data( 'name' ) ); ?></h2>
113
+ <?php
114
+ $tabs = array( 'general' => __( 'General', 'backwpup' ), 'job' => __( 'Jobs', 'backwpup' ), 'log' => __( 'Logs', 'backwpup' ), 'net' => __( 'Network', 'backwpup' ), 'apikey' => __( 'API Keys', 'backwpup' ), 'information' => __( 'Information', 'backwpup' ) );
115
+ $tabs = apply_filters( 'backwpup_page_settings_tab', $tabs );
116
+ echo '<h2 class="nav-tab-wrapper">';
117
+ foreach ( $tabs as $id => $name ) {
118
+ echo '<a href="#backwpup-tab-' . $id . '" class="nav-tab">' . $name . '</a>';
119
+ }
120
+ echo '</h2>';
121
+ BackWPup_Admin::display_messages();
122
+ ?>
123
+
124
+ <form id="settingsform" action="<?php echo admin_url( 'admin-post.php?action=backwpup' ); ?>" method="post">
125
+ <?php wp_nonce_field( 'backwpupsettings_page' ); ?>
126
+ <input type="hidden" name="page" value="backwpupsettings" />
127
+ <input type="hidden" name="anchor" value="#backwpup-tab-general" />
128
+
129
+ <div class="table ui-tabs-hide" id="backwpup-tab-general">
130
+
131
+ <h3 class="title"><?php _e( 'Display Settings', 'backwpup' ); ?></h3>
132
+ <p><?php _e( 'Do you want to see BackWPup in the WordPress admin bar?', 'backwpup' ); ?></p>
133
+ <table class="form-table">
134
+ <tr>
135
+ <th scope="row"><?php _e( 'Admin bar', 'backwpup' ); ?></th>
136
+ <td>
137
+ <fieldset>
138
+ <legend class="screen-reader-text"><span><?php _e( 'Admin Bar', 'backwpup' ); ?></span>
139
+ </legend>
140
+ <label for="showadminbar">
141
+ <input name="showadminbar" type="checkbox" id="showadminbar"
142
+ value="1" <?php checked( get_site_option( 'backwpup_cfg_showadminbar' ), TRUE ); ?> />
143
+ <?php _e( 'Show BackWPup links in admin bar.', 'backwpup' ); ?></label>
144
+ </fieldset>
145
+ </td>
146
+ </tr>
147
+ <tr>
148
+ <th scope="row"><?php _e( 'Folder sizes', 'backwpup' ); ?></th>
149
+ <td>
150
+ <fieldset>
151
+ <legend class="screen-reader-text"><span><?php _e( 'Folder sizes', 'backwpup' ); ?></span>
152
+ </legend>
153
+ <label for="showfoldersize">
154
+ <input name="showfoldersize" type="checkbox" id="showfoldersize"
155
+ value="1" <?php checked( get_site_option( 'backwpup_cfg_showfoldersize' ), TRUE ); ?> />
156
+ <?php _e( 'Display folder sizes in the files tab when editing a job. (Might increase loading time of files tab.)', 'backwpup' ); ?></label>
157
+ </fieldset>
158
+ </td>
159
+ </tr>
160
+ </table>
161
+ <h3 class="title"><?php _e( 'Security', 'backwpup' ); ?></h3>
162
+ <p><?php _e( 'Security option for BackWPup', 'backwpup' ); ?></p>
163
+ <table class="form-table">
164
+ <tr>
165
+ <th scope="row"><?php _e( 'Protect folders', 'backwpup' ); ?></th>
166
+ <td>
167
+ <fieldset>
168
+ <legend class="screen-reader-text"><span><?php _e( 'Protect folders', 'backwpup' ); ?></span>
169
+ </legend>
170
+ <label for="protectfolders">
171
+ <input name="protectfolders" type="checkbox" id="protectfolders"
172
+ value="1" <?php checked( get_site_option( 'backwpup_cfg_protectfolders' ), TRUE ); ?> />
173
+ <?php _e( 'Protect BackWPup folders ( Temp, Log and Backups ) with <code>.htaccess</code> and <code>index.php</code>', 'backwpup' ); ?>
174
+ </label>
175
+ </fieldset>
176
+ </td>
177
+ </tr>
178
+ </table>
179
+
180
+ <?php do_action('backwpup_page_settings_tab_generel'); ?>
181
+
182
+ </div>
183
+
184
+ <div class="table ui-tabs-hide" id="backwpup-tab-log">
185
+
186
+ <p><?php _e( 'Every time BackWPup runs a backup job, a log file is being generated. Choose where to store your log files and how many of them.', 'backwpup' ); ?></p>
187
+ <table class="form-table">
188
+ <tr>
189
+ <th scope="row"><label for="logfolder"><?php _e( 'Log file folder', 'backwpup' ); ?></label></th>
190
+ <td>
191
+ <input name="logfolder" type="text" id="logfolder"
192
+ value="<?php echo get_site_option( 'backwpup_cfg_logfolder' );?>"
193
+ class="regular-text code"/>
194
+ </td>
195
+ </tr>
196
+ <tr>
197
+ <th scope="row"><label for="maxlogs"><?php _e( 'Maximum number of log files in folder', 'backwpup' ); ?></label>
198
+ </th>
199
+ <td>
200
+ <input name="maxlogs" type="text" id="maxlogs" title="<?php esc_attr_e( 'Oldest files will be deleted first.', 'backwpup' ); ?>"
201
+ value="<?php echo get_site_option( 'backwpup_cfg_maxlogs' );?>" class="small-text code help-tip"/>
202
+ </td>
203
+ </tr>
204
+ <tr>
205
+ <th scope="row"><?php _e( 'Compression', 'backwpup' ); ?></th>
206
+ <td>
207
+ <fieldset>
208
+ <legend class="screen-reader-text"><span><?php _e( 'Compression', 'backwpup' ); ?></span>
209
+ </legend>
210
+ <label for="gzlogs">
211
+ <input name="gzlogs" type="checkbox" id="gzlogs"
212
+ value="1" <?php checked( get_site_option( 'backwpup_cfg_gzlogs' ), TRUE ); ?><?php if ( ! function_exists( 'gzopen' ) ) echo " disabled=\"disabled\""; ?> />
213
+ <?php _e( 'Compress log files with GZip.', 'backwpup' ); ?></label>
214
+ </fieldset>
215
+ </td>
216
+ </tr>
217
+ </table>
218
+
219
+ </div>
220
+ <div class="table ui-tabs-hide" id="backwpup-tab-job">
221
+
222
+ <p><?php _e( 'There are a couple of general options for backup jobs. Set them here.', 'backwpup' ); ?></p>
223
+ <table class="form-table">
224
+ <tr>
225
+ <th scope="row">
226
+ <label for="jobstepretry"><?php _e( "Maximum number of retries for job steps", 'backwpup' ); ?></label></th>
227
+ <td>
228
+ <input name="jobstepretry" type="text" id="jobstepretry"
229
+ value="<?php echo get_site_option( 'backwpup_cfg_jobstepretry' );?>"
230
+ class="small-text code" />
231
+ </td>
232
+ </tr>
233
+ <tr>
234
+ <th scope="row"><?php _e( 'Maximum script execution time', 'backwpup' ); ?></th>
235
+ <td>
236
+ <fieldset>
237
+ <legend class="screen-reader-text"><span><?php _e( 'Maximum PHP Script execution time', 'backwpup' ); ?></span>
238
+ </legend>
239
+ <label for="jobmaxexecutiontime">
240
+ <input name="jobmaxexecutiontime" type="text" id="jobmaxexecutiontime" size="3" title="<?php esc_attr_e( 'Job will restart before hitting maximum execution time. It will not work with CLI and not on every step during execution. If <code>ALTERNATE_WP_CRON</code> has been defined, WordPress Cron will be used.', 'backwpup' ); ?>"
241
+ value="<?php echo get_site_option( 'backwpup_cfg_jobmaxexecutiontime' ); ?>" class="help-tip" />
242
+ <?php _e( 'seconds. 0 = disabled.', 'backwpup' ); ?>
243
+ </label>
244
+ </fieldset>
245
+ </td>
246
+ </tr>
247
+ <tr>
248
+ <th scope="row"><?php _e( 'Method for creating ZIP-file archives', 'backwpup' ); ?></th>
249
+ <td>
250
+ <fieldset>
251
+ <legend class="screen-reader-text"><span><?php _e( 'Method for creating ZIP-file archives', 'backwpup' ); ?></span>
252
+ </legend>
253
+ <label for="jobziparchivemethod">
254
+ <select name="jobziparchivemethod" size="1" class="help-tip" title="<?php esc_attr_e( 'Auto = Uses PHP class ZipArchive if available; otherwise uses PclZip.<br />ZipArchive = Uses less memory, but many open files at a time.<br />PclZip = Uses more memory, but only 2 open files at a time.', 'backwpup' ); ?>">
255
+ <option value="" <?php selected( get_site_option( 'backwpup_cfg_jobziparchivemethod' ), '' ); ?>><?php _e( 'Auto', 'backwpup' ); ?></option>
256
+ <option value="ZipArchive" <?php selected( get_site_option( 'backwpup_cfg_jobziparchivemethod' ), 'ZipArchive' ); ?><?php disabled( function_exists( 'ZipArchive' ), TRUE ); ?>><?php _e( 'ZipArchive', 'backwpup' ); ?></option>
257
+ <option value="PclZip" <?php selected( get_site_option( 'backwpup_cfg_jobziparchivemethod' ), 'PclZip' ); ?>><?php _e( 'PclZip', 'backwpup' ); ?></option>
258
+ </select>
259
+ </label>
260
+ </fieldset>
261
+ </td>
262
+ </tr>
263
+ <tr>
264
+ <th scope="row">
265
+ <label for="jobrunauthkey"><?php _e( 'Key to start jobs externally with an URL', 'backwpup' ); ?></label>
266
+ </th>
267
+ <td>
268
+ <input name="jobrunauthkey" type="text" id="jobrunauthkey" title="<?php esc_attr_e( 'empty = deactivated. Will be used to protect job starts from unauthorized person.', 'backwpup' ); ?>"
269
+ value="<?php echo get_site_option( 'backwpup_cfg_jobrunauthkey' );?>" class="text code help-tip"/>
270
+ </td>
271
+ </tr>
272
+ <tr>
273
+ <th scope="row"><?php _e( 'No translation', 'backwpup' ); ?></th>
274
+ <td>
275
+ <fieldset>
276
+ <legend class="screen-reader-text"><span><?php _e( 'No Translation', 'backwpup' ); ?></span>
277
+ </legend>
278
+ <label for="jobnotranslate">
279
+ <input name="jobnotranslate" type="checkbox" id="jobnotranslate"
280
+ value="1" <?php checked( get_site_option( 'backwpup_cfg_jobnotranslate' ), TRUE ); ?> />
281
+ <?php _e( 'No translation for the job, the log will be written in English', 'backwpup' ); ?>
282
+ </label>
283
+ </fieldset>
284
+ </td>
285
+ </tr>
286
+ <tr>
287
+ <th scope="row"><?php _e( 'Reduce server load', 'backwpup' ); ?></th>
288
+ <td>
289
+ <fieldset>
290
+ <legend class="screen-reader-text"><span><?php _e( 'Reduce server load', 'backwpup' ); ?></span>
291
+ </legend>
292
+ <label for="jobwaittimems">
293
+ <select name="jobwaittimems" size="1" class="help-tip" title="<?php esc_attr_e( 'This adds short pauses to the process. Can be used to reduce the CPU load.<br /> Disabled = off<br /> minimum = shortest sleep<br /> medium = middle between minimum and maximum<br /> maximum = longest sleep<br />', 'backwpup' ); ?>">
294
+ <option value="0" <?php selected( get_site_option( 'backwpup_cfg_jobwaittimems' ), 0 ); ?>><?php _e( 'disabled', 'backwpup' ); ?></option>
295
+ <option value="10000" <?php selected( get_site_option( 'backwpup_cfg_jobwaittimems' ), 10000 ); ?>><?php _e( 'minimum', 'backwpup' ); ?></option>
296
+ <option value="30000" <?php selected( get_site_option( 'backwpup_cfg_jobwaittimems' ), 30000 ); ?>><?php _e( 'medium', 'backwpup' ); ?></option>
297
+ <option value="90000" <?php selected( get_site_option( 'backwpup_cfg_jobwaittimems' ), 90000 ); ?>><?php _e( 'maximum', 'backwpup' ); ?></option>
298
+ </select>
299
+ </label>
300
+ </fieldset>
301
+ </td>
302
+ </tr>
303
+ </table>
304
+
305
+ </div>
306
+
307
+ <div class="table ui-tabs-hide" id="backwpup-tab-net">
308
+
309
+ <h3 class="title"><?php _e( 'Authentication', 'backwpup' ); ?></h3>
310
+ <p><?php _e( 'Is your blog protected with HTTP basic authentication (.htaccess)? If yes, please set the username and password for authentication here.', 'backwpup' ); ?></p>
311
+ <table class="form-table">
312
+ <tr>
313
+ <th scope="row"><label for="httpauthuser"><?php _e( 'Username:', 'backwpup' ); ?></label></th>
314
+ <td>
315
+ <input name="httpauthuser" type="text" id="httpauthuser"
316
+ value="<?php echo get_site_option( 'backwpup_cfg_httpauthuser' );?>"
317
+ class="regular-text" autocomplete="off" />
318
+ </td>
319
+ </tr>
320
+ <tr>
321
+ <th scope="row"><label for="httpauthpassword"><?php _e( 'Password:', 'backwpup' ); ?></label></th>
322
+ <td>
323
+ <input name="httpauthpassword" type="password" id="httpauthpassword"
324
+ value="<?php echo BackWPup_Encryption::decrypt( get_site_option( 'backwpup_cfg_httpauthpassword' ) );?>"
325
+ class="regular-text" autocomplete="off" />
326
+ </tr>
327
+ </table>
328
+
329
+ </div>
330
+
331
+ <div class="table ui-tabs-hide" id="backwpup-tab-apikey">
332
+
333
+ <?php do_action( 'backwpup_page_settings_tab_apikey' ); ?>
334
+
335
+ </div>
336
+
337
+ <div class="table ui-tabs-hide" id="backwpup-tab-information">
338
+ <br />
339
+ <?php
340
+ echo '<table class="wp-list-table widefat fixed" cellspacing="0" style="width: 85%;margin-left:auto;;margin-right:auto;">';
341
+ echo '<thead><tr><th width="35%">' . __( 'Setting', 'backwpup' ) . '</th><th>' . __( 'Value', 'backwpup' ) . '</th></tr></thead>';
342
+ echo '<tfoot><tr><th>' . __( 'Setting', 'backwpup' ) . '</th><th>' . __( 'Value', 'backwpup' ) . '</th></tr></tfoot>';
343
+ echo '<tr title="&gt;=3.2"><td>' . __( 'WordPress version', 'backwpup' ) . '</td><td>' . BackWPup::get_plugin_data( 'wp_version' ) . '</td></tr>';
344
+ if ( ! class_exists( 'BackWPup_Pro', FALSE ) )
345
+ echo '<tr title=""><td>' . __( 'BackWPup version', 'backwpup' ) . '</td><td>' . BackWPup::get_plugin_data( 'Version' ) . ' <a href="' . translate( BackWPup::get_plugin_data( 'pluginuri' ), 'backwpup' ) . '">' . __( 'Get pro.', 'backwpup' ) . '</a></td></tr>';
346
+ else
347
+ echo '<tr title=""><td>' . __( 'BackWPup Pro version', 'backwpup' ) . '</td><td>' . BackWPup::get_plugin_data( 'Version' ) . '</td></tr>';
348
+ echo '<tr title="&gt;=5.3.3"><td>' . __( 'PHP version', 'backwpup' ) . '</td><td>' . PHP_VERSION . '</td></tr>';
349
+ echo '<tr title="&gt;=5.0.7"><td>' . __( 'MySQL version', 'backwpup' ) . '</td><td>' . $wpdb->get_var( "SELECT VERSION() AS version" ) . '</td></tr>';
350
+ if ( function_exists( 'curl_version' ) ) {
351
+ $curlversion = curl_version();
352
+ echo '<tr title=""><td>' . __( 'cURL version', 'backwpup' ) . '</td><td>' . $curlversion[ 'version' ] . '</td></tr>';
353
+ echo '<tr title=""><td>' . __( 'cURL SSL version', 'backwpup' ) . '</td><td>' . $curlversion[ 'ssl_version' ] . '</td></tr>';
354
+ }
355
+ else {
356
+ echo '<tr title=""><td>' . __( 'cURL version', 'backwpup' ) . '</td><td>' . __( 'unavailable', 'backwpup' ) . '</td></tr>';
357
+ }
358
+ echo '<tr title=""><td>' . __( 'WP-Cron url:', 'backwpup' ) . '</td><td>' . site_url( 'wp-cron.php' ) . '</td></tr>';
359
+ //response test
360
+ echo '<tr><td>' . __( 'Server self connect:', 'backwpup' ) . '</td><td>';
361
+ $raw_response = BackWPup_Job::get_jobrun_url( 'test' );
362
+ $test_result = '';
363
+ if ( is_wp_error( $raw_response ) )
364
+ $test_result .= sprintf( __( 'The HTTP response test get an error "%s"','backwpup' ), $raw_response->get_error_message() );
365
+ elseif ( 200 != wp_remote_retrieve_response_code( $raw_response ) && 204 != wp_remote_retrieve_response_code( $raw_response ) )
366
+ $test_result .= sprintf( __( 'The HTTP response test get a false http status (%s)','backwpup' ), wp_remote_retrieve_response_code( $raw_response ) );
367
+ $headers = wp_remote_retrieve_headers( $raw_response );
368
+ if ( isset( $headers['x-backwpup-ver'] ) && $headers['x-backwpup-ver'] != BackWPup::get_plugin_data( 'version' ) )
369
+ $test_result .= sprintf( __( 'The BackWPup HTTP response header returns a false value: "%s"','backwpup' ), $headers['x-backwpup-ver'] );
370
+
371
+ if ( empty( $test_result ) )
372
+ _e( 'Response Test O.K.', 'backwpup' );
373
+ else
374
+ echo $test_result;
375
+ echo '</td></tr>';
376
+ //folder test
377
+ echo '<tr><td>' . __( 'Temp folder:', 'backwpup' ) . '</td><td>';
378
+ if ( ! is_dir( BackWPup::get_plugin_data( 'TEMP' ) ) )
379
+ echo sprintf( __( 'Temp folder %s doesn\'t exist.','backwpup' ), BackWPup::get_plugin_data( 'TEMP' ) );
380
+ elseif ( ! is_writable( BackWPup::get_plugin_data( 'TEMP' ) ) )
381
+ echo sprintf( __( 'Temporary folder %s is not writable.','backwpup' ), BackWPup::get_plugin_data( 'TEMP' ) );
382
+ else
383
+ echo BackWPup::get_plugin_data( 'TEMP' );
384
+ echo '</td></tr>';
385
+
386
+ echo '<tr><td>' . __( 'Log folder:', 'backwpup' ) . '</td><td>';
387
+ if ( ! is_dir( get_site_option( 'backwpup_cfg_logfolder' ) ) )
388
+ echo sprintf( __( 'Logs folder %s not exist.','backwpup' ), get_site_option( 'backwpup_cfg_logfolder' ) );
389
+ elseif ( ! is_writable( get_site_option( 'backwpup_cfg_logfolder' ) ) )
390
+ echo sprintf( __( 'Log folder %s is not writable.','backwpup' ), get_site_option( 'backwpup_cfg_logfolder' ) );
391
+ else
392
+ echo get_site_option( 'backwpup_cfg_logfolder' );
393
+ echo '</td></tr>';
394
+ echo '<tr title=""><td>' . __( 'Server', 'backwpup' ) . '</td><td>' . $_SERVER[ 'SERVER_SOFTWARE' ] . '</td></tr>';
395
+ echo '<tr title=""><td>' . __( 'Operating System', 'backwpup' ) . '</td><td>' . PHP_OS . '</td></tr>';
396
+ echo '<tr title=""><td>' . __( 'PHP SAPI', 'backwpup' ) . '</td><td>' . PHP_SAPI . '</td></tr>';
397
+ echo '<tr title=""><td>' . __( 'Current PHP user', 'backwpup' ) . '</td><td>' . get_current_user() . '</td></tr>';
398
+ $text = (bool)ini_get( 'safe_mode' ) ? __( 'On', 'backwpup' ) : __( 'Off', 'backwpup' );
399
+ echo '<tr title=""><td>' . __( 'Safe Mode', 'backwpup' ) . '</td><td>' . $text . '</td></tr>';
400
+ echo '<tr title="&gt;=30"><td>' . __( 'Maximum execution time', 'backwpup' ) . '</td><td>' . ini_get( 'max_execution_time' ) . ' ' . __( 'seconds', 'backwpup' ) . '</td></tr>';
401
+ if ( defined( 'ALTERNATE_WP_CRON' ) && ALTERNATE_WP_CRON )
402
+ echo '<tr title="ALTERNATE_WP_CRON"><td>' . __( 'Alternative WP Cron', 'backwpup' ) . '</td><td>' . __( 'On', 'backwpup' ) . '</td></tr>';
403
+ else
404
+ echo '<tr title="ALTERNATE_WP_CRON"><td>' . __( 'Alternative WP Cron', 'backwpup' ) . '</td><td>' . __( 'Off', 'backwpup' ) . '</td></tr>';
405
+ if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON )
406
+ echo '<tr title="DISABLE_WP_CRON"><td>' . __( 'Disabled WP Cron', 'backwpup' ) . '</td><td>' . __( 'On', 'backwpup' ) . '</td></tr>';
407
+ else
408
+ echo '<tr title="DISABLE_WP_CRON"><td>' . __( 'Disabled WP Cron', 'backwpup' ) . '</td><td>' . __( 'Off', 'backwpup' ) . '</td></tr>';
409
+ if ( defined( 'FS_CHMOD_DIR' ) )
410
+ echo '<tr title="FS_CHMOD_DIR"><td>' . __( 'CHMOD Dir', 'backwpup' ) . '</td><td>' . FS_CHMOD_DIR . '</td></tr>';
411
+ else
412
+ echo '<tr title="FS_CHMOD_DIR"><td>' . __( 'CHMOD Dir', 'backwpup' ) . '</td><td>0755</td></tr>';
413
+ $now = localtime( time(), TRUE );
414
+ echo '<tr title=""><td>' . __( 'Server Time', 'backwpup' ) . '</td><td>' . $now[ 'tm_hour' ] . ':' . $now[ 'tm_min' ] . '</td></tr>';
415
+ echo '<tr title=""><td>' . __( 'Blog Time', 'backwpup' ) . '</td><td>' . date_i18n( 'H:i' ) . '</td></tr>';
416
+ echo '<tr title=""><td>' . __( 'Blog Timezone', 'backwpup' ) . '</td><td>' . get_option( 'timezone_string' ) . '</td></tr>';
417
+ echo '<tr title=""><td>' . __( 'Blog Time offset', 'backwpup' ) . '</td><td>' . sprintf( __( '%s hours', 'backwpup' ), get_option( 'gmt_offset' ) ) . '</td></tr>';
418
+ echo '<tr title="WPLANG"><td>' . __( 'Blog language', 'backwpup' ) . '</td><td>' . get_bloginfo( 'language' ) . '</td></tr>';
419
+ echo '<tr title="utf8"><td>' . __( 'MySQL Client encoding', 'backwpup' ) . '</td><td>';
420
+ echo defined( 'DB_CHARSET' ) ? DB_CHARSET : '';
421
+ echo '</td></tr>';
422
+ echo '<tr title="URF-8"><td>' . __( 'Blog charset', 'backwpup' ) . '</td><td>' . get_bloginfo( 'charset' ) . '</td></tr>';
423
+ echo '<tr title="&gt;=128M"><td>' . __( 'PHP Memory limit', 'backwpup' ) . '</td><td>' . ini_get( 'memory_limit' ) . '</td></tr>';
424
+ echo '<tr title="WP_MEMORY_LIMIT"><td>' . __( 'WP memory limit', 'backwpup' ) . '</td><td>' . WP_MEMORY_LIMIT . '</td></tr>';
425
+ echo '<tr title="WP_MAX_MEMORY_LIMIT"><td>' . __( 'WP maximum memory limit', 'backwpup' ) . '</td><td>' . WP_MAX_MEMORY_LIMIT . '</td></tr>';
426
+ echo '<tr title=""><td>' . __( 'Memory in use', 'backwpup' ) . '</td><td>' . size_format( @memory_get_usage( TRUE ), 2 ) . '</td></tr>';
427
+ //disabled PHP functions
428
+ $disabled = ini_get( 'disable_functions' );
429
+ if ( ! empty( $disabled ) ) {
430
+ $disabledarry = explode( ',', $disabled );
431
+ echo '<tr title=""><td>' . __( 'Disabled PHP Functions:', 'backwpup' ) . '</td><td>';
432
+ echo implode( ', ', $disabledarry );
433
+ echo '</td></tr>';
434
+ }
435
+ //Loaded PHP Extensions
436
+ echo '<tr title=""><td>' . __( 'Loaded PHP Extensions:', 'backwpup' ) . '</td><td>';
437
+ $extensions = get_loaded_extensions();
438
+ sort( $extensions );
439
+ echo implode( ', ', $extensions);
440
+ echo '</td></tr>';
441
+ echo '</table>'
442
+ ?>
443
+ </div>
444
+
445
+ <?php do_action( 'backwpup_page_settings_tab_content' ); ?>
446
+
447
+ <p class="submit">
448
+ <input type="submit" name="submit" id="submit" class="button-primary" value="<?php _e( 'Save Changes', 'backwpup' ); ?>" />
449
+ &nbsp;
450
+ <input type="submit" name="default_settings" id="default_settings" class="button-secondary" value="<?php _e( 'Reset all settings to default', 'backwpup' ); ?>" />
451
+ </p>
452
+ </form>
453
+ </div>
454
+ <?php
455
+ }
456
+
457
+ }
inc/class-wp-cli.php CHANGED
@@ -9,7 +9,7 @@ class BackWPup_WP_CLI extends WP_CLI_Command {
9
  *
10
  * @param $args
11
  * @param $assoc_args
12
- * @synopsis start --jobid=<ID>
13
  */
14
  public function start( $args, $assoc_args ) {
15
 
@@ -30,7 +30,6 @@ class BackWPup_WP_CLI extends WP_CLI_Command {
30
  /**
31
  * Abort a working BackWPup Job
32
  *
33
- * @synopsis abort
34
  */
35
  public function abort( $args, $assoc_args ) {
36
 
@@ -45,7 +44,6 @@ class BackWPup_WP_CLI extends WP_CLI_Command {
45
  /**
46
  * Display a List of Jobs
47
  *
48
- * @synopsis jobs
49
  */
50
  public function jobs( $args, $assoc_args ) {
51
 
@@ -64,7 +62,6 @@ class BackWPup_WP_CLI extends WP_CLI_Command {
64
  *
65
  * @param $args
66
  * @param $assoc_args
67
- * @synopsis working
68
  */
69
  public function working( $args, $assoc_args ) {
70
 
9
  *
10
  * @param $args
11
  * @param $assoc_args
12
+ * @synopsis --jobid=<ID>
13
  */
14
  public function start( $args, $assoc_args ) {
15
 
30
  /**
31
  * Abort a working BackWPup Job
32
  *
 
33
  */
34
  public function abort( $args, $assoc_args ) {
35
 
44
  /**
45
  * Display a List of Jobs
46
  *
 
47
  */
48
  public function jobs( $args, $assoc_args ) {
49
 
62
  *
63
  * @param $args
64
  * @param $assoc_args
 
65
  */
66
  public function working( $args, $assoc_args ) {
67
 
languages/backwpup-de_DE.po CHANGED
@@ -1,6109 +1,6109 @@
1
- msgid ""
2
- msgstr ""
3
- "Project-Id-Version: BackWPup Pro v3.1.3\n"
4
- "Report-Msgid-Bugs-To: \n"
5
- "POT-Creation-Date: 2014-11-12 13:25+0100\n"
6
- "PO-Revision-Date: 2014-11-12 13:26+0100\n"
7
- "Last-Translator: Robert Windisch <r.windisch@inpsyde.com>\n"
8
- "Language-Team: \n"
9
- "Language: \n"
10
- "MIME-Version: 1.0\n"
11
- "Content-Type: text/plain; charset=UTF-8\n"
12
- "Content-Transfer-Encoding: 8bit\n"
13
- "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
- "X-Generator: GlotPress/0.1\n"
15
- "X-Poedit-SourceCharset: utf-8\n"
16
- "X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
17
- "X-Poedit-Basepath: .\n"
18
- "X-Textdomain-Support: yes\n"
19
- "X-Poedit-SearchPath-0: .\n"
20
- "X-Poedit-SearchPath-1: ..\n"
21
-
22
- # @ backwpup
23
- #: ../backwpup.php:42
24
- msgid "BackWPup requires PHP version 5.2.7 with spl extension or greater and WordPress 3.4 or greater."
25
- msgstr "BackWPup benötigt PHP Version 5.2.7 oder höher mit der SPL-Erweiterung und WordPress 3.4 oder höher."
26
-
27
- # @ backwpup
28
- #: ../backwpup.php:289
29
- msgid "Folder"
30
- msgstr "Ordner"
31
-
32
- # @ backwpup
33
- #: ../backwpup.php:290
34
- msgid "Backup to Folder"
35
- msgstr "Backup in Ordner"
36
-
37
- # @ backwpup
38
- #: ../backwpup.php:305
39
- msgid "Email"
40
- msgstr "E-Mail"
41
-
42
- # @ backwpup
43
- #: ../backwpup.php:306
44
- msgid "Backup sent via email"
45
- msgstr "Backup als E-Mail versendet"
46
-
47
- # @ backwpup
48
- #: ../backwpup.php:321
49
- msgid "FTP"
50
- msgstr "FTP"
51
-
52
- # @ backwpup
53
- #: ../backwpup.php:322
54
- msgid "Backup to FTP"
55
- msgstr "Backup zu FTP"
56
-
57
- # @ backwpup
58
- #: ../backwpup.php:337
59
- msgid "Dropbox"
60
- msgstr "Dropbox"
61
-
62
- # @ backwpup
63
- #: ../backwpup.php:338
64
- msgid "Backup to Dropbox"
65
- msgstr "Backup in die Dropbox"
66
-
67
- # @ backwpup
68
- #: ../backwpup.php:354
69
- #: ../backwpup.php:373
70
- msgid "S3 Service"
71
- msgstr "S3 Service"
72
-
73
- # @ backwpup
74
- #: ../backwpup.php:355
75
- msgid "Backup to an S3 Service"
76
- msgstr "Backup zu einem S3 Service"
77
-
78
- # @ backwpup
79
- #: ../backwpup.php:374
80
- msgid "Backup to an S3 Service v1"
81
- msgstr "Backup auf S3 Service v1"
82
-
83
- # @ backwpup
84
- #: ../backwpup.php:390
85
- msgid "MS Azure"
86
- msgstr "MS Azure"
87
-
88
- # @ backwpup
89
- #: ../backwpup.php:391
90
- msgid "Backup to Microsoft Azure (Blob)"
91
- msgstr "Backup zu Microsoft Azure (Blob)"
92
-
93
- # @ backwpup
94
- #: ../backwpup.php:406
95
- msgid "RSC"
96
- msgstr "RSC"
97
-
98
- # @ backwpup
99
- #: ../backwpup.php:407
100
- msgid "Backup to Rackspace Cloud Files"
101
- msgstr "Backup in die Rackspace Cloud"
102
-
103
- # @ backwpup
104
- #: ../backwpup.php:423
105
- msgid "SugarSync"
106
- msgstr "SugarSync"
107
-
108
- # @ backwpup
109
- #: ../backwpup.php:424
110
- msgid "Backup to SugarSync"
111
- msgstr "Backup zu SugarSync"
112
-
113
- # @ backwpup
114
- #: ../backwpup.php:443
115
- #, php-format
116
- msgid "PHP Version %1$s is to low, you need Version %2$s or above."
117
- msgstr "Du nutzt die veraltete PHP Version %1$s. Es wird aber mindestens die Version %2$s benötigt."
118
-
119
- # @ backwpup
120
- #: ../backwpup.php:450
121
- #, php-format
122
- msgid "Missing function \"%s\"."
123
- msgstr "Fehlende Funktion \"%s\"."
124
-
125
- # @ backwpup
126
- #: ../backwpup.php:459
127
- #, php-format
128
- msgid "Missing class \"%s\"."
129
- msgstr "Fehlende Klasse \"%s\"."
130
-
131
- # @ backwpup
132
- #: ../inc/class-destination-folder.php:26
133
- #: ../inc/class-destination-ftp.php:52
134
- msgid "Backup settings"
135
- msgstr "Backup-Einstellungen"
136
-
137
- # @ backwpup
138
- #: ../inc/class-destination-folder.php:30
139
- msgid "Folder to store backups in"
140
- msgstr "Order für Dateien"
141
-
142
- # @ backwpup
143
- #: ../inc/class-destination-folder.php:36
144
- #: ../inc/class-destination-ftp.php:62
145
- msgid "File Deletion"
146
- msgstr "Dateilöschung"
147
-
148
- # @ backwpup
149
- #: ../inc/class-destination-folder.php:42
150
- #: ../inc/class-destination-s3.php:160
151
- msgid "Number of files to keep in folder."
152
- msgstr "Anzahl der Dateien, die im Ordner behalten werden"
153
-
154
- # @ backwpup
155
- #: ../inc/class-destination-folder.php:46
156
- #: ../inc/class-destination-s3.php:164
157
- #: ../inc/class-destination-ftp.php:72
158
- msgid "Do not delete files while syncing to destination!"
159
- msgstr "Keine Dateien im Sync-Zielverzeichnis löschen!"
160
-
161
- # @ backwpup
162
- #: ../inc/class-destination-folder.php:194
163
- #, php-format
164
- msgid "One backup file deleted"
165
- msgid_plural "%d backup files deleted"
166
- msgstr[0] "Eine Sicherungsdatei gelöscht"
167
- msgstr[1] "%d Sicherungsdateien gelöscht"
168
-
169
- # @ backwpup
170
- #: ../inc/class-destination-s3.php:74
171
- msgid "Select a S3 service"
172
- msgstr "Wähle einen S3 Service"
173
-
174
- # @ backwpup
175
- #: ../inc/class-destination-s3.php:76
176
- msgid "Amazon S3 Region"
177
- msgstr "Amazon S3 Region"
178
-
179
- # @ backwpup
180
- #: ../inc/class-destination-s3.php:77
181
- msgid "Amazon S3: US Standard"
182
- msgstr "Amazon S3: US Standard"
183
-
184
- # @ backwpup
185
- #: ../inc/class-destination-s3.php:78
186
- msgid "Amazon S3: US West (Northern California)"
187
- msgstr "Amazon S3: US West (Northern California)"
188
-
189
- # @ backwpup
190
- #: ../inc/class-destination-s3.php:79
191
- msgid "Amazon S3: US West (Oregon)"
192
- msgstr "Amazon S3: US West (Oregon)"
193
-
194
- # @ backwpup
195
- #: ../inc/class-destination-s3.php:80
196
- msgid "Amazon S3: EU (Ireland)"
197
- msgstr "Amazon S3: EU (Ireland)"
198
-
199
- # @ backwpup
200
- #: ../inc/class-destination-s3.php:81
201
- msgid "Amazon S3: EU (Germany)"
202
- msgstr "Amazon S3: EU (Germany)"
203
-
204
- # @ backwpup
205
- #: ../inc/class-destination-s3.php:82
206
- msgid "Amazon S3: Asia Pacific (Tokyo)"
207
- msgstr "Amazon S3: Asia Pacific (Tokyo)"
208
-
209
- # @ backwpup
210
- #: ../inc/class-destination-s3.php:83
211
- msgid "Amazon S3: Asia Pacific (Singapore)"
212
- msgstr "Amazon S3: Asia Pacific (Singapore)"
213
-
214
- # @ backwpup
215
- #: ../inc/class-destination-s3.php:84
216
- msgid "Amazon S3: Asia Pacific (Sydney)"
217
- msgstr "Amazon S3: Asia Pacific (Sydney)"
218
-
219
- # @ backwpup
220
- #: ../inc/class-destination-s3.php:85
221
- msgid "Amazon S3: South America (Sao Paulo)"
222
- msgstr "Amazon S3: South America (Sao Paulo)"
223
-
224
- # @ backwpup
225
- #: ../inc/class-destination-s3.php:86
226
- msgid "Amazon S3: China (Beijing)"
227
- msgstr "Amazon S3: China (Beijing)"
228
-
229
- # @ backwpup
230
- #: ../inc/class-destination-s3.php:87
231
- msgid "Google Storage (Interoperable Access)"
232
- msgstr "Google Storage (Interoperable Access)"
233
-
234
- # @ backwpup
235
- #: ../inc/class-destination-s3.php:88
236
- msgid "Dream Host Cloud Storage"
237
- msgstr "Dream Host Cloud Storage"
238
-
239
- # @ backwpup
240
- #: ../inc/class-destination-s3.php:89
241
- msgid "GreenQloud Storage Qloud"
242
- msgstr "GreenQloud Storage Qloud"
243
-
244
- # @ backwpup
245
- #: ../inc/class-destination-s3.php:94
246
- msgid "Or a S3 Server URL"
247
- msgstr "oder eine S3 Server URL"
248
-
249
- # @ backwpup
250
- #: ../inc/class-destination-s3.php:101
251
- msgid "S3 Access Keys"
252
- msgstr "S3 Access Keys"
253
-
254
- # @ backwpup
255
- #: ../inc/class-destination-s3.php:105
256
- msgid "Access Key"
257
- msgstr "Access Key"
258
-
259
- # @ backwpup
260
- #: ../inc/class-destination-s3.php:112
261
- msgid "Secret Key"
262
- msgstr "Secret Key"
263
-
264
- # @ backwpup
265
- #: ../inc/class-destination-s3.php:120
266
- msgid "S3 Bucket"
267
- msgstr "S3 Bucket"
268
-
269
- # @ backwpup
270
- #: ../inc/class-destination-s3.php:124
271
- msgid "Bucket selection"
272
- msgstr "Bucket Auswahl"
273
-
274
- # @ backwpup
275
- #: ../inc/class-destination-s3.php:137
276
- msgid "Create a new bucket"
277
- msgstr "Neues Bucket erstellen"
278
-
279
- # @ backwpup
280
- #: ../inc/class-destination-s3.php:144
281
- msgid "S3 Backup settings"
282
- msgstr "S3 Backup Einstellungen"
283
-
284
- # @ backwpup
285
- #: ../inc/class-destination-s3.php:148
286
- msgid "Folder in bucket"
287
- msgstr "Ordner im Bucket"
288
-
289
- # @ backwpup
290
- #: ../inc/class-destination-s3.php:154
291
- msgid "File deletion"
292
- msgstr "Datei Löschung"
293
-
294
- # @ backwpup
295
- #: ../inc/class-destination-s3.php:170
296
- msgid "Multipart Upload"
297
- msgstr "Multipart Upload"
298
-
299
- # @ backwpup
300
- #: ../inc/class-destination-s3.php:174
301
- msgid "Use multipart upload for uploading a file"
302
- msgstr "Benutze Multipart Upload zu hochladen der Datei"
303
-
304
- # @ backwpup
305
- #: ../inc/class-destination-s3.php:180
306
- msgid "Amazon specific settings"
307
- msgstr "Amazon spezifische Einstellungen"
308
-
309
- # @ backwpup
310
- #: ../inc/class-destination-s3.php:184
311
- #: ../inc/class-destination-s3.php:186
312
- msgid "Amazon: Storage Class"
313
- msgstr "Amazon: Storage Class"
314
-
315
- # @ backwpup
316
- #: ../inc/class-destination-s3.php:187
317
- msgid "none"
318
- msgstr "keine"
319
-
320
- # @ backwpup
321
- #: ../inc/class-destination-s3.php:188
322
- msgid "Reduced Redundancy"
323
- msgstr "Reduzierte Redundanz"
324
-
325
- # @ backwpup
326
- #: ../inc/class-destination-s3.php:193
327
- msgid "Server side encryption"
328
- msgstr "Serverseitige Enkryption"
329
-
330
- # @ backwpup
331
- #: ../inc/class-destination-s3.php:197
332
- msgid "Save files encrypted (AES256) on server."
333
- msgstr "Speicher Dateien Server Side Encrypted (AES256)"
334
-
335
- # @ backwpup
336
- #: ../inc/class-destination-s3.php:253
337
- #, php-format
338
- msgid "Bucket %1$s created in %2$s."
339
- msgstr "Bucket %1$s in %2$s erstellt."
340
-
341
- # @ backwpup
342
- #: ../inc/class-destination-s3.php:255
343
- #, php-format
344
- msgid "Bucket %s could not be created."
345
- msgstr "Bucket %s konnte nicht erstellt werden."
346
-
347
- # @ backwpup
348
- #: ../inc/class-destination-s3.php:257
349
- #, php-format
350
- msgid " %s is not a valid bucket name."
351
- msgstr "%s ist kein gültiger Bucket Name"
352
-
353
- # @ backwpup
354
- #: ../inc/class-destination-s3.php:297
355
- #: ../inc/class-destination-s3.php:418
356
- #: ../inc/class-destination-s3.php:471
357
- #: ../inc/class-destination-s3.php:501
358
- #: ../inc/class-destination-s3.php:561
359
- #, php-format
360
- msgid "S3 Service API: %s"
361
- msgstr "S3 Service API: %s"
362
-
363
- # @ backwpup
364
- #: ../inc/class-destination-s3.php:361
365
- #, php-format
366
- msgid "%d. Trying to send backup file to S3 Service&#160;&hellip;"
367
- msgstr "%d. Versuche, ein Backup zum S3-Service zu senden&#160;&hellip;"
368
-
369
- # @ backwpup
370
- #: ../inc/class-destination-s3.php:374
371
- #, php-format
372
- msgid "Connected to S3 Bucket \"%1$s\" in %2$s"
373
- msgstr "Verbunden zum S3 Bucket \"%1$s\" in %2$s"
374
-
375
- # @ backwpup
376
- #: ../inc/class-destination-s3.php:377
377
- #, php-format
378
- msgid "S3 Bucket \"%s\" does not exist!"
379
- msgstr "Amazon S3 Bucket \"%s\" existiert nicht!"
380
-
381
- # @ backwpup
382
- #: ../inc/class-destination-s3.php:384
383
- msgid "Checking for not aborted multipart Uploads&#160;&hellip;"
384
- msgstr "Prüfe auf nicht abgebrochene, mehrteilige Uploads&#160;&hellip;"
385
-
386
- # @ backwpup
387
- #: ../inc/class-destination-s3.php:390
388
- #, php-format
389
- msgid "Upload for %s aborted."
390
- msgstr "Upload für %s abgebrochen."
391
-
392
- # @ backwpup
393
- #: ../inc/class-destination-s3.php:396
394
- msgid "Starting upload to S3 Service&#160;&hellip;"
395
- msgstr "Upload zum S3 Service begonnen&#160;&hellip;"
396
-
397
- # @ backwpup
398
- #: ../inc/class-destination-s3.php:492
399
- #, php-format
400
- msgid "Backup transferred to %s."
401
- msgstr "Backup übertragen zu %s"
402
-
403
- # @ backwpup
404
- #: ../inc/class-destination-s3.php:497
405
- #, php-format
406
- msgid "Cannot transfer backup to S3! (%1$d) %2$s"
407
- msgstr "Backup kann nicht zu Amazon S3 übertragen werden! (%1$d) %2$s"
408
-
409
- # @ backwpup
410
- #: ../inc/class-destination-s3.php:525
411
- #, php-format
412
- msgid "Storage Class: %s"
413
- msgstr "Speicher-Klasse: %s"
414
-
415
- # @ backwpup
416
- #: ../inc/class-destination-s3.php:551
417
- #, php-format
418
- msgid "Cannot delete backup from %s."
419
- msgstr "Kann das Backup auf %s nicht löschen"
420
-
421
- # @ backwpup
422
- #: ../inc/class-destination-s3.php:555
423
- #, php-format
424
- msgid "One file deleted on S3 Bucket."
425
- msgid_plural "%d files deleted on S3 Bucket"
426
- msgstr[0] "Eine Datei im S3-Bucket gelöscht"
427
- msgstr[1] "%d Dateien im S3-Bucket gelöscht"
428
-
429
- # @ backwpup
430
- #: ../inc/class-destination-s3.php:658
431
- msgid "Missing access key!"
432
- msgstr "Der Zugangsschlüssel (Access Key) fehlt!"
433
-
434
- # @ backwpup
435
- #: ../inc/class-destination-s3.php:660
436
- msgid "Missing secret access key!"
437
- msgstr "Der geheime Zugangsschlüssel (Secret Access Key) fehlt!"
438
-
439
- # @ backwpup
440
- #: ../inc/class-destination-s3.php:666
441
- msgid "No bucket found!"
442
- msgstr "Kein Bucket gefunden!"
443
-
444
- # @ backwpup
445
- #: ../inc/class-page-about.php:394
446
- #, php-format
447
- msgid "%s Welcome"
448
- msgstr "%s Willkommen"
449
-
450
- # @ backwpup
451
- #: ../inc/class-page-about.php:401
452
- msgid "Heads up! You have updated from version 2.x"
453
- msgstr "Achtung! Sie haben von Version 2.x aktualisiert"
454
-
455
- # @ backwpup
456
- #: ../inc/class-page-about.php:402
457
- #, php-format
458
- msgid "Please <a href=\"%s\">check your settings</a> after updating from version 2.x:"
459
- msgstr "Bitte <a href=\"%s\">prüfen Sie Ihre Einstellungen</a> nach dem Update von Version 2.x."
460
-
461
- # @ backwpup
462
- #: ../inc/class-page-about.php:403
463
- msgid "Dropbox authentication must be re-entered"
464
- msgstr "Die Drohbox-Authentifizierung muss wiederholt werden."
465
-
466
- # @ backwpup
467
- #: ../inc/class-page-about.php:404
468
- msgid "SugarSync authentication must be re-entered"
469
- msgstr "Die SugarSync-Authentifizierung muss wiederholt werden"
470
-
471
- # @ backwpup
472
- #: ../inc/class-page-about.php:405
473
- msgid "S3 Settings"
474
- msgstr "S3-Einstellungen"
475
-
476
- # @ backwpup
477
- #: ../inc/class-page-about.php:406
478
- msgid "Google Storage is now a part of S3 service settings"
479
- msgstr "Google Storage ist jetzt Teil der S3-Einstellungen"
480
-
481
- # @ backwpup
482
- #: ../inc/class-page-about.php:407
483
- msgid "All your passwords"
484
- msgstr "All Ihre Passwörter"
485
-
486
- # @ backwpup
487
- #: ../inc/class-page-about.php:416
488
- msgid "Welcome to BackWPup Pro"
489
- msgstr "Willkommen zu BackWPup Pro"
490
-
491
- # @ backwpup
492
- #: ../inc/class-page-about.php:417
493
- msgid "BackWPup’s job wizards make planning and scheduling your backup jobs a breeze."
494
- msgstr "Die Assistenten in BackWPup machen das Planen und terminieren deiner Sicherungen zu einem Spaziergang."
495
-
496
- # @ backwpup
497
- #: ../inc/class-page-about.php:418
498
- #: ../inc/class-page-about.php:428
499
- msgid "Use your backup archives to save your entire WordPress installation including <code>/wp-content/</code>. Push them to an external storage service if you don’t want to save the backups on the same server. With a single backup archive you are able to restore an installation. Use a tool like phpMyAdmin or a plugin like <a href=\"http://wordpress.org/plugins/adminer/\" target=\"_blank\">Adminer</a> to restore your database backup files."
500
- msgstr "Benutze deine Backup-Archive, um deine gesamte WordPress-Installation zu sichern, einschließlich <code>/wp-content/</code>. Lade sie zu einem externen Dienst hoch, wenn du deine Backups nicht auf demselben Server speichern möchtest. Mit einem einzigen Backup-Archiv kannst du deine Installation wiederherstellen. Benutze ein serverseitiges Tool wie phpMyAdmin, oder ein Plugin wie <a href=\"http://wordpress.org/plugins/adminer/\" target=\"_blank\">Adminer</a>, um deine Datenbanksicherung wiederherzustellen."
501
-
502
- # @ backwpup
503
- #: ../inc/class-page-about.php:419
504
- #, php-format
505
- msgid "Ready to <a href=\"%1$s\">set up a backup job</a>? You can <a href=\"%2$s\">use the wizards</a> or plan your backup in expert mode."
506
- msgstr "<a href=\"%1$s\">Bereit, einen Backup-Auftrag anzulegen</a>? Benutze die <a href=\"%2$s\">Assistenten</a>, oder plane dein Backup im Expertenmodus."
507
-
508
- # @ backwpup
509
- #: ../inc/class-page-about.php:426
510
- msgid "Welcome to BackWPup"
511
- msgstr "Willkommen bei BackWPup"
512
-
513
- # @ backwpup
514
- #: ../inc/class-page-about.php:429
515
- msgid "Ready to set up a backup job? Use one of the wizards to plan what you want to save."
516
- msgstr "Bereit, einen Backup-Auftrag anzulegen? Benutze einen der Assistenten, um deine Sicherung zu planen."
517
-
518
- # @ backwpup
519
- #: ../inc/class-page-about.php:446
520
- msgid "Please activate your license"
521
- msgstr "Bitte aktivieren Sie Ihre Lizenz."
522
-
523
- # @ backwpup
524
- #: ../inc/class-page-about.php:447
525
- msgid "Please go to your plugin page and active the license to have the autoupdates enabled."
526
- msgstr "Bitte gehen Sie auf die Plugin-Seite, und aktivieren Sie die Lizenz, um automatische Aktualisierungen zu aktivieren."
527
-
528
- # @ backwpup
529
- #: ../inc/class-page-about.php:456
530
- msgid "Save your database"
531
- msgstr "Sichern Sie Ihre Datenbank"
532
-
533
- # @ backwpup
534
- #: ../inc/class-page-about.php:459
535
- msgid "Save your database regularly"
536
- msgstr "Sichern Sie Ihre Datenbank regelmäßig"
537
-
538
- # @ backwpup
539
- #: ../inc/class-page-about.php:460
540
- #, php-format
541
- msgid "With BackWPup you can schedule the database backup to run automatically. With a single backup file you can restore your database. You should <a href=\"%s\">set up a backup job</a>, so you will never forget it. There is also an option to repair and optimize the database after each backup."
542
- msgstr "Mit BackWPup können Sie automatische Datenbank-Backups planen. Mit einer einzigen Backup-Datei können Sie Ihre Datenbank wiederherstellen. Sie sollten einen <a href=\\\"%s\\\">Backup-Auftrag einrichten</a>, damit Sie es nie mehr vergessen. Es gibt auch eine Option, um die Datenbank anschließend zu reparieren und zu optimieren."
543
-
544
- # @ backwpup
545
- #: ../inc/class-page-about.php:465
546
- #: ../inc/class-page-about.php:469
547
- msgid "WordPress XML Export"
548
- msgstr "WordPress-XML-Export"
549
-
550
- # @ backwpup
551
- #: ../inc/class-page-about.php:466
552
- msgid "You can choose the built-in WordPress export format in addition or exclusive to save your data. This works in automated backups too of course. The advantage is: you can import these files into a blog with the regular WordPress importer."
553
- msgstr "Sie können das interne WordPress-Export-Format zusätzlich oder ausschließlich wählen, um Ihre Daten zu sichern. Das funktioniert natürlich auch in automatischen Backups. Der Vorteil: Sie können dieses Format mit dem normalen WordPress-Importer-Plugin importieren."
554
-
555
- # @ backwpup
556
- #: ../inc/class-page-about.php:474
557
- msgid "Save all data from the webserver"
558
- msgstr "Sichern Sie alle Daten vom Webserver"
559
-
560
- # @ backwpup
561
- #: ../inc/class-page-about.php:477
562
- msgid "Save all files"
563
- msgstr "Sichern Sie alle Dateien"
564
-
565
- # @ backwpup
566
- #: ../inc/class-page-about.php:478
567
- #, php-format
568
- msgid "You can backup all your attachments, also all system files, plugins and themes in a single file. You can <a href=\"%s\">create a job</a> to update a backup copy of your file system only when files are changed."
569
- msgstr "Sie können all Ihre Anhänge sichern, ebenso alle Systemdateien, Plugins und Themes – in einer einzigen Datei. Sie können einen <a href=\\\"%s\\\">Auftrag erstellen</a>, um die Sicherungskopie nur dann zu aktualisieren, wenn sich tatsächlich eine Datei geändert hat."
570
-
571
- # @ backwpup
572
- #: ../inc/class-page-about.php:483
573
- #: ../inc/class-page-about.php:487
574
- msgid "Security!"
575
- msgstr "Sicherheit!"
576
-
577
- # @ backwpup
578
- #: ../inc/class-page-about.php:484
579
- msgid "By default everything is encrypted: connections to external services, local files and access to directories."
580
- msgstr "In der Grundeinstellung ist alles verschlüsselt: Verbindungen zu externen Diensten, lokale Dateien und der Zugriff auf die Verzeichnisse."
581
-
582
- # @ backwpup
583
- #: ../inc/class-page-about.php:492
584
- #: ../inc/class-page-about.php:495
585
- msgid "Cloud Support"
586
- msgstr "Cloud-Support"
587
-
588
- # @ backwpup
589
- #: ../inc/class-page-about.php:496
590
- msgid "BackWPup supports multiple cloud services in parallel. This ensures backups are redundant."
591
- msgstr "BackWPup unterstützt mehrere Cloud-Dienste parallel. Damit wird sichergestellt, dass Sie redundante Backups anlegen können."
592
-
593
- # @ backwpup
594
- #: ../inc/class-page-about.php:504
595
- msgid "Features / differences between Free and Pro"
596
- msgstr "Features / Unterschiede zwischen Free und Pro"
597
-
598
- # @ backwpup
599
- #: ../inc/class-page-about.php:507
600
- msgid "Features"
601
- msgstr "Features"
602
-
603
- # @ backwpup
604
- #: ../inc/class-page-about.php:508
605
- msgid "FREE"
606
- msgstr "FREE"
607
-
608
- # @ backwpup
609
- #: ../inc/class-page-about.php:509
610
- msgid "PRO"
611
- msgstr "PRO"
612
-
613
- # @ backwpup
614
- #: ../inc/class-page-about.php:512
615
- msgid "Complete database backup"
616
- msgstr "Vollständige Datenbanksicherung"
617
-
618
- # @ backwpup
619
- #: ../inc/class-page-about.php:517
620
- msgid "Complete file backup"
621
- msgstr "Vollständige Dateisicherung"
622
-
623
- # @ backwpup
624
- #: ../inc/class-page-about.php:522
625
- msgid "Database check"
626
- msgstr "Datenbanküberprüfung"
627
-
628
- # @ backwpup
629
- #: ../inc/class-page-about.php:527
630
- msgid "Data compression"
631
- msgstr "Datenbankoptimierung"
632
-
633
- # @ backwpup
634
- #: ../inc/class-page-about.php:532
635
- msgid "WordPress XML export"
636
- msgstr "WordPress XML Export"
637
-
638
- # @ backwpup
639
- #: ../inc/class-page-about.php:537
640
- msgid "List of installed plugins"
641
- msgstr "Liste installierter Plugins"
642
-
643
- # @ backwpup
644
- #: ../inc/class-page-about.php:542
645
- msgid "Backup archives management"
646
- msgstr "Verwaltung der Backup-Archive"
647
-
648
- # @ backwpup
649
- #: ../inc/class-page-about.php:547
650
- msgid "Log file management"
651
- msgstr "Verwaltung der Log-Dateien"
652
-
653
- # @ backwpup
654
- #: ../inc/class-page-about.php:552
655
- msgid "Start jobs per WP-Cron, URL, system, backend or WP-CLI"
656
- msgstr "Start der Aufträge über WP-Cron, URL, System, Backend, WP-CLI"
657
-
658
- # @ backwpup
659
- #: ../inc/class-page-about.php:557
660
- msgid "Log report via email"
661
- msgstr "Log-Report via E-Mail"
662
-
663
- # @ backwpup
664
- #: ../inc/class-page-about.php:562
665
- msgid "Backup to Microsoft Azure"
666
- msgstr "Backup zu Microsoft Azure"
667
-
668
- # @ backwpup
669
- #: ../inc/class-page-about.php:567
670
- msgid "Backup as email"
671
- msgstr "Backup per E-Mail"
672
-
673
- # @ backwpup
674
- #: ../inc/class-page-about.php:572
675
- msgid "Backup to S3 services <small>(Amazon, Google Storage, Hosteurope and more)</small>"
676
- msgstr "Backup zu S3-Dienstleistern <small>(Amazon, Google Storage, Hosteurope, usw)</small>"
677
-
678
- # @ backwpup
679
- #: ../inc/class-page-about.php:587
680
- msgid "Backup to FTP server"
681
- msgstr "Backup auf FTP-Server"
682
-
683
- # @ backwpup
684
- #: ../inc/class-page-about.php:592
685
- msgid "Backup to your web space"
686
- msgstr "Backup auf eigenem Webspace"
687
-
688
- # @ backwpup
689
- #: ../inc/class-page-about.php:602
690
- msgid "Backup to Google Drive"
691
- msgstr "Backup zu Google Drive"
692
-
693
- # @ backwpup
694
- #: ../inc/class-page-about.php:607
695
- msgid "Backup to Amazon Glacier"
696
- msgstr "Backup zu Amazon Glacier"
697
-
698
- # @ backwpup
699
- #: ../inc/class-page-about.php:612
700
- msgid "Custom API keys for DropBox and SugarSync"
701
- msgstr "Eigene API-Keys für DropBox und SugarSync hinterlegen"
702
-
703
- # @ backwpup
704
- #: ../inc/class-page-about.php:617
705
- msgid "XML database backup as PHPMyAdmin schema"
706
- msgstr "XML-Datenbanksicherung der Datenbank nach PHPMyAdmin-Schema"
707
-
708
- # @ backwpup
709
- #: ../inc/class-page-about.php:622
710
- msgid "Database backup as mysqldump per command line"
711
- msgstr "Datenbanksicherung mit System-Kommando mysqldump"
712
-
713
- # @ backwpup
714
- #: ../inc/class-page-about.php:627
715
- msgid "Database backup for additional MySQL databases"
716
- msgstr "Datenbanksicherung weiterer MySQL-Datenbanken"
717
-
718
- # @ backwpup
719
- #: ../inc/class-page-about.php:632
720
- msgid "Import and export job settings as XML"
721
- msgstr "Auftragseinstellungen als XML ex- und importieren"
722
-
723
- # @ backwpup
724
- #: ../inc/class-page-about.php:637
725
- msgid "Wizard for system tests"
726
- msgstr "Assistent zur Ausführung eines Systemtests"
727
-
728
- # @ backwpup
729
- #: ../inc/class-page-about.php:642
730
- msgid "Wizard for scheduled backup jobs"
731
- msgstr "Assistent zur Einrichtung von Sicherungsaufträgen"
732
-
733
- # @ backwpup
734
- #: ../inc/class-page-about.php:647
735
- msgid "Wizard to import settings and backup jobs"
736
- msgstr "Assistent zum Importieren von Einstellungen und Aufträgen"
737
-
738
- # @ backwpup
739
- #: ../inc/class-page-about.php:652
740
- msgid "Differential backup of changed directories to Dropbox"
741
- msgstr "Sicherung geänderter Verzeichnisse in einer Dropbox"
742
-
743
- # @ backwpup
744
- #: ../inc/class-page-about.php:657
745
- msgid "Differential backup of changed directories to Rackspace Cloud Files"
746
- msgstr "Sicherung geänderter Verzeichnisse nach Rackspace Cloud Files"
747
-
748
- # @ backwpup
749
- #: ../inc/class-page-about.php:662
750
- msgid "Differential backup of changed directories to S3"
751
- msgstr "Sicherung geänderter Verzeichnisse nach S3"
752
-
753
- # @ backwpup
754
- #: ../inc/class-page-about.php:667
755
- msgid "Differential backup of changed directories to MS Azure"
756
- msgstr "Sicherung geänderter Verzeichnisse nach MS Azure"
757
-
758
- # @ backwpup
759
- #: ../inc/class-page-about.php:672
760
- msgid "<strong>Premium support</strong>"
761
- msgstr "<strong>Premium-Support</strong>"
762
-
763
- # @ backwpup
764
- #: ../inc/class-page-about.php:677
765
- msgid "<strong>Dynamically loaded documentation</strong>"
766
- msgstr "<strong>Integration einer dynamischen Dokumentation</strong>"
767
-
768
- # @ backwpup
769
- #: ../inc/class-page-about.php:682
770
- msgid "<strong>Automatic update from MarketPress</strong>"
771
- msgstr "<strong>Automatische Aktualisierung durch MarketPress</strong>"
772
-
773
- # @ backwpup
774
- #: ../inc/class-page-about.php:689
775
- msgid "http://marketpress.com/product/backwpup-pro/"
776
- msgstr "http://marketpress.de/product/backwpup-pro/"
777
-
778
- # @ backwpup
779
- #: ../inc/class-page-about.php:689
780
- msgid "GET PRO"
781
- msgstr "GET PRO"
782
-
783
- # @ backwpup
784
- #: ../inc/class-install.php:71
785
- msgid "BackWPup Admin"
786
- msgstr "BackWPup Admin"
787
-
788
- # @ backwpup
789
- #: ../inc/class-install.php:84
790
- msgid "BackWPup jobs checker"
791
- msgstr "BackWPup Auftragsprüfung"
792
-
793
- # @ backwpup
794
- #: ../inc/class-install.php:97
795
- msgid "BackWPup jobs helper"
796
- msgstr "BackWPup Auftragshelfer"
797
-
798
- # @ backwpup
799
- #: ../inc/class-help.php:15
800
- msgid "Plugin Info"
801
- msgstr "Plugin Info"
802
-
803
- # @ backwpup
804
- #: ../inc/class-help.php:17
805
- #, php-format
806
- msgctxt "Plugin name and link; Plugin Version"
807
- msgid "%1$s version %2$s. A project by <a href=\"http://inpsyde.com\">Inpsyde GmbH</a>."
808
- msgstr "%1$s Version %2$s. Ein Projekt von <a href=\"http://inpsyde.com\">Inpsyde GmbH</a>."
809
-
810
- # @ backwpup
811
- #: ../inc/class-help.php:18
812
- msgid "BackWPup comes with ABSOLUTELY NO WARRANTY. This is a free software, and you are welcome to redistribute it under certain conditions."
813
- msgstr "BackWPup erhalten Sie OHNE JEDWEDE GARANTIE. Dies ist freie Software (quelloffen, im Sinne von Open Source) und Sie sind eingeladen, sie unter bestimmten Bedingungen weiterzugeben."
814
-
815
- # @ backwpup
816
- #: ../inc/class-help.php:21
817
- msgid "For more information:"
818
- msgstr "Für weitere Informationen:"
819
-
820
- # @ backwpup
821
- #: ../inc/class-help.php:23
822
- msgid "Plugin on wordpress.org"
823
- msgstr "Plugin auf wordpress.org"
824
-
825
- # @ backwpup
826
- #: ../inc/class-help.php:24
827
- msgid "https://marketpress.com/news/"
828
- msgstr "https://marketpress.de/news/"
829
-
830
- # @ backwpup
831
- #: ../inc/class-help.php:24
832
- msgid "News"
833
- msgstr "Neuigkeiten"
834
-
835
- # @ backwpup
836
- #: ../inc/class-help.php:26
837
- msgid "https://marketpress.com/support/forum/plugins/backwpup-pro/"
838
- msgstr "https://marketpress.de/support/forum/plugins/backwpup-pro/"
839
-
840
- # @ backwpup
841
- #: ../inc/class-help.php:26
842
- msgid "Pro Support"
843
- msgstr "Pro-Support"
844
-
845
- # @ backwpup
846
- #: ../inc/class-help.php:28
847
- msgid "http://wordpress.org/support/plugin/backwpup/"
848
- msgstr "http://wordpress.org/support/plugin/backwpup/"
849
-
850
- # @ backwpup
851
- #: ../inc/class-help.php:28
852
- msgid "Support"
853
- msgstr "Support"
854
-
855
- # @ backwpup
856
- #: ../inc/class-help.php:29
857
- msgid "https://marketpress.com/documentation/backwpup-pro/"
858
- msgstr "https://marketpress.de/dokumentation/backwpup-pro/"
859
-
860
- # @ backwpup
861
- #: ../inc/class-help.php:29
862
- msgid "Manual"
863
- msgstr "Handbuch"
864
-
865
- # @ backwpup
866
- #: ../inc/class-destination-ftp.php:23
867
- msgid "FTP server and login"
868
- msgstr "FTP-Server und -Anmeldung"
869
-
870
- # @ backwpup
871
- #: ../inc/class-destination-ftp.php:27
872
- msgid "FTP server"
873
- msgstr "FTP-Server"
874
-
875
- # @ backwpup
876
- #: ../inc/class-destination-ftp.php:31
877
- msgid "Port:"
878
- msgstr "Port:"
879
-
880
- # @ backwpup
881
- #: ../inc/class-destination-ftp.php:37
882
- msgid "Username"
883
- msgstr "Benutzername"
884
-
885
- # @ backwpup
886
- #: ../inc/class-destination-ftp.php:44
887
- msgid "Password"
888
- msgstr "Passwort"
889
-
890
- # @ backwpup
891
- #: ../inc/class-destination-ftp.php:56
892
- msgid "Folder to store files in"
893
- msgstr "Order für Dateien"
894
-
895
- # @ backwpup
896
- #: ../inc/class-destination-ftp.php:68
897
- msgid "Maximum number of files to keep in folder."
898
- msgstr "Maximale Anzahl von Dateien im Ordner."
899
-
900
- # @ backwpup
901
- #: ../inc/class-destination-ftp.php:78
902
- msgid "FTP specific settings"
903
- msgstr "FTP-Einstellungen"
904
-
905
- # @ backwpup
906
- #: ../inc/class-destination-ftp.php:82
907
- msgid "Timeout for FTP connection"
908
- msgstr "Zeitüberschreitung bei der FTP-Verbindung"
909
-
910
- # @ backwpup
911
- #: ../inc/class-destination-ftp.php:86
912
- msgid "seconds"
913
- msgstr "Sekunden"
914
-
915
- # @ backwpup
916
- #: ../inc/class-destination-ftp.php:90
917
- msgid "SSL-FTP connection"
918
- msgstr "SSL-FTP-Verbindung"
919
-
920
- # @ backwpup
921
- #: ../inc/class-destination-ftp.php:94
922
- msgid "Use explicit SSL-FTP connection."
923
- msgstr "Nutze explizit SSL-FTP Verbindung"
924
-
925
- # @ backwpup
926
- #: ../inc/class-destination-ftp.php:99
927
- msgid "FTP Passive Mode"
928
- msgstr "FTP-Passivmodus"
929
-
930
- # @ backwpup
931
- #: ../inc/class-destination-ftp.php:103
932
- msgid "Use FTP Passive Mode."
933
- msgstr "Nutze FTP-Passivmodus"
934
-
935
- # @ backwpup
936
- #: ../inc/class-destination-ftp.php:179
937
- msgid "FTP: Login failure!"
938
- msgstr "FTP: Anmeldung fehlgeschlagen!"
939
-
940
- # @ backwpup
941
- #: ../inc/class-destination-ftp.php:203
942
- #, php-format
943
- msgid "%d. Try to send backup file to an FTP server&#160;&hellip;"
944
- msgstr "%d. Versuche, Backup an FTP-Server zu senden&#160;&hellip;"
945
-
946
- # @ backwpup
947
- #: ../inc/class-destination-ftp.php:209
948
- #, php-format
949
- msgid "Connected via explicit SSL-FTP to server: %s"
950
- msgstr "Durch explizite SSL-FTP-Verbindung zum Server verbunden: %s"
951
-
952
- # @ backwpup
953
- #: ../inc/class-destination-ftp.php:211
954
- #, php-format
955
- msgid "Cannot connect via explicit SSL-FTP to server: %s"
956
- msgstr "Kann nicht mit explizit SSL-FTP zum Server verbinden: %s"
957
-
958
- # @ backwpup
959
- #: ../inc/class-destination-ftp.php:217
960
- msgid "PHP function to connect with explicit SSL-FTP to server does not exist!"
961
- msgstr "PHP-Funktion für die Verbindung mit explizit SSL-FTP zum Server existiert nicht!"
962
-
963
- # @ backwpup
964
- #: ../inc/class-destination-ftp.php:225
965
- #, php-format
966
- msgid "Connected to FTP server: %s"
967
- msgstr "Verbunden mit dem FTP-Server: %s"
968
-
969
- # @ backwpup
970
- #: ../inc/class-destination-ftp.php:227
971
- #, php-format
972
- msgid "Cannot connect to FTP server: %s"
973
- msgstr "Kann nicht mit dem FTP-Server verbinden: %s"
974
-
975
- # @ backwpup
976
- #: ../inc/class-destination-ftp.php:234
977
- #: ../inc/class-destination-ftp.php:242
978
- #: ../inc/class-destination-ftp.php:253
979
- #: ../inc/class-destination-ftp.php:300
980
- #, php-format
981
- msgid "FTP client command: %s"
982
- msgstr "FTP-Client-Befehl: %s"
983
-
984
- # @ backwpup
985
- #: ../inc/class-destination-ftp.php:236
986
- #, php-format
987
- msgid "FTP server response: %s"
988
- msgstr "FTP-Server Antwort: %s"
989
-
990
- # @ backwpup
991
- #: ../inc/class-destination-ftp.php:240
992
- #: ../inc/class-destination-ftp.php:244
993
- #: ../inc/class-destination-ftp.php:256
994
- #: ../inc/class-destination-ftp.php:258
995
- #: ../inc/class-destination-ftp.php:303
996
- #: ../inc/class-destination-ftp.php:305
997
- #: ../inc/class-destination-ftp.php:309
998
- #: ../inc/class-destination-ftp.php:311
999
- #, php-format
1000
- msgid "FTP server reply: %s"
1001
- msgstr "Antwort des FTP-Servers: %s"
1002
-
1003
- # @ backwpup
1004
- #: ../inc/class-destination-ftp.php:258
1005
- msgid "Error getting SYSTYPE"
1006
- msgstr "Fehler, SYSTYPE wird angezeigt"
1007
-
1008
- # @ backwpup
1009
- #: ../inc/class-destination-ftp.php:276
1010
- #, php-format
1011
- msgid "FTP Folder \"%s\" created!"
1012
- msgstr "FTP-Ordner \"%s\" erstellt!"
1013
-
1014
- # @ backwpup
1015
- #: ../inc/class-destination-ftp.php:280
1016
- #, php-format
1017
- msgid "FTP Folder \"%s\" cannot be created!"
1018
- msgstr "FTP-Ordner \"%s\" kann nicht erstellt werden!"
1019
-
1020
- # @ backwpup
1021
- #: ../inc/class-destination-ftp.php:291
1022
- #, php-format
1023
- msgid "FTP current folder is: %s"
1024
- msgstr "Aktueller FTP-Ordner ist: %s"
1025
-
1026
- # @ backwpup
1027
- #: ../inc/class-destination-ftp.php:303
1028
- msgid "Entering passive mode"
1029
- msgstr "Passivmodus gestartet"
1030
-
1031
- # @ backwpup
1032
- #: ../inc/class-destination-ftp.php:305
1033
- msgid "Cannot enter passive mode"
1034
- msgstr "Starten des passiven Modus’ nicht möglich"
1035
-
1036
- # @ backwpup
1037
- #: ../inc/class-destination-ftp.php:309
1038
- msgid "Entering normal mode"
1039
- msgstr "Starte Normalmodus"
1040
-
1041
- # @ backwpup
1042
- #: ../inc/class-destination-ftp.php:311
1043
- msgid "Cannot enter normal mode"
1044
- msgstr "Normalmodus kann nicht gestartet werden"
1045
-
1046
- # @ backwpup
1047
- #: ../inc/class-destination-ftp.php:315
1048
- msgid "Starting upload to FTP &#160;&hellip;"
1049
- msgstr "Hochladen ins FTP-Verzeichnis hat begonnen&#160;&hellip;"
1050
-
1051
- # @ backwpup
1052
- #: ../inc/class-destination-ftp.php:327
1053
- msgid "Cannot transfer backup to FTP server!"
1054
- msgstr "Backup kann nicht zum FTP-Server übertragen werden!"
1055
-
1056
- # @ backwpup
1057
- #: ../inc/class-destination-ftp.php:333
1058
- #, php-format
1059
- msgid "Backup transferred to FTP server: %s"
1060
- msgstr "Backup Archiv übertragen zum FTP-Server: %s"
1061
-
1062
- # @ backwpup
1063
- #: ../inc/class-destination-ftp.php:379
1064
- #, php-format
1065
- msgid "Cannot delete \"%s\" on FTP server!"
1066
- msgstr "Kann \"%s\" auf dem FTP-Server nicht löschen!"
1067
-
1068
- # @ backwpup
1069
- #: ../inc/class-destination-ftp.php:382
1070
- #, php-format
1071
- msgid "One file deleted on FTP server"
1072
- msgid_plural "%d files deleted on FTP server"
1073
- msgstr[0] "Eine Datei vom FTP-Server gelöscht"
1074
- msgstr[1] "%d Dateien vom FTP-Server gelöscht"
1075
-
1076
- # @ backwpup
1077
- #: ../inc/class-jobtype-file.php:15
1078
- msgid "Files"
1079
- msgstr "Dateien"
1080
-
1081
- # @ backwpup
1082
- #: ../inc/class-jobtype-file.php:16
1083
- msgid "File backup"
1084
- msgstr "Dateien Backup"
1085
-
1086
- # @ backwpup
1087
- #: ../inc/class-jobtype-file.php:64
1088
- msgid "Folders to backup"
1089
- msgstr "Zu sichernde Verzeichnisse"
1090
-
1091
- # @ backwpup
1092
- #: ../inc/class-jobtype-file.php:68
1093
- msgid "Backup root folder"
1094
- msgstr "Root Verzeichnis sichern"
1095
-
1096
- # @ backwpup
1097
- #: ../inc/class-jobtype-file.php:79
1098
- #: ../inc/class-jobtype-file.php:116
1099
- #: ../inc/class-jobtype-file.php:153
1100
- #: ../inc/class-jobtype-file.php:190
1101
- #: ../inc/class-jobtype-file.php:227
1102
- #, php-format
1103
- msgid "Path as set by user (symlink?): %s"
1104
- msgstr "Pfad, wie vom User gesetzt (symlink?): %s"
1105
-
1106
- # @ backwpup
1107
- #: ../inc/class-jobtype-file.php:82
1108
- #: ../inc/class-jobtype-file.php:119
1109
- #: ../inc/class-jobtype-file.php:156
1110
- #: ../inc/class-jobtype-file.php:193
1111
- #: ../inc/class-jobtype-file.php:230
1112
- msgid "Exclude:"
1113
- msgstr "Ausschließen:"
1114
-
1115
- # @ backwpup
1116
- #: ../inc/class-jobtype-file.php:93
1117
- #: ../inc/class-jobtype-file.php:130
1118
- #: ../inc/class-jobtype-file.php:167
1119
- #: ../inc/class-jobtype-file.php:204
1120
- #: ../inc/class-jobtype-file.php:241
1121
- msgid "Excluded by .donotbackup file!"
1122
- msgstr "Ausgeschlossen durch .donotbackup Datei!"
1123
-
1124
- # @ backwpup
1125
- #: ../inc/class-jobtype-file.php:105
1126
- msgid "Backup content folder"
1127
- msgstr "Sicherung des Content Verzeichnisses"
1128
-
1129
- # @ backwpup
1130
- #: ../inc/class-jobtype-file.php:142
1131
- msgid "Backup plugins"
1132
- msgstr "Plugins sichern"
1133
-
1134
- # @ backwpup
1135
- #: ../inc/class-jobtype-file.php:179
1136
- msgid "Backup themes"
1137
- msgstr "Themes sichern"
1138
-
1139
- # @ backwpup
1140
- #: ../inc/class-jobtype-file.php:216
1141
- msgid "Backup uploads folder"
1142
- msgstr "Uploads Verzeichnis sichern"
1143
-
1144
- # @ backwpup
1145
- #: ../inc/class-jobtype-file.php:253
1146
- msgid "Extra folders to backup"
1147
- msgstr "Weitere Verzeichnisse sichern"
1148
-
1149
- # @ backwpup
1150
- #: ../inc/class-jobtype-file.php:260
1151
- msgid "Exclude from backup"
1152
- msgstr "Nicht mitsichern"
1153
-
1154
- # @ backwpup
1155
- #: ../inc/class-jobtype-file.php:264
1156
- msgid "Thumbnails in uploads"
1157
- msgstr "Thumbnails in uploads"
1158
-
1159
- # @ backwpup
1160
- #: ../inc/class-jobtype-file.php:268
1161
- msgid "Don't backup thumbnails from the site's uploads folder."
1162
- msgstr "Thumbnails im Uploads-Verzeichnis der Website nicht mitsichern."
1163
-
1164
- # @ backwpup
1165
- #: ../inc/class-jobtype-file.php:268
1166
- msgid "All images with -???x???. will be excluded. Use a plugin like Regenerate Thumbnails to rebuild them after a restore."
1167
- msgstr "Alle Bilder mit -???x??? im Dateinamen werden nicht mitgesichert. Benutze ein Plugin wir Regenerate Thumbnails um die Thumbnails wiederherzustellen."
1168
-
1169
- # @ backwpup
1170
- #: ../inc/class-jobtype-file.php:272
1171
- msgid "Exclude files/folders from backup"
1172
- msgstr "Datein/Verzeichnisse nicht mitsichern."
1173
-
1174
- # @ backwpup
1175
- #: ../inc/class-jobtype-file.php:279
1176
- msgid "Special option"
1177
- msgstr "Spezialoption"
1178
-
1179
- # @ backwpup
1180
- #: ../inc/class-jobtype-file.php:283
1181
- msgid "Include special files"
1182
- msgstr "Spezielle Dateien einschließen"
1183
-
1184
- # @ backwpup
1185
- #: ../inc/class-jobtype-file.php:287
1186
- msgid "Backup wp-config.php, robots.txt, .htaccess, .htpasswd and favicon.ico from root."
1187
- msgstr "Sichere wp-config.php, robots.txt, .htaccess, .htpasswd und favicon.ico vom Root"
1188
-
1189
- # @ backwpup
1190
- #: ../inc/class-jobtype-file.php:287
1191
- msgid "If the WordPress root folder is not included in this backup job, check this option to additionally include wp-config.php, robots.txt, .htaccess, .htpasswd and favicon.ico into the backup. Your wp-config.php will be included even if you placed it in the parent directory of your root folder."
1192
- msgstr "Sofern das WordPress-Wurzelverzeichnis nicht sowieso im Backup inkludiert ist, aktiviere diese Option, um zusätzlich die Dateien wp-config.php, robots.txt, .htaccess, .htpasswd und favicon.ico mitzusichern. Die wp-config-php-Datei wird in diesem Fall auch dann mitgesichert, wenn sie sich eine Ordner-Ebene höher als WordPress befindet."
1193
-
1194
- # @ backwpup
1195
- #: ../inc/class-jobtype-file.php:364
1196
- #, php-format
1197
- msgid "%d. Trying to make a list of folders to back up&#160;&hellip;"
1198
- msgstr "%d. Versuche, eine Liste der Ordner für das Backup zu erstellen&#160;&hellip;"
1199
-
1200
- # @ backwpup
1201
- #: ../inc/class-jobtype-file.php:483
1202
- #: ../inc/class-jobtype-file.php:490
1203
- #: ../inc/class-jobtype-file.php:497
1204
- #: ../inc/class-jobtype-file.php:503
1205
- #: ../inc/class-jobtype-file.php:509
1206
- #: ../inc/class-jobtype-file.php:515
1207
- #, php-format
1208
- msgid "Added \"%s\" to backup file list"
1209
- msgstr "\"%s\" zur Backup-Datei-Liste hinzugefügt."
1210
-
1211
- # @ backwpup
1212
- #: ../inc/class-jobtype-file.php:520
1213
- msgid "No files/folder for the backup."
1214
- msgstr "Keine Dateien/Ordner für das Backup."
1215
-
1216
- # @ backwpup
1217
- #: ../inc/class-jobtype-file.php:522
1218
- #, php-format
1219
- msgid "%1$d folders to backup."
1220
- msgstr "%1$d Ordner für Backup."
1221
-
1222
- # @ backwpup
1223
- #: ../inc/class-jobtype-file.php:561
1224
- #, php-format
1225
- msgid "Folder \"%s\" is not readable!"
1226
- msgstr "Ordner \"%s\" ist nicht lesbar!"
1227
-
1228
- # @ backwpup
1229
- #: ../inc/class-create-archive.php:71
1230
- msgid "The file name of an archive cannot be empty."
1231
- msgstr "Der Dateiname eines Archivs kann nicht leer sein."
1232
-
1233
- # @ backwpup
1234
- #: ../inc/class-create-archive.php:79
1235
- #, php-format
1236
- msgctxt "%s = Folder name"
1237
- msgid "Folder %s for archive not found"
1238
- msgstr "Ordner %s für Archiv nicht gefunden"
1239
-
1240
- # @ backwpup
1241
- #: ../inc/class-create-archive.php:85
1242
- #: ../inc/class-create-archive.php:120
1243
- #: ../inc/class-create-archive.php:137
1244
- #: ../inc/class-mysqldump.php:125
1245
- msgid "Functions for gz compression not available"
1246
- msgstr "Die Funktionen für die Gzip-Kompression sind nicht verfügbar."
1247
-
1248
- # @ backwpup
1249
- #: ../inc/class-create-archive.php:92
1250
- #: ../inc/class-create-archive.php:143
1251
- msgid "Functions for bz2 compression not available"
1252
- msgstr "Die Funktionen für die Bz2-Kompression sind nicht verfügbar."
1253
-
1254
- # @ backwpup
1255
- #: ../inc/class-create-archive.php:116
1256
- #, php-format
1257
- msgctxt "ZipArchive open() result"
1258
- msgid "Cannot create zip archive: %d"
1259
- msgstr "Konte ZIP-Datei %d nicht erstellen"
1260
-
1261
- # @ backwpup
1262
- #: ../inc/class-create-archive.php:149
1263
- #, php-format
1264
- msgctxt "%s = file name"
1265
- msgid "Method to archive file %s not detected"
1266
- msgstr "Methode zum Archivieren der Datei %s nicht gefunden"
1267
-
1268
- # @ backwpup
1269
- #: ../inc/class-create-archive.php:154
1270
- msgid "Cannot open archive file"
1271
- msgstr "Kann Archivdatei nicht öffnen"
1272
-
1273
- # @ backwpup
1274
- #: ../inc/class-create-archive.php:174
1275
- #: ../inc/class-create-archive.php:349
1276
- #, php-format
1277
- msgid "PclZip archive add error: %s"
1278
- msgstr "Fehler beim Hinzufügen zum PclZip-Archive: %s"
1279
-
1280
- # @ backwpup
1281
- #: ../inc/class-create-archive.php:189
1282
- msgid "ZIP archive cannot be closed correctly."
1283
- msgstr "ZIP-Archiv kann nicht korrekt geschlossen werden."
1284
-
1285
- # @ backwpup
1286
- #: ../inc/class-create-archive.php:244
1287
- msgid "File name cannot be empty"
1288
- msgstr "Der Dateiname kann nicht leer sein."
1289
-
1290
- # @ backwpup
1291
- #: ../inc/class-create-archive.php:253
1292
- #, php-format
1293
- msgctxt "File to add to archive"
1294
- msgid "File %s does not exist or is not readable"
1295
- msgstr "Datei %s existiert nicht oder ist nicht lesbar"
1296
-
1297
- # @ backwpup
1298
- #: ../inc/class-create-archive.php:266
1299
- #: ../inc/class-create-archive.php:282
1300
- #: ../inc/class-create-archive.php:392
1301
- #: ../inc/class-create-archive.php:396
1302
- msgid "This archive method can only add one file"
1303
- msgstr "Diese Archive-Methode kann nur eine einziges Datei sichern."
1304
-
1305
- # @ backwpup
1306
- #: ../inc/class-create-archive.php:271
1307
- #: ../inc/class-create-archive.php:287
1308
- #, php-format
1309
- msgid "Cannot open source file %s to archive"
1310
- msgstr "Konnte Quelle %s zum Archivieren nicht öffnen"
1311
-
1312
- # @ backwpup
1313
- #: ../inc/class-create-archive.php:311
1314
- msgid "ZipArchive can not closed correctly"
1315
- msgstr "ZIP-Archive kann nicht korrekt geschlossen werden"
1316
-
1317
- # @ backwpup
1318
- #: ../inc/class-create-archive.php:330
1319
- #: ../inc/class-create-archive.php:338
1320
- #: ../inc/class-create-archive.php:407
1321
- #, php-format
1322
- msgid "Cannot add \"%s\" to zip archive!"
1323
- msgstr "\"%s\" kann dem ZIP-Archiv nicht hinzugefügt werden!"
1324
-
1325
- # @ backwpup
1326
- #: ../inc/class-create-archive.php:374
1327
- msgid "Folder name cannot be empty"
1328
- msgstr "Der Verzeichnis Name darf nicht leer sein"
1329
-
1330
- # @ backwpup
1331
- #: ../inc/class-create-archive.php:379
1332
- #, php-format
1333
- msgctxt "Folder path to add to archive"
1334
- msgid "Folder %s does not exist or is not readable"
1335
- msgstr "Verzeichnis %s existiert nicht oder ist nicht lesbar"
1336
-
1337
- # @ backwpup
1338
- #: ../inc/class-create-archive.php:429
1339
- #, php-format
1340
- msgctxt "Text of ZipArchive status Message"
1341
- msgid "ZipArchive returns status: %s"
1342
- msgstr "Das Zip-Archive liefert den Status: %s"
1343
-
1344
- # @ backwpup
1345
- #: ../inc/class-create-archive.php:459
1346
- #, php-format
1347
- msgid "File name \"%1$s\" is too long to be saved correctly in %2$s archive!"
1348
- msgstr "Dateiname \"%1$s\" ist zu lang, um korrekt im %2$s Archiv zu speichern."
1349
-
1350
- # @ backwpup
1351
- #: ../inc/class-create-archive.php:462
1352
- #, php-format
1353
- msgid "File path \"%1$s\" is too long to be saved correctly in %2$s archive!"
1354
- msgstr "Dateipfad \"%1$s\" ist zu lang, um korrekt in %2$s Archiv zu speichern"
1355
-
1356
- # @ backwpup
1357
- #: ../inc/class-create-archive.php:474
1358
- #, php-format
1359
- msgid "Cannot open source file %s for archiving"
1360
- msgstr "Kann Quelldatei %s nicht zum Archivieren öffnen"
1361
-
1362
- # @ backwpup
1363
- #: ../inc/class-create-archive.php:479
1364
- #: ../inc/class-create-archive.php:480
1365
- #: ../inc/class-create-archive.php:579
1366
- #: ../inc/class-create-archive.php:580
1367
- msgid "Unknown"
1368
- msgstr "Unbekannt"
1369
-
1370
- # @ backwpup
1371
- #: ../inc/class-create-archive.php:570
1372
- #, php-format
1373
- msgid "Folder name \"%1$s\" is too long to be saved correctly in %2$s archive!"
1374
- msgstr "Verzeichnis Name \"%1$s\" ist zu lang um ihn koreckt zu speichern im %2$s Archiv"
1375
-
1376
- # @ backwpup
1377
- #: ../inc/class-create-archive.php:573
1378
- #, php-format
1379
- msgid "Folder path \"%1$s\" is too long to be saved correctly in %2$s archive!"
1380
- msgstr "Verzeichnis Pfad \"%1$s\" ist zu lang um ihn koreckt zu speichern im %2$s Archiv"
1381
-
1382
- # @ backwpup
1383
- #: ../inc/class-create-archive.php:651
1384
- #, php-format
1385
- msgid "If %s will be added to your backup archive, the archive will be too large for many file systems (over 2GB). You might want to consider splitting the backup job in multiple jobs with less files each."
1386
- msgstr "Wenn %s zu deinem Backup-Archiv hinzugefügt wird, wird das Archiv zu groß für etliche Dateisysteme (über 2GB). Vielleicht möchtest du den Backup-Auftrag in mehrere Aufträge mit jeweils weniger Dateien splitten?"
1387
-
1388
- # @ backwpup
1389
- #: ../inc/class-cron.php:62
1390
- msgid "Aborted, because no progress for one hour!"
1391
- msgstr "Abgebrochen, aufgrund keines Fortschrittes innerhalb der letzten Stunde!"
1392
-
1393
- # @ backwpup
1394
- #: ../inc/class-page-backups.php:173
1395
- msgid "No files could be found. (List will be generated during next backup.)"
1396
- msgstr "Keine Dateien gefunden. (Liste wird beim nächsten Backup generiert.)"
1397
-
1398
- # @ backwpup
1399
- #: ../inc/class-page-backups.php:185
1400
- #: ../inc/class-page-backups.php:304
1401
- #: ../inc/class-page-logs.php:114
1402
- #: ../inc/class-page-logs.php:192
1403
- msgid "Delete"
1404
- msgstr "Löschen"
1405
-
1406
- # @ backwpup
1407
- #: ../inc/class-page-backups.php:219
1408
- msgid "Change destination"
1409
- msgstr "Ziel ändern"
1410
-
1411
- # @ backwpup
1412
- #: ../inc/class-page-backups.php:258
1413
- #: ../inc/class-page-logs.php:125
1414
- msgid "Time"
1415
- msgstr "Zeit"
1416
-
1417
- # @ backwpup
1418
- #: ../inc/class-page-backups.php:259
1419
- msgid "File"
1420
- msgstr "Datei"
1421
-
1422
- # @ backwpup
1423
- #: ../inc/class-page-backups.php:261
1424
- #: ../inc/class-page-logs.php:129
1425
- msgid "Size"
1426
- msgstr "Größe"
1427
-
1428
- # @ backwpup
1429
- #: ../inc/class-page-backups.php:304
1430
- msgid ""
1431
- "You are about to delete this backup archive. \n"
1432
- " 'Cancel' to stop, 'OK' to delete."
1433
- msgstr ""
1434
- "Sie sind dabei dieses Backup Archiv zu löschen. \n"
1435
- " 'Abbrechen' um zu stoppen, 'OK' um zu löschen."
1436
-
1437
- # @ backwpup
1438
- #: ../inc/class-page-backups.php:306
1439
- #: ../inc/class-page-logs.php:193
1440
- msgid "Download"
1441
- msgstr "Herunterladen"
1442
-
1443
- # @ backwpup
1444
- #: ../inc/class-page-backups.php:335
1445
- msgid "?"
1446
- msgstr "?"
1447
-
1448
- # @ backwpup
1449
- #: ../inc/class-page-backups.php:348
1450
- #: ../inc/class-page-logs.php:153
1451
- #, php-format
1452
- msgid "%1$s at %2$s"
1453
- msgstr "%1$s um %2$s"
1454
-
1455
- # @ backwpup
1456
- #: ../inc/class-page-backups.php:365
1457
- #: ../inc/class-page-backups.php:392
1458
- msgid "Sorry, you don't have permissions to do that."
1459
- msgstr "Sie haben nicht die notwendigen Berechtigungen für diese Aktion."
1460
-
1461
- # @ backwpup
1462
- #: ../inc/class-page-backups.php:413
1463
- msgid "Backup Files"
1464
- msgstr "Backup-Dateien"
1465
-
1466
- # @ backwpup
1467
- #: ../inc/class-page-backups.php:461
1468
- #, php-format
1469
- msgid "%s Manage Backup Archives"
1470
- msgstr "%s Sicherungsarchive verwalten"
1471
-
1472
- # @ backwpup
1473
- #: ../inc/class-wp-cli.php:17
1474
- msgid "A job is already running."
1475
- msgstr "Ein Auftrag läuft gerade."
1476
-
1477
- # @ backwpup
1478
- #: ../inc/class-wp-cli.php:20
1479
- msgid "No job ID specified!"
1480
- msgstr "Keine Auftragsnummer angegeben!"
1481
-
1482
- # @ backwpup
1483
- #: ../inc/class-wp-cli.php:24
1484
- msgid "Job ID does not exist!"
1485
- msgstr "Auftragsnummer existiert nicht!"
1486
-
1487
- # @ backwpup
1488
- #: ../inc/class-wp-cli.php:38
1489
- msgid "Nothing to abort!"
1490
- msgstr "Es gibt nichts abzubrechen!"
1491
-
1492
- # @ backwpup
1493
- #: ../inc/class-wp-cli.php:42
1494
- msgid "Job will be terminated."
1495
- msgstr "Auftrag wird beendet."
1496
-
1497
- # @ backwpup
1498
- #: ../inc/class-wp-cli.php:54
1499
- msgid "List of jobs"
1500
- msgstr "Auftragsliste"
1501
-
1502
- # @ backwpup
1503
- #: ../inc/class-wp-cli.php:57
1504
- #: ../inc/class-wp-cli.php:76
1505
- #, php-format
1506
- msgid "ID: %1$d Name: %2$s"
1507
- msgstr "ID: %1$d Name: %2$s"
1508
-
1509
- # @ backwpup
1510
- #: ../inc/class-wp-cli.php:73
1511
- msgid "No job running"
1512
- msgstr "Kein laufender Auftrag"
1513
-
1514
- # @ backwpup
1515
- #: ../inc/class-wp-cli.php:74
1516
- msgid "Running job"
1517
- msgstr "Laufender Auftrag"
1518
-
1519
- # @ backwpup
1520
- #: ../inc/class-wp-cli.php:77
1521
- #, php-format
1522
- msgid "Warnings: %1$d Errors: %2$d"
1523
- msgstr "Warnungen: %1$d Fehler: %2$d"
1524
-
1525
- # @ backwpup
1526
- #: ../inc/class-wp-cli.php:78
1527
- #, php-format
1528
- msgid "Steps in percent: %1$d percent of step: %2$d"
1529
- msgstr "Schritte in Prozent: %1$d Prozent des Schritts: %2$d"
1530
-
1531
- # @ backwpup
1532
- #: ../inc/class-wp-cli.php:79
1533
- #, php-format
1534
- msgid "On step: %s"
1535
- msgstr "Bei Schritt: %s"
1536
-
1537
- # @ backwpup
1538
- #: ../inc/class-wp-cli.php:80
1539
- #, php-format
1540
- msgid "Last message: %s"
1541
- msgstr "Letzte Nachricht: %s"
1542
-
1543
- # @ backwpup
1544
- #: ../inc/class-option.php:102
1545
- msgid "New Job"
1546
- msgstr "Bitte geben Sie einen Namen ein"
1547
-
1548
- # @ backwpup
1549
- #: ../inc/class-page-logs.php:102
1550
- msgid "No Logs."
1551
- msgstr "Keine Protokolldateien."
1552
-
1553
- # @ backwpup
1554
- #: ../inc/class-page-logs.php:126
1555
- msgid "Job"
1556
- msgstr "Auftrag"
1557
-
1558
- # @ backwpup
1559
- #: ../inc/class-page-logs.php:127
1560
- msgid "Status"
1561
- msgstr "Status"
1562
-
1563
- # @ backwpup
1564
- #: ../inc/class-page-logs.php:128
1565
- msgid "Type"
1566
- msgstr "Typ"
1567
-
1568
- # @ backwpup
1569
- #: ../inc/class-page-logs.php:130
1570
- msgid "Runtime"
1571
- msgstr "Laufzeit"
1572
-
1573
- # @ backwpup
1574
- #: ../inc/class-page-logs.php:188
1575
- #, php-format
1576
- msgid "Job ID: %d"
1577
- msgstr "Auftrags-ID: %d"
1578
-
1579
- # @ backwpup
1580
- #: ../inc/class-page-logs.php:190
1581
- msgid "View"
1582
- msgstr "Ansehen"
1583
-
1584
- # @ backwpup
1585
- #: ../inc/class-page-logs.php:209
1586
- #, php-format
1587
- msgid "1 ERROR"
1588
- msgid_plural "%d ERRORS"
1589
- msgstr[0] "1 FEHLER"
1590
- msgstr[1] "%d FEHLER"
1591
-
1592
- # @ backwpup
1593
- #: ../inc/class-page-logs.php:211
1594
- #, php-format
1595
- msgid "1 WARNING"
1596
- msgid_plural "%d WARNINGS"
1597
- msgstr[0] "1 WARNUNG"
1598
- msgstr[1] "%d WARNUNGEN"
1599
-
1600
- # @ backwpup
1601
- #: ../inc/class-page-logs.php:213
1602
- msgid "O.K."
1603
- msgstr "O.K."
1604
-
1605
- # @ backwpup
1606
- #: ../inc/class-page-logs.php:230
1607
- msgid "Log only"
1608
- msgstr "Nur Log"
1609
-
1610
- # @ backwpup
1611
- #: ../inc/class-page-logs.php:301
1612
- #: ../inc/class-admin.php:202
1613
- msgid "Logs"
1614
- msgstr "Protokolle"
1615
-
1616
- # @ backwpup
1617
- #: ../inc/class-page-logs.php:364
1618
- #, php-format
1619
- msgid "%s Logs"
1620
- msgstr "%s Logs"
1621
-
1622
- # @ backwpup
1623
- #: ../inc/class-mysqldump.php:55
1624
- msgid "No MySQLi extension found. Please install it."
1625
- msgstr "Keine MySQLi Erweiterung gefunden. Bitte installieren Sie diese"
1626
-
1627
- # @ backwpup
1628
- #: ../inc/class-mysqldump.php:93
1629
- msgid "Cannot init MySQLi database connection"
1630
- msgstr "MySQLi Datenbank-Verbindung kann nicht initialisiert werden."
1631
-
1632
- # @ backwpup
1633
- #: ../inc/class-mysqldump.php:97
1634
- #, php-format
1635
- msgid "Setting of MySQLi init command \"%s\" failed"
1636
- msgstr "Einstellung vom MySQLi Initialisierungsbefehl \"%s\" ist fehlgeschlagen"
1637
-
1638
- # @ backwpup
1639
- #: ../inc/class-mysqldump.php:101
1640
- msgid "Setting of MySQLi connection timeout failed"
1641
- msgstr "Einstellung von der MySQLi Verbindungs-Zeitüberschreitung ist fehlgeschlagen"
1642
-
1643
- # @ backwpup
1644
- #: ../inc/class-mysqldump.php:105
1645
- #, php-format
1646
- msgid "Cannot connect to MySQL database %1$d: %2$s"
1647
- msgstr "Kann keine Verbindung zur Datenbank %1$d herstellen: %2$s"
1648
-
1649
- # @ backwpup
1650
- #: ../inc/class-mysqldump.php:111
1651
- #, php-format
1652
- msgctxt "Database Charset"
1653
- msgid "Cannot set DB charset to %s"
1654
- msgstr "Kann Datenbank-Zeichenkodierung nicht auf %s setzen."
1655
-
1656
- # @ backwpup
1657
- #: ../inc/class-mysqldump.php:138
1658
- msgid "Cannot open SQL backup file"
1659
- msgstr "Kann SQL Backup Datei nicht öffnen"
1660
-
1661
- # @ backwpup
1662
- #: ../inc/class-mysqldump.php:144
1663
- #: ../inc/class-mysqldump.php:155
1664
- #: ../inc/class-mysqldump.php:237
1665
- #: ../inc/class-mysqldump.php:250
1666
- #: ../inc/class-mysqldump.php:264
1667
- #: ../inc/class-mysqldump.php:277
1668
- #: ../inc/class-mysqldump.php:320
1669
- #: ../inc/class-mysqldump.php:342
1670
- #: ../inc/class-mysqldump.php:404
1671
- #, php-format
1672
- msgid "Database error %1$s for query %2$s"
1673
- msgstr "Datenbankfehler %1$s für die Abfrage (Query) %2$s"
1674
-
1675
- # @ backwpup
1676
- #: ../inc/class-mysqldump.php:388
1677
- #, php-format
1678
- msgid "Start for table backup is not correctly set: %1$s "
1679
- msgstr "Start für den Tabellen Backup ist nicht richtig gesetzt: %1$s "
1680
-
1681
- # @ backwpup
1682
- #: ../inc/class-mysqldump.php:392
1683
- #, php-format
1684
- msgid "Length for table backup is not correctly set: %1$s "
1685
- msgstr "Länge des Tabellen Backups ist nicht richtig gesetzt: %1$s "
1686
-
1687
- # @ backwpup
1688
- #: ../inc/class-mysqldump.php:460
1689
- msgid "Error while writing file!"
1690
- msgstr "Fehler beim Schreiben!"
1691
-
1692
- # @ backwpup
1693
- #: ../inc/class-admin.php:137
1694
- msgid "Documentation"
1695
- msgstr "Dokumentation"
1696
-
1697
- # @ backwpup
1698
- #: ../inc/class-admin.php:154
1699
- msgid "BackWPup Dashboard"
1700
- msgstr "BackWPup Dashboard"
1701
-
1702
- # @ backwpup
1703
- #: ../inc/class-admin.php:154
1704
- msgid "Dashboard"
1705
- msgstr "Dashboard"
1706
-
1707
- # @ backwpup
1708
- #: ../inc/class-admin.php:171
1709
- msgid "Jobs"
1710
- msgstr "Aufträge"
1711
-
1712
- # @ backwpup
1713
- #: ../inc/class-admin.php:186
1714
- msgid "Add new job"
1715
- msgstr "Neuer Auftrag"
1716
-
1717
- # @ backwpup
1718
- #: ../inc/class-admin.php:217
1719
- msgid "Backups"
1720
- msgstr "Backups"
1721
-
1722
- # @ backwpup
1723
- #: ../inc/class-admin.php:232
1724
- msgid "Settings"
1725
- msgstr "Einstellungen"
1726
-
1727
- # @ backwpup
1728
- #: ../inc/class-admin.php:245
1729
- msgid "About"
1730
- msgstr "Über"
1731
-
1732
- # @ backwpup
1733
- #: ../inc/class-admin.php:282
1734
- #: ../inc/class-admin.php:288
1735
- msgid "Cheating, huh?"
1736
- msgstr "Mogeln, wie?"
1737
-
1738
- # @ backwpup
1739
- #: ../inc/class-admin.php:400
1740
- msgid "http://marketpress.com"
1741
- msgstr "http://marketpress.com"
1742
-
1743
- # @ backwpup
1744
- #: ../inc/class-admin.php:400
1745
- msgid "MarketPress"
1746
- msgstr "MarketPress"
1747
-
1748
- # @ backwpup
1749
- #: ../inc/class-admin.php:402
1750
- #, php-format
1751
- msgid "<a class=\"backwpup-get-pro\" href=\"%s\">Get BackWPup Pro now.</a>"
1752
- msgstr "<a class=\"backwpup-get-pro\" href=\"%s\">Wechsle jetzt zu BackWPup Pro.</a>"
1753
-
1754
- # @ backwpup
1755
- #: ../inc/class-admin.php:421
1756
- #, php-format
1757
- msgid "version %s"
1758
- msgstr "Version %s"
1759
-
1760
- # @ backwpup
1761
- #: ../inc/class-admin.php:445
1762
- #: ../inc/class-admin.php:545
1763
- msgid "BackWPup Role"
1764
- msgstr "BackWPup Rolle"
1765
-
1766
- # @ backwpup
1767
- #: ../inc/class-admin.php:449
1768
- msgid "&mdash; No role for BackWPup &mdash;"
1769
- msgstr "&mdash; Keine Rolle für BackWPup &mdash;"
1770
-
1771
- # @ backwpup
1772
- #: ../inc/class-admin.php:459
1773
- msgid "Role that the user have on BackWPup"
1774
- msgstr "Rolle die dieser Benutzer hat bei BackWPup"
1775
-
1776
- # @ backwpup
1777
- #: ../inc/class-admin.php:509
1778
- #, php-format
1779
- msgid "<strong>Important:</strong> before updating, please <a href=\"%1$s\">back up your database and files</a> with <a href=\"http://marketpress.de/product/backwpup-pro/\">%2$s</a>. For help with updates, visit the <a href=\"http://codex.wordpress.org/Updating_WordPress\">Updating WordPress</a> Codex page."
1780
- msgstr "<strong>Wichtig:</strong> Bitte erstelle ein Backup <a href=\"%1$s\">von der Datenbank und den Dateien</a> mit <a href=\"http://marketpress.de/product/backwpup-pro/\">%2$s</a> vor der Installation dieses Plugins. Um Hilfe für die Updates zu erhalten, besuche bitte die <a href=\"http://codex.wordpress.org/Updating_WordPress\">Updating WordPress</a> Codex-Seite."
1781
-
1782
- # @ backwpup
1783
- #: ../inc/class-admin.php:512
1784
- #: ../inc/class-admin.php:515
1785
- #, php-format
1786
- msgid "<strong>Important:</strong> before installing this plugin, please <a href=\"%1$s\">back up your database and files</a> with <a href=\"http://marketpress.de/product/backwpup-pro/\">%2$s</a>."
1787
- msgstr "<strong>Wichtig:</strong> Bitte erstelle ein Backup <a href=\"%1$s\">von der Datenbank und den Dateien</a> mit <a href=\"http://marketpress.de/product/backwpup-pro/\">%2$s</a> vor der Installation dieses Plugins."
1788
-
1789
- # @ backwpup
1790
- #: ../inc/class-jobtype-wpexp.php:13
1791
- msgid "XML export"
1792
- msgstr "XML Export"
1793
-
1794
- # @ backwpup
1795
- #: ../inc/class-jobtype-wpexp.php:46
1796
- msgid "Items to export"
1797
- msgstr "Objekte zum Exportieren"
1798
-
1799
- # @ backwpup
1800
- #: ../inc/class-jobtype-wpexp.php:49
1801
- msgid "All content"
1802
- msgstr "Gesamter Inhalt"
1803
-
1804
- # @ backwpup
1805
- #: ../inc/class-jobtype-wpexp.php:50
1806
- msgid "Posts"
1807
- msgstr "Beiträge"
1808
-
1809
- # @ backwpup
1810
- #: ../inc/class-jobtype-wpexp.php:51
1811
- msgid "Pages"
1812
- msgstr "Seiten"
1813
-
1814
- # @ backwpup
1815
- #: ../inc/class-jobtype-wpexp.php:61
1816
- msgid "XML Export file name"
1817
- msgstr "XML Export Datei Name"
1818
-
1819
- # @ backwpup
1820
- #: ../inc/class-jobtype-wpexp.php:69
1821
- msgid "File compression"
1822
- msgstr "Dateikomprimierung"
1823
-
1824
- # @ backwpup
1825
- #: ../inc/class-jobtype-wpexp.php:75
1826
- #: ../inc/class-jobtype-wpexp.php:77
1827
- #: ../inc/class-jobtype-dbdump.php:105
1828
- #: ../inc/class-jobtype-dbdump.php:107
1829
- msgid "GZip"
1830
- msgstr "GZip"
1831
-
1832
- # @ backwpup
1833
- #: ../inc/class-jobtype-wpexp.php:79
1834
- #: ../inc/class-jobtype-wpexp.php:81
1835
- msgid "BZip2"
1836
- msgstr "BZip2"
1837
-
1838
- # @ backwpup
1839
- #: ../inc/class-jobtype-wpexp.php:111
1840
- #, php-format
1841
- msgid "%d. Trying to create a WordPress export to XML file&#160;&hellip;"
1842
- msgstr "%d. Versuche, einen WordPress-Export als XML-Datei zu erstellen&#160;&hellip;"
1843
-
1844
- # @ backwpup
1845
- #: ../inc/class-jobtype-wpexp.php:126
1846
- #, php-format
1847
- msgid "WP Export: Post type “%s” does not allow export."
1848
- msgstr "WP Export: Post-Type „%s“ erlaubt keinen Export."
1849
-
1850
- # @ backwpup
1851
- #: ../inc/class-jobtype-wpexp.php:171
1852
- #: ../inc/class-jobtype-wpexp.php:185
1853
- #: ../inc/class-jobtype-wpexp.php:214
1854
- #: ../inc/class-jobtype-wpexp.php:235
1855
- #: ../inc/class-jobtype-wpexp.php:268
1856
- #: ../inc/class-jobtype-wpexp.php:288
1857
- #: ../inc/class-jobtype-wpexp.php:377
1858
- #: ../inc/class-jobtype-wpexp.php:386
1859
- msgid "WP Export file could not written."
1860
- msgstr "WP-Exportdatei konnte nicht geschrieben werden."
1861
-
1862
- # @ backwpup
1863
- #: ../inc/class-jobtype-wpexp.php:401
1864
- msgid "Check WP Export file&#160;&hellip;"
1865
- msgstr "Prüfe WP Export-Datei&#160;&hellip;"
1866
-
1867
- # @ backwpup
1868
- #: ../inc/class-jobtype-wpexp.php:421
1869
- #, php-format
1870
- msgid "XML WARNING (%s): %s"
1871
- msgstr "XML WARNUNG (%s): %s"
1872
-
1873
- # @ backwpup
1874
- #: ../inc/class-jobtype-wpexp.php:424
1875
- #, php-format
1876
- msgid "XML RECOVERABLE (%s): %s"
1877
- msgstr "XML RECOVERABLE (%s): %s"
1878
-
1879
- # @ backwpup
1880
- #: ../inc/class-jobtype-wpexp.php:427
1881
- #, php-format
1882
- msgid "XML ERROR (%s): %s"
1883
- msgstr "XML FEHLER (%s): %s"
1884
-
1885
- # @ backwpup
1886
- #: ../inc/class-jobtype-wpexp.php:437
1887
- msgid "There was an error when reading this WXR file"
1888
- msgstr "Fehler beim Lesen der WXR Datei"
1889
-
1890
- # @ backwpup
1891
- #: ../inc/class-jobtype-wpexp.php:443
1892
- #: ../inc/class-jobtype-wpexp.php:450
1893
- msgid "This does not appear to be a WXR file, missing/invalid WXR version number"
1894
- msgstr "Es scheint nicht eine WXR Datei zu sein. Fehlende/ungültige Versionsnummer"
1895
-
1896
- # @ backwpup
1897
- #: ../inc/class-jobtype-wpexp.php:459
1898
- msgid "WP Export file is a valid WXR file."
1899
- msgstr "WP Export-Datei ist eine gültige WXR Datei."
1900
-
1901
- # @ backwpup
1902
- #: ../inc/class-jobtype-wpexp.php:461
1903
- msgid "WP Export file can not checked, because no XML extension loaded with the file can checked."
1904
- msgstr "WP Export-Datei kann nicht geprüft werden, da keine XML Erweiterung geladen wurde."
1905
-
1906
- # @ backwpup
1907
- #: ../inc/class-jobtype-wpexp.php:473
1908
- msgid "Compressing file&#160;&hellip;"
1909
- msgstr "Komprimiere Datei&#160;&hellip;"
1910
-
1911
- # @ backwpup
1912
- #: ../inc/class-jobtype-wpexp.php:480
1913
- msgid "Compressing done."
1914
- msgstr "Komprimierung erledigt."
1915
-
1916
- # @ backwpup
1917
- #: ../inc/class-jobtype-wpexp.php:501
1918
- #, php-format
1919
- msgid "Added XML export \"%1$s\" with %2$s to backup file list."
1920
- msgstr "XML Export \"%1$s\" mit %2$s zur Backup-Datei-Liste hinzugefügt"
1921
-
1922
- # @ backwpup
1923
- #: ../inc/class-job.php:180
1924
- msgid "Starting job"
1925
- msgstr "Auftrag starten"
1926
-
1927
- # @ backwpup
1928
- #: ../inc/class-job.php:199
1929
- msgid "Job Start"
1930
- msgstr "Auftragsstart"
1931
-
1932
- # @ backwpup
1933
- #: ../inc/class-job.php:219
1934
- msgid "Creates manifest file"
1935
- msgstr "Erstellt Manifest-Datei"
1936
-
1937
- # @ backwpup
1938
- #: ../inc/class-job.php:238
1939
- msgid "Creates archive"
1940
- msgstr "erstellt Archiv"
1941
-
1942
- # @ backwpup
1943
- #: ../inc/class-job.php:277
1944
- msgid "End of Job"
1945
- msgstr "Auftragsende"
1946
-
1947
- # @ backwpup
1948
- #: ../inc/class-job.php:287
1949
- #, php-format
1950
- msgid "BackWPup log for %1$s from %2$s at %3$s"
1951
- msgstr "BackWPup-Protokoll für %1$s von %2$s am %3$s"
1952
-
1953
- # @ backwpup
1954
- #: ../inc/class-job.php:305
1955
- #, php-format
1956
- msgctxt "Plugin name; Plugin Version"
1957
- msgid "[INFO] %1$s version %2$s; A project of Inpsyde GmbH"
1958
- msgstr "[INFO] %1$s Version %2$s; Ein Projekt der Inpsyde GmbH"
1959
-
1960
- # @ backwpup
1961
- #: ../inc/class-job.php:306
1962
- #, php-format
1963
- msgctxt "WordPress Version"
1964
- msgid "[INFO] WordPress version %s"
1965
- msgstr "[INFO] WordPress Version %s"
1966
-
1967
- # @ backwpup
1968
- #: ../inc/class-job.php:307
1969
- #, php-format
1970
- msgid "[INFO] Blog url: %s"
1971
- msgstr "[INFO] Blog URL: %s"
1972
-
1973
- # @ backwpup
1974
- #: ../inc/class-job.php:308
1975
- #, php-format
1976
- msgid "[INFO] BackWPup job: %1$s; %2$s"
1977
- msgstr "[INFO] BackWPup-Auftrag: %1$s; %2$s"
1978
-
1979
- # @ backwpup
1980
- #: ../inc/class-job.php:320
1981
- msgid "Not scheduled!"
1982
- msgstr "Nicht geplant!"
1983
-
1984
- # @ backwpup
1985
- #: ../inc/class-job.php:323
1986
- #, php-format
1987
- msgid "[INFO] BackWPup cron: %s; Next: %s "
1988
- msgstr "[INFO] BackWPup Cron: %s; Nächste: %s "
1989
-
1990
- # @ backwpup
1991
- #: ../inc/class-job.php:326
1992
- msgid "[INFO] BackWPup job start with link is active"
1993
- msgstr "[INFO] BackWPup Auftragsstart mit aktivem Link gestartet"
1994
-
1995
- # @ backwpup
1996
- #: ../inc/class-job.php:328
1997
- msgid "[INFO] BackWPup no automatic job start configured"
1998
- msgstr "[INFO] BackWPup kein automatischer Auftragsstart konfiguriert"
1999
-
2000
- # @ backwpup
2001
- #: ../inc/class-job.php:330
2002
- msgid "[INFO] BackWPup job started from wp-cron"
2003
- msgstr "[INFO] BackWPup-Auftrag wurde per wp-cron gestartet"
2004
-
2005
- # @ backwpup
2006
- #: ../inc/class-job.php:332
2007
- msgid "[INFO] BackWPup job started manually"
2008
- msgstr "[INFO] BackWPup-Auftrag wurde manuell gestartet"
2009
-
2010
- # @ backwpup
2011
- #: ../inc/class-job.php:334
2012
- msgid "[INFO] BackWPup job started from external url"
2013
- msgstr "[INFO] BackWPup Auftrag wurde von externer URL gestartet"
2014
-
2015
- # @ backwpup
2016
- #: ../inc/class-job.php:336
2017
- msgid "[INFO] BackWPup job started form commandline interface"
2018
- msgstr "[INFO] BackWPup-Auftrag per Kommandozeile gestartet"
2019
-
2020
- # @ backwpup
2021
- #: ../inc/class-job.php:342
2022
- msgid "[INFO] PHP ver.:"
2023
- msgstr "[INFO] PHP ver.:"
2024
-
2025
- # @ backwpup
2026
- #: ../inc/class-job.php:343
2027
- #, php-format
2028
- msgid "[INFO] Maximum PHP script execution time is %1$d seconds"
2029
- msgstr "[INFO] Maximum PHP script execution time ist %1$d Sekunden"
2030
-
2031
- # @ backwpup
2032
- #: ../inc/class-job.php:347
2033
- #, php-format
2034
- msgid "[INFO] Script restart time is configured to %1$d seconds"
2035
- msgstr "[INFO] Skript-Restart-Zeit ist auf %1$d Sekunden konfiguriert"
2036
-
2037
- # @ backwpup
2038
- #: ../inc/class-job.php:350
2039
- #, php-format
2040
- msgid "[INFO] MySQL ver.: %s"
2041
- msgstr "[INFO] MySQL ver.: %s"
2042
-
2043
- # @ backwpup
2044
- #: ../inc/class-job.php:352
2045
- #, php-format
2046
- msgid "[INFO] Web Server: %s"
2047
- msgstr "[INFO] Webserver: %s"
2048
-
2049
- # @ backwpup
2050
- #: ../inc/class-job.php:355
2051
- #, php-format
2052
- msgid "[INFO] curl ver.: %1$s; %2$s"
2053
- msgstr "[INFO] curl ver.: %1$s; %2$s"
2054
-
2055
- # @ backwpup
2056
- #: ../inc/class-job.php:357
2057
- #, php-format
2058
- msgid "[INFO] Temp folder is: %s"
2059
- msgstr "[INFO] Temp Ordner ist: %s"
2060
-
2061
- # @ backwpup
2062
- #: ../inc/class-job.php:358
2063
- #, php-format
2064
- msgid "[INFO] Logfile is: %s"
2065
- msgstr "[INFO] Logfile ist: %s"
2066
-
2067
- # @ backwpup
2068
- #: ../inc/class-job.php:359
2069
- #, php-format
2070
- msgid "[INFO] Backup type is: %s"
2071
- msgstr "[INFO] Backup Typ ist: %s"
2072
-
2073
- # @ backwpup
2074
- #: ../inc/class-job.php:361
2075
- #, php-format
2076
- msgid "[INFO] Backup file is: %s"
2077
- msgstr "[INFO] Backup Datei ist: %s"
2078
-
2079
- # @ backwpup
2080
- #: ../inc/class-job.php:376
2081
- msgid "No destination correctly defined for backup! Please correct job settings."
2082
- msgstr "Es wurde kein korrektes Backupziel definiert! Bitte überprüfe die Auftragseinstellungen."
2083
-
2084
- # @ backwpup
2085
- #: ../inc/class-job.php:552
2086
- msgid "Wrong BackWPup JobID"
2087
- msgstr "Falsche BackWPup JobID"
2088
-
2089
- # @ backwpup
2090
- #: ../inc/class-job.php:555
2091
- msgid "Log folder does not exist or is not writable for BackWPup"
2092
- msgstr "Log-Ordner existiert nicht oder ist nicht beschreibbar für BackWPup"
2093
-
2094
- # @ backwpup
2095
- #: ../inc/class-job.php:557
2096
- msgid "Temp folder does not exist or is not writable for BackWPup"
2097
- msgstr "Temp Ordner existiert nicht oder ist nicht beschreibbar für BackWPup!"
2098
-
2099
- # @ backwpup
2100
- #: ../inc/class-job.php:560
2101
- msgid "A BackWPup job is already running"
2102
- msgstr "Es läuft bereits ein BackWPup-Auftrag"
2103
-
2104
- # @ backwpup
2105
- #: ../inc/class-job.php:563
2106
- msgid "Job started"
2107
- msgstr "Auftrag begonnen"
2108
-
2109
- # @ backwpup
2110
- #: ../inc/class-job.php:637
2111
- msgid "Job restarts due to inactivity for more than 5 minutes."
2112
- msgstr "Auftrag durch Inaktivität von mehr als 5 Minuten neu gestartet"
2113
-
2114
- # @ backwpup
2115
- #: ../inc/class-job.php:727
2116
- msgid "Step aborted: too many attempts!"
2117
- msgstr "Schritt abgebrochen durch zu viele Versuche!"
2118
-
2119
- # @ backwpup
2120
- #: ../inc/class-job.php:808
2121
- msgid "Restart will be executed now."
2122
- msgstr "Neustart wird jetzt ausgeführt."
2123
-
2124
- # @ backwpup
2125
- #: ../inc/class-job.php:842
2126
- #, php-format
2127
- msgid "Restart after %1$d seconds."
2128
- msgstr "Neustart nach %1$s Sekunden."
2129
-
2130
- # @ backwpup
2131
- #: ../inc/class-job.php:969
2132
- #, php-format
2133
- msgid "Signal %d is sent to script!"
2134
- msgstr "Signal %d wurde zum Script gesendet!"
2135
-
2136
- # @ backwpup
2137
- #: ../inc/class-job.php:994
2138
- #, php-format
2139
- msgid "Folder %1$s not allowed, please use another folder."
2140
- msgstr "Ordner %1$s ist nicht erlaubt, bitte wähle einen anderen."
2141
-
2142
- # @ backwpup
2143
- #: ../inc/class-job.php:1000
2144
- #, php-format
2145
- msgid "Cannot create folder: %1$s"
2146
- msgstr "Kann keinen Ordner erstellen: %1$s"
2147
-
2148
- # @ backwpup
2149
- #: ../inc/class-job.php:1007
2150
- #, php-format
2151
- msgid "Folder \"%1$s\" is not writable"
2152
- msgstr "Ordner \"%1$s\" ist nicht beschreibbar"
2153
-
2154
- # @ backwpup
2155
- #: ../inc/class-job.php:1019
2156
- msgid "BackWPup will not backup folders and subfolders when this file is inside."
2157
- msgstr "BackWPup wird keine Ordner und Unterordner sichern, die diese Datei enthalten."
2158
-
2159
- # @ backwpup
2160
- #: ../inc/class-job.php:1031
2161
- #, php-format
2162
- msgid "Exception caught in %1$s: %2$s"
2163
- msgstr "Ausnahme eingefangen in %1$s: %2$s"
2164
-
2165
- # @ backwpup
2166
- #: ../inc/class-job.php:1088
2167
- msgid "WARNING:"
2168
- msgstr "WARNUNG:"
2169
-
2170
- # @ backwpup
2171
- #: ../inc/class-job.php:1097
2172
- msgid "ERROR:"
2173
- msgstr "FEHLER:"
2174
-
2175
- # @ backwpup
2176
- #: ../inc/class-job.php:1101
2177
- msgid "DEPRECATED:"
2178
- msgstr "ABGELEHNT:"
2179
-
2180
- # @ backwpup
2181
- #: ../inc/class-job.php:1104
2182
- msgid "STRICT NOTICE:"
2183
- msgstr "EXAKTE NOTIZ:"
2184
-
2185
- # @ backwpup
2186
- #: ../inc/class-job.php:1109
2187
- msgid "RECOVERABLE ERROR:"
2188
- msgstr "WIEDERHERSTELLUNGS FEHLER:"
2189
-
2190
- # @ backwpup
2191
- #: ../inc/class-job.php:1229
2192
- msgid "Cannot write progress to working file. Job will be aborted."
2193
- msgstr "Kann Fortschritt nicht in die Arbeitsdatei schreiben. Auftrag wird abgebrochen."
2194
-
2195
- # @ backwpup
2196
- #: ../inc/class-job.php:1247
2197
- msgid "Aborted by user!"
2198
- msgstr "Abgebrochen vom Benutzer!"
2199
-
2200
- # @ backwpup
2201
- #: ../inc/class-job.php:1272
2202
- #, php-format
2203
- msgid "One old log deleted"
2204
- msgid_plural "%d old logs deleted"
2205
- msgstr[0] "Eine alte Log-Datei gelöscht"
2206
- msgstr[1] "%d alte Log-Dateien gelöscht"
2207
-
2208
- # @ backwpup
2209
- #: ../inc/class-job.php:1278
2210
- #, php-format
2211
- msgid "Job has ended with errors in %s seconds. You must resolve the errors for correct execution."
2212
- msgstr "Job mit Fehlern beendet in %s Sekunden. Sie müssen die Fehler für eine korrekte Ausführung beheben."
2213
-
2214
- # @ backwpup
2215
- #: ../inc/class-job.php:1280
2216
- #, php-format
2217
- msgid "Job finished with warnings in %s seconds. Please resolve them for correct execution."
2218
- msgstr "Job mit Warnungen beendet in %s Sekunden. Bitte beheben Sie die Warnungen für eine korrekte Ausführung."
2219
-
2220
- # @ backwpup
2221
- #: ../inc/class-job.php:1282
2222
- #, php-format
2223
- msgid "Job done in %s seconds."
2224
- msgstr "Auftrag erledigt in %s Sekunden."
2225
-
2226
- # @ backwpup
2227
- #: ../inc/class-job.php:1325
2228
- msgid "SUCCESSFUL"
2229
- msgstr "ERFOLGREICH"
2230
-
2231
- # @ backwpup
2232
- #: ../inc/class-job.php:1328
2233
- msgid "WARNING"
2234
- msgstr "WARNUNG"
2235
-
2236
- # @ backwpup
2237
- #: ../inc/class-job.php:1332
2238
- msgid "ERROR"
2239
- msgstr "FEHLER"
2240
-
2241
- # @ backwpup
2242
- #: ../inc/class-job.php:1336
2243
- #, php-format
2244
- msgid "[%3$s] BackWPup log %1$s: %2$s"
2245
- msgstr "[%3$s] BackWPup Log %1$s: %2$s"
2246
-
2247
- # @ backwpup
2248
- #: ../inc/class-job.php:1704
2249
- #, php-format
2250
- msgctxt "Folder name"
2251
- msgid "Folder %s not exists"
2252
- msgstr "Verzeichnis %s existiert nicht"
2253
-
2254
- # @ backwpup
2255
- #: ../inc/class-job.php:1709
2256
- #, php-format
2257
- msgctxt "Folder name"
2258
- msgid "Folder %s not readable"
2259
- msgstr "Verzeichnis %s ist nicht lesbar"
2260
-
2261
- # @ backwpup
2262
- #: ../inc/class-job.php:1726
2263
- #, php-format
2264
- msgid "Link \"%s\" not following."
2265
- msgstr "Link \"%s\" wird nicht gefolgt"
2266
-
2267
- # @ backwpup
2268
- #: ../inc/class-job.php:1728
2269
- #, php-format
2270
- msgid "File \"%s\" is not readable!"
2271
- msgstr "Datei \"%s\" ist nicht lesbar!"
2272
-
2273
- # @ backwpup
2274
- #: ../inc/class-job.php:1732
2275
- #, php-format
2276
- msgid "File size of “%s” cannot be retrieved. File might be too large and will not be added to queue."
2277
- msgstr "Dateigröße von „%s“ kann nicht abgefragt werden. Die Datei könnte zu groß sein und wird nicht zur Warteschlange hinzugefügt."
2278
-
2279
- # @ backwpup
2280
- #: ../inc/class-job.php:1754
2281
- #, php-format
2282
- msgid "%d. Trying to generate a manifest file&#160;&hellip;"
2283
- msgstr "%d. Versuche eine Manifest-Datei zu generieren&#160;&hellip;"
2284
-
2285
- # @ backwpup
2286
- #: ../inc/class-job.php:1804
2287
- msgid "You may have noticed the manifest.json file in this archive."
2288
- msgstr "Du wirst manifest.json in diesem Archiv bemerkt haben."
2289
-
2290
- # @ backwpup
2291
- #: ../inc/class-job.php:1805
2292
- msgid "manifest.json might be needed for later restoring a backup from this archive."
2293
- msgstr "manifest.json könnte für das spätere Wiederherstellen des Backups aus diesem Archiv benötigt werden."
2294
-
2295
- # @ backwpup
2296
- #: ../inc/class-job.php:1806
2297
- msgid "Please leave manifest.json untouched and in place. Otherwise it is safe to be ignored."
2298
- msgstr "Bitte lasse die manifest.json unberührt an ihrem Platz. Du kannst sie ansonsten einfach ignorieren."
2299
-
2300
- # @ backwpup
2301
- #: ../inc/class-job.php:1819
2302
- #, php-format
2303
- msgid "Added manifest.json file with %1$s to backup file list."
2304
- msgstr "manifest.json mit %1$s wurde zur Backup-Datei-Liste hinzugefügt."
2305
-
2306
- # @ backwpup
2307
- #: ../inc/class-job.php:1849
2308
- #, php-format
2309
- msgid "%d. Trying to create backup archive &hellip;"
2310
- msgstr "%d. Versuche, Backup zu erstellen …"
2311
-
2312
- # @ backwpup
2313
- #: ../inc/class-job.php:1856
2314
- #, php-format
2315
- msgctxt "Archive compression method"
2316
- msgid "Compressing files as %s. Please be patient, this may take a moment."
2317
- msgstr "Komprimiere Dateien als %s. Bitte habe einen Moment Geduld."
2318
-
2319
- # @ backwpup
2320
- #: ../inc/class-job.php:1870
2321
- #: ../inc/class-job.php:1919
2322
- msgid "Cannot create backup archive correctly. Aborting creation."
2323
- msgstr "Backup-Archiv kann nicht korrekt angelegt werden. Anlegeprozess abgebrochen."
2324
-
2325
- # @ backwpup
2326
- #: ../inc/class-job.php:1916
2327
- msgid "Aborting creation."
2328
- msgstr "Anlegen abgebrochen."
2329
-
2330
- # @ backwpup
2331
- #: ../inc/class-job.php:1934
2332
- msgid "Backup archive created."
2333
- msgstr "Backup wurde erstellt."
2334
-
2335
- # @ backwpup
2336
- #: ../inc/class-job.php:1943
2337
- #, php-format
2338
- msgid "Archive size is %s."
2339
- msgstr "Archivgröße ist %s"
2340
-
2341
- # @ backwpup
2342
- #: ../inc/class-job.php:1944
2343
- #, php-format
2344
- msgid "%1$d Files with %2$s in Archive."
2345
- msgstr "%1$d Dateien mit %2$s in Archiven."
2346
-
2347
- # @ backwpup
2348
- #: ../inc/class-destination-msazure.php:25
2349
- msgid "MS Azure access keys"
2350
- msgstr "MS Azure Zugriff Schlüssel"
2351
-
2352
- # @ backwpup
2353
- #: ../inc/class-destination-msazure.php:29
2354
- msgid "Account name"
2355
- msgstr "Account Name"
2356
-
2357
- # @ backwpup
2358
- #: ../inc/class-destination-msazure.php:36
2359
- msgid "Access key"
2360
- msgstr "Access Key"
2361
-
2362
- # @ backwpup
2363
- #: ../inc/class-destination-msazure.php:44
2364
- msgid "Blob container"
2365
- msgstr "Blob Container"
2366
-
2367
- # @ backwpup
2368
- #: ../inc/class-destination-msazure.php:48
2369
- msgid "Container selection"
2370
- msgstr "Container Auswahl"
2371
-
2372
- # @ backwpup
2373
- #: ../inc/class-destination-msazure.php:60
2374
- msgid "Create a new container"
2375
- msgstr "Neuen Container erstellen"
2376
-
2377
- # @ backwpup
2378
- #: ../inc/class-destination-msazure.php:71
2379
- msgid "Folder in container"
2380
- msgstr "Ordner im Container"
2381
-
2382
- # @ backwpup
2383
- #: ../inc/class-destination-msazure.php:125
2384
- #, php-format
2385
- msgid "MS Azure container \"%s\" created."
2386
- msgstr "MS Azure Container \"%s\" erstellt."
2387
-
2388
- # @ backwpup
2389
- #: ../inc/class-destination-msazure.php:128
2390
- #, php-format
2391
- msgid "MS Azure container create: %s"
2392
- msgstr "MS Azure Container erstellen: %s"
2393
-
2394
- # @ backwpup
2395
- #: ../inc/class-destination-msazure.php:204
2396
- #, php-format
2397
- msgid "%d. Try sending backup to a Microsoft Azure (Blob)&#160;&hellip;"
2398
- msgstr "%d. Versuche, das Backup zu Microsoft Azure (Blob) zu senden&#160;&hellip;"
2399
-
2400
- # @ backwpup
2401
- #: ../inc/class-destination-msazure.php:226
2402
- #, php-format
2403
- msgid "MS Azure container \"%s\" does not exist!"
2404
- msgstr "MS Azure Container \"%s\" existiert nicht!"
2405
-
2406
- # @ backwpup
2407
- #: ../inc/class-destination-msazure.php:230
2408
- #, php-format
2409
- msgid "Connected to MS Azure container \"%s\"."
2410
- msgstr "Verbunden mit MS Azure container \"%s\""
2411
-
2412
- # @ backwpup
2413
- #: ../inc/class-destination-msazure.php:233
2414
- msgid "Starting upload to MS Azure&#160;&hellip;"
2415
- msgstr "Hochladen zu MS Azure hat begonnen&#160;&hellip;"
2416
-
2417
- # @ backwpup
2418
- #: ../inc/class-destination-msazure.php:268
2419
- #: ../inc/class-destination-dropbox.php:263
2420
- #, php-format
2421
- msgid "Backup transferred to %s"
2422
- msgstr "Backup übertragen zu %s"
2423
-
2424
- # @ backwpup
2425
- #: ../inc/class-destination-msazure.php:273
2426
- #: ../inc/class-destination-msazure.php:329
2427
- #, php-format
2428
- msgid "Microsoft Azure API: %s"
2429
- msgstr "Microsoft Azure API: %s"
2430
-
2431
- # @ backwpup
2432
- #: ../inc/class-destination-msazure.php:322
2433
- #, php-format
2434
- msgid "One file deleted on Microsoft Azure container."
2435
- msgid_plural "%d files deleted on Microsoft Azure container."
2436
- msgstr[0] "Eine Datei im Microsoft-Azure-Container gelöscht"
2437
- msgstr[1] "%d Dateien im Microsoft-Azure-Container gelöscht"
2438
-
2439
- # @ backwpup
2440
- #: ../inc/class-destination-msazure.php:415
2441
- msgid "Missing account name!"
2442
- msgstr "Kontoname (Benutzername) nicht angegeben!"
2443
-
2444
- # @ backwpup
2445
- #: ../inc/class-destination-msazure.php:421
2446
- msgid "No container found!"
2447
- msgstr "Kein Container gefunden!"
2448
-
2449
- # @ backwpup
2450
- #: ../inc/class-destination-dropbox.php:36
2451
- #: ../inc/class-destination-dropbox.php:325
2452
- #, php-format
2453
- msgid "Dropbox API: %s"
2454
- msgstr "Dropbox-API: %s"
2455
-
2456
- # @ backwpup
2457
- #: ../inc/class-destination-dropbox.php:51
2458
- msgid "Login"
2459
- msgstr "Anmelden"
2460
-
2461
- # @ backwpup
2462
- #: ../inc/class-destination-dropbox.php:55
2463
- msgid "Authentication"
2464
- msgstr "Authentifizierung"
2465
-
2466
- # @ backwpup
2467
- #: ../inc/class-destination-dropbox.php:57
2468
- msgid "Not authenticated!"
2469
- msgstr "Nicht authentifiziert!"
2470
-
2471
- # @ backwpup
2472
- #: ../inc/class-destination-dropbox.php:58
2473
- msgid "Create Account"
2474
- msgstr "Konto erstellen"
2475
-
2476
- # @ backwpup
2477
- #: ../inc/class-destination-dropbox.php:60
2478
- msgid "Authenticated!"
2479
- msgstr "Authentifiziert!"
2480
-
2481
- # @ backwpup
2482
- #: ../inc/class-destination-dropbox.php:61
2483
- msgid "Delete Dropbox Authentication"
2484
- msgstr "Lösche Dropbox-Authentifizierung"
2485
-
2486
- # @ backwpup
2487
- #: ../inc/class-destination-dropbox.php:68
2488
- msgid "App Access to Dropbox"
2489
- msgstr "App-Zugang zu Dropbox"
2490
-
2491
- # @ backwpup
2492
- #: ../inc/class-destination-dropbox.php:71
2493
- msgid "Get Dropbox App auth code"
2494
- msgstr "Hole Auth-Code für Apps-Ordner in Dropbox"
2495
-
2496
- # @ backwpup
2497
- #: ../inc/class-destination-dropbox.php:72
2498
- msgid "Allows restricted access to Apps/BackWPup folder only."
2499
- msgstr "Erlaubt beschränkten Zugriff ausschließlich zum Ordner Apps/BackWPup."
2500
-
2501
- # @ backwpup
2502
- #: ../inc/class-destination-dropbox.php:77
2503
- msgid "— OR —"
2504
- msgstr "— ODER —"
2505
-
2506
- # @ backwpup
2507
- #: ../inc/class-destination-dropbox.php:80
2508
- msgid "Full Access to Dropbox"
2509
- msgstr "Uneingeschränkter Zugang zur Dropbox."
2510
-
2511
- # @ backwpup
2512
- #: ../inc/class-destination-dropbox.php:82
2513
- msgid "BackWPup will have full read and write access to your entire Dropbox. You can specify your backup destination wherever you want, just be aware that ANY files or folders inside of your Dropbox can be overridden or deleted by BackWPup."
2514
- msgstr "BackWPup erhält uneingeschränkten Lese- und Schreibzugriff zu deiner gesamten Dropbox. Du kannst deinen Zielordner innerhalb deiner Dropbox frei wählen; bedenke jedoch, dass ALLE Dateien und Ordner in deiner Dropbox von BackWPup überschrieben oder gelöscht werden können."
2515
-
2516
- # @ backwpup
2517
- #: ../inc/class-destination-dropbox.php:83
2518
- msgid "Get full Dropbox auth code "
2519
- msgstr "Hole Auth-Code für gesamte Dropbox"
2520
-
2521
- # @ backwpup
2522
- #: ../inc/class-destination-dropbox.php:84
2523
- msgid "Allows full access to your entire Dropbox."
2524
- msgstr "Erlaubt uneingeschränkten Zugriff zu deiner gesamten Dropbox."
2525
-
2526
- # @ backwpup
2527
- #: ../inc/class-destination-dropbox.php:95
2528
- msgid "Destination Folder"
2529
- msgstr "Zielordner"
2530
-
2531
- # @ theme_hamburg_textdomain
2532
- #: ../inc/class-destination-dropbox.php:98
2533
- msgid "Folder inside your Dropbox where your backup archives will be stored."
2534
- msgstr "Ordner in deiner Dropbox, in dem deine Backup-Archive gespeichert werden."
2535
-
2536
- # @ backwpup
2537
- #: ../inc/class-destination-dropbox.php:225
2538
- #, php-format
2539
- msgid "%d. Try to send backup file to Dropbox&#160;&hellip;"
2540
- msgstr "%d. Versuche, das Backup zur Dropbox zu senden&#160;&hellip;"
2541
-
2542
- # @ backwpup
2543
- #: ../inc/class-destination-dropbox.php:243
2544
- #, php-format
2545
- msgid "Authenticated with Dropbox of user %s"
2546
- msgstr "Authentifiziert mit Dropbox von Benutzer %s"
2547
-
2548
- # @ backwpup
2549
- #: ../inc/class-destination-dropbox.php:246
2550
- #, php-format
2551
- msgid "%s available on your Dropbox"
2552
- msgstr "%s verfügbar in deiner Dropbox"
2553
-
2554
- # @ backwpup
2555
- #: ../inc/class-destination-dropbox.php:248
2556
- msgid "Not Authenticated with Dropbox!"
2557
- msgstr "Nicht mit Dropbox Authentifiziert!"
2558
-
2559
- # @ backwpup
2560
- #: ../inc/class-destination-dropbox.php:251
2561
- msgid "Uploading to Dropbox&#160;&hellip;"
2562
- msgstr "Hochladen zur Dropbox hat begonnen&#160;&hellip;"
2563
-
2564
- # @ backwpup
2565
- #: ../inc/class-destination-dropbox.php:267
2566
- msgid "Uploaded file size and local file size don't match."
2567
- msgstr "Größe der lokalen und der hochgeladenen Datei ist nicht identisch."
2568
-
2569
- # @ backwpup
2570
- #: ../inc/class-destination-dropbox.php:271
2571
- #, php-format
2572
- msgid "Error transfering backup to %s."
2573
- msgstr "Fehler beim Übertragen des Backups zu %s."
2574
-
2575
- # @ backwpup
2576
- #: ../inc/class-destination-dropbox.php:316
2577
- #, php-format
2578
- msgid "Error while deleting file from Dropbox: %s"
2579
- msgstr "Fehler beim Löschen der Datei aus der Dropbox: %s"
2580
-
2581
- # @ backwpup
2582
- #: ../inc/class-destination-dropbox.php:319
2583
- #, php-format
2584
- msgid "One file deleted from Dropbox"
2585
- msgid_plural "%d files deleted on Dropbox"
2586
- msgstr[0] "Eine Datei aus der Dropbox gelöscht"
2587
- msgstr[1] "%d Dateien aus der Dropbox gelöscht"
2588
-
2589
- # @ backwpup
2590
- #: ../inc/class-jobtype-dbdump.php:13
2591
- msgid "DB Backup"
2592
- msgstr "Datenbank-Backup"
2593
-
2594
- # @ backwpup
2595
- #: ../inc/class-jobtype-dbdump.php:14
2596
- msgid "Database backup"
2597
- msgstr "Datenbank Backup"
2598
-
2599
- # @ backwpup
2600
- #: ../inc/class-jobtype-dbdump.php:15
2601
- msgid "Creates an .sql database backup file"
2602
- msgstr "Erstellt ein Datenbank-Backup (.sql, .xml)"
2603
-
2604
- # @ backwpup
2605
- #: ../inc/class-jobtype-dbdump.php:61
2606
- msgid "Settings for database backup"
2607
- msgstr "Einstellungen für das Datenbank Backup"
2608
-
2609
- # @ backwpup
2610
- #: ../inc/class-jobtype-dbdump.php:65
2611
- msgid "Tables to backup"
2612
- msgstr "Tabellen zu sichern"
2613
-
2614
- # @ backwpup
2615
- #: ../inc/class-jobtype-dbdump.php:67
2616
- msgid "all"
2617
- msgstr "alle"
2618
-
2619
- # @ backwpup
2620
- #: ../inc/class-jobtype-dbdump.php:91
2621
- msgid "Backup file name"
2622
- msgstr "Backup Datei Name"
2623
-
2624
- # @ backwpup
2625
- #: ../inc/class-jobtype-dbdump.php:99
2626
- msgid "Backup file compression"
2627
- msgstr "Backup Datei Komprimierungsmethode"
2628
-
2629
- # @ backwpup
2630
- #: ../inc/class-jobtype-dbdump.php:155
2631
- #, php-format
2632
- msgid "%d. Try to backup database&#160;&hellip;"
2633
- msgstr "%d. Versuche, die Datenbank zu sichern&#160;&hellip;"
2634
-
2635
- # @ backwpup
2636
- #: ../inc/class-jobtype-dbdump.php:169
2637
- #, php-format
2638
- msgid "Connected to database %1$s on %2$s"
2639
- msgstr "Mit Datenbank %1$s auf %2$s verbunden"
2640
-
2641
- # @ backwpup
2642
- #: ../inc/class-jobtype-dbdump.php:182
2643
- msgid "No tables to backup."
2644
- msgstr "Es gibt keine Tabellen zu sichern"
2645
-
2646
- # @ backwpup
2647
- #: ../inc/class-jobtype-dbdump.php:204
2648
- #, php-format
2649
- msgid "Backup database table \"%s\" with \"%s\" records"
2650
- msgstr "Sichere Datenbank-Tabelle „%s“ mit „%s“ Einträgen"
2651
-
2652
- # @ backwpup
2653
- #: ../inc/class-jobtype-dbdump.php:243
2654
- msgid "MySQL backup file not created"
2655
- msgstr "MySQL-Sicherungsdatei nicht erstellt"
2656
-
2657
- # @ backwpup
2658
- #: ../inc/class-jobtype-dbdump.php:249
2659
- #, php-format
2660
- msgid "Added database dump \"%1$s\" with %2$s to backup file list"
2661
- msgstr "Datenbank Backup \"%1$s\" mit %2$s zur Backup Datei Liste hinzugefügt"
2662
-
2663
- # @ backwpup
2664
- #: ../inc/class-jobtype-dbdump.php:255
2665
- msgid "Database backup done!"
2666
- msgstr "Datenbank-Backup fertig!"
2667
-
2668
- # @ backwpup
2669
- #: ../inc/class-adminbar.php:53
2670
- msgid "running"
2671
- msgstr "läuft"
2672
-
2673
- # @ backwpup
2674
- #: ../inc/class-adminbar.php:69
2675
- msgid "Now Running"
2676
- msgstr "Jetzt läuft"
2677
-
2678
- # @ backwpup
2679
- #: ../inc/class-adminbar.php:75
2680
- msgid "Abort!"
2681
- msgstr "Abbrechen!"
2682
-
2683
- # @ backwpup
2684
- #: ../inc/class-adminbar.php:92
2685
- msgid "Add new"
2686
- msgstr "Erstellen"
2687
-
2688
- # @ backwpup
2689
- #: ../inc/class-adminbar.php:130
2690
- msgid "Run Now"
2691
- msgstr "Jetzt starten"
2692
-
2693
- # @ backwpup
2694
- #: ../inc/class-destination-s3-v1.php:249
2695
- #, php-format
2696
- msgid "Bucket %1$s created."
2697
- msgstr "Bucket %1$s erstellt."
2698
-
2699
- # @ backwpup
2700
- #: ../inc/class-destination-rsc.php:41
2701
- msgid "Rack Space Cloud Keys"
2702
- msgstr "Rack Space Cloud Keys"
2703
-
2704
- # @ backwpup
2705
- #: ../inc/class-destination-rsc.php:52
2706
- msgid "API Key"
2707
- msgstr "API Key"
2708
-
2709
- # @ backwpup
2710
- #: ../inc/class-destination-rsc.php:60
2711
- msgid "Select region"
2712
- msgstr "Wähle Region"
2713
-
2714
- # @ backwpup
2715
- #: ../inc/class-destination-rsc.php:64
2716
- #: ../inc/class-destination-rsc.php:66
2717
- msgid "Rackspace Cloud Files Region"
2718
- msgstr "Rackspace Cloud Verzeichnis"
2719
-
2720
- # @ backwpup
2721
- #: ../inc/class-destination-rsc.php:67
2722
- msgid "Dallas (DFW)"
2723
- msgstr "Dallas (DFW)"
2724
-
2725
- # @ backwpup
2726
- #: ../inc/class-destination-rsc.php:68
2727
- msgid "Chicago (ORD)"
2728
- msgstr "Chicago (ORD)"
2729
-
2730
- # @ backwpup
2731
- #: ../inc/class-destination-rsc.php:69
2732
- msgid "Sydney (SYD)"
2733
- msgstr "Sydney (SYD)"
2734
-
2735
- # @ backwpup
2736
- #: ../inc/class-destination-rsc.php:70
2737
- msgid "London (LON)"
2738
- msgstr "London (LON)"
2739
-
2740
- # @ backwpup
2741
- #: ../inc/class-destination-rsc.php:71
2742
- msgid "Northern Virginia (IAD)"
2743
- msgstr "Northern Virginia (IAD)"
2744
-
2745
- # @ backwpup
2746
- #: ../inc/class-destination-rsc.php:72
2747
- msgid "Hong Kong (HKG)"
2748
- msgstr "Hong Kong (HKG)"
2749
-
2750
- # @ backwpup
2751
- #: ../inc/class-destination-rsc.php:155
2752
- #, php-format
2753
- msgid "Rackspace Cloud container \"%s\" created."
2754
- msgstr "Rackspace Cloud Container\"%s\" erstellt."
2755
-
2756
- # @ backwpup
2757
- #: ../inc/class-destination-rsc.php:159
2758
- #: ../inc/class-destination-rsc.php:267
2759
- #: ../inc/class-destination-rsc.php:302
2760
- #: ../inc/class-destination-rsc.php:347
2761
- #, php-format
2762
- msgid "Rackspace Cloud API: %s"
2763
- msgstr "Rackspace Cloud API: %s"
2764
-
2765
- # @ backwpup
2766
- #: ../inc/class-destination-rsc.php:250
2767
- #, php-format
2768
- msgid "%d. Trying to send backup file to Rackspace cloud &hellip;"
2769
- msgstr "%d. Versuche, ein Backup zur Rackspace Cloud zu senden &hellip;"
2770
-
2771
- # @ backwpup
2772
- #: ../inc/class-destination-rsc.php:264
2773
- #, php-format
2774
- msgid "Connected to Rackspace cloud files container %s"
2775
- msgstr "Verbunden mit Rackspace Cloud Container %s"
2776
-
2777
- # @ backwpup
2778
- #: ../inc/class-destination-rsc.php:276
2779
- msgid "Upload to Rackspace cloud started &hellip;"
2780
- msgstr "Upload zur Rackspace Cloud nun gestartet &hellip;"
2781
-
2782
- # @ backwpup
2783
- #: ../inc/class-destination-rsc.php:292
2784
- msgid "Backup File transferred to RSC://"
2785
- msgstr "Backup Archiv übertragen zu RSC://"
2786
-
2787
- # @ backwpup
2788
- #: ../inc/class-destination-rsc.php:296
2789
- msgid "Cannot transfer backup to Rackspace cloud."
2790
- msgstr "Kann das Backup nicht zur Rackspace Cloud transferieren"
2791
-
2792
- # @ backwpup
2793
- #: ../inc/class-destination-rsc.php:341
2794
- #, php-format
2795
- msgid "One file deleted on Rackspace cloud container."
2796
- msgid_plural "%d files deleted on Rackspace cloud container."
2797
- msgstr[0] "Eine Datei im Rackspace-Container gelöscht"
2798
- msgstr[1] "%d Dateien im Rackspace-Container gelöscht"
2799
-
2800
- # @ backwpup
2801
- #: ../inc/class-destination-rsc.php:444
2802
- msgid "Missing username!"
2803
- msgstr "Fehlender Benutzername!"
2804
-
2805
- # @ backwpup
2806
- #: ../inc/class-destination-rsc.php:446
2807
- msgid "Missing API Key!"
2808
- msgstr "API-Schlüssel wird fehlt!"
2809
-
2810
- # @ backwpup
2811
- #: ../inc/class-destination-rsc.php:450
2812
- msgid "A container could not be found!"
2813
- msgstr "Kein Container gefunden!"
2814
-
2815
- # @ backwpup
2816
- #: ../inc/class-jobtype-dbcheck.php:13
2817
- msgid "DB Check"
2818
- msgstr "DB Check"
2819
-
2820
- # @ backwpup
2821
- #: ../inc/class-jobtype-dbcheck.php:14
2822
- msgid "Check database tables"
2823
- msgstr "Datenbank-Tabellen prüfen"
2824
-
2825
- # @ backwpup
2826
- #: ../inc/class-jobtype-dbcheck.php:35
2827
- msgid "Settings for database check"
2828
- msgstr "Einstellungen für den Datenbank Check"
2829
-
2830
- # @ backwpup
2831
- #: ../inc/class-jobtype-dbcheck.php:39
2832
- msgid "WordPress tables only"
2833
- msgstr "Nur WordPress Tabellen"
2834
-
2835
- # @ backwpup
2836
- #: ../inc/class-jobtype-dbcheck.php:44
2837
- msgid "Check WordPress database tables only"
2838
- msgstr "Teste nur die WordPress-Tabellen"
2839
-
2840
- # @ backwpup
2841
- #: ../inc/class-jobtype-dbcheck.php:49
2842
- msgid "Repair"
2843
- msgstr "Reparieren"
2844
-
2845
- # @ backwpup
2846
- #: ../inc/class-jobtype-dbcheck.php:54
2847
- msgid "Try to repair defect table"
2848
- msgstr "Versuche, definierte Tabellen zu reparieren"
2849
-
2850
- # @ backwpup
2851
- #: ../inc/class-jobtype-dbcheck.php:79
2852
- #, php-format
2853
- msgid "%d. Trying to check database&#160;&hellip;"
2854
- msgstr "%d. Versuche, die Datenbank zu prüfen&#160;&hellip;"
2855
-
2856
- # @ backwpup
2857
- #: ../inc/class-jobtype-dbcheck.php:111
2858
- #, php-format
2859
- msgid "Table %1$s is a view. Not checked."
2860
- msgstr "Tabelle %1$s ist ein View. Nicht geprüft."
2861
-
2862
- # @ backwpup
2863
- #: ../inc/class-jobtype-dbcheck.php:116
2864
- #, php-format
2865
- msgid "Table %1$s is not a MyISAM/InnoDB table. Not checked."
2866
- msgstr "Tabelle %1$s ist keine MyISAM/InnoDB Tabelle. Nicht geprüft"
2867
-
2868
- # @ backwpup
2869
- #: ../inc/class-jobtype-dbcheck.php:123
2870
- #: ../inc/class-jobtype-dbcheck.php:125
2871
- #: ../inc/class-jobtype-dbcheck.php:127
2872
- #, php-format
2873
- msgid "Result of table check for %1$s is: %2$s"
2874
- msgstr "Ergebnis der Tabellenprüfung für %1$s ist: %2$s"
2875
-
2876
- # @ backwpup
2877
- #: ../inc/class-jobtype-dbcheck.php:133
2878
- #: ../inc/class-jobtype-dbcheck.php:135
2879
- #: ../inc/class-jobtype-dbcheck.php:137
2880
- #, php-format
2881
- msgid "Result of table repair for %1$s is: %2$s"
2882
- msgstr "Ergebnis der Tabellenreparatur für %1$s ist: %2$s"
2883
-
2884
- # @ backwpup
2885
- #: ../inc/class-jobtype-dbcheck.php:142
2886
- msgid "Database check done!"
2887
- msgstr "Datenbank-Check fertig!"
2888
-
2889
- # @ backwpup
2890
- #: ../inc/class-jobtype-dbcheck.php:145
2891
- msgid "No tables to check."
2892
- msgstr "Keine Tabellen zum checken."
2893
-
2894
- # @ backwpup
2895
- #: ../inc/class-page-settings.php:60
2896
- msgid "Settings reset to default"
2897
- msgstr "Die Einstellungen wurden zurückgesetzt."
2898
-
2899
- # @ backwpup
2900
- #: ../inc/class-page-settings.php:101
2901
- msgid "Settings saved"
2902
- msgstr "Einstellungen gespeichert"
2903
-
2904
- # @ backwpup
2905
- #: ../inc/class-page-settings.php:112
2906
- #, php-format
2907
- msgid "%s Settings"
2908
- msgstr "%s Einstellungen"
2909
-
2910
- # @ backwpup
2911
- #: ../inc/class-page-settings.php:114
2912
- #: ../inc/class-page-editjob.php:386
2913
- msgid "General"
2914
- msgstr "Allgemein"
2915
-
2916
- # @ backwpup
2917
- #: ../inc/class-page-settings.php:114
2918
- msgid "Network"
2919
- msgstr "Netzwerk"
2920
-
2921
- # @ backwpup
2922
- #: ../inc/class-page-settings.php:114
2923
- msgid "API Keys"
2924
- msgstr "API-Schlüssel"
2925
-
2926
- # @ backwpup
2927
- #: ../inc/class-page-settings.php:114
2928
- msgid "Information"
2929
- msgstr "Informationen"
2930
-
2931
- # @ backwpup
2932
- #: ../inc/class-page-settings.php:131
2933
- msgid "Display Settings"
2934
- msgstr "Einstellungen anzeigen"
2935
-
2936
- # @ backwpup
2937
- #: ../inc/class-page-settings.php:132
2938
- msgid "Do you want to see BackWPup in the WordPress admin bar?"
2939
- msgstr "Möchten Sie BackWPup-Menüpunkte in der WordPress-Adminbar sehen?"
2940
-
2941
- # @ backwpup
2942
- #: ../inc/class-page-settings.php:135
2943
- msgid "Admin bar"
2944
- msgstr "Adminbar"
2945
-
2946
- # @ backwpup
2947
- #: ../inc/class-page-settings.php:138
2948
- msgid "Admin Bar"
2949
- msgstr "Adminbar"
2950
-
2951
- # @ backwpup
2952
- #: ../inc/class-page-settings.php:143
2953
- msgid "Show BackWPup links in admin bar."
2954
- msgstr "BackWPup-Links in der Adminbar anzeigen."
2955
-
2956
- # @ backwpup
2957
- #: ../inc/class-page-settings.php:148
2958
- #: ../inc/class-page-settings.php:151
2959
- msgid "Folder sizes"
2960
- msgstr "Verzeichnisgrößen"
2961
-
2962
- # @ backwpup
2963
- #: ../inc/class-page-settings.php:156
2964
- msgid "Display folder sizes in the files tab when editing a job. (Might increase loading time of files tab.)"
2965
- msgstr "Ordnergrößen im Tab Dateien anzeigen, wenn ein Auftrag bearbeitet wird. (Kann die Ladezeit des Tab erhöhen.)"
2966
-
2967
- # @ backwpup
2968
- #: ../inc/class-page-settings.php:161
2969
- msgid "Security"
2970
- msgstr "Sicherheit"
2971
-
2972
- # @ backwpup
2973
- #: ../inc/class-page-settings.php:162
2974
- msgid "Security option for BackWPup"
2975
- msgstr "Sicherheitseinstellungen für BackWPup"
2976
-
2977
- # @ backwpup
2978
- #: ../inc/class-page-settings.php:165
2979
- #: ../inc/class-page-settings.php:168
2980
- msgid "Protect folders"
2981
- msgstr "Ordner schützen"
2982
-
2983
- # @ backwpup
2984
- #: ../inc/class-page-settings.php:173
2985
- msgid "Protect BackWPup folders ( Temp, Log and Backups ) with <code>.htaccess</code> and <code>index.php</code>"
2986
- msgstr "Schütze BackWPup-Verzeichnis (Temp, Log und Backups) mit den Dateien .htaccess und index.php"
2987
-
2988
- # @ backwpup
2989
- #: ../inc/class-page-settings.php:186
2990
- msgid "Every time BackWPup runs a backup job, a log file is being generated. Choose where to store your log files and how many of them."
2991
- msgstr "Jedes Mal, wenn BackWPup einen Auftrag ausführt, wird eine Protokolldatei erzeugt. Wählen Sie aus, wo und wie viele dieser Protokolldateien Sie speichern möchten."
2992
-
2993
- # @ backwpup
2994
- #: ../inc/class-page-settings.php:189
2995
- msgid "Log file folder"
2996
- msgstr "Protokolldateien-Ordner"
2997
-
2998
- # @ backwpup
2999
- #: ../inc/class-page-settings.php:197
3000
- msgid "Maximum number of log files in folder"
3001
- msgstr "Anzahl der Dateien, die im Ordner behalten werden"
3002
-
3003
- # @ backwpup
3004
- #: ../inc/class-page-settings.php:205
3005
- #: ../inc/class-page-settings.php:208
3006
- msgid "Compression"
3007
- msgstr "Komprimierung"
3008
-
3009
- # @ backwpup
3010
- #: ../inc/class-page-settings.php:213
3011
- msgid "Compress log files with GZip."
3012
- msgstr "Komprimiere Logdateien mit Gzip."
3013
-
3014
- # @ backwpup
3015
- #: ../inc/class-page-settings.php:222
3016
- msgid "There are a couple of general options for backup jobs. Set them here."
3017
- msgstr "Es gibt einige allgemeine Optionen für Backup-Aufträge, die Sie hier setzen können."
3018
-
3019
- # @ backwpup
3020
- #: ../inc/class-page-settings.php:226
3021
- msgid "Maximum number of retries for job steps"
3022
- msgstr "Maximale Anzahl für Neuversuche der Arbeitsschritte"
3023
-
3024
- # @ backwpup
3025
- #: ../inc/class-page-settings.php:234
3026
- msgid "Maximum script execution time"
3027
- msgstr "Maximale Script Ausführungszeit"
3028
-
3029
- # @ backwpup
3030
- #: ../inc/class-page-settings.php:237
3031
- msgid "Maximum PHP Script execution time"
3032
- msgstr "Maximale PHP-Script Ausführungszeit"
3033
-
3034
- # @ backwpup
3035
- #: ../inc/class-page-settings.php:242
3036
- msgid "seconds. 0 = disabled."
3037
- msgstr "Sekunden. 0 = deaktiviert."
3038
-
3039
- # @ backwpup
3040
- #: ../inc/class-page-settings.php:248
3041
- #: ../inc/class-page-settings.php:251
3042
- msgid "Method for creating ZIP-file archives"
3043
- msgstr "Methode für das erstellen von ZIP Dateien ist"
3044
-
3045
- # @ backwpup
3046
- #: ../inc/class-page-settings.php:255
3047
- msgid "Auto"
3048
- msgstr "Auto"
3049
-
3050
- # @ backwpup
3051
- #: ../inc/class-page-settings.php:256
3052
- msgid "ZipArchive"
3053
- msgstr "ZipArchive"
3054
-
3055
- # @ backwpup
3056
- #: ../inc/class-page-settings.php:257
3057
- msgid "PclZip"
3058
- msgstr "PclZip"
3059
-
3060
- # @ backwpup
3061
- #: ../inc/class-page-settings.php:265
3062
- msgid "Key to start jobs externally with an URL"
3063
- msgstr "Schlüssel für den Start eines Auftrags über eine externe URL"
3064
-
3065
- # @ backwpup
3066
- #: ../inc/class-page-settings.php:273
3067
- msgid "No translation"
3068
- msgstr "Keine Übersetzung"
3069
-
3070
- # @ backwpup
3071
- #: ../inc/class-page-settings.php:276
3072
- msgid "No Translation"
3073
- msgstr "Keine Übersetzung"
3074
-
3075
- # @ backwpup
3076
- #: ../inc/class-page-settings.php:281
3077
- msgid "No translation for the job, the log will be written in English"
3078
- msgstr "Keine Übersetzung für diesen Auftrag verwenden, die Log-Dateien werden in Englisch geschrieben. "
3079
-
3080
- # @ backwpup
3081
- #: ../inc/class-page-settings.php:287
3082
- #: ../inc/class-page-settings.php:290
3083
- msgid "Reduce server load"
3084
- msgstr "Reduziere Server-Auslastung"
3085
-
3086
- # @ backwpup
3087
- #: ../inc/class-page-settings.php:294
3088
- msgid "disabled"
3089
- msgstr "deaktiviert"
3090
-
3091
- # @ backwpup
3092
- #: ../inc/class-page-settings.php:295
3093
- msgid "minimum"
3094
- msgstr "minimum"
3095
-
3096
- # @ backwpup
3097
- #: ../inc/class-page-settings.php:296
3098
- msgid "medium"
3099
- msgstr "medium"
3100
-
3101
- # @ backwpup
3102
- #: ../inc/class-page-settings.php:297
3103
- msgid "maximum"
3104
- msgstr "maximum"
3105
-
3106
- # @ backwpup
3107
- #: ../inc/class-page-settings.php:310
3108
- msgid "Is your blog protected with HTTP basic authentication (.htaccess)? If yes, please set the username and password for authentication here."
3109
- msgstr "Ist deine Wesbite mit einer HTTP-Authentifizierung geschützt (.htaccess)? Wenn ja, trage hier bitte die Zugangsdaten ein."
3110
-
3111
- # @ backwpup
3112
- #: ../inc/class-page-settings.php:313
3113
- msgid "Username:"
3114
- msgstr "Benutzername:"
3115
-
3116
- # @ backwpup
3117
- #: ../inc/class-page-settings.php:321
3118
- #: ../inc/class-destination-sugarsync.php:34
3119
- msgid "Password:"
3120
- msgstr "Passwort:"
3121
-
3122
- # @ backwpup
3123
- #: ../inc/class-page-settings.php:341
3124
- #: ../inc/class-page-settings.php:342
3125
- msgid "Setting"
3126
- msgstr "Einstellung"
3127
-
3128
- # @ backwpup
3129
- #: ../inc/class-page-settings.php:341
3130
- #: ../inc/class-page-settings.php:342
3131
- msgid "Value"
3132
- msgstr "Wert"
3133
-
3134
- # @ backwpup
3135
- #: ../inc/class-page-settings.php:343
3136
- msgid "WordPress version"
3137
- msgstr "WordPress-Version"
3138
-
3139
- # @ backwpup
3140
- #: ../inc/class-page-settings.php:345
3141
- msgid "BackWPup version"
3142
- msgstr "BackWPup-Version"
3143
-
3144
- # @ backwpup
3145
- #: ../inc/class-page-settings.php:345
3146
- msgid "Get pro."
3147
- msgstr "Pro-Version kaufen"
3148
-
3149
- # @ backwpup
3150
- #: ../inc/class-page-settings.php:347
3151
- msgid "BackWPup Pro version"
3152
- msgstr "BackWPup-Pro-Version"
3153
-
3154
- # @ backwpup
3155
- #: ../inc/class-page-settings.php:348
3156
- msgid "PHP version"
3157
- msgstr "PHP-Version"
3158
-
3159
- # @ backwpup
3160
- #: ../inc/class-page-settings.php:349
3161
- msgid "MySQL version"
3162
- msgstr "MySQL-Version"
3163
-
3164
- # @ backwpup
3165
- #: ../inc/class-page-settings.php:352
3166
- #: ../inc/class-page-settings.php:356
3167
- msgid "cURL version"
3168
- msgstr "cURL-Version"
3169
-
3170
- # @ backwpup
3171
- #: ../inc/class-page-settings.php:353
3172
- msgid "cURL SSL version"
3173
- msgstr "cURL-SSL-Version"
3174
-
3175
- # @ backwpup
3176
- #: ../inc/class-page-settings.php:356
3177
- msgid "unavailable"
3178
- msgstr "unerreichbar"
3179
-
3180
- # @ backwpup
3181
- #: ../inc/class-page-settings.php:358
3182
- msgid "WP-Cron url:"
3183
- msgstr "WP-Cron URL:"
3184
-
3185
- # @ backwpup
3186
- #: ../inc/class-page-settings.php:360
3187
- msgid "Server self connect:"
3188
- msgstr "Verbindung zum Server selbst:"
3189
-
3190
- # @ backwpup
3191
- #: ../inc/class-page-settings.php:364
3192
- #: ../inc/class-page-jobs.php:347
3193
- #, php-format
3194
- msgid "The HTTP response test get an error \"%s\""
3195
- msgstr "Der HTTP Antwort Test bekommt diesen Fehler \"%s\""
3196
-
3197
- # @ backwpup
3198
- #: ../inc/class-page-settings.php:366
3199
- #: ../inc/class-page-jobs.php:349
3200
- #, php-format
3201
- msgid "The HTTP response test get a false http status (%s)"
3202
- msgstr "Der HTTP Antwort Test bekommt den falschen http Status (%s)"
3203
-
3204
- # @ backwpup
3205
- #: ../inc/class-page-settings.php:369
3206
- #: ../inc/pro/class-wizard-systemtest.php:180
3207
- #, php-format
3208
- msgid "The BackWPup HTTP response header returns a false value: \"%s\""
3209
- msgstr "Der HTTP Response Header in BackWPup gibt einen fehlerhaften Wert zurück: \"%s\""
3210
-
3211
- # @ backwpup
3212
- #: ../inc/class-page-settings.php:372
3213
- msgid "Response Test O.K."
3214
- msgstr "Response Test O.K."
3215
-
3216
- # @ backwpup
3217
- #: ../inc/class-page-settings.php:377
3218
- msgid "Temp folder:"
3219
- msgstr "Temp Verzeichnis:"
3220
-
3221
- # @ backwpup
3222
- #: ../inc/class-page-settings.php:379
3223
- #, php-format
3224
- msgid "Temp folder %s doesn't exist."
3225
- msgstr "Temp Verzeichnis %s existiert nicht."
3226
-
3227
- # @ backwpup
3228
- #: ../inc/class-page-settings.php:381
3229
- #, php-format
3230
- msgid "Temporary folder %s is not writable."
3231
- msgstr "Temporärer Ordner %s ist nicht beschreibbar."
3232
-
3233
- # @ backwpup
3234
- #: ../inc/class-page-settings.php:386
3235
- msgid "Log folder:"
3236
- msgstr "Protokoll-Ordner:"
3237
-
3238
- # @ backwpup
3239
- #: ../inc/class-page-settings.php:388
3240
- #, php-format
3241
- msgid "Logs folder %s not exist."
3242
- msgstr "Log Dateien %s Verzeichnis existiert nicht"
3243
-
3244
- # @ backwpup
3245
- #: ../inc/class-page-settings.php:390
3246
- #, php-format
3247
- msgid "Log folder %s is not writable."
3248
- msgstr "Protokoll-Ordner %s ist nicht beschreibbar."
3249
-
3250
- # @ backwpup
3251
- #: ../inc/class-page-settings.php:394
3252
- msgid "Server"
3253
- msgstr "Server"
3254
-
3255
- # @ backwpup
3256
- #: ../inc/class-page-settings.php:395
3257
- msgid "Operating System"
3258
- msgstr "Betriebssystem"
3259
-
3260
- # @ backwpup
3261
- #: ../inc/class-page-settings.php:396
3262
- msgid "PHP SAPI"
3263
- msgstr "PHP SAPI"
3264
-
3265
- # @ backwpup
3266
- #: ../inc/class-page-settings.php:397
3267
- msgid "Current PHP user"
3268
- msgstr "Aktueller PHP user"
3269
-
3270
- # @ backwpup
3271
- #: ../inc/class-page-settings.php:398
3272
- #: ../inc/class-page-settings.php:402
3273
- #: ../inc/class-page-settings.php:406
3274
- msgid "On"
3275
- msgstr "An"
3276
-
3277
- # @ backwpup
3278
- #: ../inc/class-page-settings.php:398
3279
- #: ../inc/class-page-settings.php:404
3280
- #: ../inc/class-page-settings.php:408
3281
- msgid "Off"
3282
- msgstr "Aus"
3283
-
3284
- # @ backwpup
3285
- #: ../inc/class-page-settings.php:399
3286
- msgid "Safe Mode"
3287
- msgstr "Safe Mode"
3288
-
3289
- # @ backwpup
3290
- #: ../inc/class-page-settings.php:400
3291
- msgid "Maximum execution time"
3292
- msgstr "Max. Ausführungszeit"
3293
-
3294
- # @ backwpup
3295
- #: ../inc/class-page-settings.php:402
3296
- #: ../inc/class-page-settings.php:404
3297
- msgid "Alternative WP Cron"
3298
- msgstr "Alternative WP Cron"
3299
-
3300
- # @ backwpup
3301
- #: ../inc/class-page-settings.php:406
3302
- #: ../inc/class-page-settings.php:408
3303
- msgid "Disabled WP Cron"
3304
- msgstr "WP Cron abgeschaltet"
3305
-
3306
- # @ backwpup
3307
- #: ../inc/class-page-settings.php:410
3308
- #: ../inc/class-page-settings.php:412
3309
- msgid "CHMOD Dir"
3310
- msgstr "CHMOD Verzeichnis"
3311
-
3312
- # @ backwpup
3313
- #: ../inc/class-page-settings.php:414
3314
- msgid "Server Time"
3315
- msgstr "Server Zeit"
3316
-
3317
- # @ backwpup
3318
- #: ../inc/class-page-settings.php:415
3319
- msgid "Blog Time"
3320
- msgstr "Webseite Zeit"
3321
-
3322
- # @ backwpup
3323
- #: ../inc/class-page-settings.php:416
3324
- msgid "Blog Timezone"
3325
- msgstr "Webseite Zeitzone"
3326
-
3327
- # @ backwpup
3328
- #: ../inc/class-page-settings.php:417
3329
- msgid "Blog Time offset"
3330
- msgstr "Webseite Zeitversetzung"
3331
-
3332
- # @ backwpup
3333
- #: ../inc/class-page-settings.php:417
3334
- #, php-format
3335
- msgid "%s hours"
3336
- msgstr "%s Stunden"
3337
-
3338
- # @ backwpup
3339
- #: ../inc/class-page-settings.php:418
3340
- msgid "Blog language"
3341
- msgstr "Webseiten Sprache"
3342
-
3343
- # @ backwpup
3344
- #: ../inc/class-page-settings.php:419
3345
- msgid "MySQL Client encoding"
3346
- msgstr "MySQL Client Encoding"
3347
-
3348
- # @ backwpup
3349
- #: ../inc/class-page-settings.php:422
3350
- msgid "Blog charset"
3351
- msgstr "Webseiten Charset"
3352
-
3353
- # @ backwpup
3354
- #: ../inc/class-page-settings.php:423
3355
- msgid "PHP Memory limit"
3356
- msgstr "PHP Memory Limit"
3357
-
3358
- # @ backwpup
3359
- #: ../inc/class-page-settings.php:424
3360
- msgid "WP memory limit"
3361
- msgstr "WordPress-Memory-Limit"
3362
-
3363
- # @ backwpup
3364
- #: ../inc/class-page-settings.php:425
3365
- msgid "WP maximum memory limit"
3366
- msgstr "Maximales WordPress-Memory-Limit"
3367
-
3368
- # @ backwpup
3369
- #: ../inc/class-page-settings.php:426
3370
- msgid "Memory in use"
3371
- msgstr "Speicher in Benutzung"
3372
-
3373
- # @ backwpup
3374
- #: ../inc/class-page-settings.php:431
3375
- msgid "Disabled PHP Functions:"
3376
- msgstr "Deaktivierte PHP Funktionen:"
3377
-
3378
- # @ backwpup
3379
- #: ../inc/class-page-settings.php:436
3380
- msgid "Loaded PHP Extensions:"
3381
- msgstr "Geladene PHP Erweiterungen"
3382
-
3383
- # @ backwpup
3384
- #: ../inc/class-page-settings.php:448
3385
- msgid "Save Changes"
3386
- msgstr "Änderungen speichern"
3387
-
3388
- # @ backwpup
3389
- #: ../inc/class-page-settings.php:450
3390
- msgid "Reset all settings to default"
3391
- msgstr "Alle Einstellungen zurücksetzen"
3392
-
3393
- # @ backwpup
3394
- #: ../inc/class-page-editjob.php:37
3395
- msgid "Overview"
3396
- msgstr "Überblick"
3397
-
3398
- # @ backwpup
3399
- #: ../inc/class-page-editjob.php:102
3400
- #, php-format
3401
- msgid "Job with ID %d"
3402
- msgstr "Auftrag mit der ID %d"
3403
-
3404
- # @ backwpup
3405
- #: ../inc/class-page-editjob.php:191
3406
- #, php-format
3407
- msgid "Changes for job <i>%s</i> saved."
3408
- msgstr "Änderungen für den Auftrag <i>%s</i> gesichert."
3409
-
3410
- # @ backwpup
3411
- #: ../inc/class-page-editjob.php:192
3412
- msgid "Jobs overview"
3413
- msgstr "Auftragsübersicht"
3414
-
3415
- # @ backwpup
3416
- #: ../inc/class-page-editjob.php:192
3417
- #: ../inc/class-page-jobs.php:117
3418
- msgid "Run now"
3419
- msgstr "Jetzt starten"
3420
-
3421
- # @ backwpup
3422
- #: ../inc/class-page-editjob.php:331
3423
- msgid "Working as <a href=\"http://wikipedia.org/wiki/Cron\">Cron</a> schedule:"
3424
- msgstr "Als <a href=\\\"http://de.wikipedia.org/wiki/Cron\\\">Cron-Job</a> ausführen:"
3425
-
3426
- # @ backwpup
3427
- #: ../inc/class-page-editjob.php:340
3428
- #, php-format
3429
- msgid "ATTENTION: Job runs every %d minutes!"
3430
- msgstr "ACHTUNG: Auftrag läuft alle %d Minuten!"
3431
-
3432
- # @ backwpup
3433
- #: ../inc/class-page-editjob.php:346
3434
- #, php-format
3435
- msgid "ATTENTION: Job runs every %d hours!"
3436
- msgstr "ACHTUNG: Auftrag läuft alle %d Stunden!"
3437
-
3438
- # @ backwpup
3439
- #: ../inc/class-page-editjob.php:350
3440
- msgid "ATTENTION: Can't calculate cron!"
3441
- msgstr "ACHTUNG: Kann cron nicht berechnen!"
3442
-
3443
- # @ backwpup
3444
- #: ../inc/class-page-editjob.php:353
3445
- msgid "Next runtime:"
3446
- msgstr "Nächster Durchlauf:"
3447
-
3448
- # @ backwpup
3449
- #: ../inc/class-page-editjob.php:386
3450
- msgid "Schedule"
3451
- msgstr "Planen"
3452
-
3453
- # @ backwpup
3454
- #: ../inc/class-page-editjob.php:401
3455
- #, php-format
3456
- msgid "To: %s"
3457
- msgstr "Zu: %s"
3458
-
3459
- # @ backwpup
3460
- #: ../inc/class-page-editjob.php:407
3461
- #, php-format
3462
- msgid "%s Job:"
3463
- msgstr "%s Auftrag: "
3464
-
3465
- # @ backwpup
3466
- #: ../inc/class-page-editjob.php:434
3467
- #: ../inc/class-page-jobs.php:76
3468
- msgid "Job Name"
3469
- msgstr "Auftragsname"
3470
-
3471
- # @ backwpup
3472
- #: ../inc/class-page-editjob.php:438
3473
- msgid "Please name this job."
3474
- msgstr "Bitte benennen Sie diesen Auftrag."
3475
-
3476
- # @ backwpup
3477
- #: ../inc/class-page-editjob.php:446
3478
- msgid "Job Tasks"
3479
- msgstr "Auftragsdetails"
3480
-
3481
- # @ backwpup
3482
- #: ../inc/class-page-editjob.php:450
3483
- msgid "This job is a&#160;&hellip;"
3484
- msgstr "Dieser Auftrag ist ein&#160;&hellip;"
3485
-
3486
- # @ backwpup
3487
- #: ../inc/class-page-editjob.php:453
3488
- msgid "Job tasks"
3489
- msgstr "Auftragsdetails"
3490
-
3491
- # @ backwpup
3492
- #: ../inc/class-page-editjob.php:471
3493
- msgid "Backup File Creation"
3494
- msgstr "Erstellen der Backup-Datei"
3495
-
3496
- # @ backwpup
3497
- #: ../inc/class-page-editjob.php:476
3498
- #: ../inc/class-page-editjob.php:479
3499
- msgid "Backup type"
3500
- msgstr "Backup Typ"
3501
-
3502
- # @ backwpup
3503
- #: ../inc/class-page-editjob.php:483
3504
- msgid "Synchronize file by file to destination"
3505
- msgstr "Synchronisiere Datei für Datei zum Auftragsziel"
3506
-
3507
- # @ backwpup
3508
- #: ../inc/class-page-editjob.php:487
3509
- msgid "Create a backup archive"
3510
- msgstr "Backup erstellen"
3511
-
3512
- # @ backwpup
3513
- #: ../inc/class-page-editjob.php:493
3514
- msgid "Archive name"
3515
- msgstr "Archivname"
3516
-
3517
- # @ backwpup
3518
- #: ../inc/class-page-editjob.php:525
3519
- #: ../inc/class-page-editjob.php:528
3520
- msgid "Archive Format"
3521
- msgstr "Archiv Format"
3522
-
3523
- # @ backwpup
3524
- #: ../inc/class-page-editjob.php:531
3525
- msgid "PHP Zip functions will be used if available (needs less memory). Otherwise the PCLZip class will be used."
3526
- msgstr "PHP-Zip-Funktionen werden verwendet, sofern verfügbar (schneller). Ansonsten wird die Klasse PCLZip verwendet."
3527
-
3528
- # @ backwpup
3529
- #: ../inc/class-page-editjob.php:531
3530
- #: ../inc/class-page-editjob.php:533
3531
- msgid "Zip"
3532
- msgstr "Zip"
3533
-
3534
- # @ backwpup
3535
- #: ../inc/class-page-editjob.php:533
3536
- #: ../inc/class-page-editjob.php:538
3537
- #: ../inc/class-page-editjob.php:542
3538
- msgid "Disabled due to missing PHP function."
3539
- msgstr "Deaktiviert wegen nicht verfügbarer PHP-Funktion."
3540
-
3541
- # @ backwpup
3542
- #: ../inc/class-page-editjob.php:534
3543
- msgid "A tarballed, not compressed archive (fast and less memory)"
3544
- msgstr "Ein TAR-Archiv, nicht komprimiert (schnell und speicherschonend)"
3545
-
3546
- # @ backwpup
3547
- #: ../inc/class-page-editjob.php:534
3548
- msgid "Tar"
3549
- msgstr "Tar"
3550
-
3551
- # @ backwpup
3552
- #: ../inc/class-page-editjob.php:536
3553
- msgid "A tarballed, GZipped archive (fast and less memory)"
3554
- msgstr "Ein TAR-GZ-Archiv (schnell und speicherschonend)"
3555
-
3556
- # @ backwpup
3557
- #: ../inc/class-page-editjob.php:536
3558
- #: ../inc/class-page-editjob.php:538
3559
- msgid "Tar GZip"
3560
- msgstr "Tar GZip"
3561
-
3562
- # @ backwpup
3563
- #: ../inc/class-page-editjob.php:540
3564
- msgid "A tarballed, BZipped archive (fast and less memory)"
3565
- msgstr "Ein TAR-BZ-Archiv (schnell und speicherschonend)"
3566
-
3567
- # @ backwpup
3568
- #: ../inc/class-page-editjob.php:540
3569
- #: ../inc/class-page-editjob.php:542
3570
- msgid "Tar BZip2"
3571
- msgstr "Tar BZip2"
3572
-
3573
- # @ backwpup
3574
- #: ../inc/class-page-editjob.php:548
3575
- msgid "Job Destination"
3576
- msgstr "Zielordner des Auftrags"
3577
-
3578
- # @ backwpup
3579
- #: ../inc/class-page-editjob.php:552
3580
- #: ../inc/class-page-editjob.php:555
3581
- msgid "Where should your backup file be stored?"
3582
- msgstr "Wo soll die Backup-Datei gespeichert werden?"
3583
-
3584
- # @ backwpup
3585
- #: ../inc/class-page-editjob.php:576
3586
- msgid "Log Files"
3587
- msgstr "Protokoll-Dateien"
3588
-
3589
- # @ backwpup
3590
- #: ../inc/class-page-editjob.php:580
3591
- msgid "Send log to email address"
3592
- msgstr "Protokoll-Datei an E-Mail-Adresse senden"
3593
-
3594
- # @ backwpup
3595
- #: ../inc/class-page-editjob.php:588
3596
- msgid "Email FROM field"
3597
- msgstr "VON-Feld der E-Mail"
3598
-
3599
- # @ backwpup
3600
- #: ../inc/class-page-editjob.php:596
3601
- msgid "Errors only"
3602
- msgstr "Nur Fehler"
3603
-
3604
- # @ backwpup
3605
- #: ../inc/class-page-editjob.php:601
3606
- msgid "Send email with log only when errors occur during job execution."
3607
- msgstr "Sende eine E-Mail mit Protokoll nur, wenn während des Auftrags ein Fehler aufgetreten ist."
3608
-
3609
- # @ backwpup
3610
- #: ../inc/class-page-editjob.php:612
3611
- msgid "Job Schedule"
3612
- msgstr "Auftragsplanung"
3613
-
3614
- # @ backwpup
3615
- #: ../inc/class-page-editjob.php:616
3616
- #: ../inc/class-page-editjob.php:619
3617
- msgid "Start job"
3618
- msgstr "Auftrag starten"
3619
-
3620
- # @ backwpup
3621
- #: ../inc/class-page-editjob.php:623
3622
- msgid "manually only"
3623
- msgstr "nur manuell"
3624
-
3625
- # @ backwpup
3626
- #: ../inc/class-page-editjob.php:627
3627
- msgid "with WordPress cron"
3628
- msgstr "mit WordPress Cron"
3629
-
3630
- # @ backwpup
3631
- #: ../inc/class-page-editjob.php:634
3632
- msgid "with a link"
3633
- msgstr "mit einem Link"
3634
-
3635
- # @ backwpup
3636
- #: ../inc/class-page-editjob.php:640
3637
- msgid "Start job with CLI"
3638
- msgstr "Auftrag per CLI starten"
3639
-
3640
- # @ backwpup
3641
- #: ../inc/class-page-editjob.php:643
3642
- #, php-format
3643
- msgid "Use <a href=\"http://wp-cli.org/\">WP-CLI</a> to run jobs from commandline or <a href=\"%s\">get the start script</a>."
3644
- msgstr "Verwenden Sie <a href=\"http://wp-cli.org/\">WP-CLI</a>, um Aufträge per Kommandozeile auszulösen, oder <a href=\"%s\">dieses Start-Script</a>."
3645
-
3646
- # @ backwpup
3647
- #: ../inc/class-page-editjob.php:648
3648
- msgid "Schedule execution time"
3649
- msgstr "Plane Ausführungszeit"
3650
-
3651
- # @ backwpup
3652
- #: ../inc/class-page-editjob.php:652
3653
- #: ../inc/class-page-editjob.php:655
3654
- msgid "Scheduler type"
3655
- msgstr "Planungstyp"
3656
-
3657
- # @ backwpup
3658
- #: ../inc/class-page-editjob.php:659
3659
- msgid "basic"
3660
- msgstr "einfach"
3661
-
3662
- # @ backwpup
3663
- #: ../inc/class-page-editjob.php:663
3664
- msgid "advanced"
3665
- msgstr "erweitert"
3666
-
3667
- # @ backwpup
3668
- #: ../inc/class-page-editjob.php:692
3669
- #: ../inc/class-page-editjob.php:760
3670
- msgid "Scheduler"
3671
- msgstr "Planer"
3672
-
3673
- # @ backwpup
3674
- #: ../inc/class-page-editjob.php:702
3675
- msgid "Hour"
3676
- msgstr "Stunde"
3677
-
3678
- # @ backwpup
3679
- #: ../inc/class-page-editjob.php:705
3680
- msgid "Minute"
3681
- msgstr "Minute"
3682
-
3683
- # @ backwpup
3684
- #: ../inc/class-page-editjob.php:709
3685
- msgid "monthly"
3686
- msgstr "monatlich"
3687
-
3688
- # @ backwpup
3689
- #: ../inc/class-page-editjob.php:711
3690
- msgid "on"
3691
- msgstr "am"
3692
-
3693
- # @ backwpup
3694
- #: ../inc/class-page-editjob.php:721
3695
- msgid "weekly"
3696
- msgstr "wöchentlich"
3697
-
3698
- # @ backwpup
3699
- #: ../inc/class-page-editjob.php:723
3700
- #: ../inc/class-page-editjob.php:830
3701
- msgid "Sunday"
3702
- msgstr "Sonntag"
3703
-
3704
- # @ backwpup
3705
- #: ../inc/class-page-editjob.php:724
3706
- #: ../inc/class-page-editjob.php:831
3707
- msgid "Monday"
3708
- msgstr "Montag"
3709
-
3710
- # @ backwpup
3711
- #: ../inc/class-page-editjob.php:725
3712
- #: ../inc/class-page-editjob.php:832
3713
- msgid "Tuesday"
3714
- msgstr "Dienstag"
3715
-
3716
- # @ backwpup
3717
- #: ../inc/class-page-editjob.php:726
3718
- #: ../inc/class-page-editjob.php:833
3719
- msgid "Wednesday"
3720
- msgstr "Mittwoch"
3721
-
3722
- # @ backwpup
3723
- #: ../inc/class-page-editjob.php:727
3724
- #: ../inc/class-page-editjob.php:834
3725
- msgid "Thursday"
3726
- msgstr "Donnerstag"
3727
-
3728
- # @ backwpup
3729
- #: ../inc/class-page-editjob.php:728
3730
- #: ../inc/class-page-editjob.php:835
3731
- msgid "Friday"
3732
- msgstr "Freitag"
3733
-
3734
- # @ backwpup
3735
- #: ../inc/class-page-editjob.php:729
3736
- #: ../inc/class-page-editjob.php:836
3737
- msgid "Saturday"
3738
- msgstr "Samstag"
3739
-
3740
- # @ backwpup
3741
- #: ../inc/class-page-editjob.php:739
3742
- msgid "daily"
3743
- msgstr "täglich"
3744
-
3745
- # @ backwpup
3746
- #: ../inc/class-page-editjob.php:749
3747
- msgid "hourly"
3748
- msgstr "stündlich"
3749
-
3750
- # @ backwpup
3751
- #: ../inc/class-page-editjob.php:763
3752
- msgid "Minutes:"
3753
- msgstr "Minuten:"
3754
-
3755
- # @ backwpup
3756
- #: ../inc/class-page-editjob.php:765
3757
- #: ../inc/class-page-editjob.php:778
3758
- #: ../inc/class-page-editjob.php:790
3759
- #: ../inc/class-page-editjob.php:804
3760
- #: ../inc/class-page-editjob.php:826
3761
- msgid "Any (*)"
3762
- msgstr "Alle (*)"
3763
-
3764
- # @ backwpup
3765
- #: ../inc/class-page-editjob.php:775
3766
- msgid "Hours:"
3767
- msgstr "Stunden:"
3768
-
3769
- # @ backwpup
3770
- #: ../inc/class-page-editjob.php:788
3771
- msgid "Day of Month:"
3772
- msgstr "Tag des Monats:"
3773
-
3774
- # @ backwpup
3775
- #: ../inc/class-page-editjob.php:802
3776
- msgid "Month:"
3777
- msgstr "Monat:"
3778
-
3779
- # @ backwpup
3780
- #: ../inc/class-page-editjob.php:808
3781
- msgid "January"
3782
- msgstr "Januar"
3783
-
3784
- # @ backwpup
3785
- #: ../inc/class-page-editjob.php:809
3786
- msgid "February"
3787
- msgstr "Februar"
3788
-
3789
- # @ backwpup
3790
- #: ../inc/class-page-editjob.php:810
3791
- msgid "March"
3792
- msgstr "März"
3793
-
3794
- # @ backwpup
3795
- #: ../inc/class-page-editjob.php:811
3796
- msgid "April"
3797
- msgstr "April"
3798
-
3799
- # @ backwpup
3800
- #: ../inc/class-page-editjob.php:812
3801
- msgid "May"
3802
- msgstr "Mai"
3803
-
3804
- # @ backwpup
3805
- #: ../inc/class-page-editjob.php:813
3806
- msgid "June"
3807
- msgstr "Juni"
3808
-
3809
- # @ backwpup
3810
- #: ../inc/class-page-editjob.php:814
3811
- msgid "July"
3812
- msgstr "Juli"
3813
-
3814
- # @ backwpup
3815
- #: ../inc/class-page-editjob.php:815
3816
- msgid "August"
3817
- msgstr "August"
3818
-
3819
- # @ backwpup
3820
- #: ../inc/class-page-editjob.php:816
3821
- msgid "September"
3822
- msgstr "September"
3823
-
3824
- # @ backwpup
3825
- #: ../inc/class-page-editjob.php:817
3826
- msgid "October"
3827
- msgstr "Oktober"
3828
-
3829
- # @ backwpup
3830
- #: ../inc/class-page-editjob.php:818
3831
- msgid "November"
3832
- msgstr "November"
3833
-
3834
- # @ backwpup
3835
- #: ../inc/class-page-editjob.php:819
3836
- msgid "December"
3837
- msgstr "Dezember"
3838
-
3839
- # @ backwpup
3840
- #: ../inc/class-page-editjob.php:824
3841
- msgid "Day of Week:"
3842
- msgstr "Wochentag:"
3843
-
3844
- # @ backwpup
3845
- #: ../inc/class-page-editjob.php:860
3846
- msgid "Save changes"
3847
- msgstr "Änderungen speichern"
3848
-
3849
- # @ backwpup
3850
- #: ../inc/class-jobtype-wpplugin.php:13
3851
- msgid "Plugins"
3852
- msgstr "Plugins"
3853
-
3854
- # @ backwpup
3855
- #: ../inc/class-jobtype-wpplugin.php:14
3856
- msgid "Installed plugins list"
3857
- msgstr "Liste der installierten Plugins"
3858
-
3859
- # @ backwpup
3860
- #: ../inc/class-jobtype-wpplugin.php:45
3861
- msgid "Plugin list file name"
3862
- msgstr "Dateiname der Plugin-Liste"
3863
-
3864
- # @ backwpup
3865
- #: ../inc/class-jobtype-wpplugin.php:93
3866
- #, php-format
3867
- msgid "%d. Trying to generate a file with installed plugin names&#160;&hellip;"
3868
- msgstr "%d. Versuche, eine Liste der installierten Plugins zu erstellen&#160;&hellip;"
3869
-
3870
- # @ backwpup
3871
- #: ../inc/class-jobtype-wpplugin.php:120
3872
- msgid "All plugin information:"
3873
- msgstr "Alle Plugin-Informationen"
3874
-
3875
- # @ backwpup
3876
- #: ../inc/class-jobtype-wpplugin.php:122
3877
- #, php-format
3878
- msgid "from %s"
3879
- msgstr "von %s"
3880
-
3881
- # @ backwpup
3882
- #: ../inc/class-jobtype-wpplugin.php:124
3883
- msgid "Active plugins:"
3884
- msgstr "Aktive Plugins:"
3885
-
3886
- # @ backwpup
3887
- #: ../inc/class-jobtype-wpplugin.php:130
3888
- msgid "Inactive plugins:"
3889
- msgstr "Inaktive Plugins:"
3890
-
3891
- # @ backwpup
3892
- #: ../inc/class-jobtype-wpplugin.php:142
3893
- #, php-format
3894
- msgid "Added plugin list file \"%1$s\" with %2$s to backup file list."
3895
- msgstr "Plugin Listendatei \"%1$s\" mit %2$s zur Backup-Datei-Liste hinzugefügt."
3896
-
3897
- # @ backwpup
3898
- #: ../inc/class-destination-sugarsync.php:22
3899
- msgid "Sugarsync Login"
3900
- msgstr "SugarSync Login"
3901
-
3902
- # @ backwpup
3903
- #: ../inc/class-destination-sugarsync.php:30
3904
- msgid "Email address:"
3905
- msgstr "E-Mail-Adresse"
3906
-
3907
- # @ backwpup
3908
- #: ../inc/class-destination-sugarsync.php:40
3909
- #: ../inc/class-destination-sugarsync.php:121
3910
- msgid "Authenticate with Sugarsync!"
3911
- msgstr "Mit SugarSync authentifizieren!"
3912
-
3913
- # @ backwpup
3914
- #: ../inc/class-destination-sugarsync.php:42
3915
- #: ../inc/class-destination-sugarsync.php:137
3916
- msgid "Create Sugarsync account"
3917
- msgstr "SugarSync-Konto erstellen"
3918
-
3919
- # @ backwpup
3920
- #: ../inc/class-destination-sugarsync.php:51
3921
- #: ../inc/class-destination-sugarsync.php:133
3922
- msgid "Delete Sugarsync authentication!"
3923
- msgstr "Lösche SugarSync Authentifizierung"
3924
-
3925
- # @ backwpup
3926
- #: ../inc/class-destination-sugarsync.php:57
3927
- msgid "SugarSync Root"
3928
- msgstr "SugarSync-Wurzelverzeichnis"
3929
-
3930
- # @ backwpup
3931
- #: ../inc/class-destination-sugarsync.php:61
3932
- msgid "Sync folder selection"
3933
- msgstr "Sync Ordner Auswahl"
3934
-
3935
- # @ backwpup
3936
- #: ../inc/class-destination-sugarsync.php:69
3937
- msgid "No Syncfolders found!"
3938
- msgstr "Keine Sync-Ordner gefunden!"
3939
-
3940
- # @ backwpup
3941
- #: ../inc/class-destination-sugarsync.php:90
3942
- msgid "Folder in root"
3943
- msgstr "Ordner im Wurzelverzeichnis"
3944
-
3945
- # @ backwpup
3946
- #: ../inc/class-destination-sugarsync.php:227
3947
- #, php-format
3948
- msgid "%d. Try to send backup to SugarSync&#160;&hellip;"
3949
- msgstr "%d. Versuche, ein Backup zu SugarSync zu senden&#160;&hellip;"
3950
-
3951
- # @ backwpup
3952
- #: ../inc/class-destination-sugarsync.php:234
3953
- #, php-format
3954
- msgid "Authenticated to SugarSync with nickname %s"
3955
- msgstr "Authentifiziert bei SugarSync mit dem Namen %s"
3956
-
3957
- # @ backwpup
3958
- #: ../inc/class-destination-sugarsync.php:237
3959
- #, php-format
3960
- msgctxt "Available space on SugarSync"
3961
- msgid "Not enough disk space available on SugarSync. Available: %s."
3962
- msgstr "Nicht genug Speicherplatz verfügbar bei SugarSync. Verfügbar: %s."
3963
-
3964
- # @ backwpup
3965
- #: ../inc/class-destination-sugarsync.php:243
3966
- #, php-format
3967
- msgid "%s available at SugarSync"
3968
- msgstr "%s verfügbar bei SugarSync"
3969
-
3970
- # @ backwpup
3971
- #: ../inc/class-destination-sugarsync.php:250
3972
- msgid "Starting upload to SugarSync&#160;&hellip;"
3973
- msgstr "Hochladen zu SugarSync hat begonnen&#160;&hellip;"
3974
-
3975
- # @ backwpup
3976
- #: ../inc/class-destination-sugarsync.php:260
3977
- msgid "Cannot transfer backup to SugarSync!"
3978
- msgstr "Backup kann nicht zu SugarSync übertragen werden!"
3979
-
3980
- # @ backwpup
3981
- #: ../inc/class-destination-sugarsync.php:299
3982
- #, php-format
3983
- msgid "One file deleted on SugarSync folder"
3984
- msgid_plural "%d files deleted on SugarSync folder"
3985
- msgstr[0] "Eine Datei im SugarSync-Ordner gelöscht"
3986
- msgstr[1] "%d Dateien im SugarSync-Ordner gelöscht"
3987
-
3988
- # @ backwpup
3989
- #: ../inc/class-destination-sugarsync.php:305
3990
- #, php-format
3991
- msgid "SugarSync API: %s"
3992
- msgstr "SugarSync API: %s"
3993
-
3994
- # @ backwpup
3995
- #: ../inc/class-page-jobs.php:52
3996
- msgid "No Jobs."
3997
- msgstr "Keine Aufträge."
3998
-
3999
- # @ backwpup
4000
- #: ../inc/class-page-jobs.php:78
4001
- msgid "Destinations"
4002
- msgstr "Zielordner"
4003
-
4004
- # @ backwpup
4005
- #: ../inc/class-page-jobs.php:79
4006
- msgid "Next Run"
4007
- msgstr "Nächster Durchlauf"
4008
-
4009
- # @ backwpup
4010
- #: ../inc/class-page-jobs.php:80
4011
- msgid "Last Run"
4012
- msgstr "Letzter Durchlauf"
4013
-
4014
- # @ backwpup
4015
- #: ../inc/class-page-jobs.php:111
4016
- msgid "Edit"
4017
- msgstr "Bearbeiten"
4018
-
4019
- # @ backwpup
4020
- #: ../inc/class-page-jobs.php:112
4021
- msgid "Copy"
4022
- msgstr "Kopieren"
4023
-
4024
- # @ backwpup
4025
- #: ../inc/class-page-jobs.php:123
4026
- msgid "Last log"
4027
- msgstr "Letztes Log"
4028
-
4029
- # @ backwpup
4030
- #: ../inc/class-page-jobs.php:185
4031
- msgid "Not needed or set"
4032
- msgstr "Nicht gebraucht oder eingestellt"
4033
-
4034
- # @ backwpup
4035
- #: ../inc/class-page-jobs.php:207
4036
- #, php-format
4037
- msgid "Running for: %s seconds"
4038
- msgstr "Läuft seit %s Sekunden"
4039
-
4040
- # @ backwpup
4041
- #: ../inc/class-page-jobs.php:213
4042
- #, php-format
4043
- msgid "Cron: %s"
4044
- msgstr "Cron: %s"
4045
-
4046
- # @ backwpup
4047
- #: ../inc/class-page-jobs.php:213
4048
- #, php-format
4049
- msgid "%1$s at %2$s by WP-Cron"
4050
- msgstr "%1$s um %2$s mit WP-Cron"
4051
-
4052
- # @ backwpup
4053
- #: ../inc/class-page-jobs.php:218
4054
- msgid "Inactive"
4055
- msgstr "Inaktiv"
4056
-
4057
- # @ backwpup
4058
- #: ../inc/class-page-jobs.php:240
4059
- #, php-format
4060
- msgid "Runtime: %d seconds"
4061
- msgstr "Ausführungszeit: %d Sekunden"
4062
-
4063
- # @ backwpup
4064
- #: ../inc/class-page-jobs.php:243
4065
- msgid "not yet"
4066
- msgstr "noch nicht"
4067
-
4068
- # @ backwpup
4069
- #: ../inc/class-page-jobs.php:247
4070
- msgid "Download last backup"
4071
- msgstr "Letztes Backup herunterladen"
4072
-
4073
- # @ backwpup
4074
- #: ../inc/class-page-jobs.php:252
4075
- msgid "Log"
4076
- msgstr "Protokoll"
4077
-
4078
- # @ backwpup
4079
- #: ../inc/class-page-jobs.php:295
4080
- msgid "Copy of"
4081
- msgstr "Kopie von"
4082
-
4083
- # @ backwpup
4084
- #: ../inc/class-page-jobs.php:367
4085
- #, php-format
4086
- msgid "Job “%s” has started, but not responded for 10 seconds."
4087
- msgstr "Auftrag „%s“ wurde gestartet, hat jedoch seit 10 Sekunden nicht geantwortet."
4088
-
4089
- # @ backwpup
4090
- #: ../inc/class-page-jobs.php:372
4091
- #, php-format
4092
- msgid "Job \"%s\" started."
4093
- msgstr "Auftrag \"%s\" wurde gestartet."
4094
-
4095
- # @ backwpup
4096
- #: ../inc/class-page-jobs.php:497
4097
- #, php-format
4098
- msgid "%s Jobs"
4099
- msgstr "%s Aufträge"
4100
-
4101
- # @ backwpup
4102
- #: ../inc/class-page-jobs.php:517
4103
- #, php-format
4104
- msgid "Job currently running: %s"
4105
- msgstr "Aktueller Auftrag wird bearbeitet: %s"
4106
-
4107
- # @ backwpup
4108
- #: ../inc/class-page-jobs.php:518
4109
- msgid "Warnings:"
4110
- msgstr "Warnungen:"
4111
-
4112
- # @ backwpup
4113
- #: ../inc/class-page-jobs.php:519
4114
- msgid "Errors:"
4115
- msgstr "Fehler:"
4116
-
4117
- # @ backwpup
4118
- #: ../inc/class-page-jobs.php:520
4119
- msgid "Log of running job"
4120
- msgstr "Protokoll des laufenden Auftrags"
4121
-
4122
- # @ backwpup
4123
- #: ../inc/class-page-jobs.php:520
4124
- msgid "Display working log"
4125
- msgstr "Zeige Auftragslog"
4126
-
4127
- # @ backwpup
4128
- #: ../inc/class-page-jobs.php:521
4129
- #: ../inc/class-page-backwpup.php:349
4130
- msgid "Abort"
4131
- msgstr "Abbrechen"
4132
-
4133
- # @ backwpup
4134
- #: ../inc/class-page-jobs.php:522
4135
- msgid "Close working screen"
4136
- msgstr "Arbeitsfläche schließen"
4137
-
4138
- # @ backwpup
4139
- #: ../inc/class-page-jobs.php:522
4140
- msgid "close"
4141
- msgstr "schließen"
4142
-
4143
- # @ backwpup
4144
- #: ../inc/class-page-jobs.php:672
4145
- msgid "Job completed"
4146
- msgstr "Auftrag vollständig"
4147
-
4148
- # @ backwpup
4149
- #: ../inc/class-page-jobs.php:676
4150
- #, php-format
4151
- msgid "Job has done with warnings in %s seconds. Please resolve them for correct execution."
4152
- msgstr "Auftrag wurde mit Warnungen in %s Sekunden erledigt. Bitte beheben sie diese, für eine korrekte Ausführung."
4153
-
4154
- # @ backwpup
4155
- #: ../inc/class-page-backwpup.php:67
4156
- #, php-format
4157
- msgid "%s Dashboard"
4158
- msgstr "%s Dashboard"
4159
-
4160
- # @ backwpup
4161
- #: ../inc/class-page-backwpup.php:74
4162
- #: ../inc/class-page-backwpup.php:83
4163
- msgctxt "Dashboard heading"
4164
- msgid "Planning backups"
4165
- msgstr "Backups planen"
4166
-
4167
- # @ backwpup
4168
- #: ../inc/class-page-backwpup.php:75
4169
- #: ../inc/class-page-backwpup.php:84
4170
- msgid "Use your backup archives to save your entire WordPress installation including <code>/wp-content/</code>. Push them to an external storage service if you don’t want to save the backups on the same server."
4171
- msgstr "Benutze deine Backup-Archive, um deine gesamte WordPress-Installation zu sichern, einschließlich <code>/wp-content/</code>. Lade sie zu einem externen Dienst hoch, wenn du deine Backups nicht auf demselben Server speichern möchtest."
4172
-
4173
- # @ backwpup
4174
- #: ../inc/class-page-backwpup.php:76
4175
- #: ../inc/class-page-backwpup.php:85
4176
- msgctxt "Dashboard heading"
4177
- msgid "Restoring backups"
4178
- msgstr "Backups wiederherstellen"
4179
-
4180
- # @ backwpup
4181
- #: ../inc/class-page-backwpup.php:77
4182
- #: ../inc/class-page-backwpup.php:86
4183
- msgid "With a single backup archive you are able to restore an installation. Use a tool like phpMyAdmin or a plugin like <a href=\"http://wordpress.org/plugins/adminer/\" target=\"_blank\">Adminer</a> to restore your database backup files."
4184
- msgstr "Mit einem einzigen Backup-Archiv kannst du deine Installation wiederherstellen. Benutze ein serverseitiges Tool wie phpMyAdmin, oder ein Plugin wie <a href=\"http://wordpress.org/plugins/adminer/\" target=\"_blank\">Adminer</a>, um deine Datenbanksicherung wiederherzustellen."
4185
-
4186
- # @ backwpup
4187
- #: ../inc/class-page-backwpup.php:78
4188
- #: ../inc/class-page-backwpup.php:87
4189
- msgctxt "Dashboard heading"
4190
- msgid "Ready to set up a backup job?"
4191
- msgstr "Bereit, einen Backup-Auftrag zu erstellen?"
4192
-
4193
- # @ backwpup
4194
- #: ../inc/class-page-backwpup.php:79
4195
- #, php-format
4196
- msgid "Use one of the wizards to plan a backup, or use <a href=\"%s\">expert mode</a> for full control over all options."
4197
- msgstr "Verwende einen der Assistenten, um dein Backup zu planen, oder den <a href=\"%s\">Expertenmodus</a> für die volle Übersicht über alle Optionen."
4198
-
4199
- # @ backwpup
4200
- #: ../inc/class-page-backwpup.php:79
4201
- #: ../inc/class-page-backwpup.php:89
4202
- msgid "<strong>Please note: You are solely responsible for the security of your data; the authors of this plugin are not.</strong>"
4203
- msgstr "<strong>Bitte beachte: Für die Sicherheit deiner Daten bist du allein verantwortlich; die Autoren dieses Plugins sind es nicht.</strong>"
4204
-
4205
- # @ backwpup
4206
- #: ../inc/class-page-backwpup.php:84
4207
- msgid "Use the short links in the <strong>First steps</strong> box to plan and schedule backup jobs."
4208
- msgstr "Benutze die Schnellverweise in <strong>Erste Schritte</strong>, um einen Backup-Auftrag zu planen und zu terminieren."
4209
-
4210
- # @ backwpup
4211
- #: ../inc/class-page-backwpup.php:88
4212
- #, php-format
4213
- msgid "<a href=\"%s\">Add a new backup job</a> and plan what you want to save."
4214
- msgstr "<a href=\"%s\">Erstelle einen Backup-Auftrag</a> und plane deine Sicherung."
4215
-
4216
- # @ backwpup
4217
- #: ../inc/class-page-backwpup.php:96
4218
- msgid "First Steps"
4219
- msgstr "Erste Schritte"
4220
-
4221
- # @ backwpup
4222
- #: ../inc/class-page-backwpup.php:100
4223
- msgid "Test the installation"
4224
- msgstr "Die Installation testen"
4225
-
4226
- # @ backwpup
4227
- #: ../inc/class-page-backwpup.php:101
4228
- #: ../inc/class-page-backwpup.php:104
4229
- msgid "Create a Job"
4230
- msgstr "Auftrag erstellen"
4231
-
4232
- # @ backwpup
4233
- #: ../inc/class-page-backwpup.php:103
4234
- msgid "Check the installation"
4235
- msgstr "Überprüfe die Installation"
4236
-
4237
- # @ backwpup
4238
- #: ../inc/class-page-backwpup.php:106
4239
- msgid "Run the created job"
4240
- msgstr "Erstellten Auftrag starten"
4241
-
4242
- # @ backwpup
4243
- #: ../inc/class-page-backwpup.php:107
4244
- msgid "Check the job log"
4245
- msgstr "Logs des Auftrages prüfen"
4246
-
4247
- # @ backwpup
4248
- #: ../inc/class-page-backwpup.php:115
4249
- msgid "One click backup"
4250
- msgstr "Ein-Klick-Backup"
4251
-
4252
- # @ backwpup
4253
- #: ../inc/class-page-backwpup.php:117
4254
- msgid "Generate a database backup of WordPress tables and download it right away!"
4255
- msgstr "Generieren Sie ein Datenbank-Backup der WordPress-Tabellen und laden Sie es gleich herunter!"
4256
-
4257
- # @ backwpup
4258
- #: ../inc/class-page-backwpup.php:117
4259
- msgid "Download database backup"
4260
- msgstr "Datenbank-Backup herunterladen"
4261
-
4262
- # @ backwpup
4263
- #: ../inc/class-page-backwpup.php:123
4264
- msgid "BackWPup News"
4265
- msgstr "BackWPup Neuigkeiten"
4266
-
4267
- # @ backwpup
4268
- #: ../inc/class-page-backwpup.php:128
4269
- msgctxt "BackWPup News RSS Feed URL"
4270
- msgid "http://marketpress.com/news/plugins/backwpup/feed/"
4271
- msgstr "http://marketpress.de/news/plugins/backwpup/feed/"
4272
-
4273
- # @ backwpup
4274
- #: ../inc/class-page-backwpup.php:133
4275
- #, php-format
4276
- msgid "<strong>RSS Error</strong>: %s"
4277
- msgstr "<strong>RSS Fehler</strong>: %s"
4278
-
4279
- # @ backwpup
4280
- #: ../inc/class-page-backwpup.php:138
4281
- msgid "An error has occurred, which probably means the feed is down. Try again later."
4282
- msgstr "Ein Fehler ist aufgetreten, der wahrscheinlich bedeutet, das der Feed Offline ist. Versuchen Sie es später erneut."
4283
-
4284
- # @ backwpup
4285
- #: ../inc/class-page-backwpup.php:153
4286
- msgid "Untitled"
4287
- msgstr "Ohne Titel"
4288
-
4289
- # @ backwpup
4290
- #: ../inc/class-page-backwpup.php:216
4291
- msgid "Start wizard"
4292
- msgstr "Assistenten starten"
4293
-
4294
- # @ backwpup
4295
- #: ../inc/class-page-backwpup.php:232
4296
- msgctxt "Pro teaser box"
4297
- msgid "Thank you for using BackWPup!"
4298
- msgstr "Danke, dass du BackWPup benutzt!"
4299
-
4300
- # @ backwpup
4301
- #: ../inc/class-page-backwpup.php:235
4302
- msgctxt "Pro teaser box"
4303
- msgid "Get access to:"
4304
- msgstr "Erhalte Zugang zu:"
4305
-
4306
- # @ backwpup
4307
- #: ../inc/class-page-backwpup.php:237
4308
- msgctxt "Pro teaser box"
4309
- msgid "First-class <strong>dedicated support</strong> at MarketPress Helpdesk."
4310
- msgstr "Erstklassigem <strong>persönlichen Support</strong> im Helpdesk bei MarketPress."
4311
-
4312
- # @ backwpup
4313
- #: ../inc/class-page-backwpup.php:238
4314
- msgctxt "Pro teaser box"
4315
- msgid "Differential backups to Google Drive and other cloud storage service."
4316
- msgstr "Differenzielle Backups zu Google Drive anderen Cloud-Storage-Diensten."
4317
-
4318
- # @ backwpup
4319
- #: ../inc/class-page-backwpup.php:239
4320
- msgctxt "Pro teaser box"
4321
- msgid "Easy-peasy wizards to create and schedule backup jobs."
4322
- msgstr "Kinderleichte Assistenten zum Erstellen und Planen von Backup-Aufträgen."
4323
-
4324
- # @ backwpup
4325
- #: ../inc/class-page-backwpup.php:240
4326
- msgctxt "Pro teaser box, link text"
4327
- msgid "And more…"
4328
- msgstr "Und mehr…"
4329
-
4330
- # @ backwpup
4331
- #: ../inc/class-page-backwpup.php:242
4332
- msgctxt "Pro teaser box, link title"
4333
- msgid "Get BackWPup Pro now"
4334
- msgstr "Wechsle jetzt zu BackWPup Pro"
4335
-
4336
- # @ backwpup
4337
- #: ../inc/class-page-backwpup.php:242
4338
- msgctxt "Pro teaser box, link text"
4339
- msgid "Get BackWPup Pro now"
4340
- msgstr "Wechsle jetzt zu BackWPup Pro"
4341
-
4342
- # @ backwpup
4343
- #: ../inc/class-page-backwpup.php:260
4344
- msgid "Last logs"
4345
- msgstr "Letzte Logs"
4346
-
4347
- # @ backwpup
4348
- #: ../inc/class-page-backwpup.php:262
4349
- msgid "Result"
4350
- msgstr "Ergebnis"
4351
-
4352
- # @ backwpup
4353
- #: ../inc/class-page-backwpup.php:292
4354
- #, php-format
4355
- msgid "%d ERROR"
4356
- msgid_plural "%d ERRORS"
4357
- msgstr[0] "%d FEHLER"
4358
- msgstr[1] "%d FEHLER"
4359
-
4360
- # @ backwpup
4361
- #: ../inc/class-page-backwpup.php:294
4362
- #, php-format
4363
- msgid "%d WARNING"
4364
- msgid_plural "%d WARNINGS"
4365
- msgstr[0] "%d WARNUNG"
4366
- msgstr[1] "%d WARNUNGEN"
4367
-
4368
- # @ backwpup
4369
- #: ../inc/class-page-backwpup.php:296
4370
- msgid "OK"
4371
- msgstr "OK"
4372
-
4373
- # @ backwpup
4374
- #: ../inc/class-page-backwpup.php:320
4375
- msgid "Next scheduled jobs"
4376
- msgstr "Nächste geplante Aufträge"
4377
-
4378
- # @ backwpup
4379
- #: ../inc/class-page-backwpup.php:347
4380
- #, php-format
4381
- msgid "working since %d seconds"
4382
- msgstr "in Arbeit seit %d Sek."
4383
-
4384
- # @ backwpup
4385
- #: ../inc/class-page-backwpup.php:365
4386
- msgid "Edit Job"
4387
- msgstr "Auftrag bearbeiten"
4388
-
4389
- # @ backwpup
4390
- #: ../inc/class-destination-email.php:38
4391
- #: ../inc/class-destination-email.php:41
4392
- msgid "Email address"
4393
- msgstr "E-Mail-Adresse"
4394
-
4395
- # @ backwpup
4396
- #: ../inc/class-destination-email.php:48
4397
- #: ../inc/class-destination-email.php:50
4398
- msgid "Send test email"
4399
- msgstr "Test-E-Mail senden"
4400
-
4401
- # @ backwpup
4402
- #: ../inc/class-destination-email.php:55
4403
- msgid "Send email settings"
4404
- msgstr "Absende-Einstellungen für E-Mails"
4405
-
4406
- # @ backwpup
4407
- #: ../inc/class-destination-email.php:58
4408
- msgid "Maximum file size"
4409
- msgstr "Maximale Dateigröße"
4410
-
4411
- # @ backwpup
4412
- #: ../inc/class-destination-email.php:59
4413
- msgid "MB"
4414
- msgstr "MB"
4415
-
4416
- # @ backwpup
4417
- #: ../inc/class-destination-email.php:63
4418
- msgid "Sender email address"
4419
- msgstr "E-Mail-Adresse des Absenders"
4420
-
4421
- # @ backwpup
4422
- #: ../inc/class-destination-email.php:70
4423
- msgid "Sender name"
4424
- msgstr "Absender NAme"
4425
-
4426
- # @ backwpup
4427
- #: ../inc/class-destination-email.php:77
4428
- msgid "Sending method"
4429
- msgstr "E-Mail-Versandmethode"
4430
-
4431
- # @ backwpup
4432
- #: ../inc/class-destination-email.php:81
4433
- msgid "Use site settings"
4434
- msgstr "Verwende Blogeinstellungen"
4435
-
4436
- # @ backwpup
4437
- #: ../inc/class-destination-email.php:82
4438
- msgid "PHP: mail()"
4439
- msgstr "PHP: mail()"
4440
-
4441
- # @ backwpup
4442
- #: ../inc/class-destination-email.php:83
4443
- msgid "Sendmail"
4444
- msgstr "Sendmail"
4445
-
4446
- # @ backwpup
4447
- #: ../inc/class-destination-email.php:84
4448
- msgid "SMTP"
4449
- msgstr "SMTP"
4450
-
4451
- # @ backwpup
4452
- #: ../inc/class-destination-email.php:91
4453
- msgid "Sendmail path"
4454
- msgstr "Sendmail Pfad"
4455
-
4456
- # @ backwpup
4457
- #: ../inc/class-destination-email.php:99
4458
- msgid "SMTP host name"
4459
- msgstr "SMTP Hostname"
4460
-
4461
- # @ backwpup
4462
- #: ../inc/class-destination-email.php:110
4463
- msgid "SMTP secure connection"
4464
- msgstr "SMTP Sichere Verbindung"
4465
-
4466
- # @ backwpup
4467
- #: ../inc/class-destination-email.php:115
4468
- msgid "SSL"
4469
- msgstr "SSL"
4470
-
4471
- # @ backwpup
4472
- #: ../inc/class-destination-email.php:116
4473
- msgid "TLS"
4474
- msgstr "TLS"
4475
-
4476
- # @ backwpup
4477
- #: ../inc/class-destination-email.php:121
4478
- msgid "SMTP username"
4479
- msgstr "SMTP Benutzername"
4480
-
4481
- # @ backwpup
4482
- #: ../inc/class-destination-email.php:128
4483
- msgid "SMTP password"
4484
- msgstr "SMTP Passwort"
4485
-
4486
- # @ backwpup
4487
- #: ../inc/class-destination-email.php:204
4488
- #, php-format
4489
- msgid "%d. Try to send backup with email&#160;&hellip;"
4490
- msgstr "%d. Versuche, Backup als E-Mail zu senden&#160;&hellip;"
4491
-
4492
- # @ backwpup
4493
- #: ../inc/class-destination-email.php:209
4494
- msgid "Backup archive too big to be sent by email!"
4495
- msgstr "Das Backup Archiv ist zu groß zum Senden via E-Mail!"
4496
-
4497
- # @ backwpup
4498
- #: ../inc/class-destination-email.php:216
4499
- #, php-format
4500
- msgid "Sending email to %s&hellip;"
4501
- msgstr "Sende E-Mail an %s&hellip;"
4502
-
4503
- # @ backwpup
4504
- #: ../inc/class-destination-email.php:292
4505
- #, php-format
4506
- msgid "BackWPup archive from %1$s: %2$s"
4507
- msgstr "BackWPup-Archiv vom %1$s: %2$s"
4508
-
4509
- # @ backwpup
4510
- #: ../inc/class-destination-email.php:295
4511
- #, php-format
4512
- msgid "Backup archive: %s"
4513
- msgstr "Backup Archiv: %s"
4514
-
4515
- # @ backwpup
4516
- #: ../inc/class-destination-email.php:309
4517
- #: ../inc/class-destination-email.php:431
4518
- msgid "Error while sending email!"
4519
- msgstr "Fehler beim Senden der E-Mail"
4520
-
4521
- # @ backwpup
4522
- #: ../inc/class-destination-email.php:315
4523
- #: ../inc/class-destination-email.php:433
4524
- msgid "Email sent."
4525
- msgstr "E-Mail gesendet."
4526
-
4527
- # @ backwpup
4528
- #: ../inc/class-destination-email.php:415
4529
- msgid "BackWPup archive sending TEST Message"
4530
- msgstr "BackWPup Archiv TEST Nachricht senden"
4531
-
4532
- # @ backwpup
4533
- #: ../inc/class-destination-email.php:418
4534
- msgid "If this message reaches your inbox, sending backup archives via email should work for you."
4535
- msgstr "Wenn dich diese Nachricht erreicht, funktioniert das Senden der Sicherungsarchive per E-Mail."
4536
-
4537
- # @ backwpup
4538
- #: ../inc/pro/class-settings-apikeys.php:42
4539
- msgid "Hash key"
4540
- msgstr "Hash key"
4541
-
4542
- # @ backwpup
4543
- #: ../inc/pro/class-settings-apikeys.php:43
4544
- msgid "Hash Key for BackWPup. It will be used to have hashes in folder and file names. It must at least 6 chars long."
4545
- msgstr "Hash Key für BackWPup. Es wird für Hashes in Ordner- und Dateinamen verwendet und muss mindestens 6 Zeichen lang sein."
4546
-
4547
- # @ backwpup
4548
- #: ../inc/pro/class-settings-apikeys.php:46
4549
- msgid "Hash key:"
4550
- msgstr "Hash key:"
4551
-
4552
- # @ backwpup
4553
- #: ../inc/pro/class-settings-apikeys.php:59
4554
- msgid "Dropbox API Keys"
4555
- msgstr "Dropbox API Keys"
4556
-
4557
- # @ backwpup
4558
- #: ../inc/pro/class-settings-apikeys.php:60
4559
- msgid "If you want to set your own Dropbox API Keys, you can do it here. Leave empty for default."
4560
- msgstr "Wenn du deinen eigenen Dropbox API Schlüssel setzen willst, kannst du es hier tun. Lass es leer für Standard-Einstellungen."
4561
-
4562
- # @ backwpup
4563
- #: ../inc/pro/class-settings-apikeys.php:63
4564
- msgid "Full Dropbox App key:"
4565
- msgstr "Voller Dropbox app Key"
4566
-
4567
- # @ backwpup
4568
- #: ../inc/pro/class-settings-apikeys.php:71
4569
- msgid "Full Dropbox App secret:"
4570
- msgstr "Voller Dropbox App secret:"
4571
-
4572
- # @ backwpup
4573
- #: ../inc/pro/class-settings-apikeys.php:79
4574
- msgid "Sandbox App key:"
4575
- msgstr "Sandbox App key:"
4576
-
4577
- # @ backwpup
4578
- #: ../inc/pro/class-settings-apikeys.php:87
4579
- msgid "Sandbox App secret:"
4580
- msgstr "Sandbox App secret:"
4581
-
4582
- # @ backwpup
4583
- #: ../inc/pro/class-settings-apikeys.php:100
4584
- msgid "SugarSync API Keys"
4585
- msgstr "SugarSync API Keys"
4586
-
4587
- # @ backwpup
4588
- #: ../inc/pro/class-settings-apikeys.php:101
4589
- msgid "If you want to set your own SugarSync API keys you can do that here. Leave empty for default."
4590
- msgstr "Wenn du deinen eigenen SugarSync API Schlüssel setzen willst, kannst du es hier tun. Lass es leer für Standard-Einstellungen."
4591
-
4592
- # @ backwpup
4593
- #: ../inc/pro/class-settings-apikeys.php:104
4594
- msgid "Access Key ID:"
4595
- msgstr "Access Key ID (Zugangsschl&uuml;ssel-ID):"
4596
-
4597
- # @ backwpup
4598
- #: ../inc/pro/class-settings-apikeys.php:112
4599
- msgid "Private Access Key:"
4600
- msgstr "Private Access Key:"
4601
-
4602
- # @ backwpup
4603
- #: ../inc/pro/class-settings-apikeys.php:119
4604
- msgid "App ID:"
4605
- msgstr "App ID:"
4606
-
4607
- # @ backwpup
4608
- #: ../inc/pro/class-settings-apikeys.php:132
4609
- msgid "Google API Keys"
4610
- msgstr "Google API Keys"
4611
-
4612
- # @ backwpup
4613
- #: ../inc/pro/class-settings-apikeys.php:136
4614
- msgid "Client ID:"
4615
- msgstr "Client ID:"
4616
-
4617
- # @ backwpup
4618
- #: ../inc/pro/class-settings-apikeys.php:144
4619
- msgid "Client secret:"
4620
- msgstr "Client secret:"
4621
-
4622
- # @ backwpup
4623
- #: ../inc/pro/class-settings-apikeys.php:151
4624
- msgid "Redirect URIs:"
4625
- msgstr "Redirect URIs:"
4626
-
4627
- # @ backwpup
4628
- #: ../inc/pro/class-settings-apikeys.php:155
4629
- msgid "Add this URI in a new line to the field."
4630
- msgstr "Füge diese URI in einer neuen Zeile zum Feld hinzu."
4631
-
4632
- # @ backwpup
4633
- #: ../inc/pro/class-destination-folder.php:18
4634
- msgid "Absolute path to folder for backup files:"
4635
- msgstr "Absoluter Ordner-Pfad für Backup-Dateien:"
4636
-
4637
- # @ backwpup
4638
- #: ../inc/pro/class-destination-folder.php:72
4639
- #, php-format
4640
- msgid "%d. Try to sync files to folder&#160;&hellip;"
4641
- msgstr "%d. Versuche Dateien mit Ordner zu synchronisieren&#160;&hellip;"
4642
-
4643
- # @ backwpup
4644
- #: ../inc/pro/class-destination-folder.php:76
4645
- msgid "Retrieving file list from folder"
4646
- msgstr "Ruft Datei-Liste vom Ordner ab"
4647
-
4648
- # @ backwpup
4649
- #: ../inc/pro/class-destination-folder.php:82
4650
- msgid "Copy changed files to folder"
4651
- msgstr "Kopiere geänderte Dateien in den Ordner"
4652
-
4653
- # @ backwpup
4654
- #: ../inc/pro/class-destination-folder.php:95
4655
- #, php-format
4656
- msgid "File %s copied"
4657
- msgstr "Datei %s kopiert"
4658
-
4659
- # @ backwpup
4660
- #: ../inc/pro/class-destination-folder.php:108
4661
- msgid "Delete not existing files from folder"
4662
- msgstr "Lösche nicht existierende Dateien aus dem Ordner"
4663
-
4664
- # @ backwpup
4665
- #: ../inc/pro/class-destination-folder.php:116
4666
- #, php-format
4667
- msgid "Extra file %s copied"
4668
- msgstr "Extra Datei %s kopiert"
4669
-
4670
- # @ backwpup
4671
- #: ../inc/pro/class-destination-folder.php:129
4672
- #, php-format
4673
- msgid "File %s deleted from folder"
4674
- msgstr "File %s aus Ordner gelöscht"
4675
-
4676
- # @ backwpup
4677
- #: ../inc/pro/class-destination-folder.php:186
4678
- #, php-format
4679
- msgid "Empty folder %s deleted"
4680
- msgstr "Leerer Ordner %s gelöscht"
4681
-
4682
- # @ backwpup
4683
- #: ../inc/pro/class-wizard-jobimport.php:14
4684
- msgid "XML job import"
4685
- msgstr "XML Auftrag Import"
4686
-
4687
- # @ backwpup
4688
- #: ../inc/pro/class-wizard-jobimport.php:15
4689
- msgid "Wizard for importing BackWPup jobs from an XML file"
4690
- msgstr "Assistent zum Importieren von BackWPup Aufträgen aus einer XML Datei"
4691
-
4692
- # @ backwpup
4693
- #: ../inc/pro/class-wizard-jobimport.php:32
4694
- #: ../inc/pro/class-wizard-jobimport.php:93
4695
- msgid "Import"
4696
- msgstr "Import"
4697
-
4698
- # @ backwpup
4699
- #: ../inc/pro/class-wizard-jobimport.php:41
4700
- msgid "Import File"
4701
- msgstr "Import-Datei"
4702
-
4703
- # @ backwpup
4704
- #: ../inc/pro/class-wizard-jobimport.php:41
4705
- msgid "Upload XML job file for import"
4706
- msgstr "XML Arbeitsauftrag Datei hochladen zum Importieren"
4707
-
4708
- # @ backwpup
4709
- #: ../inc/pro/class-wizard-jobimport.php:42
4710
- msgid "Select items to import"
4711
- msgstr "Wähle ein Item für den Import"
4712
-
4713
- # @ backwpup
4714
- #: ../inc/pro/class-wizard-jobimport.php:42
4715
- msgid "Select which job should be imported or overwritten."
4716
- msgstr "Wähle einen Auftrag, der importiert oder überschrieben werden soll."
4717
-
4718
- # @ backwpup
4719
- #: ../inc/pro/class-wizard-jobimport.php:62
4720
- msgid "Please upload your BackWPup job XML export file and we&#8217;ll import the jobs into BackWPup."
4721
- msgstr "Bitte lade deine BackWPup-Auftrags-XML-Export-Datei hoch und wir importieren sie in BackWPup."
4722
-
4723
- # @ backwpup
4724
- #: ../inc/pro/class-wizard-jobimport.php:64
4725
- msgid "Choose a file from your computer:"
4726
- msgstr "Wähle eine Datei von deinem Computer:"
4727
-
4728
- # @ backwpup
4729
- #: ../inc/pro/class-wizard-jobimport.php:64
4730
- #, php-format
4731
- msgid "Maximum size: %s"
4732
- msgstr "Maximale Größe: %s"
4733
-
4734
- # @ backwpup
4735
- #: ../inc/pro/class-wizard-jobimport.php:86
4736
- msgid "Import Jobs"
4737
- msgstr "Importiere Aufträge"
4738
-
4739
- # @ backwpup
4740
- #: ../inc/pro/class-wizard-jobimport.php:89
4741
- msgid "Import Type"
4742
- msgstr "Import-Typ"
4743
-
4744
- # @ backwpup
4745
- #: ../inc/pro/class-wizard-jobimport.php:89
4746
- msgid "No Import"
4747
- msgstr "Kein Import"
4748
-
4749
- # @ backwpup
4750
- #: ../inc/pro/class-wizard-jobimport.php:91
4751
- msgid "Overwrite"
4752
- msgstr "&Uuml;berschreiben"
4753
-
4754
- # @ backwpup
4755
- #: ../inc/pro/class-wizard-jobimport.php:91
4756
- msgid "Append"
4757
- msgstr "Anh&auml;ngen"
4758
-
4759
- # @ backwpup
4760
- #: ../inc/pro/class-wizard-jobimport.php:105
4761
- msgid "Import Config"
4762
- msgstr "Konfiguration importieren"
4763
-
4764
- # @ backwpup
4765
- #: ../inc/pro/class-wizard-jobimport.php:108
4766
- msgid "Import BackWPup configuration"
4767
- msgstr "Importiere BackWPup Konfiguration"
4768
-
4769
- # @ backwpup
4770
- #: ../inc/pro/class-wizard-jobimport.php:129
4771
- msgid "File is empty. Please upload something more substantial. This error could also caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini."
4772
- msgstr "Datei ist leer. Bitte lade etwas mit Substanz hoch. Dieser Fehler kann begründet sein weil uploads in der php.ini oder durch post_max_size kleiner definiert sind als upload_max_filesize in php.ini."
4773
-
4774
- # @ backwpup
4775
- #: ../inc/pro/class-wizard-jobimport.php:144
4776
- #, php-format
4777
- msgid "The export file could not be found at <code>%s</code>. This is likely due to an issue with permissions."
4778
- msgstr "Die Export-Datei konnte nicht gefunden werden <code>%s</code>. Das liegt möglicherweise an Problemen mit der Berechtigung."
4779
-
4780
- # @ backwpup
4781
- #: ../inc/pro/class-wizard-jobimport.php:151
4782
- msgid "Sorry, there has been a phrase error."
4783
- msgstr "Sorry, es gab ein Problem mit dem Begriff."
4784
-
4785
- # @ backwpup
4786
- #: ../inc/pro/class-wizard-jobimport.php:158
4787
- #, php-format
4788
- msgid "This Export file (version %s) may not be supported by this version of the importer."
4789
- msgstr "Die Export Datei (version %s) wird wahrscheinlich nicht von dieser Version des Importers unterstützt"
4790
-
4791
- # @ backwpup
4792
- #: ../inc/pro/class-wizard-jobimport.php:164
4793
- msgid "This is not a BackWPup XML file"
4794
- msgstr "Das ist keine BackWPup XML Datei"
4795
-
4796
- # @ backwpup
4797
- #: ../inc/pro/class-wizard-jobimport.php:225
4798
- #, php-format
4799
- msgid "Job %1$s with id %2$d imported"
4800
- msgstr "Job %1$s mit ID %2$d wurde importiert"
4801
-
4802
- # @ backwpup
4803
- #: ../inc/pro/class-wizard-jobimport.php:233
4804
- msgid "BackWPup config imported"
4805
- msgstr "BackWPup Konfiguration wurde importiert"
4806
-
4807
- # @ backwpup
4808
- #: ../inc/pro/class-wizard-systemtest.php:14
4809
- msgid "System Test"
4810
- msgstr "System Test"
4811
-
4812
- # @ backwpup
4813
- #: ../inc/pro/class-wizard-systemtest.php:15
4814
- msgid "Wizard to test if BackWPup can work properly"
4815
- msgstr "Dieser Assistent testet, ob BackWPup problemlos arbeiten kann."
4816
-
4817
- # @ backwpup
4818
- #: ../inc/pro/class-wizard-systemtest.php:32
4819
- msgid "Run tests"
4820
- msgstr "Starte die Tests"
4821
-
4822
- # @ backwpup
4823
- #: ../inc/pro/class-wizard-systemtest.php:41
4824
- msgid "Environment"
4825
- msgstr "Voraussetzungen"
4826
-
4827
- # @ backwpup
4828
- #: ../inc/pro/class-wizard-systemtest.php:41
4829
- msgid "System Environment"
4830
- msgstr "System Voraussetzungen"
4831
-
4832
- # @ backwpup
4833
- #: ../inc/pro/class-wizard-systemtest.php:54
4834
- msgid "Test if BackWPup can work without problems."
4835
- msgstr "Teste, ob BackWPup problemlos funktioniert."
4836
-
4837
- # @ backwpup
4838
- #: ../inc/pro/class-wizard-systemtest.php:86
4839
- #, php-format
4840
- msgid "You must run WordPress version 3.4 or higher to use this plugin. You are using version %s now."
4841
- msgstr "Um dieses Plugin nutzen zu können, benötigst du mindestens WordPress 3.4, du verwendest derzeit die Version %s."
4842
-
4843
- # @ backwpup
4844
- #: ../inc/pro/class-wizard-systemtest.php:91
4845
- #, php-format
4846
- msgid "You must run PHP version 5.2.6 or higher to use this plugin. You are using version %s now."
4847
- msgstr "Es wird die PHP Version 5.2.6 oder höher benötigt um dieses Plugin nutzen zu können. Du benutzt Version %s."
4848
-
4849
- # @ backwpup
4850
- #: ../inc/pro/class-wizard-systemtest.php:95
4851
- #, php-format
4852
- msgid "We recommend to run a PHP version above 5.3.2 to get the full plugin functionality. You are using version %s now."
4853
- msgstr "Wir empfehlen eine PHP Version von 5.3.2 oder höher um die volle Funktionalität des Plugins nutzen zu können. Du nutzt Version %s."
4854
-
4855
- # @ backwpup
4856
- #: ../inc/pro/class-wizard-systemtest.php:100
4857
- #, php-format
4858
- msgid "You must have the MySQLi extension installed and a MySQL server version of 5.0.7 or higher to use this plugin. You are using version %s now."
4859
- msgstr "Um dieses Plugin nutzen zu können, muss die MySQLi Erweiterung und der MySQL Server der Version 5.0.7 oder höher vorhanden sein. Du nutzt Version %s."
4860
-
4861
- # @ backwpup
4862
- #: ../inc/pro/class-wizard-systemtest.php:105
4863
- msgid "PHP cURL extension must be installed to use the full plugin functionality."
4864
- msgstr "Die cURL-Erweiterung für PHP muss installiert sein, um das Plugin im Vollem Umfang zu nutzen."
4865
-
4866
- # @ backwpup
4867
- #: ../inc/pro/class-wizard-systemtest.php:110
4868
- #, php-format
4869
- msgctxt "%1 = extension name, %2 = file suffix"
4870
- msgid "We recommend to install the %1$s extension to generate %2$s archives."
4871
- msgstr "Wir empfehlen die %1$s Erweiterung um %2$s Archive zu generieren."
4872
-
4873
- # @ backwpup
4874
- #: ../inc/pro/class-wizard-systemtest.php:133
4875
- #, php-format
4876
- msgctxt "Link to PHP manual"
4877
- msgid "Please disable the deprecated <a href=\"%s\">PHP safe mode</a>."
4878
- msgstr "Bitte schalte den veralteten <a href=\"%s\">PHP Safe-Mode</a>."
4879
-
4880
- # @ backwpup
4881
- #: ../inc/pro/class-wizard-systemtest.php:141
4882
- msgid "We recommend to install the PHP FTP extension to use the FTP backup destination."
4883
- msgstr "Wir empfehlen die PHP FTP Erweiterung zu installieren um FTP als Backup-Ziel nutzen zu können."
4884
-
4885
- # @ backwpup
4886
- #: ../inc/pro/class-wizard-systemtest.php:149
4887
- #, php-format
4888
- msgid "Temp folder %s is not read or writable. Please set proper writing permissions."
4889
- msgstr "Temporärer Ordner %s ist weder lesbar noch beschreibbar. Bitte setze passende Berechtigungen."
4890
-
4891
- # @ backwpup
4892
- #: ../inc/pro/class-wizard-systemtest.php:154
4893
- #, php-format
4894
- msgid "Temp folder %s does not exist and cannot be created. Please create it and set proper writing permissions."
4895
- msgstr "Temporärer Ordner %s existiert nicht oder kann nicht erstellt werden. Bitte erstelle ihn und setze passende Berechtigungen."
4896
-
4897
- # @ backwpup
4898
- #: ../inc/pro/class-wizard-systemtest.php:161
4899
- #, php-format
4900
- msgid "Log folder %s is not readable or writable. Please set proper writing permissions."
4901
- msgstr "Log-Ordner %s ist weder lesbar noch beschreibbar. Bitte setze passende Berechtigungen."
4902
-
4903
- # @ backwpup
4904
- #: ../inc/pro/class-wizard-systemtest.php:165
4905
- #, php-format
4906
- msgid "Log folder %s does not exist and cannot be created. Please create it and set proper writing permissions."
4907
- msgstr "Log-Ordner %s existiert nicht oder kann nicht erstellt werden. Bitte erstelle ihn und setze passende Berechtigungen."
4908
-
4909
- # @ backwpup
4910
- #: ../inc/pro/class-wizard-systemtest.php:171
4911
- #, php-format
4912
- msgid "The HTTP response test result is an error: \"%s\"."
4913
- msgstr "Das Ergebnis des HTTP-Response-Tests ist ein Fehler: \"%s\"."
4914
-
4915
- # @ backwpup
4916
- #: ../inc/pro/class-wizard-systemtest.php:175
4917
- #, php-format
4918
- msgid "The HTTP response test result is a wrong HTTP status: %s. It should be status 200."
4919
- msgstr "Der HTTP-Response-Test hat einen falschen HTTP-Status ergeben: %s. Es sollte Status 200 sein."
4920
-
4921
- # @ backwpup
4922
- #: ../inc/pro/class-wizard-systemtest.php:193
4923
- msgid "WP-Cron seems to be broken. But it is needed to run scheduled jobs."
4924
- msgstr "WP-Cron scheint beschädigt zu sein. Aber es wird benötigt um Aufträge planmäßig ausführen zu können."
4925
-
4926
- # @ backwpup
4927
- #: ../inc/pro/class-wizard-systemtest.php:198
4928
- msgid "All tests passed without errors."
4929
- msgstr "Alle Tests fehlerfrei bestanden."
4930
-
4931
- # @ backwpup
4932
- #: ../inc/pro/class-wizard-systemtest.php:201
4933
- msgid "There is no error, but some warnings. BackWPup will work, but with limitations."
4934
- msgstr "Keine Fehler, nur Warnungen. BackWPup funktioniert mit Einschränkungen."
4935
-
4936
- # @ backwpup
4937
- #: ../inc/pro/class-wizard-systemtest.php:204
4938
- msgid "There are errors. Please correct them, or BackWPup cannot work."
4939
- msgstr "Es sind Fehler aufgetreten. Bitte behebe sie, damit BackWPup ordnungsgemäß funktioniert."
4940
-
4941
- # @ backwpup
4942
- #: ../inc/pro/class-destination-s3.php:17
4943
- #: ../inc/pro/class-destination-s3-v1.php:17
4944
- msgid "Select a S3 service:"
4945
- msgstr "Wähle einen S3 Service:"
4946
-
4947
- # @ backwpup
4948
- #: ../inc/pro/class-destination-s3.php:33
4949
- #: ../inc/pro/class-destination-s3-v1.php:33
4950
- msgid "or set an S3 Server URL:"
4951
- msgstr "oder setze eine S3 Server URL:"
4952
-
4953
- # @ backwpup
4954
- #: ../inc/pro/class-destination-s3.php:36
4955
- #: ../inc/pro/class-destination-msazure.php:19
4956
- #: ../inc/pro/class-destination-s3-v1.php:36
4957
- msgid "Access Key:"
4958
- msgstr "Zugangsschl&uuml;ssel (Access Key):"
4959
-
4960
- # @ backwpup
4961
- #: ../inc/pro/class-destination-s3.php:39
4962
- #: ../inc/pro/class-destination-s3-v1.php:39
4963
- msgid "Secret Key:"
4964
- msgstr "Secret Key:"
4965
-
4966
- # @ backwpup
4967
- #: ../inc/pro/class-destination-s3.php:42
4968
- #: ../inc/pro/class-destination-s3-v1.php:42
4969
- msgid "Bucket:"
4970
- msgstr "Bucket:"
4971
-
4972
- # @ backwpup
4973
- #: ../inc/pro/class-destination-s3.php:52
4974
- #: ../inc/pro/class-destination-s3-v1.php:52
4975
- msgid "New Bucket:"
4976
- msgstr "Neues Bucket: "
4977
-
4978
- # @ backwpup
4979
- #: ../inc/pro/class-destination-s3.php:54
4980
- #: ../inc/pro/class-destination-s3-v1.php:54
4981
- msgid "Folder in bucket:"
4982
- msgstr "Ordner im Bucket:"
4983
-
4984
- # @ backwpup
4985
- #: ../inc/pro/class-destination-s3.php:154
4986
- #: ../inc/pro/class-destination-s3-v1.php:156
4987
- #, php-format
4988
- msgid "%d. Trying to sync files to S3 Service&#160;&hellip;"
4989
- msgstr "%d. Versuche Dateien mit dem S3 Service zu synchronisieren&#160;&hellip;"
4990
-
4991
- # @ backwpup
4992
- #: ../inc/pro/class-destination-s3.php:188
4993
- #: ../inc/pro/class-destination-s3-v1.php:195
4994
- msgid "Retrieving file list from S3."
4995
- msgstr "Rufe Dateiliste von S3 ab."
4996
-
4997
- # @ backwpup
4998
- #: ../inc/pro/class-destination-s3.php:246
4999
- #: ../inc/pro/class-destination-s3-v1.php:251
5000
- msgid "Upload changed files to S3."
5001
- msgstr "Upload der geänderten Dateien zu S3."
5002
-
5003
- # @ backwpup
5004
- #: ../inc/pro/class-destination-s3.php:261
5005
- #: ../inc/pro/class-destination-s3-v1.php:263
5006
- #, php-format
5007
- msgid "File %s uploaded to S3."
5008
- msgstr "Datei %s zu S3 hochgeladen."
5009
-
5010
- # @ backwpup
5011
- #: ../inc/pro/class-destination-s3.php:289
5012
- #: ../inc/pro/class-destination-s3-v1.php:288
5013
- #, php-format
5014
- msgid "Extra file %s uploaded to S3."
5015
- msgstr "Extra Datei %s zu S3 hochgeladen."
5016
-
5017
- # @ backwpup
5018
- #: ../inc/pro/class-destination-s3.php:302
5019
- #: ../inc/pro/class-destination-s3-v1.php:301
5020
- msgid "Delete nonexistent files on S3"
5021
- msgstr "Lösche nicht existierende Dateien von S3"
5022
-
5023
- # @ backwpup
5024
- #: ../inc/pro/class-destination-s3.php:309
5025
- #: ../inc/pro/class-destination-s3-v1.php:304
5026
- #, php-format
5027
- msgid "File %s deleted from S3."
5028
- msgstr "Datei %s von S3 gelöscht."
5029
-
5030
- # @ backwpup
5031
- #: ../inc/pro/class-destination-ftp.php:17
5032
- msgid "Hostname:"
5033
- msgstr "Hostname:"
5034
-
5035
- # @ backwpup
5036
- #: ../inc/pro/class-destination-ftp.php:33
5037
- msgid "Folder on server:"
5038
- msgstr "Ordner auf dem Server:"
5039
-
5040
- # @ backwpup
5041
- #: ../inc/pro/class-destination-ftp.php:39
5042
- msgid "Maximum number of backup files to keep in folder:"
5043
- msgstr "Maximale Anzahl an Backup-Dateien im Ordner:"
5044
-
5045
- # @ backwpup
5046
- #: ../inc/pro/class-destination-ftp.php:42
5047
- msgid "(Oldest files will be deleted first.)"
5048
- msgstr "(&Auml;lteste Dateien werden zuerst gel&ouml;scht.)"
5049
-
5050
- # @ backwpup
5051
- #: ../inc/pro/class-jobtype-file.php:19
5052
- msgid "Backup WordPress main files"
5053
- msgstr "Backup der Wordpress Hauptdateien"
5054
-
5055
- # @ backwpup
5056
- #: ../inc/pro/class-jobtype-file.php:23
5057
- msgid "Backup blog content folder"
5058
- msgstr "Backup des Blog-Content Ordners"
5059
-
5060
- # @ backwpup
5061
- #: ../inc/pro/class-jobtype-file.php:27
5062
- msgid "Backup blog plugins"
5063
- msgstr "Backup Blog Plugins"
5064
-
5065
- # @ backwpup
5066
- #: ../inc/pro/class-jobtype-file.php:31
5067
- msgid "Backup blog themes"
5068
- msgstr "Backup der Blog-Themes"
5069
-
5070
- # @ backwpup
5071
- #: ../inc/pro/class-jobtype-file.php:35
5072
- msgid "Backup blog uploads folder"
5073
- msgstr "Backup der Blog-Uploads Ordner"
5074
-
5075
- # @ backwpup
5076
- #: ../inc/pro/class-wizard-job.php:15
5077
- msgid "Create a job"
5078
- msgstr "Job erstellen"
5079
-
5080
- # @ backwpup
5081
- #: ../inc/pro/class-wizard-job.php:16
5082
- msgid "Choose a job"
5083
- msgstr "Job auswählen"
5084
-
5085
- # @ backwpup
5086
- #: ../inc/pro/class-wizard-job.php:37
5087
- msgid "Job Types"
5088
- msgstr "Arbeitsauftrag Typen"
5089
-
5090
- # @ backwpup
5091
- #: ../inc/pro/class-wizard-job.php:37
5092
- msgid "Select a task for your job."
5093
- msgstr "Wähle eine Aufgabe für deinen Auftrag."
5094
-
5095
- # @ backwpup
5096
- #: ../inc/pro/class-wizard-job.php:51
5097
- msgid "Archive Settings"
5098
- msgstr "Archiv Einstellungen"
5099
-
5100
- # @ backwpup
5101
- #: ../inc/pro/class-wizard-job.php:51
5102
- msgid "Settings for the Backup Archive"
5103
- msgstr "Einstellungen für das Backup Archiv"
5104
-
5105
- # @ backwpup
5106
- #: ../inc/pro/class-wizard-job.php:53
5107
- msgid "Where would you like to store the backup file?"
5108
- msgstr "Wo wollen Sie die Backup-Datei speichern?"
5109
-
5110
- # @ backwpup
5111
- #: ../inc/pro/class-wizard-job.php:63
5112
- #: ../inc/pro/class-wizard-job.php:272
5113
- msgid "Scheduling"
5114
- msgstr "Planung"
5115
-
5116
- # @ backwpup
5117
- #: ../inc/pro/class-wizard-job.php:63
5118
- msgid "When would you like to start the job?"
5119
- msgstr "Wann soll der Auftrag gestartet werden?"
5120
-
5121
- # @ backwpup
5122
- #: ../inc/pro/class-wizard-job.php:218
5123
- msgid "Select one or more tasks for your backup job."
5124
- msgstr "Wähle eine zusätzliche Aufgabe für deinen Backup-Auftrag."
5125
-
5126
- # @ backwpup
5127
- #: ../inc/pro/class-wizard-job.php:273
5128
- msgid "Activate scheduling"
5129
- msgstr "Aktive Planung"
5130
-
5131
- # @ backwpup
5132
- #: ../inc/pro/class-wizard-job.php:365
5133
- msgid "Sync file by file to destination"
5134
- msgstr "Synchronisiere Datei für Datei zum Zielverzeichnis"
5135
-
5136
- # @ backwpup
5137
- #: ../inc/pro/class-wizard-job.php:376
5138
- msgid "Select a compression type for the backup archive"
5139
- msgstr "Wähle einen Kompressions-Typ für das Backup Archiv"
5140
-
5141
- # @ backwpup
5142
- #: ../inc/pro/class-wizard-job.php:379
5143
- msgid "Archive compression type"
5144
- msgstr "Archiv Kompressions-Typ"
5145
-
5146
- # @ backwpup
5147
- #: ../inc/pro/class-wizard-job.php:411
5148
- msgid "Where to store the files"
5149
- msgstr "Wo die Dateien abgelegt werden"
5150
-
5151
- # @ backwpup
5152
- #: ../inc/pro/class-wizard-job.php:586
5153
- #, php-format
5154
- msgid "Wizard: %1$s"
5155
- msgstr "Assistent: %1$s"
5156
-
5157
- # @ backwpup
5158
- #: ../inc/pro/class-wizard-job.php:605
5159
- #, php-format
5160
- msgid "New job %s generated."
5161
- msgstr "Neuer Auftrag %s erstellt."
5162
-
5163
- # @ backwpup
5164
- #: ../inc/pro/class-wizard-job.php:617
5165
- msgid "Create Job"
5166
- msgstr "Erstelle Auftrag"
5167
-
5168
- # @ backwpup
5169
- #: ../inc/pro/class-wizard-job.php:642
5170
- #: ../inc/pro/class-wizard-job.php:643
5171
- msgid "Database Backup and XML Export (Daily)"
5172
- msgstr "DB Sicherung & XML Export (täglich)"
5173
-
5174
- # @ backwpup
5175
- #: ../inc/pro/class-wizard-job.php:660
5176
- #: ../inc/pro/class-wizard-job.php:661
5177
- msgid "Database Check (Weekly)"
5178
- msgstr "Datenbank Überprüfung (wöchentlich)"
5179
-
5180
- # @ backwpup
5181
- #: ../inc/pro/class-wizard-job.php:685
5182
- #: ../inc/pro/class-wizard-job.php:686
5183
- msgid "Backup all files"
5184
- msgstr "Sicherung aller Dateien"
5185
-
5186
- # @ backwpup
5187
- #: ../inc/pro/class-wizard-job.php:700
5188
- msgid "Essential files + list of plugins"
5189
- msgstr "Wichtige Dateien + Pluginliste"
5190
-
5191
- # @ backwpup
5192
- #: ../inc/pro/class-wizard-job.php:701
5193
- msgid "Backup essential files and folders, plus a list of installed plugins."
5194
- msgstr "Backup von wichtigen Dateien und Ordner, plus einer Liste von installierten Plugins."
5195
-
5196
- # @ backwpup
5197
- #: ../inc/pro/class-wizard-job.php:716
5198
- #: ../inc/pro/class-wizard-job.php:717
5199
- msgid "Custom configuration"
5200
- msgstr "Angepasste Konfiguration"
5201
-
5202
- # @ backwpup
5203
- #: ../inc/pro/class-pro.php:102
5204
- msgid "Glacier"
5205
- msgstr "Glacier"
5206
-
5207
- # @ backwpup
5208
- #: ../inc/pro/class-pro.php:121
5209
- msgid "GDrive"
5210
- msgstr "GDrive"
5211
-
5212
- # @ backwpup
5213
- #: ../inc/pro/class-pro.php:174
5214
- #: ../inc/pro/class-pro.php:210
5215
- msgid "Wizards"
5216
- msgstr "Assistenten"
5217
-
5218
- # @ backwpup
5219
- #: ../inc/pro/class-jobtype-wpexp.php:17
5220
- msgid "Items to export:"
5221
- msgstr "Zu exportierendes Item:"
5222
-
5223
- # @ backwpup
5224
- #: ../inc/pro/class-destination-msazure.php:17
5225
- msgid "Account Name:"
5226
- msgstr "Kontoname/ Benutzername:"
5227
-
5228
- # @ backwpup
5229
- #: ../inc/pro/class-destination-msazure.php:21
5230
- #: ../inc/pro/class-destination-rsc.php:38
5231
- msgid "Container:"
5232
- msgstr "Container:"
5233
-
5234
- # @ backwpup
5235
- #: ../inc/pro/class-destination-msazure.php:28
5236
- #: ../inc/pro/class-destination-rsc.php:47
5237
- msgid "Create container:"
5238
- msgstr "Container erstellen:"
5239
-
5240
- # @ backwpup
5241
- #: ../inc/pro/class-destination-msazure.php:30
5242
- #: ../inc/pro/class-destination-rsc.php:49
5243
- msgid "Folder in container:"
5244
- msgstr "Ordner im Container:"
5245
-
5246
- # @ backwpup
5247
- #: ../inc/pro/class-destination-msazure.php:100
5248
- #, php-format
5249
- msgid "%d. Trying to sync files with Microsoft Azure (Blob) &hellip;"
5250
- msgstr "%d. Versuche Dateien mit Microsoft Azure (Blob) zu synchronisieren &hellip;"
5251
-
5252
- # @ backwpup
5253
- #: ../inc/pro/class-destination-msazure.php:135
5254
- msgid "Retrieving file list from MS Azure."
5255
- msgstr "Rufe Dateiliste von MS Azure ab."
5256
-
5257
- # @ backwpup
5258
- #: ../inc/pro/class-destination-msazure.php:151
5259
- msgid "Upload changed files to MS Azure."
5260
- msgstr "Upload der geänderten Dateien zu MS Azure."
5261
-
5262
- # @ backwpup
5263
- #: ../inc/pro/class-destination-msazure.php:163
5264
- #, php-format
5265
- msgid "File %s uploaded to MS Azure."
5266
- msgstr "Datei %s zu MS Azure hochgeladen."
5267
-
5268
- # @ backwpup
5269
- #: ../inc/pro/class-destination-msazure.php:189
5270
- #, php-format
5271
- msgid "Extra file %s uploaded to MS Azure."
5272
- msgstr "Extra Datei %s zu MS Azure hochgeladen."
5273
-
5274
- # @ backwpup
5275
- #: ../inc/pro/class-destination-msazure.php:202
5276
- msgid "Delete nonexistent files on MS Azure."
5277
- msgstr "Lösche nicht existierende Dateien auf MS Azure."
5278
-
5279
- # @ backwpup
5280
- #: ../inc/pro/class-destination-msazure.php:205
5281
- #, php-format
5282
- msgid "File %s deleted from MS Azure."
5283
- msgstr "Datei %s von MS Azure gelöscht."
5284
-
5285
- # @ backwpup
5286
- #: ../inc/pro/class-destination-dropbox.php:24
5287
- msgid "Auth Code:"
5288
- msgstr "Auth Code:"
5289
-
5290
- # @ backwpup
5291
- #: ../inc/pro/class-destination-dropbox.php:27
5292
- msgid "Get auth code"
5293
- msgstr "Hole Authentifizierungscode"
5294
-
5295
- # @ backwpup
5296
- #: ../inc/pro/class-destination-dropbox.php:34
5297
- #: ../inc/pro/class-destination-gdrive.php:249
5298
- #: ../inc/pro/class-destination-gdrive.php:255
5299
- msgid "Login:"
5300
- msgstr "Anmelden:"
5301
-
5302
- # @ backwpup
5303
- #: ../inc/pro/class-destination-dropbox.php:38
5304
- #: ../inc/pro/class-destination-gdrive.php:260
5305
- msgid "Folder:"
5306
- msgstr "Ordner:"
5307
-
5308
- # @ backwpup
5309
- #: ../inc/pro/class-destination-dropbox.php:105
5310
- #, php-format
5311
- msgid "%d. Try to sync files to Dropbox&#160;&hellip;"
5312
- msgstr "%d. Versuche Dateien mit Dropbox zu synchronisieren&#160;&hellip;"
5313
-
5314
- # @ backwpup
5315
- #: ../inc/pro/class-destination-dropbox.php:138
5316
- msgid "Retrieving file list from Dropbox"
5317
- msgstr "Empfange Dateiliste von Dropbox"
5318
-
5319
- # @ backwpup
5320
- #: ../inc/pro/class-destination-dropbox.php:152
5321
- msgid "Upload changed files to Dropbox"
5322
- msgstr "Lade geänderte Datei in die Dropbox"
5323
-
5324
- # @ backwpup
5325
- #: ../inc/pro/class-destination-dropbox.php:174
5326
- #, php-format
5327
- msgid "File %s uploaded to Dropbox"
5328
- msgstr "Datei %s zu Dropbox hochgeladen"
5329
-
5330
- # @ backwpup
5331
- #: ../inc/pro/class-destination-dropbox.php:201
5332
- #, php-format
5333
- msgid "Extra file %s uploaded to Dropbox"
5334
- msgstr "Extra Datei %s zu Dropbox hochgeladen"
5335
-
5336
- # @ backwpup
5337
- #: ../inc/pro/class-destination-dropbox.php:210
5338
- msgid "Delete not existing files from Dropbox"
5339
- msgstr "Lösche nicht existierende Dateien aus Dropbox"
5340
-
5341
- # @ backwpup
5342
- #: ../inc/pro/class-destination-dropbox.php:217
5343
- #, php-format
5344
- msgid "Folder %s deleted from Dropbox"
5345
- msgstr "Ordner %s aus Dropbox gelöscht"
5346
-
5347
- # @ backwpup
5348
- #: ../inc/pro/class-destination-dropbox.php:235
5349
- #, php-format
5350
- msgid "File %s deleted from Dropbox"
5351
- msgstr "Datei %s aus Dropbox gelöscht"
5352
-
5353
- # @ backwpup
5354
- #: ../inc/pro/class-jobtype-dbdump.php:89
5355
- msgid "Backup only WordPress Database tables"
5356
- msgstr "Nur die WordPress Datenbank Tabellen sichern"
5357
-
5358
- # @ backwpup
5359
- #: ../inc/pro/class-jobtype-dbdump.php:109
5360
- msgid "Database connection"
5361
- msgstr "Datenbank Verbindung"
5362
-
5363
- # @ backwpup
5364
- #: ../inc/pro/class-jobtype-dbdump.php:113
5365
- msgid "Use WordPress database connection."
5366
- msgstr "Nutze WordPress-Datenbankverbindung"
5367
-
5368
- # @ backwpup
5369
- #: ../inc/pro/class-jobtype-dbdump.php:117
5370
- msgid "Host:"
5371
- msgstr "Host (Server):"
5372
-
5373
- # @ backwpup
5374
- #: ../inc/pro/class-jobtype-dbdump.php:120
5375
- msgid "User:"
5376
- msgstr "Benutzer: "
5377
-
5378
- # @ backwpup
5379
- #: ../inc/pro/class-jobtype-dbdump.php:127
5380
- msgid "Charset:"
5381
- msgstr "Charset: "
5382
-
5383
- # @ backwpup
5384
- #: ../inc/pro/class-jobtype-dbdump.php:138
5385
- msgid "Database:"
5386
- msgstr "Datenbank:"
5387
-
5388
- # @ backwpup
5389
- #: ../inc/pro/class-jobtype-dbdump.php:166
5390
- msgid "Database Backup type"
5391
- msgstr "Datenbank Backup Typ"
5392
-
5393
- # @ backwpup
5394
- #: ../inc/pro/class-jobtype-dbdump.php:170
5395
- msgid "SQL File (with mysqli)"
5396
- msgstr "SQL-Datei (mit mysqli)"
5397
-
5398
- # @ backwpup
5399
- #: ../inc/pro/class-jobtype-dbdump.php:171
5400
- msgid "SQL File (with mysqldump)"
5401
- msgstr "SQL-Datei (mit mysqldump)"
5402
-
5403
- # @ backwpup
5404
- #: ../inc/pro/class-jobtype-dbdump.php:172
5405
- msgid "XML File (phpMyAdmin schema)"
5406
- msgstr "XML Datei (phpMyAdmin Schema)"
5407
-
5408
- # @ backwpup
5409
- #: ../inc/pro/class-jobtype-dbdump.php:178
5410
- msgid "Path to <em>mysqldump</em> file"
5411
- msgstr "Pfad zur <em>mysqldump</em> Datei"
5412
-
5413
- # @ backwpup
5414
- #: ../inc/pro/class-jobtype-dbdump.php:555
5415
- #, php-format
5416
- msgid "Added database backup \"%1$s\" with %2$s to backup file list"
5417
- msgstr "Datenbank-Backup \"%1$s\" mit %2$s zur Backup-Datei-Liste hinzugefügt"
5418
-
5419
- # @ backwpup
5420
- #: ../inc/pro/class-jobtype-dbdump.php:576
5421
- #, php-format
5422
- msgid "%d. Try to backup MySQL system&#160;&hellip;"
5423
- msgstr "%d. Versuche, das MySQL-System zu sichern&#160;&hellip;"
5424
-
5425
- # @ backwpup
5426
- #: ../inc/pro/class-jobtype-dbdump.php:583
5427
- msgid "Executing of system commands not allowed. Please use backup with mysqli."
5428
- msgstr "Ausführung von Systembefehlen nicht erlaubt. Bitte nutze Backup mit mysqli."
5429
-
5430
- # @ backwpup
5431
- #: ../inc/pro/class-jobtype-dbdump.php:588
5432
- #, php-format
5433
- msgid "%s file not in open basedir of PHP."
5434
- msgstr "Datei %s nicht im open basedir von PHP."
5435
-
5436
- # @ backwpup
5437
- #: ../inc/pro/class-jobtype-dbdump.php:593
5438
- #, php-format
5439
- msgid "%s file not found. Please correct the path for the mysqldump file."
5440
- msgstr "Datei %s nicht gefunden. Bitte korrigiere den Pfad für die mysqldump-Datei."
5441
-
5442
- # @ backwpup
5443
- #: ../inc/pro/class-jobtype-dbdump.php:670
5444
- #, php-format
5445
- msgctxt "Executed exec() command"
5446
- msgid "CLI Exec: %s"
5447
- msgstr "CLI Exec: %s"
5448
-
5449
- # @ backwpup
5450
- #: ../inc/pro/class-jobtype-dbdump.php:676
5451
- msgid "Usage error."
5452
- msgstr "Usage-Fehler"
5453
-
5454
- # @ backwpup
5455
- #: ../inc/pro/class-jobtype-dbdump.php:677
5456
- msgid "MySQL Server Error. This could be an issue with permissions. Try using database backup with mysqli."
5457
- msgstr "Fehler des MySQL-Servers. Dies könnte ein Problem mit Berechtigungen sein. Versuche ein Datenbank mit mysqli."
5458
-
5459
- # @ backwpup
5460
- #: ../inc/pro/class-jobtype-dbdump.php:678
5461
- msgid "Error during consistency checks."
5462
- msgstr "Fehler während Konsistenzprüfung."
5463
-
5464
- # @ backwpup
5465
- #: ../inc/pro/class-jobtype-dbdump.php:679
5466
- msgid "Not enough memory."
5467
- msgstr "Nicht genug Speicher."
5468
-
5469
- # @ backwpup
5470
- #: ../inc/pro/class-jobtype-dbdump.php:680
5471
- msgid "Error during writing of SQL backup file."
5472
- msgstr "Fehler beim Schreiben der SQL-Backup-Datei."
5473
-
5474
- # @ backwpup
5475
- #: ../inc/pro/class-jobtype-dbdump.php:681
5476
- msgid "Illegal table"
5477
- msgstr "Ungültige Tabelle"
5478
-
5479
- # @ backwpup
5480
- #: ../inc/pro/class-jobtype-dbdump.php:686
5481
- #, php-format
5482
- msgid "mysqldump returned: (%d) %s"
5483
- msgstr "mysqldump hat zurückgegeben: (%d) %s"
5484
-
5485
- # @ backwpup
5486
- #: ../inc/pro/class-jobtype-dbdump.php:699
5487
- msgid "Can not create mysql backup with mysqldump command"
5488
- msgstr "Keine Datenbanksicherung mit System-Kommando mysqldump möglich"
5489
-
5490
- # @ backwpup
5491
- #: ../inc/pro/class-jobtype-dbdump.php:747
5492
- #, php-format
5493
- msgid "%d. Try to backup database as XML&#160;&hellip;"
5494
- msgstr "%d. Versuche, Datenbank als XML zu sichern&#160;&hellip;"
5495
-
5496
- # @ backwpup
5497
- #: ../inc/pro/class-jobtype-dbdump.php:800
5498
- msgid "No tables for XML backup"
5499
- msgstr "Es gibt keine Tabellen für einen XML Backup"
5500
-
5501
- # @ backwpup
5502
- #: ../inc/pro/class-jobtype-dbdump.php:837
5503
- #, php-format
5504
- msgid "Dump database create view \"%s\""
5505
- msgstr "Datenbank Backup CREATE VIEW \"%s\""
5506
-
5507
- # @ backwpup
5508
- #: ../inc/pro/class-jobtype-dbdump.php:854
5509
- #, php-format
5510
- msgid "Dump database structure \"%s\""
5511
- msgstr "Backup der Datenbank Struktur \"%s\""
5512
-
5513
- # @ backwpup
5514
- #: ../inc/pro/class-jobtype-dbdump.php:894
5515
- #, php-format
5516
- msgid "Dump table \"%s\" data"
5517
- msgstr "Backup der Tabellen Daten von \"%s\""
5518
-
5519
- # @ backwpup
5520
- #: ../inc/pro/class-jobtype-dbdump.php:963
5521
- #, php-format
5522
- msgid "Added database XML dump \"%1$s\" with %2$s to backup file list"
5523
- msgstr "XML Datenbank Backup \"%1$s\" mit %2$s zur Backup Datei Liste hinzugefügt"
5524
-
5525
- # @ backwpup
5526
- #: ../inc/pro/class-jobtype-dbdump.php:966
5527
- msgid "Database XML backup done!"
5528
- msgstr "Datenbank XML Backup erstellt!"
5529
-
5530
- # @ backwpup
5531
- #: ../inc/pro/class-destination-s3-v1.php:29
5532
- msgid "Hosteurope Cloud Storage"
5533
- msgstr "Hosteurope Cloud Storage"
5534
-
5535
- # @ backwpup
5536
- #: ../inc/pro/class-marketpress-documentation.php:175
5537
- msgid "Loading Menu ..."
5538
- msgstr "Lade Menü..."
5539
-
5540
- # @ backwpup
5541
- #: ../inc/pro/class-marketpress-documentation.php:219
5542
- #: ../inc/pro/class-marketpress-documentation.php:335
5543
- #, php-format
5544
- msgctxt "%s = Remote Code"
5545
- msgid "Could not connect to remote host, code %d. Please try again later."
5546
- msgstr "Verbindung zum Remote Host nicht möglich, Code %d. Bitte versuche es später noch einmal."
5547
-
5548
- # @ backwpup
5549
- #: ../inc/pro/class-marketpress-documentation.php:230
5550
- #: ../inc/pro/class-marketpress-documentation.php:346
5551
- msgid "Could not find content for this page. Please try again later."
5552
- msgstr "Für diese Seite konnten kein Inhalte gefunden werden. Bitte versuche es später nocheinmal."
5553
-
5554
- # @ backwpup
5555
- #: ../inc/pro/class-marketpress-documentation.php:236
5556
- #: ../inc/pro/class-marketpress-documentation.php:351
5557
- msgid "Could not connect to remote host. Please try again later."
5558
- msgstr "Konnte nicht zum Remote-Host verbinden. Bitte versuche es später noch einmal."
5559
-
5560
- # @ backwpup
5561
- #: ../inc/pro/class-marketpress-documentation.php:282
5562
- #: ../inc/pro/class-marketpress-documentation.php:290
5563
- msgid "Loading Content ..."
5564
- msgstr "Lade Inhalt..."
5565
-
5566
- # @ backwpup
5567
- #: ../inc/pro/class-page-wizard.php:122
5568
- msgid "No BackWPup Wizard Session found!"
5569
- msgstr "Keine BackWPup-Assistent-Sitzung gefunden!"
5570
-
5571
- # @ backwpup
5572
- #: ../inc/pro/class-page-wizard.php:134
5573
- #: ../inc/pro/class-page-wizard.php:442
5574
- msgid "Cancel"
5575
- msgstr "Abbrechen"
5576
-
5577
- # @ backwpup
5578
- #: ../inc/pro/class-page-wizard.php:169
5579
- #: ../inc/pro/class-page-wizard.php:437
5580
- #: ../inc/pro/class-page-wizard.php:470
5581
- msgid "Next ›"
5582
- msgstr "Weiter ›"
5583
-
5584
- # @ backwpup
5585
- #: ../inc/pro/class-page-wizard.php:186
5586
- #: ../inc/pro/class-page-wizard.php:433
5587
- msgid "‹ Previous"
5588
- msgstr "‹ Zurück"
5589
-
5590
- # @ backwpup
5591
- #: ../inc/pro/class-page-wizard.php:335
5592
- #, php-format
5593
- msgctxt "Plugin Name"
5594
- msgid "%s Wizards"
5595
- msgstr "%s Assistenten"
5596
-
5597
- # @ backwpup
5598
- #: ../inc/pro/class-page-wizard.php:373
5599
- #, php-format
5600
- msgctxt "Plugin Name"
5601
- msgid "%s Wizard:"
5602
- msgstr "%s Assistent:"
5603
-
5604
- # @ backwpup
5605
- #: ../inc/pro/class-page-wizard.php:445
5606
- msgid "Back to overview"
5607
- msgstr "Zurück zur Übersicht"
5608
-
5609
- # @ backwpup
5610
- #: ../inc/pro/class-destination-rsc.php:26
5611
- msgid "API Key:"
5612
- msgstr "API-Schl&uuml;ssel"
5613
-
5614
- # @ backwpup
5615
- #: ../inc/pro/class-destination-rsc.php:29
5616
- msgid "Select region:"
5617
- msgstr "Region wählen:"
5618
-
5619
- # @ backwpup
5620
- #: ../inc/pro/class-destination-rsc.php:134
5621
- #, php-format
5622
- msgid "%d. Trying to sync files to Rackspace cloud&#160;&hellip;"
5623
- msgstr "%d. Versuche Dateien mit der Rackspace Cloud zu synchronisieren&#160;&hellip;"
5624
-
5625
- # @ backwpup
5626
- #: ../inc/pro/class-destination-rsc.php:154
5627
- #, php-format
5628
- msgid "Connected to Rackspace cloud files container %s."
5629
- msgstr "Verbunden mit Rackspace Cloud Datei-Container %s."
5630
-
5631
- # @ backwpup
5632
- #: ../inc/pro/class-destination-rsc.php:168
5633
- msgid "Retrieving files list from Rackspace Cloud."
5634
- msgstr "Rufe Dateiliste von Rackspace Cloud ab."
5635
-
5636
- # @ backwpup
5637
- #: ../inc/pro/class-destination-rsc.php:199
5638
- msgid "Upload changed files to Rackspace Cloud."
5639
- msgstr "Upload der geänderten Dateien zur Rackspace Cloud."
5640
-
5641
- # @ backwpup
5642
- #: ../inc/pro/class-destination-rsc.php:213
5643
- #, php-format
5644
- msgid "File %s uploaded to Rackspace Cloud."
5645
- msgstr "Datei %s zu zur Rackspace Cloud hochgeladen."
5646
-
5647
- # @ backwpup
5648
- #: ../inc/pro/class-destination-rsc.php:241
5649
- #, php-format
5650
- msgid "Extra file %s uploaded to Rackspace Cloud."
5651
- msgstr "Extra Datei %s zur Rackspace Cloud hochgeladen."
5652
-
5653
- # @ backwpup
5654
- #: ../inc/pro/class-destination-rsc.php:254
5655
- msgid "Delete nonexistent files on Rackspace Cloud."
5656
- msgstr "Lösche nicht existierende Dateien von Rackspace Cloud"
5657
-
5658
- # @ backwpup
5659
- #: ../inc/pro/class-destination-rsc.php:258
5660
- #, php-format
5661
- msgid "File %s deleted from Rackspace Cloud."
5662
- msgstr "File %s von Rackspace Cloud gelöscht."
5663
-
5664
- # @ backwpup
5665
- #: ../inc/pro/class-jobtype-dbcheck.php:21
5666
- msgid "Check only WordPress Database tables"
5667
- msgstr "Teste nur die WordPress Datenbank Tabellen"
5668
-
5669
- # @ backwpup
5670
- #: ../inc/pro/class-destination-gdrive.php:33
5671
- #: ../inc/pro/class-destination-gdrive.php:219
5672
- #, php-format
5673
- msgid "Looks like you haven’t set up any API keys yet. Head over to <a href=\"%s\">Settings | API-Keys</a> and get Google Drive all set up, then come back here."
5674
- msgstr "Sieht so aus, als hättest du bis jetzt noch keine API-Schlüssel erstellt. Gehe zu <a href=\"%s\">Einstellungen | API-Schlüssel</a> und setze die Verbindung zu Google Drive auf, kann komm’ hierhin zurück."
5675
-
5676
- # @ backwpup
5677
- #: ../inc/pro/class-destination-gdrive.php:47
5678
- #: ../inc/pro/class-destination-gdrive.php:251
5679
- msgid "Authenticate"
5680
- msgstr "Authentifizieren"
5681
-
5682
- # @ backwpup
5683
- #: ../inc/pro/class-destination-gdrive.php:53
5684
- #: ../inc/pro/class-destination-gdrive.php:257
5685
- msgid "Reauthenticate"
5686
- msgstr "Neu authentifizieren"
5687
-
5688
- # @ backwpup
5689
- #: ../inc/pro/class-destination-gdrive.php:63
5690
- msgid "Folder in Google Drive"
5691
- msgstr "Ordner in Google Drive"
5692
-
5693
- # @ backwpup
5694
- #: ../inc/pro/class-destination-gdrive.php:83
5695
- msgid "Consider using trash to delete files. If trash is not enabled, files will be deleted permanently."
5696
- msgstr "Überlege dir, den Papierkorb zu nutzen um Dateien zu löschen. Bei deaktiviertem Papierkorb werden Dateien unwiderruflich gelöscht."
5697
-
5698
- # @ backwpup
5699
- #: ../inc/pro/class-destination-gdrive.php:132
5700
- #: ../inc/pro/class-destination-gdrive.php:156
5701
- msgid "GDrive: Authenticated."
5702
- msgstr "GDrive: Authentifiziert."
5703
-
5704
- # @ backwpup
5705
- #: ../inc/pro/class-destination-gdrive.php:134
5706
- #: ../inc/pro/class-destination-gdrive.php:158
5707
- msgid "GDrive: No refresh token received."
5708
- msgstr "GDrive: Kein Refresh Token empfangen."
5709
-
5710
- # @ backwpup
5711
- #: ../inc/pro/class-destination-gdrive.php:140
5712
- #: ../inc/pro/class-destination-gdrive.php:163
5713
- #: ../inc/pro/class-destination-gdrive.php:184
5714
- #: ../inc/pro/class-destination-gdrive.php:237
5715
- #, php-format
5716
- msgid "GDrive API: %s"
5717
- msgstr "GDrive API: %s"
5718
-
5719
- # @ backwpup
5720
- #: ../inc/pro/class-destination-gdrive.php:362
5721
- #, php-format
5722
- msgid "%d. Try to send backup file to Google Drive&#160;&hellip;"
5723
- msgstr "%d. Versuche das Backup zu Google Drive zu senden&#160;&hellip;"
5724
-
5725
- # @ backwpup
5726
- #: ../inc/pro/class-destination-gdrive.php:395
5727
- msgid "Uploading to Google Drive&#160;&hellip;"
5728
- msgstr "Upload zu Google Drive&#160;&hellip;"
5729
-
5730
- # @ backwpup
5731
- #: ../inc/pro/class-destination-gdrive.php:439
5732
- msgid "Google Drive API: could not create resumable file"
5733
- msgstr "Google Drive API: kann keine fortsetzbare Datei generieren"
5734
-
5735
- # @ backwpup
5736
- #: ../inc/pro/class-destination-gdrive.php:473
5737
- msgid "Can not resume transfer backup to Google Drive!"
5738
- msgstr "Kann den Backup-Transfer zu Google Drive nicht fortsetzen!"
5739
-
5740
- # @ backwpup
5741
- #: ../inc/pro/class-destination-gdrive.php:530
5742
- #, php-format
5743
- msgid "Error transfering file chunks to %s."
5744
- msgstr "Fehler beim Übertragen von Datei-Teilen zu %s."
5745
-
5746
- # @ backwpup
5747
- #: ../inc/pro/class-destination-gdrive.php:530
5748
- #: ../inc/pro/class-destination-gdrive.php:548
5749
- msgid "Google Drive"
5750
- msgstr "Google Drive"
5751
-
5752
- # @ backwpup
5753
- #: ../inc/pro/class-destination-gdrive.php:592
5754
- #, php-format
5755
- msgid "One file deleted from Google Drive"
5756
- msgid_plural "%d files deleted on Google Drive"
5757
- msgstr[0] "Eine Datei von Google Drive gelöscht"
5758
- msgstr[1] "%d Dateien von Google Drive gelöscht"
5759
-
5760
- # @ backwpup
5761
- #: ../inc/pro/class-destination-gdrive.php:598
5762
- #: ../inc/pro/class-destination-gdrive.php:836
5763
- #, php-format
5764
- msgid "Google Drive API: %s"
5765
- msgstr "Google Drive API: %s"
5766
-
5767
- # @ backwpup
5768
- #: ../inc/pro/class-destination-gdrive.php:633
5769
- #, php-format
5770
- msgid "%d. Try to sync files to Google Drive&#160;&hellip;"
5771
- msgstr "%d. Versuche Dateien mit Google Drive zu synchronisieren&#160;&hellip;"
5772
-
5773
- # @ backwpup
5774
- #: ../inc/pro/class-destination-gdrive.php:662
5775
- msgid "Retrieving folder list from Google Drive"
5776
- msgstr "Abrufen der Ordnerliste von Google Drive"
5777
-
5778
- # @ backwpup
5779
- #: ../inc/pro/class-destination-gdrive.php:679
5780
- msgid "Syncing changed files to Google Drive"
5781
- msgstr "Synchronisiere geänderte Dateien mit Google Drive"
5782
-
5783
- # @ backwpup
5784
- #: ../inc/pro/class-destination-gdrive.php:717
5785
- #, php-format
5786
- msgid "File %s updated on Google Drive"
5787
- msgstr "Datei %s auf Google Drive aktualisiert"
5788
-
5789
- # @ backwpup
5790
- #: ../inc/pro/class-destination-gdrive.php:737
5791
- #, php-format
5792
- msgid "File %s uploaded to Google Drive"
5793
- msgstr "Datei %s zu Google Drive hochgeladen"
5794
-
5795
- # @ backwpup
5796
- #: ../inc/pro/class-destination-gdrive.php:758
5797
- #, php-format
5798
- msgid "File %s moved to trash in Google Drive"
5799
- msgstr "Datei %s in den Papierkorb bei Google Drive verschoben"
5800
-
5801
- # @ backwpup
5802
- #: ../inc/pro/class-destination-gdrive.php:761
5803
- #, php-format
5804
- msgid "File %s deleted permanently in Google Drive"
5805
- msgstr "Datei %s unwiderruflich gelöscht aus Google Drive"
5806
-
5807
- # @ backwpup
5808
- #: ../inc/pro/class-destination-gdrive.php:777
5809
- #, php-format
5810
- msgid "Folder %s moved to trash in Google Drive"
5811
- msgstr "Ordner %s in den Papierkorb bei Google Drive verschoben"
5812
-
5813
- # @ backwpup
5814
- #: ../inc/pro/class-destination-gdrive.php:780
5815
- #, php-format
5816
- msgid "Folder %s deleted permanently in Google Drive"
5817
- msgstr "Ordner %s unwiderruflich gelöscht aus Google Drive"
5818
-
5819
- # @ backwpup
5820
- #: ../inc/pro/class-destination-gdrive.php:807
5821
- #, php-format
5822
- msgid "Extra file %s updated on Google Drive"
5823
- msgstr "Extra Datei %s auf Google Drive aktualisiert"
5824
-
5825
- # @ backwpup
5826
- #: ../inc/pro/class-destination-gdrive.php:826
5827
- #, php-format
5828
- msgid "Extra file %s uploaded to Google Drive"
5829
- msgstr "Extra Datei %s auf Google Drive hochgeladen"
5830
-
5831
- # @ backwpup
5832
- #: ../inc/pro/class-jobtype-wpplugin.php:13
5833
- msgid "Nothing to configure"
5834
- msgstr "Nichts zu konfiguieren"
5835
-
5836
- # @ backwpup
5837
- #: ../inc/pro/class-export-jobs.php:12
5838
- #: ../inc/pro/class-export-jobs.php:23
5839
- msgid "Export"
5840
- msgstr "Export"
5841
-
5842
- # @ backwpup
5843
- #: ../inc/pro/class-destination-glacier.php:26
5844
- msgid "Amazon Glacier"
5845
- msgstr "Amazon Glacier"
5846
-
5847
- # @ backwpup
5848
- #: ../inc/pro/class-destination-glacier.php:30
5849
- msgid "Select a region:"
5850
- msgstr "Wähle eine Region:"
5851
-
5852
- # @ backwpup
5853
- #: ../inc/pro/class-destination-glacier.php:32
5854
- #: ../inc/pro/class-destination-glacier.php:154
5855
- msgid "Amazon Glacier Region"
5856
- msgstr "Amazon Glacier Region"
5857
-
5858
- # @ backwpup
5859
- #: ../inc/pro/class-destination-glacier.php:33
5860
- #: ../inc/pro/class-destination-glacier.php:155
5861
- msgid "US Standard"
5862
- msgstr "US Standard"
5863
-
5864
- # @ backwpup
5865
- #: ../inc/pro/class-destination-glacier.php:34
5866
- #: ../inc/pro/class-destination-glacier.php:156
5867
- msgid "US West (Northern California)"
5868
- msgstr "US West (Northern California)"
5869
-
5870
- # @ backwpup
5871
- #: ../inc/pro/class-destination-glacier.php:35
5872
- #: ../inc/pro/class-destination-glacier.php:157
5873
- msgid "US West (Oregon)"
5874
- msgstr "US West (Oregon)"
5875
-
5876
- # @ backwpup
5877
- #: ../inc/pro/class-destination-glacier.php:36
5878
- #: ../inc/pro/class-destination-glacier.php:158
5879
- msgid "EU (Ireland)"
5880
- msgstr "EU (Ireland)"
5881
-
5882
- # @ backwpup
5883
- #: ../inc/pro/class-destination-glacier.php:37
5884
- #: ../inc/pro/class-destination-glacier.php:159
5885
- msgid "EU (Germany)"
5886
- msgstr "EU (Germany)"
5887
-
5888
- # @ backwpup
5889
- #: ../inc/pro/class-destination-glacier.php:38
5890
- #: ../inc/pro/class-destination-glacier.php:160
5891
- msgid "Asia Pacific (Tokyo)"
5892
- msgstr "Asia Pacific (Tokyo)"
5893
-
5894
- # @ backwpup
5895
- #: ../inc/pro/class-destination-glacier.php:39
5896
- #: ../inc/pro/class-destination-glacier.php:161
5897
- msgid "Asia Pacific (Singapore)"
5898
- msgstr "Asia Pacific (Singapore)"
5899
-
5900
- # @ backwpup
5901
- #: ../inc/pro/class-destination-glacier.php:40
5902
- #: ../inc/pro/class-destination-glacier.php:162
5903
- msgid "Asia Pacific (Sydney)"
5904
- msgstr "Asia Pacific (Sydney)"
5905
-
5906
- # @ backwpup
5907
- #: ../inc/pro/class-destination-glacier.php:41
5908
- #: ../inc/pro/class-destination-glacier.php:163
5909
- msgid "South America (Sao Paulo)"
5910
- msgstr "South America (Sao Paulo)"
5911
-
5912
- # @ backwpup
5913
- #: ../inc/pro/class-destination-glacier.php:42
5914
- msgid "China (Beijing)"
5915
- msgstr "China (Beijing)"
5916
-
5917
- # @ backwpup
5918
- #: ../inc/pro/class-destination-glacier.php:48
5919
- msgid "Amazon Access Keys"
5920
- msgstr "Amazon Zugriffsschlüssel"
5921
-
5922
- # @ backwpup
5923
- #: ../inc/pro/class-destination-glacier.php:67
5924
- msgid "Vault"
5925
- msgstr "Tresor"
5926
-
5927
- # @ backwpup
5928
- #: ../inc/pro/class-destination-glacier.php:71
5929
- msgid "Vault selection"
5930
- msgstr "Tresorauswahl"
5931
-
5932
- # @ backwpup
5933
- #: ../inc/pro/class-destination-glacier.php:83
5934
- msgid "Create a new vault"
5935
- msgstr "Neuen Tresor erstellen"
5936
-
5937
- # @ backwpup
5938
- #: ../inc/pro/class-destination-glacier.php:90
5939
- msgid "Glacier Backup settings"
5940
- msgstr "Glacier Backup Einstellungen"
5941
-
5942
- # @ backwpup
5943
- #: ../inc/pro/class-destination-glacier.php:97
5944
- #: ../inc/pro/class-destination-glacier.php:181
5945
- msgid "Number of files to keep in folder. (Archives deleted before 3 months after they have been stored may cause extra costs when deleted.)"
5946
- msgstr "Anzahl der im Ordner verbleibenden Dateien. (Archive, die vor Ablauf von 3 Monaten gelöscht werden, können zusätzliche Kosten verursachen.)"
5947
-
5948
- # @ backwpup
5949
- #: ../inc/pro/class-destination-glacier.php:130
5950
- #: ../inc/pro/class-destination-glacier.php:215
5951
- #, php-format
5952
- msgid "Vault %1$s created."
5953
- msgstr "Tresor %1$s erstellt."
5954
-
5955
- # @ backwpup
5956
- #: ../inc/pro/class-destination-glacier.php:132
5957
- #: ../inc/pro/class-destination-glacier.php:217
5958
- #, php-format
5959
- msgid "Vault %s could not be created."
5960
- msgstr "Tresor %s konnte nicht erstellt werden."
5961
-
5962
- # @ backwpup
5963
- #: ../inc/pro/class-destination-glacier.php:153
5964
- msgid "Select an Amazon Glacier region:"
5965
- msgstr "Wähle Amazon Glacier Region:"
5966
-
5967
- # @ backwpup
5968
- #: ../inc/pro/class-destination-glacier.php:169
5969
- msgid "Vault:"
5970
- msgstr "Tresor:"
5971
-
5972
- # @ backwpup
5973
- #: ../inc/pro/class-destination-glacier.php:178
5974
- msgid "New Vault:"
5975
- msgstr "Neuer Tresor:"
5976
-
5977
- # @ backwpup
5978
- #: ../inc/pro/class-destination-glacier.php:258
5979
- #: ../inc/pro/class-destination-glacier.php:374
5980
- #: ../inc/pro/class-destination-glacier.php:390
5981
- #: ../inc/pro/class-destination-glacier.php:430
5982
- #, php-format
5983
- msgid "AWS API: %s"
5984
- msgstr "AWS API: %s"
5985
-
5986
- # @ backwpup
5987
- #: ../inc/pro/class-destination-glacier.php:282
5988
- #, php-format
5989
- msgid "%d. Trying to send backup file to Amazon Glacier&#160;&hellip;"
5990
- msgstr "%d. Versuche Backup-Datei zu Amazon Glacier zu senden&#160;&hellip;"
5991
-
5992
- # @ backwpup
5993
- #: ../inc/pro/class-destination-glacier.php:295
5994
- #, php-format
5995
- msgid "Connected to Glacier vault \"%1$s\" with %2$d archives and size of %3$d"
5996
- msgstr "Verbunden mit Glacier-Vault \"%1$s\" mit %2$d archives einer Größe von %3$d"
5997
-
5998
- # @ backwpup
5999
- #: ../inc/pro/class-destination-glacier.php:297
6000
- #, php-format
6001
- msgid "Glacier vault \"%s\" does not exist!"
6002
- msgstr "Glacier Tresor \"%s\" existiert nicht!"
6003
-
6004
- # @ backwpup
6005
- #: ../inc/pro/class-destination-glacier.php:303
6006
- msgid "Starting upload to Amazon Glacier&#160;&hellip;"
6007
- msgstr "Upload zu Amazon Glacier wird gestartet&#160;&hellip;"
6008
-
6009
- # @ backwpup
6010
- #: ../inc/pro/class-destination-glacier.php:356
6011
- #, php-format
6012
- msgid "Archive ID: %s"
6013
- msgstr "Archiv ID: %s"
6014
-
6015
- # @ backwpup
6016
- #: ../inc/pro/class-destination-glacier.php:420
6017
- #, php-format
6018
- msgid "Cannot delete archive from %s."
6019
- msgstr "Kann das Archiv aus %s nicht löschen."
6020
-
6021
- # @ backwpup
6022
- #: ../inc/pro/class-destination-glacier.php:424
6023
- #, php-format
6024
- msgid "One file deleted on vault."
6025
- msgid_plural "%d files deleted on vault"
6026
- msgstr[0] "Eine Datei aus Tresor entfernt."
6027
- msgstr[1] "%d Dateien aus Tresor entfernt"
6028
-
6029
- # @ backwpup
6030
- #: ../inc/pro/class-destination-glacier.php:538
6031
- msgid "No vault found!"
6032
- msgstr "Kein Tresor gefunden!"
6033
-
6034
- # @ backwpup
6035
- #: ../inc/pro/class-destination-sugarsync.php:25
6036
- #: ../inc/pro/class-destination-sugarsync.php:84
6037
- msgid "Sugarsync authenticate!"
6038
- msgstr "Sugarsync Authentifizierung!"
6039
-
6040
- # @ backwpup
6041
- #: ../inc/pro/class-destination-sugarsync.php:36
6042
- msgid "Root:"
6043
- msgstr "Root:"
6044
-
6045
- # @ backwpup
6046
- #: ../inc/pro/class-marketpress-autoupdate.php:344
6047
- #, php-format
6048
- msgctxt "%s = plugin name"
6049
- msgid "Your license for the plugin %s is not valid. The auto-update has been deactivated. Please insert a valid key on MarketPress Dashboard. Or if you want to add an other valid code use the form below."
6050
- msgstr "Dein Lizenzschlüssel für das Plugin %s ist ungültig. Automatische Updates wurden deaktiviert. Gib bitte einen gültigen Schlüssel im MarketPress Dashboard ein. Wenn du einen anderen gültigen Schlüssel hinzufügen möchtest, nutze bitte das Formular (unten)."
6051
-
6052
- # @ backwpup
6053
- #: ../inc/pro/class-marketpress-autoupdate.php:356
6054
- msgid "You are currently using a valid key for this plugin. You are able to renew the key in MarketPress Dashboard. Or if you want to add another valid code use the form below."
6055
- msgstr "Du verwendest derzeit einen gültigen Lizenzschlüssel für dieses Plugin. Du kannst die Lizenzen im MarketPress Dashboard erneuern. Oder einen anderen gültigen Schlüssel eintragen."
6056
-
6057
- # @ backwpup
6058
- #: ../inc/pro/class-marketpress-autoupdate.php:367
6059
- #, php-format
6060
- msgctxt "%s = plugin name"
6061
- msgid "Your license for the plugin %s is not valid. The auto-update has been deactivated."
6062
- msgstr "Deine Lizenz für das Plugin %s ist ungültig. Automatische Updates wurden deaktiviert."
6063
-
6064
- # @ backwpup
6065
- #: ../inc/pro/class-marketpress-autoupdate.php:379
6066
- #, php-format
6067
- msgid "You are currently using a valid key for this plugin. You are able to renew the key below or you can delete the key by <a href=\"%s\">clicking here</a>."
6068
- msgstr "Du verwendest einen gültigen Lizenzschlüssel für dieses Plugin. Du kannst den Schlüssel unten erneuern oder Löschen <a href=\"%s\">zum Löschen hier klicken</a>."
6069
-
6070
- # @ backwpup
6071
- #: ../inc/pro/class-marketpress-autoupdate.php:386
6072
- msgid "License Key"
6073
- msgstr "Lizenzschlüssel"
6074
-
6075
- # @ backwpup
6076
- #: ../inc/pro/class-marketpress-autoupdate.php:389
6077
- msgid "Activate"
6078
- msgstr "Aktivieren"
6079
-
6080
- # @ backwpup
6081
- #: ../inc/pro/class-marketpress-autoupdate.php:558
6082
- msgid "The License has been deleted."
6083
- msgstr "Die Lizenz wurde gelöscht."
6084
-
6085
- # @ backwpup
6086
- #: ../inc/pro/class-marketpress-autoupdate.php:565
6087
- msgid "Plugin successfully activated."
6088
- msgstr "Plugin erfolgreich aktiviert."
6089
-
6090
- # @ backwpup
6091
- #: ../inc/pro/class-marketpress-autoupdate.php:572
6092
- msgid "The entered license key is wrong."
6093
- msgstr "Der eingegebene Lizenzschlüssel ist falsch."
6094
-
6095
- # @ backwpup
6096
- #: ../inc/pro/class-marketpress-autoupdate.php:579
6097
- msgid "You have reached the limit of urls. Please update your license at <a href=\"http://marketpress.com\">marketpress.com</a>."
6098
- msgstr "Du hast das Limit der URLs erreicht. Bitte aktualisiere deine Lizenz auf <a href=\"http://marketpress.de\">marketpress.de</a>."
6099
-
6100
- # @ backwpup
6101
- #: ../inc/pro/class-marketpress-autoupdate.php:586
6102
- msgid "Something went wrong. Please try again later or contact the <a href=\"http://marketpress.com/support/\">MarketPress Team</a>."
6103
- msgstr "Etwas ist falsch gelaufen. Bitte versuche es erneut oder kontaktiere das <a href=\"http://marketpress.de/support/\">MarketPress Team</a>."
6104
-
6105
- # @ backwpup
6106
- #: ../inc/pro/class-marketpress-autoupdate.php:593
6107
- msgid "Due to a wrong license you are not allowed to activate this plugin. Please update your license at <a href=\"http://marketpress.com\">marketpress.com</a>."
6108
- msgstr "Dir ist nicht erlaubt, das Plugin zu aktivieren, mit einer falschen Lizenz. Bitte aktualisiere deine Lizenz auf <a href=\"http://marketpress.de\">MarketPress.de</a>."
6109
-
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: BackWPup Pro v3.1.3\n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2014-11-12 13:25+0100\n"
6
+ "PO-Revision-Date: 2014-11-12 13:26+0100\n"
7
+ "Last-Translator: Robert Windisch <r.windisch@inpsyde.com>\n"
8
+ "Language-Team: \n"
9
+ "Language: \n"
10
+ "MIME-Version: 1.0\n"
11
+ "Content-Type: text/plain; charset=UTF-8\n"
12
+ "Content-Transfer-Encoding: 8bit\n"
13
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
14
+ "X-Generator: GlotPress/0.1\n"
15
+ "X-Poedit-SourceCharset: utf-8\n"
16
+ "X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
17
+ "X-Poedit-Basepath: .\n"
18
+ "X-Textdomain-Support: yes\n"
19
+ "X-Poedit-SearchPath-0: .\n"
20
+ "X-Poedit-SearchPath-1: ..\n"
21
+
22
+ # @ backwpup
23
+ #: ../backwpup.php:42
24
+ msgid "BackWPup requires PHP version 5.2.7 with spl extension or greater and WordPress 3.4 or greater."
25
+ msgstr "BackWPup benötigt PHP Version 5.2.7 oder höher mit der SPL-Erweiterung und WordPress 3.4 oder höher."
26
+
27
+ # @ backwpup
28
+ #: ../backwpup.php:289
29
+ msgid "Folder"
30
+ msgstr "Ordner"
31
+
32
+ # @ backwpup
33
+ #: ../backwpup.php:290
34
+ msgid "Backup to Folder"
35
+ msgstr "Backup in Ordner"
36
+
37
+ # @ backwpup
38
+ #: ../backwpup.php:305
39
+ msgid "Email"
40
+ msgstr "E-Mail"
41
+
42
+ # @ backwpup
43
+ #: ../backwpup.php:306
44
+ msgid "Backup sent via email"
45
+ msgstr "Backup als E-Mail versendet"
46
+
47
+ # @ backwpup
48
+ #: ../backwpup.php:321
49
+ msgid "FTP"
50
+ msgstr "FTP"
51
+
52
+ # @ backwpup
53
+ #: ../backwpup.php:322
54
+ msgid "Backup to FTP"
55
+ msgstr "Backup zu FTP"
56
+
57
+ # @ backwpup
58
+ #: ../backwpup.php:337
59
+ msgid "Dropbox"
60
+ msgstr "Dropbox"
61
+
62
+ # @ backwpup
63
+ #: ../backwpup.php:338
64
+ msgid "Backup to Dropbox"
65
+ msgstr "Backup in die Dropbox"
66
+
67
+ # @ backwpup
68
+ #: ../backwpup.php:354
69
+ #: ../backwpup.php:373
70
+ msgid "S3 Service"
71
+ msgstr "S3 Service"
72
+
73
+ # @ backwpup
74
+ #: ../backwpup.php:355
75
+ msgid "Backup to an S3 Service"
76
+ msgstr "Backup zu einem S3 Service"
77
+
78
+ # @ backwpup
79
+ #: ../backwpup.php:374
80
+ msgid "Backup to an S3 Service v1"
81
+ msgstr "Backup auf S3 Service v1"
82
+
83
+ # @ backwpup
84
+ #: ../backwpup.php:390
85
+ msgid "MS Azure"
86
+ msgstr "MS Azure"
87
+
88
+ # @ backwpup
89
+ #: ../backwpup.php:391
90
+ msgid "Backup to Microsoft Azure (Blob)"
91
+ msgstr "Backup zu Microsoft Azure (Blob)"
92
+
93
+ # @ backwpup
94
+ #: ../backwpup.php:406
95
+ msgid "RSC"
96
+ msgstr "RSC"
97
+
98
+ # @ backwpup
99
+ #: ../backwpup.php:407
100
+ msgid "Backup to Rackspace Cloud Files"
101
+ msgstr "Backup in die Rackspace Cloud"
102
+
103
+ # @ backwpup
104
+ #: ../backwpup.php:423
105
+ msgid "SugarSync"
106
+ msgstr "SugarSync"
107
+
108
+ # @ backwpup
109
+ #: ../backwpup.php:424
110
+ msgid "Backup to SugarSync"
111
+ msgstr "Backup zu SugarSync"
112
+
113
+ # @ backwpup
114
+ #: ../backwpup.php:443
115
+ #, php-format
116
+ msgid "PHP Version %1$s is to low, you need Version %2$s or above."
117
+ msgstr "Du nutzt die veraltete PHP Version %1$s. Es wird aber mindestens die Version %2$s benötigt."
118
+
119
+ # @ backwpup
120
+ #: ../backwpup.php:450
121
+ #, php-format
122
+ msgid "Missing function \"%s\"."
123
+ msgstr "Fehlende Funktion \"%s\"."
124
+
125
+ # @ backwpup
126
+ #: ../backwpup.php:459
127
+ #, php-format
128
+ msgid "Missing class \"%s\"."
129
+ msgstr "Fehlende Klasse \"%s\"."
130
+
131
+ # @ backwpup
132
+ #: ../inc/class-destination-folder.php:26
133
+ #: ../inc/class-destination-ftp.php:52
134
+ msgid "Backup settings"
135
+ msgstr "Backup-Einstellungen"
136
+
137
+ # @ backwpup
138
+ #: ../inc/class-destination-folder.php:30
139
+ msgid "Folder to store backups in"
140
+ msgstr "Order für Dateien"
141
+
142
+ # @ backwpup
143
+ #: ../inc/class-destination-folder.php:36
144
+ #: ../inc/class-destination-ftp.php:62
145
+ msgid "File Deletion"
146
+ msgstr "Dateilöschung"
147
+
148
+ # @ backwpup
149
+ #: ../inc/class-destination-folder.php:42
150
+ #: ../inc/class-destination-s3.php:160
151
+ msgid "Number of files to keep in folder."
152
+ msgstr "Anzahl der Dateien, die im Ordner behalten werden"
153
+
154
+ # @ backwpup
155
+ #: ../inc/class-destination-folder.php:46
156
+ #: ../inc/class-destination-s3.php:164
157
+ #: ../inc/class-destination-ftp.php:72
158
+ msgid "Do not delete files while syncing to destination!"
159
+ msgstr "Keine Dateien im Sync-Zielverzeichnis löschen!"
160
+
161
+ # @ backwpup
162
+ #: ../inc/class-destination-folder.php:194
163
+ #, php-format
164
+ msgid "One backup file deleted"
165
+ msgid_plural "%d backup files deleted"
166
+ msgstr[0] "Eine Sicherungsdatei gelöscht"
167
+ msgstr[1] "%d Sicherungsdateien gelöscht"
168
+
169
+ # @ backwpup
170
+ #: ../inc/class-destination-s3.php:74
171
+ msgid "Select a S3 service"
172
+ msgstr "Wähle einen S3 Service"
173
+
174
+ # @ backwpup
175
+ #: ../inc/class-destination-s3.php:76
176
+ msgid "Amazon S3 Region"
177
+ msgstr "Amazon S3 Region"
178
+
179
+ # @ backwpup
180
+ #: ../inc/class-destination-s3.php:77
181
+ msgid "Amazon S3: US Standard"
182
+ msgstr "Amazon S3: US Standard"
183
+
184
+ # @ backwpup
185
+ #: ../inc/class-destination-s3.php:78
186
+ msgid "Amazon S3: US West (Northern California)"
187
+ msgstr "Amazon S3: US West (Northern California)"
188
+
189
+ # @ backwpup
190
+ #: ../inc/class-destination-s3.php:79
191
+ msgid "Amazon S3: US West (Oregon)"
192
+ msgstr "Amazon S3: US West (Oregon)"
193
+
194
+ # @ backwpup
195
+ #: ../inc/class-destination-s3.php:80
196
+ msgid "Amazon S3: EU (Ireland)"
197
+ msgstr "Amazon S3: EU (Ireland)"
198
+
199
+ # @ backwpup
200
+ #: ../inc/class-destination-s3.php:81
201
+ msgid "Amazon S3: EU (Germany)"
202
+ msgstr "Amazon S3: EU (Germany)"
203
+
204
+ # @ backwpup
205
+ #: ../inc/class-destination-s3.php:82
206
+ msgid "Amazon S3: Asia Pacific (Tokyo)"
207
+ msgstr "Amazon S3: Asia Pacific (Tokyo)"
208
+
209
+ # @ backwpup
210
+ #: ../inc/class-destination-s3.php:83
211
+ msgid "Amazon S3: Asia Pacific (Singapore)"
212
+ msgstr "Amazon S3: Asia Pacific (Singapore)"
213
+
214
+ # @ backwpup
215
+ #: ../inc/class-destination-s3.php:84
216
+ msgid "Amazon S3: Asia Pacific (Sydney)"
217
+ msgstr "Amazon S3: Asia Pacific (Sydney)"
218
+
219
+ # @ backwpup
220
+ #: ../inc/class-destination-s3.php:85
221
+ msgid "Amazon S3: South America (Sao Paulo)"
222
+ msgstr "Amazon S3: South America (Sao Paulo)"
223
+
224
+ # @ backwpup
225
+ #: ../inc/class-destination-s3.php:86
226
+ msgid "Amazon S3: China (Beijing)"
227
+ msgstr "Amazon S3: China (Beijing)"
228
+
229
+ # @ backwpup
230
+ #: ../inc/class-destination-s3.php:87
231
+ msgid "Google Storage (Interoperable Access)"
232
+ msgstr "Google Storage (Interoperable Access)"
233
+
234
+ # @ backwpup
235
+ #: ../inc/class-destination-s3.php:88
236
+ msgid "Dream Host Cloud Storage"
237
+ msgstr "Dream Host Cloud Storage"
238
+
239
+ # @ backwpup
240
+ #: ../inc/class-destination-s3.php:89
241
+ msgid "GreenQloud Storage Qloud"
242
+ msgstr "GreenQloud Storage Qloud"
243
+
244
+ # @ backwpup
245
+ #: ../inc/class-destination-s3.php:94
246
+ msgid "Or a S3 Server URL"
247
+ msgstr "oder eine S3 Server URL"
248
+
249
+ # @ backwpup
250
+ #: ../inc/class-destination-s3.php:101
251
+ msgid "S3 Access Keys"
252
+ msgstr "S3 Access Keys"
253
+
254
+ # @ backwpup
255
+ #: ../inc/class-destination-s3.php:105
256
+ msgid "Access Key"
257
+ msgstr "Access Key"
258
+
259
+ # @ backwpup
260
+ #: ../inc/class-destination-s3.php:112
261
+ msgid "Secret Key"
262
+ msgstr "Secret Key"
263
+
264
+ # @ backwpup
265
+ #: ../inc/class-destination-s3.php:120
266
+ msgid "S3 Bucket"
267
+ msgstr "S3 Bucket"
268
+
269
+ # @ backwpup
270
+ #: ../inc/class-destination-s3.php:124
271
+ msgid "Bucket selection"
272
+ msgstr "Bucket Auswahl"
273
+
274
+ # @ backwpup
275
+ #: ../inc/class-destination-s3.php:137
276
+ msgid "Create a new bucket"
277
+ msgstr "Neues Bucket erstellen"
278
+
279
+ # @ backwpup
280
+ #: ../inc/class-destination-s3.php:144
281
+ msgid "S3 Backup settings"
282
+ msgstr "S3 Backup Einstellungen"
283
+
284
+ # @ backwpup
285
+ #: ../inc/class-destination-s3.php:148
286
+ msgid "Folder in bucket"
287
+ msgstr "Ordner im Bucket"
288
+
289
+ # @ backwpup
290
+ #: ../inc/class-destination-s3.php:154
291
+ msgid "File deletion"
292
+ msgstr "Datei Löschung"
293
+
294
+ # @ backwpup
295
+ #: ../inc/class-destination-s3.php:170
296
+ msgid "Multipart Upload"
297
+ msgstr "Multipart Upload"
298
+
299
+ # @ backwpup
300
+ #: ../inc/class-destination-s3.php:174
301
+ msgid "Use multipart upload for uploading a file"
302
+ msgstr "Benutze Multipart Upload zu hochladen der Datei"
303
+
304
+ # @ backwpup
305
+ #: ../inc/class-destination-s3.php:180
306
+ msgid "Amazon specific settings"
307
+ msgstr "Amazon spezifische Einstellungen"
308
+
309
+ # @ backwpup
310
+ #: ../inc/class-destination-s3.php:184
311
+ #: ../inc/class-destination-s3.php:186
312
+ msgid "Amazon: Storage Class"
313
+ msgstr "Amazon: Storage Class"
314
+
315
+ # @ backwpup
316
+ #: ../inc/class-destination-s3.php:187
317
+ msgid "none"
318
+ msgstr "keine"
319
+
320
+ # @ backwpup
321
+ #: ../inc/class-destination-s3.php:188
322
+ msgid "Reduced Redundancy"
323
+ msgstr "Reduzierte Redundanz"
324
+
325
+ # @ backwpup
326
+ #: ../inc/class-destination-s3.php:193
327
+ msgid "Server side encryption"
328
+ msgstr "Serverseitige Enkryption"
329
+
330
+ # @ backwpup
331
+ #: ../inc/class-destination-s3.php:197
332
+ msgid "Save files encrypted (AES256) on server."
333
+ msgstr "Speicher Dateien Server Side Encrypted (AES256)"
334
+
335
+ # @ backwpup
336
+ #: ../inc/class-destination-s3.php:253
337
+ #, php-format
338
+ msgid "Bucket %1$s created in %2$s."
339
+ msgstr "Bucket %1$s in %2$s erstellt."
340
+
341
+ # @ backwpup
342
+ #: ../inc/class-destination-s3.php:255
343
+ #, php-format
344
+ msgid "Bucket %s could not be created."
345
+ msgstr "Bucket %s konnte nicht erstellt werden."
346
+
347
+ # @ backwpup
348
+ #: ../inc/class-destination-s3.php:257
349
+ #, php-format
350
+ msgid " %s is not a valid bucket name."
351
+ msgstr "%s ist kein gültiger Bucket Name"
352
+
353
+ # @ backwpup
354
+ #: ../inc/class-destination-s3.php:297
355
+ #: ../inc/class-destination-s3.php:418
356
+ #: ../inc/class-destination-s3.php:471
357
+ #: ../inc/class-destination-s3.php:501
358
+ #: ../inc/class-destination-s3.php:561
359
+ #, php-format
360
+ msgid "S3 Service API: %s"
361
+ msgstr "S3 Service API: %s"
362
+
363
+ # @ backwpup
364
+ #: ../inc/class-destination-s3.php:361
365
+ #, php-format
366
+ msgid "%d. Trying to send backup file to S3 Service&#160;&hellip;"
367
+ msgstr "%d. Versuche, ein Backup zum S3-Service zu senden&#160;&hellip;"
368
+
369
+ # @ backwpup
370
+ #: ../inc/class-destination-s3.php:374
371
+ #, php-format
372
+ msgid "Connected to S3 Bucket \"%1$s\" in %2$s"
373
+ msgstr "Verbunden zum S3 Bucket \"%1$s\" in %2$s"
374
+
375
+ # @ backwpup
376
+ #: ../inc/class-destination-s3.php:377
377
+ #, php-format
378
+ msgid "S3 Bucket \"%s\" does not exist!"
379
+ msgstr "Amazon S3 Bucket \"%s\" existiert nicht!"
380
+
381
+ # @ backwpup
382
+ #: ../inc/class-destination-s3.php:384
383
+ msgid "Checking for not aborted multipart Uploads&#160;&hellip;"
384
+ msgstr "Prüfe auf nicht abgebrochene, mehrteilige Uploads&#160;&hellip;"
385
+
386
+ # @ backwpup
387
+ #: ../inc/class-destination-s3.php:390
388
+ #, php-format
389
+ msgid "Upload for %s aborted."
390
+ msgstr "Upload für %s abgebrochen."
391
+
392
+ # @ backwpup
393
+ #: ../inc/class-destination-s3.php:396
394
+ msgid "Starting upload to S3 Service&#160;&hellip;"
395
+ msgstr "Upload zum S3 Service begonnen&#160;&hellip;"
396
+
397
+ # @ backwpup
398
+ #: ../inc/class-destination-s3.php:492
399
+ #, php-format
400
+ msgid "Backup transferred to %s."
401
+ msgstr "Backup übertragen zu %s"
402
+
403
+ # @ backwpup
404
+ #: ../inc/class-destination-s3.php:497
405
+ #, php-format
406
+ msgid "Cannot transfer backup to S3! (%1$d) %2$s"
407
+ msgstr "Backup kann nicht zu Amazon S3 übertragen werden! (%1$d) %2$s"
408
+
409
+ # @ backwpup
410
+ #: ../inc/class-destination-s3.php:525
411
+ #, php-format
412
+ msgid "Storage Class: %s"
413
+ msgstr "Speicher-Klasse: %s"
414
+
415
+ # @ backwpup
416
+ #: ../inc/class-destination-s3.php:551
417
+ #, php-format
418
+ msgid "Cannot delete backup from %s."
419
+ msgstr "Kann das Backup auf %s nicht löschen"
420
+
421
+ # @ backwpup
422
+ #: ../inc/class-destination-s3.php:555
423
+ #, php-format
424
+ msgid "One file deleted on S3 Bucket."
425
+ msgid_plural "%d files deleted on S3 Bucket"
426
+ msgstr[0] "Eine Datei im S3-Bucket gelöscht"
427
+ msgstr[1] "%d Dateien im S3-Bucket gelöscht"
428
+
429
+ # @ backwpup
430
+ #: ../inc/class-destination-s3.php:658
431
+ msgid "Missing access key!"
432
+ msgstr "Der Zugangsschlüssel (Access Key) fehlt!"
433
+
434
+ # @ backwpup
435
+ #: ../inc/class-destination-s3.php:660
436
+ msgid "Missing secret access key!"
437
+ msgstr "Der geheime Zugangsschlüssel (Secret Access Key) fehlt!"
438
+
439
+ # @ backwpup
440
+ #: ../inc/class-destination-s3.php:666
441
+ msgid "No bucket found!"
442
+ msgstr "Kein Bucket gefunden!"
443
+
444
+ # @ backwpup
445
+ #: ../inc/class-page-about.php:394
446
+ #, php-format
447
+ msgid "%s Welcome"
448
+ msgstr "%s Willkommen"
449
+
450
+ # @ backwpup
451
+ #: ../inc/class-page-about.php:401
452
+ msgid "Heads up! You have updated from version 2.x"
453
+ msgstr "Achtung! Sie haben von Version 2.x aktualisiert"
454
+
455
+ # @ backwpup
456
+ #: ../inc/class-page-about.php:402
457
+ #, php-format
458
+ msgid "Please <a href=\"%s\">check your settings</a> after updating from version 2.x:"
459
+ msgstr "Bitte <a href=\"%s\">prüfen Sie Ihre Einstellungen</a> nach dem Update von Version 2.x."
460
+
461
+ # @ backwpup
462
+ #: ../inc/class-page-about.php:403
463
+ msgid "Dropbox authentication must be re-entered"
464
+ msgstr "Die Drohbox-Authentifizierung muss wiederholt werden."
465
+
466
+ # @ backwpup
467
+ #: ../inc/class-page-about.php:404
468
+ msgid "SugarSync authentication must be re-entered"
469
+ msgstr "Die SugarSync-Authentifizierung muss wiederholt werden"
470
+
471
+ # @ backwpup
472
+ #: ../inc/class-page-about.php:405
473
+ msgid "S3 Settings"
474
+ msgstr "S3-Einstellungen"
475
+
476
+ # @ backwpup
477
+ #: ../inc/class-page-about.php:406
478
+ msgid "Google Storage is now a part of S3 service settings"
479
+ msgstr "Google Storage ist jetzt Teil der S3-Einstellungen"
480
+
481
+ # @ backwpup
482
+ #: ../inc/class-page-about.php:407
483
+ msgid "All your passwords"
484
+ msgstr "All Ihre Passwörter"
485
+
486
+ # @ backwpup
487
+ #: ../inc/class-page-about.php:416
488
+ msgid "Welcome to BackWPup Pro"
489
+ msgstr "Willkommen zu BackWPup Pro"
490
+
491
+ # @ backwpup
492
+ #: ../inc/class-page-about.php:417
493
+ msgid "BackWPup’s job wizards make planning and scheduling your backup jobs a breeze."
494
+ msgstr "Die Assistenten in BackWPup machen das Planen und terminieren deiner Sicherungen zu einem Spaziergang."
495
+
496
+ # @ backwpup
497
+ #: ../inc/class-page-about.php:418
498
+ #: ../inc/class-page-about.php:428
499
+ msgid "Use your backup archives to save your entire WordPress installation including <code>/wp-content/</code>. Push them to an external storage service if you don’t want to save the backups on the same server. With a single backup archive you are able to restore an installation. Use a tool like phpMyAdmin or a plugin like <a href=\"http://wordpress.org/plugins/adminer/\" target=\"_blank\">Adminer</a> to restore your database backup files."
500
+ msgstr "Benutze deine Backup-Archive, um deine gesamte WordPress-Installation zu sichern, einschließlich <code>/wp-content/</code>. Lade sie zu einem externen Dienst hoch, wenn du deine Backups nicht auf demselben Server speichern möchtest. Mit einem einzigen Backup-Archiv kannst du deine Installation wiederherstellen. Benutze ein serverseitiges Tool wie phpMyAdmin, oder ein Plugin wie <a href=\"http://wordpress.org/plugins/adminer/\" target=\"_blank\">Adminer</a>, um deine Datenbanksicherung wiederherzustellen."
501
+
502
+ # @ backwpup
503
+ #: ../inc/class-page-about.php:419
504
+ #, php-format
505
+ msgid "Ready to <a href=\"%1$s\">set up a backup job</a>? You can <a href=\"%2$s\">use the wizards</a> or plan your backup in expert mode."
506
+ msgstr "<a href=\"%1$s\">Bereit, einen Backup-Auftrag anzulegen</a>? Benutze die <a href=\"%2$s\">Assistenten</a>, oder plane dein Backup im Expertenmodus."
507
+
508
+ # @ backwpup
509
+ #: ../inc/class-page-about.php:426
510
+ msgid "Welcome to BackWPup"
511
+ msgstr "Willkommen bei BackWPup"
512
+
513
+ # @ backwpup
514
+ #: ../inc/class-page-about.php:429
515
+ msgid "Ready to set up a backup job? Use one of the wizards to plan what you want to save."
516
+ msgstr "Bereit, einen Backup-Auftrag anzulegen? Benutze einen der Assistenten, um deine Sicherung zu planen."
517
+
518
+ # @ backwpup
519
+ #: ../inc/class-page-about.php:446
520
+ msgid "Please activate your license"
521
+ msgstr "Bitte aktivieren Sie Ihre Lizenz."
522
+
523
+ # @ backwpup
524
+ #: ../inc/class-page-about.php:447
525
+ msgid "Please go to your plugin page and active the license to have the autoupdates enabled."
526
+ msgstr "Bitte gehen Sie auf die Plugin-Seite, und aktivieren Sie die Lizenz, um automatische Aktualisierungen zu aktivieren."
527
+
528
+ # @ backwpup
529
+ #: ../inc/class-page-about.php:456
530
+ msgid "Save your database"
531
+ msgstr "Sichern Sie Ihre Datenbank"
532
+
533
+ # @ backwpup
534
+ #: ../inc/class-page-about.php:459
535
+ msgid "Save your database regularly"
536
+ msgstr "Sichern Sie Ihre Datenbank regelmäßig"
537
+
538
+ # @ backwpup
539
+ #: ../inc/class-page-about.php:460
540
+ #, php-format
541
+ msgid "With BackWPup you can schedule the database backup to run automatically. With a single backup file you can restore your database. You should <a href=\"%s\">set up a backup job</a>, so you will never forget it. There is also an option to repair and optimize the database after each backup."
542
+ msgstr "Mit BackWPup können Sie automatische Datenbank-Backups planen. Mit einer einzigen Backup-Datei können Sie Ihre Datenbank wiederherstellen. Sie sollten einen <a href=\\\"%s\\\">Backup-Auftrag einrichten</a>, damit Sie es nie mehr vergessen. Es gibt auch eine Option, um die Datenbank anschließend zu reparieren und zu optimieren."
543
+
544
+ # @ backwpup
545
+ #: ../inc/class-page-about.php:465
546
+ #: ../inc/class-page-about.php:469
547
+ msgid "WordPress XML Export"
548
+ msgstr "WordPress-XML-Export"
549
+
550
+ # @ backwpup
551
+ #: ../inc/class-page-about.php:466
552
+ msgid "You can choose the built-in WordPress export format in addition or exclusive to save your data. This works in automated backups too of course. The advantage is: you can import these files into a blog with the regular WordPress importer."
553
+ msgstr "Sie können das interne WordPress-Export-Format zusätzlich oder ausschließlich wählen, um Ihre Daten zu sichern. Das funktioniert natürlich auch in automatischen Backups. Der Vorteil: Sie können dieses Format mit dem normalen WordPress-Importer-Plugin importieren."
554
+
555
+ # @ backwpup
556
+ #: ../inc/class-page-about.php:474
557
+ msgid "Save all data from the webserver"
558
+ msgstr "Sichern Sie alle Daten vom Webserver"
559
+
560
+ # @ backwpup
561
+ #: ../inc/class-page-about.php:477
562
+ msgid "Save all files"
563
+ msgstr "Sichern Sie alle Dateien"
564
+
565
+ # @ backwpup
566
+ #: ../inc/class-page-about.php:478
567
+ #, php-format
568
+ msgid "You can backup all your attachments, also all system files, plugins and themes in a single file. You can <a href=\"%s\">create a job</a> to update a backup copy of your file system only when files are changed."
569
+ msgstr "Sie können all Ihre Anhänge sichern, ebenso alle Systemdateien, Plugins und Themes – in einer einzigen Datei. Sie können einen <a href=\\\"%s\\\">Auftrag erstellen</a>, um die Sicherungskopie nur dann zu aktualisieren, wenn sich tatsächlich eine Datei geändert hat."
570
+
571
+ # @ backwpup
572
+ #: ../inc/class-page-about.php:483
573
+ #: ../inc/class-page-about.php:487
574
+ msgid "Security!"
575
+ msgstr "Sicherheit!"
576
+
577
+ # @ backwpup
578
+ #: ../inc/class-page-about.php:484
579
+ msgid "By default everything is encrypted: connections to external services, local files and access to directories."
580
+ msgstr "In der Grundeinstellung ist alles verschlüsselt: Verbindungen zu externen Diensten, lokale Dateien und der Zugriff auf die Verzeichnisse."
581
+
582
+ # @ backwpup
583
+ #: ../inc/class-page-about.php:492
584
+ #: ../inc/class-page-about.php:495
585
+ msgid "Cloud Support"
586
+ msgstr "Cloud-Support"
587
+
588
+ # @ backwpup
589
+ #: ../inc/class-page-about.php:496
590
+ msgid "BackWPup supports multiple cloud services in parallel. This ensures backups are redundant."
591
+ msgstr "BackWPup unterstützt mehrere Cloud-Dienste parallel. Damit wird sichergestellt, dass Sie redundante Backups anlegen können."
592
+
593
+ # @ backwpup
594
+ #: ../inc/class-page-about.php:504
595
+ msgid "Features / differences between Free and Pro"
596
+ msgstr "Features / Unterschiede zwischen Free und Pro"
597
+
598
+ # @ backwpup
599
+ #: ../inc/class-page-about.php:507
600
+ msgid "Features"
601
+ msgstr "Features"
602
+
603
+ # @ backwpup
604
+ #: ../inc/class-page-about.php:508
605
+ msgid "FREE"
606
+ msgstr "FREE"
607
+
608
+ # @ backwpup
609
+ #: ../inc/class-page-about.php:509
610
+ msgid "PRO"
611
+ msgstr "PRO"
612
+
613
+ # @ backwpup
614
+ #: ../inc/class-page-about.php:512
615
+ msgid "Complete database backup"
616
+ msgstr "Vollständige Datenbanksicherung"
617
+
618
+ # @ backwpup
619
+ #: ../inc/class-page-about.php:517
620
+ msgid "Complete file backup"
621
+ msgstr "Vollständige Dateisicherung"
622
+
623
+ # @ backwpup
624
+ #: ../inc/class-page-about.php:522
625
+ msgid "Database check"
626
+ msgstr "Datenbanküberprüfung"
627
+
628
+ # @ backwpup
629
+ #: ../inc/class-page-about.php:527
630
+ msgid "Data compression"
631
+ msgstr "Datenbankoptimierung"
632
+
633
+ # @ backwpup
634
+ #: ../inc/class-page-about.php:532
635
+ msgid "WordPress XML export"
636
+ msgstr "WordPress XML Export"
637
+
638
+ # @ backwpup
639
+ #: ../inc/class-page-about.php:537
640
+ msgid "List of installed plugins"
641
+ msgstr "Liste installierter Plugins"
642
+
643
+ # @ backwpup
644
+ #: ../inc/class-page-about.php:542
645
+ msgid "Backup archives management"
646
+ msgstr "Verwaltung der Backup-Archive"
647
+
648
+ # @ backwpup
649
+ #: ../inc/class-page-about.php:547
650
+ msgid "Log file management"
651
+ msgstr "Verwaltung der Log-Dateien"
652
+
653
+ # @ backwpup
654
+ #: ../inc/class-page-about.php:552
655
+ msgid "Start jobs per WP-Cron, URL, system, backend or WP-CLI"
656
+ msgstr "Start der Aufträge über WP-Cron, URL, System, Backend, WP-CLI"
657
+
658
+ # @ backwpup
659
+ #: ../inc/class-page-about.php:557
660
+ msgid "Log report via email"
661
+ msgstr "Log-Report via E-Mail"
662
+
663
+ # @ backwpup
664
+ #: ../inc/class-page-about.php:562
665
+ msgid "Backup to Microsoft Azure"
666
+ msgstr "Backup zu Microsoft Azure"
667
+
668
+ # @ backwpup
669
+ #: ../inc/class-page-about.php:567
670
+ msgid "Backup as email"
671
+ msgstr "Backup per E-Mail"
672
+
673
+ # @ backwpup
674
+ #: ../inc/class-page-about.php:572
675
+ msgid "Backup to S3 services <small>(Amazon, Google Storage, Hosteurope and more)</small>"
676
+ msgstr "Backup zu S3-Dienstleistern <small>(Amazon, Google Storage, Hosteurope, usw)</small>"
677
+
678
+ # @ backwpup
679
+ #: ../inc/class-page-about.php:587
680
+ msgid "Backup to FTP server"
681
+ msgstr "Backup auf FTP-Server"
682
+
683
+ # @ backwpup
684
+ #: ../inc/class-page-about.php:592
685
+ msgid "Backup to your web space"
686
+ msgstr "Backup auf eigenem Webspace"
687
+
688
+ # @ backwpup
689
+ #: ../inc/class-page-about.php:602
690
+ msgid "Backup to Google Drive"
691
+ msgstr "Backup zu Google Drive"
692
+
693
+ # @ backwpup
694
+ #: ../inc/class-page-about.php:607
695
+ msgid "Backup to Amazon Glacier"
696
+ msgstr "Backup zu Amazon Glacier"
697
+
698
+ # @ backwpup
699
+ #: ../inc/class-page-about.php:612
700
+ msgid "Custom API keys for DropBox and SugarSync"
701
+ msgstr "Eigene API-Keys für DropBox und SugarSync hinterlegen"
702
+
703
+ # @ backwpup
704
+ #: ../inc/class-page-about.php:617
705
+ msgid "XML database backup as PHPMyAdmin schema"
706
+ msgstr "XML-Datenbanksicherung der Datenbank nach PHPMyAdmin-Schema"
707
+
708
+ # @ backwpup
709
+ #: ../inc/class-page-about.php:622
710
+ msgid "Database backup as mysqldump per command line"
711
+ msgstr "Datenbanksicherung mit System-Kommando mysqldump"
712
+
713
+ # @ backwpup
714
+ #: ../inc/class-page-about.php:627
715
+ msgid "Database backup for additional MySQL databases"
716
+ msgstr "Datenbanksicherung weiterer MySQL-Datenbanken"
717
+
718
+ # @ backwpup
719
+ #: ../inc/class-page-about.php:632
720
+ msgid "Import and export job settings as XML"
721
+ msgstr "Auftragseinstellungen als XML ex- und importieren"
722
+
723
+ # @ backwpup
724
+ #: ../inc/class-page-about.php:637
725
+ msgid "Wizard for system tests"
726
+ msgstr "Assistent zur Ausführung eines Systemtests"
727
+
728
+ # @ backwpup
729
+ #: ../inc/class-page-about.php:642
730
+ msgid "Wizard for scheduled backup jobs"
731
+ msgstr "Assistent zur Einrichtung von Sicherungsaufträgen"
732
+
733
+ # @ backwpup
734
+ #: ../inc/class-page-about.php:647
735
+ msgid "Wizard to import settings and backup jobs"
736
+ msgstr "Assistent zum Importieren von Einstellungen und Aufträgen"
737
+
738
+ # @ backwpup
739
+ #: ../inc/class-page-about.php:652
740
+ msgid "Differential backup of changed directories to Dropbox"
741
+ msgstr "Sicherung geänderter Verzeichnisse in einer Dropbox"
742
+
743
+ # @ backwpup
744
+ #: ../inc/class-page-about.php:657
745
+ msgid "Differential backup of changed directories to Rackspace Cloud Files"
746
+ msgstr "Sicherung geänderter Verzeichnisse nach Rackspace Cloud Files"
747
+
748
+ # @ backwpup
749
+ #: ../inc/class-page-about.php:662
750
+ msgid "Differential backup of changed directories to S3"
751
+ msgstr "Sicherung geänderter Verzeichnisse nach S3"
752
+
753
+ # @ backwpup
754
+ #: ../inc/class-page-about.php:667
755
+ msgid "Differential backup of changed directories to MS Azure"
756
+ msgstr "Sicherung geänderter Verzeichnisse nach MS Azure"
757
+
758
+ # @ backwpup
759
+ #: ../inc/class-page-about.php:672
760
+ msgid "<strong>Premium support</strong>"
761
+ msgstr "<strong>Premium-Support</strong>"
762
+
763
+ # @ backwpup
764
+ #: ../inc/class-page-about.php:677
765
+ msgid "<strong>Dynamically loaded documentation</strong>"
766
+ msgstr "<strong>Integration einer dynamischen Dokumentation</strong>"
767
+
768
+ # @ backwpup
769
+ #: ../inc/class-page-about.php:682
770
+ msgid "<strong>Automatic update from MarketPress</strong>"
771
+ msgstr "<strong>Automatische Aktualisierung durch MarketPress</strong>"
772
+
773
+ # @ backwpup
774
+ #: ../inc/class-page-about.php:689
775
+ msgid "http://marketpress.com/product/backwpup-pro/"
776
+ msgstr "http://marketpress.de/product/backwpup-pro/"
777
+
778
+ # @ backwpup
779
+ #: ../inc/class-page-about.php:689
780
+ msgid "GET PRO"
781
+ msgstr "GET PRO"
782
+
783
+ # @ backwpup
784
+ #: ../inc/class-install.php:71
785
+ msgid "BackWPup Admin"
786
+ msgstr "BackWPup Admin"
787
+
788
+ # @ backwpup
789
+ #: ../inc/class-install.php:84
790
+ msgid "BackWPup jobs checker"
791
+ msgstr "BackWPup Auftragsprüfung"
792
+
793
+ # @ backwpup
794
+ #: ../inc/class-install.php:97
795
+ msgid "BackWPup jobs helper"
796
+ msgstr "BackWPup Auftragshelfer"
797
+
798
+ # @ backwpup
799
+ #: ../inc/class-help.php:15
800
+ msgid "Plugin Info"
801
+ msgstr "Plugin Info"
802
+
803
+ # @ backwpup
804
+ #: ../inc/class-help.php:17
805
+ #, php-format
806
+ msgctxt "Plugin name and link; Plugin Version"
807
+ msgid "%1$s version %2$s. A project by <a href=\"http://inpsyde.com\">Inpsyde GmbH</a>."
808
+ msgstr "%1$s Version %2$s. Ein Projekt von <a href=\"http://inpsyde.com\">Inpsyde GmbH</a>."
809
+
810
+ # @ backwpup
811
+ #: ../inc/class-help.php:18
812
+ msgid "BackWPup comes with ABSOLUTELY NO WARRANTY. This is a free software, and you are welcome to redistribute it under certain conditions."
813
+ msgstr "BackWPup erhalten Sie OHNE JEDWEDE GARANTIE. Dies ist freie Software (quelloffen, im Sinne von Open Source) und Sie sind eingeladen, sie unter bestimmten Bedingungen weiterzugeben."
814
+
815
+ # @ backwpup
816
+ #: ../inc/class-help.php:21
817
+ msgid "For more information:"
818
+ msgstr "Für weitere Informationen:"
819
+
820
+ # @ backwpup
821
+ #: ../inc/class-help.php:23
822
+ msgid "Plugin on wordpress.org"
823
+ msgstr "Plugin auf wordpress.org"
824
+
825
+ # @ backwpup
826
+ #: ../inc/class-help.php:24
827
+ msgid "https://marketpress.com/news/"
828
+ msgstr "https://marketpress.de/news/"
829
+
830
+ # @ backwpup
831
+ #: ../inc/class-help.php:24
832
+ msgid "News"
833
+ msgstr "Neuigkeiten"
834
+
835
+ # @ backwpup
836
+ #: ../inc/class-help.php:26
837
+ msgid "https://marketpress.com/support/forum/plugins/backwpup-pro/"
838
+ msgstr "https://marketpress.de/support/forum/plugins/backwpup-pro/"
839
+
840
+ # @ backwpup
841
+ #: ../inc/class-help.php:26
842
+ msgid "Pro Support"
843
+ msgstr "Pro-Support"
844
+
845
+ # @ backwpup
846
+ #: ../inc/class-help.php:28
847
+ msgid "http://wordpress.org/support/plugin/backwpup/"
848
+ msgstr "http://wordpress.org/support/plugin/backwpup/"
849
+
850
+ # @ backwpup
851
+ #: ../inc/class-help.php:28
852
+ msgid "Support"
853
+ msgstr "Support"
854
+
855
+ # @ backwpup
856
+ #: ../inc/class-help.php:29
857
+ msgid "https://marketpress.com/documentation/backwpup-pro/"
858
+ msgstr "https://marketpress.de/dokumentation/backwpup-pro/"
859
+
860
+ # @ backwpup
861
+ #: ../inc/class-help.php:29
862
+ msgid "Manual"
863
+ msgstr "Handbuch"
864
+
865
+ # @ backwpup
866
+ #: ../inc/class-destination-ftp.php:23
867
+ msgid "FTP server and login"
868
+ msgstr "FTP-Server und -Anmeldung"
869
+
870
+ # @ backwpup
871
+ #: ../inc/class-destination-ftp.php:27
872
+ msgid "FTP server"
873
+ msgstr "FTP-Server"
874
+
875
+ # @ backwpup
876
+ #: ../inc/class-destination-ftp.php:31
877
+ msgid "Port:"
878
+ msgstr "Port:"
879
+
880
+ # @ backwpup
881
+ #: ../inc/class-destination-ftp.php:37
882
+ msgid "Username"
883
+ msgstr "Benutzername"
884
+
885
+ # @ backwpup
886
+ #: ../inc/class-destination-ftp.php:44
887
+ msgid "Password"
888
+ msgstr "Passwort"
889
+
890
+ # @ backwpup
891
+ #: ../inc/class-destination-ftp.php:56
892
+ msgid "Folder to store files in"
893
+ msgstr "Order für Dateien"
894
+
895
+ # @ backwpup
896
+ #: ../inc/class-destination-ftp.php:68
897
+ msgid "Maximum number of files to keep in folder."
898
+ msgstr "Maximale Anzahl von Dateien im Ordner."
899
+
900
+ # @ backwpup
901
+ #: ../inc/class-destination-ftp.php:78
902
+ msgid "FTP specific settings"
903
+ msgstr "FTP-Einstellungen"
904
+
905
+ # @ backwpup
906
+ #: ../inc/class-destination-ftp.php:82
907
+ msgid "Timeout for FTP connection"
908
+ msgstr "Zeitüberschreitung bei der FTP-Verbindung"
909
+
910
+ # @ backwpup
911
+ #: ../inc/class-destination-ftp.php:86
912
+ msgid "seconds"
913
+ msgstr "Sekunden"
914
+
915
+ # @ backwpup
916
+ #: ../inc/class-destination-ftp.php:90
917
+ msgid "SSL-FTP connection"
918
+ msgstr "SSL-FTP-Verbindung"
919
+
920
+ # @ backwpup
921
+ #: ../inc/class-destination-ftp.php:94
922
+ msgid "Use explicit SSL-FTP connection."
923
+ msgstr "Nutze explizit SSL-FTP Verbindung"
924
+
925
+ # @ backwpup
926
+ #: ../inc/class-destination-ftp.php:99
927
+ msgid "FTP Passive Mode"
928
+ msgstr "FTP-Passivmodus"
929
+
930
+ # @ backwpup
931
+ #: ../inc/class-destination-ftp.php:103
932
+ msgid "Use FTP Passive Mode."
933
+ msgstr "Nutze FTP-Passivmodus"
934
+
935
+ # @ backwpup
936
+ #: ../inc/class-destination-ftp.php:179
937
+ msgid "FTP: Login failure!"
938
+ msgstr "FTP: Anmeldung fehlgeschlagen!"
939
+
940
+ # @ backwpup
941
+ #: ../inc/class-destination-ftp.php:203
942
+ #, php-format
943
+ msgid "%d. Try to send backup file to an FTP server&#160;&hellip;"
944
+ msgstr "%d. Versuche, Backup an FTP-Server zu senden&#160;&hellip;"
945
+
946
+ # @ backwpup
947
+ #: ../inc/class-destination-ftp.php:209
948
+ #, php-format
949
+ msgid "Connected via explicit SSL-FTP to server: %s"
950
+ msgstr "Durch explizite SSL-FTP-Verbindung zum Server verbunden: %s"
951
+
952
+ # @ backwpup
953
+ #: ../inc/class-destination-ftp.php:211
954
+ #, php-format
955
+ msgid "Cannot connect via explicit SSL-FTP to server: %s"
956
+ msgstr "Kann nicht mit explizit SSL-FTP zum Server verbinden: %s"
957
+
958
+ # @ backwpup
959
+ #: ../inc/class-destination-ftp.php:217
960
+ msgid "PHP function to connect with explicit SSL-FTP to server does not exist!"
961
+ msgstr "PHP-Funktion für die Verbindung mit explizit SSL-FTP zum Server existiert nicht!"
962
+
963
+ # @ backwpup
964
+ #: ../inc/class-destination-ftp.php:225
965
+ #, php-format
966
+ msgid "Connected to FTP server: %s"
967
+ msgstr "Verbunden mit dem FTP-Server: %s"
968
+
969
+ # @ backwpup
970
+ #: ../inc/class-destination-ftp.php:227
971
+ #, php-format
972
+ msgid "Cannot connect to FTP server: %s"
973
+ msgstr "Kann nicht mit dem FTP-Server verbinden: %s"
974
+
975
+ # @ backwpup
976
+ #: ../inc/class-destination-ftp.php:234
977
+ #: ../inc/class-destination-ftp.php:242
978
+ #: ../inc/class-destination-ftp.php:253
979
+ #: ../inc/class-destination-ftp.php:300
980
+ #, php-format
981
+ msgid "FTP client command: %s"
982
+ msgstr "FTP-Client-Befehl: %s"
983
+
984
+ # @ backwpup
985
+ #: ../inc/class-destination-ftp.php:236
986
+ #, php-format
987
+ msgid "FTP server response: %s"
988
+ msgstr "FTP-Server Antwort: %s"
989
+
990
+ # @ backwpup
991
+ #: ../inc/class-destination-ftp.php:240
992
+ #: ../inc/class-destination-ftp.php:244
993
+ #: ../inc/class-destination-ftp.php:256
994
+ #: ../inc/class-destination-ftp.php:258
995
+ #: ../inc/class-destination-ftp.php:303
996
+ #: ../inc/class-destination-ftp.php:305
997
+ #: ../inc/class-destination-ftp.php:309
998
+ #: ../inc/class-destination-ftp.php:311
999
+ #, php-format
1000
+ msgid "FTP server reply: %s"
1001
+ msgstr "Antwort des FTP-Servers: %s"
1002
+
1003
+ # @ backwpup
1004
+ #: ../inc/class-destination-ftp.php:258
1005
+ msgid "Error getting SYSTYPE"
1006
+ msgstr "Fehler, SYSTYPE wird angezeigt"
1007
+
1008
+ # @ backwpup
1009
+ #: ../inc/class-destination-ftp.php:276
1010
+ #, php-format
1011
+ msgid "FTP Folder \"%s\" created!"
1012
+ msgstr "FTP-Ordner \"%s\" erstellt!"
1013
+
1014
+ # @ backwpup
1015
+ #: ../inc/class-destination-ftp.php:280
1016
+ #, php-format
1017
+ msgid "FTP Folder \"%s\" cannot be created!"
1018
+ msgstr "FTP-Ordner \"%s\" kann nicht erstellt werden!"
1019
+
1020
+ # @ backwpup
1021
+ #: ../inc/class-destination-ftp.php:291
1022
+ #, php-format
1023
+ msgid "FTP current folder is: %s"
1024
+ msgstr "Aktueller FTP-Ordner ist: %s"
1025
+
1026
+ # @ backwpup
1027
+ #: ../inc/class-destination-ftp.php:303
1028
+ msgid "Entering passive mode"
1029
+ msgstr "Passivmodus gestartet"
1030
+
1031
+ # @ backwpup
1032
+ #: ../inc/class-destination-ftp.php:305
1033
+ msgid "Cannot enter passive mode"
1034
+ msgstr "Starten des passiven Modus’ nicht möglich"
1035
+
1036
+ # @ backwpup
1037
+ #: ../inc/class-destination-ftp.php:309
1038
+ msgid "Entering normal mode"
1039
+ msgstr "Starte Normalmodus"
1040
+
1041
+ # @ backwpup
1042
+ #: ../inc/class-destination-ftp.php:311
1043
+ msgid "Cannot enter normal mode"
1044
+ msgstr "Normalmodus kann nicht gestartet werden"
1045
+
1046
+ # @ backwpup
1047
+ #: ../inc/class-destination-ftp.php:315
1048
+ msgid "Starting upload to FTP &#160;&hellip;"
1049
+ msgstr "Hochladen ins FTP-Verzeichnis hat begonnen&#160;&hellip;"
1050
+
1051
+ # @ backwpup
1052
+ #: ../inc/class-destination-ftp.php:327
1053
+ msgid "Cannot transfer backup to FTP server!"
1054
+ msgstr "Backup kann nicht zum FTP-Server übertragen werden!"
1055
+
1056
+ # @ backwpup
1057
+ #: ../inc/class-destination-ftp.php:333
1058
+ #, php-format
1059
+ msgid "Backup transferred to FTP server: %s"
1060
+ msgstr "Backup Archiv übertragen zum FTP-Server: %s"
1061
+
1062
+ # @ backwpup
1063
+ #: ../inc/class-destination-ftp.php:379
1064
+ #, php-format
1065
+ msgid "Cannot delete \"%s\" on FTP server!"
1066
+ msgstr "Kann \"%s\" auf dem FTP-Server nicht löschen!"
1067
+
1068
+ # @ backwpup
1069
+ #: ../inc/class-destination-ftp.php:382
1070
+ #, php-format
1071
+ msgid "One file deleted on FTP server"
1072
+ msgid_plural "%d files deleted on FTP server"
1073
+ msgstr[0] "Eine Datei vom FTP-Server gelöscht"
1074
+ msgstr[1] "%d Dateien vom FTP-Server gelöscht"
1075
+
1076
+ # @ backwpup
1077
+ #: ../inc/class-jobtype-file.php:15
1078
+ msgid "Files"
1079
+ msgstr "Dateien"
1080
+
1081
+ # @ backwpup
1082
+ #: ../inc/class-jobtype-file.php:16
1083
+ msgid "File backup"
1084
+ msgstr "Dateien Backup"
1085
+
1086
+ # @ backwpup
1087
+ #: ../inc/class-jobtype-file.php:64
1088
+ msgid "Folders to backup"
1089
+ msgstr "Zu sichernde Verzeichnisse"
1090
+
1091
+ # @ backwpup
1092
+ #: ../inc/class-jobtype-file.php:68
1093
+ msgid "Backup root folder"
1094
+ msgstr "Root Verzeichnis sichern"
1095
+
1096
+ # @ backwpup
1097
+ #: ../inc/class-jobtype-file.php:79
1098
+ #: ../inc/class-jobtype-file.php:116
1099
+ #: ../inc/class-jobtype-file.php:153
1100
+ #: ../inc/class-jobtype-file.php:190
1101
+ #: ../inc/class-jobtype-file.php:227
1102
+ #, php-format
1103
+ msgid "Path as set by user (symlink?): %s"
1104
+ msgstr "Pfad, wie vom User gesetzt (symlink?): %s"
1105
+
1106
+ # @ backwpup
1107
+ #: ../inc/class-jobtype-file.php:82
1108
+ #: ../inc/class-jobtype-file.php:119
1109
+ #: ../inc/class-jobtype-file.php:156
1110
+ #: ../inc/class-jobtype-file.php:193
1111
+ #: ../inc/class-jobtype-file.php:230
1112
+ msgid "Exclude:"
1113
+ msgstr "Ausschließen:"
1114
+
1115
+ # @ backwpup
1116
+ #: ../inc/class-jobtype-file.php:93
1117
+ #: ../inc/class-jobtype-file.php:130
1118
+ #: ../inc/class-jobtype-file.php:167
1119
+ #: ../inc/class-jobtype-file.php:204
1120
+ #: ../inc/class-jobtype-file.php:241
1121
+ msgid "Excluded by .donotbackup file!"
1122
+ msgstr "Ausgeschlossen durch .donotbackup Datei!"
1123
+
1124
+ # @ backwpup
1125
+ #: ../inc/class-jobtype-file.php:105
1126
+ msgid "Backup content folder"
1127
+ msgstr "Sicherung des Content Verzeichnisses"
1128
+
1129
+ # @ backwpup
1130
+ #: ../inc/class-jobtype-file.php:142
1131
+ msgid "Backup plugins"
1132
+ msgstr "Plugins sichern"
1133
+
1134
+ # @ backwpup
1135
+ #: ../inc/class-jobtype-file.php:179
1136
+ msgid "Backup themes"
1137
+ msgstr "Themes sichern"
1138
+
1139
+ # @ backwpup
1140
+ #: ../inc/class-jobtype-file.php:216
1141
+ msgid "Backup uploads folder"
1142
+ msgstr "Uploads Verzeichnis sichern"
1143
+
1144
+ # @ backwpup
1145
+ #: ../inc/class-jobtype-file.php:253
1146
+ msgid "Extra folders to backup"
1147
+ msgstr "Weitere Verzeichnisse sichern"
1148
+
1149
+ # @ backwpup
1150
+ #: ../inc/class-jobtype-file.php:260
1151
+ msgid "Exclude from backup"
1152
+ msgstr "Nicht mitsichern"
1153
+
1154
+ # @ backwpup
1155
+ #: ../inc/class-jobtype-file.php:264
1156
+ msgid "Thumbnails in uploads"
1157
+ msgstr "Thumbnails in uploads"
1158
+
1159
+ # @ backwpup
1160
+ #: ../inc/class-jobtype-file.php:268
1161
+ msgid "Don't backup thumbnails from the site's uploads folder."
1162
+ msgstr "Thumbnails im Uploads-Verzeichnis der Website nicht mitsichern."
1163
+
1164
+ # @ backwpup
1165
+ #: ../inc/class-jobtype-file.php:268
1166
+ msgid "All images with -???x???. will be excluded. Use a plugin like Regenerate Thumbnails to rebuild them after a restore."
1167
+ msgstr "Alle Bilder mit -???x??? im Dateinamen werden nicht mitgesichert. Benutze ein Plugin wir Regenerate Thumbnails um die Thumbnails wiederherzustellen."
1168
+
1169
+ # @ backwpup
1170
+ #: ../inc/class-jobtype-file.php:272
1171
+ msgid "Exclude files/folders from backup"
1172
+ msgstr "Datein/Verzeichnisse nicht mitsichern."
1173
+
1174
+ # @ backwpup
1175
+ #: ../inc/class-jobtype-file.php:279
1176
+ msgid "Special option"
1177
+ msgstr "Spezialoption"
1178
+
1179
+ # @ backwpup
1180
+ #: ../inc/class-jobtype-file.php:283
1181
+ msgid "Include special files"
1182
+ msgstr "Spezielle Dateien einschließen"
1183
+
1184
+ # @ backwpup
1185
+ #: ../inc/class-jobtype-file.php:287
1186
+ msgid "Backup wp-config.php, robots.txt, .htaccess, .htpasswd and favicon.ico from root."
1187
+ msgstr "Sichere wp-config.php, robots.txt, .htaccess, .htpasswd und favicon.ico vom Root"
1188
+
1189
+ # @ backwpup
1190
+ #: ../inc/class-jobtype-file.php:287
1191
+ msgid "If the WordPress root folder is not included in this backup job, check this option to additionally include wp-config.php, robots.txt, .htaccess, .htpasswd and favicon.ico into the backup. Your wp-config.php will be included even if you placed it in the parent directory of your root folder."
1192
+ msgstr "Sofern das WordPress-Wurzelverzeichnis nicht sowieso im Backup inkludiert ist, aktiviere diese Option, um zusätzlich die Dateien wp-config.php, robots.txt, .htaccess, .htpasswd und favicon.ico mitzusichern. Die wp-config-php-Datei wird in diesem Fall auch dann mitgesichert, wenn sie sich eine Ordner-Ebene höher als WordPress befindet."
1193
+
1194
+ # @ backwpup
1195
+ #: ../inc/class-jobtype-file.php:364
1196
+ #, php-format
1197
+ msgid "%d. Trying to make a list of folders to back up&#160;&hellip;"
1198
+ msgstr "%d. Versuche, eine Liste der Ordner für das Backup zu erstellen&#160;&hellip;"
1199
+
1200
+ # @ backwpup
1201
+ #: ../inc/class-jobtype-file.php:483
1202
+ #: ../inc/class-jobtype-file.php:490
1203
+ #: ../inc/class-jobtype-file.php:497
1204
+ #: ../inc/class-jobtype-file.php:503
1205
+ #: ../inc/class-jobtype-file.php:509
1206
+ #: ../inc/class-jobtype-file.php:515
1207
+ #, php-format
1208
+ msgid "Added \"%s\" to backup file list"
1209
+ msgstr "\"%s\" zur Backup-Datei-Liste hinzugefügt."
1210
+
1211
+ # @ backwpup
1212
+ #: ../inc/class-jobtype-file.php:520
1213
+ msgid "No files/folder for the backup."
1214
+ msgstr "Keine Dateien/Ordner für das Backup."
1215
+
1216
+ # @ backwpup
1217
+ #: ../inc/class-jobtype-file.php:522
1218
+ #, php-format
1219
+ msgid "%1$d folders to backup."
1220
+ msgstr "%1$d Ordner für Backup."
1221
+
1222
+ # @ backwpup
1223
+ #: ../inc/class-jobtype-file.php:561
1224
+ #, php-format
1225
+ msgid "Folder \"%s\" is not readable!"
1226
+ msgstr "Ordner \"%s\" ist nicht lesbar!"
1227
+
1228
+ # @ backwpup
1229
+ #: ../inc/class-create-archive.php:71
1230
+ msgid "The file name of an archive cannot be empty."
1231
+ msgstr "Der Dateiname eines Archivs kann nicht leer sein."
1232
+
1233
+ # @ backwpup
1234
+ #: ../inc/class-create-archive.php:79
1235
+ #, php-format
1236
+ msgctxt "%s = Folder name"
1237
+ msgid "Folder %s for archive not found"
1238
+ msgstr "Ordner %s für Archiv nicht gefunden"
1239
+
1240
+ # @ backwpup
1241
+ #: ../inc/class-create-archive.php:85
1242
+ #: ../inc/class-create-archive.php:120
1243
+ #: ../inc/class-create-archive.php:137
1244
+ #: ../inc/class-mysqldump.php:125
1245
+ msgid "Functions for gz compression not available"
1246
+ msgstr "Die Funktionen für die Gzip-Kompression sind nicht verfügbar."
1247
+
1248
+ # @ backwpup
1249
+ #: ../inc/class-create-archive.php:92
1250
+ #: ../inc/class-create-archive.php:143
1251
+ msgid "Functions for bz2 compression not available"
1252
+ msgstr "Die Funktionen für die Bz2-Kompression sind nicht verfügbar."
1253
+
1254
+ # @ backwpup
1255
+ #: ../inc/class-create-archive.php:116
1256
+ #, php-format
1257
+ msgctxt "ZipArchive open() result"
1258
+ msgid "Cannot create zip archive: %d"
1259
+ msgstr "Konte ZIP-Datei %d nicht erstellen"
1260
+
1261
+ # @ backwpup
1262
+ #: ../inc/class-create-archive.php:149
1263
+ #, php-format
1264
+ msgctxt "%s = file name"
1265
+ msgid "Method to archive file %s not detected"
1266
+ msgstr "Methode zum Archivieren der Datei %s nicht gefunden"
1267
+
1268
+ # @ backwpup
1269
+ #: ../inc/class-create-archive.php:154
1270
+ msgid "Cannot open archive file"
1271
+ msgstr "Kann Archivdatei nicht öffnen"
1272
+
1273
+ # @ backwpup
1274
+ #: ../inc/class-create-archive.php:174
1275
+ #: ../inc/class-create-archive.php:349
1276
+ #, php-format
1277
+ msgid "PclZip archive add error: %s"
1278
+ msgstr "Fehler beim Hinzufügen zum PclZip-Archive: %s"
1279
+
1280
+ # @ backwpup
1281
+ #: ../inc/class-create-archive.php:189
1282
+ msgid "ZIP archive cannot be closed correctly."
1283
+ msgstr "ZIP-Archiv kann nicht korrekt geschlossen werden."
1284
+
1285
+ # @ backwpup
1286
+ #: ../inc/class-create-archive.php:244
1287
+ msgid "File name cannot be empty"
1288
+ msgstr "Der Dateiname kann nicht leer sein."
1289
+
1290
+ # @ backwpup
1291
+ #: ../inc/class-create-archive.php:253
1292
+ #, php-format
1293
+ msgctxt "File to add to archive"
1294
+ msgid "File %s does not exist or is not readable"
1295
+ msgstr "Datei %s existiert nicht oder ist nicht lesbar"
1296
+
1297
+ # @ backwpup
1298
+ #: ../inc/class-create-archive.php:266
1299
+ #: ../inc/class-create-archive.php:282
1300
+ #: ../inc/class-create-archive.php:392
1301
+ #: ../inc/class-create-archive.php:396
1302
+ msgid "This archive method can only add one file"
1303
+ msgstr "Diese Archive-Methode kann nur eine einziges Datei sichern."
1304
+
1305
+ # @ backwpup
1306
+ #: ../inc/class-create-archive.php:271
1307
+ #: ../inc/class-create-archive.php:287
1308
+ #, php-format
1309
+ msgid "Cannot open source file %s to archive"
1310
+ msgstr "Konnte Quelle %s zum Archivieren nicht öffnen"
1311
+
1312
+ # @ backwpup
1313
+ #: ../inc/class-create-archive.php:311
1314
+ msgid "ZipArchive can not closed correctly"
1315
+ msgstr "ZIP-Archive kann nicht korrekt geschlossen werden"
1316
+
1317
+ # @ backwpup
1318
+ #: ../inc/class-create-archive.php:330
1319
+ #: ../inc/class-create-archive.php:338
1320
+ #: ../inc/class-create-archive.php:407
1321
+ #, php-format
1322
+ msgid "Cannot add \"%s\" to zip archive!"
1323
+ msgstr "\"%s\" kann dem ZIP-Archiv nicht hinzugefügt werden!"
1324
+
1325
+ # @ backwpup
1326
+ #: ../inc/class-create-archive.php:374
1327
+ msgid "Folder name cannot be empty"
1328
+ msgstr "Der Verzeichnis Name darf nicht leer sein"
1329
+
1330
+ # @ backwpup
1331
+ #: ../inc/class-create-archive.php:379
1332
+ #, php-format
1333
+ msgctxt "Folder path to add to archive"
1334
+ msgid "Folder %s does not exist or is not readable"
1335
+ msgstr "Verzeichnis %s existiert nicht oder ist nicht lesbar"
1336
+
1337
+ # @ backwpup
1338
+ #: ../inc/class-create-archive.php:429
1339
+ #, php-format
1340
+ msgctxt "Text of ZipArchive status Message"
1341
+ msgid "ZipArchive returns status: %s"
1342
+ msgstr "Das Zip-Archive liefert den Status: %s"
1343
+
1344
+ # @ backwpup
1345
+ #: ../inc/class-create-archive.php:459
1346
+ #, php-format
1347
+ msgid "File name \"%1$s\" is too long to be saved correctly in %2$s archive!"
1348
+ msgstr "Dateiname \"%1$s\" ist zu lang, um korrekt im %2$s Archiv zu speichern."
1349
+
1350
+ # @ backwpup
1351
+ #: ../inc/class-create-archive.php:462
1352
+ #, php-format
1353
+ msgid "File path \"%1$s\" is too long to be saved correctly in %2$s archive!"
1354
+ msgstr "Dateipfad \"%1$s\" ist zu lang, um korrekt in %2$s Archiv zu speichern"
1355
+
1356
+ # @ backwpup
1357
+ #: ../inc/class-create-archive.php:474
1358
+ #, php-format
1359
+ msgid "Cannot open source file %s for archiving"
1360
+ msgstr "Kann Quelldatei %s nicht zum Archivieren öffnen"
1361
+
1362
+ # @ backwpup
1363
+ #: ../inc/class-create-archive.php:479
1364
+ #: ../inc/class-create-archive.php:480
1365
+ #: ../inc/class-create-archive.php:579
1366
+ #: ../inc/class-create-archive.php:580
1367
+ msgid "Unknown"
1368
+ msgstr "Unbekannt"
1369
+
1370
+ # @ backwpup
1371
+ #: ../inc/class-create-archive.php:570
1372
+ #, php-format
1373
+ msgid "Folder name \"%1$s\" is too long to be saved correctly in %2$s archive!"
1374
+ msgstr "Verzeichnis Name \"%1$s\" ist zu lang um ihn koreckt zu speichern im %2$s Archiv"
1375
+
1376
+ # @ backwpup
1377
+ #: ../inc/class-create-archive.php:573
1378
+ #, php-format
1379
+ msgid "Folder path \"%1$s\" is too long to be saved correctly in %2$s archive!"
1380
+ msgstr "Verzeichnis Pfad \"%1$s\" ist zu lang um ihn koreckt zu speichern im %2$s Archiv"
1381
+
1382
+ # @ backwpup
1383
+ #: ../inc/class-create-archive.php:651
1384
+ #, php-format
1385
+ msgid "If %s will be added to your backup archive, the archive will be too large for many file systems (over 2GB). You might want to consider splitting the backup job in multiple jobs with less files each."
1386
+ msgstr "Wenn %s zu deinem Backup-Archiv hinzugefügt wird, wird das Archiv zu groß für etliche Dateisysteme (über 2GB). Vielleicht möchtest du den Backup-Auftrag in mehrere Aufträge mit jeweils weniger Dateien splitten?"
1387
+
1388
+ # @ backwpup
1389
+ #: ../inc/class-cron.php:62
1390
+ msgid "Aborted, because no progress for one hour!"
1391
+ msgstr "Abgebrochen, aufgrund keines Fortschrittes innerhalb der letzten Stunde!"
1392
+
1393
+ # @ backwpup
1394
+ #: ../inc/class-page-backups.php:173
1395
+ msgid "No files could be found. (List will be generated during next backup.)"
1396
+ msgstr "Keine Dateien gefunden. (Liste wird beim nächsten Backup generiert.)"
1397
+
1398
+ # @ backwpup
1399
+ #: ../inc/class-page-backups.php:185
1400
+ #: ../inc/class-page-backups.php:304
1401
+ #: ../inc/class-page-logs.php:114
1402
+ #: ../inc/class-page-logs.php:192
1403
+ msgid "Delete"
1404
+ msgstr "Löschen"
1405
+
1406
+ # @ backwpup
1407
+ #: ../inc/class-page-backups.php:219
1408
+ msgid "Change destination"
1409
+ msgstr "Ziel ändern"
1410
+
1411
+ # @ backwpup
1412
+ #: ../inc/class-page-backups.php:258
1413
+ #: ../inc/class-page-logs.php:125
1414
+ msgid "Time"
1415
+ msgstr "Zeit"
1416
+
1417
+ # @ backwpup
1418
+ #: ../inc/class-page-backups.php:259
1419
+ msgid "File"
1420
+ msgstr "Datei"
1421
+
1422
+ # @ backwpup
1423
+ #: ../inc/class-page-backups.php:261
1424
+ #: ../inc/class-page-logs.php:129
1425
+ msgid "Size"
1426
+ msgstr "Größe"
1427
+
1428
+ # @ backwpup
1429
+ #: ../inc/class-page-backups.php:304
1430
+ msgid ""
1431
+ "You are about to delete this backup archive. \n"
1432
+ " 'Cancel' to stop, 'OK' to delete."
1433
+ msgstr ""
1434
+ "Sie sind dabei dieses Backup Archiv zu löschen. \n"
1435
+ " 'Abbrechen' um zu stoppen, 'OK' um zu löschen."
1436
+
1437
+ # @ backwpup
1438
+ #: ../inc/class-page-backups.php:306
1439
+ #: ../inc/class-page-logs.php:193
1440
+ msgid "Download"
1441
+ msgstr "Herunterladen"
1442
+
1443
+ # @ backwpup
1444
+ #: ../inc/class-page-backups.php:335
1445
+ msgid "?"
1446
+ msgstr "?"
1447
+
1448
+ # @ backwpup
1449
+ #: ../inc/class-page-backups.php:348
1450
+ #: ../inc/class-page-logs.php:153
1451
+ #, php-format
1452
+ msgid "%1$s at %2$s"
1453
+ msgstr "%1$s um %2$s"
1454
+
1455
+ # @ backwpup
1456
+ #: ../inc/class-page-backups.php:365
1457
+ #: ../inc/class-page-backups.php:392
1458
+ msgid "Sorry, you don't have permissions to do that."
1459
+ msgstr "Sie haben nicht die notwendigen Berechtigungen für diese Aktion."
1460
+
1461
+ # @ backwpup
1462
+ #: ../inc/class-page-backups.php:413
1463
+ msgid "Backup Files"
1464
+ msgstr "Backup-Dateien"
1465
+
1466
+ # @ backwpup
1467
+ #: ../inc/class-page-backups.php:461
1468
+ #, php-format
1469
+ msgid "%s Manage Backup Archives"
1470
+ msgstr "%s Sicherungsarchive verwalten"
1471
+
1472
+ # @ backwpup
1473
+ #: ../inc/class-wp-cli.php:17
1474
+ msgid "A job is already running."
1475
+ msgstr "Ein Auftrag läuft gerade."
1476
+
1477
+ # @ backwpup
1478
+ #: ../inc/class-wp-cli.php:20
1479
+ msgid "No job ID specified!"
1480
+ msgstr "Keine Auftragsnummer angegeben!"
1481
+
1482
+ # @ backwpup
1483
+ #: ../inc/class-wp-cli.php:24
1484
+ msgid "Job ID does not exist!"
1485
+ msgstr "Auftragsnummer existiert nicht!"
1486
+
1487
+ # @ backwpup
1488
+ #: ../inc/class-wp-cli.php:38
1489
+ msgid "Nothing to abort!"
1490
+ msgstr "Es gibt nichts abzubrechen!"
1491
+
1492
+ # @ backwpup
1493
+ #: ../inc/class-wp-cli.php:42
1494
+ msgid "Job will be terminated."
1495
+ msgstr "Auftrag wird beendet."
1496
+
1497
+ # @ backwpup
1498
+ #: ../inc/class-wp-cli.php:54
1499
+ msgid "List of jobs"
1500
+ msgstr "Auftragsliste"
1501
+
1502
+ # @ backwpup
1503
+ #: ../inc/class-wp-cli.php:57
1504
+ #: ../inc/class-wp-cli.php:76
1505
+ #, php-format
1506
+ msgid "ID: %1$d Name: %2$s"
1507
+ msgstr "ID: %1$d Name: %2$s"
1508
+
1509
+ # @ backwpup
1510
+ #: ../inc/class-wp-cli.php:73
1511
+ msgid "No job running"
1512
+ msgstr "Kein laufender Auftrag"
1513
+
1514
+ # @ backwpup
1515
+ #: ../inc/class-wp-cli.php:74
1516
+ msgid "Running job"
1517
+ msgstr "Laufender Auftrag"
1518
+
1519
+ # @ backwpup
1520
+ #: ../inc/class-wp-cli.php:77
1521
+ #, php-format
1522
+ msgid "Warnings: %1$d Errors: %2$d"
1523
+ msgstr "Warnungen: %1$d Fehler: %2$d"
1524
+
1525
+ # @ backwpup
1526
+ #: ../inc/class-wp-cli.php:78
1527
+ #, php-format
1528
+ msgid "Steps in percent: %1$d percent of step: %2$d"
1529
+ msgstr "Schritte in Prozent: %1$d Prozent des Schritts: %2$d"
1530
+
1531
+ # @ backwpup
1532
+ #: ../inc/class-wp-cli.php:79
1533
+ #, php-format
1534
+ msgid "On step: %s"
1535
+ msgstr "Bei Schritt: %s"
1536
+
1537
+ # @ backwpup
1538
+ #: ../inc/class-wp-cli.php:80
1539
+ #, php-format
1540
+ msgid "Last message: %s"
1541
+ msgstr "Letzte Nachricht: %s"
1542
+
1543
+ # @ backwpup
1544
+ #: ../inc/class-option.php:102
1545
+ msgid "New Job"
1546
+ msgstr "Bitte geben Sie einen Namen ein"
1547
+
1548
+ # @ backwpup
1549
+ #: ../inc/class-page-logs.php:102
1550
+ msgid "No Logs."
1551
+ msgstr "Keine Protokolldateien."
1552
+
1553
+ # @ backwpup
1554
+ #: ../inc/class-page-logs.php:126
1555
+ msgid "Job"
1556
+ msgstr "Auftrag"
1557
+
1558
+ # @ backwpup
1559
+ #: ../inc/class-page-logs.php:127
1560
+ msgid "Status"
1561
+ msgstr "Status"
1562
+
1563
+ # @ backwpup
1564
+ #: ../inc/class-page-logs.php:128
1565
+ msgid "Type"
1566
+ msgstr "Typ"
1567
+
1568
+ # @ backwpup
1569
+ #: ../inc/class-page-logs.php:130
1570
+ msgid "Runtime"
1571
+ msgstr "Laufzeit"
1572
+
1573
+ # @ backwpup
1574
+ #: ../inc/class-page-logs.php:188
1575
+ #, php-format
1576
+ msgid "Job ID: %d"
1577
+ msgstr "Auftrags-ID: %d"
1578
+
1579
+ # @ backwpup
1580
+ #: ../inc/class-page-logs.php:190
1581
+ msgid "View"
1582
+ msgstr "Ansehen"
1583
+
1584
+ # @ backwpup
1585
+ #: ../inc/class-page-logs.php:209
1586
+ #, php-format
1587
+ msgid "1 ERROR"
1588
+ msgid_plural "%d ERRORS"
1589
+ msgstr[0] "1 FEHLER"
1590
+ msgstr[1] "%d FEHLER"
1591
+
1592
+ # @ backwpup
1593
+ #: ../inc/class-page-logs.php:211
1594
+ #, php-format
1595
+ msgid "1 WARNING"
1596
+ msgid_plural "%d WARNINGS"
1597
+ msgstr[0] "1 WARNUNG"
1598
+ msgstr[1] "%d WARNUNGEN"
1599
+
1600
+ # @ backwpup
1601
+ #: ../inc/class-page-logs.php:213
1602
+ msgid "O.K."
1603
+ msgstr "O.K."
1604
+
1605
+ # @ backwpup
1606
+ #: ../inc/class-page-logs.php:230
1607
+ msgid "Log only"
1608
+ msgstr "Nur Log"
1609
+
1610
+ # @ backwpup
1611
+ #: ../inc/class-page-logs.php:301
1612
+ #: ../inc/class-admin.php:202
1613
+ msgid "Logs"
1614
+ msgstr "Protokolle"
1615
+
1616
+ # @ backwpup
1617
+ #: ../inc/class-page-logs.php:364
1618
+ #, php-format
1619
+ msgid "%s Logs"
1620
+ msgstr "%s Logs"
1621
+
1622
+ # @ backwpup
1623
+ #: ../inc/class-mysqldump.php:55
1624
+ msgid "No MySQLi extension found. Please install it."
1625
+ msgstr "Keine MySQLi Erweiterung gefunden. Bitte installieren Sie diese"
1626
+
1627
+ # @ backwpup
1628
+ #: ../inc/class-mysqldump.php:93
1629
+ msgid "Cannot init MySQLi database connection"
1630
+ msgstr "MySQLi Datenbank-Verbindung kann nicht initialisiert werden."
1631
+
1632
+ # @ backwpup
1633
+ #: ../inc/class-mysqldump.php:97
1634
+ #, php-format
1635
+ msgid "Setting of MySQLi init command \"%s\" failed"
1636
+ msgstr "Einstellung vom MySQLi Initialisierungsbefehl \"%s\" ist fehlgeschlagen"
1637
+
1638
+ # @ backwpup
1639
+ #: ../inc/class-mysqldump.php:101
1640
+ msgid "Setting of MySQLi connection timeout failed"
1641
+ msgstr "Einstellung von der MySQLi Verbindungs-Zeitüberschreitung ist fehlgeschlagen"
1642
+
1643
+ # @ backwpup
1644
+ #: ../inc/class-mysqldump.php:105
1645
+ #, php-format
1646
+ msgid "Cannot connect to MySQL database %1$d: %2$s"
1647
+ msgstr "Kann keine Verbindung zur Datenbank %1$d herstellen: %2$s"
1648
+
1649
+ # @ backwpup
1650
+ #: ../inc/class-mysqldump.php:111
1651
+ #, php-format
1652
+ msgctxt "Database Charset"
1653
+ msgid "Cannot set DB charset to %s"
1654
+ msgstr "Kann Datenbank-Zeichenkodierung nicht auf %s setzen."
1655
+
1656
+ # @ backwpup
1657
+ #: ../inc/class-mysqldump.php:138
1658
+ msgid "Cannot open SQL backup file"
1659
+ msgstr "Kann SQL Backup Datei nicht öffnen"
1660
+
1661
+ # @ backwpup
1662
+ #: ../inc/class-mysqldump.php:144
1663
+ #: ../inc/class-mysqldump.php:155
1664
+ #: ../inc/class-mysqldump.php:237
1665
+ #: ../inc/class-mysqldump.php:250
1666
+ #: ../inc/class-mysqldump.php:264
1667
+ #: ../inc/class-mysqldump.php:277
1668
+ #: ../inc/class-mysqldump.php:320
1669
+ #: ../inc/class-mysqldump.php:342
1670
+ #: ../inc/class-mysqldump.php:404
1671
+ #, php-format
1672
+ msgid "Database error %1$s for query %2$s"
1673
+ msgstr "Datenbankfehler %1$s für die Abfrage (Query) %2$s"
1674
+
1675
+ # @ backwpup
1676
+ #: ../inc/class-mysqldump.php:388
1677
+ #, php-format
1678
+ msgid "Start for table backup is not correctly set: %1$s "
1679
+ msgstr "Start für den Tabellen Backup ist nicht richtig gesetzt: %1$s "
1680
+
1681
+ # @ backwpup
1682
+ #: ../inc/class-mysqldump.php:392
1683
+ #, php-format
1684
+ msgid "Length for table backup is not correctly set: %1$s "
1685
+ msgstr "Länge des Tabellen Backups ist nicht richtig gesetzt: %1$s "
1686
+
1687
+ # @ backwpup
1688
+ #: ../inc/class-mysqldump.php:460
1689
+ msgid "Error while writing file!"
1690
+ msgstr "Fehler beim Schreiben!"
1691
+
1692
+ # @ backwpup
1693
+ #: ../inc/class-admin.php:137
1694
+ msgid "Documentation"
1695
+ msgstr "Dokumentation"
1696
+
1697
+ # @ backwpup
1698
+ #: ../inc/class-admin.php:154
1699
+ msgid "BackWPup Dashboard"
1700
+ msgstr "BackWPup Dashboard"
1701
+
1702
+ # @ backwpup
1703
+ #: ../inc/class-admin.php:154
1704
+ msgid "Dashboard"
1705
+ msgstr "Dashboard"
1706
+
1707
+ # @ backwpup
1708
+ #: ../inc/class-admin.php:171
1709
+ msgid "Jobs"
1710
+ msgstr "Aufträge"
1711
+
1712
+ # @ backwpup
1713
+ #: ../inc/class-admin.php:186
1714
+ msgid "Add new job"
1715
+ msgstr "Neuer Auftrag"
1716
+
1717
+ # @ backwpup
1718
+ #: ../inc/class-admin.php:217
1719
+ msgid "Backups"
1720
+ msgstr "Backups"
1721
+
1722
+ # @ backwpup
1723
+ #: ../inc/class-admin.php:232
1724
+ msgid "Settings"
1725
+ msgstr "Einstellungen"
1726
+
1727
+ # @ backwpup
1728
+ #: ../inc/class-admin.php:245
1729
+ msgid "About"
1730
+ msgstr "Über"
1731
+
1732
+ # @ backwpup
1733
+ #: ../inc/class-admin.php:282
1734
+ #: ../inc/class-admin.php:288
1735
+ msgid "Cheating, huh?"
1736
+ msgstr "Mogeln, wie?"
1737
+
1738
+ # @ backwpup
1739
+ #: ../inc/class-admin.php:400
1740
+ msgid "http://marketpress.com"
1741
+ msgstr "http://marketpress.com"
1742
+
1743
+ # @ backwpup
1744
+ #: ../inc/class-admin.php:400
1745
+ msgid "MarketPress"
1746
+ msgstr "MarketPress"
1747
+
1748
+ # @ backwpup
1749
+ #: ../inc/class-admin.php:402
1750
+ #, php-format
1751
+ msgid "<a class=\"backwpup-get-pro\" href=\"%s\">Get BackWPup Pro now.</a>"
1752
+ msgstr "<a class=\"backwpup-get-pro\" href=\"%s\">Wechsle jetzt zu BackWPup Pro.</a>"
1753
+
1754
+ # @ backwpup
1755
+ #: ../inc/class-admin.php:421
1756
+ #, php-format
1757
+ msgid "version %s"
1758
+ msgstr "Version %s"
1759
+
1760
+ # @ backwpup
1761
+ #: ../inc/class-admin.php:445
1762
+ #: ../inc/class-admin.php:545
1763
+ msgid "BackWPup Role"
1764
+ msgstr "BackWPup Rolle"
1765
+
1766
+ # @ backwpup
1767
+ #: ../inc/class-admin.php:449
1768
+ msgid "&mdash; No role for BackWPup &mdash;"
1769
+ msgstr "&mdash; Keine Rolle für BackWPup &mdash;"
1770
+
1771
+ # @ backwpup
1772
+ #: ../inc/class-admin.php:459
1773
+ msgid "Role that the user have on BackWPup"
1774
+ msgstr "Rolle die dieser Benutzer hat bei BackWPup"
1775
+
1776
+ # @ backwpup
1777
+ #: ../inc/class-admin.php:509
1778
+ #, php-format
1779
+ msgid "<strong>Important:</strong> before updating, please <a href=\"%1$s\">back up your database and files</a> with <a href=\"http://marketpress.de/product/backwpup-pro/\">%2$s</a>. For help with updates, visit the <a href=\"http://codex.wordpress.org/Updating_WordPress\">Updating WordPress</a> Codex page."
1780
+ msgstr "<strong>Wichtig:</strong> Bitte erstelle ein Backup <a href=\"%1$s\">von der Datenbank und den Dateien</a> mit <a href=\"http://marketpress.de/product/backwpup-pro/\">%2$s</a> vor der Installation dieses Plugins. Um Hilfe für die Updates zu erhalten, besuche bitte die <a href=\"http://codex.wordpress.org/Updating_WordPress\">Updating WordPress</a> Codex-Seite."
1781
+
1782
+ # @ backwpup
1783
+ #: ../inc/class-admin.php:512
1784
+ #: ../inc/class-admin.php:515
1785
+ #, php-format
1786
+ msgid "<strong>Important:</strong> before installing this plugin, please <a href=\"%1$s\">back up your database and files</a> with <a href=\"http://marketpress.de/product/backwpup-pro/\">%2$s</a>."
1787
+ msgstr "<strong>Wichtig:</strong> Bitte erstelle ein Backup <a href=\"%1$s\">von der Datenbank und den Dateien</a> mit <a href=\"http://marketpress.de/product/backwpup-pro/\">%2$s</a> vor der Installation dieses Plugins."
1788
+
1789
+ # @ backwpup
1790
+ #: ../inc/class-jobtype-wpexp.php:13
1791
+ msgid "XML export"
1792
+ msgstr "XML Export"
1793
+
1794
+ # @ backwpup
1795
+ #: ../inc/class-jobtype-wpexp.php:46
1796
+ msgid "Items to export"
1797
+ msgstr "Objekte zum Exportieren"
1798
+
1799
+ # @ backwpup
1800
+ #: ../inc/class-jobtype-wpexp.php:49
1801
+ msgid "All content"
1802
+ msgstr "Gesamter Inhalt"
1803
+
1804
+ # @ backwpup
1805
+ #: ../inc/class-jobtype-wpexp.php:50
1806
+ msgid "Posts"
1807
+ msgstr "Beiträge"
1808
+
1809
+ # @ backwpup
1810
+ #: ../inc/class-jobtype-wpexp.php:51
1811
+ msgid "Pages"
1812
+ msgstr "Seiten"
1813
+
1814
+ # @ backwpup
1815
+ #: ../inc/class-jobtype-wpexp.php:61
1816
+ msgid "XML Export file name"
1817
+ msgstr "XML Export Datei Name"
1818
+
1819
+ # @ backwpup
1820
+ #: ../inc/class-jobtype-wpexp.php:69
1821
+ msgid "File compression"
1822
+ msgstr "Dateikomprimierung"
1823
+
1824
+ # @ backwpup
1825
+ #: ../inc/class-jobtype-wpexp.php:75
1826
+ #: ../inc/class-jobtype-wpexp.php:77
1827
+ #: ../inc/class-jobtype-dbdump.php:105
1828
+ #: ../inc/class-jobtype-dbdump.php:107
1829
+ msgid "GZip"
1830
+ msgstr "GZip"
1831
+
1832
+ # @ backwpup
1833
+ #: ../inc/class-jobtype-wpexp.php:79
1834
+ #: ../inc/class-jobtype-wpexp.php:81
1835
+ msgid "BZip2"
1836
+ msgstr "BZip2"
1837
+
1838
+ # @ backwpup
1839
+ #: ../inc/class-jobtype-wpexp.php:111
1840
+ #, php-format
1841
+ msgid "%d. Trying to create a WordPress export to XML file&#160;&hellip;"
1842
+ msgstr "%d. Versuche, einen WordPress-Export als XML-Datei zu erstellen&#160;&hellip;"
1843
+
1844
+ # @ backwpup
1845
+ #: ../inc/class-jobtype-wpexp.php:126
1846
+ #, php-format
1847
+ msgid "WP Export: Post type “%s” does not allow export."
1848
+ msgstr "WP Export: Post-Type „%s“ erlaubt keinen Export."
1849
+
1850
+ # @ backwpup
1851
+ #: ../inc/class-jobtype-wpexp.php:171
1852
+ #: ../inc/class-jobtype-wpexp.php:185
1853
+ #: ../inc/class-jobtype-wpexp.php:214
1854
+ #: ../inc/class-jobtype-wpexp.php:235
1855
+ #: ../inc/class-jobtype-wpexp.php:268
1856
+ #: ../inc/class-jobtype-wpexp.php:288
1857
+ #: ../inc/class-jobtype-wpexp.php:377
1858
+ #: ../inc/class-jobtype-wpexp.php:386
1859
+ msgid "WP Export file could not written."
1860
+ msgstr "WP-Exportdatei konnte nicht geschrieben werden."
1861
+
1862
+ # @ backwpup
1863
+ #: ../inc/class-jobtype-wpexp.php:401
1864
+ msgid "Check WP Export file&#160;&hellip;"
1865
+ msgstr "Prüfe WP Export-Datei&#160;&hellip;"
1866
+
1867
+ # @ backwpup
1868
+ #: ../inc/class-jobtype-wpexp.php:421
1869
+ #, php-format
1870
+ msgid "XML WARNING (%s): %s"
1871
+ msgstr "XML WARNUNG (%s): %s"
1872
+
1873
+ # @ backwpup
1874
+ #: ../inc/class-jobtype-wpexp.php:424
1875
+ #, php-format
1876
+ msgid "XML RECOVERABLE (%s): %s"
1877
+ msgstr "XML RECOVERABLE (%s): %s"
1878
+
1879
+ # @ backwpup
1880
+ #: ../inc/class-jobtype-wpexp.php:427
1881
+ #, php-format
1882
+ msgid "XML ERROR (%s): %s"
1883
+ msgstr "XML FEHLER (%s): %s"
1884
+
1885
+ # @ backwpup
1886
+ #: ../inc/class-jobtype-wpexp.php:437
1887
+ msgid "There was an error when reading this WXR file"
1888
+ msgstr "Fehler beim Lesen der WXR Datei"
1889
+
1890
+ # @ backwpup
1891
+ #: ../inc/class-jobtype-wpexp.php:443
1892
+ #: ../inc/class-jobtype-wpexp.php:450
1893
+ msgid "This does not appear to be a WXR file, missing/invalid WXR version number"
1894
+ msgstr "Es scheint nicht eine WXR Datei zu sein. Fehlende/ungültige Versionsnummer"
1895
+
1896
+ # @ backwpup
1897
+ #: ../inc/class-jobtype-wpexp.php:459
1898
+ msgid "WP Export file is a valid WXR file."
1899
+ msgstr "WP Export-Datei ist eine gültige WXR Datei."
1900
+
1901
+ # @ backwpup
1902
+ #: ../inc/class-jobtype-wpexp.php:461
1903
+ msgid "WP Export file can not checked, because no XML extension loaded with the file can checked."
1904
+ msgstr "WP Export-Datei kann nicht geprüft werden, da keine XML Erweiterung geladen wurde."
1905
+
1906
+ # @ backwpup
1907
+ #: ../inc/class-jobtype-wpexp.php:473
1908
+ msgid "Compressing file&#160;&hellip;"
1909
+ msgstr "Komprimiere Datei&#160;&hellip;"
1910
+
1911
+ # @ backwpup
1912
+ #: ../inc/class-jobtype-wpexp.php:480
1913
+ msgid "Compressing done."
1914
+ msgstr "Komprimierung erledigt."
1915
+
1916
+ # @ backwpup
1917
+ #: ../inc/class-jobtype-wpexp.php:501
1918
+ #, php-format
1919
+ msgid "Added XML export \"%1$s\" with %2$s to backup file list."
1920
+ msgstr "XML Export \"%1$s\" mit %2$s zur Backup-Datei-Liste hinzugefügt"
1921
+
1922
+ # @ backwpup
1923
+ #: ../inc/class-job.php:180
1924
+ msgid "Starting job"
1925
+ msgstr "Auftrag starten"
1926
+
1927
+ # @ backwpup
1928
+ #: ../inc/class-job.php:199
1929
+ msgid "Job Start"
1930
+ msgstr "Auftragsstart"
1931
+
1932
+ # @ backwpup
1933
+ #: ../inc/class-job.php:219
1934
+ msgid "Creates manifest file"
1935
+ msgstr "Erstellt Manifest-Datei"
1936
+
1937
+ # @ backwpup
1938
+ #: ../inc/class-job.php:238
1939
+ msgid "Creates archive"
1940
+ msgstr "erstellt Archiv"
1941
+
1942
+ # @ backwpup
1943
+ #: ../inc/class-job.php:277
1944
+ msgid "End of Job"
1945
+ msgstr "Auftragsende"
1946
+
1947
+ # @ backwpup
1948
+ #: ../inc/class-job.php:287
1949
+ #, php-format
1950
+ msgid "BackWPup log for %1$s from %2$s at %3$s"
1951
+ msgstr "BackWPup-Protokoll für %1$s von %2$s am %3$s"
1952
+
1953
+ # @ backwpup
1954
+ #: ../inc/class-job.php:305
1955
+ #, php-format
1956
+ msgctxt "Plugin name; Plugin Version"
1957
+ msgid "[INFO] %1$s version %2$s; A project of Inpsyde GmbH"
1958
+ msgstr "[INFO] %1$s Version %2$s; Ein Projekt der Inpsyde GmbH"
1959
+
1960
+ # @ backwpup
1961
+ #: ../inc/class-job.php:306
1962
+ #, php-format
1963
+ msgctxt "WordPress Version"
1964
+ msgid "[INFO] WordPress version %s"
1965
+ msgstr "[INFO] WordPress Version %s"
1966
+
1967
+ # @ backwpup
1968
+ #: ../inc/class-job.php:307
1969
+ #, php-format
1970
+ msgid "[INFO] Blog url: %s"
1971
+ msgstr "[INFO] Blog URL: %s"
1972
+
1973
+ # @ backwpup
1974
+ #: ../inc/class-job.php:308
1975
+ #, php-format
1976
+ msgid "[INFO] BackWPup job: %1$s; %2$s"
1977
+ msgstr "[INFO] BackWPup-Auftrag: %1$s; %2$s"
1978
+
1979
+ # @ backwpup
1980
+ #: ../inc/class-job.php:320
1981
+ msgid "Not scheduled!"
1982
+ msgstr "Nicht geplant!"
1983
+
1984
+ # @ backwpup
1985
+ #: ../inc/class-job.php:323
1986
+ #, php-format
1987
+ msgid "[INFO] BackWPup cron: %s; Next: %s "
1988
+ msgstr "[INFO] BackWPup Cron: %s; Nächste: %s "
1989
+
1990
+ # @ backwpup
1991
+ #: ../inc/class-job.php:326
1992
+ msgid "[INFO] BackWPup job start with link is active"
1993
+ msgstr "[INFO] BackWPup Auftragsstart mit aktivem Link gestartet"
1994
+
1995
+ # @ backwpup
1996
+ #: ../inc/class-job.php:328
1997
+ msgid "[INFO] BackWPup no automatic job start configured"
1998
+ msgstr "[INFO] BackWPup kein automatischer Auftragsstart konfiguriert"
1999
+
2000
+ # @ backwpup
2001
+ #: ../inc/class-job.php:330
2002
+ msgid "[INFO] BackWPup job started from wp-cron"
2003
+ msgstr "[INFO] BackWPup-Auftrag wurde per wp-cron gestartet"
2004
+
2005
+ # @ backwpup
2006
+ #: ../inc/class-job.php:332
2007
+ msgid "[INFO] BackWPup job started manually"
2008
+ msgstr "[INFO] BackWPup-Auftrag wurde manuell gestartet"
2009
+
2010
+ # @ backwpup
2011
+ #: ../inc/class-job.php:334
2012
+ msgid "[INFO] BackWPup job started from external url"
2013
+ msgstr "[INFO] BackWPup Auftrag wurde von externer URL gestartet"
2014
+
2015
+ # @ backwpup
2016
+ #: ../inc/class-job.php:336
2017
+ msgid "[INFO] BackWPup job started form commandline interface"
2018
+ msgstr "[INFO] BackWPup-Auftrag per Kommandozeile gestartet"
2019
+
2020
+ # @ backwpup
2021
+ #: ../inc/class-job.php:342
2022
+ msgid "[INFO] PHP ver.:"
2023
+ msgstr "[INFO] PHP ver.:"
2024
+
2025
+ # @ backwpup
2026
+ #: ../inc/class-job.php:343
2027
+ #, php-format
2028
+ msgid "[INFO] Maximum PHP script execution time is %1$d seconds"
2029
+ msgstr "[INFO] Maximum PHP script execution time ist %1$d Sekunden"
2030
+
2031
+ # @ backwpup
2032
+ #: ../inc/class-job.php:347
2033
+ #, php-format
2034
+ msgid "[INFO] Script restart time is configured to %1$d seconds"
2035
+ msgstr "[INFO] Skript-Restart-Zeit ist auf %1$d Sekunden konfiguriert"
2036
+
2037
+ # @ backwpup
2038
+ #: ../inc/class-job.php:350
2039
+ #, php-format
2040
+ msgid "[INFO] MySQL ver.: %s"
2041
+ msgstr "[INFO] MySQL ver.: %s"
2042
+
2043
+ # @ backwpup
2044
+ #: ../inc/class-job.php:352
2045
+ #, php-format
2046
+ msgid "[INFO] Web Server: %s"
2047
+ msgstr "[INFO] Webserver: %s"
2048
+
2049
+ # @ backwpup
2050
+ #: ../inc/class-job.php:355
2051
+ #, php-format
2052
+ msgid "[INFO] curl ver.: %1$s; %2$s"
2053
+ msgstr "[INFO] curl ver.: %1$s; %2$s"
2054
+
2055
+ # @ backwpup
2056
+ #: ../inc/class-job.php:357
2057
+ #, php-format
2058
+ msgid "[INFO] Temp folder is: %s"
2059
+ msgstr "[INFO] Temp Ordner ist: %s"
2060
+
2061
+ # @ backwpup
2062
+ #: ../inc/class-job.php:358
2063
+ #, php-format
2064
+ msgid "[INFO] Logfile is: %s"
2065
+ msgstr "[INFO] Logfile ist: %s"
2066
+
2067
+ # @ backwpup
2068
+ #: ../inc/class-job.php:359
2069
+ #, php-format
2070
+ msgid "[INFO] Backup type is: %s"
2071
+ msgstr "[INFO] Backup Typ ist: %s"
2072
+
2073
+ # @ backwpup
2074
+ #: ../inc/class-job.php:361
2075
+ #, php-format
2076
+ msgid "[INFO] Backup file is: %s"
2077
+ msgstr "[INFO] Backup Datei ist: %s"
2078
+
2079
+ # @ backwpup
2080
+ #: ../inc/class-job.php:376
2081
+ msgid "No destination correctly defined for backup! Please correct job settings."
2082
+ msgstr "Es wurde kein korrektes Backupziel definiert! Bitte überprüfe die Auftragseinstellungen."
2083
+
2084
+ # @ backwpup
2085
+ #: ../inc/class-job.php:552
2086
+ msgid "Wrong BackWPup JobID"
2087
+ msgstr "Falsche BackWPup JobID"
2088
+
2089
+ # @ backwpup
2090
+ #: ../inc/class-job.php:555
2091
+ msgid "Log folder does not exist or is not writable for BackWPup"
2092
+ msgstr "Log-Ordner existiert nicht oder ist nicht beschreibbar für BackWPup"
2093
+
2094
+ # @ backwpup
2095
+ #: ../inc/class-job.php:557
2096
+ msgid "Temp folder does not exist or is not writable for BackWPup"
2097
+ msgstr "Temp Ordner existiert nicht oder ist nicht beschreibbar für BackWPup!"
2098
+
2099
+ # @ backwpup
2100
+ #: ../inc/class-job.php:560
2101
+ msgid "A BackWPup job is already running"
2102
+ msgstr "Es läuft bereits ein BackWPup-Auftrag"
2103
+
2104
+ # @ backwpup
2105
+ #: ../inc/class-job.php:563
2106
+ msgid "Job started"
2107
+ msgstr "Auftrag begonnen"
2108
+
2109
+ # @ backwpup
2110
+ #: ../inc/class-job.php:637
2111
+ msgid "Job restarts due to inactivity for more than 5 minutes."
2112
+ msgstr "Auftrag durch Inaktivität von mehr als 5 Minuten neu gestartet"
2113
+
2114
+ # @ backwpup
2115
+ #: ../inc/class-job.php:727
2116
+ msgid "Step aborted: too many attempts!"
2117
+ msgstr "Schritt abgebrochen durch zu viele Versuche!"
2118
+
2119
+ # @ backwpup
2120
+ #: ../inc/class-job.php:808
2121
+ msgid "Restart will be executed now."
2122
+ msgstr "Neustart wird jetzt ausgeführt."
2123
+
2124
+ # @ backwpup
2125
+ #: ../inc/class-job.php:842
2126
+ #, php-format
2127
+ msgid "Restart after %1$d seconds."
2128
+ msgstr "Neustart nach %1$s Sekunden."
2129
+
2130
+ # @ backwpup
2131
+ #: ../inc/class-job.php:969
2132
+ #, php-format
2133
+ msgid "Signal %d is sent to script!"
2134
+ msgstr "Signal %d wurde zum Script gesendet!"
2135
+
2136
+ # @ backwpup
2137
+ #: ../inc/class-job.php:994
2138
+ #, php-format
2139
+ msgid "Folder %1$s not allowed, please use another folder."
2140
+ msgstr "Ordner %1$s ist nicht erlaubt, bitte wähle einen anderen."
2141
+
2142
+ # @ backwpup
2143
+ #: ../inc/class-job.php:1000
2144
+ #, php-format
2145
+ msgid "Cannot create folder: %1$s"
2146
+ msgstr "Kann keinen Ordner erstellen: %1$s"
2147
+
2148
+ # @ backwpup
2149
+ #: ../inc/class-job.php:1007
2150
+ #, php-format
2151
+ msgid "Folder \"%1$s\" is not writable"
2152
+ msgstr "Ordner \"%1$s\" ist nicht beschreibbar"
2153
+
2154
+ # @ backwpup
2155
+ #: ../inc/class-job.php:1019
2156
+ msgid "BackWPup will not backup folders and subfolders when this file is inside."
2157
+ msgstr "BackWPup wird keine Ordner und Unterordner sichern, die diese Datei enthalten."
2158
+
2159
+ # @ backwpup
2160
+ #: ../inc/class-job.php:1031
2161
+ #, php-format
2162
+ msgid "Exception caught in %1$s: %2$s"
2163
+ msgstr "Ausnahme eingefangen in %1$s: %2$s"
2164
+
2165
+ # @ backwpup
2166
+ #: ../inc/class-job.php:1088
2167
+ msgid "WARNING:"
2168
+ msgstr "WARNUNG:"
2169
+
2170
+ # @ backwpup
2171
+ #: ../inc/class-job.php:1097
2172
+ msgid "ERROR:"
2173
+ msgstr "FEHLER:"
2174
+
2175
+ # @ backwpup
2176
+ #: ../inc/class-job.php:1101
2177
+ msgid "DEPRECATED:"
2178
+ msgstr "ABGELEHNT:"
2179
+
2180
+ # @ backwpup
2181
+ #: ../inc/class-job.php:1104
2182
+ msgid "STRICT NOTICE:"
2183
+ msgstr "EXAKTE NOTIZ:"
2184
+
2185
+ # @ backwpup
2186
+ #: ../inc/class-job.php:1109
2187
+ msgid "RECOVERABLE ERROR:"
2188
+ msgstr "WIEDERHERSTELLUNGS FEHLER:"
2189
+
2190
+ # @ backwpup
2191
+ #: ../inc/class-job.php:1229
2192
+ msgid "Cannot write progress to working file. Job will be aborted."
2193
+ msgstr "Kann Fortschritt nicht in die Arbeitsdatei schreiben. Auftrag wird abgebrochen."
2194
+
2195
+ # @ backwpup
2196
+ #: ../inc/class-job.php:1247
2197
+ msgid "Aborted by user!"
2198
+ msgstr "Abgebrochen vom Benutzer!"
2199
+
2200
+ # @ backwpup
2201
+ #: ../inc/class-job.php:1272
2202
+ #, php-format
2203
+ msgid "One old log deleted"
2204
+ msgid_plural "%d old logs deleted"
2205
+ msgstr[0] "Eine alte Log-Datei gelöscht"
2206
+ msgstr[1] "%d alte Log-Dateien gelöscht"
2207
+
2208
+ # @ backwpup
2209
+ #: ../inc/class-job.php:1278
2210
+ #, php-format
2211
+ msgid "Job has ended with errors in %s seconds. You must resolve the errors for correct execution."
2212
+ msgstr "Job mit Fehlern beendet in %s Sekunden. Sie müssen die Fehler für eine korrekte Ausführung beheben."
2213
+
2214
+ # @ backwpup
2215
+ #: ../inc/class-job.php:1280
2216
+ #, php-format
2217
+ msgid "Job finished with warnings in %s seconds. Please resolve them for correct execution."
2218
+ msgstr "Job mit Warnungen beendet in %s Sekunden. Bitte beheben Sie die Warnungen für eine korrekte Ausführung."
2219
+
2220
+ # @ backwpup
2221
+ #: ../inc/class-job.php:1282
2222
+ #, php-format
2223
+ msgid "Job done in %s seconds."
2224
+ msgstr "Auftrag erledigt in %s Sekunden."
2225
+
2226
+ # @ backwpup
2227
+ #: ../inc/class-job.php:1325
2228
+ msgid "SUCCESSFUL"
2229
+ msgstr "ERFOLGREICH"
2230
+
2231
+ # @ backwpup
2232
+ #: ../inc/class-job.php:1328
2233
+ msgid "WARNING"
2234
+ msgstr "WARNUNG"
2235
+
2236
+ # @ backwpup
2237
+ #: ../inc/class-job.php:1332
2238
+ msgid "ERROR"
2239
+ msgstr "FEHLER"
2240
+
2241
+ # @ backwpup
2242
+ #: ../inc/class-job.php:1336
2243
+ #, php-format
2244
+ msgid "[%3$s] BackWPup log %1$s: %2$s"
2245
+ msgstr "[%3$s] BackWPup Log %1$s: %2$s"
2246
+
2247
+ # @ backwpup
2248
+ #: ../inc/class-job.php:1704
2249
+ #, php-format
2250
+ msgctxt "Folder name"
2251
+ msgid "Folder %s not exists"
2252
+ msgstr "Verzeichnis %s existiert nicht"
2253
+
2254
+ # @ backwpup
2255
+ #: ../inc/class-job.php:1709
2256
+ #, php-format
2257
+ msgctxt "Folder name"
2258
+ msgid "Folder %s not readable"
2259
+ msgstr "Verzeichnis %s ist nicht lesbar"
2260
+
2261
+ # @ backwpup
2262
+ #: ../inc/class-job.php:1726
2263
+ #, php-format
2264
+ msgid "Link \"%s\" not following."
2265
+ msgstr "Link \"%s\" wird nicht gefolgt"
2266
+
2267
+ # @ backwpup
2268
+ #: ../inc/class-job.php:1728
2269
+ #, php-format
2270
+ msgid "File \"%s\" is not readable!"
2271
+ msgstr "Datei \"%s\" ist nicht lesbar!"
2272
+
2273
+ # @ backwpup
2274
+ #: ../inc/class-job.php:1732
2275
+ #, php-format
2276
+ msgid "File size of “%s” cannot be retrieved. File might be too large and will not be added to queue."
2277
+ msgstr "Dateigröße von „%s“ kann nicht abgefragt werden. Die Datei könnte zu groß sein und wird nicht zur Warteschlange hinzugefügt."
2278
+
2279
+ # @ backwpup
2280
+ #: ../inc/class-job.php:1754
2281
+ #, php-format
2282
+ msgid "%d. Trying to generate a manifest file&#160;&hellip;"
2283
+ msgstr "%d. Versuche eine Manifest-Datei zu generieren&#160;&hellip;"
2284
+
2285
+ # @ backwpup
2286
+ #: ../inc/class-job.php:1804
2287
+ msgid "You may have noticed the manifest.json file in this archive."
2288
+ msgstr "Du wirst manifest.json in diesem Archiv bemerkt haben."
2289
+
2290
+ # @ backwpup
2291
+ #: ../inc/class-job.php:1805
2292
+ msgid "manifest.json might be needed for later restoring a backup from this archive."
2293
+ msgstr "manifest.json könnte für das spätere Wiederherstellen des Backups aus diesem Archiv benötigt werden."
2294
+
2295
+ # @ backwpup
2296
+ #: ../inc/class-job.php:1806
2297
+ msgid "Please leave manifest.json untouched and in place. Otherwise it is safe to be ignored."
2298
+ msgstr "Bitte lasse die manifest.json unberührt an ihrem Platz. Du kannst sie ansonsten einfach ignorieren."
2299
+
2300
+ # @ backwpup
2301
+ #: ../inc/class-job.php:1819
2302
+ #, php-format
2303
+ msgid "Added manifest.json file with %1$s to backup file list."
2304
+ msgstr "manifest.json mit %1$s wurde zur Backup-Datei-Liste hinzugefügt."
2305
+
2306
+ # @ backwpup
2307
+ #: ../inc/class-job.php:1849
2308
+ #, php-format
2309
+ msgid "%d. Trying to create backup archive &hellip;"
2310
+ msgstr "%d. Versuche, Backup zu erstellen …"
2311
+
2312
+ # @ backwpup
2313
+ #: ../inc/class-job.php:1856
2314
+ #, php-format
2315
+ msgctxt "Archive compression method"
2316
+ msgid "Compressing files as %s. Please be patient, this may take a moment."
2317
+ msgstr "Komprimiere Dateien als %s. Bitte habe einen Moment Geduld."
2318
+
2319
+ # @ backwpup
2320
+ #: ../inc/class-job.php:1870
2321
+ #: ../inc/class-job.php:1919
2322
+ msgid "Cannot create backup archive correctly. Aborting creation."
2323
+ msgstr "Backup-Archiv kann nicht korrekt angelegt werden. Anlegeprozess abgebrochen."
2324
+
2325
+ # @ backwpup
2326
+ #: ../inc/class-job.php:1916
2327
+ msgid "Aborting creation."
2328
+ msgstr "Anlegen abgebrochen."
2329
+
2330
+ # @ backwpup
2331
+ #: ../inc/class-job.php:1934
2332
+ msgid "Backup archive created."
2333
+ msgstr "Backup wurde erstellt."
2334
+
2335
+ # @ backwpup
2336
+ #: ../inc/class-job.php:1943
2337
+ #, php-format
2338
+ msgid "Archive size is %s."
2339
+ msgstr "Archivgröße ist %s"
2340
+
2341
+ # @ backwpup
2342
+ #: ../inc/class-job.php:1944
2343
+ #, php-format
2344
+ msgid "%1$d Files with %2$s in Archive."
2345
+ msgstr "%1$d Dateien mit %2$s in Archiven."
2346
+
2347
+ # @ backwpup
2348
+ #: ../inc/class-destination-msazure.php:25
2349
+ msgid "MS Azure access keys"
2350
+ msgstr "MS Azure Zugriff Schlüssel"
2351
+
2352
+ # @ backwpup
2353
+ #: ../inc/class-destination-msazure.php:29
2354
+ msgid "Account name"
2355
+ msgstr "Account Name"
2356
+
2357
+ # @ backwpup
2358
+ #: ../inc/class-destination-msazure.php:36
2359
+ msgid "Access key"
2360
+ msgstr "Access Key"
2361
+
2362
+ # @ backwpup
2363
+ #: ../inc/class-destination-msazure.php:44
2364
+ msgid "Blob container"
2365
+ msgstr "Blob Container"
2366
+
2367
+ # @ backwpup
2368
+ #: ../inc/class-destination-msazure.php:48
2369
+ msgid "Container selection"
2370
+ msgstr "Container Auswahl"
2371
+
2372
+ # @ backwpup
2373
+ #: ../inc/class-destination-msazure.php:60
2374
+ msgid "Create a new container"
2375
+ msgstr "Neuen Container erstellen"
2376
+
2377
+ # @ backwpup
2378
+ #: ../inc/class-destination-msazure.php:71
2379
+ msgid "Folder in container"
2380
+ msgstr "Ordner im Container"
2381
+
2382
+ # @ backwpup
2383
+ #: ../inc/class-destination-msazure.php:125
2384
+ #, php-format
2385
+ msgid "MS Azure container \"%s\" created."
2386
+ msgstr "MS Azure Container \"%s\" erstellt."
2387
+
2388
+ # @ backwpup
2389
+ #: ../inc/class-destination-msazure.php:128
2390
+ #, php-format
2391
+ msgid "MS Azure container create: %s"
2392
+ msgstr "MS Azure Container erstellen: %s"
2393
+
2394
+ # @ backwpup
2395
+ #: ../inc/class-destination-msazure.php:204
2396
+ #, php-format
2397
+ msgid "%d. Try sending backup to a Microsoft Azure (Blob)&#160;&hellip;"
2398
+ msgstr "%d. Versuche, das Backup zu Microsoft Azure (Blob) zu senden&#160;&hellip;"
2399
+
2400
+ # @ backwpup
2401
+ #: ../inc/class-destination-msazure.php:226
2402
+ #, php-format
2403
+ msgid "MS Azure container \"%s\" does not exist!"
2404
+ msgstr "MS Azure Container \"%s\" existiert nicht!"
2405
+
2406
+ # @ backwpup
2407
+ #: ../inc/class-destination-msazure.php:230
2408
+ #, php-format
2409
+ msgid "Connected to MS Azure container \"%s\"."
2410
+ msgstr "Verbunden mit MS Azure container \"%s\""
2411
+
2412
+ # @ backwpup
2413
+ #: ../inc/class-destination-msazure.php:233
2414
+ msgid "Starting upload to MS Azure&#160;&hellip;"
2415
+ msgstr "Hochladen zu MS Azure hat begonnen&#160;&hellip;"
2416
+
2417
+ # @ backwpup
2418
+ #: ../inc/class-destination-msazure.php:268
2419
+ #: ../inc/class-destination-dropbox.php:263
2420
+ #, php-format
2421
+ msgid "Backup transferred to %s"
2422
+ msgstr "Backup übertragen zu %s"
2423
+
2424
+ # @ backwpup
2425
+ #: ../inc/class-destination-msazure.php:273
2426
+ #: ../inc/class-destination-msazure.php:329
2427
+ #, php-format
2428
+ msgid "Microsoft Azure API: %s"
2429
+ msgstr "Microsoft Azure API: %s"
2430
+
2431
+ # @ backwpup
2432
+ #: ../inc/class-destination-msazure.php:322
2433
+ #, php-format
2434
+ msgid "One file deleted on Microsoft Azure container."
2435
+ msgid_plural "%d files deleted on Microsoft Azure container."
2436
+ msgstr[0] "Eine Datei im Microsoft-Azure-Container gelöscht"
2437
+ msgstr[1] "%d Dateien im Microsoft-Azure-Container gelöscht"
2438
+
2439
+ # @ backwpup
2440
+ #: ../inc/class-destination-msazure.php:415
2441
+ msgid "Missing account name!"
2442
+ msgstr "Kontoname (Benutzername) nicht angegeben!"
2443
+
2444
+ # @ backwpup
2445
+ #: ../inc/class-destination-msazure.php:421
2446
+ msgid "No container found!"
2447
+ msgstr "Kein Container gefunden!"
2448
+
2449
+ # @ backwpup
2450
+ #: ../inc/class-destination-dropbox.php:36
2451
+ #: ../inc/class-destination-dropbox.php:325
2452
+ #, php-format
2453
+ msgid "Dropbox API: %s"
2454
+ msgstr "Dropbox-API: %s"
2455
+
2456
+ # @ backwpup
2457
+ #: ../inc/class-destination-dropbox.php:51
2458
+ msgid "Login"
2459
+ msgstr "Anmelden"
2460
+
2461
+ # @ backwpup
2462
+ #: ../inc/class-destination-dropbox.php:55
2463
+ msgid "Authentication"
2464
+ msgstr "Authentifizierung"
2465
+
2466
+ # @ backwpup
2467
+ #: ../inc/class-destination-dropbox.php:57
2468
+ msgid "Not authenticated!"
2469
+ msgstr "Nicht authentifiziert!"
2470
+
2471
+ # @ backwpup
2472
+ #: ../inc/class-destination-dropbox.php:58
2473
+ msgid "Create Account"
2474
+ msgstr "Konto erstellen"
2475
+
2476
+ # @ backwpup
2477
+ #: ../inc/class-destination-dropbox.php:60
2478
+ msgid "Authenticated!"
2479
+ msgstr "Authentifiziert!"
2480
+
2481
+ # @ backwpup
2482
+ #: ../inc/class-destination-dropbox.php:61
2483
+ msgid "Delete Dropbox Authentication"
2484
+ msgstr "Lösche Dropbox-Authentifizierung"
2485
+
2486
+ # @ backwpup
2487
+ #: ../inc/class-destination-dropbox.php:68
2488
+ msgid "App Access to Dropbox"
2489
+ msgstr "App-Zugang zu Dropbox"
2490
+
2491
+ # @ backwpup
2492
+ #: ../inc/class-destination-dropbox.php:71
2493
+ msgid "Get Dropbox App auth code"
2494
+ msgstr "Hole Auth-Code für Apps-Ordner in Dropbox"
2495
+
2496
+ # @ backwpup
2497
+ #: ../inc/class-destination-dropbox.php:72
2498
+ msgid "Allows restricted access to Apps/BackWPup folder only."
2499
+ msgstr "Erlaubt beschränkten Zugriff ausschließlich zum Ordner Apps/BackWPup."
2500
+
2501
+ # @ backwpup
2502
+ #: ../inc/class-destination-dropbox.php:77
2503
+ msgid "— OR —"
2504
+ msgstr "— ODER —"
2505
+
2506
+ # @ backwpup
2507
+ #: ../inc/class-destination-dropbox.php:80
2508
+ msgid "Full Access to Dropbox"
2509
+ msgstr "Uneingeschränkter Zugang zur Dropbox."
2510
+
2511
+ # @ backwpup
2512
+ #: ../inc/class-destination-dropbox.php:82
2513
+ msgid "BackWPup will have full read and write access to your entire Dropbox. You can specify your backup destination wherever you want, just be aware that ANY files or folders inside of your Dropbox can be overridden or deleted by BackWPup."
2514
+ msgstr "BackWPup erhält uneingeschränkten Lese- und Schreibzugriff zu deiner gesamten Dropbox. Du kannst deinen Zielordner innerhalb deiner Dropbox frei wählen; bedenke jedoch, dass ALLE Dateien und Ordner in deiner Dropbox von BackWPup überschrieben oder gelöscht werden können."
2515
+
2516
+ # @ backwpup
2517
+ #: ../inc/class-destination-dropbox.php:83
2518
+ msgid "Get full Dropbox auth code "
2519
+ msgstr "Hole Auth-Code für gesamte Dropbox"
2520
+
2521
+ # @ backwpup
2522
+ #: ../inc/class-destination-dropbox.php:84
2523
+ msgid "Allows full access to your entire Dropbox."
2524
+ msgstr "Erlaubt uneingeschränkten Zugriff zu deiner gesamten Dropbox."
2525
+
2526
+ # @ backwpup
2527
+ #: ../inc/class-destination-dropbox.php:95
2528
+ msgid "Destination Folder"
2529
+ msgstr "Zielordner"
2530
+
2531
+ # @ theme_hamburg_textdomain
2532
+ #: ../inc/class-destination-dropbox.php:98
2533
+ msgid "Folder inside your Dropbox where your backup archives will be stored."
2534
+ msgstr "Ordner in deiner Dropbox, in dem deine Backup-Archive gespeichert werden."
2535
+
2536
+ # @ backwpup
2537
+ #: ../inc/class-destination-dropbox.php:225
2538
+ #, php-format
2539
+ msgid "%d. Try to send backup file to Dropbox&#160;&hellip;"
2540
+ msgstr "%d. Versuche, das Backup zur Dropbox zu senden&#160;&hellip;"
2541
+
2542
+ # @ backwpup
2543
+ #: ../inc/class-destination-dropbox.php:243
2544
+ #, php-format
2545
+ msgid "Authenticated with Dropbox of user %s"
2546
+ msgstr "Authentifiziert mit Dropbox von Benutzer %s"
2547
+
2548
+ # @ backwpup
2549
+ #: ../inc/class-destination-dropbox.php:246
2550
+ #, php-format
2551
+ msgid "%s available on your Dropbox"
2552
+ msgstr "%s verfügbar in deiner Dropbox"
2553
+
2554
+ # @ backwpup
2555
+ #: ../inc/class-destination-dropbox.php:248
2556
+ msgid "Not Authenticated with Dropbox!"
2557
+ msgstr "Nicht mit Dropbox Authentifiziert!"
2558
+
2559
+ # @ backwpup
2560
+ #: ../inc/class-destination-dropbox.php:251
2561
+ msgid "Uploading to Dropbox&#160;&hellip;"
2562
+ msgstr "Hochladen zur Dropbox hat begonnen&#160;&hellip;"
2563
+
2564
+ # @ backwpup
2565
+ #: ../inc/class-destination-dropbox.php:267
2566
+ msgid "Uploaded file size and local file size don't match."
2567
+ msgstr "Größe der lokalen und der hochgeladenen Datei ist nicht identisch."
2568
+
2569
+ # @ backwpup
2570
+ #: ../inc/class-destination-dropbox.php:271
2571
+ #, php-format
2572
+ msgid "Error transfering backup to %s."
2573
+ msgstr "Fehler beim Übertragen des Backups zu %s."
2574
+
2575
+ # @ backwpup
2576
+ #: ../inc/class-destination-dropbox.php:316
2577
+ #, php-format
2578
+ msgid "Error while deleting file from Dropbox: %s"
2579
+ msgstr "Fehler beim Löschen der Datei aus der Dropbox: %s"
2580
+
2581
+ # @ backwpup
2582
+ #: ../inc/class-destination-dropbox.php:319
2583
+ #, php-format
2584
+ msgid "One file deleted from Dropbox"
2585
+ msgid_plural "%d files deleted on Dropbox"
2586
+ msgstr[0] "Eine Datei aus der Dropbox gelöscht"
2587
+ msgstr[1] "%d Dateien aus der Dropbox gelöscht"
2588
+
2589
+ # @ backwpup
2590
+ #: ../inc/class-jobtype-dbdump.php:13
2591
+ msgid "DB Backup"
2592
+ msgstr "Datenbank-Backup"
2593
+
2594
+ # @ backwpup
2595
+ #: ../inc/class-jobtype-dbdump.php:14
2596
+ msgid "Database backup"
2597
+ msgstr "Datenbank Backup"
2598
+
2599
+ # @ backwpup
2600
+ #: ../inc/class-jobtype-dbdump.php:15
2601
+ msgid "Creates an .sql database backup file"
2602
+ msgstr "Erstellt ein Datenbank-Backup (.sql, .xml)"
2603
+
2604
+ # @ backwpup
2605
+ #: ../inc/class-jobtype-dbdump.php:61
2606
+ msgid "Settings for database backup"
2607
+ msgstr "Einstellungen für das Datenbank Backup"
2608
+
2609
+ # @ backwpup
2610
+ #: ../inc/class-jobtype-dbdump.php:65
2611
+ msgid "Tables to backup"
2612
+ msgstr "Tabellen zu sichern"
2613
+
2614
+ # @ backwpup
2615
+ #: ../inc/class-jobtype-dbdump.php:67
2616
+ msgid "all"
2617
+ msgstr "alle"
2618
+
2619
+ # @ backwpup
2620
+ #: ../inc/class-jobtype-dbdump.php:91
2621
+ msgid "Backup file name"
2622
+ msgstr "Backup Datei Name"
2623
+
2624
+ # @ backwpup
2625
+ #: ../inc/class-jobtype-dbdump.php:99
2626
+ msgid "Backup file compression"
2627
+ msgstr "Backup Datei Komprimierungsmethode"
2628
+
2629
+ # @ backwpup
2630
+ #: ../inc/class-jobtype-dbdump.php:155
2631
+ #, php-format
2632
+ msgid "%d. Try to backup database&#160;&hellip;"
2633
+ msgstr "%d. Versuche, die Datenbank zu sichern&#160;&hellip;"
2634
+
2635
+ # @ backwpup
2636
+ #: ../inc/class-jobtype-dbdump.php:169
2637
+ #, php-format
2638
+ msgid "Connected to database %1$s on %2$s"
2639
+ msgstr "Mit Datenbank %1$s auf %2$s verbunden"
2640
+
2641
+ # @ backwpup
2642
+ #: ../inc/class-jobtype-dbdump.php:182
2643
+ msgid "No tables to backup."
2644
+ msgstr "Es gibt keine Tabellen zu sichern"
2645
+
2646
+ # @ backwpup
2647
+ #: ../inc/class-jobtype-dbdump.php:204
2648
+ #, php-format
2649
+ msgid "Backup database table \"%s\" with \"%s\" records"
2650
+ msgstr "Sichere Datenbank-Tabelle „%s“ mit „%s“ Einträgen"
2651
+
2652
+ # @ backwpup
2653
+ #: ../inc/class-jobtype-dbdump.php:243
2654
+ msgid "MySQL backup file not created"
2655
+ msgstr "MySQL-Sicherungsdatei nicht erstellt"
2656
+
2657
+ # @ backwpup
2658
+ #: ../inc/class-jobtype-dbdump.php:249
2659
+ #, php-format
2660
+ msgid "Added database dump \"%1$s\" with %2$s to backup file list"
2661
+ msgstr "Datenbank Backup \"%1$s\" mit %2$s zur Backup Datei Liste hinzugefügt"
2662
+
2663
+ # @ backwpup
2664
+ #: ../inc/class-jobtype-dbdump.php:255
2665
+ msgid "Database backup done!"
2666
+ msgstr "Datenbank-Backup fertig!"
2667
+
2668
+ # @ backwpup
2669
+ #: ../inc/class-adminbar.php:53
2670
+ msgid "running"
2671
+ msgstr "läuft"
2672
+
2673
+ # @ backwpup
2674
+ #: ../inc/class-adminbar.php:69
2675
+ msgid "Now Running"
2676
+ msgstr "Jetzt läuft"
2677
+
2678
+ # @ backwpup
2679
+ #: ../inc/class-adminbar.php:75
2680
+ msgid "Abort!"
2681
+ msgstr "Abbrechen!"
2682
+
2683
+ # @ backwpup
2684
+ #: ../inc/class-adminbar.php:92
2685
+ msgid "Add new"
2686
+ msgstr "Erstellen"
2687
+
2688
+ # @ backwpup
2689
+ #: ../inc/class-adminbar.php:130
2690
+ msgid "Run Now"
2691
+ msgstr "Jetzt starten"
2692
+
2693
+ # @ backwpup
2694
+ #: ../inc/class-destination-s3-v1.php:249
2695
+ #, php-format
2696
+ msgid "Bucket %1$s created."
2697
+ msgstr "Bucket %1$s erstellt."
2698
+
2699
+ # @ backwpup
2700
+ #: ../inc/class-destination-rsc.php:41
2701
+ msgid "Rack Space Cloud Keys"
2702
+ msgstr "Rack Space Cloud Keys"
2703
+
2704
+ # @ backwpup
2705
+ #: ../inc/class-destination-rsc.php:52
2706
+ msgid "API Key"
2707
+ msgstr "API Key"
2708
+
2709
+ # @ backwpup
2710
+ #: ../inc/class-destination-rsc.php:60
2711
+ msgid "Select region"
2712
+ msgstr "Wähle Region"
2713
+
2714
+ # @ backwpup
2715
+ #: ../inc/class-destination-rsc.php:64
2716
+ #: ../inc/class-destination-rsc.php:66
2717
+ msgid "Rackspace Cloud Files Region"
2718
+ msgstr "Rackspace Cloud Verzeichnis"
2719
+
2720
+ # @ backwpup
2721
+ #: ../inc/class-destination-rsc.php:67
2722
+ msgid "Dallas (DFW)"
2723
+ msgstr "Dallas (DFW)"
2724
+
2725
+ # @ backwpup
2726
+ #: ../inc/class-destination-rsc.php:68
2727
+ msgid "Chicago (ORD)"
2728
+ msgstr "Chicago (ORD)"
2729
+
2730
+ # @ backwpup
2731
+ #: ../inc/class-destination-rsc.php:69
2732
+ msgid "Sydney (SYD)"
2733
+ msgstr "Sydney (SYD)"
2734
+
2735
+ # @ backwpup
2736
+ #: ../inc/class-destination-rsc.php:70
2737
+ msgid "London (LON)"
2738
+ msgstr "London (LON)"
2739
+
2740
+ # @ backwpup
2741
+ #: ../inc/class-destination-rsc.php:71
2742
+ msgid "Northern Virginia (IAD)"
2743
+ msgstr "Northern Virginia (IAD)"
2744
+
2745
+ # @ backwpup
2746
+ #: ../inc/class-destination-rsc.php:72
2747
+ msgid "Hong Kong (HKG)"
2748
+ msgstr "Hong Kong (HKG)"
2749
+
2750
+ # @ backwpup
2751
+ #: ../inc/class-destination-rsc.php:155
2752
+ #, php-format
2753
+ msgid "Rackspace Cloud container \"%s\" created."
2754
+ msgstr "Rackspace Cloud Container\"%s\" erstellt."
2755
+
2756
+ # @ backwpup
2757
+ #: ../inc/class-destination-rsc.php:159
2758
+ #: ../inc/class-destination-rsc.php:267
2759
+ #: ../inc/class-destination-rsc.php:302
2760
+ #: ../inc/class-destination-rsc.php:347
2761
+ #, php-format
2762
+ msgid "Rackspace Cloud API: %s"
2763
+ msgstr "Rackspace Cloud API: %s"
2764
+
2765
+ # @ backwpup
2766
+ #: ../inc/class-destination-rsc.php:250
2767
+ #, php-format
2768
+ msgid "%d. Trying to send backup file to Rackspace cloud &hellip;"
2769
+ msgstr "%d. Versuche, ein Backup zur Rackspace Cloud zu senden &hellip;"
2770
+
2771
+ # @ backwpup
2772
+ #: ../inc/class-destination-rsc.php:264
2773
+ #, php-format
2774
+ msgid "Connected to Rackspace cloud files container %s"
2775
+ msgstr "Verbunden mit Rackspace Cloud Container %s"
2776
+
2777
+ # @ backwpup
2778
+ #: ../inc/class-destination-rsc.php:276
2779
+ msgid "Upload to Rackspace cloud started &hellip;"
2780
+ msgstr "Upload zur Rackspace Cloud nun gestartet &hellip;"
2781
+
2782
+ # @ backwpup
2783
+ #: ../inc/class-destination-rsc.php:292
2784
+ msgid "Backup File transferred to RSC://"
2785
+ msgstr "Backup Archiv übertragen zu RSC://"
2786
+
2787
+ # @ backwpup
2788
+ #: ../inc/class-destination-rsc.php:296
2789
+ msgid "Cannot transfer backup to Rackspace cloud."
2790
+ msgstr "Kann das Backup nicht zur Rackspace Cloud transferieren"
2791
+
2792
+ # @ backwpup
2793
+ #: ../inc/class-destination-rsc.php:341
2794
+ #, php-format
2795
+ msgid "One file deleted on Rackspace cloud container."
2796
+ msgid_plural "%d files deleted on Rackspace cloud container."
2797
+ msgstr[0] "Eine Datei im Rackspace-Container gelöscht"
2798
+ msgstr[1] "%d Dateien im Rackspace-Container gelöscht"
2799
+
2800
+ # @ backwpup
2801
+ #: ../inc/class-destination-rsc.php:444
2802
+ msgid "Missing username!"
2803
+ msgstr "Fehlender Benutzername!"
2804
+
2805
+ # @ backwpup
2806
+ #: ../inc/class-destination-rsc.php:446
2807
+ msgid "Missing API Key!"
2808
+ msgstr "API-Schlüssel wird fehlt!"
2809
+
2810
+ # @ backwpup
2811
+ #: ../inc/class-destination-rsc.php:450
2812
+ msgid "A container could not be found!"
2813
+ msgstr "Kein Container gefunden!"
2814
+
2815
+ # @ backwpup
2816
+ #: ../inc/class-jobtype-dbcheck.php:13
2817
+ msgid "DB Check"
2818
+ msgstr "DB Check"
2819
+
2820
+ # @ backwpup
2821
+ #: ../inc/class-jobtype-dbcheck.php:14
2822
+ msgid "Check database tables"
2823
+ msgstr "Datenbank-Tabellen prüfen"
2824
+
2825
+ # @ backwpup
2826
+ #: ../inc/class-jobtype-dbcheck.php:35
2827
+ msgid "Settings for database check"
2828
+ msgstr "Einstellungen für den Datenbank Check"
2829
+
2830
+ # @ backwpup
2831
+ #: ../inc/class-jobtype-dbcheck.php:39
2832
+ msgid "WordPress tables only"
2833
+ msgstr "Nur WordPress Tabellen"
2834
+
2835
+ # @ backwpup
2836
+ #: ../inc/class-jobtype-dbcheck.php:44
2837
+ msgid "Check WordPress database tables only"
2838
+ msgstr "Teste nur die WordPress-Tabellen"
2839
+
2840
+ # @ backwpup
2841
+ #: ../inc/class-jobtype-dbcheck.php:49
2842
+ msgid "Repair"
2843
+ msgstr "Reparieren"
2844
+
2845
+ # @ backwpup
2846
+ #: ../inc/class-jobtype-dbcheck.php:54
2847
+ msgid "Try to repair defect table"
2848
+ msgstr "Versuche, definierte Tabellen zu reparieren"
2849
+
2850
+ # @ backwpup
2851
+ #: ../inc/class-jobtype-dbcheck.php:79
2852
+ #, php-format
2853
+ msgid "%d. Trying to check database&#160;&hellip;"
2854
+ msgstr "%d. Versuche, die Datenbank zu prüfen&#160;&hellip;"
2855
+
2856
+ # @ backwpup
2857
+ #: ../inc/class-jobtype-dbcheck.php:111
2858
+ #, php-format
2859
+ msgid "Table %1$s is a view. Not checked."
2860
+ msgstr "Tabelle %1$s ist ein View. Nicht geprüft."
2861
+
2862
+ # @ backwpup
2863
+ #: ../inc/class-jobtype-dbcheck.php:116
2864
+ #, php-format
2865
+ msgid "Table %1$s is not a MyISAM/InnoDB table. Not checked."
2866
+ msgstr "Tabelle %1$s ist keine MyISAM/InnoDB Tabelle. Nicht geprüft"
2867
+
2868
+ # @ backwpup
2869
+ #: ../inc/class-jobtype-dbcheck.php:123
2870
+ #: ../inc/class-jobtype-dbcheck.php:125
2871
+ #: ../inc/class-jobtype-dbcheck.php:127
2872
+ #, php-format
2873
+ msgid "Result of table check for %1$s is: %2$s"
2874
+ msgstr "Ergebnis der Tabellenprüfung für %1$s ist: %2$s"
2875
+
2876
+ # @ backwpup
2877
+ #: ../inc/class-jobtype-dbcheck.php:133
2878
+ #: ../inc/class-jobtype-dbcheck.php:135
2879
+ #: ../inc/class-jobtype-dbcheck.php:137
2880
+ #, php-format
2881
+ msgid "Result of table repair for %1$s is: %2$s"
2882
+ msgstr "Ergebnis der Tabellenreparatur für %1$s ist: %2$s"
2883
+
2884
+ # @ backwpup
2885
+ #: ../inc/class-jobtype-dbcheck.php:142
2886
+ msgid "Database check done!"
2887
+ msgstr "Datenbank-Check fertig!"
2888
+
2889
+ # @ backwpup
2890
+ #: ../inc/class-jobtype-dbcheck.php:145
2891
+ msgid "No tables to check."
2892
+ msgstr "Keine Tabellen zum checken."
2893
+
2894
+ # @ backwpup
2895
+ #: ../inc/class-page-settings.php:60
2896
+ msgid "Settings reset to default"
2897
+ msgstr "Die Einstellungen wurden zurückgesetzt."
2898
+
2899
+ # @ backwpup
2900
+ #: ../inc/class-page-settings.php:101
2901
+ msgid "Settings saved"
2902
+ msgstr "Einstellungen gespeichert"
2903
+
2904
+ # @ backwpup
2905
+ #: ../inc/class-page-settings.php:112
2906
+ #, php-format
2907
+ msgid "%s Settings"
2908
+ msgstr "%s Einstellungen"
2909
+
2910
+ # @ backwpup
2911
+ #: ../inc/class-page-settings.php:114
2912
+ #: ../inc/class-page-editjob.php:386
2913
+ msgid "General"
2914
+ msgstr "Allgemein"
2915
+
2916
+ # @ backwpup
2917
+ #: ../inc/class-page-settings.php:114
2918
+ msgid "Network"
2919
+ msgstr "Netzwerk"
2920
+
2921
+ # @ backwpup
2922
+ #: ../inc/class-page-settings.php:114
2923
+ msgid "API Keys"
2924
+ msgstr "API-Schlüssel"
2925
+
2926
+ # @ backwpup
2927
+ #: ../inc/class-page-settings.php:114
2928
+ msgid "Information"
2929
+ msgstr "Informationen"
2930
+
2931
+ # @ backwpup
2932
+ #: ../inc/class-page-settings.php:131
2933
+ msgid "Display Settings"
2934
+ msgstr "Einstellungen anzeigen"
2935
+
2936
+ # @ backwpup
2937
+ #: ../inc/class-page-settings.php:132
2938
+ msgid "Do you want to see BackWPup in the WordPress admin bar?"
2939
+ msgstr "Möchten Sie BackWPup-Menüpunkte in der WordPress-Adminbar sehen?"
2940
+
2941
+ # @ backwpup
2942
+ #: ../inc/class-page-settings.php:135
2943
+ msgid "Admin bar"
2944
+ msgstr "Adminbar"
2945
+
2946
+ # @ backwpup
2947
+ #: ../inc/class-page-settings.php:138
2948
+ msgid "Admin Bar"
2949
+ msgstr "Adminbar"
2950
+
2951
+ # @ backwpup
2952
+ #: ../inc/class-page-settings.php:143
2953
+ msgid "Show BackWPup links in admin bar."
2954
+ msgstr "BackWPup-Links in der Adminbar anzeigen."
2955
+
2956
+ # @ backwpup
2957
+ #: ../inc/class-page-settings.php:148
2958
+ #: ../inc/class-page-settings.php:151
2959
+ msgid "Folder sizes"
2960
+ msgstr "Verzeichnisgrößen"
2961
+
2962
+ # @ backwpup
2963
+ #: ../inc/class-page-settings.php:156
2964
+ msgid "Display folder sizes in the files tab when editing a job. (Might increase loading time of files tab.)"
2965
+ msgstr "Ordnergrößen im Tab Dateien anzeigen, wenn ein Auftrag bearbeitet wird. (Kann die Ladezeit des Tab erhöhen.)"
2966
+
2967
+ # @ backwpup
2968
+ #: ../inc/class-page-settings.php:161
2969
+ msgid "Security"
2970
+ msgstr "Sicherheit"
2971
+
2972
+ # @ backwpup
2973
+ #: ../inc/class-page-settings.php:162
2974
+ msgid "Security option for BackWPup"
2975
+ msgstr "Sicherheitseinstellungen für BackWPup"
2976
+
2977
+ # @ backwpup
2978
+ #: ../inc/class-page-settings.php:165
2979
+ #: ../inc/class-page-settings.php:168
2980
+ msgid "Protect folders"
2981
+ msgstr "Ordner schützen"
2982
+
2983
+ # @ backwpup
2984
+ #: ../inc/class-page-settings.php:173
2985
+ msgid "Protect BackWPup folders ( Temp, Log and Backups ) with <code>.htaccess</code> and <code>index.php</code>"
2986
+ msgstr "Schütze BackWPup-Verzeichnis (Temp, Log und Backups) mit den Dateien .htaccess und index.php"
2987
+
2988
+ # @ backwpup
2989
+ #: ../inc/class-page-settings.php:186
2990
+ msgid "Every time BackWPup runs a backup job, a log file is being generated. Choose where to store your log files and how many of them."
2991
+ msgstr "Jedes Mal, wenn BackWPup einen Auftrag ausführt, wird eine Protokolldatei erzeugt. Wählen Sie aus, wo und wie viele dieser Protokolldateien Sie speichern möchten."
2992
+
2993
+ # @ backwpup
2994
+ #: ../inc/class-page-settings.php:189
2995
+ msgid "Log file folder"
2996
+ msgstr "Protokolldateien-Ordner"
2997
+
2998
+ # @ backwpup
2999
+ #: ../inc/class-page-settings.php:197
3000
+ msgid "Maximum number of log files in folder"
3001
+ msgstr "Anzahl der Dateien, die im Ordner behalten werden"
3002
+
3003
+ # @ backwpup
3004
+ #: ../inc/class-page-settings.php:205
3005
+ #: ../inc/class-page-settings.php:208
3006
+ msgid "Compression"
3007
+ msgstr "Komprimierung"
3008
+
3009
+ # @ backwpup
3010
+ #: ../inc/class-page-settings.php:213
3011
+ msgid "Compress log files with GZip."
3012
+ msgstr "Komprimiere Logdateien mit Gzip."
3013
+
3014
+ # @ backwpup
3015
+ #: ../inc/class-page-settings.php:222
3016
+ msgid "There are a couple of general options for backup jobs. Set them here."
3017
+ msgstr "Es gibt einige allgemeine Optionen für Backup-Aufträge, die Sie hier setzen können."
3018
+
3019
+ # @ backwpup
3020
+ #: ../inc/class-page-settings.php:226
3021
+ msgid "Maximum number of retries for job steps"
3022
+ msgstr "Maximale Anzahl für Neuversuche der Arbeitsschritte"
3023
+
3024
+ # @ backwpup
3025
+ #: ../inc/class-page-settings.php:234
3026
+ msgid "Maximum script execution time"
3027
+ msgstr "Maximale Script Ausführungszeit"
3028
+
3029
+ # @ backwpup
3030
+ #: ../inc/class-page-settings.php:237
3031
+ msgid "Maximum PHP Script execution time"
3032
+ msgstr "Maximale PHP-Script Ausführungszeit"
3033
+
3034
+ # @ backwpup
3035
+ #: ../inc/class-page-settings.php:242
3036
+ msgid "seconds. 0 = disabled."
3037
+ msgstr "Sekunden. 0 = deaktiviert."
3038
+
3039
+ # @ backwpup
3040
+ #: ../inc/class-page-settings.php:248
3041
+ #: ../inc/class-page-settings.php:251
3042
+ msgid "Method for creating ZIP-file archives"
3043
+ msgstr "Methode für das erstellen von ZIP Dateien ist"
3044
+
3045
+ # @ backwpup
3046
+ #: ../inc/class-page-settings.php:255
3047
+ msgid "Auto"
3048
+ msgstr "Auto"
3049
+
3050
+ # @ backwpup
3051
+ #: ../inc/class-page-settings.php:256
3052
+ msgid "ZipArchive"
3053
+ msgstr "ZipArchive"
3054
+
3055
+ # @ backwpup
3056
+ #: ../inc/class-page-settings.php:257
3057
+ msgid "PclZip"
3058
+ msgstr "PclZip"
3059
+
3060
+ # @ backwpup
3061
+ #: ../inc/class-page-settings.php:265
3062
+ msgid "Key to start jobs externally with an URL"
3063
+ msgstr "Schlüssel für den Start eines Auftrags über eine externe URL"
3064
+
3065
+ # @ backwpup
3066
+ #: ../inc/class-page-settings.php:273
3067
+ msgid "No translation"
3068
+ msgstr "Keine Übersetzung"
3069
+
3070
+ # @ backwpup
3071
+ #: ../inc/class-page-settings.php:276
3072
+ msgid "No Translation"
3073
+ msgstr "Keine Übersetzung"
3074
+
3075
+ # @ backwpup
3076
+ #: ../inc/class-page-settings.php:281
3077
+ msgid "No translation for the job, the log will be written in English"
3078
+ msgstr "Keine Übersetzung für diesen Auftrag verwenden, die Log-Dateien werden in Englisch geschrieben. "
3079
+
3080
+ # @ backwpup
3081
+ #: ../inc/class-page-settings.php:287
3082
+ #: ../inc/class-page-settings.php:290
3083
+ msgid "Reduce server load"
3084
+ msgstr "Reduziere Server-Auslastung"
3085
+
3086
+ # @ backwpup
3087
+ #: ../inc/class-page-settings.php:294
3088
+ msgid "disabled"
3089
+ msgstr "deaktiviert"
3090
+
3091
+ # @ backwpup
3092
+ #: ../inc/class-page-settings.php:295
3093
+ msgid "minimum"
3094
+ msgstr "minimum"
3095
+
3096
+ # @ backwpup
3097
+ #: ../inc/class-page-settings.php:296
3098
+ msgid "medium"
3099
+ msgstr "medium"
3100
+
3101
+ # @ backwpup
3102
+ #: ../inc/class-page-settings.php:297
3103
+ msgid "maximum"
3104
+ msgstr "maximum"
3105
+
3106
+ # @ backwpup
3107
+ #: ../inc/class-page-settings.php:310
3108
+ msgid "Is your blog protected with HTTP basic authentication (.htaccess)? If yes, please set the username and password for authentication here."
3109
+ msgstr "Ist deine Wesbite mit einer HTTP-Authentifizierung geschützt (.htaccess)? Wenn ja, trage hier bitte die Zugangsdaten ein."
3110
+
3111
+ # @ backwpup
3112
+ #: ../inc/class-page-settings.php:313
3113
+ msgid "Username:"
3114
+ msgstr "Benutzername:"
3115
+
3116
+ # @ backwpup
3117
+ #: ../inc/class-page-settings.php:321
3118
+ #: ../inc/class-destination-sugarsync.php:34
3119
+ msgid "Password:"
3120
+ msgstr "Passwort:"
3121
+
3122
+ # @ backwpup
3123
+ #: ../inc/class-page-settings.php:341
3124
+ #: ../inc/class-page-settings.php:342
3125
+ msgid "Setting"
3126
+ msgstr "Einstellung"
3127
+
3128
+ # @ backwpup
3129
+ #: ../inc/class-page-settings.php:341
3130
+ #: ../inc/class-page-settings.php:342
3131
+ msgid "Value"
3132
+ msgstr "Wert"
3133
+
3134
+ # @ backwpup
3135
+ #: ../inc/class-page-settings.php:343
3136
+ msgid "WordPress version"
3137
+ msgstr "WordPress-Version"
3138
+
3139
+ # @ backwpup
3140
+ #: ../inc/class-page-settings.php:345
3141
+ msgid "BackWPup version"
3142
+ msgstr "BackWPup-Version"
3143
+
3144
+ # @ backwpup
3145
+ #: ../inc/class-page-settings.php:345
3146
+ msgid "Get pro."
3147
+ msgstr "Pro-Version kaufen"
3148
+
3149
+ # @ backwpup
3150
+ #: ../inc/class-page-settings.php:347
3151
+ msgid "BackWPup Pro version"
3152
+ msgstr "BackWPup-Pro-Version"
3153
+
3154
+ # @ backwpup
3155
+ #: ../inc/class-page-settings.php:348
3156
+ msgid "PHP version"
3157
+ msgstr "PHP-Version"
3158
+
3159
+ # @ backwpup
3160
+ #: ../inc/class-page-settings.php:349
3161
+ msgid "MySQL version"
3162
+ msgstr "MySQL-Version"
3163
+
3164
+ # @ backwpup
3165
+ #: ../inc/class-page-settings.php:352
3166
+ #: ../inc/class-page-settings.php:356
3167
+ msgid "cURL version"
3168
+ msgstr "cURL-Version"
3169
+
3170
+ # @ backwpup
3171
+ #: ../inc/class-page-settings.php:353
3172
+ msgid "cURL SSL version"
3173
+ msgstr "cURL-SSL-Version"
3174
+
3175
+ # @ backwpup
3176
+ #: ../inc/class-page-settings.php:356
3177
+ msgid "unavailable"
3178
+ msgstr "unerreichbar"
3179
+
3180
+ # @ backwpup
3181
+ #: ../inc/class-page-settings.php:358
3182
+ msgid "WP-Cron url:"
3183
+ msgstr "WP-Cron URL:"
3184
+
3185
+ # @ backwpup
3186
+ #: ../inc/class-page-settings.php:360
3187
+ msgid "Server self connect:"
3188
+ msgstr "Verbindung zum Server selbst:"
3189
+
3190
+ # @ backwpup
3191
+ #: ../inc/class-page-settings.php:364
3192
+ #: ../inc/class-page-jobs.php:347
3193
+ #, php-format
3194
+ msgid "The HTTP response test get an error \"%s\""
3195
+ msgstr "Der HTTP Antwort Test bekommt diesen Fehler \"%s\""
3196
+
3197
+ # @ backwpup
3198
+ #: ../inc/class-page-settings.php:366
3199
+ #: ../inc/class-page-jobs.php:349
3200
+ #, php-format
3201
+ msgid "The HTTP response test get a false http status (%s)"
3202
+ msgstr "Der HTTP Antwort Test bekommt den falschen http Status (%s)"
3203
+
3204
+ # @ backwpup
3205
+ #: ../inc/class-page-settings.php:369
3206
+ #: ../inc/pro/class-wizard-systemtest.php:180
3207
+ #, php-format
3208
+ msgid "The BackWPup HTTP response header returns a false value: \"%s\""
3209
+ msgstr "Der HTTP Response Header in BackWPup gibt einen fehlerhaften Wert zurück: \"%s\""
3210
+
3211
+ # @ backwpup
3212
+ #: ../inc/class-page-settings.php:372
3213
+ msgid "Response Test O.K."
3214
+ msgstr "Response Test O.K."
3215
+
3216
+ # @ backwpup
3217
+ #: ../inc/class-page-settings.php:377
3218
+ msgid "Temp folder:"
3219
+ msgstr "Temp Verzeichnis:"
3220
+
3221
+ # @ backwpup
3222
+ #: ../inc/class-page-settings.php:379
3223
+ #, php-format
3224
+ msgid "Temp folder %s doesn't exist."
3225
+ msgstr "Temp Verzeichnis %s existiert nicht."
3226
+
3227
+ # @ backwpup
3228
+ #: ../inc/class-page-settings.php:381
3229
+ #, php-format
3230
+ msgid "Temporary folder %s is not writable."
3231
+ msgstr "Temporärer Ordner %s ist nicht beschreibbar."
3232
+
3233
+ # @ backwpup
3234
+ #: ../inc/class-page-settings.php:386
3235
+ msgid "Log folder:"
3236
+ msgstr "Protokoll-Ordner:"
3237
+
3238
+ # @ backwpup
3239
+ #: ../inc/class-page-settings.php:388
3240
+ #, php-format
3241
+ msgid "Logs folder %s not exist."
3242
+ msgstr "Log Dateien %s Verzeichnis existiert nicht"
3243
+
3244
+ # @ backwpup
3245
+ #: ../inc/class-page-settings.php:390
3246
+ #, php-format
3247
+ msgid "Log folder %s is not writable."
3248
+ msgstr "Protokoll-Ordner %s ist nicht beschreibbar."
3249
+
3250
+ # @ backwpup
3251
+ #: ../inc/class-page-settings.php:394
3252
+ msgid "Server"
3253
+ msgstr "Server"
3254
+
3255
+ # @ backwpup
3256
+ #: ../inc/class-page-settings.php:395
3257
+ msgid "Operating System"
3258
+ msgstr "Betriebssystem"
3259
+
3260
+ # @ backwpup
3261
+ #: ../inc/class-page-settings.php:396
3262
+ msgid "PHP SAPI"
3263
+ msgstr "PHP SAPI"
3264
+
3265
+ # @ backwpup
3266
+ #: ../inc/class-page-settings.php:397
3267
+ msgid "Current PHP user"
3268
+ msgstr "Aktueller PHP user"
3269
+
3270
+ # @ backwpup
3271
+ #: ../inc/class-page-settings.php:398
3272
+ #: ../inc/class-page-settings.php:402
3273
+ #: ../inc/class-page-settings.php:406
3274
+ msgid "On"
3275
+ msgstr "An"
3276
+
3277
+ # @ backwpup
3278
+ #: ../inc/class-page-settings.php:398
3279
+ #: ../inc/class-page-settings.php:404
3280
+ #: ../inc/class-page-settings.php:408
3281
+ msgid "Off"
3282
+ msgstr "Aus"
3283
+
3284
+ # @ backwpup
3285
+ #: ../inc/class-page-settings.php:399
3286
+ msgid "Safe Mode"
3287
+ msgstr "Safe Mode"
3288
+
3289
+ # @ backwpup
3290
+ #: ../inc/class-page-settings.php:400
3291
+ msgid "Maximum execution time"
3292
+ msgstr "Max. Ausführungszeit"
3293
+
3294
+ # @ backwpup
3295
+ #: ../inc/class-page-settings.php:402
3296
+ #: ../inc/class-page-settings.php:404
3297
+ msgid "Alternative WP Cron"
3298
+ msgstr "Alternative WP Cron"
3299
+
3300
+ # @ backwpup
3301
+ #: ../inc/class-page-settings.php:406
3302
+ #: ../inc/class-page-settings.php:408
3303
+ msgid "Disabled WP Cron"
3304
+ msgstr "WP Cron abgeschaltet"
3305
+
3306
+ # @ backwpup
3307
+ #: ../inc/class-page-settings.php:410
3308
+ #: ../inc/class-page-settings.php:412
3309
+ msgid "CHMOD Dir"
3310
+ msgstr "CHMOD Verzeichnis"
3311
+
3312
+ # @ backwpup
3313
+ #: ../inc/class-page-settings.php:414
3314
+ msgid "Server Time"
3315
+ msgstr "Server Zeit"
3316
+
3317
+ # @ backwpup
3318
+ #: ../inc/class-page-settings.php:415
3319
+ msgid "Blog Time"
3320
+ msgstr "Webseite Zeit"
3321
+
3322
+ # @ backwpup
3323
+ #: ../inc/class-page-settings.php:416
3324
+ msgid "Blog Timezone"
3325
+ msgstr "Webseite Zeitzone"
3326
+
3327
+ # @ backwpup
3328
+ #: ../inc/class-page-settings.php:417
3329
+ msgid "Blog Time offset"
3330
+ msgstr "Webseite Zeitversetzung"
3331
+
3332
+ # @ backwpup
3333
+ #: ../inc/class-page-settings.php:417
3334
+ #, php-format
3335
+ msgid "%s hours"
3336
+ msgstr "%s Stunden"
3337
+
3338
+ # @ backwpup
3339
+ #: ../inc/class-page-settings.php:418
3340
+ msgid "Blog language"
3341
+ msgstr "Webseiten Sprache"
3342
+
3343
+ # @ backwpup
3344
+ #: ../inc/class-page-settings.php:419
3345
+ msgid "MySQL Client encoding"
3346
+ msgstr "MySQL Client Encoding"
3347
+
3348
+ # @ backwpup
3349
+ #: ../inc/class-page-settings.php:422
3350
+ msgid "Blog charset"
3351
+ msgstr "Webseiten Charset"
3352
+
3353
+ # @ backwpup
3354
+ #: ../inc/class-page-settings.php:423
3355
+ msgid "PHP Memory limit"
3356
+ msgstr "PHP Memory Limit"
3357
+
3358
+ # @ backwpup
3359
+ #: ../inc/class-page-settings.php:424
3360
+ msgid "WP memory limit"
3361
+ msgstr "WordPress-Memory-Limit"
3362
+
3363
+ # @ backwpup
3364
+ #: ../inc/class-page-settings.php:425
3365
+ msgid "WP maximum memory limit"
3366
+ msgstr "Maximales WordPress-Memory-Limit"
3367
+
3368
+ # @ backwpup
3369
+ #: ../inc/class-page-settings.php:426
3370
+ msgid "Memory in use"
3371
+ msgstr "Speicher in Benutzung"
3372
+
3373
+ # @ backwpup
3374
+ #: ../inc/class-page-settings.php:431
3375
+ msgid "Disabled PHP Functions:"
3376
+ msgstr "Deaktivierte PHP Funktionen:"
3377
+
3378
+ # @ backwpup
3379
+ #: ../inc/class-page-settings.php:436
3380
+ msgid "Loaded PHP Extensions:"
3381
+ msgstr "Geladene PHP Erweiterungen"
3382
+
3383
+ # @ backwpup
3384
+ #: ../inc/class-page-settings.php:448
3385
+ msgid "Save Changes"
3386
+ msgstr "Änderungen speichern"
3387
+
3388
+ # @ backwpup
3389
+ #: ../inc/class-page-settings.php:450
3390
+ msgid "Reset all settings to default"
3391
+ msgstr "Alle Einstellungen zurücksetzen"
3392
+
3393
+ # @ backwpup
3394
+ #: ../inc/class-page-editjob.php:37
3395
+ msgid "Overview"
3396
+ msgstr "Überblick"
3397
+
3398
+ # @ backwpup
3399
+ #: ../inc/class-page-editjob.php:102
3400
+ #, php-format
3401
+ msgid "Job with ID %d"
3402
+ msgstr "Auftrag mit der ID %d"
3403
+
3404
+ # @ backwpup
3405
+ #: ../inc/class-page-editjob.php:191
3406
+ #, php-format
3407
+ msgid "Changes for job <i>%s</i> saved."
3408
+ msgstr "Änderungen für den Auftrag <i>%s</i> gesichert."
3409
+
3410
+ # @ backwpup
3411
+ #: ../inc/class-page-editjob.php:192
3412
+ msgid "Jobs overview"
3413
+ msgstr "Auftragsübersicht"
3414
+
3415
+ # @ backwpup
3416
+ #: ../inc/class-page-editjob.php:192
3417
+ #: ../inc/class-page-jobs.php:117
3418
+ msgid "Run now"
3419
+ msgstr "Jetzt starten"
3420
+
3421
+ # @ backwpup
3422
+ #: ../inc/class-page-editjob.php:331
3423
+ msgid "Working as <a href=\"http://wikipedia.org/wiki/Cron\">Cron</a> schedule:"
3424
+ msgstr "Als <a href=\\\"http://de.wikipedia.org/wiki/Cron\\\">Cron-Job</a> ausführen:"
3425
+
3426
+ # @ backwpup
3427
+ #: ../inc/class-page-editjob.php:340
3428
+ #, php-format
3429
+ msgid "ATTENTION: Job runs every %d minutes!"
3430
+ msgstr "ACHTUNG: Auftrag läuft alle %d Minuten!"
3431
+
3432
+ # @ backwpup
3433
+ #: ../inc/class-page-editjob.php:346
3434
+ #, php-format
3435
+ msgid "ATTENTION: Job runs every %d hours!"
3436
+ msgstr "ACHTUNG: Auftrag läuft alle %d Stunden!"
3437
+
3438
+ # @ backwpup
3439
+ #: ../inc/class-page-editjob.php:350
3440
+ msgid "ATTENTION: Can't calculate cron!"
3441
+ msgstr "ACHTUNG: Kann cron nicht berechnen!"
3442
+
3443
+ # @ backwpup
3444
+ #: ../inc/class-page-editjob.php:353
3445
+ msgid "Next runtime:"
3446
+ msgstr "Nächster Durchlauf:"
3447
+
3448
+ # @ backwpup
3449
+ #: ../inc/class-page-editjob.php:386
3450
+ msgid "Schedule"
3451
+ msgstr "Planen"
3452
+
3453
+ # @ backwpup
3454
+ #: ../inc/class-page-editjob.php:401
3455
+ #, php-format
3456
+ msgid "To: %s"
3457
+ msgstr "Zu: %s"
3458
+
3459
+ # @ backwpup
3460
+ #: ../inc/class-page-editjob.php:407
3461
+ #, php-format
3462
+ msgid "%s Job:"
3463
+ msgstr "%s Auftrag: "
3464
+
3465
+ # @ backwpup
3466
+ #: ../inc/class-page-editjob.php:434
3467
+ #: ../inc/class-page-jobs.php:76
3468
+ msgid "Job Name"
3469
+ msgstr "Auftragsname"
3470
+
3471
+ # @ backwpup
3472
+ #: ../inc/class-page-editjob.php:438
3473
+ msgid "Please name this job."
3474
+ msgstr "Bitte benennen Sie diesen Auftrag."
3475
+
3476
+ # @ backwpup
3477
+ #: ../inc/class-page-editjob.php:446
3478
+ msgid "Job Tasks"
3479
+ msgstr "Auftragsdetails"
3480
+
3481
+ # @ backwpup
3482
+ #: ../inc/class-page-editjob.php:450
3483
+ msgid "This job is a&#160;&hellip;"
3484
+ msgstr "Dieser Auftrag ist ein&#160;&hellip;"
3485
+
3486
+ # @ backwpup
3487
+ #: ../inc/class-page-editjob.php:453
3488
+ msgid "Job tasks"
3489
+ msgstr "Auftragsdetails"
3490
+
3491
+ # @ backwpup
3492
+ #: ../inc/class-page-editjob.php:471
3493
+ msgid "Backup File Creation"
3494
+ msgstr "Erstellen der Backup-Datei"
3495
+
3496
+ # @ backwpup
3497
+ #: ../inc/class-page-editjob.php:476
3498
+ #: ../inc/class-page-editjob.php:479
3499
+ msgid "Backup type"
3500
+ msgstr "Backup Typ"
3501
+
3502
+ # @ backwpup
3503
+ #: ../inc/class-page-editjob.php:483
3504
+ msgid "Synchronize file by file to destination"
3505
+ msgstr "Synchronisiere Datei für Datei zum Auftragsziel"
3506
+
3507
+ # @ backwpup
3508
+ #: ../inc/class-page-editjob.php:487
3509
+ msgid "Create a backup archive"
3510
+ msgstr "Backup erstellen"
3511
+
3512
+ # @ backwpup
3513
+ #: ../inc/class-page-editjob.php:493
3514
+ msgid "Archive name"
3515
+ msgstr "Archivname"
3516
+
3517
+ # @ backwpup
3518
+ #: ../inc/class-page-editjob.php:525
3519
+ #: ../inc/class-page-editjob.php:528
3520
+ msgid "Archive Format"
3521
+ msgstr "Archiv Format"
3522
+
3523
+ # @ backwpup
3524
+ #: ../inc/class-page-editjob.php:531
3525
+ msgid "PHP Zip functions will be used if available (needs less memory). Otherwise the PCLZip class will be used."
3526
+ msgstr "PHP-Zip-Funktionen werden verwendet, sofern verfügbar (schneller). Ansonsten wird die Klasse PCLZip verwendet."
3527
+
3528
+ # @ backwpup
3529
+ #: ../inc/class-page-editjob.php:531
3530
+ #: ../inc/class-page-editjob.php:533
3531
+ msgid "Zip"
3532
+ msgstr "Zip"
3533
+
3534
+ # @ backwpup
3535
+ #: ../inc/class-page-editjob.php:533
3536
+ #: ../inc/class-page-editjob.php:538
3537
+ #: ../inc/class-page-editjob.php:542
3538
+ msgid "Disabled due to missing PHP function."
3539
+ msgstr "Deaktiviert wegen nicht verfügbarer PHP-Funktion."
3540
+
3541
+ # @ backwpup
3542
+ #: ../inc/class-page-editjob.php:534
3543
+ msgid "A tarballed, not compressed archive (fast and less memory)"
3544
+ msgstr "Ein TAR-Archiv, nicht komprimiert (schnell und speicherschonend)"
3545
+
3546
+ # @ backwpup
3547
+ #: ../inc/class-page-editjob.php:534
3548
+ msgid "Tar"
3549
+ msgstr "Tar"
3550
+
3551
+ # @ backwpup
3552
+ #: ../inc/class-page-editjob.php:536
3553
+ msgid "A tarballed, GZipped archive (fast and less memory)"
3554
+ msgstr "Ein TAR-GZ-Archiv (schnell und speicherschonend)"
3555
+
3556
+ # @ backwpup
3557
+ #: ../inc/class-page-editjob.php:536
3558
+ #: ../inc/class-page-editjob.php:538
3559
+ msgid "Tar GZip"
3560
+ msgstr "Tar GZip"
3561
+
3562
+ # @ backwpup
3563
+ #: ../inc/class-page-editjob.php:540
3564
+ msgid "A tarballed, BZipped archive (fast and less memory)"
3565
+ msgstr "Ein TAR-BZ-Archiv (schnell und speicherschonend)"
3566
+
3567
+ # @ backwpup
3568
+ #: ../inc/class-page-editjob.php:540
3569
+ #: ../inc/class-page-editjob.php:542
3570
+ msgid "Tar BZip2"
3571
+ msgstr "Tar BZip2"
3572
+
3573
+ # @ backwpup
3574
+ #: ../inc/class-page-editjob.php:548
3575
+ msgid "Job Destination"
3576
+ msgstr "Zielordner des Auftrags"
3577
+
3578
+ # @ backwpup
3579
+ #: ../inc/class-page-editjob.php:552
3580
+ #: ../inc/class-page-editjob.php:555
3581
+ msgid "Where should your backup file be stored?"
3582
+ msgstr "Wo soll die Backup-Datei gespeichert werden?"
3583
+
3584
+ # @ backwpup
3585
+ #: ../inc/class-page-editjob.php:576
3586
+ msgid "Log Files"
3587
+ msgstr "Protokoll-Dateien"
3588
+
3589
+ # @ backwpup
3590
+ #: ../inc/class-page-editjob.php:580
3591
+ msgid "Send log to email address"
3592
+ msgstr "Protokoll-Datei an E-Mail-Adresse senden"
3593
+
3594
+ # @ backwpup
3595
+ #: ../inc/class-page-editjob.php:588
3596
+ msgid "Email FROM field"
3597
+ msgstr "VON-Feld der E-Mail"
3598
+
3599
+ # @ backwpup
3600
+ #: ../inc/class-page-editjob.php:596
3601
+ msgid "Errors only"
3602
+ msgstr "Nur Fehler"
3603
+
3604
+ # @ backwpup
3605
+ #: ../inc/class-page-editjob.php:601
3606
+ msgid "Send email with log only when errors occur during job execution."
3607
+ msgstr "Sende eine E-Mail mit Protokoll nur, wenn während des Auftrags ein Fehler aufgetreten ist."
3608
+
3609
+ # @ backwpup
3610
+ #: ../inc/class-page-editjob.php:612
3611
+ msgid "Job Schedule"
3612
+ msgstr "Auftragsplanung"
3613
+
3614
+ # @ backwpup
3615
+ #: ../inc/class-page-editjob.php:616
3616
+ #: ../inc/class-page-editjob.php:619
3617
+ msgid "Start job"
3618
+ msgstr "Auftrag starten"
3619
+
3620
+ # @ backwpup
3621
+ #: ../inc/class-page-editjob.php:623
3622
+ msgid "manually only"
3623
+ msgstr "nur manuell"
3624
+
3625
+ # @ backwpup
3626
+ #: ../inc/class-page-editjob.php:627
3627
+ msgid "with WordPress cron"
3628
+ msgstr "mit WordPress Cron"
3629
+
3630
+ # @ backwpup
3631
+ #: ../inc/class-page-editjob.php:634
3632
+ msgid "with a link"
3633
+ msgstr "mit einem Link"
3634
+
3635
+ # @ backwpup
3636
+ #: ../inc/class-page-editjob.php:640
3637
+ msgid "Start job with CLI"
3638
+ msgstr "Auftrag per CLI starten"
3639
+
3640
+ # @ backwpup
3641
+ #: ../inc/class-page-editjob.php:643
3642
+ #, php-format
3643
+ msgid "Use <a href=\"http://wp-cli.org/\">WP-CLI</a> to run jobs from commandline or <a href=\"%s\">get the start script</a>."
3644
+ msgstr "Verwenden Sie <a href=\"http://wp-cli.org/\">WP-CLI</a>, um Aufträge per Kommandozeile auszulösen, oder <a href=\"%s\">dieses Start-Script</a>."
3645
+
3646
+ # @ backwpup
3647
+ #: ../inc/class-page-editjob.php:648
3648
+ msgid "Schedule execution time"
3649
+ msgstr "Plane Ausführungszeit"
3650
+
3651
+ # @ backwpup
3652
+ #: ../inc/class-page-editjob.php:652
3653
+ #: ../inc/class-page-editjob.php:655
3654
+ msgid "Scheduler type"
3655
+ msgstr "Planungstyp"
3656
+
3657
+ # @ backwpup
3658
+ #: ../inc/class-page-editjob.php:659
3659
+ msgid "basic"
3660
+ msgstr "einfach"
3661
+
3662
+ # @ backwpup
3663
+ #: ../inc/class-page-editjob.php:663
3664
+ msgid "advanced"
3665
+ msgstr "erweitert"
3666
+
3667
+ # @ backwpup
3668
+ #: ../inc/class-page-editjob.php:692
3669
+ #: ../inc/class-page-editjob.php:760
3670
+ msgid "Scheduler"
3671
+ msgstr "Planer"
3672
+
3673
+ # @ backwpup
3674
+ #: ../inc/class-page-editjob.php:702
3675
+ msgid "Hour"
3676
+ msgstr "Stunde"
3677
+
3678
+ # @ backwpup
3679
+ #: ../inc/class-page-editjob.php:705
3680
+ msgid "Minute"
3681
+ msgstr "Minute"
3682
+
3683
+ # @ backwpup
3684
+ #: ../inc/class-page-editjob.php:709
3685
+ msgid "monthly"
3686
+ msgstr "monatlich"
3687
+
3688
+ # @ backwpup
3689
+ #: ../inc/class-page-editjob.php:711
3690
+ msgid "on"
3691
+ msgstr "am"
3692
+
3693
+ # @ backwpup
3694
+ #: ../inc/class-page-editjob.php:721
3695
+ msgid "weekly"
3696
+ msgstr "wöchentlich"
3697
+
3698
+ # @ backwpup
3699
+ #: ../inc/class-page-editjob.php:723
3700
+ #: ../inc/class-page-editjob.php:830
3701
+ msgid "Sunday"
3702
+ msgstr "Sonntag"
3703
+
3704
+ # @ backwpup
3705
+ #: ../inc/class-page-editjob.php:724
3706
+ #: ../inc/class-page-editjob.php:831
3707
+ msgid "Monday"
3708
+ msgstr "Montag"
3709
+
3710
+ # @ backwpup
3711
+ #: ../inc/class-page-editjob.php:725
3712
+ #: ../inc/class-page-editjob.php:832
3713
+ msgid "Tuesday"
3714
+ msgstr "Dienstag"
3715
+
3716
+ # @ backwpup
3717
+ #: ../inc/class-page-editjob.php:726
3718
+ #: ../inc/class-page-editjob.php:833
3719
+ msgid "Wednesday"
3720
+ msgstr "Mittwoch"
3721
+
3722
+ # @ backwpup
3723
+ #: ../inc/class-page-editjob.php:727
3724
+ #: ../inc/class-page-editjob.php:834
3725
+ msgid "Thursday"
3726
+ msgstr "Donnerstag"
3727
+
3728
+ # @ backwpup
3729
+ #: ../inc/class-page-editjob.php:728
3730
+ #: ../inc/class-page-editjob.php:835
3731
+ msgid "Friday"
3732
+ msgstr "Freitag"
3733
+
3734
+ # @ backwpup
3735
+ #: ../inc/class-page-editjob.php:729
3736
+ #: ../inc/class-page-editjob.php:836
3737
+ msgid "Saturday"
3738
+ msgstr "Samstag"
3739
+
3740
+ # @ backwpup
3741
+ #: ../inc/class-page-editjob.php:739
3742
+ msgid "daily"
3743
+ msgstr "täglich"
3744
+
3745
+ # @ backwpup
3746
+ #: ../inc/class-page-editjob.php:749
3747
+ msgid "hourly"
3748
+ msgstr "stündlich"
3749
+
3750
+ # @ backwpup
3751
+ #: ../inc/class-page-editjob.php:763
3752
+ msgid "Minutes:"
3753
+ msgstr "Minuten:"
3754
+
3755
+ # @ backwpup
3756
+ #: ../inc/class-page-editjob.php:765
3757
+ #: ../inc/class-page-editjob.php:778
3758
+ #: ../inc/class-page-editjob.php:790
3759
+ #: ../inc/class-page-editjob.php:804
3760
+ #: ../inc/class-page-editjob.php:826
3761
+ msgid "Any (*)"
3762
+ msgstr "Alle (*)"
3763
+
3764
+ # @ backwpup
3765
+ #: ../inc/class-page-editjob.php:775
3766
+ msgid "Hours:"
3767
+ msgstr "Stunden:"
3768
+
3769
+ # @ backwpup
3770
+ #: ../inc/class-page-editjob.php:788
3771
+ msgid "Day of Month:"
3772
+ msgstr "Tag des Monats:"
3773
+
3774
+ # @ backwpup
3775
+ #: ../inc/class-page-editjob.php:802
3776
+ msgid "Month:"
3777
+ msgstr "Monat:"
3778
+
3779
+ # @ backwpup
3780
+ #: ../inc/class-page-editjob.php:808
3781
+ msgid "January"
3782
+ msgstr "Januar"
3783
+
3784
+ # @ backwpup
3785
+ #: ../inc/class-page-editjob.php:809
3786
+ msgid "February"
3787
+ msgstr "Februar"
3788
+
3789
+ # @ backwpup
3790
+ #: ../inc/class-page-editjob.php:810
3791
+ msgid "March"
3792
+ msgstr "März"
3793
+
3794
+ # @ backwpup
3795
+ #: ../inc/class-page-editjob.php:811
3796
+ msgid "April"
3797
+ msgstr "April"
3798
+
3799
+ # @ backwpup
3800
+ #: ../inc/class-page-editjob.php:812
3801
+ msgid "May"
3802
+ msgstr "Mai"
3803
+
3804
+ # @ backwpup
3805
+ #: ../inc/class-page-editjob.php:813
3806
+ msgid "June"
3807
+ msgstr "Juni"
3808
+
3809
+ # @ backwpup
3810
+ #: ../inc/class-page-editjob.php:814
3811
+ msgid "July"
3812
+ msgstr "Juli"
3813
+
3814
+ # @ backwpup
3815
+ #: ../inc/class-page-editjob.php:815
3816
+ msgid "August"
3817
+ msgstr "August"
3818
+
3819
+ # @ backwpup
3820
+ #: ../inc/class-page-editjob.php:816
3821
+ msgid "September"
3822
+ msgstr "September"
3823
+
3824
+ # @ backwpup
3825
+ #: ../inc/class-page-editjob.php:817
3826
+ msgid "October"
3827
+ msgstr "Oktober"
3828
+
3829
+ # @ backwpup
3830
+ #: ../inc/class-page-editjob.php:818
3831
+ msgid "November"
3832
+ msgstr "November"
3833
+
3834
+ # @ backwpup
3835
+ #: ../inc/class-page-editjob.php:819
3836
+ msgid "December"
3837
+ msgstr "Dezember"
3838
+
3839
+ # @ backwpup
3840
+ #: ../inc/class-page-editjob.php:824
3841
+ msgid "Day of Week:"
3842
+ msgstr "Wochentag:"
3843
+
3844
+ # @ backwpup
3845
+ #: ../inc/class-page-editjob.php:860
3846
+ msgid "Save changes"
3847
+ msgstr "Änderungen speichern"
3848
+
3849
+ # @ backwpup
3850
+ #: ../inc/class-jobtype-wpplugin.php:13
3851
+ msgid "Plugins"
3852
+ msgstr "Plugins"
3853
+
3854
+ # @ backwpup
3855
+ #: ../inc/class-jobtype-wpplugin.php:14
3856
+ msgid "Installed plugins list"
3857
+ msgstr "Liste der installierten Plugins"
3858
+
3859
+ # @ backwpup
3860
+ #: ../inc/class-jobtype-wpplugin.php:45
3861
+ msgid "Plugin list file name"
3862
+ msgstr "Dateiname der Plugin-Liste"
3863
+
3864
+ # @ backwpup
3865
+ #: ../inc/class-jobtype-wpplugin.php:93
3866
+ #, php-format
3867
+ msgid "%d. Trying to generate a file with installed plugin names&#160;&hellip;"
3868
+ msgstr "%d. Versuche, eine Liste der installierten Plugins zu erstellen&#160;&hellip;"
3869
+
3870
+ # @ backwpup
3871
+ #: ../inc/class-jobtype-wpplugin.php:120
3872
+ msgid "All plugin information:"
3873
+ msgstr "Alle Plugin-Informationen"
3874
+
3875
+ # @ backwpup
3876
+ #: ../inc/class-jobtype-wpplugin.php:122
3877
+ #, php-format
3878
+ msgid "from %s"
3879
+ msgstr "von %s"
3880
+
3881
+ # @ backwpup
3882
+ #: ../inc/class-jobtype-wpplugin.php:124
3883
+ msgid "Active plugins:"
3884
+ msgstr "Aktive Plugins:"
3885
+
3886
+ # @ backwpup
3887
+ #: ../inc/class-jobtype-wpplugin.php:130
3888
+ msgid "Inactive plugins:"
3889
+ msgstr "Inaktive Plugins:"
3890
+
3891
+ # @ backwpup
3892
+ #: ../inc/class-jobtype-wpplugin.php:142
3893
+ #, php-format
3894
+ msgid "Added plugin list file \"%1$s\" with %2$s to backup file list."
3895
+ msgstr "Plugin Listendatei \"%1$s\" mit %2$s zur Backup-Datei-Liste hinzugefügt."
3896
+
3897
+ # @ backwpup
3898
+ #: ../inc/class-destination-sugarsync.php:22
3899
+ msgid "Sugarsync Login"
3900
+ msgstr "SugarSync Login"
3901
+
3902
+ # @ backwpup
3903
+ #: ../inc/class-destination-sugarsync.php:30
3904
+ msgid "Email address:"
3905
+ msgstr "E-Mail-Adresse"
3906
+
3907
+ # @ backwpup
3908
+ #: ../inc/class-destination-sugarsync.php:40
3909
+ #: ../inc/class-destination-sugarsync.php:121
3910
+ msgid "Authenticate with Sugarsync!"
3911
+ msgstr "Mit SugarSync authentifizieren!"
3912
+
3913
+ # @ backwpup
3914
+ #: ../inc/class-destination-sugarsync.php:42
3915
+ #: ../inc/class-destination-sugarsync.php:137
3916
+ msgid "Create Sugarsync account"
3917
+ msgstr "SugarSync-Konto erstellen"
3918
+
3919
+ # @ backwpup
3920
+ #: ../inc/class-destination-sugarsync.php:51
3921
+ #: ../inc/class-destination-sugarsync.php:133
3922
+ msgid "Delete Sugarsync authentication!"
3923
+ msgstr "Lösche SugarSync Authentifizierung"
3924
+
3925
+ # @ backwpup
3926
+ #: ../inc/class-destination-sugarsync.php:57
3927
+ msgid "SugarSync Root"
3928
+ msgstr "SugarSync-Wurzelverzeichnis"
3929
+
3930
+ # @ backwpup
3931
+ #: ../inc/class-destination-sugarsync.php:61
3932
+ msgid "Sync folder selection"
3933
+ msgstr "Sync Ordner Auswahl"
3934
+
3935
+ # @ backwpup
3936
+ #: ../inc/class-destination-sugarsync.php:69
3937
+ msgid "No Syncfolders found!"
3938
+ msgstr "Keine Sync-Ordner gefunden!"
3939
+
3940
+ # @ backwpup
3941
+ #: ../inc/class-destination-sugarsync.php:90
3942
+ msgid "Folder in root"
3943
+ msgstr "Ordner im Wurzelverzeichnis"
3944
+
3945
+ # @ backwpup
3946
+ #: ../inc/class-destination-sugarsync.php:227
3947
+ #, php-format
3948
+ msgid "%d. Try to send backup to SugarSync&#160;&hellip;"
3949
+ msgstr "%d. Versuche, ein Backup zu SugarSync zu senden&#160;&hellip;"
3950
+
3951
+ # @ backwpup
3952
+ #: ../inc/class-destination-sugarsync.php:234
3953
+ #, php-format
3954
+ msgid "Authenticated to SugarSync with nickname %s"
3955
+ msgstr "Authentifiziert bei SugarSync mit dem Namen %s"
3956
+
3957
+ # @ backwpup
3958
+ #: ../inc/class-destination-sugarsync.php:237
3959
+ #, php-format
3960
+ msgctxt "Available space on SugarSync"
3961
+ msgid "Not enough disk space available on SugarSync. Available: %s."
3962
+ msgstr "Nicht genug Speicherplatz verfügbar bei SugarSync. Verfügbar: %s."
3963
+
3964
+ # @ backwpup
3965
+ #: ../inc/class-destination-sugarsync.php:243
3966
+ #, php-format
3967
+ msgid "%s available at SugarSync"
3968
+ msgstr "%s verfügbar bei SugarSync"
3969
+
3970
+ # @ backwpup
3971
+ #: ../inc/class-destination-sugarsync.php:250
3972
+ msgid "Starting upload to SugarSync&#160;&hellip;"
3973
+ msgstr "Hochladen zu SugarSync hat begonnen&#160;&hellip;"
3974
+
3975
+ # @ backwpup
3976
+ #: ../inc/class-destination-sugarsync.php:260
3977
+ msgid "Cannot transfer backup to SugarSync!"
3978
+ msgstr "Backup kann nicht zu SugarSync übertragen werden!"
3979
+
3980
+ # @ backwpup
3981
+ #: ../inc/class-destination-sugarsync.php:299
3982
+ #, php-format
3983
+ msgid "One file deleted on SugarSync folder"
3984
+ msgid_plural "%d files deleted on SugarSync folder"
3985
+ msgstr[0] "Eine Datei im SugarSync-Ordner gelöscht"
3986
+ msgstr[1] "%d Dateien im SugarSync-Ordner gelöscht"
3987
+
3988
+ # @ backwpup
3989
+ #: ../inc/class-destination-sugarsync.php:305
3990
+ #, php-format
3991
+ msgid "SugarSync API: %s"
3992
+ msgstr "SugarSync API: %s"
3993
+
3994
+ # @ backwpup
3995
+ #: ../inc/class-page-jobs.php:52
3996
+ msgid "No Jobs."
3997
+ msgstr "Keine Aufträge."
3998
+
3999
+ # @ backwpup
4000
+ #: ../inc/class-page-jobs.php:78
4001
+ msgid "Destinations"
4002
+ msgstr "Zielordner"
4003
+
4004
+ # @ backwpup
4005
+ #: ../inc/class-page-jobs.php:79
4006
+ msgid "Next Run"
4007
+ msgstr "Nächster Durchlauf"
4008
+
4009
+ # @ backwpup
4010
+ #: ../inc/class-page-jobs.php:80
4011
+ msgid "Last Run"
4012
+ msgstr "Letzter Durchlauf"
4013
+
4014
+ # @ backwpup
4015
+ #: ../inc/class-page-jobs.php:111
4016
+ msgid "Edit"
4017
+ msgstr "Bearbeiten"
4018
+
4019
+ # @ backwpup
4020
+ #: ../inc/class-page-jobs.php:112
4021
+ msgid "Copy"
4022
+ msgstr "Kopieren"
4023
+
4024
+ # @ backwpup
4025
+ #: ../inc/class-page-jobs.php:123
4026
+ msgid "Last log"
4027
+ msgstr "Letztes Log"
4028
+
4029
+ # @ backwpup
4030
+ #: ../inc/class-page-jobs.php:185
4031
+ msgid "Not needed or set"
4032
+ msgstr "Nicht gebraucht oder eingestellt"
4033
+
4034
+ # @ backwpup
4035
+ #: ../inc/class-page-jobs.php:207
4036
+ #, php-format
4037
+ msgid "Running for: %s seconds"
4038
+ msgstr "Läuft seit %s Sekunden"
4039
+
4040
+ # @ backwpup
4041
+ #: ../inc/class-page-jobs.php:213
4042
+ #, php-format
4043
+ msgid "Cron: %s"
4044
+ msgstr "Cron: %s"
4045
+
4046
+ # @ backwpup
4047
+ #: ../inc/class-page-jobs.php:213
4048
+ #, php-format
4049
+ msgid "%1$s at %2$s by WP-Cron"
4050
+ msgstr "%1$s um %2$s mit WP-Cron"
4051
+
4052
+ # @ backwpup
4053
+ #: ../inc/class-page-jobs.php:218
4054
+ msgid "Inactive"
4055
+ msgstr "Inaktiv"
4056
+
4057
+ # @ backwpup
4058
+ #: ../inc/class-page-jobs.php:240
4059
+ #, php-format
4060
+ msgid "Runtime: %d seconds"
4061
+ msgstr "Ausführungszeit: %d Sekunden"
4062
+
4063
+ # @ backwpup
4064
+ #: ../inc/class-page-jobs.php:243
4065
+ msgid "not yet"
4066
+ msgstr "noch nicht"
4067
+
4068
+ # @ backwpup
4069
+ #: ../inc/class-page-jobs.php:247
4070
+ msgid "Download last backup"
4071
+ msgstr "Letztes Backup herunterladen"
4072
+
4073
+ # @ backwpup
4074
+ #: ../inc/class-page-jobs.php:252
4075
+ msgid "Log"
4076
+ msgstr "Protokoll"
4077
+
4078
+ # @ backwpup
4079
+ #: ../inc/class-page-jobs.php:295
4080
+ msgid "Copy of"
4081
+ msgstr "Kopie von"
4082
+
4083
+ # @ backwpup
4084
+ #: ../inc/class-page-jobs.php:367
4085
+ #, php-format
4086
+ msgid "Job “%s” has started, but not responded for 10 seconds."
4087
+ msgstr "Auftrag „%s“ wurde gestartet, hat jedoch seit 10 Sekunden nicht geantwortet."
4088
+
4089
+ # @ backwpup
4090
+ #: ../inc/class-page-jobs.php:372
4091
+ #, php-format
4092
+ msgid "Job \"%s\" started."
4093
+ msgstr "Auftrag \"%s\" wurde gestartet."
4094
+
4095
+ # @ backwpup
4096
+ #: ../inc/class-page-jobs.php:497
4097
+ #, php-format
4098
+ msgid "%s Jobs"
4099
+ msgstr "%s Aufträge"
4100
+
4101
+ # @ backwpup
4102
+ #: ../inc/class-page-jobs.php:517
4103
+ #, php-format
4104
+ msgid "Job currently running: %s"
4105
+ msgstr "Aktueller Auftrag wird bearbeitet: %s"
4106
+
4107
+ # @ backwpup
4108
+ #: ../inc/class-page-jobs.php:518
4109
+ msgid "Warnings:"
4110
+ msgstr "Warnungen:"
4111
+
4112
+ # @ backwpup
4113
+ #: ../inc/class-page-jobs.php:519
4114
+ msgid "Errors:"
4115
+ msgstr "Fehler:"
4116
+
4117
+ # @ backwpup
4118
+ #: ../inc/class-page-jobs.php:520
4119
+ msgid "Log of running job"
4120
+ msgstr "Protokoll des laufenden Auftrags"
4121
+
4122
+ # @ backwpup
4123
+ #: ../inc/class-page-jobs.php:520
4124
+ msgid "Display working log"
4125
+ msgstr "Zeige Auftragslog"
4126
+
4127
+ # @ backwpup
4128
+ #: ../inc/class-page-jobs.php:521
4129
+ #: ../inc/class-page-backwpup.php:349
4130
+ msgid "Abort"
4131
+ msgstr "Abbrechen"
4132
+
4133
+ # @ backwpup
4134
+ #: ../inc/class-page-jobs.php:522
4135
+ msgid "Close working screen"
4136
+ msgstr "Arbeitsfläche schließen"
4137
+
4138
+ # @ backwpup
4139
+ #: ../inc/class-page-jobs.php:522
4140
+ msgid "close"
4141
+ msgstr "schließen"
4142
+
4143
+ # @ backwpup
4144
+ #: ../inc/class-page-jobs.php:672
4145
+ msgid "Job completed"
4146
+ msgstr "Auftrag vollständig"
4147
+
4148
+ # @ backwpup
4149
+ #: ../inc/class-page-jobs.php:676
4150
+ #, php-format
4151
+ msgid "Job has done with warnings in %s seconds. Please resolve them for correct execution."
4152
+ msgstr "Auftrag wurde mit Warnungen in %s Sekunden erledigt. Bitte beheben sie diese, für eine korrekte Ausführung."
4153
+
4154
+ # @ backwpup
4155
+ #: ../inc/class-page-backwpup.php:67
4156
+ #, php-format
4157
+ msgid "%s Dashboard"
4158
+ msgstr "%s Dashboard"
4159
+
4160
+ # @ backwpup
4161
+ #: ../inc/class-page-backwpup.php:74
4162
+ #: ../inc/class-page-backwpup.php:83
4163
+ msgctxt "Dashboard heading"
4164
+ msgid "Planning backups"
4165
+ msgstr "Backups planen"
4166
+
4167
+ # @ backwpup
4168
+ #: ../inc/class-page-backwpup.php:75
4169
+ #: ../inc/class-page-backwpup.php:84
4170
+ msgid "Use your backup archives to save your entire WordPress installation including <code>/wp-content/</code>. Push them to an external storage service if you don’t want to save the backups on the same server."
4171
+ msgstr "Benutze deine Backup-Archive, um deine gesamte WordPress-Installation zu sichern, einschließlich <code>/wp-content/</code>. Lade sie zu einem externen Dienst hoch, wenn du deine Backups nicht auf demselben Server speichern möchtest."
4172
+
4173
+ # @ backwpup
4174
+ #: ../inc/class-page-backwpup.php:76
4175
+ #: ../inc/class-page-backwpup.php:85
4176
+ msgctxt "Dashboard heading"
4177
+ msgid "Restoring backups"
4178
+ msgstr "Backups wiederherstellen"
4179
+
4180
+ # @ backwpup
4181
+ #: ../inc/class-page-backwpup.php:77
4182
+ #: ../inc/class-page-backwpup.php:86
4183
+ msgid "With a single backup archive you are able to restore an installation. Use a tool like phpMyAdmin or a plugin like <a href=\"http://wordpress.org/plugins/adminer/\" target=\"_blank\">Adminer</a> to restore your database backup files."
4184
+ msgstr "Mit einem einzigen Backup-Archiv kannst du deine Installation wiederherstellen. Benutze ein serverseitiges Tool wie phpMyAdmin, oder ein Plugin wie <a href=\"http://wordpress.org/plugins/adminer/\" target=\"_blank\">Adminer</a>, um deine Datenbanksicherung wiederherzustellen."
4185
+
4186
+ # @ backwpup
4187
+ #: ../inc/class-page-backwpup.php:78
4188
+ #: ../inc/class-page-backwpup.php:87
4189
+ msgctxt "Dashboard heading"
4190
+ msgid "Ready to set up a backup job?"
4191
+ msgstr "Bereit, einen Backup-Auftrag zu erstellen?"
4192
+
4193
+ # @ backwpup
4194
+ #: ../inc/class-page-backwpup.php:79
4195
+ #, php-format
4196
+ msgid "Use one of the wizards to plan a backup, or use <a href=\"%s\">expert mode</a> for full control over all options."
4197
+ msgstr "Verwende einen der Assistenten, um dein Backup zu planen, oder den <a href=\"%s\">Expertenmodus</a> für die volle Übersicht über alle Optionen."
4198
+
4199
+ # @ backwpup
4200
+ #: ../inc/class-page-backwpup.php:79
4201
+ #: ../inc/class-page-backwpup.php:89
4202
+ msgid "<strong>Please note: You are solely responsible for the security of your data; the authors of this plugin are not.</strong>"
4203
+ msgstr "<strong>Bitte beachte: Für die Sicherheit deiner Daten bist du allein verantwortlich; die Autoren dieses Plugins sind es nicht.</strong>"
4204
+
4205
+ # @ backwpup
4206
+ #: ../inc/class-page-backwpup.php:84
4207
+ msgid "Use the short links in the <strong>First steps</strong> box to plan and schedule backup jobs."
4208
+ msgstr "Benutze die Schnellverweise in <strong>Erste Schritte</strong>, um einen Backup-Auftrag zu planen und zu terminieren."
4209
+
4210
+ # @ backwpup
4211
+ #: ../inc/class-page-backwpup.php:88
4212
+ #, php-format
4213
+ msgid "<a href=\"%s\">Add a new backup job</a> and plan what you want to save."
4214
+ msgstr "<a href=\"%s\">Erstelle einen Backup-Auftrag</a> und plane deine Sicherung."
4215
+
4216
+ # @ backwpup
4217
+ #: ../inc/class-page-backwpup.php:96
4218
+ msgid "First Steps"
4219
+ msgstr "Erste Schritte"
4220
+
4221
+ # @ backwpup
4222
+ #: ../inc/class-page-backwpup.php:100
4223
+ msgid "Test the installation"
4224
+ msgstr "Die Installation testen"
4225
+
4226
+ # @ backwpup
4227
+ #: ../inc/class-page-backwpup.php:101
4228
+ #: ../inc/class-page-backwpup.php:104
4229
+ msgid "Create a Job"
4230
+ msgstr "Auftrag erstellen"
4231
+
4232
+ # @ backwpup
4233
+ #: ../inc/class-page-backwpup.php:103
4234
+ msgid "Check the installation"
4235
+ msgstr "Überprüfe die Installation"
4236
+
4237
+ # @ backwpup
4238
+ #: ../inc/class-page-backwpup.php:106
4239
+ msgid "Run the created job"
4240
+ msgstr "Erstellten Auftrag starten"
4241
+
4242
+ # @ backwpup
4243
+ #: ../inc/class-page-backwpup.php:107
4244
+ msgid "Check the job log"
4245
+ msgstr "Logs des Auftrages prüfen"
4246
+
4247
+ # @ backwpup
4248
+ #: ../inc/class-page-backwpup.php:115
4249
+ msgid "One click backup"
4250
+ msgstr "Ein-Klick-Backup"
4251
+
4252
+ # @ backwpup
4253
+ #: ../inc/class-page-backwpup.php:117
4254
+ msgid "Generate a database backup of WordPress tables and download it right away!"
4255
+ msgstr "Generieren Sie ein Datenbank-Backup der WordPress-Tabellen und laden Sie es gleich herunter!"
4256
+
4257
+ # @ backwpup
4258
+ #: ../inc/class-page-backwpup.php:117
4259
+ msgid "Download database backup"
4260
+ msgstr "Datenbank-Backup herunterladen"
4261
+
4262
+ # @ backwpup
4263
+ #: ../inc/class-page-backwpup.php:123
4264
+ msgid "BackWPup News"
4265
+ msgstr "BackWPup Neuigkeiten"
4266
+
4267
+ # @ backwpup
4268
+ #: ../inc/class-page-backwpup.php:128
4269
+ msgctxt "BackWPup News RSS Feed URL"
4270
+ msgid "http://marketpress.com/news/plugins/backwpup/feed/"
4271
+ msgstr "http://marketpress.de/news/plugins/backwpup/feed/"
4272
+
4273
+ # @ backwpup
4274
+ #: ../inc/class-page-backwpup.php:133
4275
+ #, php-format
4276
+ msgid "<strong>RSS Error</strong>: %s"
4277
+ msgstr "<strong>RSS Fehler</strong>: %s"
4278
+
4279
+ # @ backwpup
4280
+ #: ../inc/class-page-backwpup.php:138
4281
+ msgid "An error has occurred, which probably means the feed is down. Try again later."
4282
+ msgstr "Ein Fehler ist aufgetreten, der wahrscheinlich bedeutet, das der Feed Offline ist. Versuchen Sie es später erneut."
4283
+
4284
+ # @ backwpup
4285
+ #: ../inc/class-page-backwpup.php:153
4286
+ msgid "Untitled"
4287
+ msgstr "Ohne Titel"
4288
+
4289
+ # @ backwpup
4290
+ #: ../inc/class-page-backwpup.php:216
4291
+ msgid "Start wizard"
4292
+ msgstr "Assistenten starten"
4293
+
4294
+ # @ backwpup
4295
+ #: ../inc/class-page-backwpup.php:232
4296
+ msgctxt "Pro teaser box"
4297
+ msgid "Thank you for using BackWPup!"
4298
+ msgstr "Danke, dass du BackWPup benutzt!"
4299
+
4300
+ # @ backwpup
4301
+ #: ../inc/class-page-backwpup.php:235
4302
+ msgctxt "Pro teaser box"
4303
+ msgid "Get access to:"
4304
+ msgstr "Erhalte Zugang zu:"
4305
+
4306
+ # @ backwpup
4307
+ #: ../inc/class-page-backwpup.php:237
4308
+ msgctxt "Pro teaser box"
4309
+ msgid "First-class <strong>dedicated support</strong> at MarketPress Helpdesk."
4310
+ msgstr "Erstklassigem <strong>persönlichen Support</strong> im Helpdesk bei MarketPress."
4311
+
4312
+ # @ backwpup
4313
+ #: ../inc/class-page-backwpup.php:238
4314
+ msgctxt "Pro teaser box"
4315
+ msgid "Differential backups to Google Drive and other cloud storage service."
4316
+ msgstr "Differenzielle Backups zu Google Drive anderen Cloud-Storage-Diensten."
4317
+
4318
+ # @ backwpup
4319
+ #: ../inc/class-page-backwpup.php:239
4320
+ msgctxt "Pro teaser box"
4321
+ msgid "Easy-peasy wizards to create and schedule backup jobs."
4322
+ msgstr "Kinderleichte Assistenten zum Erstellen und Planen von Backup-Aufträgen."
4323
+
4324
+ # @ backwpup
4325
+ #: ../inc/class-page-backwpup.php:240
4326
+ msgctxt "Pro teaser box, link text"
4327
+ msgid "And more…"
4328
+ msgstr "Und mehr…"
4329
+
4330
+ # @ backwpup
4331
+ #: ../inc/class-page-backwpup.php:242
4332
+ msgctxt "Pro teaser box, link title"
4333
+ msgid "Get BackWPup Pro now"
4334
+ msgstr "Wechsle jetzt zu BackWPup Pro"
4335
+
4336
+ # @ backwpup
4337
+ #: ../inc/class-page-backwpup.php:242
4338
+ msgctxt "Pro teaser box, link text"
4339
+ msgid "Get BackWPup Pro now"
4340
+ msgstr "Wechsle jetzt zu BackWPup Pro"
4341
+
4342
+ # @ backwpup
4343
+ #: ../inc/class-page-backwpup.php:260
4344
+ msgid "Last logs"
4345
+ msgstr "Letzte Logs"
4346
+
4347
+ # @ backwpup
4348
+ #: ../inc/class-page-backwpup.php:262
4349
+ msgid "Result"
4350
+ msgstr "Ergebnis"
4351
+
4352
+ # @ backwpup
4353
+ #: ../inc/class-page-backwpup.php:292
4354
+ #, php-format
4355
+ msgid "%d ERROR"
4356
+ msgid_plural "%d ERRORS"
4357
+ msgstr[0] "%d FEHLER"
4358
+ msgstr[1] "%d FEHLER"
4359
+
4360
+ # @ backwpup
4361
+ #: ../inc/class-page-backwpup.php:294
4362
+ #, php-format
4363
+ msgid "%d WARNING"
4364
+ msgid_plural "%d WARNINGS"
4365
+ msgstr[0] "%d WARNUNG"
4366
+ msgstr[1] "%d WARNUNGEN"
4367
+
4368
+ # @ backwpup
4369
+ #: ../inc/class-page-backwpup.php:296
4370
+ msgid "OK"
4371
+ msgstr "OK"
4372
+
4373
+ # @ backwpup
4374
+ #: ../inc/class-page-backwpup.php:320
4375
+ msgid "Next scheduled jobs"
4376
+ msgstr "Nächste geplante Aufträge"
4377
+
4378
+ # @ backwpup
4379
+ #: ../inc/class-page-backwpup.php:347
4380
+ #, php-format
4381
+ msgid "working since %d seconds"
4382
+ msgstr "in Arbeit seit %d Sek."
4383
+
4384
+ # @ backwpup
4385
+ #: ../inc/class-page-backwpup.php:365
4386
+ msgid "Edit Job"
4387
+ msgstr "Auftrag bearbeiten"
4388
+
4389
+ # @ backwpup
4390
+ #: ../inc/class-destination-email.php:38
4391
+ #: ../inc/class-destination-email.php:41
4392
+ msgid "Email address"
4393
+ msgstr "E-Mail-Adresse"
4394
+
4395
+ # @ backwpup
4396
+ #: ../inc/class-destination-email.php:48
4397
+ #: ../inc/class-destination-email.php:50
4398
+ msgid "Send test email"
4399
+ msgstr "Test-E-Mail senden"
4400
+
4401
+ # @ backwpup
4402
+ #: ../inc/class-destination-email.php:55
4403
+ msgid "Send email settings"
4404
+ msgstr "Absende-Einstellungen für E-Mails"
4405
+
4406
+ # @ backwpup
4407
+ #: ../inc/class-destination-email.php:58
4408
+ msgid "Maximum file size"
4409
+ msgstr "Maximale Dateigröße"
4410
+
4411
+ # @ backwpup
4412
+ #: ../inc/class-destination-email.php:59
4413
+ msgid "MB"
4414
+ msgstr "MB"
4415
+
4416
+ # @ backwpup
4417
+ #: ../inc/class-destination-email.php:63
4418
+ msgid "Sender email address"
4419
+ msgstr "E-Mail-Adresse des Absenders"
4420
+
4421
+ # @ backwpup
4422
+ #: ../inc/class-destination-email.php:70
4423
+ msgid "Sender name"
4424
+ msgstr "Absender NAme"
4425
+
4426
+ # @ backwpup
4427
+ #: ../inc/class-destination-email.php:77
4428
+ msgid "Sending method"
4429
+ msgstr "E-Mail-Versandmethode"
4430
+
4431
+ # @ backwpup
4432
+ #: ../inc/class-destination-email.php:81
4433
+ msgid "Use site settings"
4434
+ msgstr "Verwende Blogeinstellungen"
4435
+
4436
+ # @ backwpup
4437
+ #: ../inc/class-destination-email.php:82
4438
+ msgid "PHP: mail()"
4439
+ msgstr "PHP: mail()"
4440
+
4441
+ # @ backwpup
4442
+ #: ../inc/class-destination-email.php:83
4443
+ msgid "Sendmail"
4444
+ msgstr "Sendmail"
4445
+
4446
+ # @ backwpup
4447
+ #: ../inc/class-destination-email.php:84
4448
+ msgid "SMTP"
4449
+ msgstr "SMTP"
4450
+
4451
+ # @ backwpup
4452
+ #: ../inc/class-destination-email.php:91
4453
+ msgid "Sendmail path"
4454
+ msgstr "Sendmail Pfad"
4455
+
4456
+ # @ backwpup
4457
+ #: ../inc/class-destination-email.php:99
4458
+ msgid "SMTP host name"
4459
+ msgstr "SMTP Hostname"
4460
+
4461
+ # @ backwpup
4462
+ #: ../inc/class-destination-email.php:110
4463
+ msgid "SMTP secure connection"
4464
+ msgstr "SMTP Sichere Verbindung"
4465
+
4466
+ # @ backwpup
4467
+ #: ../inc/class-destination-email.php:115
4468
+ msgid "SSL"
4469
+ msgstr "SSL"
4470
+
4471
+ # @ backwpup
4472
+ #: ../inc/class-destination-email.php:116
4473
+ msgid "TLS"
4474
+ msgstr "TLS"
4475
+
4476
+ # @ backwpup
4477
+ #: ../inc/class-destination-email.php:121
4478
+ msgid "SMTP username"
4479
+ msgstr "SMTP Benutzername"
4480
+
4481
+ # @ backwpup
4482
+ #: ../inc/class-destination-email.php:128
4483
+ msgid "SMTP password"
4484
+ msgstr "SMTP Passwort"
4485
+
4486
+ # @ backwpup
4487
+ #: ../inc/class-destination-email.php:204
4488
+ #, php-format
4489
+ msgid "%d. Try to send backup with email&#160;&hellip;"
4490
+ msgstr "%d. Versuche, Backup als E-Mail zu senden&#160;&hellip;"
4491
+
4492
+ # @ backwpup
4493
+ #: ../inc/class-destination-email.php:209
4494
+ msgid "Backup archive too big to be sent by email!"
4495
+ msgstr "Das Backup Archiv ist zu groß zum Senden via E-Mail!"
4496
+
4497
+ # @ backwpup
4498
+ #: ../inc/class-destination-email.php:216
4499
+ #, php-format
4500
+ msgid "Sending email to %s&hellip;"
4501
+ msgstr "Sende E-Mail an %s&hellip;"
4502
+
4503
+ # @ backwpup
4504
+ #: ../inc/class-destination-email.php:292
4505
+ #, php-format
4506
+ msgid "BackWPup archive from %1$s: %2$s"
4507
+ msgstr "BackWPup-Archiv vom %1$s: %2$s"
4508
+
4509
+ # @ backwpup
4510
+ #: ../inc/class-destination-email.php:295
4511
+ #, php-format
4512
+ msgid "Backup archive: %s"
4513
+ msgstr "Backup Archiv: %s"
4514
+
4515
+ # @ backwpup
4516
+ #: ../inc/class-destination-email.php:309
4517
+ #: ../inc/class-destination-email.php:431
4518
+ msgid "Error while sending email!"
4519
+ msgstr "Fehler beim Senden der E-Mail"
4520
+
4521
+ # @ backwpup
4522
+ #: ../inc/class-destination-email.php:315
4523
+ #: ../inc/class-destination-email.php:433
4524
+ msgid "Email sent."
4525
+ msgstr "E-Mail gesendet."
4526
+
4527
+ # @ backwpup
4528
+ #: ../inc/class-destination-email.php:415
4529
+ msgid "BackWPup archive sending TEST Message"
4530
+ msgstr "BackWPup Archiv TEST Nachricht senden"
4531
+
4532
+ # @ backwpup
4533
+ #: ../inc/class-destination-email.php:418
4534
+ msgid "If this message reaches your inbox, sending backup archives via email should work for you."
4535
+ msgstr "Wenn dich diese Nachricht erreicht, funktioniert das Senden der Sicherungsarchive per E-Mail."
4536
+
4537
+ # @ backwpup
4538
+ #: ../inc/pro/class-settings-apikeys.php:42
4539
+ msgid "Hash key"
4540
+ msgstr "Hash key"
4541
+
4542
+ # @ backwpup
4543
+ #: ../inc/pro/class-settings-apikeys.php:43
4544
+ msgid "Hash Key for BackWPup. It will be used to have hashes in folder and file names. It must at least 6 chars long."
4545
+ msgstr "Hash Key für BackWPup. Es wird für Hashes in Ordner- und Dateinamen verwendet und muss mindestens 6 Zeichen lang sein."
4546
+
4547
+ # @ backwpup
4548
+ #: ../inc/pro/class-settings-apikeys.php:46
4549
+ msgid "Hash key:"
4550
+ msgstr "Hash key:"
4551
+
4552
+ # @ backwpup
4553
+ #: ../inc/pro/class-settings-apikeys.php:59
4554
+ msgid "Dropbox API Keys"
4555
+ msgstr "Dropbox API Keys"
4556
+
4557
+ # @ backwpup
4558
+ #: ../inc/pro/class-settings-apikeys.php:60
4559
+ msgid "If you want to set your own Dropbox API Keys, you can do it here. Leave empty for default."
4560
+ msgstr "Wenn du deinen eigenen Dropbox API Schlüssel setzen willst, kannst du es hier tun. Lass es leer für Standard-Einstellungen."
4561
+
4562
+ # @ backwpup
4563
+ #: ../inc/pro/class-settings-apikeys.php:63
4564
+ msgid "Full Dropbox App key:"
4565
+ msgstr "Voller Dropbox app Key"
4566
+
4567
+ # @ backwpup
4568
+ #: ../inc/pro/class-settings-apikeys.php:71
4569
+ msgid "Full Dropbox App secret:"
4570
+ msgstr "Voller Dropbox App secret:"
4571
+
4572
+ # @ backwpup
4573
+ #: ../inc/pro/class-settings-apikeys.php:79
4574
+ msgid "Sandbox App key:"
4575
+ msgstr "Sandbox App key:"
4576
+
4577
+ # @ backwpup
4578
+ #: ../inc/pro/class-settings-apikeys.php:87
4579
+ msgid "Sandbox App secret:"
4580
+ msgstr "Sandbox App secret:"
4581
+
4582
+ # @ backwpup
4583
+ #: ../inc/pro/class-settings-apikeys.php:100
4584
+ msgid "SugarSync API Keys"
4585
+ msgstr "SugarSync API Keys"
4586
+
4587
+ # @ backwpup
4588
+ #: ../inc/pro/class-settings-apikeys.php:101
4589
+ msgid "If you want to set your own SugarSync API keys you can do that here. Leave empty for default."
4590
+ msgstr "Wenn du deinen eigenen SugarSync API Schlüssel setzen willst, kannst du es hier tun. Lass es leer für Standard-Einstellungen."
4591
+
4592
+ # @ backwpup
4593
+ #: ../inc/pro/class-settings-apikeys.php:104
4594
+ msgid "Access Key ID:"
4595
+ msgstr "Access Key ID (Zugangsschl&uuml;ssel-ID):"
4596
+
4597
+ # @ backwpup
4598
+ #: ../inc/pro/class-settings-apikeys.php:112
4599
+ msgid "Private Access Key:"
4600
+ msgstr "Private Access Key:"
4601
+
4602
+ # @ backwpup
4603
+ #: ../inc/pro/class-settings-apikeys.php:119
4604
+ msgid "App ID:"
4605
+ msgstr "App ID:"
4606
+
4607
+ # @ backwpup
4608
+ #: ../inc/pro/class-settings-apikeys.php:132
4609
+ msgid "Google API Keys"
4610
+ msgstr "Google API Keys"
4611
+
4612
+ # @ backwpup
4613
+ #: ../inc/pro/class-settings-apikeys.php:136
4614
+ msgid "Client ID:"
4615
+ msgstr "Client ID:"
4616
+
4617
+ # @ backwpup
4618
+ #: ../inc/pro/class-settings-apikeys.php:144
4619
+ msgid "Client secret:"
4620
+ msgstr "Client secret:"
4621
+
4622
+ # @ backwpup
4623
+ #: ../inc/pro/class-settings-apikeys.php:151
4624
+ msgid "Redirect URIs:"
4625
+ msgstr "Redirect URIs:"
4626
+
4627
+ # @ backwpup
4628
+ #: ../inc/pro/class-settings-apikeys.php:155
4629
+ msgid "Add this URI in a new line to the field."
4630
+ msgstr "Füge diese URI in einer neuen Zeile zum Feld hinzu."
4631
+
4632
+ # @ backwpup
4633
+ #: ../inc/pro/class-destination-folder.php:18
4634
+ msgid "Absolute path to folder for backup files:"
4635
+ msgstr "Absoluter Ordner-Pfad für Backup-Dateien:"
4636
+
4637
+ # @ backwpup
4638
+ #: ../inc/pro/class-destination-folder.php:72
4639
+ #, php-format
4640
+ msgid "%d. Try to sync files to folder&#160;&hellip;"
4641
+ msgstr "%d. Versuche Dateien mit Ordner zu synchronisieren&#160;&hellip;"
4642
+
4643
+ # @ backwpup
4644
+ #: ../inc/pro/class-destination-folder.php:76
4645
+ msgid "Retrieving file list from folder"
4646
+ msgstr "Ruft Datei-Liste vom Ordner ab"
4647
+
4648
+ # @ backwpup
4649
+ #: ../inc/pro/class-destination-folder.php:82
4650
+ msgid "Copy changed files to folder"
4651
+ msgstr "Kopiere geänderte Dateien in den Ordner"
4652
+
4653
+ # @ backwpup
4654
+ #: ../inc/pro/class-destination-folder.php:95
4655
+ #, php-format
4656
+ msgid "File %s copied"
4657
+ msgstr "Datei %s kopiert"
4658
+
4659
+ # @ backwpup
4660
+ #: ../inc/pro/class-destination-folder.php:108
4661
+ msgid "Delete not existing files from folder"
4662
+ msgstr "Lösche nicht existierende Dateien aus dem Ordner"
4663
+
4664
+ # @ backwpup
4665
+ #: ../inc/pro/class-destination-folder.php:116
4666
+ #, php-format
4667
+ msgid "Extra file %s copied"
4668
+ msgstr "Extra Datei %s kopiert"
4669
+
4670
+ # @ backwpup
4671
+ #: ../inc/pro/class-destination-folder.php:129
4672
+ #, php-format
4673
+ msgid "File %s deleted from folder"
4674
+ msgstr "File %s aus Ordner gelöscht"
4675
+
4676
+ # @ backwpup
4677
+ #: ../inc/pro/class-destination-folder.php:186
4678
+ #, php-format
4679
+ msgid "Empty folder %s deleted"
4680
+ msgstr "Leerer Ordner %s gelöscht"
4681
+
4682
+ # @ backwpup
4683
+ #: ../inc/pro/class-wizard-jobimport.php:14
4684
+ msgid "XML job import"
4685
+ msgstr "XML Auftrag Import"
4686
+
4687
+ # @ backwpup
4688
+ #: ../inc/pro/class-wizard-jobimport.php:15
4689
+ msgid "Wizard for importing BackWPup jobs from an XML file"
4690
+ msgstr "Assistent zum Importieren von BackWPup Aufträgen aus einer XML Datei"
4691
+
4692
+ # @ backwpup
4693
+ #: ../inc/pro/class-wizard-jobimport.php:32
4694
+ #: ../inc/pro/class-wizard-jobimport.php:93
4695
+ msgid "Import"
4696
+ msgstr "Import"
4697
+
4698
+ # @ backwpup
4699
+ #: ../inc/pro/class-wizard-jobimport.php:41
4700
+ msgid "Import File"
4701
+ msgstr "Import-Datei"
4702
+
4703
+ # @ backwpup
4704
+ #: ../inc/pro/class-wizard-jobimport.php:41
4705
+ msgid "Upload XML job file for import"
4706
+ msgstr "XML Arbeitsauftrag Datei hochladen zum Importieren"
4707
+
4708
+ # @ backwpup
4709
+ #: ../inc/pro/class-wizard-jobimport.php:42
4710
+ msgid "Select items to import"
4711
+ msgstr "Wähle ein Item für den Import"
4712
+
4713
+ # @ backwpup
4714
+ #: ../inc/pro/class-wizard-jobimport.php:42
4715
+ msgid "Select which job should be imported or overwritten."
4716
+ msgstr "Wähle einen Auftrag, der importiert oder überschrieben werden soll."
4717
+
4718
+ # @ backwpup
4719
+ #: ../inc/pro/class-wizard-jobimport.php:62
4720
+ msgid "Please upload your BackWPup job XML export file and we&#8217;ll import the jobs into BackWPup."
4721
+ msgstr "Bitte lade deine BackWPup-Auftrags-XML-Export-Datei hoch und wir importieren sie in BackWPup."
4722
+
4723
+ # @ backwpup
4724
+ #: ../inc/pro/class-wizard-jobimport.php:64
4725
+ msgid "Choose a file from your computer:"
4726
+ msgstr "Wähle eine Datei von deinem Computer:"
4727
+
4728
+ # @ backwpup
4729
+ #: ../inc/pro/class-wizard-jobimport.php:64
4730
+ #, php-format
4731
+ msgid "Maximum size: %s"
4732
+ msgstr "Maximale Größe: %s"
4733
+
4734
+ # @ backwpup
4735
+ #: ../inc/pro/class-wizard-jobimport.php:86
4736
+ msgid "Import Jobs"
4737
+ msgstr "Importiere Aufträge"
4738
+
4739
+ # @ backwpup
4740
+ #: ../inc/pro/class-wizard-jobimport.php:89
4741
+ msgid "Import Type"
4742
+ msgstr "Import-Typ"
4743
+
4744
+ # @ backwpup
4745
+ #: ../inc/pro/class-wizard-jobimport.php:89
4746
+ msgid "No Import"
4747
+ msgstr "Kein Import"
4748
+
4749
+ # @ backwpup
4750
+ #: ../inc/pro/class-wizard-jobimport.php:91
4751
+ msgid "Overwrite"
4752
+ msgstr "&Uuml;berschreiben"
4753
+
4754
+ # @ backwpup
4755
+ #: ../inc/pro/class-wizard-jobimport.php:91
4756
+ msgid "Append"
4757
+ msgstr "Anh&auml;ngen"
4758
+
4759
+ # @ backwpup
4760
+ #: ../inc/pro/class-wizard-jobimport.php:105
4761
+ msgid "Import Config"
4762
+ msgstr "Konfiguration importieren"
4763
+
4764
+ # @ backwpup
4765
+ #: ../inc/pro/class-wizard-jobimport.php:108
4766
+ msgid "Import BackWPup configuration"
4767
+ msgstr "Importiere BackWPup Konfiguration"
4768
+
4769
+ # @ backwpup
4770
+ #: ../inc/pro/class-wizard-jobimport.php:129
4771
+ msgid "File is empty. Please upload something more substantial. This error could also caused by uploads being disabled in your php.ini or by post_max_size being defined as smaller than upload_max_filesize in php.ini."
4772
+ msgstr "Datei ist leer. Bitte lade etwas mit Substanz hoch. Dieser Fehler kann begründet sein weil uploads in der php.ini oder durch post_max_size kleiner definiert sind als upload_max_filesize in php.ini."
4773
+
4774
+ # @ backwpup
4775
+ #: ../inc/pro/class-wizard-jobimport.php:144
4776
+ #, php-format
4777
+ msgid "The export file could not be found at <code>%s</code>. This is likely due to an issue with permissions."
4778
+ msgstr "Die Export-Datei konnte nicht gefunden werden <code>%s</code>. Das liegt möglicherweise an Problemen mit der Berechtigung."
4779
+
4780
+ # @ backwpup
4781
+ #: ../inc/pro/class-wizard-jobimport.php:151
4782
+ msgid "Sorry, there has been a phrase error."
4783
+ msgstr "Sorry, es gab ein Problem mit dem Begriff."
4784
+
4785
+ # @ backwpup
4786
+ #: ../inc/pro/class-wizard-jobimport.php:158
4787
+ #, php-format
4788
+ msgid "This Export file (version %s) may not be supported by this version of the importer."
4789
+ msgstr "Die Export Datei (version %s) wird wahrscheinlich nicht von dieser Version des Importers unterstützt"
4790
+
4791
+ # @ backwpup
4792
+ #: ../inc/pro/class-wizard-jobimport.php:164
4793
+ msgid "This is not a BackWPup XML file"
4794
+ msgstr "Das ist keine BackWPup XML Datei"
4795
+
4796
+ # @ backwpup
4797
+ #: ../inc/pro/class-wizard-jobimport.php:225
4798
+ #, php-format
4799
+ msgid "Job %1$s with id %2$d imported"
4800
+ msgstr "Job %1$s mit ID %2$d wurde importiert"
4801
+
4802
+ # @ backwpup
4803
+ #: ../inc/pro/class-wizard-jobimport.php:233
4804
+ msgid "BackWPup config imported"
4805
+ msgstr "BackWPup Konfiguration wurde importiert"
4806
+
4807
+ # @ backwpup
4808
+ #: ../inc/pro/class-wizard-systemtest.php:14
4809
+ msgid "System Test"
4810
+ msgstr "System Test"
4811
+
4812
+ # @ backwpup
4813
+ #: ../inc/pro/class-wizard-systemtest.php:15
4814
+ msgid "Wizard to test if BackWPup can work properly"
4815
+ msgstr "Dieser Assistent testet, ob BackWPup problemlos arbeiten kann."
4816
+
4817
+ # @ backwpup
4818
+ #: ../inc/pro/class-wizard-systemtest.php:32
4819
+ msgid "Run tests"
4820
+ msgstr "Starte die Tests"
4821
+
4822
+ # @ backwpup
4823
+ #: ../inc/pro/class-wizard-systemtest.php:41
4824
+ msgid "Environment"
4825
+ msgstr "Voraussetzungen"
4826
+
4827
+ # @ backwpup
4828
+ #: ../inc/pro/class-wizard-systemtest.php:41
4829
+ msgid "System Environment"
4830
+ msgstr "System Voraussetzungen"
4831
+
4832
+ # @ backwpup
4833
+ #: ../inc/pro/class-wizard-systemtest.php:54
4834
+ msgid "Test if BackWPup can work without problems."
4835
+ msgstr "Teste, ob BackWPup problemlos funktioniert."
4836
+
4837
+ # @ backwpup
4838
+ #: ../inc/pro/class-wizard-systemtest.php:86
4839
+ #, php-format
4840
+ msgid "You must run WordPress version 3.4 or higher to use this plugin. You are using version %s now."
4841
+ msgstr "Um dieses Plugin nutzen zu können, benötigst du mindestens WordPress 3.4, du verwendest derzeit die Version %s."
4842
+
4843
+ # @ backwpup
4844
+ #: ../inc/pro/class-wizard-systemtest.php:91
4845
+ #, php-format
4846
+ msgid "You must run PHP version 5.2.6 or higher to use this plugin. You are using version %s now."
4847
+ msgstr "Es wird die PHP Version 5.2.6 oder höher benötigt um dieses Plugin nutzen zu können. Du benutzt Version %s."
4848
+
4849
+ # @ backwpup
4850
+ #: ../inc/pro/class-wizard-systemtest.php:95
4851
+ #, php-format
4852
+ msgid "We recommend to run a PHP version above 5.3.2 to get the full plugin functionality. You are using version %s now."
4853
+ msgstr "Wir empfehlen eine PHP Version von 5.3.2 oder höher um die volle Funktionalität des Plugins nutzen zu können. Du nutzt Version %s."
4854
+
4855
+ # @ backwpup
4856
+ #: ../inc/pro/class-wizard-systemtest.php:100
4857
+ #, php-format
4858
+ msgid "You must have the MySQLi extension installed and a MySQL server version of 5.0.7 or higher to use this plugin. You are using version %s now."
4859
+ msgstr "Um dieses Plugin nutzen zu können, muss die MySQLi Erweiterung und der MySQL Server der Version 5.0.7 oder höher vorhanden sein. Du nutzt Version %s."
4860
+
4861
+ # @ backwpup
4862
+ #: ../inc/pro/class-wizard-systemtest.php:105
4863
+ msgid "PHP cURL extension must be installed to use the full plugin functionality."
4864
+ msgstr "Die cURL-Erweiterung für PHP muss installiert sein, um das Plugin im Vollem Umfang zu nutzen."
4865
+
4866
+ # @ backwpup
4867
+ #: ../inc/pro/class-wizard-systemtest.php:110
4868
+ #, php-format
4869
+ msgctxt "%1 = extension name, %2 = file suffix"
4870
+ msgid "We recommend to install the %1$s extension to generate %2$s archives."
4871
+ msgstr "Wir empfehlen die %1$s Erweiterung um %2$s Archive zu generieren."
4872
+
4873
+ # @ backwpup
4874
+ #: ../inc/pro/class-wizard-systemtest.php:133
4875
+ #, php-format
4876
+ msgctxt "Link to PHP manual"
4877
+ msgid "Please disable the deprecated <a href=\"%s\">PHP safe mode</a>."
4878
+ msgstr "Bitte schalte den veralteten <a href=\"%s\">PHP Safe-Mode</a>."
4879
+
4880
+ # @ backwpup
4881
+ #: ../inc/pro/class-wizard-systemtest.php:141
4882
+ msgid "We recommend to install the PHP FTP extension to use the FTP backup destination."
4883
+ msgstr "Wir empfehlen die PHP FTP Erweiterung zu installieren um FTP als Backup-Ziel nutzen zu können."
4884
+
4885
+ # @ backwpup
4886
+ #: ../inc/pro/class-wizard-systemtest.php:149
4887
+ #, php-format
4888
+ msgid "Temp folder %s is not read or writable. Please set proper writing permissions."
4889
+ msgstr "Temporärer Ordner %s ist weder lesbar noch beschreibbar. Bitte setze passende Berechtigungen."
4890
+
4891
+ # @ backwpup
4892
+ #: ../inc/pro/class-wizard-systemtest.php:154
4893
+ #, php-format
4894
+ msgid "Temp folder %s does not exist and cannot be created. Please create it and set proper writing permissions."
4895
+ msgstr "Temporärer Ordner %s existiert nicht oder kann nicht erstellt werden. Bitte erstelle ihn und setze passende Berechtigungen."
4896
+
4897
+ # @ backwpup
4898
+ #: ../inc/pro/class-wizard-systemtest.php:161
4899
+ #, php-format
4900
+ msgid "Log folder %s is not readable or writable. Please set proper writing permissions."
4901
+ msgstr "Log-Ordner %s ist weder lesbar noch beschreibbar. Bitte setze passende Berechtigungen."
4902
+
4903
+ # @ backwpup
4904
+ #: ../inc/pro/class-wizard-systemtest.php:165
4905
+ #, php-format
4906
+ msgid "Log folder %s does not exist and cannot be created. Please create it and set proper writing permissions."
4907
+ msgstr "Log-Ordner %s existiert nicht oder kann nicht erstellt werden. Bitte erstelle ihn und setze passende Berechtigungen."
4908
+
4909
+ # @ backwpup
4910
+ #: ../inc/pro/class-wizard-systemtest.php:171
4911
+ #, php-format
4912
+ msgid "The HTTP response test result is an error: \"%s\"."
4913
+ msgstr "Das Ergebnis des HTTP-Response-Tests ist ein Fehler: \"%s\"."
4914
+
4915
+ # @ backwpup
4916
+ #: ../inc/pro/class-wizard-systemtest.php:175
4917
+ #, php-format
4918
+ msgid "The HTTP response test result is a wrong HTTP status: %s. It should be status 200."
4919
+ msgstr "Der HTTP-Response-Test hat einen falschen HTTP-Status ergeben: %s. Es sollte Status 200 sein."
4920
+
4921
+ # @ backwpup
4922
+ #: ../inc/pro/class-wizard-systemtest.php:193
4923
+ msgid "WP-Cron seems to be broken. But it is needed to run scheduled jobs."
4924
+ msgstr "WP-Cron scheint beschädigt zu sein. Aber es wird benötigt um Aufträge planmäßig ausführen zu können."
4925
+
4926
+ # @ backwpup
4927
+ #: ../inc/pro/class-wizard-systemtest.php:198
4928
+ msgid "All tests passed without errors."
4929
+ msgstr "Alle Tests fehlerfrei bestanden."
4930
+
4931
+ # @ backwpup
4932
+ #: ../inc/pro/class-wizard-systemtest.php:201
4933
+ msgid "There is no error, but some warnings. BackWPup will work, but with limitations."
4934
+ msgstr "Keine Fehler, nur Warnungen. BackWPup funktioniert mit Einschränkungen."
4935
+
4936
+ # @ backwpup
4937
+ #: ../inc/pro/class-wizard-systemtest.php:204
4938
+ msgid "There are errors. Please correct them, or BackWPup cannot work."
4939
+ msgstr "Es sind Fehler aufgetreten. Bitte behebe sie, damit BackWPup ordnungsgemäß funktioniert."
4940
+
4941
+ # @ backwpup
4942
+ #: ../inc/pro/class-destination-s3.php:17
4943
+ #: ../inc/pro/class-destination-s3-v1.php:17
4944
+ msgid "Select a S3 service:"
4945
+ msgstr "Wähle einen S3 Service:"
4946
+
4947
+ # @ backwpup
4948
+ #: ../inc/pro/class-destination-s3.php:33
4949
+ #: ../inc/pro/class-destination-s3-v1.php:33
4950
+ msgid "or set an S3 Server URL:"
4951
+ msgstr "oder setze eine S3 Server URL:"
4952
+
4953
+ # @ backwpup
4954
+ #: ../inc/pro/class-destination-s3.php:36
4955
+ #: ../inc/pro/class-destination-msazure.php:19
4956
+ #: ../inc/pro/class-destination-s3-v1.php:36
4957
+ msgid "Access Key:"
4958
+ msgstr "Zugangsschl&uuml;ssel (Access Key):"
4959
+
4960
+ # @ backwpup
4961
+ #: ../inc/pro/class-destination-s3.php:39
4962
+ #: ../inc/pro/class-destination-s3-v1.php:39
4963
+ msgid "Secret Key:"
4964
+ msgstr "Secret Key:"
4965
+
4966
+ # @ backwpup
4967
+ #: ../inc/pro/class-destination-s3.php:42
4968
+ #: ../inc/pro/class-destination-s3-v1.php:42
4969
+ msgid "Bucket:"
4970
+ msgstr "Bucket:"
4971
+
4972
+ # @ backwpup
4973
+ #: ../inc/pro/class-destination-s3.php:52
4974
+ #: ../inc/pro/class-destination-s3-v1.php:52
4975
+ msgid "New Bucket:"
4976
+ msgstr "Neues Bucket: "
4977
+
4978
+ # @ backwpup
4979
+ #: ../inc/pro/class-destination-s3.php:54
4980
+ #: ../inc/pro/class-destination-s3-v1.php:54
4981
+ msgid "Folder in bucket:"
4982
+ msgstr "Ordner im Bucket:"
4983
+
4984
+ # @ backwpup
4985
+ #: ../inc/pro/class-destination-s3.php:154
4986
+ #: ../inc/pro/class-destination-s3-v1.php:156
4987
+ #, php-format
4988
+ msgid "%d. Trying to sync files to S3 Service&#160;&hellip;"
4989
+ msgstr "%d. Versuche Dateien mit dem S3 Service zu synchronisieren&#160;&hellip;"
4990
+
4991
+ # @ backwpup
4992
+ #: ../inc/pro/class-destination-s3.php:188
4993
+ #: ../inc/pro/class-destination-s3-v1.php:195
4994
+ msgid "Retrieving file list from S3."
4995
+ msgstr "Rufe Dateiliste von S3 ab."
4996
+
4997
+ # @ backwpup
4998
+ #: ../inc/pro/class-destination-s3.php:246
4999
+ #: ../inc/pro/class-destination-s3-v1.php:251
5000
+ msgid "Upload changed files to S3."
5001
+ msgstr "Upload der geänderten Dateien zu S3."
5002
+
5003
+ # @ backwpup
5004
+ #: ../inc/pro/class-destination-s3.php:261
5005
+ #: ../inc/pro/class-destination-s3-v1.php:263
5006
+ #, php-format
5007
+ msgid "File %s uploaded to S3."
5008
+ msgstr "Datei %s zu S3 hochgeladen."
5009
+
5010
+ # @ backwpup
5011
+ #: ../inc/pro/class-destination-s3.php:289
5012
+ #: ../inc/pro/class-destination-s3-v1.php:288
5013
+ #, php-format
5014
+ msgid "Extra file %s uploaded to S3."
5015
+ msgstr "Extra Datei %s zu S3 hochgeladen."
5016
+
5017
+ # @ backwpup
5018
+ #: ../inc/pro/class-destination-s3.php:302
5019
+ #: ../inc/pro/class-destination-s3-v1.php:301
5020
+ msgid "Delete nonexistent files on S3"
5021
+ msgstr "Lösche nicht existierende Dateien von S3"
5022
+
5023
+ # @ backwpup
5024
+ #: ../inc/pro/class-destination-s3.php:309
5025
+ #: ../inc/pro/class-destination-s3-v1.php:304
5026
+ #, php-format
5027
+ msgid "File %s deleted from S3."
5028
+ msgstr "Datei %s von S3 gelöscht."
5029
+
5030
+ # @ backwpup
5031
+ #: ../inc/pro/class-destination-ftp.php:17
5032
+ msgid "Hostname:"
5033
+ msgstr "Hostname:"
5034
+
5035
+ # @ backwpup
5036
+ #: ../inc/pro/class-destination-ftp.php:33
5037
+ msgid "Folder on server:"
5038
+ msgstr "Ordner auf dem Server:"
5039
+
5040
+ # @ backwpup
5041
+ #: ../inc/pro/class-destination-ftp.php:39
5042
+ msgid "Maximum number of backup files to keep in folder:"
5043
+ msgstr "Maximale Anzahl an Backup-Dateien im Ordner:"
5044
+
5045
+ # @ backwpup
5046
+ #: ../inc/pro/class-destination-ftp.php:42
5047
+ msgid "(Oldest files will be deleted first.)"
5048
+ msgstr "(&Auml;lteste Dateien werden zuerst gel&ouml;scht.)"
5049
+
5050
+ # @ backwpup
5051
+ #: ../inc/pro/class-jobtype-file.php:19
5052
+ msgid "Backup WordPress main files"
5053
+ msgstr "Backup der Wordpress Hauptdateien"
5054
+
5055
+ # @ backwpup
5056
+ #: ../inc/pro/class-jobtype-file.php:23
5057
+ msgid "Backup blog content folder"
5058
+ msgstr "Backup des Blog-Content Ordners"
5059
+
5060
+ # @ backwpup
5061
+ #: ../inc/pro/class-jobtype-file.php:27
5062
+ msgid "Backup blog plugins"
5063
+ msgstr "Backup Blog Plugins"
5064
+
5065
+ # @ backwpup
5066
+ #: ../inc/pro/class-jobtype-file.php:31
5067
+ msgid "Backup blog themes"
5068
+ msgstr "Backup der Blog-Themes"
5069
+
5070
+ # @ backwpup
5071
+ #: ../inc/pro/class-jobtype-file.php:35
5072
+ msgid "Backup blog uploads folder"
5073
+ msgstr "Backup der Blog-Uploads Ordner"
5074
+
5075
+ # @ backwpup
5076
+ #: ../inc/pro/class-wizard-job.php:15
5077
+ msgid "Create a job"
5078
+ msgstr "Job erstellen"
5079
+
5080
+ # @ backwpup
5081
+ #: ../inc/pro/class-wizard-job.php:16
5082
+ msgid "Choose a job"
5083
+ msgstr "Job auswählen"
5084
+
5085
+ # @ backwpup
5086
+ #: ../inc/pro/class-wizard-job.php:37
5087
+ msgid "Job Types"
5088
+ msgstr "Arbeitsauftrag Typen"
5089
+
5090
+ # @ backwpup
5091
+ #: ../inc/pro/class-wizard-job.php:37
5092
+ msgid "Select a task for your job."
5093
+ msgstr "Wähle eine Aufgabe für deinen Auftrag."
5094
+
5095
+ # @ backwpup
5096
+ #: ../inc/pro/class-wizard-job.php:51
5097
+ msgid "Archive Settings"
5098
+ msgstr "Archiv Einstellungen"
5099
+
5100
+ # @ backwpup
5101
+ #: ../inc/pro/class-wizard-job.php:51
5102
+ msgid "Settings for the Backup Archive"
5103
+ msgstr "Einstellungen für das Backup Archiv"
5104
+
5105
+ # @ backwpup
5106
+ #: ../inc/pro/class-wizard-job.php:53
5107
+ msgid "Where would you like to store the backup file?"
5108
+ msgstr "Wo wollen Sie die Backup-Datei speichern?"
5109
+
5110
+ # @ backwpup
5111
+ #: ../inc/pro/class-wizard-job.php:63
5112
+ #: ../inc/pro/class-wizard-job.php:272
5113
+ msgid "Scheduling"
5114
+ msgstr "Planung"
5115
+
5116
+ # @ backwpup
5117
+ #: ../inc/pro/class-wizard-job.php:63
5118
+ msgid "When would you like to start the job?"
5119
+ msgstr "Wann soll der Auftrag gestartet werden?"
5120
+
5121
+ # @ backwpup
5122
+ #: ../inc/pro/class-wizard-job.php:218
5123
+ msgid "Select one or more tasks for your backup job."
5124
+ msgstr "Wähle eine zusätzliche Aufgabe für deinen Backup-Auftrag."
5125
+
5126
+ # @ backwpup
5127
+ #: ../inc/pro/class-wizard-job.php:273
5128
+ msgid "Activate scheduling"
5129
+ msgstr "Aktive Planung"
5130
+
5131
+ # @ backwpup
5132
+ #: ../inc/pro/class-wizard-job.php:365
5133
+ msgid "Sync file by file to destination"
5134
+ msgstr "Synchronisiere Datei für Datei zum Zielverzeichnis"
5135
+
5136
+ # @ backwpup
5137
+ #: ../inc/pro/class-wizard-job.php:376
5138
+ msgid "Select a compression type for the backup archive"
5139
+ msgstr "Wähle einen Kompressions-Typ für das Backup Archiv"
5140
+
5141
+ # @ backwpup
5142
+ #: ../inc/pro/class-wizard-job.php:379
5143
+ msgid "Archive compression type"
5144
+ msgstr "Archiv Kompressions-Typ"
5145
+
5146
+ # @ backwpup
5147
+ #: ../inc/pro/class-wizard-job.php:411
5148
+ msgid "Where to store the files"
5149
+ msgstr "Wo die Dateien abgelegt werden"
5150
+
5151
+ # @ backwpup
5152
+ #: ../inc/pro/class-wizard-job.php:586
5153
+ #, php-format
5154
+ msgid "Wizard: %1$s"
5155
+ msgstr "Assistent: %1$s"
5156
+
5157
+ # @ backwpup
5158
+ #: ../inc/pro/class-wizard-job.php:605
5159
+ #, php-format
5160
+ msgid "New job %s generated."
5161
+ msgstr "Neuer Auftrag %s erstellt."
5162
+
5163
+ # @ backwpup
5164
+ #: ../inc/pro/class-wizard-job.php:617
5165
+ msgid "Create Job"
5166
+ msgstr "Erstelle Auftrag"
5167
+
5168
+ # @ backwpup
5169
+ #: ../inc/pro/class-wizard-job.php:642
5170
+ #: ../inc/pro/class-wizard-job.php:643
5171
+ msgid "Database Backup and XML Export (Daily)"
5172
+ msgstr "DB Sicherung & XML Export (täglich)"
5173
+
5174
+ # @ backwpup
5175
+ #: ../inc/pro/class-wizard-job.php:660
5176
+ #: ../inc/pro/class-wizard-job.php:661
5177
+ msgid "Database Check (Weekly)"
5178
+ msgstr "Datenbank Überprüfung (wöchentlich)"
5179
+
5180
+ # @ backwpup
5181
+ #: ../inc/pro/class-wizard-job.php:685
5182
+ #: ../inc/pro/class-wizard-job.php:686
5183
+ msgid "Backup all files"
5184
+ msgstr "Sicherung aller Dateien"
5185
+
5186
+ # @ backwpup
5187
+ #: ../inc/pro/class-wizard-job.php:700
5188
+ msgid "Essential files + list of plugins"
5189
+ msgstr "Wichtige Dateien + Pluginliste"
5190
+
5191
+ # @ backwpup
5192
+ #: ../inc/pro/class-wizard-job.php:701
5193
+ msgid "Backup essential files and folders, plus a list of installed plugins."
5194
+ msgstr "Backup von wichtigen Dateien und Ordner, plus einer Liste von installierten Plugins."
5195
+
5196
+ # @ backwpup
5197
+ #: ../inc/pro/class-wizard-job.php:716
5198
+ #: ../inc/pro/class-wizard-job.php:717
5199
+ msgid "Custom configuration"
5200
+ msgstr "Angepasste Konfiguration"
5201
+
5202
+ # @ backwpup
5203
+ #: ../inc/pro/class-pro.php:102
5204
+ msgid "Glacier"
5205
+ msgstr "Glacier"
5206
+
5207
+ # @ backwpup
5208
+ #: ../inc/pro/class-pro.php:121
5209
+ msgid "GDrive"
5210
+ msgstr "GDrive"
5211
+
5212
+ # @ backwpup
5213
+ #: ../inc/pro/class-pro.php:174
5214
+ #: ../inc/pro/class-pro.php:210
5215
+ msgid "Wizards"
5216
+ msgstr "Assistenten"
5217
+
5218
+ # @ backwpup
5219
+ #: ../inc/pro/class-jobtype-wpexp.php:17
5220
+ msgid "Items to export:"
5221
+ msgstr "Zu exportierendes Item:"
5222
+
5223
+ # @ backwpup
5224
+ #: ../inc/pro/class-destination-msazure.php:17
5225
+ msgid "Account Name:"
5226
+ msgstr "Kontoname/ Benutzername:"
5227
+
5228
+ # @ backwpup
5229
+ #: ../inc/pro/class-destination-msazure.php:21
5230
+ #: ../inc/pro/class-destination-rsc.php:38
5231
+ msgid "Container:"
5232
+ msgstr "Container:"
5233
+
5234
+ # @ backwpup
5235
+ #: ../inc/pro/class-destination-msazure.php:28
5236
+ #: ../inc/pro/class-destination-rsc.php:47
5237
+ msgid "Create container:"
5238
+ msgstr "Container erstellen:"
5239
+
5240
+ # @ backwpup
5241
+ #: ../inc/pro/class-destination-msazure.php:30
5242
+ #: ../inc/pro/class-destination-rsc.php:49
5243
+ msgid "Folder in container:"
5244
+ msgstr "Ordner im Container:"
5245
+
5246
+ # @ backwpup
5247
+ #: ../inc/pro/class-destination-msazure.php:100
5248
+ #, php-format
5249
+ msgid "%d. Trying to sync files with Microsoft Azure (Blob) &hellip;"
5250
+ msgstr "%d. Versuche Dateien mit Microsoft Azure (Blob) zu synchronisieren &hellip;"
5251
+
5252
+ # @ backwpup
5253
+ #: ../inc/pro/class-destination-msazure.php:135
5254
+ msgid "Retrieving file list from MS Azure."
5255
+ msgstr "Rufe Dateiliste von MS Azure ab."
5256
+
5257
+ # @ backwpup
5258
+ #: ../inc/pro/class-destination-msazure.php:151
5259
+ msgid "Upload changed files to MS Azure."
5260
+ msgstr "Upload der geänderten Dateien zu MS Azure."
5261
+
5262
+ # @ backwpup
5263
+ #: ../inc/pro/class-destination-msazure.php:163
5264
+ #, php-format
5265
+ msgid "File %s uploaded to MS Azure."
5266
+ msgstr "Datei %s zu MS Azure hochgeladen."
5267
+
5268
+ # @ backwpup
5269
+ #: ../inc/pro/class-destination-msazure.php:189
5270
+ #, php-format
5271
+ msgid "Extra file %s uploaded to MS Azure."
5272
+ msgstr "Extra Datei %s zu MS Azure hochgeladen."
5273
+
5274
+ # @ backwpup
5275
+ #: ../inc/pro/class-destination-msazure.php:202
5276
+ msgid "Delete nonexistent files on MS Azure."
5277
+ msgstr "Lösche nicht existierende Dateien auf MS Azure."
5278
+
5279
+ # @ backwpup
5280
+ #: ../inc/pro/class-destination-msazure.php:205
5281
+ #, php-format
5282
+ msgid "File %s deleted from MS Azure."
5283
+ msgstr "Datei %s von MS Azure gelöscht."
5284
+
5285
+ # @ backwpup
5286
+ #: ../inc/pro/class-destination-dropbox.php:24
5287
+ msgid "Auth Code:"
5288
+ msgstr "Auth Code:"
5289
+
5290
+ # @ backwpup
5291
+ #: ../inc/pro/class-destination-dropbox.php:27
5292
+ msgid "Get auth code"
5293
+ msgstr "Hole Authentifizierungscode"
5294
+
5295
+ # @ backwpup
5296
+ #: ../inc/pro/class-destination-dropbox.php:34
5297
+ #: ../inc/pro/class-destination-gdrive.php:249
5298
+ #: ../inc/pro/class-destination-gdrive.php:255
5299
+ msgid "Login:"
5300
+ msgstr "Anmelden:"
5301
+
5302
+ # @ backwpup
5303
+ #: ../inc/pro/class-destination-dropbox.php:38
5304
+ #: ../inc/pro/class-destination-gdrive.php:260
5305
+ msgid "Folder:"
5306
+ msgstr "Ordner:"
5307
+
5308
+ # @ backwpup
5309
+ #: ../inc/pro/class-destination-dropbox.php:105
5310
+ #, php-format
5311
+ msgid "%d. Try to sync files to Dropbox&#160;&hellip;"
5312
+ msgstr "%d. Versuche Dateien mit Dropbox zu synchronisieren&#160;&hellip;"
5313
+
5314
+ # @ backwpup
5315
+ #: ../inc/pro/class-destination-dropbox.php:138
5316
+ msgid "Retrieving file list from Dropbox"
5317
+ msgstr "Empfange Dateiliste von Dropbox"
5318
+
5319
+ # @ backwpup
5320
+ #: ../inc/pro/class-destination-dropbox.php:152
5321
+ msgid "Upload changed files to Dropbox"
5322
+ msgstr "Lade geänderte Datei in die Dropbox"
5323
+
5324
+ # @ backwpup
5325
+ #: ../inc/pro/class-destination-dropbox.php:174
5326
+ #, php-format
5327
+ msgid "File %s uploaded to Dropbox"
5328
+ msgstr "Datei %s zu Dropbox hochgeladen"
5329
+
5330
+ # @ backwpup
5331
+ #: ../inc/pro/class-destination-dropbox.php:201
5332
+ #, php-format
5333
+ msgid "Extra file %s uploaded to Dropbox"
5334
+ msgstr "Extra Datei %s zu Dropbox hochgeladen"
5335
+
5336
+ # @ backwpup
5337
+ #: ../inc/pro/class-destination-dropbox.php:210
5338
+ msgid "Delete not existing files from Dropbox"
5339
+ msgstr "Lösche nicht existierende Dateien aus Dropbox"
5340
+
5341
+ # @ backwpup
5342
+ #: ../inc/pro/class-destination-dropbox.php:217
5343
+ #, php-format
5344
+ msgid "Folder %s deleted from Dropbox"
5345
+ msgstr "Ordner %s aus Dropbox gelöscht"
5346
+
5347
+ # @ backwpup
5348
+ #: ../inc/pro/class-destination-dropbox.php:235
5349
+ #, php-format
5350
+ msgid "File %s deleted from Dropbox"
5351
+ msgstr "Datei %s aus Dropbox gelöscht"
5352
+
5353
+ # @ backwpup
5354
+ #: ../inc/pro/class-jobtype-dbdump.php:89
5355
+ msgid "Backup only WordPress Database tables"
5356
+ msgstr "Nur die WordPress Datenbank Tabellen sichern"
5357
+
5358
+ # @ backwpup
5359
+ #: ../inc/pro/class-jobtype-dbdump.php:109
5360
+ msgid "Database connection"
5361
+ msgstr "Datenbank Verbindung"
5362
+
5363
+ # @ backwpup
5364
+ #: ../inc/pro/class-jobtype-dbdump.php:113
5365
+ msgid "Use WordPress database connection."
5366
+ msgstr "Nutze WordPress-Datenbankverbindung"
5367
+
5368
+ # @ backwpup
5369
+ #: ../inc/pro/class-jobtype-dbdump.php:117
5370
+ msgid "Host:"
5371
+ msgstr "Host (Server):"
5372
+
5373
+ # @ backwpup
5374
+ #: ../inc/pro/class-jobtype-dbdump.php:120
5375
+ msgid "User:"
5376
+ msgstr "Benutzer: "
5377
+
5378
+ # @ backwpup
5379
+ #: ../inc/pro/class-jobtype-dbdump.php:127
5380
+ msgid "Charset:"
5381
+ msgstr "Charset: "
5382
+
5383
+ # @ backwpup
5384
+ #: ../inc/pro/class-jobtype-dbdump.php:138
5385
+ msgid "Database:"
5386
+ msgstr "Datenbank:"
5387
+
5388
+ # @ backwpup
5389
+ #: ../inc/pro/class-jobtype-dbdump.php:166
5390
+ msgid "Database Backup type"
5391
+ msgstr "Datenbank Backup Typ"
5392
+
5393
+ # @ backwpup
5394
+ #: ../inc/pro/class-jobtype-dbdump.php:170
5395
+ msgid "SQL File (with mysqli)"
5396
+ msgstr "SQL-Datei (mit mysqli)"
5397
+
5398
+ # @ backwpup
5399
+ #: ../inc/pro/class-jobtype-dbdump.php:171
5400
+ msgid "SQL File (with mysqldump)"
5401
+ msgstr "SQL-Datei (mit mysqldump)"
5402
+
5403
+ # @ backwpup
5404
+ #: ../inc/pro/class-jobtype-dbdump.php:172
5405
+ msgid "XML File (phpMyAdmin schema)"
5406
+ msgstr "XML Datei (phpMyAdmin Schema)"
5407
+
5408
+ # @ backwpup
5409
+ #: ../inc/pro/class-jobtype-dbdump.php:178
5410
+ msgid "Path to <em>mysqldump</em> file"
5411
+ msgstr "Pfad zur <em>mysqldump</em> Datei"
5412
+
5413
+ # @ backwpup
5414
+ #: ../inc/pro/class-jobtype-dbdump.php:555
5415
+ #, php-format
5416
+ msgid "Added database backup \"%1$s\" with %2$s to backup file list"
5417
+ msgstr "Datenbank-Backup \"%1$s\" mit %2$s zur Backup-Datei-Liste hinzugefügt"
5418
+
5419
+ # @ backwpup
5420
+ #: ../inc/pro/class-jobtype-dbdump.php:576
5421
+ #, php-format
5422
+ msgid "%d. Try to backup MySQL system&#160;&hellip;"
5423
+ msgstr "%d. Versuche, das MySQL-System zu sichern&#160;&hellip;"
5424
+
5425
+ # @ backwpup
5426
+ #: ../inc/pro/class-jobtype-dbdump.php:583
5427
+ msgid "Executing of system commands not allowed. Please use backup with mysqli."
5428
+ msgstr "Ausführung von Systembefehlen nicht erlaubt. Bitte nutze Backup mit mysqli."
5429
+
5430
+ # @ backwpup
5431
+ #: ../inc/pro/class-jobtype-dbdump.php:588
5432
+ #, php-format
5433
+ msgid "%s file not in open basedir of PHP."
5434
+ msgstr "Datei %s nicht im open basedir von PHP."
5435
+
5436
+ # @ backwpup
5437
+ #: ../inc/pro/class-jobtype-dbdump.php:593
5438
+ #, php-format
5439
+ msgid "%s file not found. Please correct the path for the mysqldump file."
5440
+ msgstr "Datei %s nicht gefunden. Bitte korrigiere den Pfad für die mysqldump-Datei."
5441
+
5442
+ # @ backwpup
5443
+ #: ../inc/pro/class-jobtype-dbdump.php:670
5444
+ #, php-format
5445
+ msgctxt "Executed exec() command"
5446
+ msgid "CLI Exec: %s"
5447
+ msgstr "CLI Exec: %s"
5448
+
5449
+ # @ backwpup
5450
+ #: ../inc/pro/class-jobtype-dbdump.php:676
5451
+ msgid "Usage error."
5452
+ msgstr "Usage-Fehler"
5453
+
5454
+ # @ backwpup
5455
+ #: ../inc/pro/class-jobtype-dbdump.php:677
5456
+ msgid "MySQL Server Error. This could be an issue with permissions. Try using database backup with mysqli."
5457
+ msgstr "Fehler des MySQL-Servers. Dies könnte ein Problem mit Berechtigungen sein. Versuche ein Datenbank mit mysqli."
5458
+
5459
+ # @ backwpup
5460
+ #: ../inc/pro/class-jobtype-dbdump.php:678
5461
+ msgid "Error during consistency checks."
5462
+ msgstr "Fehler während Konsistenzprüfung."
5463
+
5464
+ # @ backwpup
5465
+ #: ../inc/pro/class-jobtype-dbdump.php:679
5466
+ msgid "Not enough memory."
5467
+ msgstr "Nicht genug Speicher."
5468
+
5469
+ # @ backwpup
5470
+ #: ../inc/pro/class-jobtype-dbdump.php:680
5471
+ msgid "Error during writing of SQL backup file."
5472
+ msgstr "Fehler beim Schreiben der SQL-Backup-Datei."
5473
+
5474
+ # @ backwpup
5475
+ #: ../inc/pro/class-jobtype-dbdump.php:681
5476
+ msgid "Illegal table"
5477
+ msgstr "Ungültige Tabelle"
5478
+
5479
+ # @ backwpup
5480
+ #: ../inc/pro/class-jobtype-dbdump.php:686
5481
+ #, php-format
5482
+ msgid "mysqldump returned: (%d) %s"
5483
+ msgstr "mysqldump hat zurückgegeben: (%d) %s"
5484
+
5485
+ # @ backwpup
5486
+ #: ../inc/pro/class-jobtype-dbdump.php:699
5487
+ msgid "Can not create mysql backup with mysqldump command"
5488
+ msgstr "Keine Datenbanksicherung mit System-Kommando mysqldump möglich"
5489
+
5490
+ # @ backwpup
5491
+ #: ../inc/pro/class-jobtype-dbdump.php:747
5492
+ #, php-format
5493
+ msgid "%d. Try to backup database as XML&#160;&hellip;"
5494
+ msgstr "%d. Versuche, Datenbank als XML zu sichern&#160;&hellip;"
5495
+
5496
+ # @ backwpup
5497
+ #: ../inc/pro/class-jobtype-dbdump.php:800
5498
+ msgid "No tables for XML backup"
5499
+ msgstr "Es gibt keine Tabellen für einen XML Backup"
5500
+
5501
+ # @ backwpup
5502
+ #: ../inc/pro/class-jobtype-dbdump.php:837
5503
+ #, php-format
5504
+ msgid "Dump database create view \"%s\""
5505
+ msgstr "Datenbank Backup CREATE VIEW \"%s\""
5506
+
5507
+ # @ backwpup
5508
+ #: ../inc/pro/class-jobtype-dbdump.php:854
5509
+ #, php-format
5510
+ msgid "Dump database structure \"%s\""
5511
+ msgstr "Backup der Datenbank Struktur \"%s\""
5512
+
5513
+ # @ backwpup
5514
+ #: ../inc/pro/class-jobtype-dbdump.php:894
5515
+ #, php-format
5516
+ msgid "Dump table \"%s\" data"
5517
+ msgstr "Backup der Tabellen Daten von \"%s\""
5518
+
5519
+ # @ backwpup
5520
+ #: ../inc/pro/class-jobtype-dbdump.php:963
5521
+ #, php-format
5522
+ msgid "Added database XML dump \"%1$s\" with %2$s to backup file list"
5523
+ msgstr "XML Datenbank Backup \"%1$s\" mit %2$s zur Backup Datei Liste hinzugefügt"
5524
+
5525
+ # @ backwpup
5526
+ #: ../inc/pro/class-jobtype-dbdump.php:966
5527
+ msgid "Database XML backup done!"
5528
+ msgstr "Datenbank XML Backup erstellt!"
5529
+
5530
+ # @ backwpup
5531
+ #: ../inc/pro/class-destination-s3-v1.php:29
5532
+ msgid "Hosteurope Cloud Storage"
5533
+ msgstr "Hosteurope Cloud Storage"
5534
+
5535
+ # @ backwpup
5536
+ #: ../inc/pro/class-marketpress-documentation.php:175
5537
+ msgid "Loading Menu ..."
5538
+ msgstr "Lade Menü..."
5539
+
5540
+ # @ backwpup
5541
+ #: ../inc/pro/class-marketpress-documentation.php:219
5542
+ #: ../inc/pro/class-marketpress-documentation.php:335
5543
+ #, php-format
5544
+ msgctxt "%s = Remote Code"
5545
+ msgid "Could not connect to remote host, code %d. Please try again later."
5546
+ msgstr "Verbindung zum Remote Host nicht möglich, Code %d. Bitte versuche es später noch einmal."
5547
+
5548
+ # @ backwpup
5549
+ #: ../inc/pro/class-marketpress-documentation.php:230
5550
+ #: ../inc/pro/class-marketpress-documentation.php:346
5551
+ msgid "Could not find content for this page. Please try again later."
5552
+ msgstr "Für diese Seite konnten kein Inhalte gefunden werden. Bitte versuche es später nocheinmal."
5553
+
5554
+ # @ backwpup
5555
+ #: ../inc/pro/class-marketpress-documentation.php:236
5556
+ #: ../inc/pro/class-marketpress-documentation.php:351
5557
+ msgid "Could not connect to remote host. Please try again later."
5558
+ msgstr "Konnte nicht zum Remote-Host verbinden. Bitte versuche es später noch einmal."
5559
+
5560
+ # @ backwpup
5561
+ #: ../inc/pro/class-marketpress-documentation.php:282
5562
+ #: ../inc/pro/class-marketpress-documentation.php:290
5563
+ msgid "Loading Content ..."
5564
+ msgstr "Lade Inhalt..."
5565
+
5566
+ # @ backwpup
5567
+ #: ../inc/pro/class-page-wizard.php:122
5568
+ msgid "No BackWPup Wizard Session found!"
5569
+ msgstr "Keine BackWPup-Assistent-Sitzung gefunden!"
5570
+
5571
+ # @ backwpup
5572
+ #: ../inc/pro/class-page-wizard.php:134
5573
+ #: ../inc/pro/class-page-wizard.php:442
5574
+ msgid "Cancel"
5575
+ msgstr "Abbrechen"
5576
+
5577
+ # @ backwpup
5578
+ #: ../inc/pro/class-page-wizard.php:169
5579
+ #: ../inc/pro/class-page-wizard.php:437
5580
+ #: ../inc/pro/class-page-wizard.php:470
5581
+ msgid "Next ›"
5582
+ msgstr "Weiter ›"
5583
+
5584
+ # @ backwpup
5585
+ #: ../inc/pro/class-page-wizard.php:186
5586
+ #: ../inc/pro/class-page-wizard.php:433
5587
+ msgid "‹ Previous"
5588
+ msgstr "‹ Zurück"
5589
+
5590
+ # @ backwpup
5591
+ #: ../inc/pro/class-page-wizard.php:335
5592
+ #, php-format
5593
+ msgctxt "Plugin Name"
5594
+ msgid "%s Wizards"
5595
+ msgstr "%s Assistenten"
5596
+
5597
+ # @ backwpup
5598
+ #: ../inc/pro/class-page-wizard.php:373
5599
+ #, php-format
5600
+ msgctxt "Plugin Name"
5601
+ msgid "%s Wizard:"
5602
+ msgstr "%s Assistent:"
5603
+
5604
+ # @ backwpup
5605
+ #: ../inc/pro/class-page-wizard.php:445
5606
+ msgid "Back to overview"
5607
+ msgstr "Zurück zur Übersicht"
5608
+
5609
+ # @ backwpup
5610
+ #: ../inc/pro/class-destination-rsc.php:26
5611
+ msgid "API Key:"
5612
+ msgstr "API-Schl&uuml;ssel"
5613
+
5614
+ # @ backwpup
5615
+ #: ../inc/pro/class-destination-rsc.php:29
5616
+ msgid "Select region:"
5617
+ msgstr "Region wählen:"
5618
+
5619
+ # @ backwpup
5620
+ #: ../inc/pro/class-destination-rsc.php:134
5621
+ #, php-format
5622
+ msgid "%d. Trying to sync files to Rackspace cloud&#160;&hellip;"
5623
+ msgstr "%d. Versuche Dateien mit der Rackspace Cloud zu synchronisieren&#160;&hellip;"
5624
+
5625
+ # @ backwpup
5626
+ #: ../inc/pro/class-destination-rsc.php:154
5627
+ #, php-format
5628
+ msgid "Connected to Rackspace cloud files container %s."
5629
+ msgstr "Verbunden mit Rackspace Cloud Datei-Container %s."
5630
+
5631
+ # @ backwpup
5632
+ #: ../inc/pro/class-destination-rsc.php:168
5633
+ msgid "Retrieving files list from Rackspace Cloud."
5634
+ msgstr "Rufe Dateiliste von Rackspace Cloud ab."
5635
+
5636
+ # @ backwpup
5637
+ #: ../inc/pro/class-destination-rsc.php:199
5638
+ msgid "Upload changed files to Rackspace Cloud."
5639
+ msgstr "Upload der geänderten Dateien zur Rackspace Cloud."
5640
+
5641
+ # @ backwpup
5642
+ #: ../inc/pro/class-destination-rsc.php:213
5643
+ #, php-format
5644
+ msgid "File %s uploaded to Rackspace Cloud."
5645
+ msgstr "Datei %s zu zur Rackspace Cloud hochgeladen."
5646
+
5647
+ # @ backwpup
5648
+ #: ../inc/pro/class-destination-rsc.php:241
5649
+ #, php-format
5650
+ msgid "Extra file %s uploaded to Rackspace Cloud."
5651
+ msgstr "Extra Datei %s zur Rackspace Cloud hochgeladen."
5652
+
5653
+ # @ backwpup
5654
+ #: ../inc/pro/class-destination-rsc.php:254
5655
+ msgid "Delete nonexistent files on Rackspace Cloud."
5656
+ msgstr "Lösche nicht existierende Dateien von Rackspace Cloud"
5657
+
5658
+ # @ backwpup
5659
+ #: ../inc/pro/class-destination-rsc.php:258
5660
+ #, php-format
5661
+ msgid "File %s deleted from Rackspace Cloud."
5662
+ msgstr "File %s von Rackspace Cloud gelöscht."
5663
+
5664
+ # @ backwpup
5665
+ #: ../inc/pro/class-jobtype-dbcheck.php:21
5666
+ msgid "Check only WordPress Database tables"
5667
+ msgstr "Teste nur die WordPress Datenbank Tabellen"
5668
+
5669
+ # @ backwpup
5670
+ #: ../inc/pro/class-destination-gdrive.php:33
5671
+ #: ../inc/pro/class-destination-gdrive.php:219
5672
+ #, php-format
5673
+ msgid "Looks like you haven’t set up any API keys yet. Head over to <a href=\"%s\">Settings | API-Keys</a> and get Google Drive all set up, then come back here."
5674
+ msgstr "Sieht so aus, als hättest du bis jetzt noch keine API-Schlüssel erstellt. Gehe zu <a href=\"%s\">Einstellungen | API-Schlüssel</a> und setze die Verbindung zu Google Drive auf, kann komm’ hierhin zurück."
5675
+
5676
+ # @ backwpup
5677
+ #: ../inc/pro/class-destination-gdrive.php:47
5678
+ #: ../inc/pro/class-destination-gdrive.php:251
5679
+ msgid "Authenticate"
5680
+ msgstr "Authentifizieren"
5681
+
5682
+ # @ backwpup
5683
+ #: ../inc/pro/class-destination-gdrive.php:53
5684
+ #: ../inc/pro/class-destination-gdrive.php:257
5685
+ msgid "Reauthenticate"
5686
+ msgstr "Neu authentifizieren"
5687
+
5688
+ # @ backwpup
5689
+ #: ../inc/pro/class-destination-gdrive.php:63
5690
+ msgid "Folder in Google Drive"
5691
+ msgstr "Ordner in Google Drive"
5692
+
5693
+ # @ backwpup
5694
+ #: ../inc/pro/class-destination-gdrive.php:83
5695
+ msgid "Consider using trash to delete files. If trash is not enabled, files will be deleted permanently."
5696
+ msgstr "Überlege dir, den Papierkorb zu nutzen um Dateien zu löschen. Bei deaktiviertem Papierkorb werden Dateien unwiderruflich gelöscht."
5697
+
5698
+ # @ backwpup
5699
+ #: ../inc/pro/class-destination-gdrive.php:132
5700
+ #: ../inc/pro/class-destination-gdrive.php:156
5701
+ msgid "GDrive: Authenticated."
5702
+ msgstr "GDrive: Authentifiziert."
5703
+
5704
+ # @ backwpup
5705
+ #: ../inc/pro/class-destination-gdrive.php:134
5706
+ #: ../inc/pro/class-destination-gdrive.php:158
5707
+ msgid "GDrive: No refresh token received."
5708
+ msgstr "GDrive: Kein Refresh Token empfangen."
5709
+
5710
+ # @ backwpup
5711
+ #: ../inc/pro/class-destination-gdrive.php:140
5712
+ #: ../inc/pro/class-destination-gdrive.php:163
5713
+ #: ../inc/pro/class-destination-gdrive.php:184
5714
+ #: ../inc/pro/class-destination-gdrive.php:237
5715
+ #, php-format
5716
+ msgid "GDrive API: %s"
5717
+ msgstr "GDrive API: %s"
5718
+
5719
+ # @ backwpup
5720
+ #: ../inc/pro/class-destination-gdrive.php:362
5721
+ #, php-format
5722
+ msgid "%d. Try to send backup file to Google Drive&#160;&hellip;"
5723
+ msgstr "%d. Versuche das Backup zu Google Drive zu senden&#160;&hellip;"
5724
+
5725
+ # @ backwpup
5726
+ #: ../inc/pro/class-destination-gdrive.php:395
5727
+ msgid "Uploading to Google Drive&#160;&hellip;"
5728
+ msgstr "Upload zu Google Drive&#160;&hellip;"
5729
+
5730
+ # @ backwpup
5731
+ #: ../inc/pro/class-destination-gdrive.php:439
5732
+ msgid "Google Drive API: could not create resumable file"
5733
+ msgstr "Google Drive API: kann keine fortsetzbare Datei generieren"
5734
+
5735
+ # @ backwpup
5736
+ #: ../inc/pro/class-destination-gdrive.php:473
5737
+ msgid "Can not resume transfer backup to Google Drive!"
5738
+ msgstr "Kann den Backup-Transfer zu Google Drive nicht fortsetzen!"
5739
+
5740
+ # @ backwpup
5741
+ #: ../inc/pro/class-destination-gdrive.php:530
5742
+ #, php-format
5743
+ msgid "Error transfering file chunks to %s."
5744
+ msgstr "Fehler beim Übertragen von Datei-Teilen zu %s."
5745
+
5746
+ # @ backwpup
5747
+ #: ../inc/pro/class-destination-gdrive.php:530
5748
+ #: ../inc/pro/class-destination-gdrive.php:548
5749
+ msgid "Google Drive"
5750
+ msgstr "Google Drive"
5751
+
5752
+ # @ backwpup
5753
+ #: ../inc/pro/class-destination-gdrive.php:592
5754
+ #, php-format
5755
+ msgid "One file deleted from Google Drive"
5756
+ msgid_plural "%d files deleted on Google Drive"
5757
+ msgstr[0] "Eine Datei von Google Drive gelöscht"
5758
+ msgstr[1] "%d Dateien von Google Drive gelöscht"
5759
+
5760
+ # @ backwpup
5761
+ #: ../inc/pro/class-destination-gdrive.php:598
5762
+ #: ../inc/pro/class-destination-gdrive.php:836
5763
+ #, php-format
5764
+ msgid "Google Drive API: %s"
5765
+ msgstr "Google Drive API: %s"
5766
+
5767
+ # @ backwpup
5768
+ #: ../inc/pro/class-destination-gdrive.php:633
5769
+ #, php-format
5770
+ msgid "%d. Try to sync files to Google Drive&#160;&hellip;"
5771
+ msgstr "%d. Versuche Dateien mit Google Drive zu synchronisieren&#160;&hellip;"
5772
+
5773
+ # @ backwpup
5774
+ #: ../inc/pro/class-destination-gdrive.php:662
5775
+ msgid "Retrieving folder list from Google Drive"
5776
+ msgstr "Abrufen der Ordnerliste von Google Drive"
5777
+
5778
+ # @ backwpup
5779
+ #: ../inc/pro/class-destination-gdrive.php:679
5780
+ msgid "Syncing changed files to Google Drive"
5781
+ msgstr "Synchronisiere geänderte Dateien mit Google Drive"
5782
+
5783
+ # @ backwpup
5784
+ #: ../inc/pro/class-destination-gdrive.php:717
5785
+ #, php-format
5786
+ msgid "File %s updated on Google Drive"
5787
+ msgstr "Datei %s auf Google Drive aktualisiert"
5788
+
5789
+ # @ backwpup
5790
+ #: ../inc/pro/class-destination-gdrive.php:737
5791
+ #, php-format
5792
+ msgid "File %s uploaded to Google Drive"
5793
+ msgstr "Datei %s zu Google Drive hochgeladen"
5794
+
5795
+ # @ backwpup
5796
+ #: ../inc/pro/class-destination-gdrive.php:758
5797
+ #, php-format
5798
+ msgid "File %s moved to trash in Google Drive"
5799
+ msgstr "Datei %s in den Papierkorb bei Google Drive verschoben"
5800
+
5801
+ # @ backwpup
5802
+ #: ../inc/pro/class-destination-gdrive.php:761
5803
+ #, php-format
5804
+ msgid "File %s deleted permanently in Google Drive"
5805
+ msgstr "Datei %s unwiderruflich gelöscht aus Google Drive"
5806
+
5807
+ # @ backwpup
5808
+ #: ../inc/pro/class-destination-gdrive.php:777
5809
+ #, php-format
5810
+ msgid "Folder %s moved to trash in Google Drive"
5811
+ msgstr "Ordner %s in den Papierkorb bei Google Drive verschoben"
5812
+
5813
+ # @ backwpup
5814
+ #: ../inc/pro/class-destination-gdrive.php:780
5815
+ #, php-format
5816
+ msgid "Folder %s deleted permanently in Google Drive"
5817
+ msgstr "Ordner %s unwiderruflich gelöscht aus Google Drive"
5818
+
5819
+ # @ backwpup
5820
+ #: ../inc/pro/class-destination-gdrive.php:807
5821
+ #, php-format
5822
+ msgid "Extra file %s updated on Google Drive"
5823
+ msgstr "Extra Datei %s auf Google Drive aktualisiert"
5824
+
5825
+ # @ backwpup
5826
+ #: ../inc/pro/class-destination-gdrive.php:826
5827
+ #, php-format
5828
+ msgid "Extra file %s uploaded to Google Drive"
5829
+ msgstr "Extra Datei %s auf Google Drive hochgeladen"
5830
+
5831
+ # @ backwpup
5832
+ #: ../inc/pro/class-jobtype-wpplugin.php:13
5833
+ msgid "Nothing to configure"
5834
+ msgstr "Nichts zu konfiguieren"
5835
+
5836
+ # @ backwpup
5837
+ #: ../inc/pro/class-export-jobs.php:12
5838
+ #: ../inc/pro/class-export-jobs.php:23
5839
+ msgid "Export"
5840
+ msgstr "Export"
5841
+
5842
+ # @ backwpup
5843
+ #: ../inc/pro/class-destination-glacier.php:26
5844
+ msgid "Amazon Glacier"
5845
+ msgstr "Amazon Glacier"
5846
+
5847
+ # @ backwpup
5848
+ #: ../inc/pro/class-destination-glacier.php:30
5849
+ msgid "Select a region:"
5850
+ msgstr "Wähle eine Region:"
5851
+
5852
+ # @ backwpup
5853
+ #: ../inc/pro/class-destination-glacier.php:32
5854
+ #: ../inc/pro/class-destination-glacier.php:154
5855
+ msgid "Amazon Glacier Region"
5856
+ msgstr "Amazon Glacier Region"
5857
+
5858
+ # @ backwpup
5859
+ #: ../inc/pro/class-destination-glacier.php:33
5860
+ #: ../inc/pro/class-destination-glacier.php:155
5861
+ msgid "US Standard"
5862
+ msgstr "US Standard"
5863
+
5864
+ # @ backwpup
5865
+ #: ../inc/pro/class-destination-glacier.php:34
5866
+ #: ../inc/pro/class-destination-glacier.php:156
5867
+ msgid "US West (Northern California)"
5868
+ msgstr "US West (Northern California)"
5869
+
5870
+ # @ backwpup
5871
+ #: ../inc/pro/class-destination-glacier.php:35
5872
+ #: ../inc/pro/class-destination-glacier.php:157
5873
+ msgid "US West (Oregon)"
5874
+ msgstr "US West (Oregon)"
5875
+
5876
+ # @ backwpup
5877
+ #: ../inc/pro/class-destination-glacier.php:36
5878
+ #: ../inc/pro/class-destination-glacier.php:158
5879
+ msgid "EU (Ireland)"
5880
+ msgstr "EU (Ireland)"
5881
+
5882
+ # @ backwpup
5883
+ #: ../inc/pro/class-destination-glacier.php:37
5884
+ #: ../inc/pro/class-destination-glacier.php:159
5885
+ msgid "EU (Germany)"
5886
+ msgstr "EU (Germany)"
5887
+
5888
+ # @ backwpup
5889
+ #: ../inc/pro/class-destination-glacier.php:38
5890
+ #: ../inc/pro/class-destination-glacier.php:160
5891
+ msgid "Asia Pacific (Tokyo)"
5892
+ msgstr "Asia Pacific (Tokyo)"
5893
+
5894
+ # @ backwpup
5895
+ #: ../inc/pro/class-destination-glacier.php:39
5896
+ #: ../inc/pro/class-destination-glacier.php:161
5897
+ msgid "Asia Pacific (Singapore)"
5898
+ msgstr "Asia Pacific (Singapore)"
5899
+
5900
+ # @ backwpup
5901
+ #: ../inc/pro/class-destination-glacier.php:40
5902
+ #: ../inc/pro/class-destination-glacier.php:162
5903
+ msgid "Asia Pacific (Sydney)"
5904
+ msgstr "Asia Pacific (Sydney)"
5905
+
5906
+ # @ backwpup
5907
+ #: ../inc/pro/class-destination-glacier.php:41
5908
+ #: ../inc/pro/class-destination-glacier.php:163
5909
+ msgid "South America (Sao Paulo)"
5910
+ msgstr "South America (Sao Paulo)"
5911
+
5912
+ # @ backwpup
5913
+ #: ../inc/pro/class-destination-glacier.php:42
5914
+ msgid "China (Beijing)"
5915
+ msgstr "China (Beijing)"
5916
+
5917
+ # @ backwpup
5918
+ #: ../inc/pro/class-destination-glacier.php:48
5919
+ msgid "Amazon Access Keys"
5920
+ msgstr "Amazon Zugriffsschlüssel"
5921
+
5922
+ # @ backwpup
5923
+ #: ../inc/pro/class-destination-glacier.php:67
5924
+ msgid "Vault"
5925
+ msgstr "Tresor"
5926
+
5927
+ # @ backwpup
5928
+ #: ../inc/pro/class-destination-glacier.php:71
5929
+ msgid "Vault selection"
5930
+ msgstr "Tresorauswahl"
5931
+
5932
+ # @ backwpup
5933
+ #: ../inc/pro/class-destination-glacier.php:83
5934
+ msgid "Create a new vault"
5935
+ msgstr "Neuen Tresor erstellen"
5936
+
5937
+ # @ backwpup
5938
+ #: ../inc/pro/class-destination-glacier.php:90
5939
+ msgid "Glacier Backup settings"
5940
+ msgstr "Glacier Backup Einstellungen"
5941
+
5942
+ # @ backwpup
5943
+ #: ../inc/pro/class-destination-glacier.php:97
5944
+ #: ../inc/pro/class-destination-glacier.php:181
5945
+ msgid "Number of files to keep in folder. (Archives deleted before 3 months after they have been stored may cause extra costs when deleted.)"
5946
+ msgstr "Anzahl der im Ordner verbleibenden Dateien. (Archive, die vor Ablauf von 3 Monaten gelöscht werden, können zusätzliche Kosten verursachen.)"
5947
+
5948
+ # @ backwpup
5949
+ #: ../inc/pro/class-destination-glacier.php:130
5950
+ #: ../inc/pro/class-destination-glacier.php:215
5951
+ #, php-format
5952
+ msgid "Vault %1$s created."
5953
+ msgstr "Tresor %1$s erstellt."
5954
+
5955
+ # @ backwpup
5956
+ #: ../inc/pro/class-destination-glacier.php:132
5957
+ #: ../inc/pro/class-destination-glacier.php:217
5958
+ #, php-format
5959
+ msgid "Vault %s could not be created."
5960
+ msgstr "Tresor %s konnte nicht erstellt werden."
5961
+
5962
+ # @ backwpup
5963
+ #: ../inc/pro/class-destination-glacier.php:153
5964
+ msgid "Select an Amazon Glacier region:"
5965
+ msgstr "Wähle Amazon Glacier Region:"
5966
+
5967
+ # @ backwpup
5968
+ #: ../inc/pro/class-destination-glacier.php:169
5969
+ msgid "Vault:"
5970
+ msgstr "Tresor:"
5971
+
5972
+ # @ backwpup
5973
+ #: ../inc/pro/class-destination-glacier.php:178
5974
+ msgid "New Vault:"
5975
+ msgstr "Neuer Tresor:"
5976
+
5977
+ # @ backwpup
5978
+ #: ../inc/pro/class-destination-glacier.php:258
5979
+ #: ../inc/pro/class-destination-glacier.php:374
5980
+ #: ../inc/pro/class-destination-glacier.php:390
5981
+ #: ../inc/pro/class-destination-glacier.php:430
5982
+ #, php-format
5983
+ msgid "AWS API: %s"
5984
+ msgstr "AWS API: %s"
5985
+
5986
+ # @ backwpup
5987
+ #: ../inc/pro/class-destination-glacier.php:282
5988
+ #, php-format
5989
+ msgid "%d. Trying to send backup file to Amazon Glacier&#160;&hellip;"
5990
+ msgstr "%d. Versuche Backup-Datei zu Amazon Glacier zu senden&#160;&hellip;"
5991
+
5992
+ # @ backwpup
5993
+ #: ../inc/pro/class-destination-glacier.php:295
5994
+ #, php-format
5995
+ msgid "Connected to Glacier vault \"%1$s\" with %2$d archives and size of %3$d"
5996
+ msgstr "Verbunden mit Glacier-Vault \"%1$s\" mit %2$d archives einer Größe von %3$d"
5997
+
5998
+ # @ backwpup
5999
+ #: ../inc/pro/class-destination-glacier.php:297
6000
+ #, php-format
6001
+ msgid "Glacier vault \"%s\" does not exist!"
6002
+ msgstr "Glacier Tresor \"%s\" existiert nicht!"
6003
+
6004
+ # @ backwpup
6005
+ #: ../inc/pro/class-destination-glacier.php:303
6006
+ msgid "Starting upload to Amazon Glacier&#160;&hellip;"
6007
+ msgstr "Upload zu Amazon Glacier wird gestartet&#160;&hellip;"
6008
+
6009
+ # @ backwpup
6010
+ #: ../inc/pro/class-destination-glacier.php:356
6011
+ #, php-format
6012
+ msgid "Archive ID: %s"
6013
+ msgstr "Archiv ID: %s"
6014
+
6015
+ # @ backwpup
6016
+ #: ../inc/pro/class-destination-glacier.php:420
6017
+ #, php-format
6018
+ msgid "Cannot delete archive from %s."
6019
+ msgstr "Kann das Archiv aus %s nicht löschen."
6020
+
6021
+ # @ backwpup
6022
+ #: ../inc/pro/class-destination-glacier.php:424
6023
+ #, php-format
6024
+ msgid "One file deleted on vault."
6025
+ msgid_plural "%d files deleted on vault"
6026
+ msgstr[0] "Eine Datei aus Tresor entfernt."
6027
+ msgstr[1] "%d Dateien aus Tresor entfernt"
6028
+
6029
+ # @ backwpup
6030
+ #: ../inc/pro/class-destination-glacier.php:538
6031
+ msgid "No vault found!"
6032
+ msgstr "Kein Tresor gefunden!"
6033
+
6034
+ # @ backwpup
6035
+ #: ../inc/pro/class-destination-sugarsync.php:25
6036
+ #: ../inc/pro/class-destination-sugarsync.php:84
6037
+ msgid "Sugarsync authenticate!"
6038
+ msgstr "Sugarsync Authentifizierung!"
6039
+
6040
+ # @ backwpup
6041
+ #: ../inc/pro/class-destination-sugarsync.php:36
6042
+ msgid "Root:"
6043
+ msgstr "Root:"
6044
+
6045
+ # @ backwpup
6046
+ #: ../inc/pro/class-marketpress-autoupdate.php:344
6047
+ #, php-format
6048
+ msgctxt "%s = plugin name"
6049
+ msgid "Your license for the plugin %s is not valid. The auto-update has been deactivated. Please insert a valid key on MarketPress Dashboard. Or if you want to add an other valid code use the form below."
6050
+ msgstr "Dein Lizenzschlüssel für das Plugin %s ist ungültig. Automatische Updates wurden deaktiviert. Gib bitte einen gültigen Schlüssel im MarketPress Dashboard ein. Wenn du einen anderen gültigen Schlüssel hinzufügen möchtest, nutze bitte das Formular (unten)."
6051
+
6052
+ # @ backwpup
6053
+ #: ../inc/pro/class-marketpress-autoupdate.php:356
6054
+ msgid "You are currently using a valid key for this plugin. You are able to renew the key in MarketPress Dashboard. Or if you want to add another valid code use the form below."
6055
+ msgstr "Du verwendest derzeit einen gültigen Lizenzschlüssel für dieses Plugin. Du kannst die Lizenzen im MarketPress Dashboard erneuern. Oder einen anderen gültigen Schlüssel eintragen."
6056
+
6057
+ # @ backwpup
6058
+ #: ../inc/pro/class-marketpress-autoupdate.php:367
6059
+ #, php-format
6060
+ msgctxt "%s = plugin name"
6061
+ msgid "Your license for the plugin %s is not valid. The auto-update has been deactivated."
6062
+ msgstr "Deine Lizenz für das Plugin %s ist ungültig. Automatische Updates wurden deaktiviert."
6063
+
6064
+ # @ backwpup
6065
+ #: ../inc/pro/class-marketpress-autoupdate.php:379
6066
+ #, php-format
6067
+ msgid "You are currently using a valid key for this plugin. You are able to renew the key below or you can delete the key by <a href=\"%s\">clicking here</a>."
6068
+ msgstr "Du verwendest einen gültigen Lizenzschlüssel für dieses Plugin. Du kannst den Schlüssel unten erneuern oder Löschen <a href=\"%s\">zum Löschen hier klicken</a>."
6069
+
6070
+ # @ backwpup
6071
+ #: ../inc/pro/class-marketpress-autoupdate.php:386
6072
+ msgid "License Key"
6073
+ msgstr "Lizenzschlüssel"
6074
+
6075
+ # @ backwpup
6076
+ #: ../inc/pro/class-marketpress-autoupdate.php:389
6077
+ msgid "Activate"
6078
+ msgstr "Aktivieren"
6079
+
6080
+ # @ backwpup
6081
+ #: ../inc/pro/class-marketpress-autoupdate.php:558
6082
+ msgid "The License has been deleted."
6083
+ msgstr "Die Lizenz wurde gelöscht."
6084
+
6085
+ # @ backwpup
6086
+ #: ../inc/pro/class-marketpress-autoupdate.php:565
6087
+ msgid "Plugin successfully activated."
6088
+ msgstr "Plugin erfolgreich aktiviert."
6089
+
6090
+ # @ backwpup
6091
+ #: ../inc/pro/class-marketpress-autoupdate.php:572
6092
+ msgid "The entered license key is wrong."
6093
+ msgstr "Der eingegebene Lizenzschlüssel ist falsch."
6094
+
6095
+ # @ backwpup
6096
+ #: ../inc/pro/class-marketpress-autoupdate.php:579
6097
+ msgid "You have reached the limit of urls. Please update your license at <a href=\"http://marketpress.com\">marketpress.com</a>."
6098
+ msgstr "Du hast das Limit der URLs erreicht. Bitte aktualisiere deine Lizenz auf <a href=\"http://marketpress.de\">marketpress.de</a>."
6099
+
6100
+ # @ backwpup
6101
+ #: ../inc/pro/class-marketpress-autoupdate.php:586
6102
+ msgid "Something went wrong. Please try again later or contact the <a href=\"http://marketpress.com/support/\">MarketPress Team</a>."
6103
+ msgstr "Etwas ist falsch gelaufen. Bitte versuche es erneut oder kontaktiere das <a href=\"http://marketpress.de/support/\">MarketPress Team</a>."
6104
+
6105
+ # @ backwpup
6106
+ #: ../inc/pro/class-marketpress-autoupdate.php:593
6107
+ msgid "Due to a wrong license you are not allowed to activate this plugin. Please update your license at <a href=\"http://marketpress.com\">marketpress.com</a>."
6108
+ msgstr "Dir ist nicht erlaubt, das Plugin zu aktivieren, mit einer falschen Lizenz. Bitte aktualisiere deine Lizenz auf <a href=\"http://marketpress.de\">MarketPress.de</a>."
6109
+
languages/backwpup-ja.mo CHANGED
Binary file
languages/backwpup-ja.po CHANGED
@@ -3,7 +3,7 @@ msgstr ""
3
  "Project-Id-Version: BackWPup v3.1.3\n"
4
  "Report-Msgid-Bugs-To: \n"
5
  "POT-Creation-Date: \n"
6
- "PO-Revision-Date: 2014-11-13 10:42+0900\n"
7
  "Last-Translator: stranger-jp <wordpress.stranger.jp@gmail.com>\n"
8
  "Language-Team: stranger-jp <wordpress.stranger.jp@gmail.com>\n"
9
  "MIME-Version: 1.0\n"
@@ -158,7 +158,7 @@ msgid "Create Account"
158
  msgstr "アカウントを作成"
159
 
160
  msgid "Authenticated!"
161
- msgstr "認証されました。"
162
 
163
  msgid "Backup settings"
164
  msgstr "バックアップ設定"
@@ -524,7 +524,7 @@ msgid "Amazon S3: South America (Sao Paulo)"
524
  msgstr "Amazon S3: 南米(サンパウロ)"
525
 
526
  msgid "Google Storage (Interoperable Access)"
527
- msgstr "Googleストレージ(相互運用アクセス)"
528
 
529
  msgid "Dream Host Cloud Storage"
530
  msgstr "Dream Hostクラウドストレージ"
@@ -557,13 +557,13 @@ msgid "Amazon: Storage Class"
557
  msgstr "Amazon: ストレージクラス"
558
 
559
  msgid "Reduced Redundancy"
560
- msgstr "減少冗長"
561
 
562
  msgid "Server side encryption"
563
- msgstr "サーバー側暗号化"
564
 
565
  msgid "Save files encrypted (AES256) on server."
566
- msgstr "サーバー上で暗号化してファイル(AES256)を保存"
567
 
568
  msgid "Bucket %1$s created in %2$s."
569
  msgstr "バケット%1$sは%2$sで作成しました。"
@@ -578,7 +578,7 @@ msgid "%d. Trying to send backup file to S3 Service&#160;&hellip;"
578
  msgstr "%d. S3サービスにバックアップファイルを送信..."
579
 
580
  msgid "Connected to S3 Bucket \"%1$s\" in %2$s"
581
- msgstr "S3バケットに接続されている\"%1$s \"%2$s"
582
 
583
  msgid "S3 Bucket \"%s\" does not exist!"
584
  msgstr "S3バケット\"%s\"は存在しません!"
@@ -590,10 +590,10 @@ msgid "Backup transferred to %s."
590
  msgstr "バックアップは%sに転送されます。"
591
 
592
  msgid "Cannot transfer backup to S3! (%1$d) %2$s"
593
- msgstr "S3にバックアップを転送することはできません! (%1$d) %2$s"
594
 
595
  msgid "Cannot delete backup from %s."
596
- msgstr "%sからバックアップを削除することはできません。"
597
 
598
  msgid "Missing secret access key!"
599
  msgstr "シークレットアクセスキーが見つかりません!"
@@ -1232,7 +1232,7 @@ msgid "Check the installation"
1232
  msgstr "インストール確認"
1233
 
1234
  msgid "Run the created job"
1235
- msgstr "作成されたジョブを実行"
1236
 
1237
  msgid "Check the job log"
1238
  msgstr "ジョブ・ログをチェック"
@@ -2078,7 +2078,7 @@ msgid "Setting of MySQLi connection timeout failed"
2078
  msgstr "MySQLiの接続タイムアウトの設定に失敗しました"
2079
 
2080
  msgid "Setting of MySQLi init command \"%s\" failed"
2081
- msgstr "MySQLiのINITコマンドの設定が\"%s\"は失敗しました。"
2082
 
2083
  msgid "Start for table backup is not correctly set: %1$s "
2084
  msgstr "テーブルのバックアップの開始が正しく設定されていません: %1$s"
@@ -2099,7 +2099,7 @@ msgid "XML ERROR (%s): %s"
2099
  msgstr "XMLエラー(%s): %s"
2100
 
2101
  msgid "<a href=\"%s\">Add a new backup job</a> and plan what you want to save."
2102
- msgstr "<a href=\"%s\">新しいバックアップジョブを追加</a> して保存したいものを計画します。"
2103
 
2104
  msgid "Add new job"
2105
  msgstr "新規ジョブを追加"
@@ -2249,7 +2249,7 @@ msgid "London (LON)"
2249
  msgstr "ロンドン (LON)"
2250
 
2251
  msgid "manifest.json might be needed for later restoring a backup from this archive."
2252
- msgstr "manifest.jsonについては、このアーカイブからバックアップを復元するために必要とされる場合があります。"
2253
 
2254
  msgid "MarketPress"
2255
  msgstr "MarketPress"
@@ -2342,7 +2342,7 @@ msgid "XML WARNING (%s): %s"
2342
  msgstr "XMLの警告 (%s): %s"
2343
 
2344
  msgid "You may have noticed the manifest.json file in this archive."
2345
- msgstr "このアーカイブにmanifest.jsonファイルを気づいているかもしれません。"
2346
 
2347
  msgctxt "%s = Folder name"
2348
  msgid "Folder %s for archive not found"
@@ -2602,7 +2602,7 @@ msgid "Auto = Uses PHP class ZipArchive if available; otherwise uses PclZip.<br
2602
  msgstr "自動 = PHPクラスのZipArchiveを可能な場合に使用します。それ以外の場合PclZipを使用します。<br />ZipArchive = 低メモリですが、多くのファイルを同時に開きます。<br />PclZip = 多くのメモリを使用しますが、一度に2つ同時にファイルを開きます。"
2603
 
2604
  msgid "Backup database table \"%s\" with \"%s\" records"
2605
- msgstr "バックアップデータベーステーブル\"%s\"と\"%s\"レコード"
2606
 
2607
  msgid "File size of “%s” cannot be retrieved. File might be too large and will not be added to queue."
2608
  msgstr "“%s”のファイルサイズを取得できません。ファイルが大きすぎる可能性があり、キューに追加されません。"
3
  "Project-Id-Version: BackWPup v3.1.3\n"
4
  "Report-Msgid-Bugs-To: \n"
5
  "POT-Creation-Date: \n"
6
+ "PO-Revision-Date: 2014-11-14 22:54+0900\n"
7
  "Last-Translator: stranger-jp <wordpress.stranger.jp@gmail.com>\n"
8
  "Language-Team: stranger-jp <wordpress.stranger.jp@gmail.com>\n"
9
  "MIME-Version: 1.0\n"
158
  msgstr "アカウントを作成"
159
 
160
  msgid "Authenticated!"
161
+ msgstr "認証済み!"
162
 
163
  msgid "Backup settings"
164
  msgstr "バックアップ設定"
524
  msgstr "Amazon S3: 南米(サンパウロ)"
525
 
526
  msgid "Google Storage (Interoperable Access)"
527
+ msgstr "Googleストレージ(相互運用可能なアクセス)"
528
 
529
  msgid "Dream Host Cloud Storage"
530
  msgstr "Dream Hostクラウドストレージ"
557
  msgstr "Amazon: ストレージクラス"
558
 
559
  msgid "Reduced Redundancy"
560
+ msgstr "減少冗長性"
561
 
562
  msgid "Server side encryption"
563
+ msgstr "サーバー側の暗号化"
564
 
565
  msgid "Save files encrypted (AES256) on server."
566
+ msgstr "サーバー上でファイルを暗号化(AES256)して保存"
567
 
568
  msgid "Bucket %1$s created in %2$s."
569
  msgstr "バケット%1$sは%2$sで作成しました。"
578
  msgstr "%d. S3サービスにバックアップファイルを送信..."
579
 
580
  msgid "Connected to S3 Bucket \"%1$s\" in %2$s"
581
+ msgstr "S3バケットに接続済 \"%1$s \"%2$s"
582
 
583
  msgid "S3 Bucket \"%s\" does not exist!"
584
  msgstr "S3バケット\"%s\"は存在しません!"
590
  msgstr "バックアップは%sに転送されます。"
591
 
592
  msgid "Cannot transfer backup to S3! (%1$d) %2$s"
593
+ msgstr "S3にバックアップを転送できません! (%1$d) %2$s"
594
 
595
  msgid "Cannot delete backup from %s."
596
+ msgstr "%sからバックアップを削除できません。"
597
 
598
  msgid "Missing secret access key!"
599
  msgstr "シークレットアクセスキーが見つかりません!"
1232
  msgstr "インストール確認"
1233
 
1234
  msgid "Run the created job"
1235
+ msgstr "作成したジョブを実行"
1236
 
1237
  msgid "Check the job log"
1238
  msgstr "ジョブ・ログをチェック"
2078
  msgstr "MySQLiの接続タイムアウトの設定に失敗しました"
2079
 
2080
  msgid "Setting of MySQLi init command \"%s\" failed"
2081
+ msgstr "MySQLiのinitコマンド\"%s\"の設定に失敗しました。"
2082
 
2083
  msgid "Start for table backup is not correctly set: %1$s "
2084
  msgstr "テーブルのバックアップの開始が正しく設定されていません: %1$s"
2099
  msgstr "XMLエラー(%s): %s"
2100
 
2101
  msgid "<a href=\"%s\">Add a new backup job</a> and plan what you want to save."
2102
+ msgstr "<a href=\"%s\">新しいバックアップジョブを追加</a>して保存したいものを計画します。"
2103
 
2104
  msgid "Add new job"
2105
  msgstr "新規ジョブを追加"
2249
  msgstr "ロンドン (LON)"
2250
 
2251
  msgid "manifest.json might be needed for later restoring a backup from this archive."
2252
+ msgstr "manifest.jsonは、このアーカイブからバックアップを復元するために必要とする場合があります。"
2253
 
2254
  msgid "MarketPress"
2255
  msgstr "MarketPress"
2342
  msgstr "XMLの警告 (%s): %s"
2343
 
2344
  msgid "You may have noticed the manifest.json file in this archive."
2345
+ msgstr "このアーカイブ内のmanifest.jsonファイルに気づいているかもしれません。"
2346
 
2347
  msgctxt "%s = Folder name"
2348
  msgid "Folder %s for archive not found"
2602
  msgstr "自動 = PHPクラスのZipArchiveを可能な場合に使用します。それ以外の場合PclZipを使用します。<br />ZipArchive = 低メモリですが、多くのファイルを同時に開きます。<br />PclZip = 多くのメモリを使用しますが、一度に2つ同時にファイルを開きます。"
2603
 
2604
  msgid "Backup database table \"%s\" with \"%s\" records"
2605
+ msgstr "データベーステーブルのバックアップ \"%s\"と\"%s\"レコード"
2606
 
2607
  msgid "File size of “%s” cannot be retrieved. File might be too large and will not be added to queue."
2608
  msgstr "“%s”のファイルサイズを取得できません。ファイルが大きすぎる可能性があり、キューに追加されません。"
license.txt DELETED
@@ -1,674 +0,0 @@
1
- GNU GENERAL PUBLIC LICENSE
2
- Version 3, 29 June 2007
3
-
4
- Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
5
- Everyone is permitted to copy and distribute verbatim copies
6
- of this license document, but changing it is not allowed.
7
-
8
- Preamble
9
-
10
- The GNU General Public License is a free, copyleft license for
11
- software and other kinds of works.
12
-
13
- The licenses for most software and other practical works are designed
14
- to take away your freedom to share and change the works. By contrast,
15
- the GNU General Public License is intended to guarantee your freedom to
16
- share and change all versions of a program--to make sure it remains free
17
- software for all its users. We, the Free Software Foundation, use the
18
- GNU General Public License for most of our software; it applies also to
19
- any other work released this way by its authors. You can apply it to
20
- your programs, too.
21
-
22
- When we speak of free software, we are referring to freedom, not
23
- price. Our General Public Licenses are designed to make sure that you
24
- have the freedom to distribute copies of free software (and charge for
25
- them if you wish), that you receive source code or can get it if you
26
- want it, that you can change the software or use pieces of it in new
27
- free programs, and that you know you can do these things.
28
-
29
- To protect your rights, we need to prevent others from denying you
30
- these rights or asking you to surrender the rights. Therefore, you have
31
- certain responsibilities if you distribute copies of the software, or if
32
- you modify it: responsibilities to respect the freedom of others.
33
-
34
- For example, if you distribute copies of such a program, whether
35
- gratis or for a fee, you must pass on to the recipients the same
36
- freedoms that you received. You must make sure that they, too, receive
37
- or can get the source code. And you must show them these terms so they
38
- know their rights.
39
-
40
- Developers that use the GNU GPL protect your rights with two steps:
41
- (1) assert copyright on the software, and (2) offer you this License
42
- giving you legal permission to copy, distribute and/or modify it.
43
-
44
- For the developers' and authors' protection, the GPL clearly explains
45
- that there is no warranty for this free software. For both users' and
46
- authors' sake, the GPL requires that modified versions be marked as
47
- changed, so that their problems will not be attributed erroneously to
48
- authors of previous versions.
49
-
50
- Some devices are designed to deny users access to install or run
51
- modified versions of the software inside them, although the manufacturer
52
- can do so. This is fundamentally incompatible with the aim of
53
- protecting users' freedom to change the software. The systematic
54
- pattern of such abuse occurs in the area of products for individuals to
55
- use, which is precisely where it is most unacceptable. Therefore, we
56
- have designed this version of the GPL to prohibit the practice for those
57
- products. If such problems arise substantially in other domains, we
58
- stand ready to extend this provision to those domains in future versions
59
- of the GPL, as needed to protect the freedom of users.
60
-
61
- Finally, every program is threatened constantly by software patents.
62
- States should not allow patents to restrict development and use of
63
- software on general-purpose computers, but in those that do, we wish to
64
- avoid the special danger that patents applied to a free program could
65
- make it effectively proprietary. To prevent this, the GPL assures that
66
- patents cannot be used to render the program non-free.
67
-
68
- The precise terms and conditions for copying, distribution and
69
- modification follow.
70
-
71
- TERMS AND CONDITIONS
72
-
73
- 0. Definitions.
74
-
75
- "This License" refers to version 3 of the GNU General Public License.
76
-
77
- "Copyright" also means copyright-like laws that apply to other kinds of
78
- works, such as semiconductor masks.
79
-
80
- "The Program" refers to any copyrightable work licensed under this
81
- License. Each licensee is addressed as "you". "Licensees" and
82
- "recipients" may be individuals or organizations.
83
-
84
- To "modify" a work means to copy from or adapt all or part of the work
85
- in a fashion requiring copyright permission, other than the making of an
86
- exact copy. The resulting work is called a "modified version" of the
87
- earlier work or a work "based on" the earlier work.
88
-
89
- A "covered work" means either the unmodified Program or a work based
90
- on the Program.
91
-
92
- To "propagate" a work means to do anything with it that, without
93
- permission, would make you directly or secondarily liable for
94
- infringement under applicable copyright law, except executing it on a
95
- computer or modifying a private copy. Propagation includes copying,
96
- distribution (with or without modification), making available to the
97
- public, and in some countries other activities as well.
98
-
99
- To "convey" a work means any kind of propagation that enables other
100
- parties to make or receive copies. Mere interaction with a user through
101
- a computer network, with no transfer of a copy, is not conveying.
102
-
103
- An interactive user interface displays "Appropriate Legal Notices"
104
- to the extent that it includes a convenient and prominently visible
105
- feature that (1) displays an appropriate copyright notice, and (2)
106
- tells the user that there is no warranty for the work (except to the
107
- extent that warranties are provided), that licensees may convey the
108
- work under this License, and how to view a copy of this License. If
109
- the interface presents a list of user commands or options, such as a
110
- menu, a prominent item in the list meets this criterion.
111
-
112
- 1. Source Code.
113
-
114
- The "source code" for a work means the preferred form of the work
115
- for making modifications to it. "Object code" means any non-source
116
- form of a work.
117
-
118
- A "Standard Interface" means an interface that either is an official
119
- standard defined by a recognized standards body, or, in the case of
120
- interfaces specified for a particular programming language, one that
121
- is widely used among developers working in that language.
122
-
123
- The "System Libraries" of an executable work include anything, other
124
- than the work as a whole, that (a) is included in the normal form of
125
- packaging a Major Component, but which is not part of that Major
126
- Component, and (b) serves only to enable use of the work with that
127
- Major Component, or to implement a Standard Interface for which an
128
- implementation is available to the public in source code form. A
129
- "Major Component", in this context, means a major essential component
130
- (kernel, window system, and so on) of the specific operating system
131
- (if any) on which the executable work runs, or a compiler used to
132
- produce the work, or an object code interpreter used to run it.
133
-
134
- The "Corresponding Source" for a work in object code form means all
135
- the source code needed to generate, install, and (for an executable
136
- work) run the object code and to modify the work, including scripts to
137
- control those activities. However, it does not include the work's
138
- System Libraries, or general-purpose tools or generally available free
139
- programs which are used unmodified in performing those activities but
140
- which are not part of the work. For example, Corresponding Source
141
- includes interface definition files associated with source files for
142
- the work, and the source code for shared libraries and dynamically
143
- linked subprograms that the work is specifically designed to require,
144
- such as by intimate data communication or control flow between those
145
- subprograms and other parts of the work.
146
-
147
- The Corresponding Source need not include anything that users
148
- can regenerate automatically from other parts of the Corresponding
149
- Source.
150
-
151
- The Corresponding Source for a work in source code form is that
152
- same work.
153
-
154
- 2. Basic Permissions.
155
-
156
- All rights granted under this License are granted for the term of
157
- copyright on the Program, and are irrevocable provided the stated
158
- conditions are met. This License explicitly affirms your unlimited
159
- permission to run the unmodified Program. The output from running a
160
- covered work is covered by this License only if the output, given its
161
- content, constitutes a covered work. This License acknowledges your
162
- rights of fair use or other equivalent, as provided by copyright law.
163
-
164
- You may make, run and propagate covered works that you do not
165
- convey, without conditions so long as your license otherwise remains
166
- in force. You may convey covered works to others for the sole purpose
167
- of having them make modifications exclusively for you, or provide you
168
- with facilities for running those works, provided that you comply with
169
- the terms of this License in conveying all material for which you do
170
- not control copyright. Those thus making or running the covered works
171
- for you must do so exclusively on your behalf, under your direction
172
- and control, on terms that prohibit them from making any copies of
173
- your copyrighted material outside their relationship with you.
174
-
175
- Conveying under any other circumstances is permitted solely under
176
- the conditions stated below. Sublicensing is not allowed; section 10
177
- makes it unnecessary.
178
-
179
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
180
-
181
- No covered work shall be deemed part of an effective technological
182
- measure under any applicable law fulfilling obligations under article
183
- 11 of the WIPO copyright treaty adopted on 20 December 1996, or
184
- similar laws prohibiting or restricting circumvention of such
185
- measures.
186
-
187
- When you convey a covered work, you waive any legal power to forbid
188
- circumvention of technological measures to the extent such circumvention
189
- is effected by exercising rights under this License with respect to
190
- the covered work, and you disclaim any intention to limit operation or
191
- modification of the work as a means of enforcing, against the work's
192
- users, your or third parties' legal rights to forbid circumvention of
193
- technological measures.
194
-
195
- 4. Conveying Verbatim Copies.
196
-
197
- You may convey verbatim copies of the Program's source code as you
198
- receive it, in any medium, provided that you conspicuously and
199
- appropriately publish on each copy an appropriate copyright notice;
200
- keep intact all notices stating that this License and any
201
- non-permissive terms added in accord with section 7 apply to the code;
202
- keep intact all notices of the absence of any warranty; and give all
203
- recipients a copy of this License along with the Program.
204
-
205
- You may charge any price or no price for each copy that you convey,
206
- and you may offer support or warranty protection for a fee.
207
-
208
- 5. Conveying Modified Source Versions.
209
-
210
- You may convey a work based on the Program, or the modifications to
211
- produce it from the Program, in the form of source code under the
212
- terms of section 4, provided that you also meet all of these conditions:
213
-
214
- a) The work must carry prominent notices stating that you modified
215
- it, and giving a relevant date.
216
-
217
- b) The work must carry prominent notices stating that it is
218
- released under this License and any conditions added under section
219
- 7. This requirement modifies the requirement in section 4 to
220
- "keep intact all notices".
221
-
222
- c) You must license the entire work, as a whole, under this
223
- License to anyone who comes into possession of a copy. This
224
- License will therefore apply, along with any applicable section 7
225
- additional terms, to the whole of the work, and all its parts,
226
- regardless of how they are packaged. This License gives no
227
- permission to license the work in any other way, but it does not
228
- invalidate such permission if you have separately received it.
229
-
230
- d) If the work has interactive user interfaces, each must display
231
- Appropriate Legal Notices; however, if the Program has interactive
232
- interfaces that do not display Appropriate Legal Notices, your
233
- work need not make them do so.
234
-
235
- A compilation of a covered work with other separate and independent
236
- works, which are not by their nature extensions of the covered work,
237
- and which are not combined with it such as to form a larger program,
238
- in or on a volume of a storage or distribution medium, is called an
239
- "aggregate" if the compilation and its resulting copyright are not
240
- used to limit the access or legal rights of the compilation's users
241
- beyond what the individual works permit. Inclusion of a covered work
242
- in an aggregate does not cause this License to apply to the other
243
- parts of the aggregate.
244
-
245
- 6. Conveying Non-Source Forms.
246
-
247
- You may convey a covered work in object code form under the terms
248
- of sections 4 and 5, provided that you also convey the
249
- machine-readable Corresponding Source under the terms of this License,
250
- in one of these ways:
251
-
252
- a) Convey the object code in, or embodied in, a physical product
253
- (including a physical distribution medium), accompanied by the
254
- Corresponding Source fixed on a durable physical medium
255
- customarily used for software interchange.
256
-
257
- b) Convey the object code in, or embodied in, a physical product
258
- (including a physical distribution medium), accompanied by a
259
- written offer, valid for at least three years and valid for as
260
- long as you offer spare parts or customer support for that product
261
- model, to give anyone who possesses the object code either (1) a
262
- copy of the Corresponding Source for all the software in the
263
- product that is covered by this License, on a durable physical
264
- medium customarily used for software interchange, for a price no
265
- more than your reasonable cost of physically performing this
266
- conveying of source, or (2) access to copy the
267
- Corresponding Source from a network server at no charge.
268
-
269
- c) Convey individual copies of the object code with a copy of the
270
- written offer to provide the Corresponding Source. This
271
- alternative is allowed only occasionally and noncommercially, and
272
- only if you received the object code with such an offer, in accord
273
- with subsection 6b.
274
-
275
- d) Convey the object code by offering access from a designated
276
- place (gratis or for a charge), and offer equivalent access to the
277
- Corresponding Source in the same way through the same place at no
278
- further charge. You need not require recipients to copy the
279
- Corresponding Source along with the object code. If the place to
280
- copy the object code is a network server, the Corresponding Source
281
- may be on a different server (operated by you or a third party)
282
- that supports equivalent copying facilities, provided you maintain
283
- clear directions next to the object code saying where to find the
284
- Corresponding Source. Regardless of what server hosts the
285
- Corresponding Source, you remain obligated to ensure that it is
286
- available for as long as needed to satisfy these requirements.
287
-
288
- e) Convey the object code using peer-to-peer transmission, provided
289
- you inform other peers where the object code and Corresponding
290
- Source of the work are being offered to the general public at no
291
- charge under subsection 6d.
292
-
293
- A separable portion of the object code, whose source code is excluded
294
- from the Corresponding Source as a System Library, need not be
295
- included in conveying the object code work.
296
-
297
- A "User Product" is either (1) a "consumer product", which means any
298
- tangible personal property which is normally used for personal, family,
299
- or household purposes, or (2) anything designed or sold for incorporation
300
- into a dwelling. In determining whether a product is a consumer product,
301
- doubtful cases shall be resolved in favor of coverage. For a particular
302
- product received by a particular user, "normally used" refers to a
303
- typical or common use of that class of product, regardless of the status
304
- of the particular user or of the way in which the particular user
305
- actually uses, or expects or is expected to use, the product. A product
306
- is a consumer product regardless of whether the product has substantial
307
- commercial, industrial or non-consumer uses, unless such uses represent
308
- the only significant mode of use of the product.
309
-
310
- "Installation Information" for a User Product means any methods,
311
- procedures, authorization keys, or other information required to install
312
- and execute modified versions of a covered work in that User Product from
313
- a modified version of its Corresponding Source. The information must
314
- suffice to ensure that the continued functioning of the modified object
315
- code is in no case prevented or interfered with solely because
316
- modification has been made.
317
-
318
- If you convey an object code work under this section in, or with, or
319
- specifically for use in, a User Product, and the conveying occurs as
320
- part of a transaction in which the right of possession and use of the
321
- User Product is transferred to the recipient in perpetuity or for a
322
- fixed term (regardless of how the transaction is characterized), the
323
- Corresponding Source conveyed under this section must be accompanied
324
- by the Installation Information. But this requirement does not apply
325
- if neither you nor any third party retains the ability to install
326
- modified object code on the User Product (for example, the work has
327
- been installed in ROM).
328
-
329
- The requirement to provide Installation Information does not include a
330
- requirement to continue to provide support service, warranty, or updates
331
- for a work that has been modified or installed by the recipient, or for
332
- the User Product in which it has been modified or installed. Access to a
333
- network may be denied when the modification itself materially and
334
- adversely affects the operation of the network or violates the rules and
335
- protocols for communication across the network.
336
-
337
- Corresponding Source conveyed, and Installation Information provided,
338
- in accord with this section must be in a format that is publicly
339
- documented (and with an implementation available to the public in
340
- source code form), and must require no special password or key for
341
- unpacking, reading or copying.
342
-
343
- 7. Additional Terms.
344
-
345
- "Additional permissions" are terms that supplement the terms of this
346
- License by making exceptions from one or more of its conditions.
347
- Additional permissions that are applicable to the entire Program shall
348
- be treated as though they were included in this License, to the extent
349
- that they are valid under applicable law. If additional permissions
350
- apply only to part of the Program, that part may be used separately
351
- under those permissions, but the entire Program remains governed by
352
- this License without regard to the additional permissions.
353
-
354
- When you convey a copy of a covered work, you may at your option
355
- remove any additional permissions from that copy, or from any part of
356
- it. (Additional permissions may be written to require their own
357
- removal in certain cases when you modify the work.) You may place
358
- additional permissions on material, added by you to a covered work,
359
- for which you have or can give appropriate copyright permission.
360
-
361
- Notwithstanding any other provision of this License, for material you
362
- add to a covered work, you may (if authorized by the copyright holders of
363
- that material) supplement the terms of this License with terms:
364
-
365
- a) Disclaiming warranty or limiting liability differently from the
366
- terms of sections 15 and 16 of this License; or
367
-
368
- b) Requiring preservation of specified reasonable legal notices or
369
- author attributions in that material or in the Appropriate Legal
370
- Notices displayed by works containing it; or
371
-
372
- c) Prohibiting misrepresentation of the origin of that material, or
373
- requiring that modified versions of such material be marked in
374
- reasonable ways as different from the original version; or
375
-
376
- d) Limiting the use for publicity purposes of names of licensors or
377
- authors of the material; or
378
-
379
- e) Declining to grant rights under trademark law for use of some
380
- trade names, trademarks, or service marks; or
381
-
382
- f) Requiring indemnification of licensors and authors of that
383
- material by anyone who conveys the material (or modified versions of
384
- it) with contractual assumptions of liability to the recipient, for
385
- any liability that these contractual assumptions directly impose on
386
- those licensors and authors.
387
-
388
- All other non-permissive additional terms are considered "further
389
- restrictions" within the meaning of section 10. If the Program as you
390
- received it, or any part of it, contains a notice stating that it is
391
- governed by this License along with a term that is a further
392
- restriction, you may remove that term. If a license document contains
393
- a further restriction but permits relicensing or conveying under this
394
- License, you may add to a covered work material governed by the terms
395
- of that license document, provided that the further restriction does
396
- not survive such relicensing or conveying.
397
-
398
- If you add terms to a covered work in accord with this section, you
399
- must place, in the relevant source files, a statement of the
400
- additional terms that apply to those files, or a notice indicating
401
- where to find the applicable terms.
402
-
403
- Additional terms, permissive or non-permissive, may be stated in the
404
- form of a separately written license, or stated as exceptions;
405
- the above requirements apply either way.
406
-
407
- 8. Termination.
408
-
409
- You may not propagate or modify a covered work except as expressly
410
- provided under this License. Any attempt otherwise to propagate or
411
- modify it is void, and will automatically terminate your rights under
412
- this License (including any patent licenses granted under the third
413
- paragraph of section 11).
414
-
415
- However, if you cease all violation of this License, then your
416
- license from a particular copyright holder is reinstated (a)
417
- provisionally, unless and until the copyright holder explicitly and
418
- finally terminates your license, and (b) permanently, if the copyright
419
- holder fails to notify you of the violation by some reasonable means
420
- prior to 60 days after the cessation.
421
-
422
- Moreover, your license from a particular copyright holder is
423
- reinstated permanently if the copyright holder notifies you of the
424
- violation by some reasonable means, this is the first time you have
425
- received notice of violation of this License (for any work) from that
426
- copyright holder, and you cure the violation prior to 30 days after
427
- your receipt of the notice.
428
-
429
- Termination of your rights under this section does not terminate the
430
- licenses of parties who have received copies or rights from you under
431
- this License. If your rights have been terminated and not permanently
432
- reinstated, you do not qualify to receive new licenses for the same
433
- material under section 10.
434
-
435
- 9. Acceptance Not Required for Having Copies.
436
-
437
- You are not required to accept this License in order to receive or
438
- run a copy of the Program. Ancillary propagation of a covered work
439
- occurring solely as a consequence of using peer-to-peer transmission
440
- to receive a copy likewise does not require acceptance. However,
441
- nothing other than this License grants you permission to propagate or
442
- modify any covered work. These actions infringe copyright if you do
443
- not accept this License. Therefore, by modifying or propagating a
444
- covered work, you indicate your acceptance of this License to do so.
445
-
446
- 10. Automatic Licensing of Downstream Recipients.
447
-
448
- Each time you convey a covered work, the recipient automatically
449
- receives a license from the original licensors, to run, modify and
450
- propagate that work, subject to this License. You are not responsible
451
- for enforcing compliance by third parties with this License.
452
-
453
- An "entity transaction" is a transaction transferring control of an
454
- organization, or substantially all assets of one, or subdividing an
455
- organization, or merging organizations. If propagation of a covered
456
- work results from an entity transaction, each party to that
457
- transaction who receives a copy of the work also receives whatever
458
- licenses to the work the party's predecessor in interest had or could
459
- give under the previous paragraph, plus a right to possession of the
460
- Corresponding Source of the work from the predecessor in interest, if
461
- the predecessor has it or can get it with reasonable efforts.
462
-
463
- You may not impose any further restrictions on the exercise of the
464
- rights granted or affirmed under this License. For example, you may
465
- not impose a license fee, royalty, or other charge for exercise of
466
- rights granted under this License, and you may not initiate litigation
467
- (including a cross-claim or counterclaim in a lawsuit) alleging that
468
- any patent claim is infringed by making, using, selling, offering for
469
- sale, or importing the Program or any portion of it.
470
-
471
- 11. Patents.
472
-
473
- A "contributor" is a copyright holder who authorizes use under this
474
- License of the Program or a work on which the Program is based. The
475
- work thus licensed is called the contributor's "contributor version".
476
-
477
- A contributor's "essential patent claims" are all patent claims
478
- owned or controlled by the contributor, whether already acquired or
479
- hereafter acquired, that would be infringed by some manner, permitted
480
- by this License, of making, using, or selling its contributor version,
481
- but do not include claims that would be infringed only as a
482
- consequence of further modification of the contributor version. For
483
- purposes of this definition, "control" includes the right to grant
484
- patent sublicenses in a manner consistent with the requirements of
485
- this License.
486
-
487
- Each contributor grants you a non-exclusive, worldwide, royalty-free
488
- patent license under the contributor's essential patent claims, to
489
- make, use, sell, offer for sale, import and otherwise run, modify and
490
- propagate the contents of its contributor version.
491
-
492
- In the following three paragraphs, a "patent license" is any express
493
- agreement or commitment, however denominated, not to enforce a patent
494
- (such as an express permission to practice a patent or covenant not to
495
- sue for patent infringement). To "grant" such a patent license to a
496
- party means to make such an agreement or commitment not to enforce a
497
- patent against the party.
498
-
499
- If you convey a covered work, knowingly relying on a patent license,
500
- and the Corresponding Source of the work is not available for anyone
501
- to copy, free of charge and under the terms of this License, through a
502
- publicly available network server or other readily accessible means,
503
- then you must either (1) cause the Corresponding Source to be so
504
- available, or (2) arrange to deprive yourself of the benefit of the
505
- patent license for this particular work, or (3) arrange, in a manner
506
- consistent with the requirements of this License, to extend the patent
507
- license to downstream recipients. "Knowingly relying" means you have
508
- actual knowledge that, but for the patent license, your conveying the
509
- covered work in a country, or your recipient's use of the covered work
510
- in a country, would infringe one or more identifiable patents in that
511
- country that you have reason to believe are valid.
512
-
513
- If, pursuant to or in connection with a single transaction or
514
- arrangement, you convey, or propagate by procuring conveyance of, a
515
- covered work, and grant a patent license to some of the parties
516
- receiving the covered work authorizing them to use, propagate, modify
517
- or convey a specific copy of the covered work, then the patent license
518
- you grant is automatically extended to all recipients of the covered
519
- work and works based on it.
520
-
521
- A patent license is "discriminatory" if it does not include within
522
- the scope of its coverage, prohibits the exercise of, or is
523
- conditioned on the non-exercise of one or more of the rights that are
524
- specifically granted under this License. You may not convey a covered
525
- work if you are a party to an arrangement with a third party that is
526
- in the business of distributing software, under which you make payment
527
- to the third party based on the extent of your activity of conveying
528
- the work, and under which the third party grants, to any of the
529
- parties who would receive the covered work from you, a discriminatory
530
- patent license (a) in connection with copies of the covered work
531
- conveyed by you (or copies made from those copies), or (b) primarily
532
- for and in connection with specific products or compilations that
533
- contain the covered work, unless you entered into that arrangement,
534
- or that patent license was granted, prior to 28 March 2007.
535
-
536
- Nothing in this License shall be construed as excluding or limiting
537
- any implied license or other defenses to infringement that may
538
- otherwise be available to you under applicable patent law.
539
-
540
- 12. No Surrender of Others' Freedom.
541
-
542
- If conditions are imposed on you (whether by court order, agreement or
543
- otherwise) that contradict the conditions of this License, they do not
544
- excuse you from the conditions of this License. If you cannot convey a
545
- covered work so as to satisfy simultaneously your obligations under this
546
- License and any other pertinent obligations, then as a consequence you may
547
- not convey it at all. For example, if you agree to terms that obligate you
548
- to collect a royalty for further conveying from those to whom you convey
549
- the Program, the only way you could satisfy both those terms and this
550
- License would be to refrain entirely from conveying the Program.
551
-
552
- 13. Use with the GNU Affero General Public License.
553
-
554
- Notwithstanding any other provision of this License, you have
555
- permission to link or combine any covered work with a work licensed
556
- under version 3 of the GNU Affero General Public License into a single
557
- combined work, and to convey the resulting work. The terms of this
558
- License will continue to apply to the part which is the covered work,
559
- but the special requirements of the GNU Affero General Public License,
560
- section 13, concerning interaction through a network will apply to the
561
- combination as such.
562
-
563
- 14. Revised Versions of this License.
564
-
565
- The Free Software Foundation may publish revised and/or new versions of
566
- the GNU General Public License from time to time. Such new versions will
567
- be similar in spirit to the present version, but may differ in detail to
568
- address new problems or concerns.
569
-
570
- Each version is given a distinguishing version number. If the
571
- Program specifies that a certain numbered version of the GNU General
572
- Public License "or any later version" applies to it, you have the
573
- option of following the terms and conditions either of that numbered
574
- version or of any later version published by the Free Software
575
- Foundation. If the Program does not specify a version number of the
576
- GNU General Public License, you may choose any version ever published
577
- by the Free Software Foundation.
578
-
579
- If the Program specifies that a proxy can decide which future
580
- versions of the GNU General Public License can be used, that proxy's
581
- public statement of acceptance of a version permanently authorizes you
582
- to choose that version for the Program.
583
-
584
- Later license versions may give you additional or different
585
- permissions. However, no additional obligations are imposed on any
586
- author or copyright holder as a result of your choosing to follow a
587
- later version.
588
-
589
- 15. Disclaimer of Warranty.
590
-
591
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
592
- APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
593
- HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
594
- OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
595
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
596
- PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
597
- IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
598
- ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
599
-
600
- 16. Limitation of Liability.
601
-
602
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
603
- WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
604
- THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
605
- GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
606
- USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
607
- DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
608
- PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
609
- EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
610
- SUCH DAMAGES.
611
-
612
- 17. Interpretation of Sections 15 and 16.
613
-
614
- If the disclaimer of warranty and limitation of liability provided
615
- above cannot be given local legal effect according to their terms,
616
- reviewing courts shall apply local law that most closely approximates
617
- an absolute waiver of all civil liability in connection with the
618
- Program, unless a warranty or assumption of liability accompanies a
619
- copy of the Program in return for a fee.
620
-
621
- END OF TERMS AND CONDITIONS
622
-
623
- How to Apply These Terms to Your New Programs
624
-
625
- If you develop a new program, and you want it to be of the greatest
626
- possible use to the public, the best way to achieve this is to make it
627
- free software which everyone can redistribute and change under these terms.
628
-
629
- To do so, attach the following notices to the program. It is safest
630
- to attach them to the start of each source file to most effectively
631
- state the exclusion of warranty; and each file should have at least
632
- the "copyright" line and a pointer to where the full notice is found.
633
-
634
- <one line to give the program's name and a brief idea of what it does.>
635
- Copyright (C) <year> <name of author>
636
-
637
- This program is free software: you can redistribute it and/or modify
638
- it under the terms of the GNU General Public License as published by
639
- the Free Software Foundation, either version 3 of the License, or
640
- (at your option) any later version.
641
-
642
- This program is distributed in the hope that it will be useful,
643
- but WITHOUT ANY WARRANTY; without even the implied warranty of
644
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
645
- GNU General Public License for more details.
646
-
647
- You should have received a copy of the GNU General Public License
648
- along with this program. If not, see <http://www.gnu.org/licenses/>.
649
-
650
- Also add information on how to contact you by electronic and paper mail.
651
-
652
- If the program does terminal interaction, make it output a short
653
- notice like this when it starts in an interactive mode:
654
-
655
- <program> Copyright (C) <year> <name of author>
656
- This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
657
- This is free software, and you are welcome to redistribute it
658
- under certain conditions; type `show c' for details.
659
-
660
- The hypothetical commands `show w' and `show c' should show the appropriate
661
- parts of the General Public License. Of course, your program's commands
662
- might be different; for a GUI interface, you would use an "about box".
663
-
664
- You should also get your employer (if you work as a programmer) or school,
665
- if any, to sign a "copyright disclaimer" for the program, if necessary.
666
- For more information on this, and how to apply and follow the GNU GPL, see
667
- <http://www.gnu.org/licenses/>.
668
-
669
- The GNU General Public License does not permit incorporating your program
670
- into proprietary programs. If your program is a subroutine library, you
671
- may consider it more useful to permit linking proprietary applications with
672
- the library. If this is what you want to do, use the GNU Lesser General
673
- Public License instead of this License. But first, please read
674
- <http://www.gnu.org/philosophy/why-not-lgpl.html>.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.md DELETED
@@ -1,59 +0,0 @@
1
- # BackWPup Free - WordPress Backup Plugin
2
- Schedule complete automatic backups of your WordPress installation. Decide which content will be stored (Dropbox, S3…). This is the free version
3
-
4
- ## Description
5
- The **backup plugin** **[BackWPup Free](http://marketpress.com/product/backwpup-pro/)** can be used to save your complete installation including /wp-content/ and push them to an external Backup Service, like **Dropbox**, **S3**, **FTP** and many more, see list below. With a single backup .zip file you are able to easily restore an installation. Please understand: this free version will not be supported as good as the [BackWPup Pro version](http://marketpress.com/product/backwpup-pro/).
6
-
7
- BackWPup Free is the number 1 backup-plugin for WordPress with nearly 1.000.000 downloads and in the top 20 of all WordPress Plugins (checked on rankwp.com)
8
-
9
- * Database Backup *(needs mysqli)*
10
- * WordPress XML Export
11
- * Generate a file with installed plugins
12
- * Optimize Database
13
- * Check and repair Database
14
- * File backup
15
- * Backups in zip, tar, tar.gz, tar.bz2 format *(needs gz, bz2, ZipArchive)*
16
- * Store backup to directory
17
- * Store backup to FTP server *(needs ftp)*
18
- * Store backup to Dropbox *(needs curl)*
19
- * Store backup to S3 services *(needs curl)*
20
- * Store backup to Microsoft Azure (Blob) *(needs PHP 5.3.2, curl)*
21
- * Store backup to RackSpaceCloud *(needs PHP 5.3.2, curl)*
22
- * Store backup to SugarSync *(needs curl)*
23
- * PRO: Store backup to Amazon Glacier *(needs PHP 5.3.3, curl)*
24
- * PRO: Store backup to Google Drive *(needs PHP 5.3.3, curl)*
25
- * Send logs and backups by email
26
- * Multi-site support only as network admin
27
- * Pro version and support available - [BackWPup Pro](http://marketpress.com/product/backwpup-pro/)
28
-
29
-
30
- **Remember: The most expensive backup is the one you never did! And please test your backups!**
31
-
32
- Get the [BackWPup Pro](http://marketpress.com/product/backwpup-pro/) Version with more features on [MarketPress.com](http://marketpress.com/product/backwpup-pro/)
33
-
34
- **Made by [Inpsyde](http://inpsyde.com) &middot; We love WordPress**
35
-
36
- Have a look at our other premium plugins at [MarketPress.com](http://marketpress.com).
37
-
38
-
39
- ## Available languages
40
- * english (standard)
41
- * french / français (fr_FR)
42
- * german / deutsch (de_DE)
43
- * russian / русский (ru_RU)
44
- * simplified chinese (zh_CN)
45
-
46
- ## Requirements
47
- * WordPress 3.4 and PHP 5.2.6 required!
48
- * To use the Plugin with full functionality PHP 5.3.3 with mysqli, FTP,gz, bz2, ZipArchive and curl is needed.
49
- * Plugin functions that don't work because of your server settings, will not be displayed in admin area.
50
-
51
-
52
- ## Screenshots
53
-
54
- 1. [Working job and jobs overview](https://raw.github.com/inpsyde/backwpup/master/screenshot-1.png)
55
- 2. [Job creation/edit](https://raw.github.com/inpsyde/backwpup/master/screenshot-2.png)
56
- 3. [Displaying logs](https://raw.github.com/inpsyde/backwpup/master/screenshot-3.png)
57
- 4. [Manage backup archives](https://raw.github.com/inpsyde/backwpup/master/screenshot-4.png)
58
- 5. [Dashboard](https://raw.github.com/inpsyde/backwpup/master/screenshot-5.png)
59
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
readme.txt CHANGED
@@ -1,9 +1,9 @@
1
- === BackWPup Free - WordPress Backup Plugin ===
2
  Contributors: inpsyde, danielhuesken, Bueltge, nullbyte
3
  Tags: Amazon, Amazon S3, back up, backup, chinese, cloud, cloud files, database, db backup, dropbox, dump, file, french, ftp, ftps, german, migrate, multisite, russian, schedule, sftp, storage, S3, time, upload, xml
4
  Requires at least: 3.4
5
- Tested up to: 4.0
6
- Stable tag: 3.1.3
7
  License: GPLv3
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
@@ -13,7 +13,6 @@ Schedule complete automatic backups of your WordPress installation. Decide which
13
 
14
  The **backup plugin** **[BackWPup Free](http://marketpress.com/product/backwpup-pro/)** can be used to save your complete installation including /wp-content/ and push them to an external Backup Service, like **Dropbox**, **S3**, **FTP** and many more, see list below. With a single backup .zip file you are able to easily restore an installation. Please understand: this free version will not be supported as good as the [BackWPup Pro version](http://marketpress.com/product/backwpup-pro/).
15
 
16
- BackWPup Free is the number 1 backup-plugin for WordPress with nearly 1.000.000 downloads and in the top 20 of all WordPress Plugins (checked on rankwp.com)
17
 
18
  * Database Backup *(needs mysqli)*
19
  * WordPress XML Export
@@ -171,6 +170,12 @@ Please check all settings after the update:
171
 
172
 
173
  == Changelog ==
 
 
 
 
 
 
174
  = Version 3.1.3 =
175
  * Fixed: var_export not working if output buffering active
176
  * Fixed: bug in sending test emails on Backup with email
1
+ === BackWPup Free - WordPress Backup Plugin ===
2
  Contributors: inpsyde, danielhuesken, Bueltge, nullbyte
3
  Tags: Amazon, Amazon S3, back up, backup, chinese, cloud, cloud files, database, db backup, dropbox, dump, file, french, ftp, ftps, german, migrate, multisite, russian, schedule, sftp, storage, S3, time, upload, xml
4
  Requires at least: 3.4
5
+ Tested up to: 4.3
6
+ Stable tag: 3.1.4
7
  License: GPLv3
8
  License URI: http://www.gnu.org/licenses/gpl-3.0.html
9
 
13
 
14
  The **backup plugin** **[BackWPup Free](http://marketpress.com/product/backwpup-pro/)** can be used to save your complete installation including /wp-content/ and push them to an external Backup Service, like **Dropbox**, **S3**, **FTP** and many more, see list below. With a single backup .zip file you are able to easily restore an installation. Please understand: this free version will not be supported as good as the [BackWPup Pro version](http://marketpress.com/product/backwpup-pro/).
15
 
 
16
 
17
  * Database Backup *(needs mysqli)*
18
  * WordPress XML Export
170
 
171
 
172
  == Changelog ==
173
+ = Version 3.1.4 =
174
+ * Fixed: removing of % from filename
175
+ * Fixed: Notice in combination with bbPress
176
+ * Fixed: Zip Archive "Entry has been deleted" messages
177
+ * Improved: WP-CLI output a bit
178
+
179
  = Version 3.1.3 =
180
  * Fixed: var_export not working if output buffering active
181
  * Fixed: bug in sending test emails on Backup with email
screenshot-1.png DELETED
Binary file
screenshot-2.png DELETED
Binary file
screenshot-3.png DELETED
Binary file
screenshot-4.png DELETED
Binary file
screenshot-5.png DELETED
Binary file
uninstall.php CHANGED
@@ -1,43 +1,43 @@
1
- <?php
2
- //if uninstall not called from WordPress exit
3
- if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) )
4
- die();
5
-
6
- global $wpdb;
7
- /* @var wpdb $wpdb */
8
-
9
- //only uninstall if no BackWPup Version active
10
- if ( ! class_exists( 'BackWPup' ) ) {
11
- //remove roles from user
12
- /* @var WP_User $user */
13
- $users = get_users( array( 'role' => 'backwpup_admin' ) );
14
- foreach ( $users as $user ) {
15
- $user->remove_role( 'backwpup_admin' );
16
- }
17
- remove_role( 'backwpup_admin' );
18
- $users = get_users( array( 'role' => 'backwpup_helper' ) );
19
- foreach ( $users as $user ) {
20
- $user->remove_role( 'backwpup_helper' );
21
- }
22
- remove_role( 'backwpup_helper' );
23
- $users = get_users( array( 'role' => 'backwpup_check' ) );
24
- foreach ( $users as $user ) {
25
- $user->remove_role( 'backwpup_check' );
26
- }
27
- remove_role( 'backwpup_check' );
28
- //delete log folder and logs
29
- $log_folder = get_site_option( 'backwpup_cfg_logfolder' );
30
- if ( $dir = opendir( $log_folder ) ) {
31
- while ( FALSE !== ( $file = readdir( $dir ) ) ) {
32
- if ( file_exists( $log_folder . $file ) && ( substr( $file, -8 ) == '.html.gz' || substr( $file, -5 ) == '.html' ) )
33
- unlink( $log_folder . $file );
34
- }
35
- closedir( $dir );
36
- }
37
- rmdir( $log_folder );
38
- //delete plugin options
39
- if ( is_multisite() )
40
- $wpdb->query( "DELETE FROM " . $wpdb->sitemeta . " WHERE meta_key LIKE '%backwpup_%' " );
41
- else
42
- $wpdb->query( "DELETE FROM " . $wpdb->options . " WHERE option_name LIKE '%backwpup_%' " );
43
  }
1
+ <?php
2
+ //if uninstall not called from WordPress exit
3
+ if ( ! defined( 'WP_UNINSTALL_PLUGIN' ) )
4
+ die();
5
+
6
+ global $wpdb;
7
+ /* @var wpdb $wpdb */
8
+
9
+ //only uninstall if no BackWPup Version active
10
+ if ( ! class_exists( 'BackWPup' ) ) {
11
+ //remove roles from user
12
+ /* @var WP_User $user */
13
+ $users = get_users( array( 'role' => 'backwpup_admin' ) );
14
+ foreach ( $users as $user ) {
15
+ $user->remove_role( 'backwpup_admin' );
16
+ }
17
+ remove_role( 'backwpup_admin' );
18
+ $users = get_users( array( 'role' => 'backwpup_helper' ) );
19
+ foreach ( $users as $user ) {
20
+ $user->remove_role( 'backwpup_helper' );
21
+ }
22
+ remove_role( 'backwpup_helper' );
23
+ $users = get_users( array( 'role' => 'backwpup_check' ) );
24
+ foreach ( $users as $user ) {
25
+ $user->remove_role( 'backwpup_check' );
26
+ }
27
+ remove_role( 'backwpup_check' );
28
+ //delete log folder and logs
29
+ $log_folder = get_site_option( 'backwpup_cfg_logfolder' );
30
+ if ( $dir = opendir( $log_folder ) ) {
31
+ while ( FALSE !== ( $file = readdir( $dir ) ) ) {
32
+ if ( file_exists( $log_folder . $file ) && ( substr( $file, -8 ) == '.html.gz' || substr( $file, -5 ) == '.html' ) )
33
+ unlink( $log_folder . $file );
34
+ }
35
+ closedir( $dir );
36
+ }
37
+ rmdir( $log_folder );
38
+ //delete plugin options
39
+ if ( is_multisite() )
40
+ $wpdb->query( "DELETE FROM " . $wpdb->sitemeta . " WHERE meta_key LIKE '%backwpup_%' " );
41
+ else
42
+ $wpdb->query( "DELETE FROM " . $wpdb->options . " WHERE option_name LIKE '%backwpup_%' " );
43
  }
vendor/Aws/Common/Aws.php CHANGED
@@ -1,105 +1,105 @@
1
- <?php
2
- /**
3
- * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- namespace Aws\Common;
18
-
19
- use Aws\Common\Facade\Facade;
20
- use Guzzle\Service\Builder\ServiceBuilder;
21
- use Guzzle\Service\Builder\ServiceBuilderLoader;
22
-
23
- /**
24
- * Base class for interacting with web service clients
25
- */
26
- class Aws extends ServiceBuilder
27
- {
28
- /**
29
- * @var string Current version of the SDK
30
- */
31
- const VERSION = '2.7.3';
32
-
33
- /**
34
- * Create a new service locator for the AWS SDK
35
- *
36
- * You can configure the service locator is four different ways:
37
- *
38
- * 1. Use the default configuration file shipped with the SDK that wires class names with service short names and
39
- * specify global parameters to add to every definition (e.g. key, secret, credentials, etc)
40
- *
41
- * 2. Use a custom configuration file that extends the default config and supplies credentials for each service.
42
- *
43
- * 3. Use a custom config file that wires services to custom short names for services.
44
- *
45
- * 4. If you are on Amazon EC2, you can use the default configuration file and not provide any credentials so that
46
- * you are using InstanceProfile credentials.
47
- *
48
- * @param array|string $config The full path to a .php or .js|.json file, or an associative array of data
49
- * to use as global parameters to pass to each service.
50
- * @param array $globalParameters Global parameters to pass to every service as it is instantiated.
51
- *
52
- * @return Aws
53
- */
54
- public static function factory($config = null, array $globalParameters = array())
55
- {
56
- if (!$config) {
57
- // If nothing is passed in, then use the default configuration file with credentials from the environment
58
- $config = self::getDefaultServiceDefinition();
59
- } elseif (is_array($config)) {
60
- // If an array was passed, then use the default configuration file with parameter overrides
61
- $globalParameters = $config;
62
- $config = self::getDefaultServiceDefinition();
63
- }
64
-
65
- $loader = new ServiceBuilderLoader();
66
- $loader->addAlias('_aws', self::getDefaultServiceDefinition())
67
- ->addAlias('_sdk1', __DIR__ . '/Resources/sdk1-config.php');
68
-
69
- return $loader->load($config, $globalParameters);
70
- }
71
-
72
- /**
73
- * Get the full path to the default service builder definition file
74
- *
75
- * @return string
76
- */
77
- public static function getDefaultServiceDefinition()
78
- {
79
- return __DIR__ . '/Resources/aws-config.php';
80
- }
81
-
82
- /**
83
- * Returns the configuration for the service builder
84
- *
85
- * @return array
86
- */
87
- public function getConfig()
88
- {
89
- return $this->builderConfig;
90
- }
91
-
92
- /**
93
- * Enables the facades for the clients defined in the service builder
94
- *
95
- * @param string|null $namespace The namespace that the facades should be mounted to. Defaults to global namespace
96
- *
97
- * @return Aws
98
- */
99
- public function enableFacades($namespace = null)
100
- {
101
- Facade::mountFacades($this, $namespace);
102
-
103
- return $this;
104
- }
105
- }
1
+ <?php
2
+ /**
3
+ * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ namespace Aws\Common;
18
+
19
+ use Aws\Common\Facade\Facade;
20
+ use Guzzle\Service\Builder\ServiceBuilder;
21
+ use Guzzle\Service\Builder\ServiceBuilderLoader;
22
+
23
+ /**
24
+ * Base class for interacting with web service clients
25
+ */
26
+ class Aws extends ServiceBuilder
27
+ {
28
+ /**
29
+ * @var string Current version of the SDK
30
+ */
31
+ const VERSION = '2.7.3';
32
+
33
+ /**
34
+ * Create a new service locator for the AWS SDK
35
+ *
36
+ * You can configure the service locator is four different ways:
37
+ *
38
+ * 1. Use the default configuration file shipped with the SDK that wires class names with service short names and
39
+ * specify global parameters to add to every definition (e.g. key, secret, credentials, etc)
40
+ *
41
+ * 2. Use a custom configuration file that extends the default config and supplies credentials for each service.
42
+ *
43
+ * 3. Use a custom config file that wires services to custom short names for services.
44
+ *
45
+ * 4. If you are on Amazon EC2, you can use the default configuration file and not provide any credentials so that
46
+ * you are using InstanceProfile credentials.
47
+ *
48
+ * @param array|string $config The full path to a .php or .js|.json file, or an associative array of data
49
+ * to use as global parameters to pass to each service.
50
+ * @param array $globalParameters Global parameters to pass to every service as it is instantiated.
51
+ *
52
+ * @return Aws
53
+ */
54
+ public static function factory($config = null, array $globalParameters = array())
55
+ {
56
+ if (!$config) {
57
+ // If nothing is passed in, then use the default configuration file with credentials from the environment
58
+ $config = self::getDefaultServiceDefinition();
59
+ } elseif (is_array($config)) {
60
+ // If an array was passed, then use the default configuration file with parameter overrides
61
+ $globalParameters = $config;
62
+ $config = self::getDefaultServiceDefinition();
63
+ }
64
+
65
+ $loader = new ServiceBuilderLoader();
66
+ $loader->addAlias('_aws', self::getDefaultServiceDefinition())
67
+ ->addAlias('_sdk1', __DIR__ . '/Resources/sdk1-config.php');
68
+
69
+ return $loader->load($config, $globalParameters);
70
+ }
71
+
72
+ /**
73
+ * Get the full path to the default service builder definition file
74
+ *
75
+ * @return string
76
+ */
77
+ public static function getDefaultServiceDefinition()
78
+ {
79
+ return __DIR__ . '/Resources/aws-config.php';
80
+ }
81
+
82
+ /**
83
+ * Returns the configuration for the service builder
84
+ *
85
+ * @return array
86
+ */
87
+ public function getConfig()
88
+ {
89
+ return $this->builderConfig;
90
+ }
91
+
92
+ /**
93
+ * Enables the facades for the clients defined in the service builder
94
+ *
95
+ * @param string|null $namespace The namespace that the facades should be mounted to. Defaults to global namespace
96
+ *
97
+ * @return Aws
98
+ */
99
+ public function enableFacades($namespace = null)
100
+ {
101
+ Facade::mountFacades($this, $namespace);
102
+
103
+ return $this;
104
+ }
105
+ }
vendor/Aws/Common/Client/AbstractClient.php CHANGED
@@ -1,272 +1,272 @@
1
- <?php
2
- /**
3
- * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- namespace Aws\Common\Client;
18
-
19
- use Aws\Common\Aws;
20
- use Aws\Common\Credentials\CredentialsInterface;
21
- use Aws\Common\Credentials\NullCredentials;
22
- use Aws\Common\Enum\ClientOptions as Options;
23
- use Aws\Common\Exception\InvalidArgumentException;
24
- use Aws\Common\Exception\TransferException;
25
- use Aws\Common\Signature\EndpointSignatureInterface;
26
- use Aws\Common\Signature\SignatureInterface;
27
- use Aws\Common\Signature\SignatureListener;
28
- use Aws\Common\Waiter\WaiterClassFactory;
29
- use Aws\Common\Waiter\CompositeWaiterFactory;
30
- use Aws\Common\Waiter\WaiterFactoryInterface;
31
- use Aws\Common\Waiter\WaiterConfigFactory;
32
- use Guzzle\Common\Collection;
33
- use Guzzle\Http\Exception\CurlException;
34
- use Guzzle\Service\Client;
35
- use Guzzle\Service\Description\ServiceDescriptionInterface;
36
-
37
- /**
38
- * Abstract AWS client
39
- */
40
- abstract class AbstractClient extends Client implements AwsClientInterface
41
- {
42
- /**
43
- * @var CredentialsInterface AWS credentials
44
- */
45
- protected $credentials;
46
-
47
- /**
48
- * @var SignatureInterface Signature implementation of the service
49
- */
50
- protected $signature;
51
-
52
- /**
53
- * @var WaiterFactoryInterface Factory used to create waiter classes
54
- */
55
- protected $waiterFactory;
56
-
57
- /**
58
- * {@inheritdoc}
59
- */
60
- public static function getAllEvents()
61
- {
62
- return array_merge(Client::getAllEvents(), array(
63
- 'client.region_changed',
64
- 'client.credentials_changed',
65
- ));
66
- }
67
-
68
- /**
69
- * @param CredentialsInterface $credentials AWS credentials
70
- * @param SignatureInterface $signature Signature implementation
71
- * @param Collection $config Configuration options
72
- *
73
- * @throws InvalidArgumentException if an endpoint provider isn't provided
74
- */
75
- public function __construct(CredentialsInterface $credentials, SignatureInterface $signature, Collection $config)
76
- {
77
- // Bootstrap with Guzzle
78
- parent::__construct($config->get(Options::BASE_URL), $config);
79
- $this->credentials = $credentials;
80
- $this->signature = $signature;
81
-
82
- // Make sure the user agent is prefixed by the SDK version
83
- $this->setUserAgent('aws-sdk-php2/' . Aws::VERSION, true);
84
-
85
- // Add the event listener so that requests are signed before they are sent
86
- $dispatcher = $this->getEventDispatcher();
87
- if (!$credentials instanceof NullCredentials) {
88
- $dispatcher->addSubscriber(new SignatureListener($credentials, $signature));
89
- }
90
-
91
- if ($backoff = $config->get(Options::BACKOFF)) {
92
- $dispatcher->addSubscriber($backoff, -255);
93
- }
94
- }
95
-
96
- public function __call($method, $args)
97
- {
98
- if (substr($method, 0, 3) === 'get' && substr($method, -8) === 'Iterator') {
99
- // Allow magic method calls for iterators (e.g. $client->get<CommandName>Iterator($params))
100
- $commandOptions = isset($args[0]) ? $args[0] : null;
101
- $iteratorOptions = isset($args[1]) ? $args[1] : array();
102
- return $this->getIterator(substr($method, 3, -8), $commandOptions, $iteratorOptions);
103
- } elseif (substr($method, 0, 9) == 'waitUntil') {
104
- // Allow magic method calls for waiters (e.g. $client->waitUntil<WaiterName>($params))
105
- return $this->waitUntil(substr($method, 9), isset($args[0]) ? $args[0]: array());
106
- } else {
107
- return parent::__call(ucfirst($method), $args);
108
- }
109
- }
110
-
111
- /**
112
- * Get an endpoint for a specific region from a service description
113
- * @deprecated This function will no longer be updated to work with new regions.
114
- */
115
- public static function getEndpoint(ServiceDescriptionInterface $description, $region, $scheme)
116
- {
117
- $service = $description->getData('serviceFullName');
118
- // Lookup the region in the service description
119
- if (!($regions = $description->getData('regions'))) {
120
- throw new InvalidArgumentException("No regions found in the {$service} description");
121
- }
122
- // Ensure that the region exists for the service
123
- if (!isset($regions[$region])) {
124
- throw new InvalidArgumentException("{$region} is not a valid region for {$service}");
125
- }
126
- // Ensure that the scheme is valid
127
- if ($regions[$region][$scheme] == false) {
128
- throw new InvalidArgumentException("{$scheme} is not a valid URI scheme for {$service} in {$region}");
129
- }
130
-
131
- return $scheme . '://' . $regions[$region]['hostname'];
132
- }
133
-
134
- public function getCredentials()
135
- {
136
- return $this->credentials;
137
- }
138
-
139
- public function setCredentials(CredentialsInterface $credentials)
140
- {
141
- $formerCredentials = $this->credentials;
142
- $this->credentials = $credentials;
143
-
144
- // Dispatch an event that the credentials have been changed
145
- $this->dispatch('client.credentials_changed', array(
146
- 'credentials' => $credentials,
147
- 'former_credentials' => $formerCredentials,
148
- ));
149
-
150
- return $this;
151
- }
152
-
153
- public function getSignature()
154
- {
155
- return $this->signature;
156
- }
157
-
158
- public function getRegions()
159
- {
160
- return $this->serviceDescription->getData('regions');
161
- }
162
-
163
- public function getRegion()
164
- {
165
- return $this->getConfig(Options::REGION);
166
- }
167
-
168
- public function setRegion($region)
169
- {
170
- $config = $this->getConfig();
171
- $formerRegion = $config->get(Options::REGION);
172
- $global = $this->serviceDescription->getData('globalEndpoint');
173
- $provider = $config->get('endpoint_provider');
174
-
175
- if (!$provider) {
176
- throw new \RuntimeException('No endpoint provider configured');
177
- }
178
-
179
- // Only change the region if the service does not have a global endpoint
180
- if (!$global || $this->serviceDescription->getData('namespace') === 'S3') {
181
-
182
- $endpoint = call_user_func(
183
- $provider,
184
- array(
185
- 'scheme' => $config->get(Options::SCHEME),
186
- 'region' => $region,
187
- 'service' => $config->get(Options::SERVICE)
188
- )
189
- );
190
-
191
- $this->setBaseUrl($endpoint['endpoint']);
192
- $config->set(Options::BASE_URL, $endpoint['endpoint']);
193
- $config->set(Options::REGION, $region);
194
-
195
- // Update the signature if necessary
196
- $signature = $this->getSignature();
197
- if ($signature instanceof EndpointSignatureInterface) {
198
- /** @var $signature EndpointSignatureInterface */
199
- $signature->setRegionName($region);
200
- }
201
-
202
- // Dispatch an event that the region has been changed
203
- $this->dispatch('client.region_changed', array(
204
- 'region' => $region,
205
- 'former_region' => $formerRegion,
206
- ));
207
- }
208
-
209
- return $this;
210
- }
211
-
212
- public function waitUntil($waiter, array $input = array())
213
- {
214
- $this->getWaiter($waiter, $input)->wait();
215
-
216
- return $this;
217
- }
218
-
219
- public function getWaiter($waiter, array $input = array())
220
- {
221
- return $this->getWaiterFactory()->build($waiter)
222
- ->setClient($this)
223
- ->setConfig($input);
224
- }
225
-
226
- public function setWaiterFactory(WaiterFactoryInterface $waiterFactory)
227
- {
228
- $this->waiterFactory = $waiterFactory;
229
-
230
- return $this;
231
- }
232
-
233
- public function getWaiterFactory()
234
- {
235
- if (!$this->waiterFactory) {
236
- $clientClass = get_class($this);
237
- // Use a composite factory that checks for classes first, then config waiters
238
- $this->waiterFactory = new CompositeWaiterFactory(array(
239
- new WaiterClassFactory(substr($clientClass, 0, strrpos($clientClass, '\\')) . '\\Waiter')
240
- ));
241
- if ($this->getDescription()) {
242
- $waiterConfig = $this->getDescription()->getData('waiters') ?: array();
243
- $this->waiterFactory->addFactory(new WaiterConfigFactory($waiterConfig));
244
- }
245
- }
246
-
247
- return $this->waiterFactory;
248
- }
249
-
250
- public function getApiVersion()
251
- {
252
- return $this->serviceDescription->getApiVersion();
253
- }
254
-
255
- /**
256
- * {@inheritdoc}
257
- * @throws \Aws\Common\Exception\TransferException
258
- */
259
- public function send($requests)
260
- {
261
- try {
262
- return parent::send($requests);
263
- } catch (CurlException $e) {
264
- $wrapped = new TransferException($e->getMessage(), null, $e);
265
- $wrapped->setCurlHandle($e->getCurlHandle())
266
- ->setCurlInfo($e->getCurlInfo())
267
- ->setError($e->getError(), $e->getErrorNo())
268
- ->setRequest($e->getRequest());
269
- throw $wrapped;
270
- }
271
- }
272
- }
1
+ <?php
2
+ /**
3
+ * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ namespace Aws\Common\Client;
18
+
19
+ use Aws\Common\Aws;
20
+ use Aws\Common\Credentials\CredentialsInterface;
21
+ use Aws\Common\Credentials\NullCredentials;
22
+ use Aws\Common\Enum\ClientOptions as Options;
23
+ use Aws\Common\Exception\InvalidArgumentException;
24
+ use Aws\Common\Exception\TransferException;
25
+ use Aws\Common\Signature\EndpointSignatureInterface;
26
+ use Aws\Common\Signature\SignatureInterface;
27
+ use Aws\Common\Signature\SignatureListener;
28
+ use Aws\Common\Waiter\WaiterClassFactory;
29
+ use Aws\Common\Waiter\CompositeWaiterFactory;
30
+ use Aws\Common\Waiter\WaiterFactoryInterface;
31
+ use Aws\Common\Waiter\WaiterConfigFactory;
32
+ use Guzzle\Common\Collection;
33
+ use Guzzle\Http\Exception\CurlException;
34
+ use Guzzle\Service\Client;
35
+ use Guzzle\Service\Description\ServiceDescriptionInterface;
36
+
37
+ /**
38
+ * Abstract AWS client
39
+ */
40
+ abstract class AbstractClient extends Client implements AwsClientInterface
41
+ {
42
+ /**
43
+ * @var CredentialsInterface AWS credentials
44
+ */
45
+ protected $credentials;
46
+
47
+ /**
48
+ * @var SignatureInterface Signature implementation of the service
49
+ */
50
+ protected $signature;
51
+
52
+ /**
53
+ * @var WaiterFactoryInterface Factory used to create waiter classes
54
+ */
55
+ protected $waiterFactory;
56
+
57
+ /**
58
+ * {@inheritdoc}
59
+ */
60
+ public static function getAllEvents()
61
+ {
62
+ return array_merge(Client::getAllEvents(), array(
63
+ 'client.region_changed',
64
+ 'client.credentials_changed',
65
+ ));
66
+ }
67
+
68
+ /**
69
+ * @param CredentialsInterface $credentials AWS credentials
70
+ * @param SignatureInterface $signature Signature implementation
71
+ * @param Collection $config Configuration options
72
+ *
73
+ * @throws InvalidArgumentException if an endpoint provider isn't provided
74
+ */
75
+ public function __construct(CredentialsInterface $credentials, SignatureInterface $signature, Collection $config)
76
+ {
77
+ // Bootstrap with Guzzle
78
+ parent::__construct($config->get(Options::BASE_URL), $config);
79
+ $this->credentials = $credentials;
80
+ $this->signature = $signature;
81
+
82
+ // Make sure the user agent is prefixed by the SDK version
83
+ $this->setUserAgent('aws-sdk-php2/' . Aws::VERSION, true);
84
+
85
+ // Add the event listener so that requests are signed before they are sent
86
+ $dispatcher = $this->getEventDispatcher();
87
+ if (!$credentials instanceof NullCredentials) {
88
+ $dispatcher->addSubscriber(new SignatureListener($credentials, $signature));
89
+ }
90
+
91
+ if ($backoff = $config->get(Options::BACKOFF)) {
92
+ $dispatcher->addSubscriber($backoff, -255);
93
+ }
94
+ }
95
+
96
+ public function __call($method, $args)
97
+ {
98
+ if (substr($method, 0, 3) === 'get' && substr($method, -8) === 'Iterator') {
99
+ // Allow magic method calls for iterators (e.g. $client->get<CommandName>Iterator($params))
100
+ $commandOptions = isset($args[0]) ? $args[0] : null;
101
+ $iteratorOptions = isset($args[1]) ? $args[1] : array();
102
+ return $this->getIterator(substr($method, 3, -8), $commandOptions, $iteratorOptions);
103
+ } elseif (substr($method, 0, 9) == 'waitUntil') {
104
+ // Allow magic method calls for waiters (e.g. $client->waitUntil<WaiterName>($params))
105
+ return $this->waitUntil(substr($method, 9), isset($args[0]) ? $args[0]: array());
106
+ } else {
107
+ return parent::__call(ucfirst($method), $args);
108
+ }
109
+ }
110
+
111
+ /**
112
+ * Get an endpoint for a specific region from a service description
113
+ * @deprecated This function will no longer be updated to work with new regions.
114
+ */
115
+ public static function getEndpoint(ServiceDescriptionInterface $description, $region, $scheme)
116
+ {
117
+ $service = $description->getData('serviceFullName');
118
+ // Lookup the region in the service description
119
+ if (!($regions = $description->getData('regions'))) {
120
+ throw new InvalidArgumentException("No regions found in the {$service} description");
121
+ }
122
+ // Ensure that the region exists for the service
123
+ if (!isset($regions[$region])) {
124
+ throw new InvalidArgumentException("{$region} is not a valid region for {$service}");
125
+ }
126
+ // Ensure that the scheme is valid
127
+ if ($regions[$region][$scheme] == false) {
128
+ throw new InvalidArgumentException("{$scheme} is not a valid URI scheme for {$service} in {$region}");
129
+ }
130
+
131
+ return $scheme . '://' . $regions[$region]['hostname'];
132
+ }
133
+
134
+ public function getCredentials()
135
+ {
136
+ return $this->credentials;
137
+ }
138
+
139
+ public function setCredentials(CredentialsInterface $credentials)
140
+ {
141
+ $formerCredentials = $this->credentials;
142
+ $this->credentials = $credentials;
143
+
144
+ // Dispatch an event that the credentials have been changed
145
+ $this->dispatch('client.credentials_changed', array(
146
+ 'credentials' => $credentials,
147
+ 'former_credentials' => $formerCredentials,
148
+ ));
149
+
150
+ return $this;
151
+ }
152
+
153
+ public function getSignature()
154
+ {
155
+ return $this->signature;
156
+ }
157
+
158
+ public function getRegions()
159
+ {
160
+ return $this->serviceDescription->getData('regions');
161
+ }
162
+
163
+ public function getRegion()
164
+ {
165
+ return $this->getConfig(Options::REGION);
166
+ }
167
+
168
+ public function setRegion($region)
169
+ {
170
+ $config = $this->getConfig();
171
+ $formerRegion = $config->get(Options::REGION);
172
+ $global = $this->serviceDescription->getData('globalEndpoint');
173
+ $provider = $config->get('endpoint_provider');
174
+
175
+ if (!$provider) {
176
+ throw new \RuntimeException('No endpoint provider configured');
177
+ }
178
+
179
+ // Only change the region if the service does not have a global endpoint
180
+ if (!$global || $this->serviceDescription->getData('namespace') === 'S3') {
181
+
182
+ $endpoint = call_user_func(
183
+ $provider,
184
+ array(
185
+ 'scheme' => $config->get(Options::SCHEME),
186
+ 'region' => $region,
187
+ 'service' => $config->get(Options::SERVICE)
188
+ )
189
+ );
190
+
191
+ $this->setBaseUrl($endpoint['endpoint']);
192
+ $config->set(Options::BASE_URL, $endpoint['endpoint']);
193
+ $config->set(Options::REGION, $region);
194
+
195
+ // Update the signature if necessary
196
+ $signature = $this->getSignature();
197
+ if ($signature instanceof EndpointSignatureInterface) {
198
+ /** @var $signature EndpointSignatureInterface */
199
+ $signature->setRegionName($region);
200
+ }
201
+
202
+ // Dispatch an event that the region has been changed
203
+ $this->dispatch('client.region_changed', array(
204
+ 'region' => $region,
205
+ 'former_region' => $formerRegion,
206
+ ));
207
+ }
208
+
209
+ return $this;
210
+ }
211
+
212
+ public function waitUntil($waiter, array $input = array())
213
+ {
214
+ $this->getWaiter($waiter, $input)->wait();
215
+
216
+ return $this;
217
+ }
218
+
219
+ public function getWaiter($waiter, array $input = array())
220
+ {
221
+ return $this->getWaiterFactory()->build($waiter)
222
+ ->setClient($this)
223
+ ->setConfig($input);
224
+ }
225
+
226
+ public function setWaiterFactory(WaiterFactoryInterface $waiterFactory)
227
+ {
228
+ $this->waiterFactory = $waiterFactory;
229
+
230
+ return $this;
231
+ }
232
+
233
+ public function getWaiterFactory()
234
+ {
235
+ if (!$this->waiterFactory) {
236
+ $clientClass = get_class($this);
237
+ // Use a composite factory that checks for classes first, then config waiters
238
+ $this->waiterFactory = new CompositeWaiterFactory(array(
239
+ new WaiterClassFactory(substr($clientClass, 0, strrpos($clientClass, '\\')) . '\\Waiter')
240
+ ));
241
+ if ($this->getDescription()) {
242
+ $waiterConfig = $this->getDescription()->getData('waiters') ?: array();
243
+ $this->waiterFactory->addFactory(new WaiterConfigFactory($waiterConfig));
244
+ }
245
+ }
246
+
247
+ return $this->waiterFactory;
248
+ }
249
+
250
+ public function getApiVersion()
251
+ {
252
+ return $this->serviceDescription->getApiVersion();
253
+ }
254
+
255
+ /**
256
+ * {@inheritdoc}
257
+ * @throws \Aws\Common\Exception\TransferException
258
+ */
259
+ public function send($requests)
260
+ {
261
+ try {
262
+ return parent::send($requests);
263
+ } catch (CurlException $e) {
264
+ $wrapped = new TransferException($e->getMessage(), null, $e);
265
+ $wrapped->setCurlHandle($e->getCurlHandle())
266
+ ->setCurlInfo($e->getCurlInfo())
267
+ ->setError($e->getError(), $e->getErrorNo())
268
+ ->setRequest($e->getRequest());
269
+ throw $wrapped;
270
+ }
271
+ }
272
+ }
vendor/Aws/Common/Client/ClientBuilder.php CHANGED
@@ -1,467 +1,467 @@
1
- <?php
2
- /**
3
- * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- namespace Aws\Common\Client;
18
-
19
- use Aws\Common\Credentials\Credentials;
20
- use Aws\Common\Credentials\CredentialsInterface;
21
- use Aws\Common\Credentials\NullCredentials;
22
- use Aws\Common\Enum\ClientOptions as Options;
23
- use Aws\Common\Exception\ExceptionListener;
24
- use Aws\Common\Exception\InvalidArgumentException;
25
- use Aws\Common\Exception\NamespaceExceptionFactory;
26
- use Aws\Common\Exception\Parser\DefaultXmlExceptionParser;
27
- use Aws\Common\Exception\Parser\ExceptionParserInterface;
28
- use Aws\Common\Iterator\AwsResourceIteratorFactory;
29
- use Aws\Common\RulesEndpointProvider;
30
- use Aws\Common\Signature\EndpointSignatureInterface;
31
- use Aws\Common\Signature\SignatureInterface;
32
- use Aws\Common\Signature\SignatureV2;
33
- use Aws\Common\Signature\SignatureV3Https;
34
- use Aws\Common\Signature\SignatureV4;
35
- use Guzzle\Common\Collection;
36
- use Guzzle\Plugin\Backoff\BackoffPlugin;
37
- use Guzzle\Plugin\Backoff\CurlBackoffStrategy;
38
- use Guzzle\Plugin\Backoff\ExponentialBackoffStrategy;
39
- use Guzzle\Plugin\Backoff\HttpBackoffStrategy;
40
- use Guzzle\Plugin\Backoff\TruncatedBackoffStrategy;
41
- use Guzzle\Service\Description\ServiceDescription;
42
- use Guzzle\Service\Resource\ResourceIteratorClassFactory;
43
- use Guzzle\Log\LogAdapterInterface;
44
- use Guzzle\Log\ClosureLogAdapter;
45
- use Guzzle\Plugin\Backoff\BackoffLogger;
46
-
47
- /**
48
- * Builder for creating AWS service clients
49
- */
50
- class ClientBuilder
51
- {
52
- /**
53
- * @var array Default client config
54
- */
55
- protected static $commonConfigDefaults = array('scheme' => 'https');
56
-
57
- /**
58
- * @var array Default client requirements
59
- */
60
- protected static $commonConfigRequirements = array(Options::SERVICE_DESCRIPTION);
61
-
62
- /**
63
- * @var string The namespace of the client
64
- */
65
- protected $clientNamespace;
66
-
67
- /**
68
- * @var array The config options
69
- */
70
- protected $config = array();
71
-
72
- /**
73
- * @var array The config defaults
74
- */
75
- protected $configDefaults = array();
76
-
77
- /**
78
- * @var array The config requirements
79
- */
80
- protected $configRequirements = array();
81
-
82
- /**
83
- * @var ExceptionParserInterface The Parser interface for the client
84
- */
85
- protected $exceptionParser;
86
-
87
- /**
88
- * @var array Array of configuration data for iterators available for the client
89
- */
90
- protected $iteratorsConfig = array();
91
-
92
- /**
93
- * Factory method for creating the client builder
94
- *
95
- * @param string $namespace The namespace of the client
96
- *
97
- * @return ClientBuilder
98
- */
99
- public static function factory($namespace = null)
100
- {
101
- return new static($namespace);
102
- }
103
-
104
- /**
105
- * Constructs a client builder
106
- *
107
- * @param string $namespace The namespace of the client
108
- */
109
- public function __construct($namespace = null)
110
- {
111
- $this->clientNamespace = $namespace;
112
- }
113
-
114
- /**
115
- * Sets the config options
116
- *
117
- * @param array|Collection $config The config options
118
- *
119
- * @return ClientBuilder
120
- */
121
- public function setConfig($config)
122
- {
123
- $this->config = $this->processArray($config);
124
-
125
- return $this;
126
- }
127
-
128
- /**
129
- * Sets the config options' defaults
130
- *
131
- * @param array|Collection $defaults The default values
132
- *
133
- * @return ClientBuilder
134
- */
135
- public function setConfigDefaults($defaults)
136
- {
137
- $this->configDefaults = $this->processArray($defaults);
138
-
139
- return $this;
140
- }
141
-
142
- /**
143
- * Sets the required config options
144
- *
145
- * @param array|Collection $required The required config options
146
- *
147
- * @return ClientBuilder
148
- */
149
- public function setConfigRequirements($required)
150
- {
151
- $this->configRequirements = $this->processArray($required);
152
-
153
- return $this;
154
- }
155
-
156
- /**
157
- * Sets the exception parser. If one is not provided the builder will use
158
- * the default XML exception parser.
159
- *
160
- * @param ExceptionParserInterface $parser The exception parser
161
- *
162
- * @return ClientBuilder
163
- */
164
- public function setExceptionParser(ExceptionParserInterface $parser)
165
- {
166
- $this->exceptionParser = $parser;
167
-
168
- return $this;
169
- }
170
-
171
- /**
172
- * Set the configuration for the client's iterators
173
- *
174
- * @param array $config Configuration data for client's iterators
175
- *
176
- * @return ClientBuilder
177
- */
178
- public function setIteratorsConfig(array $config)
179
- {
180
- $this->iteratorsConfig = $config;
181
-
182
- return $this;
183
- }
184
-
185
- /**
186
- * Performs the building logic using all of the parameters that have been
187
- * set and falling back to default values. Returns an instantiate service
188
- * client with credentials prepared and plugins attached.
189
- *
190
- * @return AwsClientInterface
191
- * @throws InvalidArgumentException
192
- */
193
- public function build()
194
- {
195
- // Resolve configuration
196
- $config = Collection::fromConfig(
197
- $this->config,
198
- array_merge(self::$commonConfigDefaults, $this->configDefaults),
199
- (self::$commonConfigRequirements + $this->configRequirements)
200
- );
201
-
202
- if (!isset($config['endpoint_provider'])) {
203
- $config['endpoint_provider'] = RulesEndpointProvider::fromDefaults();
204
- }
205
-
206
- // Resolve the endpoint, signature, and credentials
207
- $description = $this->updateConfigFromDescription($config);
208
- $signature = $this->getSignature($description, $config);
209
- $credentials = $this->getCredentials($config);
210
-
211
- // Resolve exception parser
212
- if (!$this->exceptionParser) {
213
- $this->exceptionParser = new DefaultXmlExceptionParser();
214
- }
215
-
216
- // Resolve backoff strategy
217
- $backoff = $config->get(Options::BACKOFF);
218
- if ($backoff === null) {
219
- $backoff = new BackoffPlugin(
220
- // Retry failed requests up to 3 times if it is determined that the request can be retried
221
- new TruncatedBackoffStrategy(3,
222
- // Retry failed requests with 400-level responses due to throttling
223
- new ThrottlingErrorChecker($this->exceptionParser,
224
- // Retry failed requests due to transient network or cURL problems
225
- new CurlBackoffStrategy(null,
226
- // Retry failed requests with 500-level responses
227
- new HttpBackoffStrategy(array(500, 503, 509),
228
- // Retry requests that failed due to expired credentials
229
- new ExpiredCredentialsChecker($this->exceptionParser,
230
- new ExponentialBackoffStrategy()
231
- )
232
- )
233
- )
234
- )
235
- )
236
- );
237
- $config->set(Options::BACKOFF, $backoff);
238
- }
239
-
240
- if ($backoff) {
241
- $this->addBackoffLogger($backoff, $config);
242
- }
243
-
244
- // Determine service and class name
245
- $clientClass = 'Aws\Common\Client\DefaultClient';
246
- if ($this->clientNamespace) {
247
- $serviceName = substr($this->clientNamespace, strrpos($this->clientNamespace, '\\') + 1);
248
- $clientClass = $this->clientNamespace . '\\' . $serviceName . 'Client';
249
- }
250
-
251
- /** @var $client AwsClientInterface */
252
- $client = new $clientClass($credentials, $signature, $config);
253
- $client->setDescription($description);
254
-
255
- // Add exception marshaling so that more descriptive exception are thrown
256
- if ($this->clientNamespace) {
257
- $exceptionFactory = new NamespaceExceptionFactory(
258
- $this->exceptionParser,
259
- "{$this->clientNamespace}\\Exception",
260
- "{$this->clientNamespace}\\Exception\\{$serviceName}Exception"
261
- );
262
- $client->addSubscriber(new ExceptionListener($exceptionFactory));
263
- }
264
-
265
- // Add the UserAgentPlugin to append to the User-Agent header of requests
266
- $client->addSubscriber(new UserAgentListener());
267
-
268
- // Filters used for the cache plugin
269
- $client->getConfig()->set(
270
- 'params.cache.key_filter',
271
- 'header=date,x-amz-date,x-amz-security-token,x-amzn-authorization'
272
- );
273
-
274
- // Set the iterator resource factory based on the provided iterators config
275
- $client->setResourceIteratorFactory(new AwsResourceIteratorFactory(
276
- $this->iteratorsConfig,
277
- new ResourceIteratorClassFactory($this->clientNamespace . '\\Iterator')
278
- ));
279
-
280
- // Disable parameter validation if needed
281
- if ($config->get(Options::VALIDATION) === false) {
282
- $params = $config->get('command.params') ?: array();
283
- $params['command.disable_validation'] = true;
284
- $config->set('command.params', $params);
285
- }
286
-
287
- return $client;
288
- }
289
-
290
- /**
291
- * Add backoff logging to the backoff plugin if needed
292
- *
293
- * @param BackoffPlugin $plugin Backoff plugin
294
- * @param Collection $config Configuration settings
295
- *
296
- * @throws InvalidArgumentException
297
- */
298
- protected function addBackoffLogger(BackoffPlugin $plugin, Collection $config)
299
- {
300
- // The log option can be set to `debug` or an instance of a LogAdapterInterface
301
- if ($logger = $config->get(Options::BACKOFF_LOGGER)) {
302
- $format = $config->get(Options::BACKOFF_LOGGER_TEMPLATE);
303
- if ($logger === 'debug') {
304
- $logger = new ClosureLogAdapter(function ($message) {
305
- trigger_error($message . "\n");
306
- });
307
- } elseif (!($logger instanceof LogAdapterInterface)) {
308
- throw new InvalidArgumentException(
309
- Options::BACKOFF_LOGGER . ' must be set to `debug` or an instance of '
310
- . 'Guzzle\\Common\\Log\\LogAdapterInterface'
311
- );
312
- }
313
- // Create the plugin responsible for logging exponential backoff retries
314
- $logPlugin = new BackoffLogger($logger);
315
- // You can specify a custom format or use the default
316
- if ($format) {
317
- $logPlugin->setTemplate($format);
318
- }
319
- $plugin->addSubscriber($logPlugin);
320
- }
321
- }
322
-
323
- /**
324
- * Ensures that an array (e.g. for config data) is actually in array form
325
- *
326
- * @param array|Collection $array The array data
327
- *
328
- * @return array
329
- * @throws InvalidArgumentException if the arg is not an array or Collection
330
- */
331
- protected function processArray($array)
332
- {
333
- if ($array instanceof Collection) {
334
- $array = $array->getAll();
335
- }
336
-
337
- if (!is_array($array)) {
338
- throw new InvalidArgumentException('The config must be provided as an array or Collection.');
339
- }
340
-
341
- return $array;
342
- }
343
-
344
- /**
345
- * Update a configuration object from a service description
346
- *
347
- * @param Collection $config Config to update
348
- *
349
- * @return ServiceDescription
350
- * @throws InvalidArgumentException
351
- */
352
- protected function updateConfigFromDescription(Collection $config)
353
- {
354
- $description = $config->get(Options::SERVICE_DESCRIPTION);
355
- if (!($description instanceof ServiceDescription)) {
356
- // Inject the version into the sprintf template if it is a string
357
- if (is_string($description)) {
358
- $description = sprintf($description, $config->get(Options::VERSION));
359
- }
360
- $description = ServiceDescription::factory($description);
361
- $config->set(Options::SERVICE_DESCRIPTION, $description);
362
- }
363
-
364
- if (!$config->get(Options::SERVICE)) {
365
- $config->set(Options::SERVICE, $description->getData('endpointPrefix'));
366
- }
367
-
368
- if ($iterators = $description->getData('iterators')) {
369
- $this->setIteratorsConfig($iterators);
370
- }
371
-
372
- // Make sure a valid region is set
373
- $region = $config->get(Options::REGION);
374
- $global = $description->getData('globalEndpoint');
375
-
376
- if (!$global && !$region) {
377
- throw new InvalidArgumentException(
378
- 'A region is required when using ' . $description->getData('serviceFullName')
379
- );
380
- } elseif ($global && (!$region || $description->getData('namespace') !== 'S3')) {
381
- $region = 'us-east-1';
382
- $config->set(Options::REGION, 'us-east-1');
383
- }
384
-
385
- if (!$config->get(Options::BASE_URL)) {
386
- $endpoint = call_user_func(
387
- $config->get('endpoint_provider'),
388
- array(
389
- 'scheme' => $config->get(Options::SCHEME),
390
- 'region' => $region,
391
- 'service' => $config->get(Options::SERVICE)
392
- )
393
- );
394
- $config->set(Options::BASE_URL, $endpoint['endpoint']);
395
-
396
- // Set a signature if one was not explicitly provided.
397
- if (!$config->hasKey(Options::SIGNATURE)
398
- && isset($endpoint['signatureVersion'])
399
- ) {
400
- $config->set(Options::SIGNATURE, $endpoint['signatureVersion']);
401
- }
402
- }
403
-
404
- return $description;
405
- }
406
-
407
- /**
408
- * Return an appropriate signature object for a a client based on the
409
- * "signature" configuration setting, or the default signature specified in
410
- * a service description. The signature can be set to a valid signature
411
- * version identifier string or an instance of Aws\Common\Signature\SignatureInterface.
412
- *
413
- * @param ServiceDescription $description Description that holds a signature option
414
- * @param Collection $config Configuration options
415
- *
416
- * @return SignatureInterface
417
- * @throws InvalidArgumentException
418
- */
419
- protected function getSignature(ServiceDescription $description, Collection $config)
420
- {
421
- // If a custom signature has not been provided, then use the default
422
- // signature setting specified in the service description.
423
- $signature = $config->get(Options::SIGNATURE) ?: $description->getData('signatureVersion');
424
-
425
- if (is_string($signature)) {
426
- if ($signature == 'v4') {
427
- $signature = new SignatureV4();
428
- } elseif ($signature == 'v2') {
429
- $signature = new SignatureV2();
430
- } elseif ($signature == 'v3https') {
431
- $signature = new SignatureV3Https();
432
- } else {
433
- throw new InvalidArgumentException("Invalid signature type: {$signature}");
434
- }
435
- } elseif (!($signature instanceof SignatureInterface)) {
436
- throw new InvalidArgumentException('The provided signature is not '
437
- . 'a signature version string or an instance of '
438
- . 'Aws\\Common\\Signature\\SignatureInterface');
439
- }
440
-
441
- // Allow a custom service name or region value to be provided
442
- if ($signature instanceof EndpointSignatureInterface) {
443
-
444
- // Determine the service name to use when signing
445
- $signature->setServiceName($config->get(Options::SIGNATURE_SERVICE)
446
- ?: $description->getData('signingName')
447
- ?: $description->getData('endpointPrefix'));
448
-
449
- // Determine the region to use when signing requests
450
- $signature->setRegionName($config->get(Options::SIGNATURE_REGION) ?: $config->get(Options::REGION));
451
- }
452
-
453
- return $signature;
454
- }
455
-
456
- protected function getCredentials(Collection $config)
457
- {
458
- $credentials = $config->get(Options::CREDENTIALS);
459
- if ($credentials === false) {
460
- $credentials = new NullCredentials();
461
- } elseif (!$credentials instanceof CredentialsInterface) {
462
- $credentials = Credentials::factory($config);
463
- }
464
-
465
- return $credentials;
466
- }
467
- }
1
+ <?php
2
+ /**
3
+ * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ namespace Aws\Common\Client;
18
+
19
+ use Aws\Common\Credentials\Credentials;
20
+ use Aws\Common\Credentials\CredentialsInterface;
21
+ use Aws\Common\Credentials\NullCredentials;
22
+ use Aws\Common\Enum\ClientOptions as Options;
23
+ use Aws\Common\Exception\ExceptionListener;
24
+ use Aws\Common\Exception\InvalidArgumentException;
25
+ use Aws\Common\Exception\NamespaceExceptionFactory;
26
+ use Aws\Common\Exception\Parser\DefaultXmlExceptionParser;
27
+ use Aws\Common\Exception\Parser\ExceptionParserInterface;
28
+ use Aws\Common\Iterator\AwsResourceIteratorFactory;
29
+ use Aws\Common\RulesEndpointProvider;
30
+ use Aws\Common\Signature\EndpointSignatureInterface;
31
+ use Aws\Common\Signature\SignatureInterface;
32
+ use Aws\Common\Signature\SignatureV2;
33
+ use Aws\Common\Signature\SignatureV3Https;
34
+ use Aws\Common\Signature\SignatureV4;
35
+ use Guzzle\Common\Collection;
36
+ use Guzzle\Plugin\Backoff\BackoffPlugin;
37
+ use Guzzle\Plugin\Backoff\CurlBackoffStrategy;
38
+ use Guzzle\Plugin\Backoff\ExponentialBackoffStrategy;
39
+ use Guzzle\Plugin\Backoff\HttpBackoffStrategy;
40
+ use Guzzle\Plugin\Backoff\TruncatedBackoffStrategy;
41
+ use Guzzle\Service\Description\ServiceDescription;
42
+ use Guzzle\Service\Resource\ResourceIteratorClassFactory;
43
+ use Guzzle\Log\LogAdapterInterface;
44
+ use Guzzle\Log\ClosureLogAdapter;
45
+ use Guzzle\Plugin\Backoff\BackoffLogger;
46
+
47
+ /**
48
+ * Builder for creating AWS service clients
49
+ */
50
+ class ClientBuilder
51
+ {
52
+ /**
53
+ * @var array Default client config
54
+ */
55
+ protected static $commonConfigDefaults = array('scheme' => 'https');
56
+
57
+ /**
58
+ * @var array Default client requirements
59
+ */
60
+ protected static $commonConfigRequirements = array(Options::SERVICE_DESCRIPTION);
61
+
62
+ /**
63
+ * @var string The namespace of the client
64
+ */
65
+ protected $clientNamespace;
66
+
67
+ /**
68
+ * @var array The config options
69
+ */
70
+ protected $config = array();
71
+
72
+ /**
73
+ * @var array The config defaults
74
+ */
75
+ protected $configDefaults = array();
76
+
77
+ /**
78
+ * @var array The config requirements
79
+ */
80
+ protected $configRequirements = array();
81
+
82
+ /**
83
+ * @var ExceptionParserInterface The Parser interface for the client
84
+ */
85
+ protected $exceptionParser;
86
+
87
+ /**
88
+ * @var array Array of configuration data for iterators available for the client
89
+ */
90
+ protected $iteratorsConfig = array();
91
+
92
+ /**
93
+ * Factory method for creating the client builder
94
+ *
95
+ * @param string $namespace The namespace of the client
96
+ *
97
+ * @return ClientBuilder
98
+ */
99
+ public static function factory($namespace = null)
100
+ {
101
+ return new static($namespace);
102
+ }
103
+
104
+ /**
105
+ * Constructs a client builder
106
+ *
107
+ * @param string $namespace The namespace of the client
108
+ */
109
+ public function __construct($namespace = null)
110
+ {
111
+ $this->clientNamespace = $namespace;
112
+ }
113
+
114
+ /**
115
+ * Sets the config options
116
+ *
117
+ * @param array|Collection $config The config options
118
+ *
119
+ * @return ClientBuilder
120
+ */
121
+ public function setConfig($config)
122
+ {
123
+ $this->config = $this->processArray($config);
124
+
125
+ return $this;
126
+ }
127
+
128
+ /**
129
+ * Sets the config options' defaults
130
+ *
131
+ * @param array|Collection $defaults The default values
132
+ *
133
+ * @return ClientBuilder
134
+ */
135
+ public function setConfigDefaults($defaults)
136
+ {
137
+ $this->configDefaults = $this->processArray($defaults);
138
+
139
+ return $this;
140
+ }
141
+
142
+ /**
143
+ * Sets the required config options
144
+ *
145
+ * @param array|Collection $required The required config options
146
+ *
147
+ * @return ClientBuilder
148
+ */
149
+ public function setConfigRequirements($required)
150
+ {
151
+ $this->configRequirements = $this->processArray($required);
152
+
153
+ return $this;
154
+ }
155
+
156
+ /**
157
+ * Sets the exception parser. If one is not provided the builder will use
158
+ * the default XML exception parser.
159
+ *
160
+ * @param ExceptionParserInterface $parser The exception parser
161
+ *
162
+ * @return ClientBuilder
163
+ */
164
+ public function setExceptionParser(ExceptionParserInterface $parser)
165
+ {
166
+ $this->exceptionParser = $parser;
167
+
168
+ return $this;
169
+ }
170
+
171
+ /**
172
+ * Set the configuration for the client's iterators
173
+ *
174
+ * @param array $config Configuration data for client's iterators
175
+ *
176
+ * @return ClientBuilder
177
+ */
178
+ public function setIteratorsConfig(array $config)
179
+ {
180
+ $this->iteratorsConfig = $config;
181
+
182
+ return $this;
183
+ }
184
+
185
+ /**
186
+ * Performs the building logic using all of the parameters that have been
187
+ * set and falling back to default values. Returns an instantiate service
188
+ * client with credentials prepared and plugins attached.
189
+ *
190
+ * @return AwsClientInterface
191
+ * @throws InvalidArgumentException
192
+ */
193
+ public function build()
194
+ {
195
+ // Resolve configuration
196
+ $config = Collection::fromConfig(
197
+ $this->config,
198
+ array_merge(self::$commonConfigDefaults, $this->configDefaults),
199
+ (self::$commonConfigRequirements + $this->configRequirements)
200
+ );
201
+
202
+ if (!isset($config['endpoint_provider'])) {
203
+ $config['endpoint_provider'] = RulesEndpointProvider::fromDefaults();
204
+ }
205
+
206
+ // Resolve the endpoint, signature, and credentials
207
+ $description = $this->updateConfigFromDescription($config);
208
+ $signature = $this->getSignature($description, $config);
209
+ $credentials = $this->getCredentials($config);
210
+
211
+ // Resolve exception parser
212
+ if (!$this->exceptionParser) {
213
+ $this->exceptionParser = new DefaultXmlExceptionParser();
214
+ }
215
+
216
+ // Resolve backoff strategy
217
+ $backoff = $config->get(Options::BACKOFF);
218
+ if ($backoff === null) {
219
+ $backoff = new BackoffPlugin(
220
+ // Retry failed requests up to 3 times if it is determined that the request can be retried
221
+ new TruncatedBackoffStrategy(3,
222
+ // Retry failed requests with 400-level responses due to throttling
223
+ new ThrottlingErrorChecker($this->exceptionParser,
224
+ // Retry failed requests due to transient network or cURL problems
225
+ new CurlBackoffStrategy(null,
226
+ // Retry failed requests with 500-level responses
227
+ new HttpBackoffStrategy(array(500, 503, 509),
228
+ // Retry requests that failed due to expired credentials
229
+ new ExpiredCredentialsChecker($this->exceptionParser,
230
+ new ExponentialBackoffStrategy()
231
+ )
232
+ )
233
+ )
234
+ )
235
+ )
236
+ );
237
+ $config->set(Options::BACKOFF, $backoff);
238
+ }
239
+
240
+ if ($backoff) {
241
+ $this->addBackoffLogger($backoff, $config);
242
+ }
243
+
244
+ // Determine service and class name
245
+ $clientClass = 'Aws\Common\Client\DefaultClient';
246
+ if ($this->clientNamespace) {
247
+ $serviceName = substr($this->clientNamespace, strrpos($this->clientNamespace, '\\') + 1);
248
+ $clientClass = $this->clientNamespace . '\\' . $serviceName . 'Client';
249
+ }
250
+
251
+ /** @var $client AwsClientInterface */
252
+ $client = new $clientClass($credentials, $signature, $config);
253
+ $client->setDescription($description);
254
+
255
+ // Add exception marshaling so that more descriptive exception are thrown
256
+ if ($this->clientNamespace) {
257
+ $exceptionFactory = new NamespaceExceptionFactory(
258
+ $this->exceptionParser,
259
+ "{$this->clientNamespace}\\Exception",
260
+ "{$this->clientNamespace}\\Exception\\{$serviceName}Exception"
261
+ );
262
+ $client->addSubscriber(new ExceptionListener($exceptionFactory));
263
+ }
264
+
265
+ // Add the UserAgentPlugin to append to the User-Agent header of requests
266
+ $client->addSubscriber(new UserAgentListener());
267
+
268
+ // Filters used for the cache plugin
269
+ $client->getConfig()->set(
270
+ 'params.cache.key_filter',
271
+ 'header=date,x-amz-date,x-amz-security-token,x-amzn-authorization'
272
+ );
273
+
274
+ // Set the iterator resource factory based on the provided iterators config
275
+ $client->setResourceIteratorFactory(new AwsResourceIteratorFactory(
276
+ $this->iteratorsConfig,
277
+ new ResourceIteratorClassFactory($this->clientNamespace . '\\Iterator')
278
+ ));
279
+
280
+ // Disable parameter validation if needed
281
+ if ($config->get(Options::VALIDATION) === false) {
282
+ $params = $config->get('command.params') ?: array();
283
+ $params['command.disable_validation'] = true;
284
+ $config->set('command.params', $params);
285
+ }
286
+
287
+ return $client;
288
+ }
289
+
290
+ /**
291
+ * Add backoff logging to the backoff plugin if needed
292
+ *
293
+ * @param BackoffPlugin $plugin Backoff plugin
294
+ * @param Collection $config Configuration settings
295
+ *
296
+ * @throws InvalidArgumentException
297
+ */
298
+ protected function addBackoffLogger(BackoffPlugin $plugin, Collection $config)
299
+ {
300
+ // The log option can be set to `debug` or an instance of a LogAdapterInterface
301
+ if ($logger = $config->get(Options::BACKOFF_LOGGER)) {
302
+ $format = $config->get(Options::BACKOFF_LOGGER_TEMPLATE);
303
+ if ($logger === 'debug') {
304
+ $logger = new ClosureLogAdapter(function ($message) {
305
+ trigger_error($message . "\n");
306
+ });
307
+ } elseif (!($logger instanceof LogAdapterInterface)) {
308
+ throw new InvalidArgumentException(
309
+ Options::BACKOFF_LOGGER . ' must be set to `debug` or an instance of '
310
+ . 'Guzzle\\Common\\Log\\LogAdapterInterface'
311
+ );
312
+ }
313
+ // Create the plugin responsible for logging exponential backoff retries
314
+ $logPlugin = new BackoffLogger($logger);
315
+ // You can specify a custom format or use the default
316
+ if ($format) {
317
+ $logPlugin->setTemplate($format);
318
+ }
319
+ $plugin->addSubscriber($logPlugin);
320
+ }
321
+ }
322
+
323
+ /**
324
+ * Ensures that an array (e.g. for config data) is actually in array form
325
+ *
326
+ * @param array|Collection $array The array data
327
+ *
328
+ * @return array
329
+ * @throws InvalidArgumentException if the arg is not an array or Collection
330
+ */
331
+ protected function processArray($array)
332
+ {
333
+ if ($array instanceof Collection) {
334
+ $array = $array->getAll();
335
+ }
336
+
337
+ if (!is_array($array)) {
338
+ throw new InvalidArgumentException('The config must be provided as an array or Collection.');
339
+ }
340
+
341
+ return $array;
342
+ }
343
+
344
+ /**
345
+ * Update a configuration object from a service description
346
+ *
347
+ * @param Collection $config Config to update
348
+ *
349
+ * @return ServiceDescription
350
+ * @throws InvalidArgumentException
351
+ */
352
+ protected function updateConfigFromDescription(Collection $config)
353
+ {
354
+ $description = $config->get(Options::SERVICE_DESCRIPTION);
355
+ if (!($description instanceof ServiceDescription)) {
356
+ // Inject the version into the sprintf template if it is a string
357
+ if (is_string($description)) {
358
+ $description = sprintf($description, $config->get(Options::VERSION));
359
+ }
360
+ $description = ServiceDescription::factory($description);
361
+ $config->set(Options::SERVICE_DESCRIPTION, $description);
362
+ }
363
+
364
+ if (!$config->get(Options::SERVICE)) {
365
+ $config->set(Options::SERVICE, $description->getData('endpointPrefix'));
366
+ }
367
+
368
+ if ($iterators = $description->getData('iterators')) {
369
+ $this->setIteratorsConfig($iterators);
370
+ }
371
+
372
+ // Make sure a valid region is set
373
+ $region = $config->get(Options::REGION);
374
+ $global = $description->getData('globalEndpoint');
375
+
376
+ if (!$global && !$region) {
377
+ throw new InvalidArgumentException(
378
+ 'A region is required when using ' . $description->getData('serviceFullName')
379
+ );
380
+ } elseif ($global && (!$region || $description->getData('namespace') !== 'S3')) {
381
+ $region = 'us-east-1';
382
+ $config->set(Options::REGION, 'us-east-1');
383
+ }
384
+
385
+ if (!$config->get(Options::BASE_URL)) {
386
+ $endpoint = call_user_func(
387
+ $config->get('endpoint_provider'),
388
+ array(
389
+ 'scheme' => $config->get(Options::SCHEME),
390
+ 'region' => $region,
391
+ 'service' => $config->get(Options::SERVICE)
392
+ )
393
+ );
394
+ $config->set(Options::BASE_URL, $endpoint['endpoint']);
395
+
396
+ // Set a signature if one was not explicitly provided.
397
+ if (!$config->hasKey(Options::SIGNATURE)
398
+ && isset($endpoint['signatureVersion'])
399
+ ) {
400
+ $config->set(Options::SIGNATURE, $endpoint['signatureVersion']);
401
+ }
402
+ }
403
+
404
+ return $description;
405
+ }
406
+
407
+ /**
408
+ * Return an appropriate signature object for a a client based on the
409
+ * "signature" configuration setting, or the default signature specified in
410
+ * a service description. The signature can be set to a valid signature
411
+ * version identifier string or an instance of Aws\Common\Signature\SignatureInterface.
412
+ *
413
+ * @param ServiceDescription $description Description that holds a signature option
414
+ * @param Collection $config Configuration options
415
+ *
416
+ * @return SignatureInterface
417
+ * @throws InvalidArgumentException
418
+ */
419
+ protected function getSignature(ServiceDescription $description, Collection $config)
420
+ {
421
+ // If a custom signature has not been provided, then use the default
422
+ // signature setting specified in the service description.
423
+ $signature = $config->get(Options::SIGNATURE) ?: $description->getData('signatureVersion');
424
+
425
+ if (is_string($signature)) {
426
+ if ($signature == 'v4') {
427
+ $signature = new SignatureV4();
428
+ } elseif ($signature == 'v2') {
429
+ $signature = new SignatureV2();
430
+ } elseif ($signature == 'v3https') {
431
+ $signature = new SignatureV3Https();
432
+ } else {
433
+ throw new InvalidArgumentException("Invalid signature type: {$signature}");
434
+ }
435
+ } elseif (!($signature instanceof SignatureInterface)) {
436
+ throw new InvalidArgumentException('The provided signature is not '
437
+ . 'a signature version string or an instance of '
438
+ . 'Aws\\Common\\Signature\\SignatureInterface');
439
+ }
440
+
441
+ // Allow a custom service name or region value to be provided
442
+ if ($signature instanceof EndpointSignatureInterface) {
443
+
444
+ // Determine the service name to use when signing
445
+ $signature->setServiceName($config->get(Options::SIGNATURE_SERVICE)
446
+ ?: $description->getData('signingName')
447
+ ?: $description->getData('endpointPrefix'));
448
+
449
+ // Determine the region to use when signing requests
450
+ $signature->setRegionName($config->get(Options::SIGNATURE_REGION) ?: $config->get(Options::REGION));
451
+ }
452
+
453
+ return $signature;
454
+ }
455
+
456
+ protected function getCredentials(Collection $config)
457
+ {
458
+ $credentials = $config->get(Options::CREDENTIALS);
459
+ if ($credentials === false) {
460
+ $credentials = new NullCredentials();
461
+ } elseif (!$credentials instanceof CredentialsInterface) {
462
+ $credentials = Credentials::factory($config);
463
+ }
464
+
465
+ return $credentials;
466
+ }
467
+ }
vendor/Aws/Common/Command/AwsQueryVisitor.php CHANGED
@@ -1,117 +1,117 @@
1
- <?php
2
-
3
- namespace Aws\Common\Command;
4
-
5
- use Guzzle\Http\Message\RequestInterface;
6
- use Guzzle\Service\Description\Parameter;
7
- use Guzzle\Service\Command\CommandInterface;
8
- use Guzzle\Service\Command\LocationVisitor\Request\AbstractRequestVisitor;
9
-
10
- /**
11
- * Location visitor used to serialize AWS query parameters (e.g. EC2, SES, SNS, SQS, etc) as POST fields
12
- */
13
- class AwsQueryVisitor extends AbstractRequestVisitor
14
- {
15
- private $fqname;
16
-
17
- public function visit(CommandInterface $command, RequestInterface $request, Parameter $param, $value)
18
- {
19
- $this->fqname = $command->getName();
20
- $query = array();
21
- $this->customResolver($value, $param, $query, $param->getWireName());
22
- $request->addPostFields($query);
23
- }
24
-
25
- /**
26
- * Map nested parameters into the location_key based parameters
27
- *
28
- * @param array $value Value to map
29
- * @param Parameter $param Parameter that holds information about the current key
30
- * @param array $query Built up query string values
31
- * @param string $prefix String to prepend to sub query values
32
- */
33
- protected function customResolver($value, Parameter $param, array &$query, $prefix = '')
34
- {
35
- switch ($param->getType()) {
36
- case 'object':
37
- $this->resolveObject($param, $value, $prefix, $query);
38
- break;
39
- case 'array':
40
- $this->resolveArray($param, $value, $prefix, $query);
41
- break;
42
- default:
43
- $query[$prefix] = $param->filter($value);
44
- }
45
- }
46
-
47
- /**
48
- * Custom handling for objects
49
- *
50
- * @param Parameter $param Parameter for the object
51
- * @param array $value Value that is set for this parameter
52
- * @param string $prefix Prefix for the resulting key
53
- * @param array $query Query string array passed by reference
54
- */
55
- protected function resolveObject(Parameter $param, array $value, $prefix, array &$query)
56
- {
57
- // Maps are implemented using additional properties
58
- $hasAdditionalProperties = ($param->getAdditionalProperties() instanceof Parameter);
59
- $additionalPropertyCount = 0;
60
-
61
- foreach ($value as $name => $v) {
62
- if ($subParam = $param->getProperty($name)) {
63
- // if the parameter was found by name as a regular property
64
- $key = $prefix . '.' . $subParam->getWireName();
65
- $this->customResolver($v, $subParam, $query, $key);
66
- } elseif ($hasAdditionalProperties) {
67
- // Handle map cases like &Attribute.1.Name=<name>&Attribute.1.Value=<value>
68
- $additionalPropertyCount++;
69
- $data = $param->getData();
70
- $keyName = isset($data['keyName']) ? $data['keyName'] : 'key';
71
- $valueName = isset($data['valueName']) ? $data['valueName'] : 'value';
72
- $query["{$prefix}.{$additionalPropertyCount}.{$keyName}"] = $name;
73
- $newPrefix = "{$prefix}.{$additionalPropertyCount}.{$valueName}";
74
- if (is_array($v)) {
75
- $this->customResolver($v, $param->getAdditionalProperties(), $query, $newPrefix);
76
- } else {
77
- $query[$newPrefix] = $param->filter($v);
78
- }
79
- }
80
- }
81
- }
82
-
83
- /**
84
- * Custom handling for arrays
85
- *
86
- * @param Parameter $param Parameter for the object
87
- * @param array $value Value that is set for this parameter
88
- * @param string $prefix Prefix for the resulting key
89
- * @param array $query Query string array passed by reference
90
- */
91
- protected function resolveArray(Parameter $param, array $value, $prefix, array &$query)
92
- {
93
- static $serializeEmpty = array(
94
- 'SetLoadBalancerPoliciesForBackendServer' => 1,
95
- 'SetLoadBalancerPoliciesOfListener' => 1,
96
- 'UpdateStack' => 1
97
- );
98
-
99
- // For BC, serialize empty lists for specific operations
100
- if (!$value) {
101
- if (isset($serializeEmpty[$this->fqname])) {
102
- $query[$prefix] = '';
103
- }
104
- return;
105
- }
106
-
107
- $offset = $param->getData('offset') ?: 1;
108
- foreach ($value as $index => $v) {
109
- $index += $offset;
110
- if (is_array($v) && $items = $param->getItems()) {
111
- $this->customResolver($v, $items, $query, $prefix . '.' . $index);
112
- } else {
113
- $query[$prefix . '.' . $index] = $param->filter($v);
114
- }
115
- }
116
- }
117
- }
1
+ <?php
2
+
3
+ namespace Aws\Common\Command;
4
+
5
+ use Guzzle\Http\Message\RequestInterface;
6
+ use Guzzle\Service\Description\Parameter;
7
+ use Guzzle\Service\Command\CommandInterface;
8
+ use Guzzle\Service\Command\LocationVisitor\Request\AbstractRequestVisitor;
9
+
10
+ /**
11
+ * Location visitor used to serialize AWS query parameters (e.g. EC2, SES, SNS, SQS, etc) as POST fields
12
+ */
13
+ class AwsQueryVisitor extends AbstractRequestVisitor
14
+ {
15
+ private $fqname;
16
+
17
+ public function visit(CommandInterface $command, RequestInterface $request, Parameter $param, $value)
18
+ {
19
+ $this->fqname = $command->getName();
20
+ $query = array();
21
+ $this->customResolver($value, $param, $query, $param->getWireName());
22
+ $request->addPostFields($query);
23
+ }
24
+
25
+ /**
26
+ * Map nested parameters into the location_key based parameters
27
+ *
28
+ * @param array $value Value to map
29
+ * @param Parameter $param Parameter that holds information about the current key
30
+ * @param array $query Built up query string values
31
+ * @param string $prefix String to prepend to sub query values
32
+ */
33
+ protected function customResolver($value, Parameter $param, array &$query, $prefix = '')
34
+ {
35
+ switch ($param->getType()) {
36
+ case 'object':
37
+ $this->resolveObject($param, $value, $prefix, $query);
38
+ break;
39
+ case 'array':
40
+ $this->resolveArray($param, $value, $prefix, $query);
41
+ break;
42
+ default:
43
+ $query[$prefix] = $param->filter($value);
44
+ }
45
+ }
46
+
47
+ /**
48
+ * Custom handling for objects
49
+ *
50
+ * @param Parameter $param Parameter for the object
51
+ * @param array $value Value that is set for this parameter
52
+ * @param string $prefix Prefix for the resulting key
53
+ * @param array $query Query string array passed by reference
54
+ */
55
+ protected function resolveObject(Parameter $param, array $value, $prefix, array &$query)
56
+ {
57
+ // Maps are implemented using additional properties
58
+ $hasAdditionalProperties = ($param->getAdditionalProperties() instanceof Parameter);
59
+ $additionalPropertyCount = 0;
60
+
61
+ foreach ($value as $name => $v) {
62
+ if ($subParam = $param->getProperty($name)) {
63
+ // if the parameter was found by name as a regular property
64
+ $key = $prefix . '.' . $subParam->getWireName();
65
+ $this->customResolver($v, $subParam, $query, $key);
66
+ } elseif ($hasAdditionalProperties) {
67
+ // Handle map cases like &Attribute.1.Name=<name>&Attribute.1.Value=<value>
68
+ $additionalPropertyCount++;
69
+ $data = $param->getData();
70
+ $keyName = isset($data['keyName']) ? $data['keyName'] : 'key';
71
+ $valueName = isset($data['valueName']) ? $data['valueName'] : 'value';
72
+ $query["{$prefix}.{$additionalPropertyCount}.{$keyName}"] = $name;
73
+ $newPrefix = "{$prefix}.{$additionalPropertyCount}.{$valueName}";
74
+ if (is_array($v)) {
75
+ $this->customResolver($v, $param->getAdditionalProperties(), $query, $newPrefix);
76
+ } else {
77
+ $query[$newPrefix] = $param->filter($v);
78
+ }
79
+ }
80
+ }
81
+ }
82
+
83
+ /**
84
+ * Custom handling for arrays
85
+ *
86
+ * @param Parameter $param Parameter for the object
87
+ * @param array $value Value that is set for this parameter
88
+ * @param string $prefix Prefix for the resulting key
89
+ * @param array $query Query string array passed by reference
90
+ */
91
+ protected function resolveArray(Parameter $param, array $value, $prefix, array &$query)
92
+ {
93
+ static $serializeEmpty = array(
94
+ 'SetLoadBalancerPoliciesForBackendServer' => 1,
95
+ 'SetLoadBalancerPoliciesOfListener' => 1,
96
+ 'UpdateStack' => 1
97
+ );
98
+
99
+ // For BC, serialize empty lists for specific operations
100
+ if (!$value) {
101
+ if (isset($serializeEmpty[$this->fqname])) {
102
+ $query[$prefix] = '';
103
+ }
104
+ return;
105
+ }
106
+
107
+ $offset = $param->getData('offset') ?: 1;
108
+ foreach ($value as $index => $v) {
109
+ $index += $offset;
110
+ if (is_array($v) && $items = $param->getItems()) {
111
+ $this->customResolver($v, $items, $query, $prefix . '.' . $index);
112
+ } else {
113
+ $query[$prefix . '.' . $index] = $param->filter($v);
114
+ }
115
+ }
116
+ }
117
+ }
vendor/Aws/Common/Credentials/Credentials.php CHANGED
@@ -1,337 +1,337 @@
1
- <?php
2
- /**
3
- * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- namespace Aws\Common\Credentials;
18
-
19
- use Aws\Common\Enum\ClientOptions as Options;
20
- use Aws\Common\Exception\InvalidArgumentException;
21
- use Aws\Common\Exception\RequiredExtensionNotLoadedException;
22
- use Aws\Common\Exception\RuntimeException;
23
- use Guzzle\Common\FromConfigInterface;
24
- use Guzzle\Cache\CacheAdapterInterface;
25
- use Guzzle\Cache\DoctrineCacheAdapter;
26
- use Guzzle\Common\Collection;
27
-
28
- /**
29
- * Basic implementation of the AWSCredentials interface that allows callers to
30
- * pass in the AWS access key and secret access in the constructor.
31
- */
32
- class Credentials implements CredentialsInterface, FromConfigInterface
33
- {
34
- const ENV_KEY = 'AWS_ACCESS_KEY_ID';
35
- const ENV_SECRET = 'AWS_SECRET_KEY';
36
- const ENV_SECRET_ACCESS_KEY = 'AWS_SECRET_ACCESS_KEY';
37
- const ENV_PROFILE = 'AWS_PROFILE';
38
-
39
- /** @var string AWS Access Key ID */
40
- protected $key;
41
-
42
- /** @var string AWS Secret Access Key */
43
- protected $secret;
44
-
45
- /** @var string AWS Security Token */
46
- protected $token;
47
-
48
- /** @var int Time to die of token */
49
- protected $ttd;
50
-
51
- /**
52
- * Get the available keys for the factory method
53
- *
54
- * @return array
55
- */
56
- public static function getConfigDefaults()
57
- {
58
- return array(
59
- Options::KEY => null,
60
- Options::SECRET => null,
61
- Options::TOKEN => null,
62
- Options::TOKEN_TTD => null,
63
- Options::PROFILE => null,
64
- Options::CREDENTIALS_CACHE => null,
65
- Options::CREDENTIALS_CACHE_KEY => null,
66
- Options::CREDENTIALS_CLIENT => null
67
- );
68
- }
69
-
70
- /**
71
- * Factory method for creating new credentials. This factory method will
72
- * create the appropriate credentials object with appropriate decorators
73
- * based on the passed configuration options.
74
- *
75
- * @param array $config Options to use when instantiating the credentials
76
- *
77
- * @return CredentialsInterface
78
- * @throws InvalidArgumentException If the caching options are invalid
79
- * @throws RuntimeException If using the default cache and APC is disabled
80
- */
81
- public static function factory($config = array())
82
- {
83
- // Add default key values
84
- foreach (self::getConfigDefaults() as $key => $value) {
85
- if (!isset($config[$key])) {
86
- $config[$key] = $value;
87
- }
88
- }
89
-
90
- // Start tracking the cache key
91
- $cacheKey = $config[Options::CREDENTIALS_CACHE_KEY];
92
-
93
- // Create the credentials object
94
- if (!$config[Options::KEY] || !$config[Options::SECRET]) {
95
- $credentials = self::createFromEnvironment($config);
96
- // If no cache key was set, use the crc32 hostname of the server
97
- $cacheKey = $cacheKey ?: 'credentials_' . crc32(gethostname());
98
- } else {
99
- // Instantiate using short or long term credentials
100
- $credentials = new static(
101
- $config[Options::KEY],
102
- $config[Options::SECRET],
103
- $config[Options::TOKEN],
104
- $config[Options::TOKEN_TTD]
105
- );
106
- // If no cache key was set, use the access key ID
107
- $cacheKey = $cacheKey ?: 'credentials_' . $config[Options::KEY];
108
- }
109
-
110
- // Check if the credentials are refreshable, and if so, configure caching
111
- $cache = $config[Options::CREDENTIALS_CACHE];
112
- if ($cacheKey && $cache) {
113
- $credentials = self::createCache($credentials, $cache, $cacheKey);
114
- }
115
-
116
- return $credentials;
117
- }
118
-
119
- /**
120
- * Create credentials from the credentials ini file in the HOME directory.
121
- *
122
- * @param string|null $profile Pass a specific profile to use. If no
123
- * profile is specified we will attempt to use
124
- * the value specified in the AWS_PROFILE
125
- * environment variable. If AWS_PROFILE is not
126
- * set, the "default" profile is used.
127
- * @param string|null $filename Pass a string to specify the location of the
128
- * credentials files. If null is passed, the
129
- * SDK will attempt to find the configuration
130
- * file at in your HOME directory at
131
- * ~/.aws/credentials.
132
- * @return CredentialsInterface
133
- * @throws \RuntimeException if the file cannot be found, if the file is
134
- * invalid, or if the profile is invalid.
135
- */
136
- public static function fromIni($profile = null, $filename = null)
137
- {
138
- if (!$filename) {
139
- $filename = self::getHomeDir() . '/.aws/credentials';
140
- }
141
-
142
- if (!$profile) {
143
- $profile = self::getEnvVar(self::ENV_PROFILE) ?: 'default';
144
- }
145
-
146
- if (!file_exists($filename) || !($data = parse_ini_file($filename, true))) {
147
- throw new \RuntimeException("Invalid AWS credentials file: {$filename}.");
148
- }
149
-
150
- if (empty($data[$profile])) {
151
- throw new \RuntimeException("Invalid AWS credentials profile {$profile} in {$filename}.");
152
- }
153
-
154
- return new self(
155
- $data[$profile]['aws_access_key_id'],
156
- $data[$profile]['aws_secret_access_key'],
157
- isset($data[$profile]['aws_security_token'])
158
- ? $data[$profile]['aws_security_token']
159
- : null
160
- );
161
- }
162
-
163
- /**
164
- * Constructs a new BasicAWSCredentials object, with the specified AWS
165
- * access key and AWS secret key
166
- *
167
- * @param string $accessKeyId AWS access key ID
168
- * @param string $secretAccessKey AWS secret access key
169
- * @param string $token Security token to use
170
- * @param int $expiration UNIX timestamp for when credentials expire
171
- */
172
- public function __construct($accessKeyId, $secretAccessKey, $token = null, $expiration = null)
173
- {
174
- $this->key = trim($accessKeyId);
175
- $this->secret = trim($secretAccessKey);
176
- $this->token = $token;
177
- $this->ttd = $expiration;
178
- }
179
-
180
- public function serialize()
181
- {
182
- return json_encode(array(
183
- Options::KEY => $this->key,
184
- Options::SECRET => $this->secret,
185
- Options::TOKEN => $this->token,
186
- Options::TOKEN_TTD => $this->ttd
187
- ));
188
- }
189
-
190
- public function unserialize($serialized)
191
- {
192
- $data = json_decode($serialized, true);
193
- $this->key = $data[Options::KEY];
194
- $this->secret = $data[Options::SECRET];
195
- $this->token = $data[Options::TOKEN];
196
- $this->ttd = $data[Options::TOKEN_TTD];
197
- }
198
-
199
- public function getAccessKeyId()
200
- {
201
- return $this->key;
202
- }
203
-
204
- public function getSecretKey()
205
- {
206
- return $this->secret;
207
- }
208
-
209
- public function getSecurityToken()
210
- {
211
- return $this->token;
212
- }
213
-
214
- public function getExpiration()
215
- {
216
- return $this->ttd;
217
- }
218
-
219
- public function isExpired()
220
- {
221
- return $this->ttd !== null && time() >= $this->ttd;
222
- }
223
-
224
- public function setAccessKeyId($key)
225
- {
226
- $this->key = $key;
227
-
228
- return $this;
229
- }
230
-
231
- public function setSecretKey($secret)
232
- {
233
- $this->secret = $secret;
234
-
235
- return $this;
236
- }
237
-
238
- public function setSecurityToken($token)
239
- {
240
- $this->token = $token;
241
-
242
- return $this;
243
- }
244
-
245
- public function setExpiration($timestamp)
246
- {
247
- $this->ttd = $timestamp;
248
-
249
- return $this;
250
- }
251
-
252
- /**
253
- * When no keys are provided, attempt to create them based on the
254
- * environment or instance profile credentials.
255
- *
256
- * @param array|Collection $config
257
- *
258
- * @return CredentialsInterface
259
- */
260
- private static function createFromEnvironment($config)
261
- {
262
- // Get key and secret from ENV variables
263
- $envKey = self::getEnvVar(self::ENV_KEY);
264
- if (!($envSecret = self::getEnvVar(self::ENV_SECRET))) {
265
- // Use AWS_SECRET_ACCESS_KEY if AWS_SECRET_KEY was not set.
266
- $envSecret = self::getEnvVar(self::ENV_SECRET_ACCESS_KEY);
267
- }
268
-
269
- // Use credentials from the environment variables if available
270
- if ($envKey && $envSecret) {
271
- return new static($envKey, $envSecret);
272
- }
273
-
274
- // Use credentials from the ini file in HOME directory if available
275
- $home = self::getHomeDir();
276
- if ($home && file_exists("{$home}/.aws/credentials")) {
277
- return self::fromIni($config[Options::PROFILE], "{$home}/.aws/credentials");
278
- }
279
-
280
- // Use instance profile credentials (available on EC2 instances)
281
- return new RefreshableInstanceProfileCredentials(
282
- new static('', '', '', 1),
283
- $config[Options::CREDENTIALS_CLIENT]
284
- );
285
- }
286
-
287
- private static function createCache(CredentialsInterface $credentials, $cache, $cacheKey)
288
- {
289
- if ($cache === 'true' || $cache === true) {
290
- // If no cache adapter was provided, then create one for the user
291
- // @codeCoverageIgnoreStart
292
- if (!extension_loaded('apc')) {
293
- throw new RequiredExtensionNotLoadedException('PHP has not been compiled with APC. Unable to cache '
294
- . 'the credentials.');
295
- } elseif (!class_exists('Doctrine\Common\Cache\ApcCache')) {
296
- throw new RuntimeException(
297
- 'Cannot set ' . Options::CREDENTIALS_CACHE . ' to true because the Doctrine cache component is '
298
- . 'not installed. Either install doctrine/cache or pass in an instantiated '
299
- . 'Guzzle\Cache\CacheAdapterInterface object'
300
- );
301
- }
302
- // @codeCoverageIgnoreEnd
303
- $cache = new DoctrineCacheAdapter(new \Doctrine\Common\Cache\ApcCache());
304
- } elseif (!($cache instanceof CacheAdapterInterface)) {
305
- throw new InvalidArgumentException('Unable to utilize caching with the specified options');
306
- }
307
-
308
- // Decorate the credentials with a cache
309
- return new CacheableCredentials($credentials, $cache, $cacheKey);
310
- }
311
-
312
- private static function getHomeDir()
313
- {
314
- // On Linux/Unix-like systems, use the HOME environment variable
315
- if ($homeDir = self::getEnvVar('HOME')) {
316
- return $homeDir;
317
- }
318
-
319
- // Get the HOMEDRIVE and HOMEPATH values for Windows hosts
320
- $homeDrive = self::getEnvVar('HOMEDRIVE');
321
- $homePath = self::getEnvVar('HOMEPATH');
322
-
323
- return ($homeDrive && $homePath) ? $homeDrive . $homePath : null;
324
- }
325
-
326
- /**
327
- * Fetches the value of an environment variable by checking $_SERVER and getenv().
328
- *
329
- * @param string $var Name of the environment variable
330
- *
331
- * @return mixed|null
332
- */
333
- private static function getEnvVar($var)
334
- {
335
- return isset($_SERVER[$var]) ? $_SERVER[$var] : getenv($var);
336
- }
337
- }
1
+ <?php
2
+ /**
3
+ * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ namespace Aws\Common\Credentials;
18
+
19
+ use Aws\Common\Enum\ClientOptions as Options;
20
+ use Aws\Common\Exception\InvalidArgumentException;
21
+ use Aws\Common\Exception\RequiredExtensionNotLoadedException;
22
+ use Aws\Common\Exception\RuntimeException;
23
+ use Guzzle\Common\FromConfigInterface;
24
+ use Guzzle\Cache\CacheAdapterInterface;
25
+ use Guzzle\Cache\DoctrineCacheAdapter;
26
+ use Guzzle\Common\Collection;
27
+
28
+ /**
29
+ * Basic implementation of the AWSCredentials interface that allows callers to
30
+ * pass in the AWS access key and secret access in the constructor.
31
+ */
32
+ class Credentials implements CredentialsInterface, FromConfigInterface
33
+ {
34
+ const ENV_KEY = 'AWS_ACCESS_KEY_ID';
35
+ const ENV_SECRET = 'AWS_SECRET_KEY';
36
+ const ENV_SECRET_ACCESS_KEY = 'AWS_SECRET_ACCESS_KEY';
37
+ const ENV_PROFILE = 'AWS_PROFILE';
38
+
39
+ /** @var string AWS Access Key ID */
40
+ protected $key;
41
+
42
+ /** @var string AWS Secret Access Key */
43
+ protected $secret;
44
+
45
+ /** @var string AWS Security Token */
46
+ protected $token;
47
+
48
+ /** @var int Time to die of token */
49
+ protected $ttd;
50
+
51
+ /**
52
+ * Get the available keys for the factory method
53
+ *
54
+ * @return array
55
+ */
56
+ public static function getConfigDefaults()
57
+ {
58
+ return array(
59
+ Options::KEY => null,
60
+ Options::SECRET => null,
61
+ Options::TOKEN => null,
62
+ Options::TOKEN_TTD => null,
63
+ Options::PROFILE => null,
64
+ Options::CREDENTIALS_CACHE => null,
65
+ Options::CREDENTIALS_CACHE_KEY => null,
66
+ Options::CREDENTIALS_CLIENT => null
67
+ );
68
+ }
69
+
70
+ /**
71
+ * Factory method for creating new credentials. This factory method will
72
+ * create the appropriate credentials object with appropriate decorators
73
+ * based on the passed configuration options.
74
+ *
75
+ * @param array $config Options to use when instantiating the credentials
76
+ *
77
+ * @return CredentialsInterface
78
+ * @throws InvalidArgumentException If the caching options are invalid
79
+ * @throws RuntimeException If using the default cache and APC is disabled
80
+ */
81
+ public static function factory($config = array())
82
+ {
83
+ // Add default key values
84
+ foreach (self::getConfigDefaults() as $key => $value) {
85
+ if (!isset($config[$key])) {
86
+ $config[$key] = $value;
87
+ }
88
+ }
89
+
90
+ // Start tracking the cache key
91
+ $cacheKey = $config[Options::CREDENTIALS_CACHE_KEY];
92
+
93
+ // Create the credentials object
94
+ if (!$config[Options::KEY] || !$config[Options::SECRET]) {
95
+ $credentials = self::createFromEnvironment($config);
96
+ // If no cache key was set, use the crc32 hostname of the server
97
+ $cacheKey = $cacheKey ?: 'credentials_' . crc32(gethostname());
98
+ } else {
99
+ // Instantiate using short or long term credentials
100
+ $credentials = new static(
101
+ $config[Options::KEY],
102
+ $config[Options::SECRET],
103
+ $config[Options::TOKEN],
104
+ $config[Options::TOKEN_TTD]
105
+ );
106
+ // If no cache key was set, use the access key ID
107
+ $cacheKey = $cacheKey ?: 'credentials_' . $config[Options::KEY];
108
+ }
109
+
110
+ // Check if the credentials are refreshable, and if so, configure caching
111
+ $cache = $config[Options::CREDENTIALS_CACHE];
112
+ if ($cacheKey && $cache) {
113
+ $credentials = self::createCache($credentials, $cache, $cacheKey);
114
+ }
115
+
116
+ return $credentials;
117
+ }
118
+
119
+ /**
120
+ * Create credentials from the credentials ini file in the HOME directory.
121
+ *
122
+ * @param string|null $profile Pass a specific profile to use. If no
123
+ * profile is specified we will attempt to use
124
+ * the value specified in the AWS_PROFILE
125
+ * environment variable. If AWS_PROFILE is not
126
+ * set, the "default" profile is used.
127
+ * @param string|null $filename Pass a string to specify the location of the
128
+ * credentials files. If null is passed, the
129
+ * SDK will attempt to find the configuration
130
+ * file at in your HOME directory at
131
+ * ~/.aws/credentials.
132
+ * @return CredentialsInterface
133
+ * @throws \RuntimeException if the file cannot be found, if the file is
134
+ * invalid, or if the profile is invalid.
135
+ */
136
+ public static function fromIni($profile = null, $filename = null)
137
+ {
138
+ if (!$filename) {
139
+ $filename = self::getHomeDir() . '/.aws/credentials';
140
+ }
141
+
142
+ if (!$profile) {
143
+ $profile = self::getEnvVar(self::ENV_PROFILE) ?: 'default';
144
+ }
145
+
146
+ if (!file_exists($filename) || !($data = parse_ini_file($filename, true))) {
147
+ throw new \RuntimeException("Invalid AWS credentials file: {$filename}.");
148
+ }
149
+
150
+ if (empty($data[$profile])) {
151
+ throw new \RuntimeException("Invalid AWS credentials profile {$profile} in {$filename}.");
152
+ }
153
+
154
+ return new self(
155
+ $data[$profile]['aws_access_key_id'],
156
+ $data[$profile]['aws_secret_access_key'],
157
+ isset($data[$profile]['aws_security_token'])
158
+ ? $data[$profile]['aws_security_token']
159
+ : null
160
+ );
161
+ }
162
+
163
+ /**
164
+ * Constructs a new BasicAWSCredentials object, with the specified AWS
165
+ * access key and AWS secret key
166
+ *
167
+ * @param string $accessKeyId AWS access key ID
168
+ * @param string $secretAccessKey AWS secret access key
169
+ * @param string $token Security token to use
170
+ * @param int $expiration UNIX timestamp for when credentials expire
171
+ */
172
+ public function __construct($accessKeyId, $secretAccessKey, $token = null, $expiration = null)
173
+ {
174
+ $this->key = trim($accessKeyId);
175
+ $this->secret = trim($secretAccessKey);
176
+ $this->token = $token;
177
+ $this->ttd = $expiration;
178
+ }
179
+
180
+ public function serialize()
181
+ {
182
+ return json_encode(array(
183
+ Options::KEY => $this->key,
184
+ Options::SECRET => $this->secret,
185
+ Options::TOKEN => $this->token,
186
+ Options::TOKEN_TTD => $this->ttd
187
+ ));
188
+ }
189
+
190
+ public function unserialize($serialized)
191
+ {
192
+ $data = json_decode($serialized, true);
193
+ $this->key = $data[Options::KEY];
194
+ $this->secret = $data[Options::SECRET];
195
+ $this->token = $data[Options::TOKEN];
196
+ $this->ttd = $data[Options::TOKEN_TTD];
197
+ }
198
+
199
+ public function getAccessKeyId()
200
+ {
201
+ return $this->key;
202
+ }
203
+
204
+ public function getSecretKey()
205
+ {
206
+ return $this->secret;
207
+ }
208
+
209
+ public function getSecurityToken()
210
+ {
211
+ return $this->token;
212
+ }
213
+
214
+ public function getExpiration()
215
+ {
216
+ return $this->ttd;
217
+ }
218
+
219
+ public function isExpired()
220
+ {
221
+ return $this->ttd !== null && time() >= $this->ttd;
222
+ }
223
+
224
+ public function setAccessKeyId($key)
225
+ {
226
+ $this->key = $key;
227
+
228
+ return $this;
229
+ }
230
+
231
+ public function setSecretKey($secret)
232
+ {
233
+ $this->secret = $secret;
234
+
235
+ return $this;
236
+ }
237
+
238
+ public function setSecurityToken($token)
239
+ {
240
+ $this->token = $token;
241
+
242
+ return $this;
243
+ }
244
+
245
+ public function setExpiration($timestamp)
246
+ {
247
+ $this->ttd = $timestamp;
248
+
249
+ return $this;
250
+ }
251
+
252
+ /**
253
+ * When no keys are provided, attempt to create them based on the
254
+ * environment or instance profile credentials.
255
+ *
256
+ * @param array|Collection $config
257
+ *
258
+ * @return CredentialsInterface
259
+ */
260
+ private static function createFromEnvironment($config)
261
+ {
262
+ // Get key and secret from ENV variables
263
+ $envKey = self::getEnvVar(self::ENV_KEY);
264
+ if (!($envSecret = self::getEnvVar(self::ENV_SECRET))) {
265
+ // Use AWS_SECRET_ACCESS_KEY if AWS_SECRET_KEY was not set.
266
+ $envSecret = self::getEnvVar(self::ENV_SECRET_ACCESS_KEY);
267
+ }
268
+
269
+ // Use credentials from the environment variables if available
270
+ if ($envKey && $envSecret) {
271
+ return new static($envKey, $envSecret);
272
+ }
273
+
274
+ // Use credentials from the ini file in HOME directory if available
275
+ $home = self::getHomeDir();
276
+ if ($home && file_exists("{$home}/.aws/credentials")) {
277
+ return self::fromIni($config[Options::PROFILE], "{$home}/.aws/credentials");
278
+ }
279
+
280
+ // Use instance profile credentials (available on EC2 instances)
281
+ return new RefreshableInstanceProfileCredentials(
282
+ new static('', '', '', 1),
283
+ $config[Options::CREDENTIALS_CLIENT]
284
+ );
285
+ }
286
+
287
+ private static function createCache(CredentialsInterface $credentials, $cache, $cacheKey)
288
+ {
289
+ if ($cache === 'true' || $cache === true) {
290
+ // If no cache adapter was provided, then create one for the user
291
+ // @codeCoverageIgnoreStart
292
+ if (!extension_loaded('apc')) {
293
+ throw new RequiredExtensionNotLoadedException('PHP has not been compiled with APC. Unable to cache '
294
+ . 'the credentials.');
295
+ } elseif (!class_exists('Doctrine\Common\Cache\ApcCache')) {
296
+ throw new RuntimeException(
297
+ 'Cannot set ' . Options::CREDENTIALS_CACHE . ' to true because the Doctrine cache component is '
298
+ . 'not installed. Either install doctrine/cache or pass in an instantiated '
299
+ . 'Guzzle\Cache\CacheAdapterInterface object'
300
+ );
301
+ }
302
+ // @codeCoverageIgnoreEnd
303
+ $cache = new DoctrineCacheAdapter(new \Doctrine\Common\Cache\ApcCache());
304
+ } elseif (!($cache instanceof CacheAdapterInterface)) {
305
+ throw new InvalidArgumentException('Unable to utilize caching with the specified options');
306
+ }
307
+
308
+ // Decorate the credentials with a cache
309
+ return new CacheableCredentials($credentials, $cache, $cacheKey);
310
+ }
311
+
312
+ private static function getHomeDir()
313
+ {
314
+ // On Linux/Unix-like systems, use the HOME environment variable
315
+ if ($homeDir = self::getEnvVar('HOME')) {
316
+ return $homeDir;
317
+ }
318
+
319
+ // Get the HOMEDRIVE and HOMEPATH values for Windows hosts
320
+ $homeDrive = self::getEnvVar('HOMEDRIVE');
321
+ $homePath = self::getEnvVar('HOMEPATH');
322
+
323
+ return ($homeDrive && $homePath) ? $homeDrive . $homePath : null;
324
+ }
325
+
326
+ /**
327
+ * Fetches the value of an environment variable by checking $_SERVER and getenv().
328
+ *
329
+ * @param string $var Name of the environment variable
330
+ *
331
+ * @return mixed|null
332
+ */
333
+ private static function getEnvVar($var)
334
+ {
335
+ return isset($_SERVER[$var]) ? $_SERVER[$var] : getenv($var);
336
+ }
337
+ }
vendor/Aws/Common/Credentials/NullCredentials.php CHANGED
@@ -1,68 +1,68 @@
1
- <?php
2
- namespace Aws\Common\Credentials;
3
-
4
- /**
5
- * A blank set of credentials. AWS clients must be provided credentials, but
6
- * there are some types of requests that do not need authentication. This class
7
- * can be used to pivot on that scenario, and also serve as a mock credentials
8
- * object when testing
9
- *
10
- * @codeCoverageIgnore
11
- */
12
- class NullCredentials implements CredentialsInterface
13
- {
14
- public function getAccessKeyId()
15
- {
16
- return '';
17
- }
18
-
19
- public function getSecretKey()
20
- {
21
- return '';
22
- }
23
-
24
- public function getSecurityToken()
25
- {
26
- return null;
27
- }
28
-
29
- public function getExpiration()
30
- {
31
- return null;
32
- }
33
-
34
- public function isExpired()
35
- {
36
- return false;
37
- }
38
-
39
- public function serialize()
40
- {
41
- return 'N;';
42
- }
43
-
44
- public function unserialize($serialized)
45
- {
46
- // Nothing to do here.
47
- }
48
-
49
- public function setAccessKeyId($key)
50
- {
51
- // Nothing to do here.
52
- }
53
-
54
- public function setSecretKey($secret)
55
- {
56
- // Nothing to do here.
57
- }
58
-
59
- public function setSecurityToken($token)
60
- {
61
- // Nothing to do here.
62
- }
63
-
64
- public function setExpiration($timestamp)
65
- {
66
- // Nothing to do here.
67
- }
68
- }
1
+ <?php
2
+ namespace Aws\Common\Credentials;
3
+
4
+ /**
5
+ * A blank set of credentials. AWS clients must be provided credentials, but
6
+ * there are some types of requests that do not need authentication. This class
7
+ * can be used to pivot on that scenario, and also serve as a mock credentials
8
+ * object when testing
9
+ *
10
+ * @codeCoverageIgnore
11
+ */
12
+ class NullCredentials implements CredentialsInterface
13
+ {
14
+ public function getAccessKeyId()
15
+ {
16
+ return '';
17
+ }
18
+
19
+ public function getSecretKey()
20
+ {
21
+ return '';
22
+ }
23
+
24
+ public function getSecurityToken()
25
+ {
26
+ return null;
27
+ }
28
+
29
+ public function getExpiration()
30
+ {
31
+ return null;
32
+ }
33
+
34
+ public function isExpired()
35
+ {
36
+ return false;
37
+ }
38
+
39
+ public function serialize()
40
+ {
41
+ return 'N;';
42
+ }
43
+
44
+ public function unserialize($serialized)
45
+ {
46
+ // Nothing to do here.
47
+ }
48
+
49
+ public function setAccessKeyId($key)
50
+ {
51
+ // Nothing to do here.
52
+ }
53
+
54
+ public function setSecretKey($secret)
55
+ {
56
+ // Nothing to do here.
57
+ }
58
+
59
+ public function setSecurityToken($token)
60
+ {
61
+ // Nothing to do here.
62
+ }
63
+
64
+ public function setExpiration($timestamp)
65
+ {
66
+ // Nothing to do here.
67
+ }
68
+ }
vendor/Aws/Common/Enum/Region.php CHANGED
@@ -1,63 +1,63 @@
1
- <?php
2
- /**
3
- * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- namespace Aws\Common\Enum;
18
-
19
- use Aws\Common\Enum;
20
-
21
- /**
22
- * Contains enumerable region code values. These should be useful in most cases,
23
- * with Amazon S3 being the most notable exception
24
- *
25
- * @link http://docs.aws.amazon.com/general/latest/gr/rande.html AWS Regions and Endpoints
26
- */
27
- class Region extends Enum
28
- {
29
- const US_EAST_1 = 'us-east-1';
30
- const VIRGINIA = 'us-east-1';
31
- const NORTHERN_VIRGINIA = 'us-east-1';
32
-
33
- const US_WEST_1 = 'us-west-1';
34
- const CALIFORNIA = 'us-west-1';
35
- const NORTHERN_CALIFORNIA = 'us-west-1';
36
-
37
- const US_WEST_2 = 'us-west-2';
38
- const OREGON = 'us-west-2';
39
-
40
- const EU_WEST_1 = 'eu-west-1';
41
- const IRELAND = 'eu-west-1';
42
-
43
- const EU_CENTRAL_1 = 'eu-central-1';
44
- const FRANKFURT = 'eu-central-1';
45
-
46
- const AP_SOUTHEAST_1 = 'ap-southeast-1';
47
- const SINGAPORE = 'ap-southeast-1';
48
-
49
- const AP_SOUTHEAST_2 = 'ap-southeast-2';
50
- const SYDNEY = 'ap-southeast-2';
51
-
52
- const AP_NORTHEAST_1 = 'ap-northeast-1';
53
- const TOKYO = 'ap-northeast-1';
54
-
55
- const SA_EAST_1 = 'sa-east-1';
56
- const SAO_PAULO = 'sa-east-1';
57
-
58
- const CN_NORTH_1 = 'cn-north-1';
59
- const BEIJING = 'cn-north-1';
60
-
61
- const US_GOV_WEST_1 = 'us-gov-west-1';
62
- const GOV_CLOUD_US = 'us-gov-west-1';
63
- }
1
+ <?php
2
+ /**
3
+ * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ namespace Aws\Common\Enum;
18
+
19
+ use Aws\Common\Enum;
20
+
21
+ /**
22
+ * Contains enumerable region code values. These should be useful in most cases,
23
+ * with Amazon S3 being the most notable exception
24
+ *
25
+ * @link http://docs.aws.amazon.com/general/latest/gr/rande.html AWS Regions and Endpoints
26
+ */
27
+ class Region extends Enum
28
+ {
29
+ const US_EAST_1 = 'us-east-1';
30
+ const VIRGINIA = 'us-east-1';
31
+ const NORTHERN_VIRGINIA = 'us-east-1';
32
+
33
+ const US_WEST_1 = 'us-west-1';
34
+ const CALIFORNIA = 'us-west-1';
35
+ const NORTHERN_CALIFORNIA = 'us-west-1';
36
+
37
+ const US_WEST_2 = 'us-west-2';
38
+ const OREGON = 'us-west-2';
39
+
40
+ const EU_WEST_1 = 'eu-west-1';
41
+ const IRELAND = 'eu-west-1';
42
+
43
+ const EU_CENTRAL_1 = 'eu-central-1';
44
+ const FRANKFURT = 'eu-central-1';
45
+
46
+ const AP_SOUTHEAST_1 = 'ap-southeast-1';
47
+ const SINGAPORE = 'ap-southeast-1';
48
+
49
+ const AP_SOUTHEAST_2 = 'ap-southeast-2';
50
+ const SYDNEY = 'ap-southeast-2';
51
+
52
+ const AP_NORTHEAST_1 = 'ap-northeast-1';
53
+ const TOKYO = 'ap-northeast-1';
54
+
55
+ const SA_EAST_1 = 'sa-east-1';
56
+ const SAO_PAULO = 'sa-east-1';
57
+
58
+ const CN_NORTH_1 = 'cn-north-1';
59
+ const BEIJING = 'cn-north-1';
60
+
61
+ const US_GOV_WEST_1 = 'us-gov-west-1';
62
+ const GOV_CLOUD_US = 'us-gov-west-1';
63
+ }
vendor/Aws/Common/Facade/Facade.php CHANGED
@@ -1,67 +1,67 @@
1
- <?php
2
- /**
3
- * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- namespace Aws\Common\Facade;
18
-
19
- use Aws\Common\Aws;
20
-
21
- /**
22
- * Base facade class that handles the delegation logic
23
- */
24
- abstract class Facade implements FacadeInterface
25
- {
26
- /** @var Aws */
27
- protected static $serviceBuilder;
28
-
29
- /**
30
- * Mounts the facades by extracting information from the service builder config and using creating class aliases
31
- *
32
- * @param string|null $targetNamespace Namespace that the facades should be mounted to. Defaults to global namespace
33
- *
34
- * @param Aws $serviceBuilder
35
- */
36
- public static function mountFacades(Aws $serviceBuilder, $targetNamespace = null)
37
- {
38
- self::$serviceBuilder = $serviceBuilder;
39
- require_once __DIR__ . '/facade-classes.php';
40
- foreach ($serviceBuilder->getConfig() as $service) {
41
- if (isset($service['alias'], $service['class'])) {
42
- $facadeClass = __NAMESPACE__ . '\\' . $service['alias'];
43
- $facadeAlias = ltrim($targetNamespace . '\\' . $service['alias'], '\\');
44
- if (!class_exists($facadeAlias) && class_exists($facadeClass)) {
45
- // @codeCoverageIgnoreStart
46
- class_alias($facadeClass, $facadeAlias);
47
- // @codeCoverageIgnoreEnd
48
- }
49
- }
50
- }
51
- }
52
-
53
- /**
54
- * Returns the instance of the client that the facade operates on
55
- *
56
- * @return \Aws\Common\Client\AwsClientInterface
57
- */
58
- public static function getClient()
59
- {
60
- return self::$serviceBuilder->get(static::getServiceBuilderKey());
61
- }
62
-
63
- public static function __callStatic($method, $args)
64
- {
65
- return call_user_func_array(array(self::getClient(), $method), $args);
66
- }
67
- }
1
+ <?php
2
+ /**
3
+ * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ namespace Aws\Common\Facade;
18
+
19
+ use Aws\Common\Aws;
20
+
21
+ /**
22
+ * Base facade class that handles the delegation logic
23
+ */
24
+ abstract class Facade implements FacadeInterface
25
+ {
26
+ /** @var Aws */
27
+ protected static $serviceBuilder;
28
+
29
+ /**
30
+ * Mounts the facades by extracting information from the service builder config and using creating class aliases
31
+ *
32
+ * @param string|null $targetNamespace Namespace that the facades should be mounted to. Defaults to global namespace
33
+ *
34
+ * @param Aws $serviceBuilder
35
+ */
36
+ public static function mountFacades(Aws $serviceBuilder, $targetNamespace = null)
37
+ {
38
+ self::$serviceBuilder = $serviceBuilder;
39
+ require_once __DIR__ . '/facade-classes.php';
40
+ foreach ($serviceBuilder->getConfig() as $service) {
41
+ if (isset($service['alias'], $service['class'])) {
42
+ $facadeClass = __NAMESPACE__ . '\\' . $service['alias'];
43
+ $facadeAlias = ltrim($targetNamespace . '\\' . $service['alias'], '\\');
44
+ if (!class_exists($facadeAlias) && class_exists($facadeClass)) {
45
+ // @codeCoverageIgnoreStart
46
+ class_alias($facadeClass, $facadeAlias);
47
+ // @codeCoverageIgnoreEnd
48
+ }
49
+ }
50
+ }
51
+ }
52
+
53
+ /**
54
+ * Returns the instance of the client that the facade operates on
55
+ *
56
+ * @return \Aws\Common\Client\AwsClientInterface
57
+ */
58
+ public static function getClient()
59
+ {
60
+ return self::$serviceBuilder->get(static::getServiceBuilderKey());
61
+ }
62
+
63
+ public static function __callStatic($method, $args)
64
+ {
65
+ return call_user_func_array(array(self::getClient(), $method), $args);
66
+ }
67
+ }
vendor/Aws/Common/Hash/HashUtils.php CHANGED
@@ -1,76 +1,76 @@
1
- <?php
2
- /**
3
- * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- namespace Aws\Common\Hash;
18
-
19
- use Aws\Common\Exception\InvalidArgumentException;
20
-
21
- /**
22
- * Contains hashing utilities
23
- */
24
- class HashUtils
25
- {
26
- /**
27
- * Converts a hash in hex form to binary form
28
- *
29
- * @param string $hash Hash in hex form
30
- *
31
- * @return string Hash in binary form
32
- */
33
- public static function hexToBin($hash)
34
- {
35
- // If using PHP 5.4, there is a native function to convert from hex to binary
36
- static $useNative;
37
- if ($useNative === null) {
38
- $useNative = function_exists('hex2bin');
39
- }
40
-
41
- if (!$useNative && strlen($hash) % 2 !== 0) {
42
- $hash = '0' . $hash;
43
- }
44
-
45
- return $useNative ? hex2bin($hash) : pack("H*", $hash);
46
- }
47
-
48
- /**
49
- * Converts a hash in binary form to hex form
50
- *
51
- * @param string $hash Hash in binary form
52
- *
53
- * @return string Hash in hex form
54
- */
55
- public static function binToHex($hash)
56
- {
57
- return bin2hex($hash);
58
- }
59
-
60
- /**
61
- * Checks if the algorithm specified exists and throws an exception if it does not
62
- *
63
- * @param string $algorithm Name of the algorithm to validate
64
- *
65
- * @return bool
66
- * @throws InvalidArgumentException if the algorithm doesn't exist
67
- */
68
- public static function validateAlgorithm($algorithm)
69
- {
70
- if (!in_array($algorithm, hash_algos(), true)) {
71
- throw new InvalidArgumentException("The hashing algorithm specified ({$algorithm}) does not exist.");
72
- }
73
-
74
- return true;
75
- }
76
- }
1
+ <?php
2
+ /**
3
+ * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ namespace Aws\Common\Hash;
18
+
19
+ use Aws\Common\Exception\InvalidArgumentException;
20
+
21
+ /**
22
+ * Contains hashing utilities
23
+ */
24
+ class HashUtils
25
+ {
26
+ /**
27
+ * Converts a hash in hex form to binary form
28
+ *
29
+ * @param string $hash Hash in hex form
30
+ *
31
+ * @return string Hash in binary form
32
+ */
33
+ public static function hexToBin($hash)
34
+ {
35
+ // If using PHP 5.4, there is a native function to convert from hex to binary
36
+ static $useNative;
37
+ if ($useNative === null) {
38
+ $useNative = function_exists('hex2bin');
39
+ }
40
+
41
+ if (!$useNative && strlen($hash) % 2 !== 0) {
42
+ $hash = '0' . $hash;
43
+ }
44
+
45
+ return $useNative ? hex2bin($hash) : pack("H*", $hash);
46
+ }
47
+
48
+ /**
49
+ * Converts a hash in binary form to hex form
50
+ *
51
+ * @param string $hash Hash in binary form
52
+ *
53
+ * @return string Hash in hex form
54
+ */
55
+ public static function binToHex($hash)
56
+ {
57
+ return bin2hex($hash);
58
+ }
59
+
60
+ /**
61
+ * Checks if the algorithm specified exists and throws an exception if it does not
62
+ *
63
+ * @param string $algorithm Name of the algorithm to validate
64
+ *
65
+ * @return bool
66
+ * @throws InvalidArgumentException if the algorithm doesn't exist
67
+ */
68
+ public static function validateAlgorithm($algorithm)
69
+ {
70
+ if (!in_array($algorithm, hash_algos(), true)) {
71
+ throw new InvalidArgumentException("The hashing algorithm specified ({$algorithm}) does not exist.");
72
+ }
73
+
74
+ return true;
75
+ }
76
+ }
vendor/Aws/Common/Model/MultipartUpload/AbstractUploadBuilder.php CHANGED
@@ -1,148 +1,148 @@
1
- <?php
2
- /**
3
- * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- namespace Aws\Common\Model\MultipartUpload;
18
-
19
- use Aws\Common\Client\AwsClientInterface;
20
- use Aws\Common\Exception\InvalidArgumentException;
21
- use Guzzle\Http\EntityBody;
22
-
23
- /**
24
- * Easily create a multipart uploader used to quickly and reliably upload a
25
- * large file or data stream to Amazon S3 using multipart uploads
26
- */
27
- abstract class AbstractUploadBuilder
28
- {
29
- /**
30
- * @var AwsClientInterface Client used to transfer requests
31
- */
32
- protected $client;
33
-
34
- /**
35
- * @var TransferStateInterface State of the transfer
36
- */
37
- protected $state;
38
-
39
- /**
40
- * @var EntityBody Source of the data
41
- */
42
- protected $source;
43
-
44
- /**
45
- * @var array Array of headers to set on the object
46
- */
47
- protected $headers = array();
48
-
49
- /**
50
- * Return a new instance of the UploadBuilder
51
- *
52
- * @return static
53
- */
54
- public static function newInstance()
55
- {
56
- return new static;
57
- }
58
-
59
- /**
60
- * Set the client used to connect to the AWS service
61
- *
62
- * @param AwsClientInterface $client Client to use
63
- *
64
- * @return $this
65
- */
66
- public function setClient(AwsClientInterface $client)
67
- {
68
- $this->client = $client;
69
-
70
- return $this;
71
- }
72
-
73
- /**
74
- * Set the state of the upload. This is useful for resuming from a previously started multipart upload.
75
- * You must use a local file stream as the data source if you wish to resume from a previous upload.
76
- *
77
- * @param TransferStateInterface|string $state Pass a TransferStateInterface object or the ID of the initiated
78
- * multipart upload. When an ID is passed, the builder will create a
79
- * state object using the data from a ListParts API response.
80
- *
81
- * @return $this
82
- */
83
- public function resumeFrom($state)
84
- {
85
- $this->state = $state;
86
-
87
- return $this;
88
- }
89
-
90
- /**
91
- * Set the data source of the transfer
92
- *
93
- * @param resource|string|EntityBody $source Source of the transfer. Pass a string to transfer from a file on disk.
94
- * You can also stream from a resource returned from fopen or a Guzzle
95
- * {@see EntityBody} object.
96
- *
97
- * @return $this
98
- * @throws InvalidArgumentException when the source cannot be found or opened
99
- */
100
- public function setSource($source)
101
- {
102
- // Use the contents of a file as the data source
103
- if (is_string($source)) {
104
- if (!file_exists($source)) {
105
- throw new InvalidArgumentException("File does not exist: {$source}");
106
- }
107
- // Clear the cache so that we send accurate file sizes
108
- clearstatcache(true, $source);
109
- $source = fopen($source, 'r');
110
- }
111
-
112
- $this->source = EntityBody::factory($source);
113
-
114
- if ($this->source->isSeekable() && $this->source->getSize() == 0) {
115
- throw new InvalidArgumentException('Empty body provided to upload builder');
116
- }
117
-
118
- return $this;
119
- }
120
-
121
- /**
122
- * Specify the headers to set on the upload
123
- *
124
- * @param array $headers Headers to add to the uploaded object
125
- *
126
- * @return $this
127
- */
128
- public function setHeaders(array $headers)
129
- {
130
- $this->headers = $headers;
131
-
132
- return $this;
133
- }
134
-
135
- /**
136
- * Build the appropriate uploader based on the builder options
137
- *
138
- * @return TransferInterface
139
- */
140
- abstract public function build();
141
-
142
- /**
143
- * Initiate the multipart upload
144
- *
145
- * @return TransferStateInterface
146
- */
147
- abstract protected function initiateMultipartUpload();
148
- }
1
+ <?php
2
+ /**
3
+ * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ namespace Aws\Common\Model\MultipartUpload;
18
+
19
+ use Aws\Common\Client\AwsClientInterface;
20
+ use Aws\Common\Exception\InvalidArgumentException;
21
+ use Guzzle\Http\EntityBody;
22
+
23
+ /**
24
+ * Easily create a multipart uploader used to quickly and reliably upload a
25
+ * large file or data stream to Amazon S3 using multipart uploads
26
+ */
27
+ abstract class AbstractUploadBuilder
28
+ {
29
+ /**
30
+ * @var AwsClientInterface Client used to transfer requests
31
+ */
32
+ protected $client;
33
+
34
+ /**
35
+ * @var TransferStateInterface State of the transfer
36
+ */
37
+ protected $state;
38
+
39
+ /**
40
+ * @var EntityBody Source of the data
41
+ */
42
+ protected $source;
43
+
44
+ /**
45
+ * @var array Array of headers to set on the object
46
+ */
47
+ protected $headers = array();
48
+
49
+ /**
50
+ * Return a new instance of the UploadBuilder
51
+ *
52
+ * @return static
53
+ */
54
+ public static function newInstance()
55
+ {
56
+ return new static;
57
+ }
58
+
59
+ /**
60
+ * Set the client used to connect to the AWS service
61
+ *
62
+ * @param AwsClientInterface $client Client to use
63
+ *
64
+ * @return $this
65
+ */
66
+ public function setClient(AwsClientInterface $client)
67
+ {
68
+ $this->client = $client;
69
+
70
+ return $this;
71
+ }
72
+
73
+ /**
74
+ * Set the state of the upload. This is useful for resuming from a previously started multipart upload.
75
+ * You must use a local file stream as the data source if you wish to resume from a previous upload.
76
+ *
77
+ * @param TransferStateInterface|string $state Pass a TransferStateInterface object or the ID of the initiated
78
+ * multipart upload. When an ID is passed, the builder will create a
79
+ * state object using the data from a ListParts API response.
80
+ *
81
+ * @return $this
82
+ */
83
+ public function resumeFrom($state)
84
+ {
85
+ $this->state = $state;
86
+
87
+ return $this;
88
+ }
89
+
90
+ /**
91
+ * Set the data source of the transfer
92
+ *
93
+ * @param resource|string|EntityBody $source Source of the transfer. Pass a string to transfer from a file on disk.
94
+ * You can also stream from a resource returned from fopen or a Guzzle
95
+ * {@see EntityBody} object.
96
+ *
97
+ * @return $this
98
+ * @throws InvalidArgumentException when the source cannot be found or opened
99
+ */
100
+ public function setSource($source)
101
+ {
102
+ // Use the contents of a file as the data source
103
+ if (is_string($source)) {
104
+ if (!file_exists($source)) {
105
+ throw new InvalidArgumentException("File does not exist: {$source}");
106
+ }
107
+ // Clear the cache so that we send accurate file sizes
108
+ clearstatcache(true, $source);
109
+ $source = fopen($source, 'r');
110
+ }
111
+
112
+ $this->source = EntityBody::factory($source);
113
+
114
+ if ($this->source->isSeekable() && $this->source->getSize() == 0) {
115
+ throw new InvalidArgumentException('Empty body provided to upload builder');
116
+ }
117
+
118
+ return $this;
119
+ }
120
+
121
+ /**
122
+ * Specify the headers to set on the upload
123
+ *
124
+ * @param array $headers Headers to add to the uploaded object
125
+ *
126
+ * @return $this
127
+ */
128
+ public function setHeaders(array $headers)
129
+ {
130
+ $this->headers = $headers;
131
+
132
+ return $this;
133
+ }
134
+
135
+ /**
136
+ * Build the appropriate uploader based on the builder options
137
+ *
138
+ * @return TransferInterface
139
+ */
140
+ abstract public function build();
141
+
142
+ /**
143
+ * Initiate the multipart upload
144
+ *
145
+ * @return TransferStateInterface
146
+ */
147
+ abstract protected function initiateMultipartUpload();
148
+ }
vendor/Aws/Common/Resources/aws-config.php CHANGED
@@ -1,272 +1,272 @@
1
- <?php
2
- /**
3
- * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- return array(
18
- 'class' => 'Aws\Common\Aws',
19
- 'services' => array(
20
-
21
- 'default_settings' => array(
22
- 'params' => array()
23
- ),
24
-
25
- 'autoscaling' => array(
26
- 'alias' => 'AutoScaling',
27
- 'extends' => 'default_settings',
28
- 'class' => 'Aws\AutoScaling\AutoScalingClient'
29
- ),
30
-
31
- 'cloudformation' => array(
32
- 'alias' => 'CloudFormation',
33
- 'extends' => 'default_settings',
34
- 'class' => 'Aws\CloudFormation\CloudFormationClient'
35
- ),
36
-
37
- 'cloudfront' => array(
38
- 'alias' => 'CloudFront',
39
- 'extends' => 'default_settings',
40
- 'class' => 'Aws\CloudFront\CloudFrontClient'
41
- ),
42
-
43
- 'cloudfront_20120505' => array(
44
- 'extends' => 'cloudfront',
45
- 'params' => array(
46
- 'version' => '2012-05-05'
47
- )
48
- ),
49
-
50
- 'cloudsearch' => array(
51
- 'alias' => 'CloudSearch',
52
- 'extends' => 'default_settings',
53
- 'class' => 'Aws\CloudSearch\CloudSearchClient'
54
- ),
55
-
56
- 'cloudsearch_20110201' => array(
57
- 'extends' => 'cloudsearch',
58
- 'params' => array(
59
- 'version' => '2011-02-01'
60
- )
61
- ),
62
-
63
- 'cloudsearchdomain' => array(
64
- 'alias' => 'CloudSearchDomain',
65
- 'extends' => 'default_settings',
66
- 'class' => 'Aws\CloudSearchDomain\CloudSearchDomainClient'
67
- ),
68
-
69
- 'cloudtrail' => array(
70
- 'alias' => 'CloudTrail',
71
- 'extends' => 'default_settings',
72
- 'class' => 'Aws\CloudTrail\CloudTrailClient'
73
- ),
74
-
75
- 'cloudwatch' => array(
76
- 'alias' => 'CloudWatch',
77
- 'extends' => 'default_settings',
78
- 'class' => 'Aws\CloudWatch\CloudWatchClient'
79
- ),
80
-
81
- 'cognito-identity' => array(
82
- 'alias' => 'CognitoIdentity',
83
- 'extends' => 'default_settings',
84
- 'class' => 'Aws\CognitoIdentity\CognitoIdentityClient'
85
- ),
86
-
87
- 'cognitoidentity' => array('extends' => 'cognito-identity'),
88
-
89
- 'cognito-sync' => array(
90
- 'alias' => 'CognitoSync',
91
- 'extends' => 'default_settings',
92
- 'class' => 'Aws\CognitoSync\CognitoSyncClient'
93
- ),
94
-
95
- 'cognitosync' => array('extends' => 'cognito-sync'),
96
-
97
- 'cloudwatchlogs' => array(
98
- 'alias' => 'CloudWatchLogs',
99
- 'extends' => 'default_settings',
100
- 'class' => 'Aws\CloudWatchLogs\CloudWatchLogsClient'
101
- ),
102
-
103
- 'datapipeline' => array(
104
- 'alias' => 'DataPipeline',
105
- 'extends' => 'default_settings',
106
- 'class' => 'Aws\DataPipeline\DataPipelineClient'
107
- ),
108
-
109
- 'directconnect' => array(
110
- 'alias' => 'DirectConnect',
111
- 'extends' => 'default_settings',
112
- 'class' => 'Aws\DirectConnect\DirectConnectClient'
113
- ),
114
-
115
- 'dynamodb' => array(
116
- 'alias' => 'DynamoDb',
117
- 'extends' => 'default_settings',
118
- 'class' => 'Aws\DynamoDb\DynamoDbClient'
119
- ),
120
-
121
- 'dynamodb_20111205' => array(
122
- 'extends' => 'dynamodb',
123
- 'params' => array(
124
- 'version' => '2011-12-05'
125
- )
126
- ),
127
-
128
- 'ec2' => array(
129
- 'alias' => 'Ec2',
130
- 'extends' => 'default_settings',
131
- 'class' => 'Aws\Ec2\Ec2Client'
132
- ),
133
-
134
- 'elasticache' => array(
135
- 'alias' => 'ElastiCache',
136
- 'extends' => 'default_settings',
137
- 'class' => 'Aws\ElastiCache\ElastiCacheClient'
138
- ),
139
-
140
- 'elasticbeanstalk' => array(
141
- 'alias' => 'ElasticBeanstalk',
142
- 'extends' => 'default_settings',
143
- 'class' => 'Aws\ElasticBeanstalk\ElasticBeanstalkClient'
144
- ),
145
-
146
- 'elasticloadbalancing' => array(
147
- 'alias' => 'ElasticLoadBalancing',
148
- 'extends' => 'default_settings',
149
- 'class' => 'Aws\ElasticLoadBalancing\ElasticLoadBalancingClient'
150
- ),
151
-
152
- 'elastictranscoder' => array(
153
- 'alias' => 'ElasticTranscoder',
154
- 'extends' => 'default_settings',
155
- 'class' => 'Aws\ElasticTranscoder\ElasticTranscoderClient'
156
- ),
157
-
158
- 'emr' => array(
159
- 'alias' => 'Emr',
160
- 'extends' => 'default_settings',
161
- 'class' => 'Aws\Emr\EmrClient'
162
- ),
163
-
164
- 'glacier' => array(
165
- 'alias' => 'Glacier',
166
- 'extends' => 'default_settings',
167
- 'class' => 'Aws\Glacier\GlacierClient'
168
- ),
169
-
170
- 'kinesis' => array(
171
- 'alias' => 'Kinesis',
172
- 'extends' => 'default_settings',
173
- 'class' => 'Aws\Kinesis\KinesisClient'
174
- ),
175
-
176
- 'iam' => array(
177
- 'alias' => 'Iam',
178
- 'extends' => 'default_settings',
179
- 'class' => 'Aws\Iam\IamClient'
180
- ),
181
-
182
- 'importexport' => array(
183
- 'alias' => 'ImportExport',
184
- 'extends' => 'default_settings',
185
- 'class' => 'Aws\ImportExport\ImportExportClient'
186
- ),
187
-
188
- 'opsworks' => array(
189
- 'alias' => 'OpsWorks',
190
- 'extends' => 'default_settings',
191
- 'class' => 'Aws\OpsWorks\OpsWorksClient'
192
- ),
193
-
194
- 'rds' => array(
195
- 'alias' => 'Rds',
196
- 'extends' => 'default_settings',
197
- 'class' => 'Aws\Rds\RdsClient'
198
- ),
199
-
200
- 'redshift' => array(
201
- 'alias' => 'Redshift',
202
- 'extends' => 'default_settings',
203
- 'class' => 'Aws\Redshift\RedshiftClient'
204
- ),
205
-
206
- 'route53' => array(
207
- 'alias' => 'Route53',
208
- 'extends' => 'default_settings',
209
- 'class' => 'Aws\Route53\Route53Client'
210
- ),
211
-
212
- 'route53domains' => array(
213
- 'alias' => 'Route53Domains',
214
- 'extends' => 'default_settings',
215
- 'class' => 'Aws\Route53Domains\Route53DomainsClient'
216
- ),
217
-
218
- 's3' => array(
219
- 'alias' => 'S3',
220
- 'extends' => 'default_settings',
221
- 'class' => 'Aws\S3\S3Client'
222
- ),
223
-
224
- 'sdb' => array(
225
- 'alias' => 'SimpleDb',
226
- 'extends' => 'default_settings',
227
- 'class' => 'Aws\SimpleDb\SimpleDbClient'
228
- ),
229
-
230
- 'ses' => array(
231
- 'alias' => 'Ses',
232
- 'extends' => 'default_settings',
233
- 'class' => 'Aws\Ses\SesClient'
234
- ),
235
-
236
- 'sns' => array(
237
- 'alias' => 'Sns',
238
- 'extends' => 'default_settings',
239
- 'class' => 'Aws\Sns\SnsClient'
240
- ),
241
-
242
- 'sqs' => array(
243
- 'alias' => 'Sqs',
244
- 'extends' => 'default_settings',
245
- 'class' => 'Aws\Sqs\SqsClient'
246
- ),
247
-
248
- 'storagegateway' => array(
249
- 'alias' => 'StorageGateway',
250
- 'extends' => 'default_settings',
251
- 'class' => 'Aws\StorageGateway\StorageGatewayClient'
252
- ),
253
-
254
- 'sts' => array(
255
- 'alias' => 'Sts',
256
- 'extends' => 'default_settings',
257
- 'class' => 'Aws\Sts\StsClient'
258
- ),
259
-
260
- 'support' => array(
261
- 'alias' => 'Support',
262
- 'extends' => 'default_settings',
263
- 'class' => 'Aws\Support\SupportClient'
264
- ),
265
-
266
- 'swf' => array(
267
- 'alias' => 'Swf',
268
- 'extends' => 'default_settings',
269
- 'class' => 'Aws\Swf\SwfClient'
270
- ),
271
- )
272
- );
1
+ <?php
2
+ /**
3
+ * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ return array(
18
+ 'class' => 'Aws\Common\Aws',
19
+ 'services' => array(
20
+
21
+ 'default_settings' => array(
22
+ 'params' => array()
23
+ ),
24
+
25
+ 'autoscaling' => array(
26
+ 'alias' => 'AutoScaling',
27
+ 'extends' => 'default_settings',
28
+ 'class' => 'Aws\AutoScaling\AutoScalingClient'
29
+ ),
30
+
31
+ 'cloudformation' => array(
32
+ 'alias' => 'CloudFormation',
33
+ 'extends' => 'default_settings',
34
+ 'class' => 'Aws\CloudFormation\CloudFormationClient'
35
+ ),
36
+
37
+ 'cloudfront' => array(
38
+ 'alias' => 'CloudFront',
39
+ 'extends' => 'default_settings',
40
+ 'class' => 'Aws\CloudFront\CloudFrontClient'
41
+ ),
42
+
43
+ 'cloudfront_20120505' => array(
44
+ 'extends' => 'cloudfront',
45
+ 'params' => array(
46
+ 'version' => '2012-05-05'
47
+ )
48
+ ),
49
+
50
+ 'cloudsearch' => array(
51
+ 'alias' => 'CloudSearch',
52
+ 'extends' => 'default_settings',
53
+ 'class' => 'Aws\CloudSearch\CloudSearchClient'
54
+ ),
55
+
56
+ 'cloudsearch_20110201' => array(
57
+ 'extends' => 'cloudsearch',
58
+ 'params' => array(
59
+ 'version' => '2011-02-01'
60
+ )
61
+ ),
62
+
63
+ 'cloudsearchdomain' => array(
64
+ 'alias' => 'CloudSearchDomain',
65
+ 'extends' => 'default_settings',
66
+ 'class' => 'Aws\CloudSearchDomain\CloudSearchDomainClient'
67
+ ),
68
+
69
+ 'cloudtrail' => array(
70
+ 'alias' => 'CloudTrail',
71
+ 'extends' => 'default_settings',
72
+ 'class' => 'Aws\CloudTrail\CloudTrailClient'
73
+ ),
74
+
75
+ 'cloudwatch' => array(
76
+ 'alias' => 'CloudWatch',
77
+ 'extends' => 'default_settings',
78
+ 'class' => 'Aws\CloudWatch\CloudWatchClient'
79
+ ),
80
+
81
+ 'cognito-identity' => array(
82
+ 'alias' => 'CognitoIdentity',
83
+ 'extends' => 'default_settings',
84
+ 'class' => 'Aws\CognitoIdentity\CognitoIdentityClient'
85
+ ),
86
+
87
+ 'cognitoidentity' => array('extends' => 'cognito-identity'),
88
+
89
+ 'cognito-sync' => array(
90
+ 'alias' => 'CognitoSync',
91
+ 'extends' => 'default_settings',
92
+ 'class' => 'Aws\CognitoSync\CognitoSyncClient'
93
+ ),
94
+
95
+ 'cognitosync' => array('extends' => 'cognito-sync'),
96
+
97
+ 'cloudwatchlogs' => array(
98
+ 'alias' => 'CloudWatchLogs',
99
+ 'extends' => 'default_settings',
100
+ 'class' => 'Aws\CloudWatchLogs\CloudWatchLogsClient'
101
+ ),
102
+
103
+ 'datapipeline' => array(
104
+ 'alias' => 'DataPipeline',
105
+ 'extends' => 'default_settings',
106
+ 'class' => 'Aws\DataPipeline\DataPipelineClient'
107
+ ),
108
+
109
+ 'directconnect' => array(
110
+ 'alias' => 'DirectConnect',
111
+ 'extends' => 'default_settings',
112
+ 'class' => 'Aws\DirectConnect\DirectConnectClient'
113
+ ),
114
+
115
+ 'dynamodb' => array(
116
+ 'alias' => 'DynamoDb',
117
+ 'extends' => 'default_settings',
118
+ 'class' => 'Aws\DynamoDb\DynamoDbClient'
119
+ ),
120
+
121
+ 'dynamodb_20111205' => array(
122
+ 'extends' => 'dynamodb',
123
+ 'params' => array(
124
+ 'version' => '2011-12-05'
125
+ )
126
+ ),
127
+
128
+ 'ec2' => array(
129
+ 'alias' => 'Ec2',
130
+ 'extends' => 'default_settings',
131
+ 'class' => 'Aws\Ec2\Ec2Client'
132
+ ),
133
+
134
+ 'elasticache' => array(
135
+ 'alias' => 'ElastiCache',
136
+ 'extends' => 'default_settings',
137
+ 'class' => 'Aws\ElastiCache\ElastiCacheClient'
138
+ ),
139
+
140
+ 'elasticbeanstalk' => array(
141
+ 'alias' => 'ElasticBeanstalk',
142
+ 'extends' => 'default_settings',
143
+ 'class' => 'Aws\ElasticBeanstalk\ElasticBeanstalkClient'
144
+ ),
145
+
146
+ 'elasticloadbalancing' => array(
147
+ 'alias' => 'ElasticLoadBalancing',
148
+ 'extends' => 'default_settings',
149
+ 'class' => 'Aws\ElasticLoadBalancing\ElasticLoadBalancingClient'
150
+ ),
151
+
152
+ 'elastictranscoder' => array(
153
+ 'alias' => 'ElasticTranscoder',
154
+ 'extends' => 'default_settings',
155
+ 'class' => 'Aws\ElasticTranscoder\ElasticTranscoderClient'
156
+ ),
157
+
158
+ 'emr' => array(
159
+ 'alias' => 'Emr',
160
+ 'extends' => 'default_settings',
161
+ 'class' => 'Aws\Emr\EmrClient'
162
+ ),
163
+
164
+ 'glacier' => array(
165
+ 'alias' => 'Glacier',
166
+ 'extends' => 'default_settings',
167
+ 'class' => 'Aws\Glacier\GlacierClient'
168
+ ),
169
+
170
+ 'kinesis' => array(
171
+ 'alias' => 'Kinesis',
172
+ 'extends' => 'default_settings',
173
+ 'class' => 'Aws\Kinesis\KinesisClient'
174
+ ),
175
+
176
+ 'iam' => array(
177
+ 'alias' => 'Iam',
178
+ 'extends' => 'default_settings',
179
+ 'class' => 'Aws\Iam\IamClient'
180
+ ),
181
+
182
+ 'importexport' => array(
183
+ 'alias' => 'ImportExport',
184
+ 'extends' => 'default_settings',
185
+ 'class' => 'Aws\ImportExport\ImportExportClient'
186
+ ),
187
+
188
+ 'opsworks' => array(
189
+ 'alias' => 'OpsWorks',
190
+ 'extends' => 'default_settings',
191
+ 'class' => 'Aws\OpsWorks\OpsWorksClient'
192
+ ),
193
+
194
+ 'rds' => array(
195
+ 'alias' => 'Rds',
196
+ 'extends' => 'default_settings',
197
+ 'class' => 'Aws\Rds\RdsClient'
198
+ ),
199
+
200
+ 'redshift' => array(
201
+ 'alias' => 'Redshift',
202
+ 'extends' => 'default_settings',
203
+ 'class' => 'Aws\Redshift\RedshiftClient'
204
+ ),
205
+
206
+ 'route53' => array(
207
+ 'alias' => 'Route53',
208
+ 'extends' => 'default_settings',
209
+ 'class' => 'Aws\Route53\Route53Client'
210
+ ),
211
+
212
+ 'route53domains' => array(
213
+ 'alias' => 'Route53Domains',
214
+ 'extends' => 'default_settings',
215
+ 'class' => 'Aws\Route53Domains\Route53DomainsClient'
216
+ ),
217
+
218
+ 's3' => array(
219
+ 'alias' => 'S3',
220
+ 'extends' => 'default_settings',
221
+ 'class' => 'Aws\S3\S3Client'
222
+ ),
223
+
224
+ 'sdb' => array(
225
+ 'alias' => 'SimpleDb',
226
+ 'extends' => 'default_settings',
227
+ 'class' => 'Aws\SimpleDb\SimpleDbClient'
228
+ ),
229
+
230
+ 'ses' => array(
231
+ 'alias' => 'Ses',
232
+ 'extends' => 'default_settings',
233
+ 'class' => 'Aws\Ses\SesClient'
234
+ ),
235
+
236
+ 'sns' => array(
237
+ 'alias' => 'Sns',
238
+ 'extends' => 'default_settings',
239
+ 'class' => 'Aws\Sns\SnsClient'
240
+ ),
241
+
242
+ 'sqs' => array(
243
+ 'alias' => 'Sqs',
244
+ 'extends' => 'default_settings',
245
+ 'class' => 'Aws\Sqs\SqsClient'
246
+ ),
247
+
248
+ 'storagegateway' => array(
249
+ 'alias' => 'StorageGateway',
250
+ 'extends' => 'default_settings',
251
+ 'class' => 'Aws\StorageGateway\StorageGatewayClient'
252
+ ),
253
+
254
+ 'sts' => array(
255
+ 'alias' => 'Sts',
256
+ 'extends' => 'default_settings',
257
+ 'class' => 'Aws\Sts\StsClient'
258
+ ),
259
+
260
+ 'support' => array(
261
+ 'alias' => 'Support',
262
+ 'extends' => 'default_settings',
263
+ 'class' => 'Aws\Support\SupportClient'
264
+ ),
265
+
266
+ 'swf' => array(
267
+ 'alias' => 'Swf',
268
+ 'extends' => 'default_settings',
269
+ 'class' => 'Aws\Swf\SwfClient'
270
+ ),
271
+ )
272
+ );
vendor/Aws/Common/Resources/public-endpoints.php CHANGED
@@ -1,67 +1,67 @@
1
- <?php
2
- return array(
3
- 'version' => 2,
4
- 'endpoints' => array(
5
- '*/*' => array(
6
- 'endpoint' => '{service}.{region}.amazonaws.com'
7
- ),
8
- 'cn-north-1/*' => array(
9
- 'endpoint' => '{service}.{region}.amazonaws.com.cn',
10
- 'signatureVersion' => 'v4'
11
- ),
12
- 'us-gov-west-1/iam' => array(
13
- 'endpoint' => 'iam.us-gov.amazonaws.com'
14
- ),
15
- 'us-gov-west-1/sts' => array(
16
- 'endpoint' => 'sts.us-gov.amazonaws.com'
17
- ),
18
- 'us-gov-west-1/s3' => array(
19
- 'endpoint' => 's3-{region}.amazonaws.com'
20
- ),
21
- '*/cloudfront' => array(
22
- 'endpoint' => 'cloudfront.amazonaws.com'
23
- ),
24
- '*/iam' => array(
25
- 'endpoint' => 'iam.amazonaws.com'
26
- ),
27
- '*/importexport' => array(
28
- 'endpoint' => 'importexport.amazonaws.com'
29
- ),
30
- '*/route53' => array(
31
- 'endpoint' => 'route53.amazonaws.com'
32
- ),
33
- '*/sts' => array(
34
- 'endpoint' => 'sts.amazonaws.com'
35
- ),
36
- 'us-east-1/sdb' => array(
37
- 'endpoint' => 'sdb.amazonaws.com'
38
- ),
39
- 'us-east-1/s3' => array(
40
- 'endpoint' => 's3.amazonaws.com'
41
- ),
42
- 'us-west-1/s3' => array(
43
- 'endpoint' => 's3-{region}.amazonaws.com'
44
- ),
45
- 'us-west-2/s3' => array(
46
- 'endpoint' => 's3-{region}.amazonaws.com'
47
- ),
48
- 'eu-west-1/s3' => array(
49
- 'endpoint' => 's3-{region}.amazonaws.com'
50
- ),
51
- 'eu-central-1/s3' => array(
52
- 'endpoint' => 's3-{region}.amazonaws.com'
53
- ),
54
- 'ap-southeast-1/s3' => array(
55
- 'endpoint' => 's3-{region}.amazonaws.com'
56
- ),
57
- 'ap-southeast-2/s3' => array(
58
- 'endpoint' => 's3-{region}.amazonaws.com'
59
- ),
60
- 'ap-northeast-1/s3' => array(
61
- 'endpoint' => 's3-{region}.amazonaws.com'
62
- ),
63
- 'sa-east-1/s3' => array(
64
- 'endpoint' => 's3-{region}.amazonaws.com'
65
- )
66
- )
67
- );
1
+ <?php
2
+ return array(
3
+ 'version' => 2,
4
+ 'endpoints' => array(
5
+ '*/*' => array(
6
+ 'endpoint' => '{service}.{region}.amazonaws.com'
7
+ ),
8
+ 'cn-north-1/*' => array(
9
+ 'endpoint' => '{service}.{region}.amazonaws.com.cn',
10
+ 'signatureVersion' => 'v4'
11
+ ),
12
+ 'us-gov-west-1/iam' => array(
13
+ 'endpoint' => 'iam.us-gov.amazonaws.com'
14
+ ),
15
+ 'us-gov-west-1/sts' => array(
16
+ 'endpoint' => 'sts.us-gov.amazonaws.com'
17
+ ),
18
+ 'us-gov-west-1/s3' => array(
19
+ 'endpoint' => 's3-{region}.amazonaws.com'
20
+ ),
21
+ '*/cloudfront' => array(
22
+ 'endpoint' => 'cloudfront.amazonaws.com'
23
+ ),
24
+ '*/iam' => array(
25
+ 'endpoint' => 'iam.amazonaws.com'
26
+ ),
27
+ '*/importexport' => array(
28
+ 'endpoint' => 'importexport.amazonaws.com'
29
+ ),
30
+ '*/route53' => array(
31
+ 'endpoint' => 'route53.amazonaws.com'
32
+ ),
33
+ '*/sts' => array(
34
+ 'endpoint' => 'sts.amazonaws.com'
35
+ ),
36
+ 'us-east-1/sdb' => array(
37
+ 'endpoint' => 'sdb.amazonaws.com'
38
+ ),
39
+ 'us-east-1/s3' => array(
40
+ 'endpoint' => 's3.amazonaws.com'
41
+ ),
42
+ 'us-west-1/s3' => array(
43
+ 'endpoint' => 's3-{region}.amazonaws.com'
44
+ ),
45
+ 'us-west-2/s3' => array(
46
+ 'endpoint' => 's3-{region}.amazonaws.com'
47
+ ),
48
+ 'eu-west-1/s3' => array(
49
+ 'endpoint' => 's3-{region}.amazonaws.com'
50
+ ),
51
+ 'eu-central-1/s3' => array(
52
+ 'endpoint' => 's3-{region}.amazonaws.com'
53
+ ),
54
+ 'ap-southeast-1/s3' => array(
55
+ 'endpoint' => 's3-{region}.amazonaws.com'
56
+ ),
57
+ 'ap-southeast-2/s3' => array(
58
+ 'endpoint' => 's3-{region}.amazonaws.com'
59
+ ),
60
+ 'ap-northeast-1/s3' => array(
61
+ 'endpoint' => 's3-{region}.amazonaws.com'
62
+ ),
63
+ 'sa-east-1/s3' => array(
64
+ 'endpoint' => 's3-{region}.amazonaws.com'
65
+ )
66
+ )
67
+ );
vendor/Aws/Common/RulesEndpointProvider.php CHANGED
@@ -1,67 +1,67 @@
1
- <?php
2
- namespace Aws\Common;
3
-
4
- /**
5
- * Provides endpoints based on a rules configuration file.
6
- */
7
- class RulesEndpointProvider
8
- {
9
- /** @var array */
10
- private $patterns;
11
-
12
- /**
13
- * @param array $patterns Hash of endpoint patterns mapping to endpoint
14
- * configurations.
15
- */
16
- public function __construct(array $patterns)
17
- {
18
- $this->patterns = $patterns;
19
- }
20
-
21
- /**
22
- * Creates and returns the default RulesEndpointProvider based on the
23
- * public rule sets.
24
- *
25
- * @return self
26
- */
27
- public static function fromDefaults()
28
- {
29
- return new self(require __DIR__ . '/Resources/public-endpoints.php');
30
- }
31
-
32
- public function __invoke(array $args = array())
33
- {
34
- if (!isset($args['service'])) {
35
- throw new \InvalidArgumentException('Requires a "service" value');
36
- }
37
-
38
- if (!isset($args['region'])) {
39
- throw new \InvalidArgumentException('Requires a "region" value');
40
- }
41
-
42
- foreach ($this->getKeys($args['region'], $args['service']) as $key) {
43
- if (isset($this->patterns['endpoints'][$key])) {
44
- return $this->expand($this->patterns['endpoints'][$key], $args);
45
- }
46
- }
47
-
48
- throw new \RuntimeException('Could not resolve endpoint');
49
- }
50
-
51
- private function expand(array $config, array $args)
52
- {
53
- $scheme = isset($args['scheme']) ? $args['scheme'] : 'https';
54
- $config['endpoint'] = $scheme . '://' . str_replace(
55
- array('{service}', '{region}'),
56
- array($args['service'], $args['region']),
57
- $config['endpoint']
58
- );
59
-
60
- return $config;
61
- }
62
-
63
- private function getKeys($region, $service)
64
- {
65
- return array("$region/$service", "$region/*", "*/$service", "*/*");
66
- }
67
- }
1
+ <?php
2
+ namespace Aws\Common;
3
+
4
+ /**
5
+ * Provides endpoints based on a rules configuration file.
6
+ */
7
+ class RulesEndpointProvider
8
+ {
9
+ /** @var array */
10
+ private $patterns;
11
+
12
+ /**
13
+ * @param array $patterns Hash of endpoint patterns mapping to endpoint
14
+ * configurations.
15
+ */
16
+ public function __construct(array $patterns)
17
+ {
18
+ $this->patterns = $patterns;
19
+ }
20
+
21
+ /**
22
+ * Creates and returns the default RulesEndpointProvider based on the
23
+ * public rule sets.
24
+ *
25
+ * @return self
26
+ */
27
+ public static function fromDefaults()
28
+ {
29
+ return new self(require __DIR__ . '/Resources/public-endpoints.php');
30
+ }
31
+
32
+ public function __invoke(array $args = array())
33
+ {
34
+ if (!isset($args['service'])) {
35
+ throw new \InvalidArgumentException('Requires a "service" value');
36
+ }
37
+
38
+ if (!isset($args['region'])) {
39
+ throw new \InvalidArgumentException('Requires a "region" value');
40
+ }
41
+
42
+ foreach ($this->getKeys($args['region'], $args['service']) as $key) {
43
+ if (isset($this->patterns['endpoints'][$key])) {
44
+ return $this->expand($this->patterns['endpoints'][$key], $args);
45
+ }
46
+ }
47
+
48
+ throw new \RuntimeException('Could not resolve endpoint');
49
+ }
50
+
51
+ private function expand(array $config, array $args)
52
+ {
53
+ $scheme = isset($args['scheme']) ? $args['scheme'] : 'https';
54
+ $config['endpoint'] = $scheme . '://' . str_replace(
55
+ array('{service}', '{region}'),
56
+ array($args['service'], $args['region']),
57
+ $config['endpoint']
58
+ );
59
+
60
+ return $config;
61
+ }
62
+
63
+ private function getKeys($region, $service)
64
+ {
65
+ return array("$region/$service", "$region/*", "*/$service", "*/*");
66
+ }
67
+ }
vendor/Aws/Common/Signature/AbstractSignature.php CHANGED
@@ -1,44 +1,44 @@
1
- <?php
2
- /**
3
- * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- namespace Aws\Common\Signature;
18
-
19
- use Aws\Common\Credentials\CredentialsInterface;
20
- use Guzzle\Http\Message\RequestInterface;
21
-
22
- abstract class AbstractSignature implements SignatureInterface
23
- {
24
- /**
25
- * Provides the timestamp used for the class (used for mocking PHP's time() function)
26
- *
27
- * @return int
28
- */
29
- protected function getTimestamp()
30
- {
31
- return time();
32
- }
33
-
34
- /**
35
- * @codeCoverageIgnore
36
- */
37
- public function createPresignedUrl(
38
- RequestInterface $request,
39
- CredentialsInterface $credentials,
40
- $expires
41
- ) {
42
- throw new \BadMethodCallException(__METHOD__ . ' not implemented');
43
- }
44
- }
1
+ <?php
2
+ /**
3
+ * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ namespace Aws\Common\Signature;
18
+
19
+ use Aws\Common\Credentials\CredentialsInterface;
20
+ use Guzzle\Http\Message\RequestInterface;
21
+
22
+ abstract class AbstractSignature implements SignatureInterface
23
+ {
24
+ /**
25
+ * Provides the timestamp used for the class (used for mocking PHP's time() function)
26
+ *
27
+ * @return int
28
+ */
29
+ protected function getTimestamp()
30
+ {
31
+ return time();
32
+ }
33
+
34
+ /**
35
+ * @codeCoverageIgnore
36
+ */
37
+ public function createPresignedUrl(
38
+ RequestInterface $request,
39
+ CredentialsInterface $credentials,
40
+ $expires
41
+ ) {
42
+ throw new \BadMethodCallException(__METHOD__ . ' not implemented');
43
+ }
44
+ }
vendor/Aws/Common/Signature/SignatureInterface.php CHANGED
@@ -1,52 +1,52 @@
1
- <?php
2
- /**
3
- * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
- *
5
- * Licensed under the Apache License, Version 2.0 (the "License").
6
- * You may not use this file except in compliance with the License.
7
- * A copy of the License is located at
8
- *
9
- * http://aws.amazon.com/apache2.0
10
- *
11
- * or in the "license" file accompanying this file. This file is distributed
12
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
- * express or implied. See the License for the specific language governing
14
- * permissions and limitations under the License.
15
- */
16
-
17
- namespace Aws\Common\Signature;
18
-
19
- use Aws\Common\Credentials\CredentialsInterface;
20
- use Guzzle\Http\Message\RequestInterface;
21
-
22
- /**
23
- * Interface used to provide interchangeable strategies for signing requests
24
- * using the various AWS signature protocols.
25
- */
26
- interface SignatureInterface
27
- {
28
- /**
29
- * Signs the specified request with an AWS signing protocol by using the
30
- * provided AWS account credentials and adding the required headers to the
31
- * request.
32
- *
33
- * @param RequestInterface $request Request to add a signature to
34
- * @param CredentialsInterface $credentials Signing credentials
35
- */
36
- public function signRequest(RequestInterface $request, CredentialsInterface $credentials);
37
-
38
- /**
39
- * Create a pre-signed URL
40
- *
41
- * @param RequestInterface $request Request to sign
42
- * @param CredentialsInterface $credentials Credentials used to sign
43
- * @param int|string|\DateTime $expires The time at which the URL should expire. This can be a Unix timestamp, a
44
- * PHP DateTime object, or a string that can be evaluated by strtotime
45
- * @return string
46
- */
47
- public function createPresignedUrl(
48
- RequestInterface $request,
49
- CredentialsInterface $credentials,
50
- $expires
51
- );
52
- }
1
+ <?php
2
+ /**
3
+ * Copyright 2010-2013 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License").
6
+ * You may not use this file except in compliance with the License.
7
+ * A copy of the License is located at
8
+ *
9
+ * http://aws.amazon.com/apache2.0
10
+ *
11
+ * or in the "license" file accompanying this file. This file is distributed
12
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13
+ * express or implied. See the License for the specific language governing
14
+ * permissions and limitations under the License.
15
+ */
16
+
17
+ namespace Aws\Common\Signature;
18
+
19
+ use Aws\Common\Credentials\CredentialsInterface;
20
+ use Guzzle\Http\Message\RequestInterface;
21
+
22
+ /**
23
+ * Interface used to provide interchangeable strategies for signing requests
24
+ * using the various AWS signature protocols.
25
+ */
26
+ interface SignatureInterface
27
+ {
28
+ /**
29
+ * Signs the specified request with an AWS signing protocol by using the
30
+ * provided AWS account credentials and adding the